Clientes y Facturas de cliente

This commit is contained in:
David Arranz 2025-10-30 19:26:57 +01:00
parent b1f27e6f98
commit 3d7586f31a
102 changed files with 740 additions and 340 deletions

View File

@ -0,0 +1,22 @@
NODE_ENV=development
HOST=0.0.0.0
PORT=3002
FRONTEND_URL=http://localhost:5173
DB_DIALECT=mysql
DB_HOST=localhost
DB_PORT=3306
DB_NAME=uecko_erp
DB_USER=rodax
DB_PASSWORD=rodax
DB_LOGGING=false
DB_SYNC_MODE=alter
APP_TIMEZONE=Europe/Madrid
TRUST_PROXY=0
JWT_SECRET=supersecretkey
JWT_ACCESS_EXPIRATION=1h
JWT_REFRESH_EXPIRATION=7d

View File

@ -1,19 +0,0 @@
import { pathsToModuleNameMapper } from "ts-jest";
import { compilerOptions } from "./tsconfig.json";
export default {
preset: "ts-jest",
testEnvironment: "node",
rootDir: "./",
testMatch: ["**/*.test.ts", "**/*.spec.ts"],
moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: "<rootDir>/src/" }),
transform: {
"^.+\\.(ts|tsx)$": "ts-jest",
},
collectCoverage: true,
coverageDirectory: "coverage",
coverageReporters: ["text", "lcov"],
clearMocks: true,
setupFilesAfterEnv: ["<rootDir>/tests/setup.ts"],
};

View File

@ -1,22 +1,19 @@
{
"name": "server",
"version": "1.0.0",
"description": "",
"main": "index.ts",
"version": "0.0.0",
"private": true,
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"build": "tsc && tsup",
"dev": "node --import=tsx --watch src/index.ts",
"start:dev": "node --import=tsx --watch src/index.ts",
"start:prod": "node dist/index.js",
"clean": "rm -rf dist node_modules",
"build": "tsup src/index.ts --config tsup.config.ts",
"dev": "tsx watch src/index.ts",
"clean": "rimraf .turbo node_modules dist",
"start": "NODE_ENV=production node dist/index.js",
"typecheck": "tsc --noEmit",
"test": "jest --config=./jest.config.ts --verbose",
"lint": "biome lint --fix",
"format": "biome format --write"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@biomejs/biome": "^2.3.1",
"@repo/typescript-config": "workspace:*",
@ -25,7 +22,6 @@
"@types/dinero.js": "^1.9.4",
"@types/express": "^4.17.21",
"@types/glob": "^8.1.0",
"@types/jest": "^29.5.14",
"@types/jsonwebtoken": "^9.0.8",
"@types/luxon": "^3.6.2",
"@types/node": "^22.15.12",
@ -33,6 +29,7 @@
"@types/passport-jwt": "^4.0.1",
"@types/passport-local": "^1.0.38",
"@types/response-time": "^2.3.8",
"rimraf": "^6.0.0",
"tsconfig-paths": "^4.2.0",
"tsup": "8.5.0",
"tsx": "4.20.6",
@ -76,21 +73,5 @@
},
"engines": {
"node": ">=22"
},
"tsup": {
"entry": [
"src/index.ts"
],
"outDir": "dist",
"format": [
"esm",
"cjs"
],
"target": "ES2022",
"sourcemap": true,
"clean": true,
"dts": true,
"splitting": false,
"skipNodeModulesBundle": true
}
}

View File

@ -2,11 +2,10 @@ import cors, { CorsOptions } from "cors";
import express, { Application } from "express";
import helmet from "helmet";
import responseTime from "response-time";
import { logger } from "./lib/logger";
// ❗️ No cargamos dotenv aquí. Debe hacerse en el entrypoint o en ./config.
// dotenv.config();
import { ENV } from "./config";
import { logger } from "./lib/logger";
export function createApp(): Application {
const app = express();

View File

@ -49,7 +49,6 @@ const serverStop = (server: http.Server) => {
let destroyed = 0;
for (const s of sockets) {
try {
// @ts-ignore - algunos runtimes exponen destroy() / end()
if (s.destroy && !s.destroyed) {
s.destroy();
destroyed++;
@ -259,8 +258,7 @@ process.on("uncaughtException", async (error: Error) => {
logger.info(`Server environment: ${currentState.environment}`);
logger.info("To shut down your server, press <CTRL> + C at any time");
// En entornos de desarrollo puede ser muy verboso
logger.info(JSON.stringify(listRoutes((app as any)._router, API_BASE_PATH), null, 3));
logger.debug(JSON.stringify(listRoutes((app as any)._router, API_BASE_PATH), null, 3));
});
} catch (error) {
// Arranque fallido → readiness sigue false

View File

@ -1,5 +1,6 @@
import expressListRoutes from "express-list-routes";
// Función para listar rutas
export function listRoutes(app, basePath = "") {
const expressListRoutes = require("express-list-routes");
return expressListRoutes(app, { logger: false, prefix: basePath });
}

View File

@ -0,0 +1,32 @@
import { defineConfig } from "tsup";
/**
* Build del servidor:
* - incluye código TS de `modules/*` (buildless)
* - consume código ya compilado de `packages/*`
* - genera un bundle único ESM en `dist/`
*/
export default defineConfig({
entry: ["src/index.ts"], // punto de entrada principal
format: ["esm"], // ESM nativo (Node 18+)
target: "node18", // objetivo de compilación
sourcemap: true,
clean: true,
treeshake: true,
dts: false, // opcional, genera .d.ts
outDir: "dist",
// Paquetes de npm a mantener como externos (no se incluyen)
external: ["express", "zod", "react", "react-dom", "date-fns"],
// Paquetes internos buildless que se deben incluir en el bundle
noExternal: [
"@erp/auth",
"@erp/core",
"@erp/customers",
"@erp/customer-invoices",
"@erp/verifactu",
"@repo/rdx-logger",
],
});

View File

@ -1,6 +1,15 @@
{
"name": "@erp/auth",
"version": "0.0.1",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
".": "./src/common/index.ts",
"./api": "./src/api/index.ts",

View File

@ -1,5 +1,5 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {

View File

@ -1,6 +1,15 @@
{
"name": "@erp/core",
"version": "0.0.1",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
".": "./src/common/index.ts",
"./common": "./src/common/index.ts",

View File

@ -1,4 +1,4 @@
import { Criteria, CriteriaFromUrlConverter } from "@repo/rdx-criteria/server";
import { Criteria, CriteriaFromUrlConverter } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { NextFunction, Request, Response } from "express";
import httpStatus from "http-status";
@ -91,6 +91,7 @@ export abstract class ExpressController {
}
protected ok<T>(dto?: T, headers?: Record<string, string>) {
// biome-ignore lint/suspicious/useIterableCallbackReturn: <explanation>
if (headers) Object.entries(headers).forEach(([k, v]) => this.res.setHeader(k, v));
return dto ? this.res.status(httpStatus.OK).json(dto) : this.res.sendStatus(httpStatus.OK);
}

View File

@ -1,4 +1,4 @@
import { Criteria } from "@repo/rdx-criteria/server";
import { Criteria } from "@repo/rdx-criteria";
import { NextFunction, Request, Response } from "express";
import { ApiError, ForbiddenApiError, UnauthorizedApiError, ValidationApiError } from "./errors";
import { ExpressController } from "./express-controller";
@ -47,7 +47,7 @@ export function tenantGuard(): GuardFn {
*/
export function forbidQueryFieldGuard(field = "companyId"): GuardFn {
return ({ req }: GuardContext) => {
if (Object.prototype.hasOwnProperty.call(req.query, field)) {
if (Object.hasOwn(req.query, field)) {
return guardFail(new ValidationApiError(`Query param "${field}" is not allowed`));
}
return guardOk();

View File

@ -1,4 +1,4 @@
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server";
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria";
import { IAggregateRootRepository, UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
import { FindOptions, ModelDefined, Sequelize, Transaction } from "sequelize";

View File

@ -1,5 +1,5 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {

View File

@ -1,8 +1,15 @@
{
"name": "@erp/customer-invoices",
"version": "0.0.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
".": "./src/common/index.ts",
"./common": "./src/common/index.ts",

View File

@ -1,4 +1,4 @@
import { Criteria } from "@repo/rdx-criteria/server";
import { Criteria } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";

View File

@ -1,5 +1,5 @@
import { Presenter } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria/server";
import { Criteria } from "@repo/rdx-criteria";
import { toEmptyString } from "@repo/rdx-ddd";
import { ArrayElement, Collection } from "@repo/rdx-utils";
import { ListCustomerInvoicesResponseDTO } from "../../../../common/dto";

View File

@ -1,5 +1,5 @@
import { IPresenterRegistry, ITransactionManager } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria/server";
import { Criteria } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";

View File

@ -1,4 +1,4 @@
import { Criteria } from "@repo/rdx-criteria/server";
import { Criteria } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { CustomerInvoiceListDTO } from "../../infrastructure";

View File

@ -1,5 +1,5 @@
import { ExpressController, authGuard, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria/server";
import { authGuard, ExpressController, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria";
import { ListCustomerInvoicesUseCase } from "../../../application";
export class ListCustomerInvoicesController extends ExpressController {

View File

@ -1,3 +1,3 @@
export * from "./express";
export * from "./mappers";
export * from "./sequelize";
export * from "./express";

View File

@ -4,7 +4,7 @@ import {
SequelizeRepository,
translateSequelizeError,
} from "@erp/core/api";
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server";
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";

View File

@ -1,5 +1,5 @@
import type { Criteria } from "@repo/rdx-criteria/server";
import { Op, OrderItem, WhereOptions, literal } from "sequelize";
import type { Criteria } from "@repo/rdx-criteria";
import { literal, Op, OrderItem, WhereOptions } from "sequelize";
// Campos físicos (DB) que permitimos filtrar/ordenar
const ALLOWED_FILTERS = {

View File

@ -34,7 +34,18 @@ export class CustomerInvoiceItemTaxModel extends Model<
declare item: NonAttribute<CustomerInvoiceItem>;
static associate(database: Sequelize) {
const { CustomerInvoiceItemModel } = database.models;
const models = database.models;
const requiredModels = ["CustomerInvoiceItemModel"];
// Comprobamos que los modelos existan
for (const name of requiredModels) {
if (!models[name]) {
throw new Error(`[CustomerInvoiceItemTaxModel.associate] Missing model: ${name}`);
}
}
const { CustomerInvoiceItemModel } = models;
CustomerInvoiceItemTaxModel.belongsTo(CustomerInvoiceItemModel, {
as: "item",
@ -45,7 +56,7 @@ export class CustomerInvoiceItemTaxModel extends Model<
});
}
static hooks(database: Sequelize) {}
static hooks(_database: Sequelize) {}
}
export default (database: Sequelize) => {
@ -92,6 +103,7 @@ export default (database: Sequelize) => {
},
{
sequelize: database,
modelName: "CustomerInvoiceItemTaxModel",
tableName: "customer_invoice_item_taxes",
underscored: true,

View File

@ -66,8 +66,21 @@ export class CustomerInvoiceItemModel extends Model<
declare taxes: NonAttribute<CustomerInvoiceItemTaxModel[]>;
static associate(database: Sequelize) {
const { CustomerInvoiceModel, CustomerInvoiceItemModel, CustomerInvoiceItemTaxModel } =
database.models;
const models = database.models;
const requiredModels = [
"CustomerInvoiceModel",
"CustomerInvoiceItemModel",
"CustomerInvoiceItemTaxModel",
];
// Comprobamos que los modelos existan
for (const name of requiredModels) {
if (!models[name]) {
throw new Error(`[CustomerInvoiceItemModel.associate] Missing model: ${name}`);
}
}
const { CustomerInvoiceModel, CustomerInvoiceItemModel, CustomerInvoiceItemTaxModel } = models;
CustomerInvoiceItemModel.belongsTo(CustomerInvoiceModel, {
as: "invoice",
@ -211,6 +224,7 @@ export default (database: Sequelize) => {
},
{
sequelize: database,
modelName: "CustomerInvoiceItemModel",
tableName: "customer_invoice_items",
underscored: true,

View File

@ -34,6 +34,16 @@ export class CustomerInvoiceTaxModel extends Model<
declare invoice: NonAttribute<CustomerInvoice>;
static associate(database: Sequelize) {
const models = database.models;
const requiredModels = ["CustomerInvoiceModel"];
// Comprobamos que los modelos existan
for (const name of requiredModels) {
if (!models[name]) {
throw new Error(`[CustomerInvoiceTaxModel.associate] Missing model: ${name}`);
}
}
const { CustomerInvoiceModel } = database.models;
CustomerInvoiceTaxModel.belongsTo(CustomerInvoiceModel, {
@ -44,7 +54,7 @@ export class CustomerInvoiceTaxModel extends Model<
});
}
static hooks(database: Sequelize) {}
static hooks(_database: Sequelize) {}
}
export default (database: Sequelize) => {
@ -91,6 +101,7 @@ export default (database: Sequelize) => {
},
{
sequelize: database,
modelName: "CustomerInvoiceTaxModel",
tableName: "customer_invoice_taxes",
underscored: true,

View File

@ -1,3 +1,4 @@
import { CustomerModel } from "@erp/customers/api";
import {
CreationOptional,
DataTypes,
@ -7,12 +8,12 @@ import {
NonAttribute,
Sequelize,
} from "sequelize";
import {
CustomerInvoiceItemCreationAttributes,
CustomerInvoiceItemModel,
} from "./customer-invoice-item.model";
import { CustomerModel } from "@erp/customers/api";
import {
CustomerInvoiceTaxCreationAttributes,
CustomerInvoiceTaxModel,
@ -95,13 +96,27 @@ export class CustomerInvoiceModel extends Model<
declare current_customer: NonAttribute<CustomerModel>;
static associate(database: Sequelize) {
const models = database.models;
const requiredModels = [
"CustomerInvoiceModel",
"CustomerInvoiceItemModel",
"CustomerModel",
"CustomerInvoiceTaxModel",
];
// Comprobamos que los modelos existan
for (const name of requiredModels) {
if (!models[name]) {
throw new Error(`[CustomerInvoiceModel.associate] Missing model: ${name}`);
}
}
const {
CustomerInvoiceModel,
CustomerInvoiceItemModel,
CustomerModel,
CustomerInvoiceTaxModel,
VerifactuRecordModel,
} = database.models;
} = models;
CustomerInvoiceModel.belongsTo(CustomerModel, {
as: "current_customer",
@ -128,7 +143,7 @@ export class CustomerInvoiceModel extends Model<
});
}
static hooks(database: Sequelize) {}
static hooks(_database: Sequelize) {}
}
export default (database: Sequelize) => {
@ -352,6 +367,7 @@ export default (database: Sequelize) => {
},
{
sequelize: database,
modelName: "CustomerInvoiceModel",
tableName: "customer_invoices",
underscored: true,

View File

@ -1,5 +1,5 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {

View File

@ -1,8 +1,15 @@
{
"name": "@erp/customers",
"version": "0.0.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
".": "./src/common/index.ts",
"./common": "./src/common/index.ts",
@ -11,6 +18,7 @@
"./globals.css": "./src/web/globals.css",
"./components": "./src/web/components/index.ts"
},
"peerDependencies": {
"@tanstack/react-query": "^5.74.11",
"ag-grid-community": "^33.3.0",

View File

@ -1,5 +1,5 @@
// application/customer-application-service.ts
import { Criteria } from "@repo/rdx-criteria/server";
import { Criteria } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";

View File

@ -1,6 +1,6 @@
import { CriteriaDTO } from "@erp/core";
import { Presenter } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria/server";
import { Criteria } from "@repo/rdx-criteria";
import { toEmptyString } from "@repo/rdx-ddd";
import { Collection } from "@repo/rdx-utils";
import { ListCustomersResponseDTO } from "../../../../common/dto";

View File

@ -1,5 +1,5 @@
import { IPresenterRegistry, ITransactionManager } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria/server";
import { Criteria } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";

View File

@ -1,4 +1,4 @@
import { Criteria } from "@repo/rdx-criteria/server";
import { Criteria } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { CustomerListDTO } from "../../infrastructure/mappers";

View File

@ -1,5 +1,5 @@
import { ExpressController, authGuard, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria/server";
import { authGuard, ExpressController, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria";
import { ListCustomersUseCase } from "../../../application";
export class ListCustomersController extends ExpressController {

View File

@ -58,9 +58,9 @@ export class CustomerModel extends Model<
declare factuges_id: CreationOptional<string | null>;
static associate(database: Sequelize) {}
static associate(_database: Sequelize) {}
static hooks(database: Sequelize) {}
static hooks(_database: Sequelize) {}
}
export default (database: Sequelize) => {
@ -220,6 +220,7 @@ export default (database: Sequelize) => {
},
{
sequelize: database,
modelName: "CustomerModel",
tableName: "customers",
underscored: true,

View File

@ -4,7 +4,7 @@ import {
SequelizeRepository,
translateSequelizeError,
} from "@erp/core/api";
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server";
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";

View File

@ -1,9 +1,9 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@erp/customer-invoices/*": ["./src/*"]
"@erp/customers/*": ["./src/*"]
},
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",

View File

@ -1,8 +1,14 @@
{
"name": "@erp/doc-numbering",
"version": "0.0.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
"./api": "./src/api/index.ts"
},
@ -11,7 +17,9 @@
"express": "^4.18.2",
"zod": "^4.1.11"
},
"devDependencies": { "@types/express": "^4.17.21" },
"devDependencies": {
"@types/express": "^4.17.21"
},
"dependencies": {
"@erp/auth": "workspace:*",
"@erp/core": "workspace:*",

View File

@ -1,9 +1,9 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@erp/customer-invoices/*": ["./src/*"]
"@erp/doc-numbering/*": ["./src/*"]
},
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",

View File

@ -1,8 +1,14 @@
{
"name": "@erp/verifactu",
"version": "0.0.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
"./api": "./src/api/index.ts",
"./common": "./src/common/index.ts"

View File

@ -1,5 +1,5 @@
import { EntityNotFoundError, SequelizeRepository, translateSequelizeError } from "@erp/core/api";
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria/server";
import { Criteria, CriteriaToSequelizeConverter } from "@repo/rdx-criteria";
import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";
@ -14,7 +14,7 @@ export class VerifactuRecordRepository
extends SequelizeRepository<VerifactuRecord>
implements IVerifactuRecordRepository
{
getById(id: UniqueID, transaction?: unknown): Promise<Result<VerifactuRecord, Error>> {
getById(_id: UniqueID, _transactionn?: unknown): Promise<Result<VerifactuRecord, Error>> {
throw new Error("Method not implemented.");
}
// Listado por tenant con criteria saneada
@ -238,7 +238,7 @@ export class VerifactuRecordRepository
transaction: unknown
): Promise<Result<void, Error>> {
try {
const deleted = await VerifactuRecordModel.destroy({
const _deleted = await VerifactuRecordModel.destroy({
where: { id: id.toString(), company_id: companyId.toString() },
transaction,
});

View File

@ -1,9 +1,9 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@erp/customer-invoices/*": ["./src/*"]
"@erp/verifactu/*": ["./src/*"]
},
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",

View File

@ -16,7 +16,7 @@
"ui:add": "pnpm --filter @repo/shadcn-ui ui:add",
"create:package": "ts-node scripts/create-package.ts",
"volta:install": "curl https://get.volta.sh | bash",
"clean": "find . -name 'node_modules' -type d -prune -print -exec rm -rf '{}' \\;"
"clean": "turbo run clean && rimraf ./node_modules && rimraf ./package-lock.json"
},
"devDependencies": {
"@biomejs/biome": "2.3.1",
@ -24,12 +24,13 @@
"change-case": "^5.4.4",
"inquirer": "^12.10.0",
"plop": "^4.0.4",
"rimraf": "^5.0.5",
"ts-node": "^10.9.2",
"turbo": "^2.5.8",
"typescript": "5.9.3"
},
"engines": {
"node": ">=18"
"node": ">=22"
},
"packageManager": "pnpm@10.17.1"
"packageManager": "pnpm@10.20.0"
}

View File

@ -1,17 +1,23 @@
{
"name": "@repo/rdx-criteria",
"version": "0.0.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"clean": "rm -rf node_modules"
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
".": "./src/defaults.ts",
"./server": "./src/index.ts"
".": "./src/index.ts"
},
"devDependencies": {
"@repo/typescript-config": "workspace:*"
"@repo/typescript-config": "workspace:*",
"rimraf": "^6.0.0",
"typescript": "^5.9.3"
},
"dependencies": {
"sequelize": "^6.37.5"

View File

@ -0,0 +1,15 @@
import { FiltersPrimitives } from "./Filter";
import { Filters } from "./Filters";
import { Order } from "./Order";
export declare class Criteria {
readonly filters: Filters;
readonly order: Order;
readonly pageSize: number | null;
readonly pageNumber: number | null;
constructor(filters: Filters, order: Order, pageSize: number | null, pageNumber: number | null);
static fromPrimitives(filters: FiltersPrimitives[], orderBy: string | null, orderType: string | null, pageSize: number | null, pageNumber: number | null): Criteria;
static withFilters(filters: FiltersPrimitives[]): Criteria;
hasOrder(): boolean;
hasFilters(): boolean;
}
//# sourceMappingURL=Criteria.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Criteria.d.ts","sourceRoot":"","sources":["Criteria.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,qBAAa,QAAQ;aAEH,OAAO,EAAE,OAAO;aAChB,KAAK,EAAE,KAAK;aACZ,QAAQ,EAAE,MAAM,GAAG,IAAI;aACvB,UAAU,EAAE,MAAM,GAAG,IAAI;gBAHzB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,GAAG,IAAI;IAO1C,MAAM,CAAC,cAAc,CACpB,OAAO,EAAE,iBAAiB,EAAE,EAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,GAAG,IAAI,GACvB,QAAQ;IASX,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,QAAQ;IAI1D,QAAQ,IAAI,OAAO;IAInB,UAAU,IAAI,OAAO;CAGrB"}

View File

@ -0,0 +1,31 @@
import { Filters } from "./Filters";
import { InvalidCriteria } from "./InvalidCriteria";
import { Order } from "./Order";
export class Criteria {
filters;
order;
pageSize;
pageNumber;
constructor(filters, order, pageSize, pageNumber) {
this.filters = filters;
this.order = order;
this.pageSize = pageSize;
this.pageNumber = pageNumber;
if (pageNumber !== null && pageSize === null) {
throw new InvalidCriteria();
}
}
static fromPrimitives(filters, orderBy, orderType, pageSize, pageNumber) {
return new Criteria(Filters.fromPrimitives(filters), Order.fromPrimitives(orderBy, orderType), pageSize, pageNumber);
}
static withFilters(filters) {
return Criteria.fromPrimitives(filters, null, null, null, null);
}
hasOrder() {
return !this.order.isNone();
}
hasFilters() {
return !this.filters.isEmpty();
}
}
//# sourceMappingURL=Criteria.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Criteria.js","sourceRoot":"","sources":["Criteria.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,OAAO,QAAQ;IAEH;IACA;IACA;IACA;IAJjB,YACiB,OAAgB,EAChB,KAAY,EACZ,QAAuB,EACvB,UAAyB;QAHzB,YAAO,GAAP,OAAO,CAAS;QAChB,UAAK,GAAL,KAAK,CAAO;QACZ,aAAQ,GAAR,QAAQ,CAAe;QACvB,eAAU,GAAV,UAAU,CAAe;QAEzC,IAAI,UAAU,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,IAAI,eAAe,EAAE,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,MAAM,CAAC,cAAc,CACpB,OAA4B,EAC5B,OAAsB,EACtB,SAAwB,EACxB,QAAuB,EACvB,UAAyB;QAEzB,OAAO,IAAI,QAAQ,CAClB,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAC/B,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EACxC,QAAQ,EACR,UAAU,CACV,CAAC;IACH,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,OAA4B;QAC9C,OAAO,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,QAAQ;QACP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,UAAU;QACT,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;CACD"}

View File

@ -0,0 +1,17 @@
import { FilterField } from "./FilterField";
import { FilterOperator } from "./FilterOperator";
import { FilterValue } from "./FilterValue";
export type FiltersPrimitives = {
field: string;
operator: string;
value: string;
};
export declare class Filter {
readonly field: FilterField;
readonly operator: FilterOperator;
readonly value: FilterValue;
constructor(field: FilterField, operator: FilterOperator, value: FilterValue);
static fromPrimitives(field: string, operator: string, value: string): Filter;
toPrimitives(): FiltersPrimitives;
}
//# sourceMappingURL=Filter.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Filter.d.ts","sourceRoot":"","sources":["Filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAY,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,qBAAa,MAAM;IAClB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;gBAEhB,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW;IAM5E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ7E,YAAY,IAAI,iBAAiB;CAOjC"}

View File

@ -0,0 +1,24 @@
import { FilterField } from "./FilterField";
import { FilterOperator, Operator } from "./FilterOperator";
import { FilterValue } from "./FilterValue";
export class Filter {
field;
operator;
value;
constructor(field, operator, value) {
this.field = field;
this.operator = operator;
this.value = value;
}
static fromPrimitives(field, operator, value) {
return new Filter(new FilterField(field), new FilterOperator(Operator[operator]), new FilterValue(value));
}
toPrimitives() {
return {
field: this.field.value,
operator: this.operator.value,
value: this.value.value,
};
}
}
//# sourceMappingURL=Filter.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Filter.js","sourceRoot":"","sources":["Filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ5C,MAAM,OAAO,MAAM;IACT,KAAK,CAAc;IACnB,QAAQ,CAAiB;IACzB,KAAK,CAAc;IAE5B,YAAY,KAAkB,EAAE,QAAwB,EAAE,KAAkB;QAC3E,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,KAAa,EAAE,QAAgB,EAAE,KAAa;QACnE,OAAO,IAAI,MAAM,CAChB,IAAI,WAAW,CAAC,KAAK,CAAC,EACtB,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAiC,CAAC,CAAC,EAC/D,IAAI,WAAW,CAAC,KAAK,CAAC,CACtB,CAAC;IACH,CAAC;IAED,YAAY;QACX,OAAO;YACN,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;SACvB,CAAC;IACH,CAAC;CACD"}

View File

@ -0,0 +1,5 @@
export declare class FilterField {
readonly value: string;
constructor(value: string);
}
//# sourceMappingURL=FilterField.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"FilterField.d.ts","sourceRoot":"","sources":["FilterField.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;aACK,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CACzC"}

View File

@ -0,0 +1,7 @@
export class FilterField {
value;
constructor(value) {
this.value = value;
}
}
//# sourceMappingURL=FilterField.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"FilterField.js","sourceRoot":"","sources":["FilterField.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACK;IAA5B,YAA4B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;CAC7C"}

View File

@ -0,0 +1,22 @@
export declare enum Operator {
EQUAL = "=",
NOT_EQUAL = "!=",
GREATER_THAN = ">",
GREATER_THAN_OR_EQUAL = ">=",
LOWER_THAN = "<",
LOWER_THAN_OR_EQUAL = "<=",
CONTAINS = "CONTAINS",
NOT_CONTAINS = "NOT_CONTAINS"
}
export declare class FilterOperator {
readonly value: Operator;
constructor(value: Operator);
isContains(): boolean;
isNotContains(): boolean;
isNotEquals(): boolean;
isGreaterThan(): boolean;
isGreaterThanOrEqual(): boolean;
isLowerThan(): boolean;
isLowerThanOrEqual(): boolean;
}
//# sourceMappingURL=FilterOperator.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"FilterOperator.d.ts","sourceRoot":"","sources":["FilterOperator.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IACnB,KAAK,MAAM;IACX,SAAS,OAAO;IAChB,YAAY,MAAM;IAClB,qBAAqB,OAAO;IAC5B,UAAU,MAAM;IAChB,mBAAmB,OAAO;IAC1B,QAAQ,aAAa;IACrB,YAAY,iBAAiB;CAC7B;AAED,qBAAa,cAAc;aACE,KAAK,EAAE,QAAQ;gBAAf,KAAK,EAAE,QAAQ;IAE3C,UAAU,IAAI,OAAO;IAIrB,aAAa,IAAI,OAAO;IAIxB,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,oBAAoB,IAAI,OAAO;IAI/B,WAAW,IAAI,OAAO;IAItB,kBAAkB,IAAI,OAAO;CAG7B"}

View File

@ -0,0 +1,39 @@
export var Operator;
(function (Operator) {
Operator["EQUAL"] = "=";
Operator["NOT_EQUAL"] = "!=";
Operator["GREATER_THAN"] = ">";
Operator["GREATER_THAN_OR_EQUAL"] = ">=";
Operator["LOWER_THAN"] = "<";
Operator["LOWER_THAN_OR_EQUAL"] = "<=";
Operator["CONTAINS"] = "CONTAINS";
Operator["NOT_CONTAINS"] = "NOT_CONTAINS";
})(Operator || (Operator = {}));
export class FilterOperator {
value;
constructor(value) {
this.value = value;
}
isContains() {
return this.value.valueOf() === Operator.CONTAINS.valueOf();
}
isNotContains() {
return this.value.valueOf() === Operator.NOT_CONTAINS.valueOf();
}
isNotEquals() {
return this.value.valueOf() === Operator.NOT_EQUAL.valueOf();
}
isGreaterThan() {
return this.value.valueOf() === Operator.GREATER_THAN.valueOf();
}
isGreaterThanOrEqual() {
return this.value.valueOf() === Operator.GREATER_THAN_OR_EQUAL.valueOf();
}
isLowerThan() {
return this.value.valueOf() === Operator.LOWER_THAN.valueOf();
}
isLowerThanOrEqual() {
return this.value.valueOf() === Operator.LOWER_THAN_OR_EQUAL.valueOf();
}
}
//# sourceMappingURL=FilterOperator.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"FilterOperator.js","sourceRoot":"","sources":["FilterOperator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QASX;AATD,WAAY,QAAQ;IACnB,uBAAW,CAAA;IACX,4BAAgB,CAAA;IAChB,8BAAkB,CAAA;IAClB,wCAA4B,CAAA;IAC5B,4BAAgB,CAAA;IAChB,sCAA0B,CAAA;IAC1B,iCAAqB,CAAA;IACrB,yCAA6B,CAAA;AAC9B,CAAC,EATW,QAAQ,KAAR,QAAQ,QASnB;AAED,MAAM,OAAO,cAAc;IACE;IAA5B,YAA4B,KAAe;QAAf,UAAK,GAAL,KAAK,CAAU;IAAG,CAAC;IAE/C,UAAU;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC;IAED,WAAW;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC;IAED,oBAAoB;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;IAC1E,CAAC;IAED,WAAW;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAC/D,CAAC;IAED,kBAAkB;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;IACxE,CAAC;CACD"}

View File

@ -0,0 +1,5 @@
export declare class FilterValue {
readonly value: string;
constructor(value: string);
}
//# sourceMappingURL=FilterValue.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"FilterValue.d.ts","sourceRoot":"","sources":["FilterValue.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;aACK,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CACzC"}

View File

@ -0,0 +1,7 @@
export class FilterValue {
value;
constructor(value) {
this.value = value;
}
}
//# sourceMappingURL=FilterValue.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"FilterValue.js","sourceRoot":"","sources":["FilterValue.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACK;IAA5B,YAA4B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;CAC7C"}

View File

@ -0,0 +1,9 @@
import { Filter, FiltersPrimitives } from "./Filter";
export declare class Filters {
readonly value: Filter[];
constructor(value: Filter[]);
static fromPrimitives(filters: FiltersPrimitives[]): Filters;
toPrimitives(): FiltersPrimitives[];
isEmpty(): boolean;
}
//# sourceMappingURL=Filters.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Filters.d.ts","sourceRoot":"","sources":["Filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAErD,qBAAa,OAAO;aACS,KAAK,EAAE,MAAM,EAAE;gBAAf,KAAK,EAAE,MAAM,EAAE;IAE3C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO;IAM5D,YAAY,IAAI,iBAAiB,EAAE;IAInC,OAAO,IAAI,OAAO;CAGlB"}

View File

@ -0,0 +1,17 @@
import { Filter } from "./Filter";
export class Filters {
value;
constructor(value) {
this.value = value;
}
static fromPrimitives(filters) {
return new Filters(filters.map((filter) => Filter.fromPrimitives(filter.field, filter.operator, filter.value)));
}
toPrimitives() {
return this.value.map((filter) => filter.toPrimitives());
}
isEmpty() {
return this.value.length === 0;
}
}
//# sourceMappingURL=Filters.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Filters.js","sourceRoot":"","sources":["Filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,UAAU,CAAC;AAErD,MAAM,OAAO,OAAO;IACS;IAA5B,YAA4B,KAAe;QAAf,UAAK,GAAL,KAAK,CAAU;IAAG,CAAC;IAE/C,MAAM,CAAC,cAAc,CAAC,OAA4B;QACjD,OAAO,IAAI,OAAO,CACjB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAC3F,CAAC;IACH,CAAC;IAED,YAAY;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IAChC,CAAC;CACD"}

View File

@ -0,0 +1,4 @@
export declare class InvalidCriteria extends Error {
constructor();
}
//# sourceMappingURL=InvalidCriteria.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"InvalidCriteria.d.ts","sourceRoot":"","sources":["InvalidCriteria.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;;CAIzC"}

View File

@ -0,0 +1,6 @@
export class InvalidCriteria extends Error {
constructor() {
super("Page size is required when page number is defined");
}
}
//# sourceMappingURL=InvalidCriteria.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"InvalidCriteria.js","sourceRoot":"","sources":["InvalidCriteria.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACzC;QACC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC5D,CAAC;CACD"}

View File

@ -0,0 +1,11 @@
import { OrderBy } from "./OrderBy";
import { OrderType } from "./OrderType";
export declare class Order {
readonly orderBy: OrderBy;
readonly orderType: OrderType;
constructor(orderBy: OrderBy, orderType: OrderType);
static none(): Order;
static fromPrimitives(orderBy: string | null, orderType: string | null): Order;
isNone(): boolean;
}
//# sourceMappingURL=Order.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Order.d.ts","sourceRoot":"","sources":["Order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAc,MAAM,aAAa,CAAC;AAEpD,qBAAa,KAAK;aAEA,OAAO,EAAE,OAAO;aAChB,SAAS,EAAE,SAAS;gBADpB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS;IAGrC,MAAM,CAAC,IAAI,IAAI,KAAK;IAIpB,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK;IAM9E,MAAM,IAAI,OAAO;CAGjB"}

View File

@ -0,0 +1,22 @@
import { OrderBy } from "./OrderBy";
import { OrderType, OrderTypes } from "./OrderType";
export class Order {
orderBy;
orderType;
constructor(orderBy, orderType) {
this.orderBy = orderBy;
this.orderType = orderType;
}
static none() {
return new Order(new OrderBy(""), new OrderType(OrderTypes.NONE));
}
static fromPrimitives(orderBy, orderType) {
return orderBy !== null
? new Order(new OrderBy(orderBy), new OrderType(orderType))
: Order.none();
}
isNone() {
return this.orderType.isNone();
}
}
//# sourceMappingURL=Order.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Order.js","sourceRoot":"","sources":["Order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,OAAO,KAAK;IAEA;IACA;IAFjB,YACiB,OAAgB,EAChB,SAAoB;QADpB,YAAO,GAAP,OAAO,CAAS;QAChB,cAAS,GAAT,SAAS,CAAW;IAClC,CAAC;IAEJ,MAAM,CAAC,IAAI;QACV,OAAO,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAAsB,EAAE,SAAwB;QACrE,OAAO,OAAO,KAAK,IAAI;YACtB,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,SAAS,CAAC,SAAuB,CAAC,CAAC;YACzE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAED,MAAM;QACL,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;CACD"}

View File

@ -0,0 +1,5 @@
export declare class OrderBy {
readonly value: string;
constructor(value: string);
}
//# sourceMappingURL=OrderBy.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"OrderBy.d.ts","sourceRoot":"","sources":["OrderBy.ts"],"names":[],"mappings":"AAAA,qBAAa,OAAO;aACS,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CACzC"}

View File

@ -0,0 +1,7 @@
export class OrderBy {
value;
constructor(value) {
this.value = value;
}
}
//# sourceMappingURL=OrderBy.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"OrderBy.js","sourceRoot":"","sources":["OrderBy.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,OAAO;IACS;IAA5B,YAA4B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;CAC7C"}

View File

@ -0,0 +1,11 @@
export declare enum OrderTypes {
ASC = "ASC",
DESC = "DESC",
NONE = "NONE"
}
export declare class OrderType {
readonly value: OrderTypes;
constructor(value: OrderTypes);
isNone(): boolean;
}
//# sourceMappingURL=OrderType.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"OrderType.d.ts","sourceRoot":"","sources":["OrderType.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IACrB,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,IAAI,SAAS;CACb;AAED,qBAAa,SAAS;aACO,KAAK,EAAE,UAAU;gBAAjB,KAAK,EAAE,UAAU;IAE7C,MAAM,IAAI,OAAO;CAGjB"}

View File

@ -0,0 +1,16 @@
export var OrderTypes;
(function (OrderTypes) {
OrderTypes["ASC"] = "ASC";
OrderTypes["DESC"] = "DESC";
OrderTypes["NONE"] = "NONE";
})(OrderTypes || (OrderTypes = {}));
export class OrderType {
value;
constructor(value) {
this.value = value;
}
isNone() {
return this.value === OrderTypes.NONE;
}
}
//# sourceMappingURL=OrderType.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"OrderType.js","sourceRoot":"","sources":["OrderType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACrB,yBAAW,CAAA;IACX,2BAAa,CAAA;IACb,2BAAa,CAAA;AACd,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AAED,MAAM,OAAO,SAAS;IACO;IAA5B,YAA4B,KAAiB;QAAjB,UAAK,GAAL,KAAK,CAAY;IAAG,CAAC;IAEjD,MAAM;QACL,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,IAAI,CAAC;IACvC,CAAC;CACD"}

View File

@ -0,0 +1,11 @@
export * from "./Criteria";
export * from "./Filter";
export * from "./FilterField";
export * from "./FilterOperator";
export * from "./Filters";
export * from "./FilterValue";
export * from "./InvalidCriteria";
export * from "./Order";
export * from "./OrderBy";
export * from "./OrderType";
//# sourceMappingURL=index.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}

View File

@ -0,0 +1,11 @@
export * from "./Criteria";
export * from "./Filter";
export * from "./FilterField";
export * from "./FilterOperator";
export * from "./Filters";
export * from "./FilterValue";
export * from "./InvalidCriteria";
export * from "./Order";
export * from "./OrderBy";
export * from "./OrderType";
//# sourceMappingURL=index.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}

View File

@ -1,5 +1,5 @@
import { FindOptions } from "sequelize";
import { Criteria } from "./critera";
import { FindOptions, Sequelize } from "sequelize";
import { Criteria } from "./critera.js";
/**
* Mapeo lógicofísico de campos.

View File

@ -1,7 +1,8 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"composite": true
"rootDir": "src"
},
"include": ["src"]
"include": ["src"],
"exclude": ["node_modules", "dist", "**/*.test.ts"]
}

View File

@ -1,14 +1,19 @@
{
"name": "@repo/rdx-ddd",
"version": "0.0.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"clean": "rm -rf node_modules"
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
".": "./src/index.ts"
},
"devDependencies": {
"@repo/typescript-config": "workspace:*",
"@types/node": "^22.15.12",

View File

@ -1,8 +1,8 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"lib": ["es2022", "dom"],
"composite": true
"rootDir": "src"
},
"include": ["src"]
"include": ["src"],
"exclude": ["node_modules", "dist", "**/*.test.ts"]
}

View File

@ -1,14 +1,19 @@
{
"name": "@repo/rdx-logger",
"version": "0.0.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"clean": "rm -rf node_modules"
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
".": "./src/index.ts"
},
"devDependencies": {
"typescript": "^5.9.3"
},

View File

@ -1,8 +1,8 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"composite": true
"rootDir": "src"
},
"include": ["src"],
"exclude": ["src/**/__tests__/*"]
"exclude": ["node_modules", "dist", "**/*.test.ts"]
}

View File

@ -1,14 +1,19 @@
{
"name": "@repo/rdx-utils",
"version": "0.0.1",
"main": "src/index.ts",
"types": "src/index.ts",
"private": true,
"type": "module",
"sideEffects": false,
"scripts": {
"clean": "rm -rf node_modules"
"typecheck": "tsc -p tsconfig.json --noEmit",
"clean": "rimraf .turbo node_modules dist"
},
"exports": {
".": "./src/index.ts"
},
"devDependencies": {
"@repo/typescript-config": "workspace:*",
"@types/node": "^22.15.12",

View File

@ -1,8 +1,8 @@
{
"extends": "../../tsconfig.json",
"extends": "@repo/typescript-config/buildless.json",
"compilerOptions": {
"composite": true
"rootDir": "src"
},
"include": ["src"],
"exclude": ["src/**/__tests__/*"]
"exclude": ["node_modules", "dist", "**/*.test.ts"]
}

View File

@ -0,0 +1,15 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"extends": "./base.json",
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "dist",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"removeComments": false,
"noEmit": false
}
}

View File

@ -0,0 +1,10 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"extends": "./base.json",
"compilerOptions": {
"noEmit": true,
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler"
}
}

View File

@ -23,6 +23,9 @@ importers:
plop:
specifier: ^4.0.4
version: 4.0.4(@types/node@22.18.10)
rimraf:
specifier: ^5.0.5
version: 5.0.10
ts-node:
specifier: ^10.9.2
version: 10.9.2(@types/node@22.18.10)(typescript@5.9.3)
@ -159,9 +162,6 @@ importers:
'@types/glob':
specifier: ^8.1.0
version: 8.1.0
'@types/jest':
specifier: ^29.5.14
version: 29.5.14
'@types/jsonwebtoken':
specifier: ^9.0.8
version: 9.0.10
@ -183,6 +183,9 @@ importers:
'@types/response-time':
specifier: ^2.3.8
version: 2.3.9
rimraf:
specifier: ^6.0.0
version: 6.0.1
tsconfig-paths:
specifier: ^4.2.0
version: 4.2.0
@ -745,9 +748,6 @@ importers:
packages/rdx-criteria:
dependencies:
'@codelytv/criteria':
specifier: ^2.0.0
version: 2.0.0
sequelize:
specifier: ^6.37.5
version: 6.37.7(mysql2@3.15.2)
@ -755,6 +755,12 @@ importers:
'@repo/typescript-config':
specifier: workspace:*
version: link:../typescript-config
rimraf:
specifier: ^6.0.0
version: 6.0.1
typescript:
specifier: ^5.9.3
version: 5.9.3
packages/rdx-ddd:
dependencies:
@ -1282,9 +1288,6 @@ packages:
cpu: [x64]
os: [win32]
'@codelytv/criteria@2.0.0':
resolution: {integrity: sha512-EgXNABlN3vBsfIplqsEMcUX836SzoTeHoE4m8H/9pujiAw/vuDam27x+AnwpJmW2XHkzMk39G9wsejopFN4kTQ==}
'@colors/colors@1.6.0':
resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
engines: {node: '>=0.1.90'}
@ -1716,6 +1719,14 @@ packages:
'@types/node':
optional: true
'@isaacs/balanced-match@4.0.1':
resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
engines: {node: 20 || >=22}
'@isaacs/brace-expansion@5.0.0':
resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==}
engines: {node: 20 || >=22}
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
@ -1724,18 +1735,6 @@ packages:
resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
engines: {node: '>=18.0.0'}
'@jest/expect-utils@29.7.0':
resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
'@jest/schemas@29.6.3':
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
'@jest/types@29.6.3':
resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@ -2613,9 +2612,6 @@ packages:
'@sideway/pinpoint@2.0.0':
resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==}
'@sinclair/typebox@0.27.8':
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
'@so-ric/colorspace@1.1.6':
resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
@ -2863,18 +2859,6 @@ packages:
'@types/inquirer@9.0.9':
resolution: {integrity: sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==}
'@types/istanbul-lib-coverage@2.0.6':
resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
'@types/istanbul-lib-report@3.0.3':
resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
'@types/istanbul-reports@3.0.4':
resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
'@types/jest@29.5.14':
resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==}
'@types/jsonwebtoken@9.0.10':
resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==}
@ -2959,9 +2943,6 @@ packages:
'@types/serve-static@1.15.9':
resolution: {integrity: sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==}
'@types/stack-utils@2.0.3':
resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
'@types/stylis@4.2.5':
resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==}
@ -2977,12 +2958,6 @@ packages:
'@types/validator@13.15.3':
resolution: {integrity: sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==}
'@types/yargs-parser@21.0.3':
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
'@types/yargs@17.0.33':
resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
@ -3084,10 +3059,6 @@ packages:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
ansi-styles@5.2.0:
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
engines: {node: '>=10'}
ansi-styles@6.2.3:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
@ -3348,10 +3319,6 @@ packages:
peerDependencies:
devtools-protocol: '*'
ci-info@3.9.0:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'}
class-variance-authority@0.7.1:
resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
@ -3694,10 +3661,6 @@ packages:
devtools-protocol@0.0.1508733:
resolution: {integrity: sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==}
diff-sequences@29.6.3:
resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
diff@4.0.2:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'}
@ -3861,10 +3824,6 @@ packages:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
engines: {node: '>=0.8.0'}
escape-string-regexp@2.0.0:
resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
engines: {node: '>=8'}
escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
@ -3915,10 +3874,6 @@ packages:
resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==}
engines: {node: '>=12.0.0'}
expect@29.7.0:
resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
express-list-routes@1.3.1:
resolution: {integrity: sha512-HC8gpFjmeoJv1f2vJVBJHThA9XXVSOzIQd0I6WvB9G/E7Yy6f8AnFkam7GJRz/+JJQG3fX49eXWhVqjdNj32dw==}
@ -4129,6 +4084,11 @@ packages:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
hasBin: true
glob@11.0.3:
resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==}
engines: {node: 20 || >=22}
hasBin: true
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Glob versions prior to v9 are no longer supported
@ -4445,31 +4405,15 @@ packages:
jackspeak@3.4.3:
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
jackspeak@4.1.1:
resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==}
engines: {node: 20 || >=22}
jake@10.9.4:
resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==}
engines: {node: '>=10'}
hasBin: true
jest-diff@29.7.0:
resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
jest-get-type@29.6.3:
resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
jest-matcher-utils@29.7.0:
resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
jest-message-util@29.7.0:
resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
jest-util@29.7.0:
resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
@ -4688,6 +4632,10 @@ packages:
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
lru-cache@11.2.2:
resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==}
engines: {node: 20 || >=22}
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
@ -4769,6 +4717,10 @@ packages:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
minimatch@10.1.1:
resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==}
engines: {node: 20 || >=22}
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@ -5098,6 +5050,10 @@ packages:
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
engines: {node: '>=16 || 14 >=14.18'}
path-scurry@2.0.0:
resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
engines: {node: 20 || >=22}
path-to-regexp@0.1.12:
resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
@ -5239,10 +5195,6 @@ packages:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
pretty-format@29.7.0:
resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
process@0.11.10:
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
engines: {node: '>= 0.6.0'}
@ -5516,6 +5468,15 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
rimraf@5.0.10:
resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==}
hasBin: true
rimraf@6.0.1:
resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==}
engines: {node: 20 || >=22}
hasBin: true
rollup@4.52.4:
resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@ -5738,10 +5699,6 @@ packages:
stack-trace@0.0.10:
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
stack-utils@2.0.6:
resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
engines: {node: '>=10'}
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
@ -6588,8 +6545,6 @@ snapshots:
'@biomejs/cli-win32-x64@2.3.1':
optional: true
'@codelytv/criteria@2.0.0': {}
'@colors/colors@1.6.0': {}
'@cspotcode/source-map-support@0.8.1':
@ -6976,6 +6931,12 @@ snapshots:
optionalDependencies:
'@types/node': 22.18.10
'@isaacs/balanced-match@4.0.1': {}
'@isaacs/brace-expansion@5.0.0':
dependencies:
'@isaacs/balanced-match': 4.0.1
'@isaacs/cliui@8.0.2':
dependencies:
string-width: 5.1.2
@ -6989,23 +6950,6 @@ snapshots:
dependencies:
minipass: 7.1.2
'@jest/expect-utils@29.7.0':
dependencies:
jest-get-type: 29.6.3
'@jest/schemas@29.6.3':
dependencies:
'@sinclair/typebox': 0.27.8
'@jest/types@29.6.3':
dependencies:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
'@types/node': 22.18.10
'@types/yargs': 17.0.33
chalk: 4.1.2
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@ -7884,8 +7828,6 @@ snapshots:
'@sideway/pinpoint@2.0.0': {}
'@sinclair/typebox@0.27.8': {}
'@so-ric/colorspace@1.1.6':
dependencies:
color: 5.0.2
@ -8167,21 +8109,6 @@ snapshots:
'@types/through': 0.0.33
rxjs: 7.8.2
'@types/istanbul-lib-coverage@2.0.6': {}
'@types/istanbul-lib-report@3.0.3':
dependencies:
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports@3.0.4':
dependencies:
'@types/istanbul-lib-report': 3.0.3
'@types/jest@29.5.14':
dependencies:
expect: 29.7.0
pretty-format: 29.7.0
'@types/jsonwebtoken@9.0.10':
dependencies:
'@types/ms': 2.1.0
@ -8285,8 +8212,6 @@ snapshots:
'@types/node': 22.18.10
'@types/send': 0.17.5
'@types/stack-utils@2.0.3': {}
'@types/stylis@4.2.5': {}
'@types/through@0.0.33':
@ -8299,12 +8224,6 @@ snapshots:
'@types/validator@13.15.3': {}
'@types/yargs-parser@21.0.3': {}
'@types/yargs@17.0.33':
dependencies:
'@types/yargs-parser': 21.0.3
'@types/yauzl@2.10.3':
dependencies:
'@types/node': 22.18.10
@ -8421,8 +8340,6 @@ snapshots:
dependencies:
color-convert: 2.0.1
ansi-styles@5.2.0: {}
ansi-styles@6.2.3: {}
any-promise@1.3.0: {}
@ -8700,8 +8617,6 @@ snapshots:
mitt: 3.0.1
zod: 3.25.76
ci-info@3.9.0: {}
class-variance-authority@0.7.1:
dependencies:
clsx: 2.1.1
@ -8985,8 +8900,6 @@ snapshots:
devtools-protocol@0.0.1508733: {}
diff-sequences@29.6.3: {}
diff@4.0.2: {}
dinero.js@1.9.1: {}
@ -9162,8 +9075,6 @@ snapshots:
escape-string-regexp@1.0.5: {}
escape-string-regexp@2.0.0: {}
escape-string-regexp@4.0.0: {}
escodegen@2.1.0:
@ -9214,14 +9125,6 @@ snapshots:
expect-type@1.2.2: {}
expect@29.7.0:
dependencies:
'@jest/expect-utils': 29.7.0
jest-get-type: 29.6.3
jest-matcher-utils: 29.7.0
jest-message-util: 29.7.0
jest-util: 29.7.0
express-list-routes@1.3.1: {}
express@4.21.2:
@ -9488,6 +9391,15 @@ snapshots:
package-json-from-dist: 1.0.1
path-scurry: 1.11.1
glob@11.0.3:
dependencies:
foreground-child: 3.3.1
jackspeak: 4.1.1
minimatch: 10.1.1
minipass: 7.1.2
package-json-from-dist: 1.0.1
path-scurry: 2.0.0
glob@7.2.3:
dependencies:
fs.realpath: 1.0.0
@ -9833,49 +9745,16 @@ snapshots:
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
jackspeak@4.1.1:
dependencies:
'@isaacs/cliui': 8.0.2
jake@10.9.4:
dependencies:
async: 3.2.6
filelist: 1.0.4
picocolors: 1.1.1
jest-diff@29.7.0:
dependencies:
chalk: 4.1.2
diff-sequences: 29.6.3
jest-get-type: 29.6.3
pretty-format: 29.7.0
jest-get-type@29.6.3: {}
jest-matcher-utils@29.7.0:
dependencies:
chalk: 4.1.2
jest-diff: 29.7.0
jest-get-type: 29.6.3
pretty-format: 29.7.0
jest-message-util@29.7.0:
dependencies:
'@babel/code-frame': 7.27.1
'@jest/types': 29.6.3
'@types/stack-utils': 2.0.3
chalk: 4.1.2
graceful-fs: 4.2.11
micromatch: 4.0.8
pretty-format: 29.7.0
slash: 3.0.0
stack-utils: 2.0.6
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
'@types/node': 22.18.10
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
picomatch: 2.3.1
jiti@2.6.1: {}
joi@17.13.3:
@ -10079,6 +9958,8 @@ snapshots:
lru-cache@10.4.3: {}
lru-cache@11.2.2: {}
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
@ -10138,6 +10019,10 @@ snapshots:
mimic-fn@2.1.0: {}
minimatch@10.1.1:
dependencies:
'@isaacs/brace-expansion': 5.0.0
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.12
@ -10497,6 +10382,11 @@ snapshots:
lru-cache: 10.4.3
minipass: 7.1.2
path-scurry@2.0.0:
dependencies:
lru-cache: 11.2.2
minipass: 7.1.2
path-to-regexp@0.1.12: {}
path-type@4.0.0: {}
@ -10627,12 +10517,6 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
pretty-format@29.7.0:
dependencies:
'@jest/schemas': 29.6.3
ansi-styles: 5.2.0
react-is: 18.3.1
process@0.11.10: {}
progress@2.0.3: {}
@ -10939,6 +10823,15 @@ snapshots:
dependencies:
glob: 7.2.3
rimraf@5.0.10:
dependencies:
glob: 10.4.5
rimraf@6.0.1:
dependencies:
glob: 11.0.3
package-json-from-dist: 1.0.1
rollup@4.52.4:
dependencies:
'@types/estree': 1.0.8
@ -11171,10 +11064,6 @@ snapshots:
stack-trace@0.0.10: {}
stack-utils@2.0.6:
dependencies:
escape-string-regexp: 2.0.0
stackback@0.0.2: {}
statuses@2.0.1: {}

Some files were not shown because too many files have changed in this diff Show More