wsp-ms-core 1.0.45 → 1.0.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,8 @@
1
+ var __create = Object.create;
1
2
  var __defProp = Object.defineProperty;
2
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
4
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
7
  var __export = (target, all) => {
6
8
  for (var name in all)
@@ -14,6 +16,14 @@ var __copyProps = (to, from, except, desc) => {
14
16
  }
15
17
  return to;
16
18
  };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
17
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
28
 
19
29
  // src/index.ts
@@ -596,7 +606,8 @@ _Price.MAX_AMOUNT = 1e9;
596
606
  var Price = _Price;
597
607
 
598
608
  // src/domain/value-objects/UUID.ts
599
- var UUID = class _UUID extends ValueObject {
609
+ var crypto = __toESM(require("crypto"));
610
+ var _UUID = class _UUID extends ValueObject {
600
611
  constructor(value) {
601
612
  super(value);
602
613
  }
@@ -606,17 +617,35 @@ var UUID = class _UUID extends ValueObject {
606
617
  }
607
618
  }
608
619
  toPrimitives() {
609
- return {
610
- value: this.value
611
- };
620
+ return { value: this.value };
612
621
  }
613
622
  static create(uuid) {
614
623
  return new _UUID(uuid != null ? uuid : crypto.randomUUID());
615
624
  }
616
- static isValid(uuid) {
617
- return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);
625
+ static version(uuid) {
626
+ const m = /^[0-9a-f]{8}-[0-9a-f]{4}-([1-8])[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.exec(uuid);
627
+ return m ? Number(m[1]) : void 0;
628
+ }
629
+ static isNil(uuid) {
630
+ return /^0{8}-0{4}-0{4}-0{4}-0{12}$/i.test(uuid);
631
+ }
632
+ static isRFCStyle(uuid) {
633
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);
634
+ }
635
+ static isValid(uuid, opts = {}) {
636
+ var _a, _b;
637
+ const allowed = (_a = opts.allowedVersions) != null ? _a : [1, 2, 3, 4, 5, 6, 7, 8];
638
+ const allowNil = (_b = opts.allowNil) != null ? _b : false;
639
+ if (allowNil && _UUID.isNil(uuid))
640
+ return true;
641
+ if (!_UUID.isRFCStyle(uuid))
642
+ return false;
643
+ const v = _UUID.version(uuid);
644
+ return !!v && allowed.includes(v);
618
645
  }
619
646
  };
647
+ _UUID.NIL = "00000000-0000-0000-0000-000000000000";
648
+ var UUID = _UUID;
620
649
 
621
650
  // src/application/unit-of-work/BasicUnitOfWork.ts
622
651
  var BasicUnitOfWork = class {
@@ -804,14 +833,15 @@ function normalizeQuery(q) {
804
833
  }
805
834
  return out;
806
835
  }
807
- function hasContentType(headers) {
808
- if (!headers)
809
- return false;
810
- return Object.keys(headers).some((h) => h.toLowerCase() === "content-type");
811
- }
812
836
  function isReadableStream(x) {
813
837
  return x && typeof x.pipe === "function";
814
838
  }
839
+ function hasHeader(headers, name) {
840
+ if (!headers)
841
+ return false;
842
+ const lname = name.toLowerCase();
843
+ return Object.keys(headers).some((h) => h.toLowerCase() === lname);
844
+ }
815
845
  function adaptExpressRoute(Controller) {
816
846
  return async (req, res, next) => {
817
847
  var _a, _b;
@@ -831,17 +861,39 @@ function adaptExpressRoute(Controller) {
831
861
  if (headers)
832
862
  res.set(headers);
833
863
  if (isReadableStream(body)) {
864
+ if (!hasHeader(headers, "Content-Type"))
865
+ res.set("Content-Type", "application/octet-stream");
834
866
  res.status(statusCode);
835
867
  body.on("error", next);
836
868
  body.pipe(res);
837
869
  return;
838
870
  }
839
- const hasCT = hasContentType(headers);
840
- if (Buffer.isBuffer(body) || typeof body === "string" || hasCT) {
871
+ const isArrayBuffer = typeof body === "object" && body instanceof ArrayBuffer;
872
+ const isArrayBufferView = typeof body === "object" && body != null && ArrayBuffer.isView(body);
873
+ if (Buffer.isBuffer(body) || isArrayBuffer || isArrayBufferView) {
874
+ let buf;
875
+ if (Buffer.isBuffer(body)) {
876
+ buf = body;
877
+ } else if (isArrayBuffer) {
878
+ buf = Buffer.from(body);
879
+ } else {
880
+ const view = body;
881
+ buf = Buffer.from(view.buffer, view.byteOffset, view.byteLength);
882
+ }
883
+ if (!hasHeader(headers, "Content-Type"))
884
+ res.set("Content-Type", "application/octet-stream");
885
+ if (!res.getHeader("Content-Length"))
886
+ res.set("Content-Length", String(buf.length));
887
+ res.status(statusCode);
888
+ res.end(buf);
889
+ return;
890
+ }
891
+ const hasCT = hasHeader(headers, "Content-Type");
892
+ if (typeof body === "string" || hasCT) {
841
893
  res.status(statusCode).send(body);
842
- } else {
843
- res.status(statusCode).json(body != null ? body : {});
894
+ return;
844
895
  }
896
+ res.status(statusCode).json(body != null ? body : {});
845
897
  } catch (err) {
846
898
  next(err);
847
899
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/domain/value-objects/DateTime.ts","../src/domain/contracts/ValueObject.ts","../src/domain/contracts/DomainEntity.ts","../src/domain/contracts/DomainError.ts","../src/domain/contracts/DomainEvent.ts","../src/domain/contracts/BaseObject.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/InternalError.ts","../src/domain/errors/UsageError.ts","../src/domain/value-objects/Currency.ts","../src/domain/value-objects/Email.ts","../src/domain/value-objects/Language.ts","../src/utils/StringVars.ts","../src/infrastructure/errors/ErrorManager.ts","../src/domain/value-objects/Price.ts","../src/domain/value-objects/UUID.ts","../src/application/unit-of-work/BasicUnitOfWork.ts","../src/application/unit-of-work/BasicUnitOfWorkFactory.ts","../src/infrastructure/mysql/Mysql.ts","../src/infrastructure/http/DefaultController.ts","../src/infrastructure/express/ExpressAdapters.ts","../src/utils/ExchangeRates.ts"],"sourcesContent":["/* ──────────────────────────────────────────────── *\n * DOMAIN *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {DomainEntity, BaseEntity} from './domain/contracts/DomainEntity';\nexport {DomainError} from './domain/contracts/DomainError';\nexport {DomainEvent} from './domain/contracts/DomainEvent';\nexport {ValueObject} from './domain/contracts/ValueObject';\nexport {BaseObject} from './domain/contracts/BaseObject';\n// Errors\nexport {FatalError} from './domain/errors/FatalError';\nexport {InternalError} from './domain/errors/InternalError';\nexport {UsageError} from './domain/errors/UsageError';\n// Value objects\nexport {Currency} from './domain/value-objects/Currency';\nexport {DateTime} from './domain/value-objects/DateTime';\nexport {Email} from './domain/value-objects/Email';\nexport {Language} from './domain/value-objects/Language';\nexport {Price} from './domain/value-objects/Price';\nexport {UUID} from './domain/value-objects/UUID';\n\n\n/* ──────────────────────────────────────────────── *\n * APPLICATION *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {EventBus} from './application/contracts/EventBus';\nexport {EventBusRepository} from './application/contracts/EventBusRepository';\nexport {UnitOfWork} from './application/contracts/UnitOfWork';\n// Unit of work\nexport {BasicUnitOfWork} from './application/unit-of-work/BasicUnitOfWork';\nexport {BasicUnitOfWorkFactory} from './application/unit-of-work/BasicUnitOfWorkFactory';\n\n\n/* ──────────────────────────────────────────────── *\n * INFRASTRUCTURE *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {DatabaseConnector, DatabaseConnection} from './infrastructure/contracts/Database';\nexport {Logger} from './infrastructure/contracts/Logger';\nexport {HttpRequest, HttpResponse, HttpController, UploadedFile} from './infrastructure/contracts/Http';\n// Errors\nexport {ErrorManager, ErrorManagerHandleResult, ErrorTemplate} from './infrastructure/errors/ErrorManager';\n// Mysql\nexport {MysqlConnector, MysqlConnection} from './infrastructure/mysql/Mysql';\n// http\nexport {HttpHealthCheckController, HttpNotFoundController} from './infrastructure/http/DefaultController';\n// express\nexport {adaptExpressRoute, adaptExpressErrorHandler} from './infrastructure/express/ExpressAdapters';\n\n/* ──────────────────────────────────────────────── *\n * UTILS *\n * ──────────────────────────────────────────────── */\n\nexport {ExchangeRates} from './utils/ExchangeRates';","import {DateTime as LuxonDateTime} from 'luxon';\nimport {ValueObject} from \"@domain/contracts/ValueObject\";\n\nexport class DateTime extends ValueObject<string> {\n\n public static readonly DEFAULT_FORMAT: string = 'yyyy-MM-dd HH:mm:ss';\n\n private readonly _dt: LuxonDateTime;\n\n private static fromLuxon(dt: LuxonDateTime): DateTime {\n return new DateTime(DateTime.toUtcFormat(dt));\n }\n\n private static toUtcFormat(dt: LuxonDateTime): string {\n return dt.setZone('utc').toFormat(DateTime.DEFAULT_FORMAT);\n }\n\n private constructor(value: string) {\n super(value);\n this._dt = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n }\n\n protected validate(value: string): void {\n const q = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n if (!q.isValid) {\n throw new Error(`Invalid DateTime: ${q.invalidExplanation}`);\n }\n }\n\n public plusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({years}));\n }\n\n public plusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({months}));\n }\n\n public plusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({days}));\n }\n\n public plusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({hours}));\n }\n\n public plusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({minutes}));\n }\n\n public plusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({seconds}));\n }\n\n public minusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({years}));\n }\n\n public minusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({months}));\n }\n\n public minusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({days}));\n }\n\n public minusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({hours}));\n }\n\n public minusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({minutes}));\n }\n\n public minusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({seconds}));\n }\n\n public get year(): number {\n return this._dt.year;\n }\n\n public get month(): number {\n return this._dt.month;\n }\n\n public get day(): number {\n return this._dt.day;\n }\n\n public get hour(): number {\n return this._dt.hour;\n }\n\n public get minute(): number {\n return this._dt.minute;\n }\n\n public get second(): number {\n return this._dt.second;\n }\n\n public getMonthName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('LLLL');\n }\n\n public getWeekdayName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('cccc');\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(input?: string | number): DateTime {\n if (input === undefined) {\n return new DateTime(DateTime.toUtcFormat(LuxonDateTime.now()));\n }\n if (typeof input === 'number') {\n return new DateTime(\n DateTime.toUtcFormat(LuxonDateTime.fromMillis(input, { zone: 'utc' })),\n );\n }\n const iso = LuxonDateTime.fromISO(input, { zone: 'utc' });\n if (iso.isValid) {\n return new DateTime(DateTime.toUtcFormat(iso));\n }\n return new DateTime(input);\n }\n\n public static now(): DateTime {\n return DateTime.create();\n }\n}\n","\nexport abstract class ValueObject<TPrimitive = unknown> {\n\n protected readonly _value: TPrimitive;\n\n protected constructor(value: TPrimitive) {\n this.validate(value);\n this._value = Object.freeze(value);\n }\n\n protected abstract validate(value: TPrimitive): void;\n public abstract toPrimitives(): Record<string, unknown>;\n\n public toProps(): TPrimitive {\n return this._value\n }\n public get value(): TPrimitive {\n return this._value;\n }\n public toString(): string {\n return String(this._value);\n }\n\n public equals(vo?: ValueObject<TPrimitive> | null): boolean {\n if (vo === null || vo === undefined) return false;\n if (vo.constructor !== this.constructor) return false;\n return vo.value === this._value;\n }\n}","import {UUID} from \"@domain/value-objects/UUID\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport interface BaseEntity {\n uuid: UUID;\n createdAt: DateTime;\n updatedAt: DateTime;\n deletedAt: DateTime | undefined;\n}\n\nexport abstract class DomainEntity<T extends BaseEntity> {\n\n protected readonly props: T;\n\n protected constructor(props: T) {\n this.props = props;\n }\n\n protected touch(): void {\n this.props.updatedAt = DateTime.now();\n }\n\n public get uuid(): UUID {\n return this.props.uuid;\n }\n public get createdAt(): DateTime {\n return this.props.createdAt;\n }\n public get updatedAt(): DateTime {\n return this.props.updatedAt;\n }\n public get deletedAt(): DateTime | undefined {\n return this.props.deletedAt;\n }\n public get isDeleted(): boolean {\n return Boolean(this.props.deletedAt);\n }\n\n public abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n\n}\n","export abstract class DomainError extends Error {\n\n public readonly type: string;\n\n protected constructor(type: string, message = '') {\n super(message);\n this.type = type;\n }\n}","import {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport abstract class DomainEvent<T = unknown> {\n\n readonly type: string;\n private readonly _occurredAt: DateTime;\n private readonly _payload: T;\n\n protected constructor(payload: T) {\n this._payload = payload;\n this._occurredAt = DateTime.create();\n }\n\n get payload(): T {\n return this._payload;\n }\n\n get occurredAt(): DateTime {\n return this._occurredAt;\n }\n\n}","\nexport abstract class BaseObject<T = unknown> {\n protected readonly props: T;\n protected constructor(props: T) {\n this.props = props;\n }\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class FatalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class InternalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class UsageError extends DomainError {\n\n public readonly vars: Record<string, any>;\n\n public constructor(type: string, vars: Record<string, any> = {}) {\n super(type);\n this.vars = vars;\n }\n\n}","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Currency extends ValueObject<string> {\n\n public static readonly ALPHA_REGEX = /^[A-Z]{3}$/u;\n public static readonly NUM_REGEX = /^\\d{3}$/u;\n\n private static readonly ALPHA_TO_NUM: Record<string, number> = {\n USD: 840,\n EUR: 978,\n UYU: 858,\n ARS: 32,\n BRL: 986,\n };\n\n private static readonly NUM_TO_ALPHA: Record<number, string> =\n Object.entries(Currency.ALPHA_TO_NUM).reduce(\n (acc, [alpha, num]) => {\n acc[num as number] = alpha;\n return acc;\n },\n {} as Record<number, string>,\n );\n\n public static readonly USD: Currency = new Currency('USD');\n public static readonly EUR: Currency = new Currency('EUR');\n public static readonly UYU: Currency = new Currency('UYU');\n public static readonly ARS: Currency = new Currency('ARS');\n public static readonly BRL: Currency = new Currency('BRL');\n\n public readonly numeric: number;\n\n private constructor(alpha: string) {\n super(alpha.toUpperCase().trim());\n this.numeric = Currency.ALPHA_TO_NUM[this.value];\n }\n\n protected validate(alpha: string): void {\n const code = alpha.toUpperCase().trim();\n if (!Currency.ALPHA_REGEX.test(code)) {\n throw new Error(`Currency code <${alpha}> is not a valid ISO‑4217 alpha value`);\n }\n if (!(code in Currency.ALPHA_TO_NUM)) {\n throw new Error(`Currency <${code}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string | number): Currency {\n if (typeof raw === 'number' || Currency.NUM_REGEX.test(raw)) {\n const num = Number(raw);\n const alpha = Currency.NUM_TO_ALPHA[num];\n if (!alpha) {\n throw new Error(`Numeric currency <${raw}> is not supported`);\n }\n return new Currency(alpha);\n }\n return new Currency(String(raw));\n }\n\n public static isValid(raw: string | number): boolean {\n try {\n Currency.create(raw);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Email extends ValueObject<string> {\n\n public static readonly REGEX: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/u;\n\n private constructor(email: string) {\n super(email.trim());\n }\n\n protected validate(value: string): void {\n if (!Email.REGEX.test(value)) {\n throw new Error(`Email <${value}> is not a valid address`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string): Email {\n return new Email(raw);\n }\n\n public static isValid(raw: string): boolean {\n return Email.REGEX.test(raw.trim());\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class Language extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'es',\n 'en',\n 'en-us',\n 'en-gb',\n 'en-au',\n 'en-ca',\n 'en-nz',\n 'en-ie',\n 'en-za',\n 'en-jm',\n 'en-bz',\n 'en-tt',\n 'pt-br',\n 'pt',\n 'es',\n 'es-ar',\n 'es-gt',\n 'es-cr',\n 'es-pa',\n 'es-do',\n 'es-mx',\n 'es-ve',\n 'es-co',\n 'es-pe',\n 'es-ec',\n 'es-cl',\n 'es-uy',\n 'es-py',\n 'es-bo',\n 'es-sv',\n 'es-hn',\n 'es-ni',\n 'es-pr',\n ] as const;\n\n public static readonly DEFAULT: Language = new Language('es');\n public static readonly ENGLISH: Language = new Language('en');\n public static readonly ENGLISH_UNITED_STATES: Language = new Language('en-us');\n public static readonly ENGLISH_UNITED_KINGDOM: Language = new Language('en-gb');\n public static readonly ENGLISH_AUSTRALIA: Language = new Language('en-au');\n public static readonly ENGLISH_CANADA: Language = new Language('en-ca');\n public static readonly ENGLISH_NEW_ZEALAND: Language = new Language('en-nz');\n public static readonly ENGLISH_IRELAND: Language = new Language('en-ie');\n public static readonly ENGLISH_SOUTH_AFRICA: Language = new Language('en-za');\n public static readonly ENGLISH_JAMAICA: Language = new Language('en-jm');\n public static readonly ENGLISH_BELIZE: Language = new Language('en-bz');\n public static readonly ENGLISH_TRINIDAD: Language = new Language('en-tt');\n public static readonly PORTUGUESE_BRAZIL: Language = new Language('pt-br');\n public static readonly PORTUGUESE_PORTUGAL: Language = new Language('pt');\n public static readonly SPANISH: Language = new Language('es');\n public static readonly SPANISH_ARGENTINA: Language = new Language('es-ar');\n public static readonly SPANISH_GUATEMALA: Language = new Language('es-gt');\n public static readonly SPANISH_COSTA_RICA: Language = new Language('es-cr');\n public static readonly SPANISH_PANAMA: Language = new Language('es-pa');\n public static readonly SPANISH_REPUBLICA_DOMINICANA: Language = new Language('es-do');\n public static readonly SPANISH_MEXICO: Language = new Language('es-mx');\n public static readonly SPANISH_VENEZUELA: Language = new Language('es-ve');\n public static readonly SPANISH_COLOMBIA: Language = new Language('es-co');\n public static readonly SPANISH_PERU: Language = new Language('es-pe');\n public static readonly SPANISH_ECUADOR: Language = new Language('es-ec');\n public static readonly SPANISH_CHILE: Language = new Language('es-cl');\n public static readonly SPANISH_URUGUAY: Language = new Language('es-uy');\n public static readonly SPANISH_PARAGUAY: Language = new Language('es-py');\n public static readonly SPANISH_BOLIVIA: Language = new Language('es-bo');\n public static readonly SPANISH_EL_SALVADOR: Language = new Language('es-sv');\n public static readonly SPANISH_HONDURAS: Language = new Language('es-hn');\n public static readonly SPANISH_NICARAGUA: Language = new Language('es-ni');\n public static readonly SPANISH_PUERTO_RICO: Language = new Language('es-pr');\n\n private constructor(code: string) {\n super(code.trim().toLowerCase());\n }\n\n protected validate(value: string): void {\n if (!Language.SUPPORTED.includes(value)) {\n throw new InternalError(`Language <${value}> is not supported`);\n }\n }\n\n public base(): string {\n return this.value.split('-')[0];\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.base(),\n value: this.value\n };\n }\n\n public static create(raw: string): Language {\n const normalized = raw.trim().toLowerCase().replace('_', '-');\n try {\n return new Language(normalized);\n } catch (error: any) {\n return Language.DEFAULT;\n }\n }\n\n}\n","export class StringVars {\n\n public static parse(str: string, ob: { [key: string]: any }): string {\n const regex = /{{(.*?)}}/g;\n return str.replace(regex, (match, variable) => {\n if (ob.hasOwnProperty(variable.trim())) {\n return ob[variable.trim()];\n } else {\n return match;\n }\n });\n }\n\n}","import {Language} from \"@domain/value-objects/Language\";\nimport {FatalError} from \"@domain/errors/FatalError\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {UsageError} from \"@domain/errors/UsageError\";\nimport {StringVars} from \"@utils/StringVars\";\nimport {Logger} from \"@infrastructure/contracts/Logger\";\n\nexport interface ErrorTemplate {\n type: string;\n languages: Record<string, string>;\n}\n\nexport type ErrorManagerHandleResult = {\n status: number | string;\n message: string;\n};\n\nexport class ErrorManager {\n\n private static readonly DEFAULT_MESSAGES: Record<string, string> = {\n 'es': 'Ups, hemos encontrado un error. Nuestro equipo ya está trabajando para solucionarlo',\n 'en': 'Ups, we found an error. Our team is working on it.',\n 'pt': 'Ops, encontramos um bug. Nossa equipe já está trabalhando para resolver isso.',\n };\n\n public static readonly APP_ERRORS = {\n UNDEFINED: 'UNDEFINED_ERROR',\n PROCESS: 'PROCESS_ERROR',\n DATABASE: 'DATABASE_ERROR'\n } as const;\n\n private static readonly TEMPLATES = new Map<string, ErrorTemplate>();\n\n public constructor(private readonly logger: Logger | null = null) {}\n\n private getDefaultMessage(lang: Language): string {\n return (ErrorManager.DEFAULT_MESSAGES[lang.value] || ErrorManager.DEFAULT_MESSAGES[lang.base()] || 'error');\n }\n\n private onFatal(err: FatalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.fatal(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onInternal(err: InternalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.error(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onUsage(err: UsageError, lang: Language): ErrorManagerHandleResult {\n const tmpl = ErrorManager.TEMPLATES.get(err.type);\n if (!tmpl) {\n this.logger?.error('TEMPLATE_NOT_FOUND', `${err.type}`);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n const code = lang.value;\n const base = lang.base();\n const rawMsg =\n tmpl.languages[code] ??\n tmpl.languages[base] ??\n this.getDefaultMessage(lang);\n return {\n status: 400,\n message: StringVars.parse(rawMsg, err.vars),\n };\n }\n\n private onUnknown(err: Error, lang: Language): ErrorManagerHandleResult {\n this.logger?.error('UNKNOWN_ERROR', err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n public handle(err: Error, lang: Language): ErrorManagerHandleResult {\n if (['local','dev'].includes(process.env.ENVIRONMENT ?? '')) {\n console.log(err);\n }\n if (err instanceof FatalError) {\n return this.onFatal(err, lang);\n }\n if (err instanceof InternalError) {\n return this.onInternal(err, lang);\n }\n if (err instanceof UsageError) {\n return this.onUsage(err, lang);\n }\n return this.onUnknown(err, lang);\n }\n\n public static addTemplate(template: ErrorTemplate): void {\n ErrorManager.TEMPLATES.set(template.type, template);\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport { Currency } from '@domain/value-objects/Currency';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {UsageError} from \"@domain/errors/UsageError\";\n\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_AMOUNT',\n languages: {\n 'es': 'El precio <{{amount}}> no es válido',\n 'en': 'Price amount <{{amount}}> is not a valid number',\n }\n});\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_RANGE',\n languages: {\n 'es': 'El precio <{{amount}}> debe ser ≥ {{min}} y ≤ {{max}}',\n 'en': 'Price amount <{{amount}}> must be ≥ {{min}} and ≤ {{max}}',\n }\n});\n\nexport interface PriceProps {\n amount: number;\n currency: Currency;\n}\n\nexport class Price extends ValueObject<PriceProps> {\n\n public static readonly MIN_AMOUNT: number = -1000000;\n public static readonly MAX_AMOUNT: number = 1000000000;\n\n\n private constructor(amount: number, currency: Currency) {\n super({ amount, currency });\n }\n\n protected validate(props: { amount: number; currency: Currency }): void {\n const { amount, currency } = props;\n\n if (typeof amount !== 'number' || Number.isNaN(amount) || !Number.isFinite(amount)) {\n throw new UsageError('INVALID_PRICE_AMOUNT', {amount});\n }\n if (amount < Price.MIN_AMOUNT || amount > Price.MAX_AMOUNT) {\n throw new UsageError('INVALID_PRICE_RANGE', {amount, min: Price.MIN_AMOUNT, max: Price.MAX_AMOUNT});\n }\n }\n\n public get amount(): number {\n return this._value.amount;\n }\n\n public get currency(): Currency {\n return this._value.currency;\n }\n\n public equals(other?: Price | null): boolean {\n if (!other) return false;\n return this._value.amount === other.amount && this.currency.equals(other.currency);\n }\n\n private assertSameCurrency(other: Price): void {\n if (!this.currency.equals(other.currency)) {\n throw new Error('Cannot operate on Price objects with different currencies');\n }\n }\n\n public add(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount + other.amount, this.currency);\n }\n\n public subtract(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount - other.amount, this.currency);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n amount: this.amount,\n currency: this.currency.value,\n }\n }\n\n public static create(amount: number, currency: Currency | string | number): Price {\n const cur = currency instanceof Currency ? currency : Currency.create(currency);\n return new Price(amount, cur);\n }\n public static createFromPrimitives(data: Record<string, unknown>): Price {\n return new Price(Number(data.amount), Currency.create(String(data.currency)));\n }\n\n}\n","import {ValueObject} from \"@domain/contracts/ValueObject\";\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class UUID extends ValueObject<string> {\n\n private constructor(value: string) {\n super(value);\n }\n\n protected validate(uuid: string) {\n if (!UUID.isValid(uuid)) {\n throw new InternalError(`Invalid uuid <${uuid}>`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static isValid(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\n }\n\n}","import {DatabaseConnection} from '@infrastructure/contracts/Database';\nimport {UnitOfWork} from \"@application/contracts/UnitOfWork\";\n\nexport class BasicUnitOfWork implements UnitOfWork {\n\n public readonly connection: DatabaseConnection;\n\n public constructor(conn: DatabaseConnection) {\n this.connection = conn;\n }\n\n public async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.connection.begin();\n try {\n const result = await fn();\n await this.connection.commit();\n return result;\n } catch (err: any) {\n await this.connection.rollback();\n throw err;\n } finally {\n await this.connection.close();\n }\n }\n}\n","import {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\nimport {BasicUnitOfWork} from \"@application/unit-of-work/BasicUnitOfWork\";\n\nexport class BasicUnitOfWorkFactory {\n\n private readonly connector: DatabaseConnector;\n\n public constructor(connector: DatabaseConnector) {\n this.connector = connector;\n }\n\n public async create(): Promise<BasicUnitOfWork> {\n const conn: DatabaseConnection = await this.connector.getConnection();\n return new BasicUnitOfWork(conn);\n }\n\n}","import {createPool, FieldPacket, Pool, PoolConnection, RowDataPacket} from \"mysql2/promise\";\nimport {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\n\nexport class MysqlConnector implements DatabaseConnector<MysqlConnection> {\n public static readonly DEFAULT_POOL_SIZE: number = 10;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool =\n pool ??\n createPool({\n host: process.env.DB_HOST,\n port: Number(process.env.DB_PORT ?? 3306),\n user: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n dateStrings: true,\n connectionLimit: Number(process.env.DB_POOL_SIZE) || MysqlConnector.DEFAULT_POOL_SIZE,\n decimalNumbers: true,\n });\n }\n\n private async wrap(conn: PoolConnection): Promise<MysqlConnection> {\n return new MysqlConnection(conn);\n }\n\n public async getConnection(): Promise<MysqlConnection> {\n const conn: PoolConnection = await this._pool.getConnection();\n return this.wrap(conn);\n }\n\n public async closePool(): Promise<void> {\n await this._pool.end();\n }\n\n public static async ping(): Promise<boolean> {\n const connector: MysqlConnector = new MysqlConnector();\n try {\n const conn = await connector._pool.getConnection();\n await conn.ping();\n conn.release();\n return true;\n } catch {\n return false;\n } finally {\n await connector.closePool();\n }\n }\n}\n\nexport class MysqlConnection implements DatabaseConnection<string, any[], RowDataPacket> {\n\n private readonly _conn: PoolConnection;\n\n public constructor(conn: PoolConnection) {\n this._conn = conn;\n }\n\n public async query<R = RowDataPacket>(statement: string, params: any[] = []): Promise<R[]> {\n const [rows] = await this._conn.query<R[] & RowDataPacket[] & FieldPacket[]>(statement, params);\n return rows as R[];\n }\n\n public async begin(): Promise<void> {\n await this._conn.beginTransaction();\n }\n\n public async commit(): Promise<void> {\n await this._conn.commit();\n }\n\n public async rollback(): Promise<void> {\n await this._conn.rollback();\n }\n\n public async transaction<T>(fn: (conn: this) => Promise<T>): Promise<T> {\n await this.begin();\n try {\n const result: T = await fn(this);\n await this.commit();\n return result;\n } catch (err) {\n await this.rollback();\n throw err;\n }\n }\n\n public async close(): Promise<void> {\n this._conn.release();\n }\n\n}\n","import {HttpController, HttpRequest, HttpResponse} from \"@infrastructure/contracts/Http\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport class HttpHealthCheckController implements HttpController {\n async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 200,\n body: {\n date: DateTime.create().value,\n code: 200,\n status: 'OK'\n }\n }\n }\n}\n\nexport class HttpNotFoundController implements HttpController {\n public async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 404,\n body: {\n status: 'NOT_FOUND',\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest, HttpResponse} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\n\n\nconst BOOL_TRUE = new Set(['1','true','yes','y','on']);\nconst BOOL_FALSE = new Set(['0','false','no','n','off']);\nconst NUMERIC_KEY_RE = /^(?:page|qty|limit|offset|total|amount|price|count|rounding|min[A-Z_].*|max[A-Z_].*)$/i;\nconst DATE_KEY_RE = /(At|Date|_at|_date)$/i;\n\nfunction toUtcDateTimeString(raw: string): string | undefined {\n const s = raw.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return `${s} 00:00:00`;\n if (/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s)) return s; // asumimos ya UTC\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return undefined;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;\n}\nfunction coerceScalar(key: string, v: unknown): unknown {\n if (v == null) return undefined;\n if (typeof v !== 'string') return v;\n\n const s = v.trim();\n if (s === '') return undefined;\n\n // null literal\n if (s.toLowerCase() === 'null') return null;\n\n // boolean\n const low = s.toLowerCase();\n if (BOOL_TRUE.has(low)) return true;\n if (BOOL_FALSE.has(low)) return false;\n\n // number (solo para claves \"numéricas\" típicas)\n if (NUMERIC_KEY_RE.test(key) && /^-?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (Number.isFinite(n)) return n;\n }\n\n // fecha (claves que terminan con At/Date/_at/_date)\n if (DATE_KEY_RE.test(key)) {\n return toUtcDateTimeString(s) ?? s; // si no parsea, dejá string tal cual\n }\n\n return s;\n}\nfunction normalizeQuery(q: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(q)) {\n // arrays repetidos (?status=A&status=B) o listas con coma (?status=A,B)\n const values = Array.isArray(raw) ? raw : (typeof raw === 'string' && raw.includes(','))\n ? raw.split(',').map(s => s.trim()).filter(Boolean)\n : [raw];\n\n const coerced = values\n .map(v => coerceScalar(key, v))\n .filter(v => v !== undefined);\n\n // si quedó más de uno ⇒ array, si quedó uno ⇒ escalar, si vacío ⇒ omitido\n if (coerced.length === 1) out[key] = coerced[0];\n else if (coerced.length > 1) out[key] = coerced;\n }\n return out;\n}\n\nfunction hasContentType(headers?: HttpResponse['headers']): boolean {\n if (!headers) return false;\n return Object.keys(headers).some(h => h.toLowerCase() === 'content-type');\n}\nfunction isReadableStream(x: any): x is NodeJS.ReadableStream {\n return x && typeof x.pipe === 'function';\n}\n\nexport function adaptExpressRoute(Controller: new () => HttpController): RequestHandler {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rawLangHeader = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(rawLangHeader) ? rawLangHeader[0] : rawLangHeader || '';\n const lang = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: normalizeQuery(req.query as Record<string, unknown>),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const { statusCode, body, headers }: HttpResponse = await controller.handle(httpRequest);\n\n // 1) headers personalizados\n if (headers) res.set(headers as any);\n\n // 2) decidir la forma de enviar el body\n if (isReadableStream(body)) {\n // stream (PDF grande, CSV, etc.)\n res.status(statusCode);\n body.on('error', next);\n body.pipe(res);\n return;\n }\n\n const hasCT = hasContentType(headers);\n\n if (Buffer.isBuffer(body) || typeof body === 'string' || hasCT) {\n // buffer/string o pediste un Content-Type custom → usar send()\n res.status(statusCode).send(body as any);\n } else {\n // default: JSON\n res.status(statusCode).json(body ?? {});\n }\n } catch (err) {\n next(err);\n }\n };\n}\n\n\nexport function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequestHandler {\n return (err, req: Request, res: Response, next: NextFunction) => {\n const raw = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(raw) ? raw[0] : raw ?? '';\n const langCode = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const result = errorManager.handle(err, Language.create(langCode));\n const statusCode = typeof result.status === 'number' ? result.status : 500;\n res.status(statusCode).json({ message: result.message });\n };\n}","import {Currency} from \"@domain/value-objects/Currency\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {Price} from \"@domain/value-objects/Price\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {BaseObject} from \"@domain/contracts/BaseObject\";\n\nexport interface ExchangeRatesProps {\n base: Currency;\n rates: Record<string, number>;\n date: DateTime;\n}\nexport class ExchangeRates extends BaseObject<ExchangeRatesProps>{\n\n public constructor(props: ExchangeRatesProps) {\n super(props);\n }\n\n private getRate(currency: Currency): number | null {\n if (Object.keys(this.props.rates).includes(currency.value)) {\n return this.props.rates[currency.value];\n }\n return null;\n }\n\n public get base(): Currency {\n return this.props.base;\n }\n public get rates(): Record<string, number> {\n return this.props.rates;\n }\n public get date(): DateTime {\n return this.props.date;\n }\n\n public toProps(): ExchangeRatesProps {\n return this.props;\n }\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.props.base.value,\n rates: this.props.rates,\n date: this.props.date.value,\n };\n }\n\n public exchangeToBase(price: Price): Price {\n const rate = this.getRate(price.currency);\n if (!rate) {\n throw new InternalError('INVALID_EXCHANGE_RATE_CURRENCY', `Avaiable rates: ${this.props.rates} - Base Currency:${this.props.base.value} - Price Currency: ${price.currency.value}`)\n }\n if (price.currency.value === this.props.base.value) {\n return price;\n }\n return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.props.base.value);\n }\n\n public static create(props: ExchangeRatesProps): ExchangeRates {\n return new ExchangeRates(props);\n }\n public static createFromPrimitives(data: any): ExchangeRates {\n return ExchangeRates.create({\n base: Currency.create(data.base),\n rates: data.rates ?? [],\n date: DateTime.create(data.date ?? ''),\n });\n }\n\n}"],"mappings":"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","names":["LuxonDateTime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/domain/value-objects/DateTime.ts","../src/domain/contracts/ValueObject.ts","../src/domain/contracts/DomainEntity.ts","../src/domain/contracts/DomainError.ts","../src/domain/contracts/DomainEvent.ts","../src/domain/contracts/BaseObject.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/InternalError.ts","../src/domain/errors/UsageError.ts","../src/domain/value-objects/Currency.ts","../src/domain/value-objects/Email.ts","../src/domain/value-objects/Language.ts","../src/utils/StringVars.ts","../src/infrastructure/errors/ErrorManager.ts","../src/domain/value-objects/Price.ts","../src/domain/value-objects/UUID.ts","../src/application/unit-of-work/BasicUnitOfWork.ts","../src/application/unit-of-work/BasicUnitOfWorkFactory.ts","../src/infrastructure/mysql/Mysql.ts","../src/infrastructure/http/DefaultController.ts","../src/infrastructure/express/ExpressAdapters.ts","../src/utils/ExchangeRates.ts"],"sourcesContent":["/* ──────────────────────────────────────────────── *\n * DOMAIN *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {DomainEntity, BaseEntity} from './domain/contracts/DomainEntity';\nexport {DomainError} from './domain/contracts/DomainError';\nexport {DomainEvent} from './domain/contracts/DomainEvent';\nexport {ValueObject} from './domain/contracts/ValueObject';\nexport {BaseObject} from './domain/contracts/BaseObject';\n// Errors\nexport {FatalError} from './domain/errors/FatalError';\nexport {InternalError} from './domain/errors/InternalError';\nexport {UsageError} from './domain/errors/UsageError';\n// Value objects\nexport {Currency} from './domain/value-objects/Currency';\nexport {DateTime} from './domain/value-objects/DateTime';\nexport {Email} from './domain/value-objects/Email';\nexport {Language} from './domain/value-objects/Language';\nexport {Price} from './domain/value-objects/Price';\nexport {UUID} from './domain/value-objects/UUID';\n\n\n/* ──────────────────────────────────────────────── *\n * APPLICATION *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {EventBus} from './application/contracts/EventBus';\nexport {EventBusRepository} from './application/contracts/EventBusRepository';\nexport {UnitOfWork} from './application/contracts/UnitOfWork';\n// Unit of work\nexport {BasicUnitOfWork} from './application/unit-of-work/BasicUnitOfWork';\nexport {BasicUnitOfWorkFactory} from './application/unit-of-work/BasicUnitOfWorkFactory';\n\n\n/* ──────────────────────────────────────────────── *\n * INFRASTRUCTURE *\n * ──────────────────────────────────────────────── */\n// Contracts\nexport {DatabaseConnector, DatabaseConnection} from './infrastructure/contracts/Database';\nexport {Logger} from './infrastructure/contracts/Logger';\nexport {HttpRequest, HttpResponse, HttpController, UploadedFile} from './infrastructure/contracts/Http';\n// Errors\nexport {ErrorManager, ErrorManagerHandleResult, ErrorTemplate} from './infrastructure/errors/ErrorManager';\n// Mysql\nexport {MysqlConnector, MysqlConnection} from './infrastructure/mysql/Mysql';\n// http\nexport {HttpHealthCheckController, HttpNotFoundController} from './infrastructure/http/DefaultController';\n// express\nexport {adaptExpressRoute, adaptExpressErrorHandler} from './infrastructure/express/ExpressAdapters';\n\n/* ──────────────────────────────────────────────── *\n * UTILS *\n * ──────────────────────────────────────────────── */\n\nexport {ExchangeRates} from './utils/ExchangeRates';","import {DateTime as LuxonDateTime} from 'luxon';\nimport {ValueObject} from \"@domain/contracts/ValueObject\";\n\nexport class DateTime extends ValueObject<string> {\n\n public static readonly DEFAULT_FORMAT: string = 'yyyy-MM-dd HH:mm:ss';\n\n private readonly _dt: LuxonDateTime;\n\n private static fromLuxon(dt: LuxonDateTime): DateTime {\n return new DateTime(DateTime.toUtcFormat(dt));\n }\n\n private static toUtcFormat(dt: LuxonDateTime): string {\n return dt.setZone('utc').toFormat(DateTime.DEFAULT_FORMAT);\n }\n\n private constructor(value: string) {\n super(value);\n this._dt = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n }\n\n protected validate(value: string): void {\n const q = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n if (!q.isValid) {\n throw new Error(`Invalid DateTime: ${q.invalidExplanation}`);\n }\n }\n\n public plusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({years}));\n }\n\n public plusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({months}));\n }\n\n public plusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({days}));\n }\n\n public plusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({hours}));\n }\n\n public plusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({minutes}));\n }\n\n public plusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({seconds}));\n }\n\n public minusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({years}));\n }\n\n public minusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({months}));\n }\n\n public minusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({days}));\n }\n\n public minusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({hours}));\n }\n\n public minusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({minutes}));\n }\n\n public minusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({seconds}));\n }\n\n public get year(): number {\n return this._dt.year;\n }\n\n public get month(): number {\n return this._dt.month;\n }\n\n public get day(): number {\n return this._dt.day;\n }\n\n public get hour(): number {\n return this._dt.hour;\n }\n\n public get minute(): number {\n return this._dt.minute;\n }\n\n public get second(): number {\n return this._dt.second;\n }\n\n public getMonthName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('LLLL');\n }\n\n public getWeekdayName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('cccc');\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(input?: string | number): DateTime {\n if (input === undefined) {\n return new DateTime(DateTime.toUtcFormat(LuxonDateTime.now()));\n }\n if (typeof input === 'number') {\n return new DateTime(\n DateTime.toUtcFormat(LuxonDateTime.fromMillis(input, { zone: 'utc' })),\n );\n }\n const iso = LuxonDateTime.fromISO(input, { zone: 'utc' });\n if (iso.isValid) {\n return new DateTime(DateTime.toUtcFormat(iso));\n }\n return new DateTime(input);\n }\n\n public static now(): DateTime {\n return DateTime.create();\n }\n}\n","\nexport abstract class ValueObject<TPrimitive = unknown> {\n\n protected readonly _value: TPrimitive;\n\n protected constructor(value: TPrimitive) {\n this.validate(value);\n this._value = Object.freeze(value);\n }\n\n protected abstract validate(value: TPrimitive): void;\n public abstract toPrimitives(): Record<string, unknown>;\n\n public toProps(): TPrimitive {\n return this._value\n }\n public get value(): TPrimitive {\n return this._value;\n }\n public toString(): string {\n return String(this._value);\n }\n\n public equals(vo?: ValueObject<TPrimitive> | null): boolean {\n if (vo === null || vo === undefined) return false;\n if (vo.constructor !== this.constructor) return false;\n return vo.value === this._value;\n }\n}","import {UUID} from \"@domain/value-objects/UUID\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport interface BaseEntity {\n uuid: UUID;\n createdAt: DateTime;\n updatedAt: DateTime;\n deletedAt: DateTime | undefined;\n}\n\nexport abstract class DomainEntity<T extends BaseEntity> {\n\n protected readonly props: T;\n\n protected constructor(props: T) {\n this.props = props;\n }\n\n protected touch(): void {\n this.props.updatedAt = DateTime.now();\n }\n\n public get uuid(): UUID {\n return this.props.uuid;\n }\n public get createdAt(): DateTime {\n return this.props.createdAt;\n }\n public get updatedAt(): DateTime {\n return this.props.updatedAt;\n }\n public get deletedAt(): DateTime | undefined {\n return this.props.deletedAt;\n }\n public get isDeleted(): boolean {\n return Boolean(this.props.deletedAt);\n }\n\n public abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n\n}\n","export abstract class DomainError extends Error {\n\n public readonly type: string;\n\n protected constructor(type: string, message = '') {\n super(message);\n this.type = type;\n }\n}","import {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport abstract class DomainEvent<T = unknown> {\n\n readonly type: string;\n private readonly _occurredAt: DateTime;\n private readonly _payload: T;\n\n protected constructor(payload: T) {\n this._payload = payload;\n this._occurredAt = DateTime.create();\n }\n\n get payload(): T {\n return this._payload;\n }\n\n get occurredAt(): DateTime {\n return this._occurredAt;\n }\n\n}","\nexport abstract class BaseObject<T = unknown> {\n protected readonly props: T;\n protected constructor(props: T) {\n this.props = props;\n }\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class FatalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class InternalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class UsageError extends DomainError {\n\n public readonly vars: Record<string, any>;\n\n public constructor(type: string, vars: Record<string, any> = {}) {\n super(type);\n this.vars = vars;\n }\n\n}","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Currency extends ValueObject<string> {\n\n public static readonly ALPHA_REGEX = /^[A-Z]{3}$/u;\n public static readonly NUM_REGEX = /^\\d{3}$/u;\n\n private static readonly ALPHA_TO_NUM: Record<string, number> = {\n USD: 840,\n EUR: 978,\n UYU: 858,\n ARS: 32,\n BRL: 986,\n };\n\n private static readonly NUM_TO_ALPHA: Record<number, string> =\n Object.entries(Currency.ALPHA_TO_NUM).reduce(\n (acc, [alpha, num]) => {\n acc[num as number] = alpha;\n return acc;\n },\n {} as Record<number, string>,\n );\n\n public static readonly USD: Currency = new Currency('USD');\n public static readonly EUR: Currency = new Currency('EUR');\n public static readonly UYU: Currency = new Currency('UYU');\n public static readonly ARS: Currency = new Currency('ARS');\n public static readonly BRL: Currency = new Currency('BRL');\n\n public readonly numeric: number;\n\n private constructor(alpha: string) {\n super(alpha.toUpperCase().trim());\n this.numeric = Currency.ALPHA_TO_NUM[this.value];\n }\n\n protected validate(alpha: string): void {\n const code = alpha.toUpperCase().trim();\n if (!Currency.ALPHA_REGEX.test(code)) {\n throw new Error(`Currency code <${alpha}> is not a valid ISO‑4217 alpha value`);\n }\n if (!(code in Currency.ALPHA_TO_NUM)) {\n throw new Error(`Currency <${code}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string | number): Currency {\n if (typeof raw === 'number' || Currency.NUM_REGEX.test(raw)) {\n const num = Number(raw);\n const alpha = Currency.NUM_TO_ALPHA[num];\n if (!alpha) {\n throw new Error(`Numeric currency <${raw}> is not supported`);\n }\n return new Currency(alpha);\n }\n return new Currency(String(raw));\n }\n\n public static isValid(raw: string | number): boolean {\n try {\n Currency.create(raw);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Email extends ValueObject<string> {\n\n public static readonly REGEX: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/u;\n\n private constructor(email: string) {\n super(email.trim());\n }\n\n protected validate(value: string): void {\n if (!Email.REGEX.test(value)) {\n throw new Error(`Email <${value}> is not a valid address`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string): Email {\n return new Email(raw);\n }\n\n public static isValid(raw: string): boolean {\n return Email.REGEX.test(raw.trim());\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class Language extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'es',\n 'en',\n 'en-us',\n 'en-gb',\n 'en-au',\n 'en-ca',\n 'en-nz',\n 'en-ie',\n 'en-za',\n 'en-jm',\n 'en-bz',\n 'en-tt',\n 'pt-br',\n 'pt',\n 'es',\n 'es-ar',\n 'es-gt',\n 'es-cr',\n 'es-pa',\n 'es-do',\n 'es-mx',\n 'es-ve',\n 'es-co',\n 'es-pe',\n 'es-ec',\n 'es-cl',\n 'es-uy',\n 'es-py',\n 'es-bo',\n 'es-sv',\n 'es-hn',\n 'es-ni',\n 'es-pr',\n ] as const;\n\n public static readonly DEFAULT: Language = new Language('es');\n public static readonly ENGLISH: Language = new Language('en');\n public static readonly ENGLISH_UNITED_STATES: Language = new Language('en-us');\n public static readonly ENGLISH_UNITED_KINGDOM: Language = new Language('en-gb');\n public static readonly ENGLISH_AUSTRALIA: Language = new Language('en-au');\n public static readonly ENGLISH_CANADA: Language = new Language('en-ca');\n public static readonly ENGLISH_NEW_ZEALAND: Language = new Language('en-nz');\n public static readonly ENGLISH_IRELAND: Language = new Language('en-ie');\n public static readonly ENGLISH_SOUTH_AFRICA: Language = new Language('en-za');\n public static readonly ENGLISH_JAMAICA: Language = new Language('en-jm');\n public static readonly ENGLISH_BELIZE: Language = new Language('en-bz');\n public static readonly ENGLISH_TRINIDAD: Language = new Language('en-tt');\n public static readonly PORTUGUESE_BRAZIL: Language = new Language('pt-br');\n public static readonly PORTUGUESE_PORTUGAL: Language = new Language('pt');\n public static readonly SPANISH: Language = new Language('es');\n public static readonly SPANISH_ARGENTINA: Language = new Language('es-ar');\n public static readonly SPANISH_GUATEMALA: Language = new Language('es-gt');\n public static readonly SPANISH_COSTA_RICA: Language = new Language('es-cr');\n public static readonly SPANISH_PANAMA: Language = new Language('es-pa');\n public static readonly SPANISH_REPUBLICA_DOMINICANA: Language = new Language('es-do');\n public static readonly SPANISH_MEXICO: Language = new Language('es-mx');\n public static readonly SPANISH_VENEZUELA: Language = new Language('es-ve');\n public static readonly SPANISH_COLOMBIA: Language = new Language('es-co');\n public static readonly SPANISH_PERU: Language = new Language('es-pe');\n public static readonly SPANISH_ECUADOR: Language = new Language('es-ec');\n public static readonly SPANISH_CHILE: Language = new Language('es-cl');\n public static readonly SPANISH_URUGUAY: Language = new Language('es-uy');\n public static readonly SPANISH_PARAGUAY: Language = new Language('es-py');\n public static readonly SPANISH_BOLIVIA: Language = new Language('es-bo');\n public static readonly SPANISH_EL_SALVADOR: Language = new Language('es-sv');\n public static readonly SPANISH_HONDURAS: Language = new Language('es-hn');\n public static readonly SPANISH_NICARAGUA: Language = new Language('es-ni');\n public static readonly SPANISH_PUERTO_RICO: Language = new Language('es-pr');\n\n private constructor(code: string) {\n super(code.trim().toLowerCase());\n }\n\n protected validate(value: string): void {\n if (!Language.SUPPORTED.includes(value)) {\n throw new InternalError(`Language <${value}> is not supported`);\n }\n }\n\n public base(): string {\n return this.value.split('-')[0];\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.base(),\n value: this.value\n };\n }\n\n public static create(raw: string): Language {\n const normalized = raw.trim().toLowerCase().replace('_', '-');\n try {\n return new Language(normalized);\n } catch (error: any) {\n return Language.DEFAULT;\n }\n }\n\n}\n","export class StringVars {\n\n public static parse(str: string, ob: { [key: string]: any }): string {\n const regex = /{{(.*?)}}/g;\n return str.replace(regex, (match, variable) => {\n if (ob.hasOwnProperty(variable.trim())) {\n return ob[variable.trim()];\n } else {\n return match;\n }\n });\n }\n\n}","import {Language} from \"@domain/value-objects/Language\";\nimport {FatalError} from \"@domain/errors/FatalError\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {UsageError} from \"@domain/errors/UsageError\";\nimport {StringVars} from \"@utils/StringVars\";\nimport {Logger} from \"@infrastructure/contracts/Logger\";\n\nexport interface ErrorTemplate {\n type: string;\n languages: Record<string, string>;\n}\n\nexport type ErrorManagerHandleResult = {\n status: number | string;\n message: string;\n};\n\nexport class ErrorManager {\n\n private static readonly DEFAULT_MESSAGES: Record<string, string> = {\n 'es': 'Ups, hemos encontrado un error. Nuestro equipo ya está trabajando para solucionarlo',\n 'en': 'Ups, we found an error. Our team is working on it.',\n 'pt': 'Ops, encontramos um bug. Nossa equipe já está trabalhando para resolver isso.',\n };\n\n public static readonly APP_ERRORS = {\n UNDEFINED: 'UNDEFINED_ERROR',\n PROCESS: 'PROCESS_ERROR',\n DATABASE: 'DATABASE_ERROR'\n } as const;\n\n private static readonly TEMPLATES = new Map<string, ErrorTemplate>();\n\n public constructor(private readonly logger: Logger | null = null) {}\n\n private getDefaultMessage(lang: Language): string {\n return (ErrorManager.DEFAULT_MESSAGES[lang.value] || ErrorManager.DEFAULT_MESSAGES[lang.base()] || 'error');\n }\n\n private onFatal(err: FatalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.fatal(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onInternal(err: InternalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.error(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onUsage(err: UsageError, lang: Language): ErrorManagerHandleResult {\n const tmpl = ErrorManager.TEMPLATES.get(err.type);\n if (!tmpl) {\n this.logger?.error('TEMPLATE_NOT_FOUND', `${err.type}`);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n const code = lang.value;\n const base = lang.base();\n const rawMsg =\n tmpl.languages[code] ??\n tmpl.languages[base] ??\n this.getDefaultMessage(lang);\n return {\n status: 400,\n message: StringVars.parse(rawMsg, err.vars),\n };\n }\n\n private onUnknown(err: Error, lang: Language): ErrorManagerHandleResult {\n this.logger?.error('UNKNOWN_ERROR', err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n public handle(err: Error, lang: Language): ErrorManagerHandleResult {\n if (['local','dev'].includes(process.env.ENVIRONMENT ?? '')) {\n console.log(err);\n }\n if (err instanceof FatalError) {\n return this.onFatal(err, lang);\n }\n if (err instanceof InternalError) {\n return this.onInternal(err, lang);\n }\n if (err instanceof UsageError) {\n return this.onUsage(err, lang);\n }\n return this.onUnknown(err, lang);\n }\n\n public static addTemplate(template: ErrorTemplate): void {\n ErrorManager.TEMPLATES.set(template.type, template);\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport { Currency } from '@domain/value-objects/Currency';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {UsageError} from \"@domain/errors/UsageError\";\n\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_AMOUNT',\n languages: {\n 'es': 'El precio <{{amount}}> no es válido',\n 'en': 'Price amount <{{amount}}> is not a valid number',\n }\n});\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_RANGE',\n languages: {\n 'es': 'El precio <{{amount}}> debe ser ≥ {{min}} y ≤ {{max}}',\n 'en': 'Price amount <{{amount}}> must be ≥ {{min}} and ≤ {{max}}',\n }\n});\n\nexport interface PriceProps {\n amount: number;\n currency: Currency;\n}\n\nexport class Price extends ValueObject<PriceProps> {\n\n public static readonly MIN_AMOUNT: number = -1000000;\n public static readonly MAX_AMOUNT: number = 1000000000;\n\n\n private constructor(amount: number, currency: Currency) {\n super({ amount, currency });\n }\n\n protected validate(props: { amount: number; currency: Currency }): void {\n const { amount, currency } = props;\n\n if (typeof amount !== 'number' || Number.isNaN(amount) || !Number.isFinite(amount)) {\n throw new UsageError('INVALID_PRICE_AMOUNT', {amount});\n }\n if (amount < Price.MIN_AMOUNT || amount > Price.MAX_AMOUNT) {\n throw new UsageError('INVALID_PRICE_RANGE', {amount, min: Price.MIN_AMOUNT, max: Price.MAX_AMOUNT});\n }\n }\n\n public get amount(): number {\n return this._value.amount;\n }\n\n public get currency(): Currency {\n return this._value.currency;\n }\n\n public equals(other?: Price | null): boolean {\n if (!other) return false;\n return this._value.amount === other.amount && this.currency.equals(other.currency);\n }\n\n private assertSameCurrency(other: Price): void {\n if (!this.currency.equals(other.currency)) {\n throw new Error('Cannot operate on Price objects with different currencies');\n }\n }\n\n public add(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount + other.amount, this.currency);\n }\n\n public subtract(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount - other.amount, this.currency);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n amount: this.amount,\n currency: this.currency.value,\n }\n }\n\n public static create(amount: number, currency: Currency | string | number): Price {\n const cur = currency instanceof Currency ? currency : Currency.create(currency);\n return new Price(amount, cur);\n }\n public static createFromPrimitives(data: Record<string, unknown>): Price {\n return new Price(Number(data.amount), Currency.create(String(data.currency)));\n }\n\n}\n","import { ValueObject } from \"@domain/contracts/ValueObject\";\nimport { InternalError } from \"@domain/errors/InternalError\";\nimport * as crypto from \"node:crypto\";\n\nexport type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;\n\nexport interface UUIDValidationOptions {\n /** Versiones permitidas (por defecto: 1–8) */\n allowedVersions?: UUIDVersion[];\n /** Permitir el NIL UUID \"00000000-0000-0000-0000-000000000000\" (por defecto: false) */\n allowNil?: boolean;\n}\n\nexport class UUID extends ValueObject<string> {\n public static readonly NIL = \"00000000-0000-0000-0000-000000000000\";\n\n private constructor(value: string) {\n super(value);\n }\n\n protected validate(uuid: string) {\n if (!UUID.isValid(uuid)) {\n throw new InternalError(`Invalid uuid <${uuid}>`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static version(uuid: string): UUIDVersion | undefined {\n const m = /^[0-9a-f]{8}-[0-9a-f]{4}-([1-8])[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.exec(uuid);\n return m ? (Number(m[1]) as UUIDVersion) : undefined;\n }\n\n public static isNil(uuid: string): boolean {\n return /^0{8}-0{4}-0{4}-0{4}-0{12}$/i.test(uuid);\n }\n\n public static isRFCStyle(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\n }\n\n public static isValid(uuid: string, opts: UUIDValidationOptions = {}): boolean {\n const allowed = opts.allowedVersions ?? [1, 2, 3, 4, 5, 6, 7, 8];\n const allowNil = opts.allowNil ?? false;\n\n if (allowNil && UUID.isNil(uuid)) return true;\n if (!UUID.isRFCStyle(uuid)) return false;\n\n const v = UUID.version(uuid);\n return !!v && allowed.includes(v);\n }\n}\n","import {DatabaseConnection} from '@infrastructure/contracts/Database';\nimport {UnitOfWork} from \"@application/contracts/UnitOfWork\";\n\nexport class BasicUnitOfWork implements UnitOfWork {\n\n public readonly connection: DatabaseConnection;\n\n public constructor(conn: DatabaseConnection) {\n this.connection = conn;\n }\n\n public async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.connection.begin();\n try {\n const result = await fn();\n await this.connection.commit();\n return result;\n } catch (err: any) {\n await this.connection.rollback();\n throw err;\n } finally {\n await this.connection.close();\n }\n }\n}\n","import {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\nimport {BasicUnitOfWork} from \"@application/unit-of-work/BasicUnitOfWork\";\n\nexport class BasicUnitOfWorkFactory {\n\n private readonly connector: DatabaseConnector;\n\n public constructor(connector: DatabaseConnector) {\n this.connector = connector;\n }\n\n public async create(): Promise<BasicUnitOfWork> {\n const conn: DatabaseConnection = await this.connector.getConnection();\n return new BasicUnitOfWork(conn);\n }\n\n}","import {createPool, FieldPacket, Pool, PoolConnection, RowDataPacket} from \"mysql2/promise\";\nimport {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\n\nexport class MysqlConnector implements DatabaseConnector<MysqlConnection> {\n public static readonly DEFAULT_POOL_SIZE: number = 10;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool =\n pool ??\n createPool({\n host: process.env.DB_HOST,\n port: Number(process.env.DB_PORT ?? 3306),\n user: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n dateStrings: true,\n connectionLimit: Number(process.env.DB_POOL_SIZE) || MysqlConnector.DEFAULT_POOL_SIZE,\n decimalNumbers: true,\n });\n }\n\n private async wrap(conn: PoolConnection): Promise<MysqlConnection> {\n return new MysqlConnection(conn);\n }\n\n public async getConnection(): Promise<MysqlConnection> {\n const conn: PoolConnection = await this._pool.getConnection();\n return this.wrap(conn);\n }\n\n public async closePool(): Promise<void> {\n await this._pool.end();\n }\n\n public static async ping(): Promise<boolean> {\n const connector: MysqlConnector = new MysqlConnector();\n try {\n const conn = await connector._pool.getConnection();\n await conn.ping();\n conn.release();\n return true;\n } catch {\n return false;\n } finally {\n await connector.closePool();\n }\n }\n}\n\nexport class MysqlConnection implements DatabaseConnection<string, any[], RowDataPacket> {\n\n private readonly _conn: PoolConnection;\n\n public constructor(conn: PoolConnection) {\n this._conn = conn;\n }\n\n public async query<R = RowDataPacket>(statement: string, params: any[] = []): Promise<R[]> {\n const [rows] = await this._conn.query<R[] & RowDataPacket[] & FieldPacket[]>(statement, params);\n return rows as R[];\n }\n\n public async begin(): Promise<void> {\n await this._conn.beginTransaction();\n }\n\n public async commit(): Promise<void> {\n await this._conn.commit();\n }\n\n public async rollback(): Promise<void> {\n await this._conn.rollback();\n }\n\n public async transaction<T>(fn: (conn: this) => Promise<T>): Promise<T> {\n await this.begin();\n try {\n const result: T = await fn(this);\n await this.commit();\n return result;\n } catch (err) {\n await this.rollback();\n throw err;\n }\n }\n\n public async close(): Promise<void> {\n this._conn.release();\n }\n\n}\n","import {HttpController, HttpRequest, HttpResponse} from \"@infrastructure/contracts/Http\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport class HttpHealthCheckController implements HttpController {\n async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 200,\n body: {\n date: DateTime.create().value,\n code: 200,\n status: 'OK'\n }\n }\n }\n}\n\nexport class HttpNotFoundController implements HttpController {\n public async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 404,\n body: {\n status: 'NOT_FOUND',\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest, HttpResponse} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\n\n\nconst BOOL_TRUE = new Set(['1','true','yes','y','on']);\nconst BOOL_FALSE = new Set(['0','false','no','n','off']);\nconst NUMERIC_KEY_RE = /^(?:page|qty|limit|offset|total|amount|price|count|rounding|min[A-Z_].*|max[A-Z_].*)$/i;\nconst DATE_KEY_RE = /(At|Date|_at|_date)$/i;\n\nfunction toUtcDateTimeString(raw: string): string | undefined {\n const s = raw.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return `${s} 00:00:00`;\n if (/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s)) return s; // asumimos ya UTC\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return undefined;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;\n}\nfunction coerceScalar(key: string, v: unknown): unknown {\n if (v == null) return undefined;\n if (typeof v !== 'string') return v;\n\n const s = v.trim();\n if (s === '') return undefined;\n\n // null literal\n if (s.toLowerCase() === 'null') return null;\n\n // boolean\n const low = s.toLowerCase();\n if (BOOL_TRUE.has(low)) return true;\n if (BOOL_FALSE.has(low)) return false;\n\n // number (solo para claves \"numéricas\" típicas)\n if (NUMERIC_KEY_RE.test(key) && /^-?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (Number.isFinite(n)) return n;\n }\n\n // fecha (claves que terminan con At/Date/_at/_date)\n if (DATE_KEY_RE.test(key)) {\n return toUtcDateTimeString(s) ?? s; // si no parsea, dejá string tal cual\n }\n\n return s;\n}\nfunction normalizeQuery(q: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(q)) {\n // arrays repetidos (?status=A&status=B) o listas con coma (?status=A,B)\n const values = Array.isArray(raw) ? raw : (typeof raw === 'string' && raw.includes(','))\n ? raw.split(',').map(s => s.trim()).filter(Boolean)\n : [raw];\n\n const coerced = values\n .map(v => coerceScalar(key, v))\n .filter(v => v !== undefined);\n\n // si quedó más de uno ⇒ array, si quedó uno ⇒ escalar, si vacío ⇒ omitido\n if (coerced.length === 1) out[key] = coerced[0];\n else if (coerced.length > 1) out[key] = coerced;\n }\n return out;\n}\n\nfunction isReadableStream(x: any): x is NodeJS.ReadableStream {\n return x && typeof x.pipe === 'function';\n}\nfunction hasHeader(headers: HttpResponse['headers'] | undefined, name: string): boolean {\n if (!headers) return false;\n const lname = name.toLowerCase();\n return Object.keys(headers).some(h => h.toLowerCase() === lname);\n}\n\nexport function adaptExpressRoute(Controller: new () => HttpController): RequestHandler {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rawLangHeader = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(rawLangHeader) ? rawLangHeader[0] : rawLangHeader || '';\n const lang = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: normalizeQuery(req.query as Record<string, unknown>),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const { statusCode, body, headers }: HttpResponse = await controller.handle(httpRequest);\n\n if (headers) res.set(headers as any);\n\n // 1) Streams\n if (isReadableStream(body)) {\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n res.status(statusCode);\n body.on('error', next);\n body.pipe(res);\n return;\n }\n\n // 2) Binarios (Buffer / ArrayBuffer / TypedArray)\n const isArrayBuffer = typeof body === 'object' && body instanceof ArrayBuffer;\n const isArrayBufferView = typeof body === 'object' && body != null && ArrayBuffer.isView(body as any);\n\n if (Buffer.isBuffer(body) || isArrayBuffer || isArrayBufferView) {\n let buf: Buffer;\n if (Buffer.isBuffer(body)) {\n buf = body as Buffer;\n } else if (isArrayBuffer) {\n buf = Buffer.from(body as ArrayBuffer);\n } else {\n const view = body as ArrayBufferView;\n buf = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n if (!res.getHeader('Content-Length')) res.set('Content-Length', String(buf.length));\n\n res.status(statusCode);\n res.end(buf);\n return;\n }\n\n // 3) String o Content-Type custom → send()\n const hasCT = hasHeader(headers, 'Content-Type');\n if (typeof body === 'string' || hasCT) {\n res.status(statusCode).send(body as any);\n return;\n }\n // 4) Default: JSON\n res.status(statusCode).json(body ?? {});\n } catch (err) {\n next(err);\n }\n };\n}\n\n\nexport function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequestHandler {\n return (err, req: Request, res: Response, next: NextFunction) => {\n const raw = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(raw) ? raw[0] : raw ?? '';\n const langCode = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const result = errorManager.handle(err, Language.create(langCode));\n const statusCode = typeof result.status === 'number' ? result.status : 500;\n res.status(statusCode).json({ message: result.message });\n };\n}","import {Currency} from \"@domain/value-objects/Currency\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {Price} from \"@domain/value-objects/Price\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {BaseObject} from \"@domain/contracts/BaseObject\";\n\nexport interface ExchangeRatesProps {\n base: Currency;\n rates: Record<string, number>;\n date: DateTime;\n}\nexport class ExchangeRates extends BaseObject<ExchangeRatesProps>{\n\n public constructor(props: ExchangeRatesProps) {\n super(props);\n }\n\n private getRate(currency: Currency): number | null {\n if (Object.keys(this.props.rates).includes(currency.value)) {\n return this.props.rates[currency.value];\n }\n return null;\n }\n\n public get base(): Currency {\n return this.props.base;\n }\n public get rates(): Record<string, number> {\n return this.props.rates;\n }\n public get date(): DateTime {\n return this.props.date;\n }\n\n public toProps(): ExchangeRatesProps {\n return this.props;\n }\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.props.base.value,\n rates: this.props.rates,\n date: this.props.date.value,\n };\n }\n\n public exchangeToBase(price: Price): Price {\n const rate = this.getRate(price.currency);\n if (!rate) {\n throw new InternalError('INVALID_EXCHANGE_RATE_CURRENCY', `Avaiable rates: ${this.props.rates} - Base Currency:${this.props.base.value} - Price Currency: ${price.currency.value}`)\n }\n if (price.currency.value === this.props.base.value) {\n return price;\n }\n return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.props.base.value);\n }\n\n public static create(props: ExchangeRatesProps): ExchangeRates {\n return new ExchangeRates(props);\n }\n public static createFromPrimitives(data: any): ExchangeRates {\n return ExchangeRates.create({\n base: Currency.create(data.base),\n rates: data.rates ?? [],\n date: DateTime.create(data.date ?? ''),\n });\n }\n\n}"],"mappings":"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","names":["LuxonDateTime"]}
package/dist/index.d.mts CHANGED
@@ -12,12 +12,23 @@ declare abstract class ValueObject<TPrimitive = unknown> {
12
12
  equals(vo?: ValueObject<TPrimitive> | null): boolean;
13
13
  }
14
14
 
15
+ type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
16
+ interface UUIDValidationOptions {
17
+ /** Versiones permitidas (por defecto: 1–8) */
18
+ allowedVersions?: UUIDVersion[];
19
+ /** Permitir el NIL UUID "00000000-0000-0000-0000-000000000000" (por defecto: false) */
20
+ allowNil?: boolean;
21
+ }
15
22
  declare class UUID extends ValueObject<string> {
23
+ static readonly NIL = "00000000-0000-0000-0000-000000000000";
16
24
  private constructor();
17
25
  protected validate(uuid: string): void;
18
26
  toPrimitives(): Record<string, unknown>;
19
27
  static create(uuid?: string): UUID;
20
- static isValid(uuid: string): boolean;
28
+ static version(uuid: string): UUIDVersion | undefined;
29
+ static isNil(uuid: string): boolean;
30
+ static isRFCStyle(uuid: string): boolean;
31
+ static isValid(uuid: string, opts?: UUIDValidationOptions): boolean;
21
32
  }
22
33
 
23
34
  declare class DateTime extends ValueObject<string> {
package/dist/index.d.ts CHANGED
@@ -12,12 +12,23 @@ declare abstract class ValueObject<TPrimitive = unknown> {
12
12
  equals(vo?: ValueObject<TPrimitive> | null): boolean;
13
13
  }
14
14
 
15
+ type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
16
+ interface UUIDValidationOptions {
17
+ /** Versiones permitidas (por defecto: 1–8) */
18
+ allowedVersions?: UUIDVersion[];
19
+ /** Permitir el NIL UUID "00000000-0000-0000-0000-000000000000" (por defecto: false) */
20
+ allowNil?: boolean;
21
+ }
15
22
  declare class UUID extends ValueObject<string> {
23
+ static readonly NIL = "00000000-0000-0000-0000-000000000000";
16
24
  private constructor();
17
25
  protected validate(uuid: string): void;
18
26
  toPrimitives(): Record<string, unknown>;
19
27
  static create(uuid?: string): UUID;
20
- static isValid(uuid: string): boolean;
28
+ static version(uuid: string): UUIDVersion | undefined;
29
+ static isNil(uuid: string): boolean;
30
+ static isRFCStyle(uuid: string): boolean;
31
+ static isValid(uuid: string, opts?: UUIDValidationOptions): boolean;
21
32
  }
22
33
 
23
34
  declare class DateTime extends ValueObject<string> {
package/dist/index.js CHANGED
@@ -548,7 +548,8 @@ _Price.MAX_AMOUNT = 1e9;
548
548
  var Price = _Price;
549
549
 
550
550
  // src/domain/value-objects/UUID.ts
551
- var UUID = class _UUID extends ValueObject {
551
+ import * as crypto from "crypto";
552
+ var _UUID = class _UUID extends ValueObject {
552
553
  constructor(value) {
553
554
  super(value);
554
555
  }
@@ -558,17 +559,35 @@ var UUID = class _UUID extends ValueObject {
558
559
  }
559
560
  }
560
561
  toPrimitives() {
561
- return {
562
- value: this.value
563
- };
562
+ return { value: this.value };
564
563
  }
565
564
  static create(uuid) {
566
565
  return new _UUID(uuid != null ? uuid : crypto.randomUUID());
567
566
  }
568
- static isValid(uuid) {
569
- return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);
567
+ static version(uuid) {
568
+ const m = /^[0-9a-f]{8}-[0-9a-f]{4}-([1-8])[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.exec(uuid);
569
+ return m ? Number(m[1]) : void 0;
570
+ }
571
+ static isNil(uuid) {
572
+ return /^0{8}-0{4}-0{4}-0{4}-0{12}$/i.test(uuid);
573
+ }
574
+ static isRFCStyle(uuid) {
575
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);
576
+ }
577
+ static isValid(uuid, opts = {}) {
578
+ var _a, _b;
579
+ const allowed = (_a = opts.allowedVersions) != null ? _a : [1, 2, 3, 4, 5, 6, 7, 8];
580
+ const allowNil = (_b = opts.allowNil) != null ? _b : false;
581
+ if (allowNil && _UUID.isNil(uuid))
582
+ return true;
583
+ if (!_UUID.isRFCStyle(uuid))
584
+ return false;
585
+ const v = _UUID.version(uuid);
586
+ return !!v && allowed.includes(v);
570
587
  }
571
588
  };
589
+ _UUID.NIL = "00000000-0000-0000-0000-000000000000";
590
+ var UUID = _UUID;
572
591
 
573
592
  // src/application/unit-of-work/BasicUnitOfWork.ts
574
593
  var BasicUnitOfWork = class {
@@ -756,14 +775,15 @@ function normalizeQuery(q) {
756
775
  }
757
776
  return out;
758
777
  }
759
- function hasContentType(headers) {
760
- if (!headers)
761
- return false;
762
- return Object.keys(headers).some((h) => h.toLowerCase() === "content-type");
763
- }
764
778
  function isReadableStream(x) {
765
779
  return x && typeof x.pipe === "function";
766
780
  }
781
+ function hasHeader(headers, name) {
782
+ if (!headers)
783
+ return false;
784
+ const lname = name.toLowerCase();
785
+ return Object.keys(headers).some((h) => h.toLowerCase() === lname);
786
+ }
767
787
  function adaptExpressRoute(Controller) {
768
788
  return async (req, res, next) => {
769
789
  var _a, _b;
@@ -783,17 +803,39 @@ function adaptExpressRoute(Controller) {
783
803
  if (headers)
784
804
  res.set(headers);
785
805
  if (isReadableStream(body)) {
806
+ if (!hasHeader(headers, "Content-Type"))
807
+ res.set("Content-Type", "application/octet-stream");
786
808
  res.status(statusCode);
787
809
  body.on("error", next);
788
810
  body.pipe(res);
789
811
  return;
790
812
  }
791
- const hasCT = hasContentType(headers);
792
- if (Buffer.isBuffer(body) || typeof body === "string" || hasCT) {
813
+ const isArrayBuffer = typeof body === "object" && body instanceof ArrayBuffer;
814
+ const isArrayBufferView = typeof body === "object" && body != null && ArrayBuffer.isView(body);
815
+ if (Buffer.isBuffer(body) || isArrayBuffer || isArrayBufferView) {
816
+ let buf;
817
+ if (Buffer.isBuffer(body)) {
818
+ buf = body;
819
+ } else if (isArrayBuffer) {
820
+ buf = Buffer.from(body);
821
+ } else {
822
+ const view = body;
823
+ buf = Buffer.from(view.buffer, view.byteOffset, view.byteLength);
824
+ }
825
+ if (!hasHeader(headers, "Content-Type"))
826
+ res.set("Content-Type", "application/octet-stream");
827
+ if (!res.getHeader("Content-Length"))
828
+ res.set("Content-Length", String(buf.length));
829
+ res.status(statusCode);
830
+ res.end(buf);
831
+ return;
832
+ }
833
+ const hasCT = hasHeader(headers, "Content-Type");
834
+ if (typeof body === "string" || hasCT) {
793
835
  res.status(statusCode).send(body);
794
- } else {
795
- res.status(statusCode).json(body != null ? body : {});
836
+ return;
796
837
  }
838
+ res.status(statusCode).json(body != null ? body : {});
797
839
  } catch (err) {
798
840
  next(err);
799
841
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/domain/value-objects/DateTime.ts","../src/domain/contracts/ValueObject.ts","../src/domain/contracts/DomainEntity.ts","../src/domain/contracts/DomainError.ts","../src/domain/contracts/DomainEvent.ts","../src/domain/contracts/BaseObject.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/InternalError.ts","../src/domain/errors/UsageError.ts","../src/domain/value-objects/Currency.ts","../src/domain/value-objects/Email.ts","../src/domain/value-objects/Language.ts","../src/utils/StringVars.ts","../src/infrastructure/errors/ErrorManager.ts","../src/domain/value-objects/Price.ts","../src/domain/value-objects/UUID.ts","../src/application/unit-of-work/BasicUnitOfWork.ts","../src/application/unit-of-work/BasicUnitOfWorkFactory.ts","../src/infrastructure/mysql/Mysql.ts","../src/infrastructure/http/DefaultController.ts","../src/infrastructure/express/ExpressAdapters.ts","../src/utils/ExchangeRates.ts"],"sourcesContent":["import {DateTime as LuxonDateTime} from 'luxon';\nimport {ValueObject} from \"@domain/contracts/ValueObject\";\n\nexport class DateTime extends ValueObject<string> {\n\n public static readonly DEFAULT_FORMAT: string = 'yyyy-MM-dd HH:mm:ss';\n\n private readonly _dt: LuxonDateTime;\n\n private static fromLuxon(dt: LuxonDateTime): DateTime {\n return new DateTime(DateTime.toUtcFormat(dt));\n }\n\n private static toUtcFormat(dt: LuxonDateTime): string {\n return dt.setZone('utc').toFormat(DateTime.DEFAULT_FORMAT);\n }\n\n private constructor(value: string) {\n super(value);\n this._dt = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n }\n\n protected validate(value: string): void {\n const q = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n if (!q.isValid) {\n throw new Error(`Invalid DateTime: ${q.invalidExplanation}`);\n }\n }\n\n public plusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({years}));\n }\n\n public plusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({months}));\n }\n\n public plusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({days}));\n }\n\n public plusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({hours}));\n }\n\n public plusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({minutes}));\n }\n\n public plusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({seconds}));\n }\n\n public minusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({years}));\n }\n\n public minusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({months}));\n }\n\n public minusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({days}));\n }\n\n public minusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({hours}));\n }\n\n public minusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({minutes}));\n }\n\n public minusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({seconds}));\n }\n\n public get year(): number {\n return this._dt.year;\n }\n\n public get month(): number {\n return this._dt.month;\n }\n\n public get day(): number {\n return this._dt.day;\n }\n\n public get hour(): number {\n return this._dt.hour;\n }\n\n public get minute(): number {\n return this._dt.minute;\n }\n\n public get second(): number {\n return this._dt.second;\n }\n\n public getMonthName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('LLLL');\n }\n\n public getWeekdayName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('cccc');\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(input?: string | number): DateTime {\n if (input === undefined) {\n return new DateTime(DateTime.toUtcFormat(LuxonDateTime.now()));\n }\n if (typeof input === 'number') {\n return new DateTime(\n DateTime.toUtcFormat(LuxonDateTime.fromMillis(input, { zone: 'utc' })),\n );\n }\n const iso = LuxonDateTime.fromISO(input, { zone: 'utc' });\n if (iso.isValid) {\n return new DateTime(DateTime.toUtcFormat(iso));\n }\n return new DateTime(input);\n }\n\n public static now(): DateTime {\n return DateTime.create();\n }\n}\n","\nexport abstract class ValueObject<TPrimitive = unknown> {\n\n protected readonly _value: TPrimitive;\n\n protected constructor(value: TPrimitive) {\n this.validate(value);\n this._value = Object.freeze(value);\n }\n\n protected abstract validate(value: TPrimitive): void;\n public abstract toPrimitives(): Record<string, unknown>;\n\n public toProps(): TPrimitive {\n return this._value\n }\n public get value(): TPrimitive {\n return this._value;\n }\n public toString(): string {\n return String(this._value);\n }\n\n public equals(vo?: ValueObject<TPrimitive> | null): boolean {\n if (vo === null || vo === undefined) return false;\n if (vo.constructor !== this.constructor) return false;\n return vo.value === this._value;\n }\n}","import {UUID} from \"@domain/value-objects/UUID\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport interface BaseEntity {\n uuid: UUID;\n createdAt: DateTime;\n updatedAt: DateTime;\n deletedAt: DateTime | undefined;\n}\n\nexport abstract class DomainEntity<T extends BaseEntity> {\n\n protected readonly props: T;\n\n protected constructor(props: T) {\n this.props = props;\n }\n\n protected touch(): void {\n this.props.updatedAt = DateTime.now();\n }\n\n public get uuid(): UUID {\n return this.props.uuid;\n }\n public get createdAt(): DateTime {\n return this.props.createdAt;\n }\n public get updatedAt(): DateTime {\n return this.props.updatedAt;\n }\n public get deletedAt(): DateTime | undefined {\n return this.props.deletedAt;\n }\n public get isDeleted(): boolean {\n return Boolean(this.props.deletedAt);\n }\n\n public abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n\n}\n","export abstract class DomainError extends Error {\n\n public readonly type: string;\n\n protected constructor(type: string, message = '') {\n super(message);\n this.type = type;\n }\n}","import {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport abstract class DomainEvent<T = unknown> {\n\n readonly type: string;\n private readonly _occurredAt: DateTime;\n private readonly _payload: T;\n\n protected constructor(payload: T) {\n this._payload = payload;\n this._occurredAt = DateTime.create();\n }\n\n get payload(): T {\n return this._payload;\n }\n\n get occurredAt(): DateTime {\n return this._occurredAt;\n }\n\n}","\nexport abstract class BaseObject<T = unknown> {\n protected readonly props: T;\n protected constructor(props: T) {\n this.props = props;\n }\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class FatalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class InternalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class UsageError extends DomainError {\n\n public readonly vars: Record<string, any>;\n\n public constructor(type: string, vars: Record<string, any> = {}) {\n super(type);\n this.vars = vars;\n }\n\n}","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Currency extends ValueObject<string> {\n\n public static readonly ALPHA_REGEX = /^[A-Z]{3}$/u;\n public static readonly NUM_REGEX = /^\\d{3}$/u;\n\n private static readonly ALPHA_TO_NUM: Record<string, number> = {\n USD: 840,\n EUR: 978,\n UYU: 858,\n ARS: 32,\n BRL: 986,\n };\n\n private static readonly NUM_TO_ALPHA: Record<number, string> =\n Object.entries(Currency.ALPHA_TO_NUM).reduce(\n (acc, [alpha, num]) => {\n acc[num as number] = alpha;\n return acc;\n },\n {} as Record<number, string>,\n );\n\n public static readonly USD: Currency = new Currency('USD');\n public static readonly EUR: Currency = new Currency('EUR');\n public static readonly UYU: Currency = new Currency('UYU');\n public static readonly ARS: Currency = new Currency('ARS');\n public static readonly BRL: Currency = new Currency('BRL');\n\n public readonly numeric: number;\n\n private constructor(alpha: string) {\n super(alpha.toUpperCase().trim());\n this.numeric = Currency.ALPHA_TO_NUM[this.value];\n }\n\n protected validate(alpha: string): void {\n const code = alpha.toUpperCase().trim();\n if (!Currency.ALPHA_REGEX.test(code)) {\n throw new Error(`Currency code <${alpha}> is not a valid ISO‑4217 alpha value`);\n }\n if (!(code in Currency.ALPHA_TO_NUM)) {\n throw new Error(`Currency <${code}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string | number): Currency {\n if (typeof raw === 'number' || Currency.NUM_REGEX.test(raw)) {\n const num = Number(raw);\n const alpha = Currency.NUM_TO_ALPHA[num];\n if (!alpha) {\n throw new Error(`Numeric currency <${raw}> is not supported`);\n }\n return new Currency(alpha);\n }\n return new Currency(String(raw));\n }\n\n public static isValid(raw: string | number): boolean {\n try {\n Currency.create(raw);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Email extends ValueObject<string> {\n\n public static readonly REGEX: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/u;\n\n private constructor(email: string) {\n super(email.trim());\n }\n\n protected validate(value: string): void {\n if (!Email.REGEX.test(value)) {\n throw new Error(`Email <${value}> is not a valid address`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string): Email {\n return new Email(raw);\n }\n\n public static isValid(raw: string): boolean {\n return Email.REGEX.test(raw.trim());\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class Language extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'es',\n 'en',\n 'en-us',\n 'en-gb',\n 'en-au',\n 'en-ca',\n 'en-nz',\n 'en-ie',\n 'en-za',\n 'en-jm',\n 'en-bz',\n 'en-tt',\n 'pt-br',\n 'pt',\n 'es',\n 'es-ar',\n 'es-gt',\n 'es-cr',\n 'es-pa',\n 'es-do',\n 'es-mx',\n 'es-ve',\n 'es-co',\n 'es-pe',\n 'es-ec',\n 'es-cl',\n 'es-uy',\n 'es-py',\n 'es-bo',\n 'es-sv',\n 'es-hn',\n 'es-ni',\n 'es-pr',\n ] as const;\n\n public static readonly DEFAULT: Language = new Language('es');\n public static readonly ENGLISH: Language = new Language('en');\n public static readonly ENGLISH_UNITED_STATES: Language = new Language('en-us');\n public static readonly ENGLISH_UNITED_KINGDOM: Language = new Language('en-gb');\n public static readonly ENGLISH_AUSTRALIA: Language = new Language('en-au');\n public static readonly ENGLISH_CANADA: Language = new Language('en-ca');\n public static readonly ENGLISH_NEW_ZEALAND: Language = new Language('en-nz');\n public static readonly ENGLISH_IRELAND: Language = new Language('en-ie');\n public static readonly ENGLISH_SOUTH_AFRICA: Language = new Language('en-za');\n public static readonly ENGLISH_JAMAICA: Language = new Language('en-jm');\n public static readonly ENGLISH_BELIZE: Language = new Language('en-bz');\n public static readonly ENGLISH_TRINIDAD: Language = new Language('en-tt');\n public static readonly PORTUGUESE_BRAZIL: Language = new Language('pt-br');\n public static readonly PORTUGUESE_PORTUGAL: Language = new Language('pt');\n public static readonly SPANISH: Language = new Language('es');\n public static readonly SPANISH_ARGENTINA: Language = new Language('es-ar');\n public static readonly SPANISH_GUATEMALA: Language = new Language('es-gt');\n public static readonly SPANISH_COSTA_RICA: Language = new Language('es-cr');\n public static readonly SPANISH_PANAMA: Language = new Language('es-pa');\n public static readonly SPANISH_REPUBLICA_DOMINICANA: Language = new Language('es-do');\n public static readonly SPANISH_MEXICO: Language = new Language('es-mx');\n public static readonly SPANISH_VENEZUELA: Language = new Language('es-ve');\n public static readonly SPANISH_COLOMBIA: Language = new Language('es-co');\n public static readonly SPANISH_PERU: Language = new Language('es-pe');\n public static readonly SPANISH_ECUADOR: Language = new Language('es-ec');\n public static readonly SPANISH_CHILE: Language = new Language('es-cl');\n public static readonly SPANISH_URUGUAY: Language = new Language('es-uy');\n public static readonly SPANISH_PARAGUAY: Language = new Language('es-py');\n public static readonly SPANISH_BOLIVIA: Language = new Language('es-bo');\n public static readonly SPANISH_EL_SALVADOR: Language = new Language('es-sv');\n public static readonly SPANISH_HONDURAS: Language = new Language('es-hn');\n public static readonly SPANISH_NICARAGUA: Language = new Language('es-ni');\n public static readonly SPANISH_PUERTO_RICO: Language = new Language('es-pr');\n\n private constructor(code: string) {\n super(code.trim().toLowerCase());\n }\n\n protected validate(value: string): void {\n if (!Language.SUPPORTED.includes(value)) {\n throw new InternalError(`Language <${value}> is not supported`);\n }\n }\n\n public base(): string {\n return this.value.split('-')[0];\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.base(),\n value: this.value\n };\n }\n\n public static create(raw: string): Language {\n const normalized = raw.trim().toLowerCase().replace('_', '-');\n try {\n return new Language(normalized);\n } catch (error: any) {\n return Language.DEFAULT;\n }\n }\n\n}\n","export class StringVars {\n\n public static parse(str: string, ob: { [key: string]: any }): string {\n const regex = /{{(.*?)}}/g;\n return str.replace(regex, (match, variable) => {\n if (ob.hasOwnProperty(variable.trim())) {\n return ob[variable.trim()];\n } else {\n return match;\n }\n });\n }\n\n}","import {Language} from \"@domain/value-objects/Language\";\nimport {FatalError} from \"@domain/errors/FatalError\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {UsageError} from \"@domain/errors/UsageError\";\nimport {StringVars} from \"@utils/StringVars\";\nimport {Logger} from \"@infrastructure/contracts/Logger\";\n\nexport interface ErrorTemplate {\n type: string;\n languages: Record<string, string>;\n}\n\nexport type ErrorManagerHandleResult = {\n status: number | string;\n message: string;\n};\n\nexport class ErrorManager {\n\n private static readonly DEFAULT_MESSAGES: Record<string, string> = {\n 'es': 'Ups, hemos encontrado un error. Nuestro equipo ya está trabajando para solucionarlo',\n 'en': 'Ups, we found an error. Our team is working on it.',\n 'pt': 'Ops, encontramos um bug. Nossa equipe já está trabalhando para resolver isso.',\n };\n\n public static readonly APP_ERRORS = {\n UNDEFINED: 'UNDEFINED_ERROR',\n PROCESS: 'PROCESS_ERROR',\n DATABASE: 'DATABASE_ERROR'\n } as const;\n\n private static readonly TEMPLATES = new Map<string, ErrorTemplate>();\n\n public constructor(private readonly logger: Logger | null = null) {}\n\n private getDefaultMessage(lang: Language): string {\n return (ErrorManager.DEFAULT_MESSAGES[lang.value] || ErrorManager.DEFAULT_MESSAGES[lang.base()] || 'error');\n }\n\n private onFatal(err: FatalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.fatal(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onInternal(err: InternalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.error(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onUsage(err: UsageError, lang: Language): ErrorManagerHandleResult {\n const tmpl = ErrorManager.TEMPLATES.get(err.type);\n if (!tmpl) {\n this.logger?.error('TEMPLATE_NOT_FOUND', `${err.type}`);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n const code = lang.value;\n const base = lang.base();\n const rawMsg =\n tmpl.languages[code] ??\n tmpl.languages[base] ??\n this.getDefaultMessage(lang);\n return {\n status: 400,\n message: StringVars.parse(rawMsg, err.vars),\n };\n }\n\n private onUnknown(err: Error, lang: Language): ErrorManagerHandleResult {\n this.logger?.error('UNKNOWN_ERROR', err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n public handle(err: Error, lang: Language): ErrorManagerHandleResult {\n if (['local','dev'].includes(process.env.ENVIRONMENT ?? '')) {\n console.log(err);\n }\n if (err instanceof FatalError) {\n return this.onFatal(err, lang);\n }\n if (err instanceof InternalError) {\n return this.onInternal(err, lang);\n }\n if (err instanceof UsageError) {\n return this.onUsage(err, lang);\n }\n return this.onUnknown(err, lang);\n }\n\n public static addTemplate(template: ErrorTemplate): void {\n ErrorManager.TEMPLATES.set(template.type, template);\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport { Currency } from '@domain/value-objects/Currency';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {UsageError} from \"@domain/errors/UsageError\";\n\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_AMOUNT',\n languages: {\n 'es': 'El precio <{{amount}}> no es válido',\n 'en': 'Price amount <{{amount}}> is not a valid number',\n }\n});\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_RANGE',\n languages: {\n 'es': 'El precio <{{amount}}> debe ser ≥ {{min}} y ≤ {{max}}',\n 'en': 'Price amount <{{amount}}> must be ≥ {{min}} and ≤ {{max}}',\n }\n});\n\nexport interface PriceProps {\n amount: number;\n currency: Currency;\n}\n\nexport class Price extends ValueObject<PriceProps> {\n\n public static readonly MIN_AMOUNT: number = -1000000;\n public static readonly MAX_AMOUNT: number = 1000000000;\n\n\n private constructor(amount: number, currency: Currency) {\n super({ amount, currency });\n }\n\n protected validate(props: { amount: number; currency: Currency }): void {\n const { amount, currency } = props;\n\n if (typeof amount !== 'number' || Number.isNaN(amount) || !Number.isFinite(amount)) {\n throw new UsageError('INVALID_PRICE_AMOUNT', {amount});\n }\n if (amount < Price.MIN_AMOUNT || amount > Price.MAX_AMOUNT) {\n throw new UsageError('INVALID_PRICE_RANGE', {amount, min: Price.MIN_AMOUNT, max: Price.MAX_AMOUNT});\n }\n }\n\n public get amount(): number {\n return this._value.amount;\n }\n\n public get currency(): Currency {\n return this._value.currency;\n }\n\n public equals(other?: Price | null): boolean {\n if (!other) return false;\n return this._value.amount === other.amount && this.currency.equals(other.currency);\n }\n\n private assertSameCurrency(other: Price): void {\n if (!this.currency.equals(other.currency)) {\n throw new Error('Cannot operate on Price objects with different currencies');\n }\n }\n\n public add(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount + other.amount, this.currency);\n }\n\n public subtract(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount - other.amount, this.currency);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n amount: this.amount,\n currency: this.currency.value,\n }\n }\n\n public static create(amount: number, currency: Currency | string | number): Price {\n const cur = currency instanceof Currency ? currency : Currency.create(currency);\n return new Price(amount, cur);\n }\n public static createFromPrimitives(data: Record<string, unknown>): Price {\n return new Price(Number(data.amount), Currency.create(String(data.currency)));\n }\n\n}\n","import {ValueObject} from \"@domain/contracts/ValueObject\";\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class UUID extends ValueObject<string> {\n\n private constructor(value: string) {\n super(value);\n }\n\n protected validate(uuid: string) {\n if (!UUID.isValid(uuid)) {\n throw new InternalError(`Invalid uuid <${uuid}>`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static isValid(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\n }\n\n}","import {DatabaseConnection} from '@infrastructure/contracts/Database';\nimport {UnitOfWork} from \"@application/contracts/UnitOfWork\";\n\nexport class BasicUnitOfWork implements UnitOfWork {\n\n public readonly connection: DatabaseConnection;\n\n public constructor(conn: DatabaseConnection) {\n this.connection = conn;\n }\n\n public async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.connection.begin();\n try {\n const result = await fn();\n await this.connection.commit();\n return result;\n } catch (err: any) {\n await this.connection.rollback();\n throw err;\n } finally {\n await this.connection.close();\n }\n }\n}\n","import {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\nimport {BasicUnitOfWork} from \"@application/unit-of-work/BasicUnitOfWork\";\n\nexport class BasicUnitOfWorkFactory {\n\n private readonly connector: DatabaseConnector;\n\n public constructor(connector: DatabaseConnector) {\n this.connector = connector;\n }\n\n public async create(): Promise<BasicUnitOfWork> {\n const conn: DatabaseConnection = await this.connector.getConnection();\n return new BasicUnitOfWork(conn);\n }\n\n}","import {createPool, FieldPacket, Pool, PoolConnection, RowDataPacket} from \"mysql2/promise\";\nimport {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\n\nexport class MysqlConnector implements DatabaseConnector<MysqlConnection> {\n public static readonly DEFAULT_POOL_SIZE: number = 10;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool =\n pool ??\n createPool({\n host: process.env.DB_HOST,\n port: Number(process.env.DB_PORT ?? 3306),\n user: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n dateStrings: true,\n connectionLimit: Number(process.env.DB_POOL_SIZE) || MysqlConnector.DEFAULT_POOL_SIZE,\n decimalNumbers: true,\n });\n }\n\n private async wrap(conn: PoolConnection): Promise<MysqlConnection> {\n return new MysqlConnection(conn);\n }\n\n public async getConnection(): Promise<MysqlConnection> {\n const conn: PoolConnection = await this._pool.getConnection();\n return this.wrap(conn);\n }\n\n public async closePool(): Promise<void> {\n await this._pool.end();\n }\n\n public static async ping(): Promise<boolean> {\n const connector: MysqlConnector = new MysqlConnector();\n try {\n const conn = await connector._pool.getConnection();\n await conn.ping();\n conn.release();\n return true;\n } catch {\n return false;\n } finally {\n await connector.closePool();\n }\n }\n}\n\nexport class MysqlConnection implements DatabaseConnection<string, any[], RowDataPacket> {\n\n private readonly _conn: PoolConnection;\n\n public constructor(conn: PoolConnection) {\n this._conn = conn;\n }\n\n public async query<R = RowDataPacket>(statement: string, params: any[] = []): Promise<R[]> {\n const [rows] = await this._conn.query<R[] & RowDataPacket[] & FieldPacket[]>(statement, params);\n return rows as R[];\n }\n\n public async begin(): Promise<void> {\n await this._conn.beginTransaction();\n }\n\n public async commit(): Promise<void> {\n await this._conn.commit();\n }\n\n public async rollback(): Promise<void> {\n await this._conn.rollback();\n }\n\n public async transaction<T>(fn: (conn: this) => Promise<T>): Promise<T> {\n await this.begin();\n try {\n const result: T = await fn(this);\n await this.commit();\n return result;\n } catch (err) {\n await this.rollback();\n throw err;\n }\n }\n\n public async close(): Promise<void> {\n this._conn.release();\n }\n\n}\n","import {HttpController, HttpRequest, HttpResponse} from \"@infrastructure/contracts/Http\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport class HttpHealthCheckController implements HttpController {\n async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 200,\n body: {\n date: DateTime.create().value,\n code: 200,\n status: 'OK'\n }\n }\n }\n}\n\nexport class HttpNotFoundController implements HttpController {\n public async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 404,\n body: {\n status: 'NOT_FOUND',\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest, HttpResponse} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\n\n\nconst BOOL_TRUE = new Set(['1','true','yes','y','on']);\nconst BOOL_FALSE = new Set(['0','false','no','n','off']);\nconst NUMERIC_KEY_RE = /^(?:page|qty|limit|offset|total|amount|price|count|rounding|min[A-Z_].*|max[A-Z_].*)$/i;\nconst DATE_KEY_RE = /(At|Date|_at|_date)$/i;\n\nfunction toUtcDateTimeString(raw: string): string | undefined {\n const s = raw.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return `${s} 00:00:00`;\n if (/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s)) return s; // asumimos ya UTC\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return undefined;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;\n}\nfunction coerceScalar(key: string, v: unknown): unknown {\n if (v == null) return undefined;\n if (typeof v !== 'string') return v;\n\n const s = v.trim();\n if (s === '') return undefined;\n\n // null literal\n if (s.toLowerCase() === 'null') return null;\n\n // boolean\n const low = s.toLowerCase();\n if (BOOL_TRUE.has(low)) return true;\n if (BOOL_FALSE.has(low)) return false;\n\n // number (solo para claves \"numéricas\" típicas)\n if (NUMERIC_KEY_RE.test(key) && /^-?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (Number.isFinite(n)) return n;\n }\n\n // fecha (claves que terminan con At/Date/_at/_date)\n if (DATE_KEY_RE.test(key)) {\n return toUtcDateTimeString(s) ?? s; // si no parsea, dejá string tal cual\n }\n\n return s;\n}\nfunction normalizeQuery(q: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(q)) {\n // arrays repetidos (?status=A&status=B) o listas con coma (?status=A,B)\n const values = Array.isArray(raw) ? raw : (typeof raw === 'string' && raw.includes(','))\n ? raw.split(',').map(s => s.trim()).filter(Boolean)\n : [raw];\n\n const coerced = values\n .map(v => coerceScalar(key, v))\n .filter(v => v !== undefined);\n\n // si quedó más de uno ⇒ array, si quedó uno ⇒ escalar, si vacío ⇒ omitido\n if (coerced.length === 1) out[key] = coerced[0];\n else if (coerced.length > 1) out[key] = coerced;\n }\n return out;\n}\n\nfunction hasContentType(headers?: HttpResponse['headers']): boolean {\n if (!headers) return false;\n return Object.keys(headers).some(h => h.toLowerCase() === 'content-type');\n}\nfunction isReadableStream(x: any): x is NodeJS.ReadableStream {\n return x && typeof x.pipe === 'function';\n}\n\nexport function adaptExpressRoute(Controller: new () => HttpController): RequestHandler {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rawLangHeader = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(rawLangHeader) ? rawLangHeader[0] : rawLangHeader || '';\n const lang = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: normalizeQuery(req.query as Record<string, unknown>),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const { statusCode, body, headers }: HttpResponse = await controller.handle(httpRequest);\n\n // 1) headers personalizados\n if (headers) res.set(headers as any);\n\n // 2) decidir la forma de enviar el body\n if (isReadableStream(body)) {\n // stream (PDF grande, CSV, etc.)\n res.status(statusCode);\n body.on('error', next);\n body.pipe(res);\n return;\n }\n\n const hasCT = hasContentType(headers);\n\n if (Buffer.isBuffer(body) || typeof body === 'string' || hasCT) {\n // buffer/string o pediste un Content-Type custom → usar send()\n res.status(statusCode).send(body as any);\n } else {\n // default: JSON\n res.status(statusCode).json(body ?? {});\n }\n } catch (err) {\n next(err);\n }\n };\n}\n\n\nexport function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequestHandler {\n return (err, req: Request, res: Response, next: NextFunction) => {\n const raw = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(raw) ? raw[0] : raw ?? '';\n const langCode = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const result = errorManager.handle(err, Language.create(langCode));\n const statusCode = typeof result.status === 'number' ? result.status : 500;\n res.status(statusCode).json({ message: result.message });\n };\n}","import {Currency} from \"@domain/value-objects/Currency\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {Price} from \"@domain/value-objects/Price\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {BaseObject} from \"@domain/contracts/BaseObject\";\n\nexport interface ExchangeRatesProps {\n base: Currency;\n rates: Record<string, number>;\n date: DateTime;\n}\nexport class ExchangeRates extends BaseObject<ExchangeRatesProps>{\n\n public constructor(props: ExchangeRatesProps) {\n super(props);\n }\n\n private getRate(currency: Currency): number | null {\n if (Object.keys(this.props.rates).includes(currency.value)) {\n return this.props.rates[currency.value];\n }\n return null;\n }\n\n public get base(): Currency {\n return this.props.base;\n }\n public get rates(): Record<string, number> {\n return this.props.rates;\n }\n public get date(): DateTime {\n return this.props.date;\n }\n\n public toProps(): ExchangeRatesProps {\n return this.props;\n }\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.props.base.value,\n rates: this.props.rates,\n date: this.props.date.value,\n };\n }\n\n public exchangeToBase(price: Price): Price {\n const rate = this.getRate(price.currency);\n if (!rate) {\n throw new InternalError('INVALID_EXCHANGE_RATE_CURRENCY', `Avaiable rates: ${this.props.rates} - Base Currency:${this.props.base.value} - Price Currency: ${price.currency.value}`)\n }\n if (price.currency.value === this.props.base.value) {\n return price;\n }\n return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.props.base.value);\n }\n\n public static create(props: ExchangeRatesProps): ExchangeRates {\n return new ExchangeRates(props);\n }\n public static createFromPrimitives(data: any): ExchangeRates {\n return ExchangeRates.create({\n base: Currency.create(data.base),\n rates: data.rates ?? [],\n date: DateTime.create(data.date ?? ''),\n });\n }\n\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/domain/value-objects/DateTime.ts","../src/domain/contracts/ValueObject.ts","../src/domain/contracts/DomainEntity.ts","../src/domain/contracts/DomainError.ts","../src/domain/contracts/DomainEvent.ts","../src/domain/contracts/BaseObject.ts","../src/domain/errors/FatalError.ts","../src/domain/errors/InternalError.ts","../src/domain/errors/UsageError.ts","../src/domain/value-objects/Currency.ts","../src/domain/value-objects/Email.ts","../src/domain/value-objects/Language.ts","../src/utils/StringVars.ts","../src/infrastructure/errors/ErrorManager.ts","../src/domain/value-objects/Price.ts","../src/domain/value-objects/UUID.ts","../src/application/unit-of-work/BasicUnitOfWork.ts","../src/application/unit-of-work/BasicUnitOfWorkFactory.ts","../src/infrastructure/mysql/Mysql.ts","../src/infrastructure/http/DefaultController.ts","../src/infrastructure/express/ExpressAdapters.ts","../src/utils/ExchangeRates.ts"],"sourcesContent":["import {DateTime as LuxonDateTime} from 'luxon';\nimport {ValueObject} from \"@domain/contracts/ValueObject\";\n\nexport class DateTime extends ValueObject<string> {\n\n public static readonly DEFAULT_FORMAT: string = 'yyyy-MM-dd HH:mm:ss';\n\n private readonly _dt: LuxonDateTime;\n\n private static fromLuxon(dt: LuxonDateTime): DateTime {\n return new DateTime(DateTime.toUtcFormat(dt));\n }\n\n private static toUtcFormat(dt: LuxonDateTime): string {\n return dt.setZone('utc').toFormat(DateTime.DEFAULT_FORMAT);\n }\n\n private constructor(value: string) {\n super(value);\n this._dt = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n }\n\n protected validate(value: string): void {\n const q = LuxonDateTime.fromFormat(value, DateTime.DEFAULT_FORMAT, { zone: 'utc' });\n if (!q.isValid) {\n throw new Error(`Invalid DateTime: ${q.invalidExplanation}`);\n }\n }\n\n public plusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({years}));\n }\n\n public plusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({months}));\n }\n\n public plusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({days}));\n }\n\n public plusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({hours}));\n }\n\n public plusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({minutes}));\n }\n\n public plusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.plus({seconds}));\n }\n\n public minusYears(years: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({years}));\n }\n\n public minusMonths(months: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({months}));\n }\n\n public minusDays(days: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({days}));\n }\n\n public minusHours(hours: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({hours}));\n }\n\n public minusMinutes(minutes: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({minutes}));\n }\n\n public minusSeconds(seconds: number): DateTime {\n return DateTime.fromLuxon(this._dt.minus({seconds}));\n }\n\n public get year(): number {\n return this._dt.year;\n }\n\n public get month(): number {\n return this._dt.month;\n }\n\n public get day(): number {\n return this._dt.day;\n }\n\n public get hour(): number {\n return this._dt.hour;\n }\n\n public get minute(): number {\n return this._dt.minute;\n }\n\n public get second(): number {\n return this._dt.second;\n }\n\n public getMonthName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('LLLL');\n }\n\n public getWeekdayName(locale: string = 'en'): string {\n return this._dt.setLocale(locale).toFormat('cccc');\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(input?: string | number): DateTime {\n if (input === undefined) {\n return new DateTime(DateTime.toUtcFormat(LuxonDateTime.now()));\n }\n if (typeof input === 'number') {\n return new DateTime(\n DateTime.toUtcFormat(LuxonDateTime.fromMillis(input, { zone: 'utc' })),\n );\n }\n const iso = LuxonDateTime.fromISO(input, { zone: 'utc' });\n if (iso.isValid) {\n return new DateTime(DateTime.toUtcFormat(iso));\n }\n return new DateTime(input);\n }\n\n public static now(): DateTime {\n return DateTime.create();\n }\n}\n","\nexport abstract class ValueObject<TPrimitive = unknown> {\n\n protected readonly _value: TPrimitive;\n\n protected constructor(value: TPrimitive) {\n this.validate(value);\n this._value = Object.freeze(value);\n }\n\n protected abstract validate(value: TPrimitive): void;\n public abstract toPrimitives(): Record<string, unknown>;\n\n public toProps(): TPrimitive {\n return this._value\n }\n public get value(): TPrimitive {\n return this._value;\n }\n public toString(): string {\n return String(this._value);\n }\n\n public equals(vo?: ValueObject<TPrimitive> | null): boolean {\n if (vo === null || vo === undefined) return false;\n if (vo.constructor !== this.constructor) return false;\n return vo.value === this._value;\n }\n}","import {UUID} from \"@domain/value-objects/UUID\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport interface BaseEntity {\n uuid: UUID;\n createdAt: DateTime;\n updatedAt: DateTime;\n deletedAt: DateTime | undefined;\n}\n\nexport abstract class DomainEntity<T extends BaseEntity> {\n\n protected readonly props: T;\n\n protected constructor(props: T) {\n this.props = props;\n }\n\n protected touch(): void {\n this.props.updatedAt = DateTime.now();\n }\n\n public get uuid(): UUID {\n return this.props.uuid;\n }\n public get createdAt(): DateTime {\n return this.props.createdAt;\n }\n public get updatedAt(): DateTime {\n return this.props.updatedAt;\n }\n public get deletedAt(): DateTime | undefined {\n return this.props.deletedAt;\n }\n public get isDeleted(): boolean {\n return Boolean(this.props.deletedAt);\n }\n\n public abstract equals(entity?: DomainEntity<T>): boolean;\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n\n}\n","export abstract class DomainError extends Error {\n\n public readonly type: string;\n\n protected constructor(type: string, message = '') {\n super(message);\n this.type = type;\n }\n}","import {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport abstract class DomainEvent<T = unknown> {\n\n readonly type: string;\n private readonly _occurredAt: DateTime;\n private readonly _payload: T;\n\n protected constructor(payload: T) {\n this._payload = payload;\n this._occurredAt = DateTime.create();\n }\n\n get payload(): T {\n return this._payload;\n }\n\n get occurredAt(): DateTime {\n return this._occurredAt;\n }\n\n}","\nexport abstract class BaseObject<T = unknown> {\n protected readonly props: T;\n protected constructor(props: T) {\n this.props = props;\n }\n public abstract toProps(): T;\n public abstract toPrimitives(): Record<string, unknown>;\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class FatalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class InternalError extends DomainError {\n\n public constructor(type: string, message: string = '') {\n super(type, message);\n }\n\n}","import {DomainError} from \"@domain/contracts/DomainError\";\n\nexport class UsageError extends DomainError {\n\n public readonly vars: Record<string, any>;\n\n public constructor(type: string, vars: Record<string, any> = {}) {\n super(type);\n this.vars = vars;\n }\n\n}","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Currency extends ValueObject<string> {\n\n public static readonly ALPHA_REGEX = /^[A-Z]{3}$/u;\n public static readonly NUM_REGEX = /^\\d{3}$/u;\n\n private static readonly ALPHA_TO_NUM: Record<string, number> = {\n USD: 840,\n EUR: 978,\n UYU: 858,\n ARS: 32,\n BRL: 986,\n };\n\n private static readonly NUM_TO_ALPHA: Record<number, string> =\n Object.entries(Currency.ALPHA_TO_NUM).reduce(\n (acc, [alpha, num]) => {\n acc[num as number] = alpha;\n return acc;\n },\n {} as Record<number, string>,\n );\n\n public static readonly USD: Currency = new Currency('USD');\n public static readonly EUR: Currency = new Currency('EUR');\n public static readonly UYU: Currency = new Currency('UYU');\n public static readonly ARS: Currency = new Currency('ARS');\n public static readonly BRL: Currency = new Currency('BRL');\n\n public readonly numeric: number;\n\n private constructor(alpha: string) {\n super(alpha.toUpperCase().trim());\n this.numeric = Currency.ALPHA_TO_NUM[this.value];\n }\n\n protected validate(alpha: string): void {\n const code = alpha.toUpperCase().trim();\n if (!Currency.ALPHA_REGEX.test(code)) {\n throw new Error(`Currency code <${alpha}> is not a valid ISO‑4217 alpha value`);\n }\n if (!(code in Currency.ALPHA_TO_NUM)) {\n throw new Error(`Currency <${code}> is not supported`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string | number): Currency {\n if (typeof raw === 'number' || Currency.NUM_REGEX.test(raw)) {\n const num = Number(raw);\n const alpha = Currency.NUM_TO_ALPHA[num];\n if (!alpha) {\n throw new Error(`Numeric currency <${raw}> is not supported`);\n }\n return new Currency(alpha);\n }\n return new Currency(String(raw));\n }\n\n public static isValid(raw: string | number): boolean {\n try {\n Currency.create(raw);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\n\nexport class Email extends ValueObject<string> {\n\n public static readonly REGEX: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/u;\n\n private constructor(email: string) {\n super(email.trim());\n }\n\n protected validate(value: string): void {\n if (!Email.REGEX.test(value)) {\n throw new Error(`Email <${value}> is not a valid address`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n value: this.value\n };\n }\n\n public static create(raw: string): Email {\n return new Email(raw);\n }\n\n public static isValid(raw: string): boolean {\n return Email.REGEX.test(raw.trim());\n }\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport {InternalError} from \"@domain/errors/InternalError\";\n\nexport class Language extends ValueObject<string> {\n\n public static readonly SUPPORTED: readonly string[] = [\n 'es',\n 'en',\n 'en-us',\n 'en-gb',\n 'en-au',\n 'en-ca',\n 'en-nz',\n 'en-ie',\n 'en-za',\n 'en-jm',\n 'en-bz',\n 'en-tt',\n 'pt-br',\n 'pt',\n 'es',\n 'es-ar',\n 'es-gt',\n 'es-cr',\n 'es-pa',\n 'es-do',\n 'es-mx',\n 'es-ve',\n 'es-co',\n 'es-pe',\n 'es-ec',\n 'es-cl',\n 'es-uy',\n 'es-py',\n 'es-bo',\n 'es-sv',\n 'es-hn',\n 'es-ni',\n 'es-pr',\n ] as const;\n\n public static readonly DEFAULT: Language = new Language('es');\n public static readonly ENGLISH: Language = new Language('en');\n public static readonly ENGLISH_UNITED_STATES: Language = new Language('en-us');\n public static readonly ENGLISH_UNITED_KINGDOM: Language = new Language('en-gb');\n public static readonly ENGLISH_AUSTRALIA: Language = new Language('en-au');\n public static readonly ENGLISH_CANADA: Language = new Language('en-ca');\n public static readonly ENGLISH_NEW_ZEALAND: Language = new Language('en-nz');\n public static readonly ENGLISH_IRELAND: Language = new Language('en-ie');\n public static readonly ENGLISH_SOUTH_AFRICA: Language = new Language('en-za');\n public static readonly ENGLISH_JAMAICA: Language = new Language('en-jm');\n public static readonly ENGLISH_BELIZE: Language = new Language('en-bz');\n public static readonly ENGLISH_TRINIDAD: Language = new Language('en-tt');\n public static readonly PORTUGUESE_BRAZIL: Language = new Language('pt-br');\n public static readonly PORTUGUESE_PORTUGAL: Language = new Language('pt');\n public static readonly SPANISH: Language = new Language('es');\n public static readonly SPANISH_ARGENTINA: Language = new Language('es-ar');\n public static readonly SPANISH_GUATEMALA: Language = new Language('es-gt');\n public static readonly SPANISH_COSTA_RICA: Language = new Language('es-cr');\n public static readonly SPANISH_PANAMA: Language = new Language('es-pa');\n public static readonly SPANISH_REPUBLICA_DOMINICANA: Language = new Language('es-do');\n public static readonly SPANISH_MEXICO: Language = new Language('es-mx');\n public static readonly SPANISH_VENEZUELA: Language = new Language('es-ve');\n public static readonly SPANISH_COLOMBIA: Language = new Language('es-co');\n public static readonly SPANISH_PERU: Language = new Language('es-pe');\n public static readonly SPANISH_ECUADOR: Language = new Language('es-ec');\n public static readonly SPANISH_CHILE: Language = new Language('es-cl');\n public static readonly SPANISH_URUGUAY: Language = new Language('es-uy');\n public static readonly SPANISH_PARAGUAY: Language = new Language('es-py');\n public static readonly SPANISH_BOLIVIA: Language = new Language('es-bo');\n public static readonly SPANISH_EL_SALVADOR: Language = new Language('es-sv');\n public static readonly SPANISH_HONDURAS: Language = new Language('es-hn');\n public static readonly SPANISH_NICARAGUA: Language = new Language('es-ni');\n public static readonly SPANISH_PUERTO_RICO: Language = new Language('es-pr');\n\n private constructor(code: string) {\n super(code.trim().toLowerCase());\n }\n\n protected validate(value: string): void {\n if (!Language.SUPPORTED.includes(value)) {\n throw new InternalError(`Language <${value}> is not supported`);\n }\n }\n\n public base(): string {\n return this.value.split('-')[0];\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.base(),\n value: this.value\n };\n }\n\n public static create(raw: string): Language {\n const normalized = raw.trim().toLowerCase().replace('_', '-');\n try {\n return new Language(normalized);\n } catch (error: any) {\n return Language.DEFAULT;\n }\n }\n\n}\n","export class StringVars {\n\n public static parse(str: string, ob: { [key: string]: any }): string {\n const regex = /{{(.*?)}}/g;\n return str.replace(regex, (match, variable) => {\n if (ob.hasOwnProperty(variable.trim())) {\n return ob[variable.trim()];\n } else {\n return match;\n }\n });\n }\n\n}","import {Language} from \"@domain/value-objects/Language\";\nimport {FatalError} from \"@domain/errors/FatalError\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {UsageError} from \"@domain/errors/UsageError\";\nimport {StringVars} from \"@utils/StringVars\";\nimport {Logger} from \"@infrastructure/contracts/Logger\";\n\nexport interface ErrorTemplate {\n type: string;\n languages: Record<string, string>;\n}\n\nexport type ErrorManagerHandleResult = {\n status: number | string;\n message: string;\n};\n\nexport class ErrorManager {\n\n private static readonly DEFAULT_MESSAGES: Record<string, string> = {\n 'es': 'Ups, hemos encontrado un error. Nuestro equipo ya está trabajando para solucionarlo',\n 'en': 'Ups, we found an error. Our team is working on it.',\n 'pt': 'Ops, encontramos um bug. Nossa equipe já está trabalhando para resolver isso.',\n };\n\n public static readonly APP_ERRORS = {\n UNDEFINED: 'UNDEFINED_ERROR',\n PROCESS: 'PROCESS_ERROR',\n DATABASE: 'DATABASE_ERROR'\n } as const;\n\n private static readonly TEMPLATES = new Map<string, ErrorTemplate>();\n\n public constructor(private readonly logger: Logger | null = null) {}\n\n private getDefaultMessage(lang: Language): string {\n return (ErrorManager.DEFAULT_MESSAGES[lang.value] || ErrorManager.DEFAULT_MESSAGES[lang.base()] || 'error');\n }\n\n private onFatal(err: FatalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.fatal(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onInternal(err: InternalError, lang: Language): ErrorManagerHandleResult {\n this.logger?.error(err.type, err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n private onUsage(err: UsageError, lang: Language): ErrorManagerHandleResult {\n const tmpl = ErrorManager.TEMPLATES.get(err.type);\n if (!tmpl) {\n this.logger?.error('TEMPLATE_NOT_FOUND', `${err.type}`);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n const code = lang.value;\n const base = lang.base();\n const rawMsg =\n tmpl.languages[code] ??\n tmpl.languages[base] ??\n this.getDefaultMessage(lang);\n return {\n status: 400,\n message: StringVars.parse(rawMsg, err.vars),\n };\n }\n\n private onUnknown(err: Error, lang: Language): ErrorManagerHandleResult {\n this.logger?.error('UNKNOWN_ERROR', err.message);\n return { status: 'ERROR', message: this.getDefaultMessage(lang) };\n }\n\n public handle(err: Error, lang: Language): ErrorManagerHandleResult {\n if (['local','dev'].includes(process.env.ENVIRONMENT ?? '')) {\n console.log(err);\n }\n if (err instanceof FatalError) {\n return this.onFatal(err, lang);\n }\n if (err instanceof InternalError) {\n return this.onInternal(err, lang);\n }\n if (err instanceof UsageError) {\n return this.onUsage(err, lang);\n }\n return this.onUnknown(err, lang);\n }\n\n public static addTemplate(template: ErrorTemplate): void {\n ErrorManager.TEMPLATES.set(template.type, template);\n }\n\n}\n","import { ValueObject } from '@domain/contracts/ValueObject';\nimport { Currency } from '@domain/value-objects/Currency';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {UsageError} from \"@domain/errors/UsageError\";\n\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_AMOUNT',\n languages: {\n 'es': 'El precio <{{amount}}> no es válido',\n 'en': 'Price amount <{{amount}}> is not a valid number',\n }\n});\nErrorManager.addTemplate({\n type: 'INVALID_PRICE_RANGE',\n languages: {\n 'es': 'El precio <{{amount}}> debe ser ≥ {{min}} y ≤ {{max}}',\n 'en': 'Price amount <{{amount}}> must be ≥ {{min}} and ≤ {{max}}',\n }\n});\n\nexport interface PriceProps {\n amount: number;\n currency: Currency;\n}\n\nexport class Price extends ValueObject<PriceProps> {\n\n public static readonly MIN_AMOUNT: number = -1000000;\n public static readonly MAX_AMOUNT: number = 1000000000;\n\n\n private constructor(amount: number, currency: Currency) {\n super({ amount, currency });\n }\n\n protected validate(props: { amount: number; currency: Currency }): void {\n const { amount, currency } = props;\n\n if (typeof amount !== 'number' || Number.isNaN(amount) || !Number.isFinite(amount)) {\n throw new UsageError('INVALID_PRICE_AMOUNT', {amount});\n }\n if (amount < Price.MIN_AMOUNT || amount > Price.MAX_AMOUNT) {\n throw new UsageError('INVALID_PRICE_RANGE', {amount, min: Price.MIN_AMOUNT, max: Price.MAX_AMOUNT});\n }\n }\n\n public get amount(): number {\n return this._value.amount;\n }\n\n public get currency(): Currency {\n return this._value.currency;\n }\n\n public equals(other?: Price | null): boolean {\n if (!other) return false;\n return this._value.amount === other.amount && this.currency.equals(other.currency);\n }\n\n private assertSameCurrency(other: Price): void {\n if (!this.currency.equals(other.currency)) {\n throw new Error('Cannot operate on Price objects with different currencies');\n }\n }\n\n public add(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount + other.amount, this.currency);\n }\n\n public subtract(other: Price): Price {\n this.assertSameCurrency(other);\n return Price.create(this.amount - other.amount, this.currency);\n }\n\n public toPrimitives(): Record<string, unknown> {\n return {\n amount: this.amount,\n currency: this.currency.value,\n }\n }\n\n public static create(amount: number, currency: Currency | string | number): Price {\n const cur = currency instanceof Currency ? currency : Currency.create(currency);\n return new Price(amount, cur);\n }\n public static createFromPrimitives(data: Record<string, unknown>): Price {\n return new Price(Number(data.amount), Currency.create(String(data.currency)));\n }\n\n}\n","import { ValueObject } from \"@domain/contracts/ValueObject\";\nimport { InternalError } from \"@domain/errors/InternalError\";\nimport * as crypto from \"node:crypto\";\n\nexport type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;\n\nexport interface UUIDValidationOptions {\n /** Versiones permitidas (por defecto: 1–8) */\n allowedVersions?: UUIDVersion[];\n /** Permitir el NIL UUID \"00000000-0000-0000-0000-000000000000\" (por defecto: false) */\n allowNil?: boolean;\n}\n\nexport class UUID extends ValueObject<string> {\n public static readonly NIL = \"00000000-0000-0000-0000-000000000000\";\n\n private constructor(value: string) {\n super(value);\n }\n\n protected validate(uuid: string) {\n if (!UUID.isValid(uuid)) {\n throw new InternalError(`Invalid uuid <${uuid}>`);\n }\n }\n\n public toPrimitives(): Record<string, unknown> {\n return { value: this.value };\n }\n\n public static create(uuid?: string): UUID {\n return new UUID(uuid ?? crypto.randomUUID());\n }\n\n public static version(uuid: string): UUIDVersion | undefined {\n const m = /^[0-9a-f]{8}-[0-9a-f]{4}-([1-8])[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.exec(uuid);\n return m ? (Number(m[1]) as UUIDVersion) : undefined;\n }\n\n public static isNil(uuid: string): boolean {\n return /^0{8}-0{4}-0{4}-0{4}-0{12}$/i.test(uuid);\n }\n\n public static isRFCStyle(uuid: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);\n }\n\n public static isValid(uuid: string, opts: UUIDValidationOptions = {}): boolean {\n const allowed = opts.allowedVersions ?? [1, 2, 3, 4, 5, 6, 7, 8];\n const allowNil = opts.allowNil ?? false;\n\n if (allowNil && UUID.isNil(uuid)) return true;\n if (!UUID.isRFCStyle(uuid)) return false;\n\n const v = UUID.version(uuid);\n return !!v && allowed.includes(v);\n }\n}\n","import {DatabaseConnection} from '@infrastructure/contracts/Database';\nimport {UnitOfWork} from \"@application/contracts/UnitOfWork\";\n\nexport class BasicUnitOfWork implements UnitOfWork {\n\n public readonly connection: DatabaseConnection;\n\n public constructor(conn: DatabaseConnection) {\n this.connection = conn;\n }\n\n public async execute<T>(fn: () => Promise<T>): Promise<T> {\n await this.connection.begin();\n try {\n const result = await fn();\n await this.connection.commit();\n return result;\n } catch (err: any) {\n await this.connection.rollback();\n throw err;\n } finally {\n await this.connection.close();\n }\n }\n}\n","import {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\nimport {BasicUnitOfWork} from \"@application/unit-of-work/BasicUnitOfWork\";\n\nexport class BasicUnitOfWorkFactory {\n\n private readonly connector: DatabaseConnector;\n\n public constructor(connector: DatabaseConnector) {\n this.connector = connector;\n }\n\n public async create(): Promise<BasicUnitOfWork> {\n const conn: DatabaseConnection = await this.connector.getConnection();\n return new BasicUnitOfWork(conn);\n }\n\n}","import {createPool, FieldPacket, Pool, PoolConnection, RowDataPacket} from \"mysql2/promise\";\nimport {DatabaseConnection, DatabaseConnector} from \"@infrastructure/contracts/Database\";\n\nexport class MysqlConnector implements DatabaseConnector<MysqlConnection> {\n public static readonly DEFAULT_POOL_SIZE: number = 10;\n\n private readonly _pool: Pool;\n\n public constructor(pool?: Pool) {\n this._pool =\n pool ??\n createPool({\n host: process.env.DB_HOST,\n port: Number(process.env.DB_PORT ?? 3306),\n user: process.env.DB_USER,\n password: process.env.DB_PASSWORD,\n database: process.env.DB_DATABASE,\n dateStrings: true,\n connectionLimit: Number(process.env.DB_POOL_SIZE) || MysqlConnector.DEFAULT_POOL_SIZE,\n decimalNumbers: true,\n });\n }\n\n private async wrap(conn: PoolConnection): Promise<MysqlConnection> {\n return new MysqlConnection(conn);\n }\n\n public async getConnection(): Promise<MysqlConnection> {\n const conn: PoolConnection = await this._pool.getConnection();\n return this.wrap(conn);\n }\n\n public async closePool(): Promise<void> {\n await this._pool.end();\n }\n\n public static async ping(): Promise<boolean> {\n const connector: MysqlConnector = new MysqlConnector();\n try {\n const conn = await connector._pool.getConnection();\n await conn.ping();\n conn.release();\n return true;\n } catch {\n return false;\n } finally {\n await connector.closePool();\n }\n }\n}\n\nexport class MysqlConnection implements DatabaseConnection<string, any[], RowDataPacket> {\n\n private readonly _conn: PoolConnection;\n\n public constructor(conn: PoolConnection) {\n this._conn = conn;\n }\n\n public async query<R = RowDataPacket>(statement: string, params: any[] = []): Promise<R[]> {\n const [rows] = await this._conn.query<R[] & RowDataPacket[] & FieldPacket[]>(statement, params);\n return rows as R[];\n }\n\n public async begin(): Promise<void> {\n await this._conn.beginTransaction();\n }\n\n public async commit(): Promise<void> {\n await this._conn.commit();\n }\n\n public async rollback(): Promise<void> {\n await this._conn.rollback();\n }\n\n public async transaction<T>(fn: (conn: this) => Promise<T>): Promise<T> {\n await this.begin();\n try {\n const result: T = await fn(this);\n await this.commit();\n return result;\n } catch (err) {\n await this.rollback();\n throw err;\n }\n }\n\n public async close(): Promise<void> {\n this._conn.release();\n }\n\n}\n","import {HttpController, HttpRequest, HttpResponse} from \"@infrastructure/contracts/Http\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\n\nexport class HttpHealthCheckController implements HttpController {\n async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 200,\n body: {\n date: DateTime.create().value,\n code: 200,\n status: 'OK'\n }\n }\n }\n}\n\nexport class HttpNotFoundController implements HttpController {\n public async handle(request: HttpRequest): Promise<HttpResponse> {\n return {\n statusCode: 404,\n body: {\n status: 'NOT_FOUND',\n message: `Route ${request.headers.location} not found`,\n },\n };\n }\n}","import {Request, Response, NextFunction, RequestHandler, ErrorRequestHandler} from 'express';\nimport {HttpController, HttpRequest, HttpResponse} from '@infrastructure/contracts/Http';\nimport {ErrorManager} from \"@infrastructure/errors/ErrorManager\";\nimport {Language} from \"@domain/value-objects/Language\";\n\n\nconst BOOL_TRUE = new Set(['1','true','yes','y','on']);\nconst BOOL_FALSE = new Set(['0','false','no','n','off']);\nconst NUMERIC_KEY_RE = /^(?:page|qty|limit|offset|total|amount|price|count|rounding|min[A-Z_].*|max[A-Z_].*)$/i;\nconst DATE_KEY_RE = /(At|Date|_at|_date)$/i;\n\nfunction toUtcDateTimeString(raw: string): string | undefined {\n const s = raw.trim();\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) return `${s} 00:00:00`;\n if (/^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$/.test(s)) return s; // asumimos ya UTC\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) return undefined;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;\n}\nfunction coerceScalar(key: string, v: unknown): unknown {\n if (v == null) return undefined;\n if (typeof v !== 'string') return v;\n\n const s = v.trim();\n if (s === '') return undefined;\n\n // null literal\n if (s.toLowerCase() === 'null') return null;\n\n // boolean\n const low = s.toLowerCase();\n if (BOOL_TRUE.has(low)) return true;\n if (BOOL_FALSE.has(low)) return false;\n\n // number (solo para claves \"numéricas\" típicas)\n if (NUMERIC_KEY_RE.test(key) && /^-?\\d+(\\.\\d+)?$/.test(s)) {\n const n = Number(s);\n if (Number.isFinite(n)) return n;\n }\n\n // fecha (claves que terminan con At/Date/_at/_date)\n if (DATE_KEY_RE.test(key)) {\n return toUtcDateTimeString(s) ?? s; // si no parsea, dejá string tal cual\n }\n\n return s;\n}\nfunction normalizeQuery(q: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(q)) {\n // arrays repetidos (?status=A&status=B) o listas con coma (?status=A,B)\n const values = Array.isArray(raw) ? raw : (typeof raw === 'string' && raw.includes(','))\n ? raw.split(',').map(s => s.trim()).filter(Boolean)\n : [raw];\n\n const coerced = values\n .map(v => coerceScalar(key, v))\n .filter(v => v !== undefined);\n\n // si quedó más de uno ⇒ array, si quedó uno ⇒ escalar, si vacío ⇒ omitido\n if (coerced.length === 1) out[key] = coerced[0];\n else if (coerced.length > 1) out[key] = coerced;\n }\n return out;\n}\n\nfunction isReadableStream(x: any): x is NodeJS.ReadableStream {\n return x && typeof x.pipe === 'function';\n}\nfunction hasHeader(headers: HttpResponse['headers'] | undefined, name: string): boolean {\n if (!headers) return false;\n const lname = name.toLowerCase();\n return Object.keys(headers).some(h => h.toLowerCase() === lname);\n}\n\nexport function adaptExpressRoute(Controller: new () => HttpController): RequestHandler {\n return async (req: Request, res: Response, next: NextFunction) => {\n const rawLangHeader = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(rawLangHeader) ? rawLangHeader[0] : rawLangHeader || '';\n const lang = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const httpRequest: HttpRequest = {\n headers: req.headers as Record<string, string>,\n params: req.params,\n query: normalizeQuery(req.query as Record<string, unknown>),\n lang,\n body: req.body,\n };\n try {\n const controller = new Controller();\n const { statusCode, body, headers }: HttpResponse = await controller.handle(httpRequest);\n\n if (headers) res.set(headers as any);\n\n // 1) Streams\n if (isReadableStream(body)) {\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n res.status(statusCode);\n body.on('error', next);\n body.pipe(res);\n return;\n }\n\n // 2) Binarios (Buffer / ArrayBuffer / TypedArray)\n const isArrayBuffer = typeof body === 'object' && body instanceof ArrayBuffer;\n const isArrayBufferView = typeof body === 'object' && body != null && ArrayBuffer.isView(body as any);\n\n if (Buffer.isBuffer(body) || isArrayBuffer || isArrayBufferView) {\n let buf: Buffer;\n if (Buffer.isBuffer(body)) {\n buf = body as Buffer;\n } else if (isArrayBuffer) {\n buf = Buffer.from(body as ArrayBuffer);\n } else {\n const view = body as ArrayBufferView;\n buf = Buffer.from(view.buffer, view.byteOffset, view.byteLength);\n }\n\n if (!hasHeader(headers, 'Content-Type')) res.set('Content-Type', 'application/octet-stream');\n if (!res.getHeader('Content-Length')) res.set('Content-Length', String(buf.length));\n\n res.status(statusCode);\n res.end(buf);\n return;\n }\n\n // 3) String o Content-Type custom → send()\n const hasCT = hasHeader(headers, 'Content-Type');\n if (typeof body === 'string' || hasCT) {\n res.status(statusCode).send(body as any);\n return;\n }\n // 4) Default: JSON\n res.status(statusCode).json(body ?? {});\n } catch (err) {\n next(err);\n }\n };\n}\n\n\nexport function adaptExpressErrorHandler(errorManager: ErrorManager): ErrorRequestHandler {\n return (err, req: Request, res: Response, next: NextFunction) => {\n const raw = req.headers['accept-language'] ?? req.headers['Accept-Language'] ?? 'es';\n const rawLang = Array.isArray(raw) ? raw[0] : raw ?? '';\n const langCode = rawLang.split(',')[0].split(';')[0].trim().toLowerCase();\n\n const result = errorManager.handle(err, Language.create(langCode));\n const statusCode = typeof result.status === 'number' ? result.status : 500;\n res.status(statusCode).json({ message: result.message });\n };\n}","import {Currency} from \"@domain/value-objects/Currency\";\nimport {DateTime} from \"@domain/value-objects/DateTime\";\nimport {Price} from \"@domain/value-objects/Price\";\nimport {InternalError} from \"@domain/errors/InternalError\";\nimport {BaseObject} from \"@domain/contracts/BaseObject\";\n\nexport interface ExchangeRatesProps {\n base: Currency;\n rates: Record<string, number>;\n date: DateTime;\n}\nexport class ExchangeRates extends BaseObject<ExchangeRatesProps>{\n\n public constructor(props: ExchangeRatesProps) {\n super(props);\n }\n\n private getRate(currency: Currency): number | null {\n if (Object.keys(this.props.rates).includes(currency.value)) {\n return this.props.rates[currency.value];\n }\n return null;\n }\n\n public get base(): Currency {\n return this.props.base;\n }\n public get rates(): Record<string, number> {\n return this.props.rates;\n }\n public get date(): DateTime {\n return this.props.date;\n }\n\n public toProps(): ExchangeRatesProps {\n return this.props;\n }\n public toPrimitives(): Record<string, unknown> {\n return {\n base: this.props.base.value,\n rates: this.props.rates,\n date: this.props.date.value,\n };\n }\n\n public exchangeToBase(price: Price): Price {\n const rate = this.getRate(price.currency);\n if (!rate) {\n throw new InternalError('INVALID_EXCHANGE_RATE_CURRENCY', `Avaiable rates: ${this.props.rates} - Base Currency:${this.props.base.value} - Price Currency: ${price.currency.value}`)\n }\n if (price.currency.value === this.props.base.value) {\n return price;\n }\n return Price.create(parseFloat((price.amount / rate).toFixed(2)), this.props.base.value);\n }\n\n public static create(props: ExchangeRatesProps): ExchangeRates {\n return new ExchangeRates(props);\n }\n public static createFromPrimitives(data: any): ExchangeRates {\n return ExchangeRates.create({\n base: Currency.create(data.base),\n rates: data.rates ?? [],\n date: DateTime.create(data.date ?? ''),\n });\n }\n\n}"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wsp-ms-core",
3
3
  "author": "Wonasports",
4
- "version": "1.0.45",
4
+ "version": "1.0.48",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
7
7
  "types": "dist/index.d.ts",