@cosmneo/onion-lasagna 0.1.0

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.
Files changed (97) hide show
  1. package/dist/backend/core/global.cjs +283 -0
  2. package/dist/backend/core/global.cjs.map +1 -0
  3. package/dist/backend/core/global.d.cts +294 -0
  4. package/dist/backend/core/global.d.ts +294 -0
  5. package/dist/backend/core/global.js +39 -0
  6. package/dist/backend/core/global.js.map +1 -0
  7. package/dist/backend/core/onion-layers.cjs +2302 -0
  8. package/dist/backend/core/onion-layers.cjs.map +1 -0
  9. package/dist/backend/core/onion-layers.d.cts +1675 -0
  10. package/dist/backend/core/onion-layers.d.ts +1675 -0
  11. package/dist/backend/core/onion-layers.js +1158 -0
  12. package/dist/backend/core/onion-layers.js.map +1 -0
  13. package/dist/backend/core/presentation.cjs +573 -0
  14. package/dist/backend/core/presentation.cjs.map +1 -0
  15. package/dist/backend/core/presentation.d.cts +5 -0
  16. package/dist/backend/core/presentation.d.ts +5 -0
  17. package/dist/backend/core/presentation.js +28 -0
  18. package/dist/backend/core/presentation.js.map +1 -0
  19. package/dist/backend/core/validators/arktype.cjs +947 -0
  20. package/dist/backend/core/validators/arktype.cjs.map +1 -0
  21. package/dist/backend/core/validators/arktype.d.cts +188 -0
  22. package/dist/backend/core/validators/arktype.d.ts +188 -0
  23. package/dist/backend/core/validators/arktype.js +287 -0
  24. package/dist/backend/core/validators/arktype.js.map +1 -0
  25. package/dist/backend/core/validators/typebox.cjs +939 -0
  26. package/dist/backend/core/validators/typebox.cjs.map +1 -0
  27. package/dist/backend/core/validators/typebox.d.cts +189 -0
  28. package/dist/backend/core/validators/typebox.d.ts +189 -0
  29. package/dist/backend/core/validators/typebox.js +281 -0
  30. package/dist/backend/core/validators/typebox.js.map +1 -0
  31. package/dist/backend/core/validators/valibot.cjs +942 -0
  32. package/dist/backend/core/validators/valibot.cjs.map +1 -0
  33. package/dist/backend/core/validators/valibot.d.cts +160 -0
  34. package/dist/backend/core/validators/valibot.d.ts +160 -0
  35. package/dist/backend/core/validators/valibot.js +294 -0
  36. package/dist/backend/core/validators/valibot.js.map +1 -0
  37. package/dist/backend/core/validators/zod.cjs +934 -0
  38. package/dist/backend/core/validators/zod.cjs.map +1 -0
  39. package/dist/backend/core/validators/zod.d.cts +188 -0
  40. package/dist/backend/core/validators/zod.d.ts +188 -0
  41. package/dist/backend/core/validators/zod.js +278 -0
  42. package/dist/backend/core/validators/zod.js.map +1 -0
  43. package/dist/backend/frameworks/elysia.cjs +715 -0
  44. package/dist/backend/frameworks/elysia.cjs.map +1 -0
  45. package/dist/backend/frameworks/elysia.d.cts +208 -0
  46. package/dist/backend/frameworks/elysia.d.ts +208 -0
  47. package/dist/backend/frameworks/elysia.js +251 -0
  48. package/dist/backend/frameworks/elysia.js.map +1 -0
  49. package/dist/backend/frameworks/fastify.cjs +677 -0
  50. package/dist/backend/frameworks/fastify.cjs.map +1 -0
  51. package/dist/backend/frameworks/fastify.d.cts +201 -0
  52. package/dist/backend/frameworks/fastify.d.ts +201 -0
  53. package/dist/backend/frameworks/fastify.js +213 -0
  54. package/dist/backend/frameworks/fastify.js.map +1 -0
  55. package/dist/backend/frameworks/hono.cjs +715 -0
  56. package/dist/backend/frameworks/hono.cjs.map +1 -0
  57. package/dist/backend/frameworks/hono.d.cts +163 -0
  58. package/dist/backend/frameworks/hono.d.ts +163 -0
  59. package/dist/backend/frameworks/hono.js +249 -0
  60. package/dist/backend/frameworks/hono.js.map +1 -0
  61. package/dist/backend/frameworks/nestjs.cjs +260 -0
  62. package/dist/backend/frameworks/nestjs.cjs.map +1 -0
  63. package/dist/backend/frameworks/nestjs.d.cts +168 -0
  64. package/dist/backend/frameworks/nestjs.d.ts +168 -0
  65. package/dist/backend/frameworks/nestjs.js +193 -0
  66. package/dist/backend/frameworks/nestjs.js.map +1 -0
  67. package/dist/base-dto.class-D7W9iqoU.d.cts +146 -0
  68. package/dist/base-dto.class-D7W9iqoU.d.ts +146 -0
  69. package/dist/base-uuid-v7.vo-BPGEIWLM.d.ts +799 -0
  70. package/dist/base-uuid-v7.vo-BjqKX44G.d.cts +799 -0
  71. package/dist/chunk-74IKUOSE.js +116 -0
  72. package/dist/chunk-74IKUOSE.js.map +1 -0
  73. package/dist/chunk-BKZOLGQW.js +29 -0
  74. package/dist/chunk-BKZOLGQW.js.map +1 -0
  75. package/dist/chunk-CGZBV6BD.js +54 -0
  76. package/dist/chunk-CGZBV6BD.js.map +1 -0
  77. package/dist/chunk-DDAHJZVK.js +258 -0
  78. package/dist/chunk-DDAHJZVK.js.map +1 -0
  79. package/dist/chunk-MQD5GXMT.js +171 -0
  80. package/dist/chunk-MQD5GXMT.js.map +1 -0
  81. package/dist/chunk-OKFXZHBC.js +43 -0
  82. package/dist/chunk-OKFXZHBC.js.map +1 -0
  83. package/dist/chunk-RLLWYFPI.js +168 -0
  84. package/dist/chunk-RLLWYFPI.js.map +1 -0
  85. package/dist/chunk-VCHFXT5W.js +425 -0
  86. package/dist/chunk-VCHFXT5W.js.map +1 -0
  87. package/dist/chunk-ZWLYNGO3.js +40 -0
  88. package/dist/chunk-ZWLYNGO3.js.map +1 -0
  89. package/dist/http-response-BAhi8lF4.d.cts +124 -0
  90. package/dist/http-response-BAhi8lF4.d.ts +124 -0
  91. package/dist/index-DingXh7B.d.cts +1187 -0
  92. package/dist/index-tOH7XBa3.d.ts +1187 -0
  93. package/dist/routing.type-DB4pt-d9.d.ts +184 -0
  94. package/dist/routing.type-DF2BIL7x.d.cts +184 -0
  95. package/dist/validation-error.type-kD4_qNZ9.d.cts +199 -0
  96. package/dist/validation-error.type-kD4_qNZ9.d.ts +199 -0
  97. package/package.json +191 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/backend/core/onion-layers/app/classes/base-inbound-adapter.class.ts","../../../src/backend/core/onion-layers/domain/classes/base-entity.class.ts","../../../src/backend/core/onion-layers/domain/classes/base-aggregate-root.class.ts","../../../src/backend/core/onion-layers/domain/classes/base-domain-event.class.ts","../../../src/backend/core/onion-layers/domain/exceptions/partial-load.error.ts","../../../src/backend/core/onion-layers/domain/example-domain/value-objects/money.vo.ts","../../../src/backend/core/onion-layers/domain/example-domain/value-objects/order-id.vo.ts","../../../src/backend/core/onion-layers/domain/example-domain/value-objects/order-status.vo.ts","../../../src/backend/core/onion-layers/domain/example-domain/events/order-cancelled.event.ts","../../../src/backend/core/onion-layers/domain/example-domain/events/order-placed.event.ts","../../../src/backend/core/onion-layers/domain/example-domain/aggregates/order/policies/value/default-order-status.policy.ts","../../../src/backend/core/onion-layers/domain/example-domain/aggregates/order/policies/business/can-add-order-item.policy.ts","../../../src/backend/core/onion-layers/domain/example-domain/aggregates/order/policies/business/can-cancel-order.policy.ts","../../../src/backend/core/onion-layers/domain/example-domain/aggregates/order/order.aggregate.ts","../../../src/backend/core/onion-layers/domain/example-domain/entities/order-item-id.vo.ts","../../../src/backend/core/onion-layers/domain/example-domain/entities/order-item.entity.ts","../../../src/backend/core/onion-layers/domain/example-domain/exceptions/order-already-shipped.error.ts","../../../src/backend/core/onion-layers/infra/classes/base-outbound-adapter.class.ts","../../../src/backend/core/onion-layers/infra/exceptions/db.error.ts","../../../src/backend/core/onion-layers/infra/exceptions/network.error.ts","../../../src/backend/core/onion-layers/infra/exceptions/timeout.error.ts","../../../src/backend/core/onion-layers/infra/exceptions/external-service.error.ts"],"sourcesContent":["import type { BaseDto } from '../../../global/classes/base-dto.class';\nimport type { BaseInboundPort } from '../interfaces/ports/base-inbound.port';\nimport { ObjectValidationError } from '../../../global/exceptions/object-validation.error';\nimport { wrapErrorUnlessAsync } from '../../../global/utils/wrap-error.util';\nimport { UseCaseError } from '../exceptions/use-case.error';\nimport { DomainError } from '../../domain/exceptions/domain.error';\nimport { InfraError } from '../../infra/exceptions/infra.error';\n\n/**\n * Abstract base class for use case handlers (inbound adapters).\n *\n * Implements the {@link BaseInboundPort} interface and provides:\n * - Automatic error wrapping for unexpected exceptions\n * - Pass-through for known error types (UseCaseError, DomainError, InfraError)\n *\n * Subclasses implement the `handle` method with the actual use case logic.\n *\n * @typeParam TInDto - Input DTO type, must extend BaseDto\n * @typeParam TOutDto - Output DTO type, must extend BaseDto\n *\n * @example\n * ```typescript\n * class CreateUserUseCase extends BaseInboundAdapter<CreateUserInputDto, CreateUserOutputDto> {\n * protected async handle(input: CreateUserInputDto): Promise<CreateUserOutputDto> {\n * const user = await this.userRepo.create(input.value);\n * return CreateUserOutputDto.create(user);\n * }\n * }\n * ```\n */\nexport abstract class BaseInboundAdapter<\n TInDto extends BaseDto<unknown>,\n TOutDto extends BaseDto<unknown>,\n> implements BaseInboundPort<TInDto, TOutDto> {\n /**\n * Implements the use case logic. Override this method in subclasses.\n *\n * @param input - Validated input DTO\n * @returns Promise resolving to the output DTO\n */\n protected abstract handle(input: TInDto): Promise<TOutDto>;\n\n /**\n * Executes the use case with error boundary protection.\n *\n * Known error types are re-thrown as-is to preserve error semantics.\n * Unknown errors are wrapped in a UseCaseError to maintain error hierarchy.\n *\n * @param input - Validated input DTO\n * @returns Promise resolving to the output DTO\n * @throws {ObjectValidationError} For validation failures (propagated to controller)\n * @throws {UseCaseError} For use case failures or wrapped unknown errors\n * @throws {DomainError} For domain invariant violations\n * @throws {InfraError} For infrastructure failures\n */\n public async execute(input: TInDto): Promise<TOutDto> {\n return wrapErrorUnlessAsync(\n () => this.handle(input),\n (cause) => new UseCaseError({ message: 'Unexpected use case handler error', cause }),\n [ObjectValidationError, UseCaseError, DomainError, InfraError],\n );\n }\n}\n","import type { BaseValueObject } from './base-value-object.class';\n\n/**\n * Base class for Domain-Driven Design Entities.\n *\n * Entities are domain objects that have a distinct identity that runs through\n * time and different states. Unlike Value Objects (compared by value),\n * Entities are compared by their identity (ID).\n *\n * **Note:** Entities should be composed of Value Objects, which are self-validating.\n * Therefore, entity-level validation is not needed - VOs validate themselves\n * at construction time. Cross-property invariants should be checked in factory methods.\n *\n * Key characteristics:\n * - **Identity**: Each entity has a unique identifier (must be a Value Object)\n * - **Equality by identity**: Two entities with the same ID are considered equal\n * - **Mutable state**: Entity properties can change while identity remains\n * - **Composed of VOs**: Properties should be Value Objects (self-validating)\n * - **Versioning**: Optional version field for optimistic locking\n *\n * @typeParam TId - The identity type (must extend BaseValueObject)\n * @typeParam TProps - The properties type containing entity state (must be an object)\n *\n * @example\n * ```typescript\n * interface UserProps {\n * name: PersonName;\n * email: Email;\n * createdAt: DateVo;\n * }\n *\n * class User extends BaseEntity<UserId, UserProps> {\n * private constructor(id: UserId, props: UserProps, version?: number) {\n * super(id, props, version);\n * }\n *\n * static create(name: PersonName, email: Email): User {\n * const id = UserId.create();\n * return new User(id, {\n * name,\n * email,\n * createdAt: DateVo.now(),\n * });\n * }\n *\n * static fromPersistence(id: UserId, props: UserProps, version: number): User {\n * return new User(id, props, version);\n * }\n *\n * get name(): PersonName {\n * return this.props.name;\n * }\n *\n * get email(): Email {\n * return this.props.email;\n * }\n *\n * changeName(newName: PersonName): void {\n * this._props.name = newName;\n * }\n * }\n *\n * const user1 = User.create(PersonName.create('John'), Email.create('john@example.com'));\n * const user2 = User.fromPersistence(user1.id, { ...user1.props }, user1.version);\n * user1.equals(user2); // true - same ID\n * ```\n */\nexport abstract class BaseEntity<TId extends BaseValueObject<unknown>, TProps extends object> {\n private readonly _id: TId;\n protected _props: TProps;\n private readonly _version: number;\n\n /**\n * Creates a new Entity instance.\n *\n * @param id - The unique identifier for this entity\n * @param props - The entity's properties/state (should be composed of Value Objects)\n * @param version - Optional version number for optimistic locking (defaults to 0)\n */\n protected constructor(id: TId, props: TProps, version = 0) {\n this._id = id;\n this._props = props;\n this._version = version;\n }\n\n /**\n * The unique identifier for this entity.\n *\n * @returns The entity's ID of type TId\n */\n public get id(): TId {\n return this._id;\n }\n\n /**\n * The entity's properties/state.\n *\n * Protected to encourage encapsulation via specific getters.\n * Subclasses should expose individual properties as needed.\n *\n * @returns The entity's properties of type TProps\n */\n protected get props(): TProps {\n return this._props;\n }\n\n /**\n * The version number for optimistic locking.\n *\n * Use this to detect concurrent modifications:\n * - Load entity with version N\n * - Attempt to save with \"WHERE version = N\"\n * - If rows affected = 0, another process modified the entity\n *\n * @returns The current version number\n */\n public get version(): number {\n return this._version;\n }\n\n /**\n * Compares this Entity with another for equality.\n *\n * Entities are equal if they have the same identity (ID).\n * This differs from Value Objects which compare by value.\n *\n * @param other - The Entity to compare with\n * @returns `true` if the IDs are equal, `false` otherwise\n *\n * @example\n * ```typescript\n * const user1 = User.create(PersonName.create('John'), Email.create('john@example.com'));\n * const user2 = User.fromPersistence(user1.id, { name: PersonName.create('John Updated'), ... }, 1);\n * user1.equals(user2); // true - same ID, different state\n * ```\n */\n public equals(other: BaseEntity<TId, TProps>): boolean {\n if (this === other) return true;\n return this.idEquals(this._id, other._id);\n }\n\n /**\n * Compares two IDs for equality.\n *\n * Since TId must extend BaseValueObject, we use the value object's\n * `equals` method for comparison.\n *\n * @param a - First ID to compare\n * @param b - Second ID to compare\n * @returns `true` if IDs are equal, `false` otherwise\n */\n protected idEquals(a: TId, b: TId): boolean {\n if (a === b) return true;\n return a.equals(b);\n }\n\n /**\n * Returns the next version number.\n *\n * Call this when persisting changes to implement optimistic locking.\n * The repository should save with version + 1.\n *\n * @returns The next version number (current + 1)\n *\n * @example\n * ```typescript\n * // In repository\n * async save(entity: User): Promise<void> {\n * await this.db.update({\n * ...entity.toPersistence(),\n * version: entity.nextVersion(),\n * }).where({ id: entity.id, version: entity.version });\n * }\n * ```\n */\n protected nextVersion(): number {\n return this._version + 1;\n }\n}\n","import type { BaseValueObject } from './base-value-object.class';\nimport { BaseEntity } from './base-entity.class';\nimport type { BaseDomainEvent } from './base-domain-event.class';\n\n/**\n * Base class for Aggregate Roots in Domain-Driven Design.\n *\n * An Aggregate Root is a special Entity that serves as the entry point to an\n * aggregate - a cluster of domain objects that are treated as a single unit\n * for data changes. The Aggregate Root enforces invariants across the entire\n * aggregate and manages domain events.\n *\n * **Note:** Like entities, aggregate roots should be composed of Value Objects,\n * which are self-validating. Cross-property invariants should be checked in\n * factory methods or domain methods.\n *\n * Key characteristics:\n * - **Entry point**: External objects can only reference the Aggregate Root\n * - **Consistency boundary**: All changes within the aggregate are atomic\n * - **Invariant enforcement**: The root ensures all business rules are satisfied\n * - **Event management**: Collects domain events raised during operations\n *\n * @typeParam TId - The identity type (must extend BaseValueObject)\n * @typeParam TProps - The properties type containing aggregate state (must be an object)\n *\n * @example\n * ```typescript\n * interface OrderProps {\n * customerId: CustomerId;\n * items: OrderItem[];\n * status: OrderStatus;\n * placedAt: DateVo;\n * }\n *\n * class Order extends BaseAggregateRoot<OrderId, OrderProps> {\n * private constructor(id: OrderId, props: OrderProps, version?: number) {\n * super(id, props, version);\n * }\n *\n * static create(customerId: CustomerId, items: OrderItem[]): Order {\n * const id = OrderId.create();\n * const order = new Order(id, {\n * customerId,\n * items,\n * status: OrderStatus.pending(),\n * placedAt: DateVo.now(),\n * });\n *\n * // Raise domain event\n * order.addDomainEvent(new OrderPlacedEvent({\n * orderId: id.value,\n * customerId: customerId.value,\n * itemCount: items.length,\n * }));\n *\n * return order;\n * }\n *\n * static fromPersistence(id: OrderId, props: OrderProps, version: number): Order {\n * return new Order(id, props, version);\n * }\n *\n * addItem(item: OrderItem): void {\n * if (!this.props.status.isPending()) {\n * throw new InvariantViolationError({\n * message: 'Cannot add items to a non-pending order',\n * });\n * }\n * this._props.items.push(item);\n * this.addDomainEvent(new OrderItemAddedEvent({\n * orderId: this.id.value,\n * productId: item.productId.value,\n * }));\n * }\n *\n * confirm(): void {\n * this._props.status = OrderStatus.confirmed();\n * this.addDomainEvent(new OrderConfirmedEvent({ orderId: this.id.value }));\n * }\n * }\n *\n * // In repository after save:\n * async save(order: Order): Promise<void> {\n * await this.db.save(order.toPersistence());\n * const events = order.pullDomainEvents();\n * await this.eventPublisher.publishAll(events);\n * }\n * ```\n */\nexport abstract class BaseAggregateRoot<\n TId extends BaseValueObject<unknown>,\n TProps extends object,\n> extends BaseEntity<TId, TProps> {\n private _domainEvents: BaseDomainEvent[] = [];\n\n /**\n * Creates a new Aggregate Root instance.\n *\n * @param id - The unique identifier for this aggregate\n * @param props - The aggregate's properties/state (should be composed of Value Objects)\n * @param version - Optional version number for optimistic locking (defaults to 0)\n */\n protected constructor(id: TId, props: TProps, version?: number) {\n super(id, props, version);\n }\n\n /**\n * Adds a domain event to be published after persistence.\n *\n * Call this method when a significant domain action occurs.\n * Events are collected and should be published by the repository\n * after successfully persisting the aggregate.\n *\n * @param event - The domain event to add\n *\n * @example\n * ```typescript\n * confirm(): void {\n * this._props.status = OrderStatus.confirmed();\n * this.addDomainEvent(new OrderConfirmedEvent({\n * orderId: this.id.value,\n * confirmedAt: new Date(),\n * }));\n * }\n * ```\n */\n protected addDomainEvent(event: BaseDomainEvent): void {\n this._domainEvents.push(event);\n }\n\n /**\n * Returns and clears all pending domain events.\n *\n * This method should be called by the repository after successfully\n * persisting the aggregate. The events are cleared to prevent\n * duplicate publishing.\n *\n * @returns Array of domain events that were pending\n *\n * @example\n * ```typescript\n * // In repository\n * async save(order: Order): Promise<void> {\n * await this.db.transaction(async (tx) => {\n * await tx.orders.upsert(order.toPersistence());\n * });\n *\n * // Only publish after successful persistence\n * const events = order.pullDomainEvents();\n * for (const event of events) {\n * await this.eventBus.publish(event);\n * }\n * }\n * ```\n */\n public pullDomainEvents(): BaseDomainEvent[] {\n const events = [...this._domainEvents];\n this._domainEvents = [];\n return events;\n }\n\n /**\n * Returns pending domain events without clearing them.\n *\n * Useful for inspection or testing without affecting the event queue.\n *\n * @returns Array of pending domain events\n */\n public peekDomainEvents(): readonly BaseDomainEvent[] {\n return [...this._domainEvents];\n }\n\n /**\n * Checks if there are any pending domain events.\n *\n * @returns `true` if there are events waiting to be published\n *\n * @example\n * ```typescript\n * if (order.hasDomainEvents) {\n * const events = order.pullDomainEvents();\n * await eventBus.publishAll(events);\n * }\n * ```\n */\n public get hasDomainEvents(): boolean {\n return this._domainEvents.length > 0;\n }\n\n /**\n * Clears all pending domain events without returning them.\n *\n * Use with caution - this discards events that haven't been published.\n * Useful in testing or when intentionally discarding events.\n */\n protected clearDomainEvents(): void {\n this._domainEvents = [];\n }\n}\n","/**\n * Base class for Domain Events in Domain-Driven Design.\n *\n * Domain Events represent something meaningful that happened in the domain.\n * They are immutable records of past occurrences that other parts of the\n * system can react to.\n *\n * Key characteristics:\n * - **Immutable**: Events are facts about the past, they cannot change\n * - **Named in past tense**: e.g., OrderPlaced, UserRegistered, PaymentReceived\n * - **Contain relevant data**: Include all information needed by handlers\n * - **Raised by Aggregate Roots**: Events are collected and published after persistence\n *\n * @typeParam TPayload - The event-specific data payload type\n *\n * @example\n * ```typescript\n * interface OrderPlacedPayload {\n * orderId: string;\n * customerId: string;\n * items: Array<{ productId: string; quantity: number }>;\n * totalAmount: number;\n * }\n *\n * class OrderPlacedEvent extends BaseDomainEvent<OrderPlacedPayload> {\n * constructor(payload: OrderPlacedPayload) {\n * super('OrderPlaced', payload.orderId, payload);\n * }\n * }\n *\n * // In aggregate root\n * class Order extends BaseAggregateRoot<OrderId, OrderProps> {\n * static create(customerId: string, items: OrderItem[]): Order {\n * const order = new Order(...);\n * order.addDomainEvent(new OrderPlacedEvent({\n * orderId: order.id.value,\n * customerId,\n * items: items.map(i => ({ productId: i.productId, quantity: i.quantity })),\n * totalAmount: order.totalAmount,\n * }));\n * return order;\n * }\n * }\n * ```\n */\nexport abstract class BaseDomainEvent<TPayload = unknown> {\n private readonly _eventId: string;\n private readonly _eventName: string;\n private readonly _aggregateId: string;\n private readonly _occurredOn: Date;\n private readonly _payload: TPayload;\n\n /**\n * Deep clones an object, handling Date objects specially.\n *\n * @param obj - The object to clone\n * @returns A deep copy of the object\n */\n private static deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => BaseDomainEvent.deepClone(item)) as T;\n }\n\n const cloned = {} as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n cloned[key] = BaseDomainEvent.deepClone((obj as Record<string, unknown>)[key]);\n }\n return cloned as T;\n }\n\n /**\n * Recursively freezes an object and all nested objects.\n *\n * @param obj - The object to deep freeze\n * @returns The frozen object\n */\n private static deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Freeze arrays and their elements\n if (Array.isArray(obj)) {\n obj.forEach((item) => BaseDomainEvent.deepFreeze(item));\n return Object.freeze(obj) as T;\n }\n\n // Freeze object properties recursively\n for (const key of Object.keys(obj)) {\n const value = (obj as Record<string, unknown>)[key];\n if (value !== null && typeof value === 'object') {\n BaseDomainEvent.deepFreeze(value);\n }\n }\n\n return Object.freeze(obj);\n }\n\n /**\n * Creates an immutable copy of the payload.\n *\n * Clones the payload first to avoid mutating the original object,\n * then deep-freezes the clone to ensure immutability.\n *\n * @param payload - The payload to clone and freeze\n * @returns An immutable copy of the payload\n */\n private static cloneAndFreeze<T>(payload: T): T {\n const cloned = BaseDomainEvent.deepClone(payload);\n return BaseDomainEvent.deepFreeze(cloned);\n }\n\n /**\n * Creates a new Domain Event.\n *\n * The payload is cloned and deep-frozen to ensure immutability. The original\n * object passed in remains unmodified. Any attempt to modify the event's\n * payload after creation will throw a TypeError in strict mode.\n *\n * @param eventName - The name of the event (e.g., 'OrderPlaced', 'UserRegistered')\n * @param aggregateId - The ID of the aggregate that raised this event\n * @param payload - The event-specific data (will be cloned and deep-frozen)\n * @param eventId - Optional custom event ID (defaults to crypto.randomUUID())\n * @param occurredOn - Optional timestamp (defaults to now)\n */\n protected constructor(\n eventName: string,\n aggregateId: string,\n payload: TPayload,\n eventId?: string,\n occurredOn?: Date,\n ) {\n this._eventId = eventId ?? crypto.randomUUID();\n this._eventName = eventName;\n this._aggregateId = aggregateId;\n this._occurredOn = occurredOn ?? new Date();\n this._payload = BaseDomainEvent.cloneAndFreeze(payload);\n }\n\n /**\n * Unique identifier for this event instance.\n *\n * Useful for idempotency checks and event deduplication.\n */\n public get eventId(): string {\n return this._eventId;\n }\n\n /**\n * The name/type of this event.\n *\n * Used for routing events to appropriate handlers.\n * Should be in PastTense format (e.g., 'OrderPlaced', 'UserRegistered').\n */\n public get eventName(): string {\n return this._eventName;\n }\n\n /**\n * The ID of the aggregate that raised this event.\n *\n * Useful for event sourcing and aggregate-specific event streams.\n */\n public get aggregateId(): string {\n return this._aggregateId;\n }\n\n /**\n * Timestamp when this event occurred.\n *\n * Represents the moment the domain action happened.\n */\n public get occurredOn(): Date {\n return this._occurredOn;\n }\n\n /**\n * The event-specific data payload.\n *\n * Contains all information needed by event handlers.\n */\n public get payload(): TPayload {\n return this._payload;\n }\n\n /**\n * Serializes the event to a plain object for persistence or messaging.\n *\n * @returns A plain object representation of the event\n *\n * @example\n * ```typescript\n * const event = new OrderPlacedEvent({ orderId: '123', ... });\n * const serialized = event.toJSON();\n * // {\n * // eventId: 'uuid',\n * // eventName: 'OrderPlaced',\n * // aggregateId: '123',\n * // occurredOn: '2024-01-15T10:30:00.000Z',\n * // payload: { orderId: '123', ... }\n * // }\n * ```\n */\n public toJSON(): {\n eventId: string;\n eventName: string;\n aggregateId: string;\n occurredOn: string;\n payload: TPayload;\n } {\n return {\n eventId: this._eventId,\n eventName: this._eventName,\n aggregateId: this._aggregateId,\n occurredOn: this._occurredOn.toISOString(),\n payload: this._payload,\n };\n }\n}\n","import { ErrorCodes, type DomainErrorCode } from '../../../global/exceptions/error-codes.const';\nimport { DomainError } from './domain.error';\n\n/**\n * Error thrown when an entity or aggregate is partially loaded.\n *\n * Indicates that required data is missing, typically due to incomplete\n * database queries or lazy loading issues. This error should not escape\n * the application boundary—it represents an internal system failure.\n *\n * **When to throw:**\n * - Required relation not loaded\n * - Aggregate missing expected child entities\n * - Incomplete projection from data layer\n *\n * @example\n * ```typescript\n * if (!order.customer) {\n * throw new PartialLoadError({\n * message: 'Order customer relation not loaded',\n * code: 'ORDER_CUSTOMER_NOT_LOADED',\n * });\n * }\n * ```\n *\n * @extends DomainError\n */\nexport class PartialLoadError extends DomainError {\n /**\n * Creates a new PartialLoadError instance.\n *\n * @param options - Error configuration\n * @param options.message - Description of what was not loaded\n * @param options.code - Machine-readable error code (default: 'PARTIAL_LOAD')\n * @param options.cause - Optional underlying error\n */\n constructor({\n message,\n code = ErrorCodes.Domain.PARTIAL_LOAD,\n cause,\n }: {\n message: string;\n code?: DomainErrorCode | string;\n cause?: unknown;\n }) {\n super({ message, code, cause });\n }\n\n /**\n * Creates a PartialLoadError from a caught error.\n *\n * @param cause - The original caught error\n * @returns A new PartialLoadError instance with the cause attached\n */\n static override fromError(cause: unknown): PartialLoadError {\n return new PartialLoadError({\n message: cause instanceof Error ? cause.message : 'Partial load error',\n cause,\n });\n }\n}\n","import { BaseValueObject, SKIP_VALUE_OBJECT_VALIDATION } from '../../classes';\nimport { InvariantViolationError } from '../../exceptions/invariant-violation.error';\n\n/**\n * The underlying value structure for Money.\n */\nexport interface MoneyValue {\n amount: number;\n currency: string;\n}\n\n/**\n * Value Object representing a monetary amount with currency.\n *\n * Provides arithmetic operations and comparison methods.\n * Prevents operations between different currencies.\n *\n * @example\n * ```typescript\n * const price = Money.usd(29.99);\n * const tax = Money.usd(2.40);\n * const total = price.add(tax);\n *\n * console.log(total.amount); // 32.39\n * console.log(total.currency); // 'USD'\n *\n * if (total.isGreaterThan(Money.usd(30))) {\n * // Apply discount\n * }\n * ```\n */\nexport class Money extends BaseValueObject<MoneyValue> {\n /**\n * Creates a Money instance with USD currency.\n *\n * @param amount - The monetary amount\n */\n static usd(amount: number): Money {\n return new Money({ amount, currency: 'USD' }, SKIP_VALUE_OBJECT_VALIDATION);\n }\n\n /**\n * Creates a Money instance with EUR currency.\n *\n * @param amount - The monetary amount\n */\n static eur(amount: number): Money {\n return new Money({ amount, currency: 'EUR' }, SKIP_VALUE_OBJECT_VALIDATION);\n }\n\n /**\n * Creates a zero amount in the specified currency.\n *\n * @param currency - The currency code (default: 'USD')\n */\n static zero(currency = 'USD'): Money {\n return new Money({ amount: 0, currency }, SKIP_VALUE_OBJECT_VALIDATION);\n }\n\n /**\n * Reconstitutes a Money from a persisted value.\n *\n * @param value - The money value from persistence\n */\n static fromPersistence(value: MoneyValue): Money {\n return new Money(value, SKIP_VALUE_OBJECT_VALIDATION);\n }\n\n /**\n * The monetary amount.\n */\n get amount(): number {\n return this.value.amount;\n }\n\n /**\n * The currency code.\n */\n get currency(): string {\n return this.value.currency;\n }\n\n /**\n * Adds another Money value to this one.\n *\n * @param other - The Money to add\n * @throws {InvariantViolationError} If currencies don't match\n */\n add(other: Money): Money {\n this.assertSameCurrency(other);\n return new Money(\n { amount: this.amount + other.amount, currency: this.currency },\n SKIP_VALUE_OBJECT_VALIDATION,\n );\n }\n\n /**\n * Subtracts another Money value from this one.\n *\n * @param other - The Money to subtract\n * @throws {InvariantViolationError} If currencies don't match\n */\n subtract(other: Money): Money {\n this.assertSameCurrency(other);\n return new Money(\n { amount: this.amount - other.amount, currency: this.currency },\n SKIP_VALUE_OBJECT_VALIDATION,\n );\n }\n\n /**\n * Multiplies this Money by a factor.\n *\n * @param factor - The multiplication factor\n */\n multiply(factor: number): Money {\n return new Money(\n { amount: this.amount * factor, currency: this.currency },\n SKIP_VALUE_OBJECT_VALIDATION,\n );\n }\n\n /**\n * Checks if this Money is greater than another.\n *\n * @param other - The Money to compare with\n * @throws {InvariantViolationError} If currencies don't match\n */\n isGreaterThan(other: Money): boolean {\n this.assertSameCurrency(other);\n return this.amount > other.amount;\n }\n\n /**\n * Checks if this Money is less than another.\n *\n * @param other - The Money to compare with\n * @throws {InvariantViolationError} If currencies don't match\n */\n isLessThan(other: Money): boolean {\n this.assertSameCurrency(other);\n return this.amount < other.amount;\n }\n\n /**\n * Checks if this Money represents zero.\n */\n isZero(): boolean {\n return this.amount === 0;\n }\n\n /**\n * Asserts that two Money values have the same currency.\n * @internal\n */\n private assertSameCurrency(other: Money): void {\n if (this.currency !== other.currency) {\n throw new InvariantViolationError({\n message: `Cannot operate on different currencies: ${this.currency} vs ${other.currency}`,\n code: 'CURRENCY_MISMATCH',\n });\n }\n }\n}\n","import { BaseUuidV7Vo } from '../../value-objects/base-uuid-v7.vo';\n\n/**\n * Value Object representing an Order's unique identifier.\n *\n * Extends BaseUuidV7Vo to use time-ordered UUIDs for better\n * database indexing and natural ordering.\n *\n * @example\n * ```typescript\n * const orderId = OrderId.create();\n * console.log(orderId.value); // '01902e8a-7c3b-7def-8a1b-...'\n *\n * orderId.equals(anotherOrderId); // true if same value\n * ```\n */\nexport class OrderId extends BaseUuidV7Vo {}\n","import { BaseValueObject, SKIP_VALUE_OBJECT_VALIDATION } from '../../classes';\n\n/**\n * Possible values for an order's status.\n */\nexport type OrderStatusValue = 'pending' | 'confirmed' | 'shipped' | 'cancelled';\n\n/**\n * Value Object representing an Order's status.\n *\n * Provides type-safe status values with behavior methods for checking state.\n * Uses static factory methods to ensure only valid statuses can be created.\n *\n * @example\n * ```typescript\n * const status = OrderStatus.pending();\n *\n * if (status.isPending()) {\n * // Can modify order\n * }\n *\n * if (status.isShipped()) {\n * // Cannot cancel\n * }\n * ```\n */\nexport class OrderStatus extends BaseValueObject<OrderStatusValue> {\n /**\n * Creates a new OrderStatus with 'pending' value.\n * Use when creating new orders.\n */\n static pending(): OrderStatus {\n return new OrderStatus('pending', SKIP_VALUE_OBJECT_VALIDATION);\n }\n\n /**\n * Creates a new OrderStatus with 'confirmed' value.\n * Use when payment is received.\n */\n static confirmed(): OrderStatus {\n return new OrderStatus('confirmed', SKIP_VALUE_OBJECT_VALIDATION);\n }\n\n /**\n * Creates a new OrderStatus with 'shipped' value.\n * Use when order is dispatched.\n */\n static shipped(): OrderStatus {\n return new OrderStatus('shipped', SKIP_VALUE_OBJECT_VALIDATION);\n }\n\n /**\n * Creates a new OrderStatus with 'cancelled' value.\n * Use when order is cancelled by customer or system.\n */\n static cancelled(): OrderStatus {\n return new OrderStatus('cancelled', SKIP_VALUE_OBJECT_VALIDATION);\n }\n\n /**\n * Reconstitutes an OrderStatus from a persisted value.\n *\n * @param value - The status value from persistence\n */\n static fromPersistence(value: OrderStatusValue): OrderStatus {\n return new OrderStatus(value, SKIP_VALUE_OBJECT_VALIDATION);\n }\n\n /**\n * Checks if the order is in pending status.\n */\n isPending(): boolean {\n return this.value === 'pending';\n }\n\n /**\n * Checks if the order is confirmed.\n */\n isConfirmed(): boolean {\n return this.value === 'confirmed';\n }\n\n /**\n * Checks if the order has been shipped.\n */\n isShipped(): boolean {\n return this.value === 'shipped';\n }\n\n /**\n * Checks if the order has been cancelled.\n */\n isCancelled(): boolean {\n return this.value === 'cancelled';\n }\n\n /**\n * Checks if the order can still be modified (pending or confirmed).\n */\n isModifiable(): boolean {\n return this.isPending() || this.isConfirmed();\n }\n}\n","import { BaseDomainEvent } from '../../classes';\n\n/**\n * Payload for the OrderCancelled domain event.\n */\nexport interface OrderCancelledPayload {\n orderId: string;\n reason: string;\n cancelledAt: string;\n}\n\n/**\n * Domain event raised when an order is cancelled.\n *\n * @example\n * ```typescript\n * order.addDomainEvent(new OrderCancelledEvent({\n * orderId: order.id.value,\n * reason: 'Customer requested cancellation',\n * cancelledAt: new Date().toISOString(),\n * }));\n * ```\n */\nexport class OrderCancelledEvent extends BaseDomainEvent<OrderCancelledPayload> {\n constructor(payload: OrderCancelledPayload) {\n super('OrderCancelled', payload.orderId, payload);\n }\n}\n","import { BaseDomainEvent } from '../../classes';\n\n/**\n * Payload for the OrderPlaced domain event.\n */\nexport interface OrderPlacedPayload {\n orderId: string;\n customerId: string;\n itemCount: number;\n totalAmount: number;\n currency: string;\n placedAt: string;\n}\n\n/**\n * Domain event raised when a new order is placed.\n *\n * @example\n * ```typescript\n * order.addDomainEvent(new OrderPlacedEvent({\n * orderId: order.id.value,\n * customerId: order.customerId,\n * itemCount: order.items.length,\n * totalAmount: order.totalAmount.amount,\n * currency: order.totalAmount.currency,\n * placedAt: new Date().toISOString(),\n * }));\n * ```\n */\nexport class OrderPlacedEvent extends BaseDomainEvent<OrderPlacedPayload> {\n constructor(payload: OrderPlacedPayload) {\n super('OrderPlaced', payload.orderId, payload);\n }\n}\n","import { OrderStatus } from '../../../../value-objects';\n\n/**\n * Value Policy: Default order status for new orders.\n *\n * New orders start in 'pending' status, awaiting payment confirmation.\n *\n * @returns The default OrderStatus (pending)\n *\n * @example\n * ```typescript\n * const order = new Order(id, {\n * status: defaultOrderStatus(),\n * // ...\n * });\n * ```\n */\nexport const defaultOrderStatus = (): OrderStatus => {\n return OrderStatus.pending();\n};\n","import type { Order } from '../../order.aggregate';\n\n/**\n * Business Policy: Determines if items can be added to an order.\n *\n * Items can only be added to orders that are still in 'pending' status.\n * Once an order is confirmed, shipped, or cancelled, items cannot be added.\n *\n * @param order - The order to check\n * @returns `true` if items can be added to the order\n *\n * @example\n * ```typescript\n * if (!canAddOrderItem(order)) {\n * throw new InvariantViolationError({\n * message: 'Cannot add items to non-pending order',\n * code: 'ORDER_NOT_PENDING',\n * });\n * }\n * ```\n */\nexport const canAddOrderItem = (order: Order): boolean => {\n return order.status.isPending();\n};\n","import type { Order } from '../../order.aggregate';\n\n/**\n * Business Policy: Determines if an order can be cancelled.\n *\n * Orders can only be cancelled if they have not yet been shipped.\n * Once an order is shipped or delivered, it cannot be cancelled.\n *\n * @param order - The order to check\n * @returns `true` if the order can be cancelled\n *\n * @example\n * ```typescript\n * if (!canCancelOrder(order)) {\n * throw new InvariantViolationError({\n * message: 'Order cannot be cancelled',\n * code: 'ORDER_CANNOT_CANCEL',\n * });\n * }\n * ```\n */\nexport const canCancelOrder = (order: Order): boolean => {\n return order.status.isPending() || order.status.isConfirmed();\n};\n","import { BaseAggregateRoot } from '../../../classes';\nimport { InvariantViolationError } from '../../../exceptions/invariant-violation.error';\nimport { OrderId, OrderStatus, Money } from '../../value-objects';\nimport type { OrderItem } from '../../entities';\nimport { OrderPlacedEvent, OrderCancelledEvent } from '../../events';\nimport { defaultOrderStatus } from './policies/value';\nimport { canCancelOrder, canAddOrderItem } from './policies/business';\n\n/**\n * Properties for the Order aggregate.\n */\nexport interface OrderProps {\n customerId: string;\n items: OrderItem[];\n status: OrderStatus;\n totalAmount: Money;\n placedAt: Date;\n}\n\n/**\n * Order Aggregate Root.\n *\n * Represents a customer's order with line items. The Order is the aggregate root\n * and controls access to its OrderItems. All modifications go through the Order\n * to ensure business invariants are maintained.\n *\n * **Policies used:**\n * - Value: `defaultOrderStatus` - New orders start as 'pending'\n * - Business: `canAddOrderItem` - Items can only be added to pending orders\n * - Business: `canCancelOrder` - Orders can only be cancelled if not shipped\n *\n * **Events raised:**\n * - `OrderPlacedEvent` - When order is created\n * - `OrderCancelledEvent` - When order is cancelled\n *\n * @example\n * ```typescript\n * // Create a new order\n * const order = Order.create('customer-123', [\n * OrderItem.create({\n * productId: 'prod-1',\n * productName: 'Widget',\n * quantity: 2,\n * unitPrice: Money.usd(29.99),\n * }),\n * ]);\n *\n * // Add another item\n * order.addItem(OrderItem.create({\n * productId: 'prod-2',\n * productName: 'Gadget',\n * quantity: 1,\n * unitPrice: Money.usd(49.99),\n * }));\n *\n * // Cancel the order\n * order.cancel('Customer changed their mind');\n *\n * // Get events for publishing\n * const events = order.pullDomainEvents();\n * ```\n */\nexport class Order extends BaseAggregateRoot<OrderId, OrderProps> {\n private constructor(id: OrderId, props: OrderProps, version?: number) {\n super(id, props, version);\n }\n\n /**\n * Creates a new Order.\n *\n * @param customerId - The customer placing the order\n * @param items - Initial order items\n * @returns A new Order instance with OrderPlacedEvent raised\n */\n static create(customerId: string, items: OrderItem[]): Order {\n const id = OrderId.generate();\n const totalAmount = items.reduce((sum, item) => sum.add(item.totalPrice), Money.zero());\n\n const order = new Order(id, {\n customerId,\n items,\n status: defaultOrderStatus(),\n totalAmount,\n placedAt: new Date(),\n });\n\n order.addDomainEvent(\n new OrderPlacedEvent({\n orderId: id.value,\n customerId,\n itemCount: items.length,\n totalAmount: totalAmount.amount,\n currency: totalAmount.currency,\n placedAt: order.placedAt.toISOString(),\n }),\n );\n\n return order;\n }\n\n /**\n * Reconstitutes an Order from persistence.\n *\n * @param id - The order ID\n * @param props - The order properties\n * @param version - The version for optimistic locking\n */\n static fromPersistence(id: OrderId, props: OrderProps, version: number): Order {\n return new Order(id, props, version);\n }\n\n get customerId(): string {\n return this.props.customerId;\n }\n\n get items(): readonly OrderItem[] {\n return this.props.items;\n }\n\n get status(): OrderStatus {\n return this.props.status;\n }\n\n get totalAmount(): Money {\n return this.props.totalAmount;\n }\n\n get placedAt(): Date {\n return this.props.placedAt;\n }\n\n /**\n * Adds an item to the order.\n *\n * Uses the `canAddOrderItem` business policy to check if the operation is allowed.\n *\n * @param item - The item to add\n * @throws {InvariantViolationError} If the order is not in pending status\n */\n addItem(item: OrderItem): void {\n if (!canAddOrderItem(this)) {\n throw new InvariantViolationError({\n message: 'Cannot add items to non-pending order',\n code: 'ORDER_NOT_PENDING',\n });\n }\n\n this._props.items.push(item);\n this._props.totalAmount = this._props.totalAmount.add(item.totalPrice);\n }\n\n /**\n * Confirms the order (e.g., after payment received).\n *\n * @throws {InvariantViolationError} If the order is not in pending status\n */\n confirm(): void {\n if (!this.status.isPending()) {\n throw new InvariantViolationError({\n message: 'Only pending orders can be confirmed',\n code: 'ORDER_NOT_PENDING',\n });\n }\n\n this._props.status = OrderStatus.confirmed();\n }\n\n /**\n * Marks the order as shipped.\n *\n * @throws {InvariantViolationError} If the order is not confirmed\n */\n ship(): void {\n if (!this.status.isConfirmed()) {\n throw new InvariantViolationError({\n message: 'Only confirmed orders can be shipped',\n code: 'ORDER_NOT_CONFIRMED',\n });\n }\n\n this._props.status = OrderStatus.shipped();\n }\n\n /**\n * Cancels the order.\n *\n * Uses the `canCancelOrder` business policy to check if the operation is allowed.\n *\n * @param reason - The reason for cancellation\n * @throws {InvariantViolationError} If the order cannot be cancelled\n */\n cancel(reason: string): void {\n if (!canCancelOrder(this)) {\n throw new InvariantViolationError({\n message: 'Order cannot be cancelled - already shipped or cancelled',\n code: 'ORDER_CANNOT_CANCEL',\n });\n }\n\n this._props.status = OrderStatus.cancelled();\n\n this.addDomainEvent(\n new OrderCancelledEvent({\n orderId: this.id.value,\n reason,\n cancelledAt: new Date().toISOString(),\n }),\n );\n }\n}\n","import { BaseUuidV7Vo } from '../../value-objects/base-uuid-v7.vo';\n\n/**\n * Value Object representing an OrderItem's unique identifier.\n */\nexport class OrderItemId extends BaseUuidV7Vo {}\n","import { BaseEntity } from '../../classes';\nimport { OrderItemId } from './order-item-id.vo';\nimport type { Money } from '../value-objects';\n\n/**\n * Properties for an OrderItem entity.\n */\nexport interface OrderItemProps {\n productId: string;\n productName: string;\n quantity: number;\n unitPrice: Money;\n}\n\n/**\n * Entity representing a line item within an Order aggregate.\n *\n * OrderItem is not an aggregate root - it's accessed through the Order aggregate.\n * It has its own identity but cannot exist independently of an Order.\n *\n * @example\n * ```typescript\n * const item = OrderItem.create({\n * productId: 'prod-123',\n * productName: 'Widget',\n * quantity: 2,\n * unitPrice: Money.usd(29.99),\n * });\n *\n * console.log(item.totalPrice.amount); // 59.98\n * ```\n */\nexport class OrderItem extends BaseEntity<OrderItemId, OrderItemProps> {\n private constructor(id: OrderItemId, props: OrderItemProps) {\n super(id, props);\n }\n\n /**\n * Creates a new OrderItem.\n */\n static create(props: OrderItemProps): OrderItem {\n return new OrderItem(OrderItemId.generate(), props);\n }\n\n /**\n * Reconstitutes an OrderItem from persistence.\n */\n static fromPersistence(id: OrderItemId, props: OrderItemProps): OrderItem {\n return new OrderItem(id, props);\n }\n\n get productId(): string {\n return this.props.productId;\n }\n\n get productName(): string {\n return this.props.productName;\n }\n\n get quantity(): number {\n return this.props.quantity;\n }\n\n get unitPrice(): Money {\n return this.props.unitPrice;\n }\n\n /**\n * Calculates the total price for this line item.\n */\n get totalPrice(): Money {\n return this.props.unitPrice.multiply(this.props.quantity);\n }\n\n /**\n * Updates the quantity of this item.\n */\n updateQuantity(newQuantity: number): void {\n this._props.quantity = newQuantity;\n }\n\n /**\n * Converts to a plain object for events or persistence.\n */\n toPlain(): {\n id: string;\n productId: string;\n productName: string;\n quantity: number;\n unitPrice: { amount: number; currency: string };\n } {\n return {\n id: this.id.value,\n productId: this.props.productId,\n productName: this.props.productName,\n quantity: this.props.quantity,\n unitPrice: {\n amount: this.props.unitPrice.amount,\n currency: this.props.unitPrice.currency,\n },\n };\n }\n}\n","import { InvariantViolationError } from '../../exceptions/invariant-violation.error';\n\n/**\n * Error thrown when attempting to modify an order that has already been shipped.\n *\n * @example\n * ```typescript\n * if (order.status.isShipped()) {\n * throw new OrderAlreadyShippedError(order.id.value);\n * }\n * ```\n */\nexport class OrderAlreadyShippedError extends InvariantViolationError {\n constructor(orderId: string) {\n super({\n message: `Order ${orderId} has already been shipped and cannot be modified`,\n code: 'ORDER_ALREADY_SHIPPED',\n });\n }\n}\n","import { InfraError } from '../exceptions/infra.error';\n\n/** @internal Function signature for wrapped methods. */\ntype UnknownFn = (...args: unknown[]) => unknown;\n\n/** @internal Symbol to mark methods that have been wrapped on a prototype. */\nconst WRAPPED_METHODS_SYMBOL = Symbol.for('onion-lasagna:wrapped-methods');\n\n/** @internal Get or create the set of wrapped method names for a prototype. */\nfunction getWrappedMethods(proto: object): Set<string> {\n const existing = (proto as Record<symbol, Set<string>>)[WRAPPED_METHODS_SYMBOL];\n if (existing) return existing;\n\n const newSet = new Set<string>();\n Object.defineProperty(proto, WRAPPED_METHODS_SYMBOL, {\n value: newSet,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n return newSet;\n}\n\n/**\n * Abstract base class for outbound adapters (secondary/driven ports).\n *\n * Provides automatic error handling for all subclass methods by:\n * - Wrapping synchronous methods with try/catch\n * - Attaching `.catch()` handlers to Promise-returning methods\n * - Converting all errors to {@link InfraError} with the original as `cause`\n *\n * This ensures infrastructure errors are properly typed and don't leak\n * implementation details to the application layer.\n *\n * @example\n * ```typescript\n * class UserRepository extends BaseOutboundAdapter {\n * constructor(private db: Database) {\n * super();\n * }\n *\n * async findById(id: string): Promise<User | null> {\n * return this.db.users.findUnique({ where: { id } });\n * }\n *\n * protected override createInfraError(error: unknown, methodName: string): InfraError {\n * return new DbError({\n * message: `Database error in ${methodName}`,\n * cause: error,\n * });\n * }\n * }\n * ```\n */\nexport abstract class BaseOutboundAdapter {\n /**\n * Initializes the adapter and wraps all subclass methods with error handling.\n * Must be called via `super()` in subclass constructors.\n */\n protected constructor() {\n this.wrapAllSubclassMethods();\n }\n\n /**\n * Factory method for creating infrastructure errors.\n *\n * Override this in subclasses to return specific error types\n * (e.g., `DbError`, `NetworkError`, `ExternalServiceError`).\n *\n * @param error - The original error that was caught\n * @param methodName - Name of the method where the error occurred (for debugging)\n * @returns An InfraError instance wrapping the original error\n */\n protected createInfraError(error: unknown, methodName: string): InfraError {\n return new InfraError({\n message: `Outbound adapter error in ${methodName}`,\n cause: error,\n });\n }\n\n /**\n * Walks the prototype chain and wraps all methods with error handling.\n * Uses prototype-level Symbol markers to prevent re-wrapping across instances.\n * @internal\n */\n private wrapAllSubclassMethods(): void {\n const wrapMethod = (methodName: string, original: UnknownFn) => {\n const wrapped: UnknownFn = (...args: unknown[]) => {\n try {\n const result = Reflect.apply(original, this, args);\n\n // If it's a Promise, preserve rejection handling without turning sync methods into async ones.\n if (result instanceof Promise) {\n return result.catch((error: unknown) => {\n throw this.createInfraError(error, methodName);\n });\n }\n\n return result;\n } catch (error) {\n throw this.createInfraError(error, methodName);\n }\n };\n\n Object.defineProperty(this, methodName, {\n value: wrapped,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n };\n\n // Collect all method names that need wrapping (checking prototype-level markers)\n const methodsToWrap: { name: string; fn: UnknownFn }[] = [];\n\n // Walk the prototype chain until this base class.\n let proto: object | null = Object.getPrototypeOf(this);\n while (proto && proto !== BaseOutboundAdapter.prototype && proto !== Object.prototype) {\n const wrappedOnProto = getWrappedMethods(proto);\n\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key === 'constructor') continue;\n\n // Check if already wrapped at prototype level (across all instances)\n if (wrappedOnProto.has(key)) continue;\n\n const descriptor = Object.getOwnPropertyDescriptor(proto, key);\n if (!descriptor) continue;\n\n // Skip getters/setters - only wrap regular methods\n if (descriptor.get || descriptor.set) continue;\n if (typeof descriptor.value !== 'function') continue;\n\n methodsToWrap.push({ name: key, fn: descriptor.value as UnknownFn });\n wrappedOnProto.add(key);\n }\n\n proto = Object.getPrototypeOf(proto);\n }\n\n // Apply wrapping to this instance\n for (const { name, fn } of methodsToWrap) {\n wrapMethod(name, fn);\n }\n }\n}\n","import { ErrorCodes, type InfraErrorCode } from '../../../global/exceptions/error-codes.const';\nimport { InfraError } from './infra.error';\n\n/**\n * Error thrown when a database operation fails.\n *\n * Wraps database-specific errors (connection failures, query errors,\n * constraint violations) into a transport-agnostic infrastructure error.\n *\n * **When to throw:**\n * - Database connection lost\n * - Query execution failed\n * - Transaction rollback\n * - Constraint violation (unique, foreign key)\n *\n * @example\n * ```typescript\n * try {\n * await this.db.query('SELECT * FROM users');\n * } catch (error) {\n * throw new DbError({\n * message: 'Failed to fetch users',\n * code: 'USER_QUERY_FAILED',\n * cause: error,\n * });\n * }\n * ```\n *\n * @extends InfraError\n */\nexport class DbError extends InfraError {\n /**\n * Creates a new DbError instance.\n *\n * @param options - Error configuration\n * @param options.message - Description of the database failure\n * @param options.code - Machine-readable error code (default: 'DB_ERROR')\n * @param options.cause - Optional underlying database error\n */\n constructor({\n message,\n code = ErrorCodes.Infra.DB_ERROR,\n cause,\n }: {\n message: string;\n code?: InfraErrorCode | string;\n cause?: unknown;\n }) {\n super({ message, code, cause });\n }\n\n /**\n * Creates a DbError from a caught error.\n *\n * @param cause - The original caught error\n * @returns A new DbError instance with the cause attached\n */\n static override fromError(cause: unknown): DbError {\n return new DbError({\n message: cause instanceof Error ? cause.message : 'Database error',\n cause,\n });\n }\n}\n","import { ErrorCodes, type InfraErrorCode } from '../../../global/exceptions/error-codes.const';\nimport { InfraError } from './infra.error';\n\n/**\n * Error thrown when a network operation fails.\n *\n * Indicates connectivity issues such as DNS resolution failures,\n * connection refused, or network unreachable errors.\n *\n * **When to throw:**\n * - Connection refused\n * - DNS resolution failed\n * - Network unreachable\n * - Socket errors\n *\n * @example\n * ```typescript\n * try {\n * await fetch('https://api.example.com/data');\n * } catch (error) {\n * throw new NetworkError({\n * message: 'Failed to connect to API',\n * code: 'API_CONNECTION_FAILED',\n * cause: error,\n * });\n * }\n * ```\n *\n * @extends InfraError\n */\nexport class NetworkError extends InfraError {\n /**\n * Creates a new NetworkError instance.\n *\n * @param options - Error configuration\n * @param options.message - Description of the network failure\n * @param options.code - Machine-readable error code (default: 'NETWORK_ERROR')\n * @param options.cause - Optional underlying network error\n */\n constructor({\n message,\n code = ErrorCodes.Infra.NETWORK_ERROR,\n cause,\n }: {\n message: string;\n code?: InfraErrorCode | string;\n cause?: unknown;\n }) {\n super({ message, code, cause });\n }\n\n /**\n * Creates a NetworkError from a caught error.\n *\n * @param cause - The original caught error\n * @returns A new NetworkError instance with the cause attached\n */\n static override fromError(cause: unknown): NetworkError {\n return new NetworkError({\n message: cause instanceof Error ? cause.message : 'Network error',\n cause,\n });\n }\n}\n","import { ErrorCodes, type InfraErrorCode } from '../../../global/exceptions/error-codes.const';\nimport { InfraError } from './infra.error';\n\n/**\n * Error thrown when an operation exceeds its time limit.\n *\n * Indicates that a request or operation took longer than the\n * configured timeout threshold.\n *\n * **When to throw:**\n * - Request timeout exceeded\n * - Database query timeout\n * - External API response timeout\n * - Lock acquisition timeout\n *\n * @example\n * ```typescript\n * const controller = new AbortController();\n * setTimeout(() => controller.abort(), 5000);\n *\n * try {\n * await fetch(url, { signal: controller.signal });\n * } catch (error) {\n * throw new TimeoutError({\n * message: 'Request timed out after 5 seconds',\n * code: 'REQUEST_TIMEOUT',\n * cause: error,\n * });\n * }\n * ```\n *\n * @extends InfraError\n */\nexport class TimeoutError extends InfraError {\n /**\n * Creates a new TimeoutError instance.\n *\n * @param options - Error configuration\n * @param options.message - Description of what timed out\n * @param options.code - Machine-readable error code (default: 'TIMEOUT_ERROR')\n * @param options.cause - Optional underlying timeout error\n */\n constructor({\n message,\n code = ErrorCodes.Infra.TIMEOUT_ERROR,\n cause,\n }: {\n message: string;\n code?: InfraErrorCode | string;\n cause?: unknown;\n }) {\n super({ message, code, cause });\n }\n\n /**\n * Creates a TimeoutError from a caught error.\n *\n * @param cause - The original caught error\n * @returns A new TimeoutError instance with the cause attached\n */\n static override fromError(cause: unknown): TimeoutError {\n return new TimeoutError({\n message: cause instanceof Error ? cause.message : 'Operation timed out',\n cause,\n });\n }\n}\n","import { ErrorCodes, type InfraErrorCode } from '../../../global/exceptions/error-codes.const';\nimport { InfraError } from './infra.error';\n\n/**\n * Error thrown when a third-party service call fails.\n *\n * Wraps errors from external APIs, payment gateways, email services,\n * or any other third-party dependency.\n *\n * **When to throw:**\n * - Third-party API returns an error\n * - External service is unavailable\n * - Unexpected response from external service\n * - Rate limiting by external service\n *\n * @example\n * ```typescript\n * try {\n * await this.paymentGateway.charge(amount);\n * } catch (error) {\n * throw new ExternalServiceError({\n * message: 'Payment gateway charge failed',\n * code: 'PAYMENT_GATEWAY_ERROR',\n * cause: error,\n * });\n * }\n * ```\n *\n * @extends InfraError\n */\nexport class ExternalServiceError extends InfraError {\n /**\n * Creates a new ExternalServiceError instance.\n *\n * @param options - Error configuration\n * @param options.message - Description of the external service failure\n * @param options.code - Machine-readable error code (default: 'EXTERNAL_SERVICE_ERROR')\n * @param options.cause - Optional underlying service error\n */\n constructor({\n message,\n code = ErrorCodes.Infra.EXTERNAL_SERVICE_ERROR,\n cause,\n }: {\n message: string;\n code?: InfraErrorCode | string;\n cause?: unknown;\n }) {\n super({ message, code, cause });\n }\n\n /**\n * Creates an ExternalServiceError from a caught error.\n *\n * @param cause - The original caught error\n * @returns A new ExternalServiceError instance with the cause attached\n */\n static override fromError(cause: unknown): ExternalServiceError {\n return new ExternalServiceError({\n message: cause instanceof Error ? cause.message : 'External service error',\n cause,\n });\n }\n}\n"],"mappings":"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","names":[]}