@cosmneo/onion-lasagna 0.3.0 → 0.4.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 (74) hide show
  1. package/dist/{chunk-XWKHOLIP.js → chunk-4HMXTGHK.js} +2 -2
  2. package/dist/chunk-4RFWJ5XZ.js +192 -0
  3. package/dist/chunk-4RFWJ5XZ.js.map +1 -0
  4. package/dist/{chunk-4BVOLXDJ.js → chunk-4YBAV6LZ.js} +2 -2
  5. package/dist/chunk-ANLXZHUS.js +230 -0
  6. package/dist/chunk-ANLXZHUS.js.map +1 -0
  7. package/dist/chunk-BG2FY27M.js +36 -0
  8. package/dist/chunk-BG2FY27M.js.map +1 -0
  9. package/dist/chunk-FEY2GSVT.js +1 -0
  10. package/dist/chunk-FEY2GSVT.js.map +1 -0
  11. package/dist/{chunk-2BVCU32G.js → chunk-HNEAH6OZ.js} +121 -2
  12. package/dist/chunk-HNEAH6OZ.js.map +1 -0
  13. package/dist/chunk-NQMFWI6Q.js +1 -0
  14. package/dist/chunk-NQMFWI6Q.js.map +1 -0
  15. package/dist/chunk-TZRBETT3.js +127 -0
  16. package/dist/chunk-TZRBETT3.js.map +1 -0
  17. package/dist/{chunk-MF2JDREK.js → chunk-UNVB4INM.js} +1 -1
  18. package/dist/{chunk-MF2JDREK.js.map → chunk-UNVB4INM.js.map} +1 -1
  19. package/dist/chunk-VBG3UYQR.js +119 -0
  20. package/dist/chunk-VBG3UYQR.js.map +1 -0
  21. package/dist/events/index.js +3 -4
  22. package/dist/events/server/index.js +3 -4
  23. package/dist/events/shared/index.js +2 -3
  24. package/dist/graphql/field/index.cjs +189 -0
  25. package/dist/graphql/field/index.cjs.map +1 -0
  26. package/dist/graphql/field/index.d.cts +214 -0
  27. package/dist/graphql/field/index.d.ts +214 -0
  28. package/dist/graphql/field/index.js +25 -0
  29. package/dist/graphql/field/index.js.map +1 -0
  30. package/dist/graphql/index.cjs +1148 -0
  31. package/dist/graphql/index.cjs.map +1 -0
  32. package/dist/graphql/index.d.cts +8 -0
  33. package/dist/graphql/index.d.ts +8 -0
  34. package/dist/graphql/index.js +49 -0
  35. package/dist/graphql/index.js.map +1 -0
  36. package/dist/graphql/sdl/index.cjs +241 -0
  37. package/dist/graphql/sdl/index.cjs.map +1 -0
  38. package/dist/graphql/sdl/index.d.cts +77 -0
  39. package/dist/graphql/sdl/index.d.ts +77 -0
  40. package/dist/graphql/sdl/index.js +8 -0
  41. package/dist/graphql/sdl/index.js.map +1 -0
  42. package/dist/graphql/server/index.cjs +505 -0
  43. package/dist/graphql/server/index.cjs.map +1 -0
  44. package/dist/graphql/server/index.d.cts +268 -0
  45. package/dist/graphql/server/index.d.ts +268 -0
  46. package/dist/graphql/server/index.js +15 -0
  47. package/dist/graphql/server/index.js.map +1 -0
  48. package/dist/graphql/shared/index.cjs +586 -0
  49. package/dist/graphql/shared/index.cjs.map +1 -0
  50. package/dist/graphql/shared/index.d.cts +82 -0
  51. package/dist/graphql/shared/index.d.ts +82 -0
  52. package/dist/graphql/shared/index.js +16 -0
  53. package/dist/graphql/shared/index.js.map +1 -0
  54. package/dist/http/index.cjs.map +1 -1
  55. package/dist/http/index.js +2 -3
  56. package/dist/http/route/index.cjs.map +1 -1
  57. package/dist/http/route/index.d.cts +4 -0
  58. package/dist/http/route/index.d.ts +4 -0
  59. package/dist/http/route/index.js +1 -1
  60. package/dist/http/shared/index.js +1 -2
  61. package/dist/index.cjs +672 -0
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.d.cts +8 -0
  64. package/dist/index.d.ts +8 -0
  65. package/dist/index.js +43 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/schema-definition.type-C9PntBVc.d.cts +166 -0
  68. package/dist/schema-definition.type-CuhQLDr0.d.ts +166 -0
  69. package/package.json +31 -1
  70. package/dist/chunk-2BVCU32G.js.map +0 -1
  71. package/dist/chunk-H5TNDC5U.js +0 -138
  72. package/dist/chunk-H5TNDC5U.js.map +0 -1
  73. /package/dist/{chunk-XWKHOLIP.js.map → chunk-4HMXTGHK.js.map} +0 -0
  74. /package/dist/{chunk-4BVOLXDJ.js.map → chunk-4YBAV6LZ.js.map} +0 -0
package/dist/index.d.cts CHANGED
@@ -2,7 +2,15 @@ import { CodedError, AppErrorCode, DomainErrorCode, InfraErrorCode, Presentation
2
2
  export { ErrorCode, ErrorCodes, ErrorConstructor, ErrorFactory, GlobalErrorCode, ObjectValidationError, fieldChanged, wrapError, wrapErrorAsync, wrapErrorUnless, wrapErrorUnlessAsync } from './global.cjs';
3
3
  import { ValidationError } from './types.cjs';
4
4
  export { PaginatedData, PaginationInput } from './types.cjs';
5
+ export { DefineGraphQLSchemaOptions, defineGraphQLSchema, defineMutation, defineQuery, defineSubscription, generateFieldId, mergeGraphQLSchemas } from './graphql/field/index.cjs';
6
+ export { D as DeepMergeSchemas, h as DeepMergeSchemasAll, F as FlattenSchema, g as GetField, b as GraphQLFieldDefinition, a as GraphQLFieldDocumentation, G as GraphQLOperationType, d as GraphQLSchemaConfig, e as GraphQLSchemaDefaults, f as GraphQLSchemaDefinition, c as GraphQLSchemaEntry, k as InferFieldContext, i as InferFieldInput, I as InferFieldOperation, j as InferFieldOutput, S as SchemaKeys, n as collectFields, l as isFieldDefinition, m as isSchemaDefinition } from './schema-definition.type-C9PntBVc.cjs';
7
+ export { BuilderGraphQLHandlerConfig, CreateGraphQLRoutesOptions, GraphQLHandlerConfig, GraphQLHandlerContext, GraphQLMiddlewareFunction, GraphQLRoutesBuilder, MissingHandlersError, SimpleGraphQLHandlerConfig, SimpleGraphQLHandlerFn, TypedGraphQLContext, UnifiedGraphQLField, ValidatedArgs, graphqlRoutes, isSimpleGraphQLHandlerConfig } from './graphql/server/index.cjs';
8
+ export { GraphQLSDLConfig, generateGraphQLSDL } from './graphql/sdl/index.cjs';
9
+ export { GraphQLErrorCode, GraphQLErrorExtensions, GraphQLValidationErrorItem, MappedGraphQLError, getGraphQLErrorCode, mapErrorToGraphQLError, shouldMaskGraphQLError } from './graphql/shared/index.cjs';
5
10
  export { CachePort, CacheSetOptions, ClockPort, EmailMessage, EmailServicePort, IdGeneratorPort, LoggerPort, UnitOfWorkPort } from './ports.cjs';
11
+ export { U as UseCasePort } from './types-afYpL7Ap.cjs';
12
+ import './http/schema/types.cjs';
13
+ import './router-definition.type-BElX-Pl4.cjs';
6
14
 
7
15
  /**
8
16
  * Primary port interface for use case execution (Hexagonal Architecture).
package/dist/index.d.ts CHANGED
@@ -2,7 +2,15 @@ import { CodedError, AppErrorCode, DomainErrorCode, InfraErrorCode, Presentation
2
2
  export { ErrorCode, ErrorCodes, ErrorConstructor, ErrorFactory, GlobalErrorCode, ObjectValidationError, fieldChanged, wrapError, wrapErrorAsync, wrapErrorUnless, wrapErrorUnlessAsync } from './global.js';
3
3
  import { ValidationError } from './types.js';
4
4
  export { PaginatedData, PaginationInput } from './types.js';
5
+ export { DefineGraphQLSchemaOptions, defineGraphQLSchema, defineMutation, defineQuery, defineSubscription, generateFieldId, mergeGraphQLSchemas } from './graphql/field/index.js';
6
+ export { D as DeepMergeSchemas, h as DeepMergeSchemasAll, F as FlattenSchema, g as GetField, b as GraphQLFieldDefinition, a as GraphQLFieldDocumentation, G as GraphQLOperationType, d as GraphQLSchemaConfig, e as GraphQLSchemaDefaults, f as GraphQLSchemaDefinition, c as GraphQLSchemaEntry, k as InferFieldContext, i as InferFieldInput, I as InferFieldOperation, j as InferFieldOutput, S as SchemaKeys, n as collectFields, l as isFieldDefinition, m as isSchemaDefinition } from './schema-definition.type-CuhQLDr0.js';
7
+ export { BuilderGraphQLHandlerConfig, CreateGraphQLRoutesOptions, GraphQLHandlerConfig, GraphQLHandlerContext, GraphQLMiddlewareFunction, GraphQLRoutesBuilder, MissingHandlersError, SimpleGraphQLHandlerConfig, SimpleGraphQLHandlerFn, TypedGraphQLContext, UnifiedGraphQLField, ValidatedArgs, graphqlRoutes, isSimpleGraphQLHandlerConfig } from './graphql/server/index.js';
8
+ export { GraphQLSDLConfig, generateGraphQLSDL } from './graphql/sdl/index.js';
9
+ export { GraphQLErrorCode, GraphQLErrorExtensions, GraphQLValidationErrorItem, MappedGraphQLError, getGraphQLErrorCode, mapErrorToGraphQLError, shouldMaskGraphQLError } from './graphql/shared/index.js';
5
10
  export { CachePort, CacheSetOptions, ClockPort, EmailMessage, EmailServicePort, IdGeneratorPort, LoggerPort, UnitOfWorkPort } from './ports.js';
11
+ export { U as UseCasePort } from './types-B6Q1iCgf.js';
12
+ import './http/schema/types.js';
13
+ import './router-definition.type-DxG8ncJZ.js';
6
14
 
7
15
  /**
8
16
  * Primary port interface for use case execution (Hexagonal Architecture).
package/dist/index.js CHANGED
@@ -1,3 +1,30 @@
1
+ import "./chunk-NQMFWI6Q.js";
2
+ import {
3
+ defineGraphQLSchema,
4
+ defineMutation,
5
+ defineQuery,
6
+ defineSubscription,
7
+ mergeGraphQLSchemas
8
+ } from "./chunk-TZRBETT3.js";
9
+ import {
10
+ graphqlRoutes,
11
+ isSimpleGraphQLHandlerConfig
12
+ } from "./chunk-ANLXZHUS.js";
13
+ import "./chunk-FEY2GSVT.js";
14
+ import {
15
+ getGraphQLErrorCode,
16
+ mapErrorToGraphQLError,
17
+ shouldMaskGraphQLError
18
+ } from "./chunk-VBG3UYQR.js";
19
+ import {
20
+ generateGraphQLSDL
21
+ } from "./chunk-4RFWJ5XZ.js";
22
+ import {
23
+ collectFields,
24
+ generateFieldId,
25
+ isFieldDefinition,
26
+ isSchemaDefinition
27
+ } from "./chunk-BG2FY27M.js";
1
28
  import {
2
29
  fieldChanged
3
30
  } from "./chunk-3QKQCJSP.js";
@@ -9,7 +36,7 @@ import {
9
36
  InfraError,
10
37
  NotFoundError,
11
38
  UnprocessableError
12
- } from "./chunk-2BVCU32G.js";
39
+ } from "./chunk-HNEAH6OZ.js";
13
40
  import {
14
41
  ControllerError,
15
42
  InvalidRequestError,
@@ -1163,7 +1190,22 @@ export {
1163
1190
  UnauthorizedError,
1164
1191
  UnprocessableError,
1165
1192
  UseCaseError,
1193
+ collectFields,
1194
+ defineGraphQLSchema,
1195
+ defineMutation,
1196
+ defineQuery,
1197
+ defineSubscription,
1166
1198
  fieldChanged,
1199
+ generateFieldId,
1200
+ generateGraphQLSDL,
1201
+ getGraphQLErrorCode,
1202
+ graphqlRoutes,
1203
+ isFieldDefinition,
1204
+ isSchemaDefinition,
1205
+ isSimpleGraphQLHandlerConfig,
1206
+ mapErrorToGraphQLError,
1207
+ mergeGraphQLSchemas,
1208
+ shouldMaskGraphQLError,
1167
1209
  wrapError,
1168
1210
  wrapErrorAsync,
1169
1211
  wrapErrorUnless,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/app/classes/base-inbound-adapter.class.ts","../src/domain/classes/base-entity.class.ts","../src/domain/exceptions/partial-load.error.ts","../src/domain/classes/base-aggregate-root.class.ts","../src/domain/classes/base-domain-event.class.ts","../src/domain/classes/base-value-object.class.ts","../src/domain/exceptions/invariant-violation.error.ts","../src/domain/value-objects/base-audit-by.vo.ts","../src/domain/value-objects/base-audit-on.vo.ts","../src/domain/value-objects/base-email.vo.ts","../src/domain/value-objects/base-pagination.vo.ts","../src/domain/value-objects/base-text.vo.ts","../src/domain/value-objects/base-uuid-v4.vo.ts","../src/domain/value-objects/base-uuid-v7.vo.ts","../src/infra/classes/base-outbound-adapter.class.ts","../src/infra/exceptions/db.error.ts","../src/infra/exceptions/network.error.ts","../src/infra/exceptions/timeout.error.ts","../src/infra/exceptions/external-service.error.ts"],"sourcesContent":["import 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 * - Two-phase execution: `authorize()` runs before `handle()`\n * - Typed context passing from authorization to business logic\n * - Automatic error wrapping for unexpected exceptions\n * - Pass-through for known error types (UseCaseError, DomainError, InfraError)\n *\n * Subclasses can override `authorize()` to add authorization checks that run\n * before `handle()`. The authorization phase can return a typed context that\n * is passed to `handle()`, enabling entity caching and avoiding duplicate lookups.\n *\n * @typeParam TInput - Input type (plain object)\n * @typeParam TOutput - Output type (plain object)\n * @typeParam TAuthContext - Authorization context type passed from authorize() to handle() (default: void)\n *\n * @example Basic use case without authorization\n * ```typescript\n * class CreateUserUseCase extends BaseInboundAdapter<CreateUserInput, CreateUserOutput> {\n * protected async handle(input: CreateUserInput): Promise<CreateUserOutput> {\n * const user = await this.userRepo.create(input);\n * return { userId: user.id };\n * }\n * }\n * ```\n *\n * @example Use case with authorization and context passing\n * ```typescript\n * interface UpdateActivityAuthContext {\n * activity: Activity;\n * organization: Organization;\n * }\n *\n * class UpdateActivityUseCase extends BaseInboundAdapter<\n * UpdateActivityInput,\n * UpdateActivityOutput,\n * UpdateActivityAuthContext\n * > {\n * protected async authorize(input: UpdateActivityInput): Promise<UpdateActivityAuthContext> {\n * const activity = await this.activityRepo.findById(input.activityId);\n * if (!activity) {\n * throw new NotFoundError({ message: 'Activity not found' });\n * }\n *\n * const organization = await this.orgRepo.findById(input.organizationId);\n * if (activity.organizationId !== organization.id) {\n * throw new ForbiddenError({ message: 'Not authorized to update this activity' });\n * }\n *\n * return { activity, organization };\n * }\n *\n * protected async handle(\n * input: UpdateActivityInput,\n * { activity, organization }: UpdateActivityAuthContext\n * ): Promise<UpdateActivityOutput> {\n * // Use pre-loaded entities - no duplicate lookups!\n * activity.update(input);\n * await this.activityRepo.save(activity);\n * return { activityId: activity.id.value };\n * }\n * }\n * ```\n */\nexport abstract class BaseInboundAdapter<\n TInput,\n TOutput,\n TAuthContext = void,\n> implements BaseInboundPort<TInput, TOutput> {\n /**\n * Authorization check that runs before handle().\n *\n * Override this method to add authorization logic. The returned context\n * is passed to `handle()`, enabling you to cache entities and avoid\n * duplicate database lookups.\n *\n * Default implementation returns `undefined` (no authorization, no context).\n *\n * @param input - Input data\n * @returns Promise resolving to the authorization context (passed to handle)\n * @throws {ForbiddenError} When the user lacks permission for this operation\n * @throws {NotFoundError} When a required resource doesn't exist\n * @throws {UseCaseError} For other authorization failures\n */\n protected async authorize(_input: TInput): Promise<TAuthContext> {\n return undefined as TAuthContext;\n }\n\n /**\n * Implements the use case logic. Override this method in subclasses.\n *\n * @param input - Input data\n * @param authContext - Authorization context returned from authorize()\n * @returns Promise resolving to the output\n */\n protected abstract handle(input: TInput, authContext: TAuthContext): Promise<TOutput>;\n\n /**\n * Executes the use case with authorization and error boundary protection.\n *\n * Execution flow:\n * 1. `authorize(input)` - Runs authorization checks, returns context\n * 2. `handle(input, authContext)` - Runs business logic with the context\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 - Input data\n * @returns Promise resolving to the output\n * @throws {ObjectValidationError} For validation failures (propagated to controller)\n * @throws {UseCaseError} For use case failures or wrapped unknown errors\n * @throws {ForbiddenError} When authorization is denied\n * @throws {NotFoundError} When a required resource is not found\n * @throws {DomainError} For domain invariant violations\n * @throws {InfraError} For infrastructure failures\n */\n public async execute(...args: TInput extends void ? [] : [input: TInput]): Promise<TOutput> {\n const input = args[0] as TInput;\n return wrapErrorUnlessAsync(\n async () => {\n const authContext = await this.authorize(input);\n return this.handle(input, authContext);\n },\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 reconstitute(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.reconstitute(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.reconstitute(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 { 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 type { BaseValueObject } from './base-value-object.class';\nimport { BaseEntity } from './base-entity.class';\nimport type { BaseDomainEvent } from './base-domain-event.class';\nimport { PartialLoadError } from '../exceptions/partial-load.error';\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 reconstitute(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 private _loadedFields = new Set<keyof TProps | string>();\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 * Marks one or more fields as loaded.\n *\n * Call this method during reconstitution to indicate which fields/relations\n * were loaded from the database. Fields not marked as loaded will trigger\n * a PartialLoadError when accessed via requireLoaded().\n *\n * @param fields - The field names to mark as loaded\n *\n * @example\n * ```typescript\n * static reconstitute(id: OrderId, props: OrderProps, version: number): Order {\n * const order = new Order(id, props, version);\n * order.markLoaded('customerId', 'status');\n * return order;\n * }\n * ```\n */\n protected markLoaded(...fields: (keyof TProps | string)[]): void {\n for (const field of fields) {\n this._loadedFields.add(field);\n }\n }\n\n /**\n * Checks if a field is marked as loaded.\n *\n * Useful for conditional logic based on load state.\n *\n * @param field - The field name to check\n * @returns `true` if the field is marked as loaded\n *\n * @example\n * ```typescript\n * get itemCount(): number {\n * if (!this.isLoaded('items')) {\n * return 0;\n * }\n * return this.props.items.length;\n * }\n * ```\n */\n protected isLoaded(field: keyof TProps | string): boolean {\n return this._loadedFields.has(field);\n }\n\n /**\n * Ensures a field is loaded, throwing PartialLoadError if not.\n *\n * Use this as a guard in getters that access potentially unloaded relations.\n * Returns the field value if loaded, enabling fluent usage.\n *\n * @typeParam K - The field key type\n * @param field - The field name to check\n * @param errorCode - Optional custom error code (defaults to FIELD_NOT_LOADED)\n * @returns The field value if loaded\n * @throws {PartialLoadError} When the field is not marked as loaded\n *\n * @example\n * ```typescript\n * get items(): readonly OrderItem[] {\n * return this.requireLoaded('items');\n * }\n *\n * // With custom error code\n * get customer(): Customer {\n * return this.requireLoaded('customer', 'ORDER_CUSTOMER_NOT_LOADED');\n * }\n * ```\n */\n protected requireLoaded<K extends keyof TProps>(field: K, errorCode?: string): TProps[K] {\n if (!this._loadedFields.has(field)) {\n throw new PartialLoadError({\n message: `Field '${String(field)}' was not loaded`,\n code: errorCode ?? `${String(field).toUpperCase()}_NOT_LOADED`,\n });\n }\n return this.props[field];\n }\n\n /**\n * Returns a read-only view of loaded fields.\n *\n * Useful for debugging and inspection, particularly in tests\n * or logging scenarios.\n *\n * @returns A read-only set of loaded field names\n *\n * @example\n * ```typescript\n * console.log('Loaded fields:', Array.from(order.loadedFields));\n * // Output: Loaded fields: ['customerId', 'status', 'placedAt']\n * ```\n */\n public get loadedFields(): ReadonlySet<keyof TProps | string> {\n return this._loadedFields;\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","/**\n * Deep equality comparison for value objects.\n * Handles primitives, Dates, Arrays, and nested Objects.\n * @internal\n */\nfunction deepEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || a === undefined || b === null || b === undefined) {\n return a === b;\n }\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => deepEquals(item, b[index]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => deepEquals(aObj[key], bObj[key]));\n }\n return false;\n}\n\nexport interface ValueObject<T> {\n equals(other: ValueObject<T>): boolean;\n value: T;\n}\n\n/**\n * Base class for Domain-Driven Design Value Objects.\n *\n * Value Objects are immutable domain primitives that are compared by value,\n * not by reference. They encapsulate validation and domain logic for\n * primitive concepts like Email, Money, Address, etc.\n *\n * **Key characteristics:**\n * - **Immutable**: Value cannot be changed after construction\n * - **Equality by value**: Two VOs with the same value are considered equal\n * - **Self-validating**: Validation runs in factory method before construction\n *\n * **Pattern:**\n * Subclasses validate in their static `create()` method BEFORE calling the\n * constructor. This ensures invalid objects never exist, even briefly.\n *\n * @typeParam T - The underlying value type\n *\n * @example\n * ```typescript\n * class Email extends BaseValueObject<string> {\n * private static readonly EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n *\n * static create(value: Email['value']): Email {\n * if (!Email.EMAIL_REGEX.test(value)) {\n * throw new InvariantViolationError({\n * message: 'Invalid email format',\n * code: 'INVALID_EMAIL',\n * });\n * }\n * return new Email(value);\n * }\n * }\n *\n * const email1 = Email.create('user@example.com');\n * const email2 = Email.create('user@example.com');\n * email1.equals(email2); // true\n * ```\n */\nexport abstract class BaseValueObject<T> implements ValueObject<T> {\n private readonly _value: T;\n\n /**\n * Creates a new Value Object instance.\n * Protected to enforce factory pattern - use static create() method.\n *\n * @param value - The validated value to wrap\n */\n protected constructor(value: T) {\n this._value = value;\n }\n\n /**\n * Compares this Value Object with another for equality.\n *\n * Uses deep equality comparison to handle nested objects, arrays, and dates.\n * Two Value Objects are equal if their underlying values are deeply equal.\n *\n * @param other - The Value Object to compare with\n * @returns `true` if the values are deeply equal, `false` otherwise\n */\n public equals(other: BaseValueObject<T>): boolean {\n if (this === other) return true;\n return deepEquals(this._value, other.value);\n }\n\n /**\n * The underlying immutable value.\n *\n * @returns The wrapped value of type T\n */\n public get value(): T {\n return this._value;\n }\n}\n","import { ErrorCodes, type DomainErrorCode } from '../../global/exceptions/error-codes.const';\nimport { DomainError } from './domain.error';\n\n/**\n * Error thrown when a domain invariant is violated.\n *\n * Invariants are business rules that must always be true. This error\n * indicates a programming error or corrupted state—if inputs are\n * properly validated, this should never occur in production.\n *\n * **When to throw:**\n * - Business rule violations (e.g., `updatedAt < createdAt`)\n * - Assert-style guards in domain logic\n * - Invalid state transitions\n *\n * @example\n * ```typescript\n * if (order.status === 'shipped' && order.items.length === 0) {\n * throw new InvariantViolationError({\n * message: 'Shipped order must have at least one item',\n * code: 'EMPTY_SHIPPED_ORDER',\n * });\n * }\n * ```\n *\n * @extends DomainError\n */\nexport class InvariantViolationError extends DomainError {\n /**\n * Creates a new InvariantViolationError instance.\n *\n * @param options - Error configuration\n * @param options.message - Description of the violated invariant\n * @param options.code - Machine-readable error code (default: 'INVARIANT_VIOLATION')\n * @param options.cause - Optional underlying error\n */\n constructor({\n message,\n code = ErrorCodes.Domain.INVARIANT_VIOLATION,\n cause,\n }: {\n message: string;\n code?: DomainErrorCode | string;\n cause?: unknown;\n }) {\n super({ message, code, cause });\n }\n\n /**\n * Creates an InvariantViolationError from a caught error.\n *\n * @param cause - The original caught error\n * @returns A new InvariantViolationError instance with the cause attached\n */\n static override fromError(cause: unknown): InvariantViolationError {\n return new InvariantViolationError({\n message: cause instanceof Error ? cause.message : 'Invariant violation',\n cause,\n });\n }\n}\n","/**\n * Base audit user tracking value object.\n *\n * Tracks which user created and last updated an entity. User IDs are\n * optional to support system-initiated operations where no user context\n * is available.\n *\n * @example\n * ```typescript\n * const audit = BaseAuditByVo.create({\n * createdBy: userId,\n * });\n *\n * // Later, when updating\n * const updated = audit.update(updaterId);\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport type { BaseUuidV4Vo } from './base-uuid-v4.vo';\n\n/**\n * Value object for audit user tracking.\n *\n * @extends BaseValueObject\n */\nexport class BaseAuditByVo extends BaseValueObject<{\n createdBy?: BaseUuidV4Vo;\n updatedBy?: BaseUuidV4Vo;\n}> {\n /**\n * Creates an audit user tracking value object.\n * @param value - The user tracking values\n * @param value.createdBy - User who created the entity (optional for system ops)\n * @param value.updatedBy - User who last updated the entity (defaults to createdBy)\n */\n static create(value: BaseAuditByVo['value']): BaseAuditByVo {\n return new BaseAuditByVo({\n createdBy: value.createdBy,\n updatedBy: value.updatedBy ?? value.createdBy,\n });\n }\n\n /** The user who created the entity. */\n get createdBy(): BaseUuidV4Vo | undefined {\n return this.value.createdBy;\n }\n\n /** The user who last updated the entity. */\n get updatedBy(): BaseUuidV4Vo | undefined {\n return this.value.updatedBy;\n }\n\n /**\n * Creates a new audit user tracking with updated user ID.\n *\n * @param updatedBy - The user ID performing the update\n * @returns A new immutable audit user tracking instance\n */\n update(updatedBy: BaseUuidV4Vo): BaseAuditByVo {\n return new BaseAuditByVo({\n createdBy: this.createdBy,\n updatedBy,\n });\n }\n}\n","/**\n * Base audit timestamp value object.\n *\n * Tracks when an entity was created and last updated. Enforces the\n * domain invariant that `updatedAt` cannot be earlier than `createdAt`.\n *\n * **Domain Invariant:**\n * Throws {@link InvariantViolationError} if `updatedAt < createdAt`.\n *\n * @example\n * ```typescript\n * // Create with current timestamp\n * const audit = BaseAuditOnVo.now();\n *\n * // Create with specific dates\n * const audit = BaseAuditOnVo.create({\n * createdAt: new Date('2024-01-01'),\n * updatedAt: new Date('2024-01-15'),\n * });\n *\n * // Update timestamp\n * const updated = audit.update();\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for audit timestamps.\n *\n * @extends BaseValueObject\n * @throws {InvariantViolationError} When `updatedAt` is earlier than `createdAt`\n */\nexport class BaseAuditOnVo extends BaseValueObject<{\n createdAt: Date;\n updatedAt: Date;\n}> {\n /**\n * Creates an audit timestamp value object.\n * @param value - The timestamp values\n * @param value.createdAt - When the entity was created\n * @param value.updatedAt - When the entity was last updated\n * @throws {InvariantViolationError} When `updatedAt < createdAt`\n */\n static create(value: BaseAuditOnVo['value']): BaseAuditOnVo {\n if (value.updatedAt < value.createdAt) {\n throw new InvariantViolationError({\n message: 'UpdatedAt cannot be earlier than createdAt',\n code: 'INVALID_AUDIT_TIMESTAMPS',\n });\n }\n return new BaseAuditOnVo(value);\n }\n\n /**\n * Creates an audit timestamp with current time for both fields.\n * Convenience factory for new entities.\n */\n static now(): BaseAuditOnVo {\n const now = new Date();\n return new BaseAuditOnVo({ createdAt: now, updatedAt: now });\n }\n\n /** When the entity was created. Returns a clone to prevent mutation. */\n get createdAt(): Date {\n return new Date(this.value.createdAt);\n }\n\n /** When the entity was last updated. Returns a clone to prevent mutation. */\n get updatedAt(): Date {\n return new Date(this.value.updatedAt);\n }\n\n /**\n * Creates a new audit timestamp with current time as updatedAt.\n *\n * @returns A new immutable audit timestamp instance\n */\n update(): BaseAuditOnVo {\n return new BaseAuditOnVo({\n createdAt: this.value.createdAt,\n updatedAt: new Date(),\n });\n }\n}\n","/**\n * Base email value object.\n *\n * Represents a validated email address. Validates email format\n * in the factory method before construction.\n *\n * @example\n * ```typescript\n * const email = BaseEmailVo.create('user@example.com');\n * console.log(email.value); // \"user@example.com\"\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for email addresses.\n *\n * @extends BaseValueObject<string>\n */\nexport class BaseEmailVo extends BaseValueObject<string> {\n private static readonly EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n /**\n * Creates an email value object.\n * @param value - The email address string\n * @throws {InvariantViolationError} When email format is invalid\n */\n static create(value: BaseEmailVo['value']): BaseEmailVo {\n if (!BaseEmailVo.EMAIL_REGEX.test(value)) {\n throw new InvariantViolationError({\n message: 'Invalid email format',\n code: 'INVALID_EMAIL',\n });\n }\n return new BaseEmailVo(value);\n }\n}\n","/**\n * Base pagination value object.\n *\n * Represents pagination parameters for list queries. Validates that\n * page numbers and page sizes are positive integers within bounds.\n *\n * **Properties:**\n * - `page`: The current page number (1-indexed)\n * - `pageSize`: Number of items per page\n *\n * **Constraint Properties:**\n * - `maxPageSize`: Maximum allowed page size (default: 100)\n *\n * @example Subclass with custom max page size\n * ```typescript\n * class AdminPaginationVo extends BasePaginationVo {\n * static override maxPageSize = 500;\n * }\n * ```\n *\n * @example Usage in a use case\n * ```typescript\n * class ListUsersUseCase {\n * async execute(pagination: BasePaginationVo): Promise<User[]> {\n * const offset = (pagination.page - 1) * pagination.pageSize;\n * return this.userRepo.findAll({\n * offset,\n * limit: pagination.pageSize,\n * });\n * }\n * }\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for pagination parameters.\n *\n * @extends BaseValueObject<{ page: number; pageSize: number }>\n */\nexport class BasePaginationVo extends BaseValueObject<{ page: number; pageSize: number }> {\n /** Maximum allowed page size. Override in subclass. */\n // eslint-disable-next-line @typescript-eslint/class-literal-property-style\n static get maxPageSize(): number {\n return 100;\n }\n\n /**\n * Creates a pagination value object.\n * @param value - The pagination parameters\n * @param value.page - Page number (must be >= 1)\n * @param value.pageSize - Items per page (must be >= 1 and <= maxPageSize)\n * @throws {InvariantViolationError} When constraints are violated\n */\n static create(value: BasePaginationVo['value']): BasePaginationVo {\n const { page, pageSize } = value;\n\n if (!Number.isInteger(page) || page < 1) {\n throw new InvariantViolationError({\n message: 'Page must be a positive integer',\n code: 'INVALID_PAGE',\n });\n }\n\n if (!Number.isInteger(pageSize) || pageSize < 1) {\n throw new InvariantViolationError({\n message: 'Page size must be a positive integer',\n code: 'INVALID_PAGE_SIZE',\n });\n }\n\n if (pageSize > this.maxPageSize) {\n throw new InvariantViolationError({\n message: `Page size must be at most ${this.maxPageSize}`,\n code: 'PAGE_SIZE_TOO_LARGE',\n });\n }\n\n return new this(value);\n }\n\n /** The current page number. */\n get page(): number {\n return this.value.page;\n }\n\n /** The number of items per page. */\n get pageSize(): number {\n return this.value.pageSize;\n }\n\n /** The offset for database queries. */\n get offset(): number {\n return (this.page - 1) * this.pageSize;\n }\n}\n","/**\n * Base text value object with configurable length constraints.\n *\n * Provides a single text VO that can be configured for different length\n * requirements. Subclasses override static properties to define constraints.\n *\n * **Constraint Properties:**\n * - `defaultMinLength`: Minimum text length (undefined = no minimum)\n * - `defaultMaxLength`: Maximum text length (undefined = no maximum)\n * - `defaultPattern`: Regex pattern to match (undefined = no pattern)\n *\n * @example Subclass with constraints\n * ```typescript\n * class ProductNameVo extends BaseTextVo {\n * static override defaultMinLength = 1;\n * static override defaultMaxLength = 100;\n * }\n *\n * class SkuVo extends BaseTextVo {\n * static override defaultMinLength = 3;\n * static override defaultMaxLength = 20;\n * static override defaultPattern = /^[A-Z0-9-]+$/;\n * }\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for text strings with configurable constraints.\n *\n * @extends BaseValueObject<string>\n */\nexport class BaseTextVo extends BaseValueObject<string> {\n /** Minimum length constraint. Override in subclass. */\n static defaultMinLength: number | undefined = undefined;\n\n /** Maximum length constraint. Override in subclass. */\n static defaultMaxLength: number | undefined = undefined;\n\n /** Regex pattern constraint. Override in subclass. */\n static defaultPattern: RegExp | undefined = undefined;\n\n /**\n * Creates a text value object.\n * @param value - The text string\n * @throws {InvariantViolationError} When constraints are violated\n */\n static create(value: BaseTextVo['value']): BaseTextVo {\n const minLength = this.defaultMinLength;\n const maxLength = this.defaultMaxLength;\n const pattern = this.defaultPattern;\n\n if (minLength !== undefined && value.length < minLength) {\n throw new InvariantViolationError({\n message: `Text must be at least ${minLength} characters`,\n code: 'TEXT_TOO_SHORT',\n });\n }\n\n if (maxLength !== undefined && value.length > maxLength) {\n throw new InvariantViolationError({\n message: `Text must be at most ${maxLength} characters`,\n code: 'TEXT_TOO_LONG',\n });\n }\n\n if (pattern !== undefined && !pattern.test(value)) {\n throw new InvariantViolationError({\n message: 'Text does not match required pattern',\n code: 'TEXT_INVALID_PATTERN',\n });\n }\n\n return new this(value);\n }\n}\n\n// =============================================================================\n// Pre-configured Text VOs (for backwards compatibility)\n// =============================================================================\n\n/**\n * Short text value object (1-100 characters).\n *\n * Use for: names, titles, labels\n */\nexport class BaseShortTextVo extends BaseTextVo {\n static override defaultMinLength = 1;\n static override defaultMaxLength = 100;\n}\n\n/**\n * Medium text value object (1-500 characters).\n *\n * Use for: descriptions, summaries, comments\n */\nexport class BaseMediumTextVo extends BaseTextVo {\n static override defaultMinLength = 1;\n static override defaultMaxLength = 500;\n}\n\n/**\n * Long text value object (1-5000 characters).\n *\n * Use for: articles, content bodies, notes\n */\nexport class BaseLongTextVo extends BaseTextVo {\n static override defaultMinLength = 1;\n static override defaultMaxLength = 5000;\n}\n","/**\n * Base UUID v4 value object for random entity identifiers.\n *\n * UUID v4 is a randomly generated UUID, suitable for identifiers where\n * time-ordering is not required. For time-sortable IDs, use {@link BaseUuidV7Vo}.\n *\n * **Use Cases:**\n * - User IDs\n * - Session tokens\n * - Correlation IDs\n * - Any identifier where time-ordering doesn't matter\n *\n * @example\n * ```typescript\n * const id = BaseUuidV4Vo.generate();\n * const parsed = BaseUuidV4Vo.create('550e8400-e29b-41d4-a716-446655440000');\n * ```\n */\nimport { v4 } from 'uuid';\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for UUID v4 identifiers.\n *\n * @extends BaseValueObject<string>\n */\nexport class BaseUuidV4Vo extends BaseValueObject<string> {\n private static readonly UUID_V4_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n /**\n * Creates a UUID v4 value object from an existing UUID string.\n * @param value - The UUID string to validate and wrap\n * @throws {InvariantViolationError} When UUID format is invalid\n */\n static create(value: BaseUuidV4Vo['value']): BaseUuidV4Vo {\n if (!BaseUuidV4Vo.UUID_V4_REGEX.test(value)) {\n throw new InvariantViolationError({\n message: 'Invalid UUID v4 format',\n code: 'INVALID_UUID_V4',\n });\n }\n return new BaseUuidV4Vo(value);\n }\n\n /**\n * Generates a new UUID v4 value object.\n * No validation needed since uuid library guarantees valid output.\n */\n static generate(): BaseUuidV4Vo {\n return new BaseUuidV4Vo(v4());\n }\n}\n","/**\n * Base UUID v7 value object for time-sortable entity identifiers.\n *\n * UUID v7 is a time-ordered UUID that combines a Unix timestamp with\n * random bits, making it ideal for database primary keys because:\n *\n * **Benefits:**\n * - **Time-sortable**: IDs created later sort after earlier ones\n * - **Database-friendly**: Sequential nature reduces B-tree fragmentation\n * - **Globally unique**: Same uniqueness guarantees as other UUID versions\n * - **Timestamp extractable**: Creation time can be derived from the ID\n *\n * @example\n * ```typescript\n * const id = BaseUuidV7Vo.generate();\n * const parsed = BaseUuidV7Vo.create('018f3b1c-5e7d-7000-8000-000000000001');\n * ```\n */\nimport { v7 } from 'uuid';\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for UUID v7 identifiers.\n *\n * @extends BaseValueObject<string>\n */\nexport class BaseUuidV7Vo extends BaseValueObject<string> {\n private static readonly UUID_V7_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n /**\n * Creates a UUID v7 value object from an existing UUID string.\n * @param value - The UUID string to validate and wrap\n * @throws {InvariantViolationError} When UUID format is invalid\n */\n static create(value: BaseUuidV7Vo['value']): BaseUuidV7Vo {\n if (!BaseUuidV7Vo.UUID_V7_REGEX.test(value)) {\n throw new InvariantViolationError({\n message: 'Invalid UUID v7 format',\n code: 'INVALID_UUID_V7',\n });\n }\n return new BaseUuidV7Vo(value);\n }\n\n /**\n * Generates a new UUID v7 value object.\n * No validation needed since uuid library guarantees valid output.\n */\n static generate(): BaseUuidV7Vo {\n return new BaseUuidV7Vo(v7());\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 */\n 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEO,IAAe,qBAAf,MAIuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgB5C,MAAgB,UAAU,QAAuC;AAC/D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,MAAa,WAAW,MAAoE;AAC1F,UAAM,QAAQ,KAAK,CAAC;AACpB,WAAO;AAAA,MACL,YAAY;AACV,cAAM,cAAc,MAAM,KAAK,UAAU,KAAK;AAC9C,eAAO,KAAK,OAAO,OAAO,WAAW;AAAA,MACvC;AAAA,MACA,CAAC,UAAU,IAAI,aAAa,EAAE,SAAS,qCAAqC,MAAM,CAAC;AAAA,MACnF,CAAC,uBAAuB,cAAc,aAAa,UAAU;AAAA,IAC/D;AAAA,EACF;AACF;;;ACpEO,IAAe,aAAf,MAAuF;AAAA,EAC3E;AAAA,EACP;AAAA,EACO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASP,YAAY,IAAS,OAAe,UAAU,GAAG;AACzD,SAAK,MAAM;AACX,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,KAAU;AACnB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAc,QAAgB;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAW,UAAkB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBO,OAAO,OAAyC;AACrD,QAAI,SAAS,MAAO,QAAO;AAC3B,WAAO,KAAK,SAAS,KAAK,KAAK,MAAM,GAAG;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYU,SAAS,GAAQ,GAAiB;AAC1C,QAAI,MAAM,EAAG,QAAO;AACpB,WAAO,EAAE,OAAO,CAAC;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBU,cAAsB;AAC9B,WAAO,KAAK,WAAW;AAAA,EACzB;AACF;;;ACvJO,IAAM,mBAAN,MAAM,0BAAyB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShD,YAAY;AAAA,IACV;AAAA,IACA,OAAO,WAAW,OAAO;AAAA,IACzB;AAAA,EACF,GAIG;AACD,UAAM,EAAE,SAAS,MAAM,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAgB,UAAU,OAAkC;AAC1D,WAAO,IAAI,kBAAiB;AAAA,MAC1B,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC8BO,IAAe,oBAAf,cAGG,WAAwB;AAAA,EACxB,gBAAmC,CAAC;AAAA,EACpC,gBAAgB,oBAAI,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7C,YAAY,IAAS,OAAe,SAAkB;AAC9D,UAAM,IAAI,OAAO,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBU,eAAe,OAA8B;AACrD,SAAK,cAAc,KAAK,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BO,mBAAsC;AAC3C,UAAM,SAAS,CAAC,GAAG,KAAK,aAAa;AACrC,SAAK,gBAAgB,CAAC;AACtB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,mBAA+C;AACpD,WAAO,CAAC,GAAG,KAAK,aAAa;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,IAAW,kBAA2B;AACpC,WAAO,KAAK,cAAc,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,oBAA0B;AAClC,SAAK,gBAAgB,CAAC;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBU,cAAc,QAAyC;AAC/D,eAAW,SAAS,QAAQ;AAC1B,WAAK,cAAc,IAAI,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBU,SAAS,OAAuC;AACxD,WAAO,KAAK,cAAc,IAAI,KAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BU,cAAsC,OAAU,WAA+B;AACvF,QAAI,CAAC,KAAK,cAAc,IAAI,KAAK,GAAG;AAClC,YAAM,IAAI,iBAAiB;AAAA,QACzB,SAAS,UAAU,OAAO,KAAK,CAAC;AAAA,QAChC,MAAM,aAAa,GAAG,OAAO,KAAK,EAAE,YAAY,CAAC;AAAA,MACnD,CAAC;AAAA,IACH;AACA,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,IAAW,eAAmD;AAC5D,WAAO,KAAK;AAAA,EACd;AACF;;;AC7PO,IAAe,kBAAf,MAAe,iBAAoC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,OAAe,UAAa,KAAW;AACrC,QAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAC3C,aAAO;AAAA,IACT;AAEA,QAAI,eAAe,MAAM;AACvB,aAAO,IAAI,KAAK,IAAI,QAAQ,CAAC;AAAA,IAC/B;AAEA,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,aAAO,IAAI,IAAI,CAAC,SAAS,iBAAgB,UAAU,IAAI,CAAC;AAAA,IAC1D;AAEA,UAAM,SAAS,CAAC;AAChB,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,aAAO,GAAG,IAAI,iBAAgB,UAAW,IAAgC,GAAG,CAAC;AAAA,IAC/E;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,WAAc,KAAW;AACtC,QAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAC3C,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAI,QAAQ,CAAC,SAAS,iBAAgB,WAAW,IAAI,CAAC;AACtD,aAAO,OAAO,OAAO,GAAG;AAAA,IAC1B;AAGA,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,YAAM,QAAS,IAAgC,GAAG;AAClD,UAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,yBAAgB,WAAW,KAAK;AAAA,MAClC;AAAA,IACF;AAEA,WAAO,OAAO,OAAO,GAAG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAe,eAAkB,SAAe;AAC9C,UAAM,SAAS,iBAAgB,UAAU,OAAO;AAChD,WAAO,iBAAgB,WAAW,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeU,YACR,WACA,aACA,SACA,SACA,YACA;AACA,SAAK,WAAW,WAAW,OAAO,WAAW;AAC7C,SAAK,aAAa;AAClB,SAAK,eAAe;AACpB,SAAK,cAAc,cAAc,oBAAI,KAAK;AAC1C,SAAK,WAAW,iBAAgB,eAAe,OAAO;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,UAAkB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAW,YAAoB;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,cAAsB;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,aAAmB;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,UAAoB;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBO,SAML;AACA,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK,YAAY,YAAY;AAAA,MACzC,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AACF;;;AC7NA,SAAS,WAAW,GAAY,GAAqB;AACnD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,QAAQ,MAAM,UAAa,MAAM,QAAQ,MAAM,QAAW;AAClE,WAAO,MAAM;AAAA,EACf;AACA,MAAI,aAAa,QAAQ,aAAa,MAAM;AAC1C,WAAO,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAAA,EACnC;AACA,MAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;AACxC,QAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,WAAO,EAAE,MAAM,CAAC,MAAM,UAAU,WAAW,MAAM,EAAE,KAAK,CAAC,CAAC;AAAA,EAC5D;AACA,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,UAAM,OAAO;AACb,UAAM,OAAO;AACb,UAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,UAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,QAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,WAAO,MAAM,MAAM,CAAC,QAAQ,WAAW,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;AA8CO,IAAe,kBAAf,MAA4D;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP,YAAY,OAAU;AAC9B,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,OAAO,OAAoC;AAChD,QAAI,SAAS,MAAO,QAAO;AAC3B,WAAO,WAAW,KAAK,QAAQ,MAAM,KAAK;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,QAAW;AACpB,WAAO,KAAK;AAAA,EACd;AACF;;;AChFO,IAAM,0BAAN,MAAM,iCAAgC,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASvD,YAAY;AAAA,IACV;AAAA,IACA,OAAO,WAAW,OAAO;AAAA,IACzB;AAAA,EACF,GAIG;AACD,UAAM,EAAE,SAAS,MAAM,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAgB,UAAU,OAAyC;AACjE,WAAO,IAAI,yBAAwB;AAAA,MACjC,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACnCO,IAAM,gBAAN,MAAM,uBAAsB,gBAGhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOD,OAAO,OAAO,OAA8C;AAC1D,WAAO,IAAI,eAAc;AAAA,MACvB,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM,aAAa,MAAM;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,IAAI,YAAsC;AACxC,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,IAAI,YAAsC;AACxC,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,WAAwC;AAC7C,WAAO,IAAI,eAAc;AAAA,MACvB,WAAW,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC/BO,IAAM,gBAAN,MAAM,uBAAsB,gBAGhC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQD,OAAO,OAAO,OAA8C;AAC1D,QAAI,MAAM,YAAY,MAAM,WAAW;AACrC,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,IAAI,eAAc,KAAK;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,MAAqB;AAC1B,UAAM,MAAM,oBAAI,KAAK;AACrB,WAAO,IAAI,eAAc,EAAE,WAAW,KAAK,WAAW,IAAI,CAAC;AAAA,EAC7D;AAAA;AAAA,EAGA,IAAI,YAAkB;AACpB,WAAO,IAAI,KAAK,KAAK,MAAM,SAAS;AAAA,EACtC;AAAA;AAAA,EAGA,IAAI,YAAkB;AACpB,WAAO,IAAI,KAAK,KAAK,MAAM,SAAS;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAwB;AACtB,WAAO,IAAI,eAAc;AAAA,MACvB,WAAW,KAAK,MAAM;AAAA,MACtB,WAAW,oBAAI,KAAK;AAAA,IACtB,CAAC;AAAA,EACH;AACF;;;AChEO,IAAM,cAAN,MAAM,qBAAoB,gBAAwB;AAAA,EACvD,OAAwB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOtC,OAAO,OAAO,OAA0C;AACtD,QAAI,CAAC,aAAY,YAAY,KAAK,KAAK,GAAG;AACxC,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,IAAI,aAAY,KAAK;AAAA,EAC9B;AACF;;;ACIO,IAAM,mBAAN,cAA+B,gBAAoD;AAAA;AAAA;AAAA,EAGxF,WAAW,cAAsB;AAC/B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,OAAO,OAAoD;AAChE,UAAM,EAAE,MAAM,SAAS,IAAI;AAE3B,QAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,GAAG;AACvC,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,GAAG;AAC/C,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,KAAK,aAAa;AAC/B,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS,6BAA6B,KAAK,WAAW;AAAA,QACtD,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,WAAO,IAAI,KAAK,KAAK;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,IAAI,WAAmB;AACrB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,IAAI,SAAiB;AACnB,YAAQ,KAAK,OAAO,KAAK,KAAK;AAAA,EAChC;AACF;;;AC/DO,IAAM,aAAN,cAAyB,gBAAwB;AAAA;AAAA,EAEtD,OAAO,mBAAuC;AAAA;AAAA,EAG9C,OAAO,mBAAuC;AAAA;AAAA,EAG9C,OAAO,iBAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5C,OAAO,OAAO,OAAwC;AACpD,UAAM,YAAY,KAAK;AACvB,UAAM,YAAY,KAAK;AACvB,UAAM,UAAU,KAAK;AAErB,QAAI,cAAc,UAAa,MAAM,SAAS,WAAW;AACvD,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS,yBAAyB,SAAS;AAAA,QAC3C,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,cAAc,UAAa,MAAM,SAAS,WAAW;AACvD,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS,wBAAwB,SAAS;AAAA,QAC1C,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,UAAa,CAAC,QAAQ,KAAK,KAAK,GAAG;AACjD,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,WAAO,IAAI,KAAK,KAAK;AAAA,EACvB;AACF;AAWO,IAAM,kBAAN,cAA8B,WAAW;AAAA,EAC9C,OAAgB,mBAAmB;AAAA,EACnC,OAAgB,mBAAmB;AACrC;AAOO,IAAM,mBAAN,cAA+B,WAAW;AAAA,EAC/C,OAAgB,mBAAmB;AAAA,EACnC,OAAgB,mBAAmB;AACrC;AAOO,IAAM,iBAAN,cAA6B,WAAW;AAAA,EAC7C,OAAgB,mBAAmB;AAAA,EACnC,OAAgB,mBAAmB;AACrC;;;AC5FA,SAAS,UAAU;AASZ,IAAM,eAAN,MAAM,sBAAqB,gBAAwB;AAAA,EACxD,OAAwB,gBACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,OAAO,OAAO,OAA4C;AACxD,QAAI,CAAC,cAAa,cAAc,KAAK,KAAK,GAAG;AAC3C,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,IAAI,cAAa,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAyB;AAC9B,WAAO,IAAI,cAAa,GAAG,CAAC;AAAA,EAC9B;AACF;;;ACnCA,SAAS,UAAU;AASZ,IAAM,eAAN,MAAM,sBAAqB,gBAAwB;AAAA,EACxD,OAAwB,gBACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,OAAO,OAAO,OAA4C;AACxD,QAAI,CAAC,cAAa,cAAc,KAAK,KAAK,GAAG;AAC3C,YAAM,IAAI,wBAAwB;AAAA,QAChC,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,IAAI,cAAa,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAyB;AAC9B,WAAO,IAAI,cAAa,GAAG,CAAC;AAAA,EAC9B;AACF;;;AC/CA,IAAM,yBAAyB,uBAAO,IAAI,+BAA+B;AAGzE,SAAS,kBAAkB,OAA4B;AACrD,QAAM,WAAY,MAAsC,sBAAsB;AAC9E,MAAI,SAAU,QAAO;AAErB,QAAM,SAAS,oBAAI,IAAY;AAC/B,SAAO,eAAe,OAAO,wBAAwB;AAAA,IACnD,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AACD,SAAO;AACT;AAiCO,IAAe,sBAAf,MAAe,qBAAoB;AAAA;AAAA;AAAA;AAAA,EAIxC,cAAc;AACZ,SAAK,uBAAuB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYU,iBAAiB,OAAgB,YAAgC;AACzE,WAAO,IAAI,WAAW;AAAA,MACpB,SAAS,6BAA6B,UAAU;AAAA,MAChD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,yBAA+B;AACrC,UAAM,aAAa,CAAC,YAAoB,aAAwB;AAC9D,YAAM,UAAqB,IAAI,SAAoB;AACjD,YAAI;AACF,gBAAM,SAAS,QAAQ,MAAM,UAAU,MAAM,IAAI;AAGjD,cAAI,kBAAkB,SAAS;AAC7B,mBAAO,OAAO,MAAM,CAAC,UAAmB;AACtC,oBAAM,KAAK,iBAAiB,OAAO,UAAU;AAAA,YAC/C,CAAC;AAAA,UACH;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,gBAAM,KAAK,iBAAiB,OAAO,UAAU;AAAA,QAC/C;AAAA,MACF;AAEA,aAAO,eAAe,MAAM,YAAY;AAAA,QACtC,OAAO;AAAA,QACP,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAGA,UAAM,gBAAmD,CAAC;AAG1D,QAAI,QAAuB,OAAO,eAAe,IAAI;AACrD,WAAO,SAAS,UAAU,qBAAoB,aAAa,UAAU,OAAO,WAAW;AACrF,YAAM,iBAAiB,kBAAkB,KAAK;AAE9C,iBAAW,OAAO,OAAO,oBAAoB,KAAK,GAAG;AACnD,YAAI,QAAQ,cAAe;AAG3B,YAAI,eAAe,IAAI,GAAG,EAAG;AAE7B,cAAM,aAAa,OAAO,yBAAyB,OAAO,GAAG;AAC7D,YAAI,CAAC,WAAY;AAGjB,YAAI,WAAW,OAAO,WAAW,IAAK;AACtC,YAAI,OAAO,WAAW,UAAU,WAAY;AAE5C,sBAAc,KAAK,EAAE,MAAM,KAAK,IAAI,WAAW,MAAmB,CAAC;AACnE,uBAAe,IAAI,GAAG;AAAA,MACxB;AAEA,cAAQ,OAAO,eAAe,KAAK;AAAA,IACrC;AAGA,eAAW,EAAE,MAAM,GAAG,KAAK,eAAe;AACxC,iBAAW,MAAM,EAAE;AAAA,IACrB;AAAA,EACF;AACF;;;AClHO,IAAM,UAAN,MAAM,iBAAgB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAStC,YAAY;AAAA,IACV;AAAA,IACA,OAAO,WAAW,MAAM;AAAA,IACxB;AAAA,EACF,GAIG;AACD,UAAM,EAAE,SAAS,MAAM,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAgB,UAAU,OAAyB;AACjD,WAAO,IAAI,SAAQ;AAAA,MACjB,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACjCO,IAAM,eAAN,MAAM,sBAAqB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3C,YAAY;AAAA,IACV;AAAA,IACA,OAAO,WAAW,MAAM;AAAA,IACxB;AAAA,EACF,GAIG;AACD,UAAM,EAAE,SAAS,MAAM,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAgB,UAAU,OAA8B;AACtD,WAAO,IAAI,cAAa;AAAA,MACtB,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC9BO,IAAM,eAAN,MAAM,sBAAqB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3C,YAAY;AAAA,IACV;AAAA,IACA,OAAO,WAAW,MAAM;AAAA,IACxB;AAAA,EACF,GAIG;AACD,UAAM,EAAE,SAAS,MAAM,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAgB,UAAU,OAA8B;AACtD,WAAO,IAAI,cAAa;AAAA,MACtB,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACpCO,IAAM,uBAAN,MAAM,8BAA6B,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnD,YAAY;AAAA,IACV;AAAA,IACA,OAAO,WAAW,MAAM;AAAA,IACxB;AAAA,EACF,GAIG;AACD,UAAM,EAAE,SAAS,MAAM,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAgB,UAAU,OAAsC;AAC9D,WAAO,IAAI,sBAAqB;AAAA,MAC9B,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/app/classes/base-inbound-adapter.class.ts","../src/domain/classes/base-entity.class.ts","../src/domain/exceptions/partial-load.error.ts","../src/domain/classes/base-aggregate-root.class.ts","../src/domain/classes/base-domain-event.class.ts","../src/domain/classes/base-value-object.class.ts","../src/domain/exceptions/invariant-violation.error.ts","../src/domain/value-objects/base-audit-by.vo.ts","../src/domain/value-objects/base-audit-on.vo.ts","../src/domain/value-objects/base-email.vo.ts","../src/domain/value-objects/base-pagination.vo.ts","../src/domain/value-objects/base-text.vo.ts","../src/domain/value-objects/base-uuid-v4.vo.ts","../src/domain/value-objects/base-uuid-v7.vo.ts","../src/infra/classes/base-outbound-adapter.class.ts","../src/infra/exceptions/db.error.ts","../src/infra/exceptions/network.error.ts","../src/infra/exceptions/timeout.error.ts","../src/infra/exceptions/external-service.error.ts"],"sourcesContent":["import 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 * - Two-phase execution: `authorize()` runs before `handle()`\n * - Typed context passing from authorization to business logic\n * - Automatic error wrapping for unexpected exceptions\n * - Pass-through for known error types (UseCaseError, DomainError, InfraError)\n *\n * Subclasses can override `authorize()` to add authorization checks that run\n * before `handle()`. The authorization phase can return a typed context that\n * is passed to `handle()`, enabling entity caching and avoiding duplicate lookups.\n *\n * @typeParam TInput - Input type (plain object)\n * @typeParam TOutput - Output type (plain object)\n * @typeParam TAuthContext - Authorization context type passed from authorize() to handle() (default: void)\n *\n * @example Basic use case without authorization\n * ```typescript\n * class CreateUserUseCase extends BaseInboundAdapter<CreateUserInput, CreateUserOutput> {\n * protected async handle(input: CreateUserInput): Promise<CreateUserOutput> {\n * const user = await this.userRepo.create(input);\n * return { userId: user.id };\n * }\n * }\n * ```\n *\n * @example Use case with authorization and context passing\n * ```typescript\n * interface UpdateActivityAuthContext {\n * activity: Activity;\n * organization: Organization;\n * }\n *\n * class UpdateActivityUseCase extends BaseInboundAdapter<\n * UpdateActivityInput,\n * UpdateActivityOutput,\n * UpdateActivityAuthContext\n * > {\n * protected async authorize(input: UpdateActivityInput): Promise<UpdateActivityAuthContext> {\n * const activity = await this.activityRepo.findById(input.activityId);\n * if (!activity) {\n * throw new NotFoundError({ message: 'Activity not found' });\n * }\n *\n * const organization = await this.orgRepo.findById(input.organizationId);\n * if (activity.organizationId !== organization.id) {\n * throw new ForbiddenError({ message: 'Not authorized to update this activity' });\n * }\n *\n * return { activity, organization };\n * }\n *\n * protected async handle(\n * input: UpdateActivityInput,\n * { activity, organization }: UpdateActivityAuthContext\n * ): Promise<UpdateActivityOutput> {\n * // Use pre-loaded entities - no duplicate lookups!\n * activity.update(input);\n * await this.activityRepo.save(activity);\n * return { activityId: activity.id.value };\n * }\n * }\n * ```\n */\nexport abstract class BaseInboundAdapter<\n TInput,\n TOutput,\n TAuthContext = void,\n> implements BaseInboundPort<TInput, TOutput> {\n /**\n * Authorization check that runs before handle().\n *\n * Override this method to add authorization logic. The returned context\n * is passed to `handle()`, enabling you to cache entities and avoid\n * duplicate database lookups.\n *\n * Default implementation returns `undefined` (no authorization, no context).\n *\n * @param input - Input data\n * @returns Promise resolving to the authorization context (passed to handle)\n * @throws {ForbiddenError} When the user lacks permission for this operation\n * @throws {NotFoundError} When a required resource doesn't exist\n * @throws {UseCaseError} For other authorization failures\n */\n protected async authorize(_input: TInput): Promise<TAuthContext> {\n return undefined as TAuthContext;\n }\n\n /**\n * Implements the use case logic. Override this method in subclasses.\n *\n * @param input - Input data\n * @param authContext - Authorization context returned from authorize()\n * @returns Promise resolving to the output\n */\n protected abstract handle(input: TInput, authContext: TAuthContext): Promise<TOutput>;\n\n /**\n * Executes the use case with authorization and error boundary protection.\n *\n * Execution flow:\n * 1. `authorize(input)` - Runs authorization checks, returns context\n * 2. `handle(input, authContext)` - Runs business logic with the context\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 - Input data\n * @returns Promise resolving to the output\n * @throws {ObjectValidationError} For validation failures (propagated to controller)\n * @throws {UseCaseError} For use case failures or wrapped unknown errors\n * @throws {ForbiddenError} When authorization is denied\n * @throws {NotFoundError} When a required resource is not found\n * @throws {DomainError} For domain invariant violations\n * @throws {InfraError} For infrastructure failures\n */\n public async execute(...args: TInput extends void ? [] : [input: TInput]): Promise<TOutput> {\n const input = args[0] as TInput;\n return wrapErrorUnlessAsync(\n async () => {\n const authContext = await this.authorize(input);\n return this.handle(input, authContext);\n },\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 reconstitute(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.reconstitute(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.reconstitute(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 { 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 type { BaseValueObject } from './base-value-object.class';\nimport { BaseEntity } from './base-entity.class';\nimport type { BaseDomainEvent } from './base-domain-event.class';\nimport { PartialLoadError } from '../exceptions/partial-load.error';\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 reconstitute(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 private _loadedFields = new Set<keyof TProps | string>();\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 * Marks one or more fields as loaded.\n *\n * Call this method during reconstitution to indicate which fields/relations\n * were loaded from the database. Fields not marked as loaded will trigger\n * a PartialLoadError when accessed via requireLoaded().\n *\n * @param fields - The field names to mark as loaded\n *\n * @example\n * ```typescript\n * static reconstitute(id: OrderId, props: OrderProps, version: number): Order {\n * const order = new Order(id, props, version);\n * order.markLoaded('customerId', 'status');\n * return order;\n * }\n * ```\n */\n protected markLoaded(...fields: (keyof TProps | string)[]): void {\n for (const field of fields) {\n this._loadedFields.add(field);\n }\n }\n\n /**\n * Checks if a field is marked as loaded.\n *\n * Useful for conditional logic based on load state.\n *\n * @param field - The field name to check\n * @returns `true` if the field is marked as loaded\n *\n * @example\n * ```typescript\n * get itemCount(): number {\n * if (!this.isLoaded('items')) {\n * return 0;\n * }\n * return this.props.items.length;\n * }\n * ```\n */\n protected isLoaded(field: keyof TProps | string): boolean {\n return this._loadedFields.has(field);\n }\n\n /**\n * Ensures a field is loaded, throwing PartialLoadError if not.\n *\n * Use this as a guard in getters that access potentially unloaded relations.\n * Returns the field value if loaded, enabling fluent usage.\n *\n * @typeParam K - The field key type\n * @param field - The field name to check\n * @param errorCode - Optional custom error code (defaults to FIELD_NOT_LOADED)\n * @returns The field value if loaded\n * @throws {PartialLoadError} When the field is not marked as loaded\n *\n * @example\n * ```typescript\n * get items(): readonly OrderItem[] {\n * return this.requireLoaded('items');\n * }\n *\n * // With custom error code\n * get customer(): Customer {\n * return this.requireLoaded('customer', 'ORDER_CUSTOMER_NOT_LOADED');\n * }\n * ```\n */\n protected requireLoaded<K extends keyof TProps>(field: K, errorCode?: string): TProps[K] {\n if (!this._loadedFields.has(field)) {\n throw new PartialLoadError({\n message: `Field '${String(field)}' was not loaded`,\n code: errorCode ?? `${String(field).toUpperCase()}_NOT_LOADED`,\n });\n }\n return this.props[field];\n }\n\n /**\n * Returns a read-only view of loaded fields.\n *\n * Useful for debugging and inspection, particularly in tests\n * or logging scenarios.\n *\n * @returns A read-only set of loaded field names\n *\n * @example\n * ```typescript\n * console.log('Loaded fields:', Array.from(order.loadedFields));\n * // Output: Loaded fields: ['customerId', 'status', 'placedAt']\n * ```\n */\n public get loadedFields(): ReadonlySet<keyof TProps | string> {\n return this._loadedFields;\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","/**\n * Deep equality comparison for value objects.\n * Handles primitives, Dates, Arrays, and nested Objects.\n * @internal\n */\nfunction deepEquals(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || a === undefined || b === null || b === undefined) {\n return a === b;\n }\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => deepEquals(item, b[index]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => deepEquals(aObj[key], bObj[key]));\n }\n return false;\n}\n\nexport interface ValueObject<T> {\n equals(other: ValueObject<T>): boolean;\n value: T;\n}\n\n/**\n * Base class for Domain-Driven Design Value Objects.\n *\n * Value Objects are immutable domain primitives that are compared by value,\n * not by reference. They encapsulate validation and domain logic for\n * primitive concepts like Email, Money, Address, etc.\n *\n * **Key characteristics:**\n * - **Immutable**: Value cannot be changed after construction\n * - **Equality by value**: Two VOs with the same value are considered equal\n * - **Self-validating**: Validation runs in factory method before construction\n *\n * **Pattern:**\n * Subclasses validate in their static `create()` method BEFORE calling the\n * constructor. This ensures invalid objects never exist, even briefly.\n *\n * @typeParam T - The underlying value type\n *\n * @example\n * ```typescript\n * class Email extends BaseValueObject<string> {\n * private static readonly EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n *\n * static create(value: Email['value']): Email {\n * if (!Email.EMAIL_REGEX.test(value)) {\n * throw new InvariantViolationError({\n * message: 'Invalid email format',\n * code: 'INVALID_EMAIL',\n * });\n * }\n * return new Email(value);\n * }\n * }\n *\n * const email1 = Email.create('user@example.com');\n * const email2 = Email.create('user@example.com');\n * email1.equals(email2); // true\n * ```\n */\nexport abstract class BaseValueObject<T> implements ValueObject<T> {\n private readonly _value: T;\n\n /**\n * Creates a new Value Object instance.\n * Protected to enforce factory pattern - use static create() method.\n *\n * @param value - The validated value to wrap\n */\n protected constructor(value: T) {\n this._value = value;\n }\n\n /**\n * Compares this Value Object with another for equality.\n *\n * Uses deep equality comparison to handle nested objects, arrays, and dates.\n * Two Value Objects are equal if their underlying values are deeply equal.\n *\n * @param other - The Value Object to compare with\n * @returns `true` if the values are deeply equal, `false` otherwise\n */\n public equals(other: BaseValueObject<T>): boolean {\n if (this === other) return true;\n return deepEquals(this._value, other.value);\n }\n\n /**\n * The underlying immutable value.\n *\n * @returns The wrapped value of type T\n */\n public get value(): T {\n return this._value;\n }\n}\n","import { ErrorCodes, type DomainErrorCode } from '../../global/exceptions/error-codes.const';\nimport { DomainError } from './domain.error';\n\n/**\n * Error thrown when a domain invariant is violated.\n *\n * Invariants are business rules that must always be true. This error\n * indicates a programming error or corrupted state—if inputs are\n * properly validated, this should never occur in production.\n *\n * **When to throw:**\n * - Business rule violations (e.g., `updatedAt < createdAt`)\n * - Assert-style guards in domain logic\n * - Invalid state transitions\n *\n * @example\n * ```typescript\n * if (order.status === 'shipped' && order.items.length === 0) {\n * throw new InvariantViolationError({\n * message: 'Shipped order must have at least one item',\n * code: 'EMPTY_SHIPPED_ORDER',\n * });\n * }\n * ```\n *\n * @extends DomainError\n */\nexport class InvariantViolationError extends DomainError {\n /**\n * Creates a new InvariantViolationError instance.\n *\n * @param options - Error configuration\n * @param options.message - Description of the violated invariant\n * @param options.code - Machine-readable error code (default: 'INVARIANT_VIOLATION')\n * @param options.cause - Optional underlying error\n */\n constructor({\n message,\n code = ErrorCodes.Domain.INVARIANT_VIOLATION,\n cause,\n }: {\n message: string;\n code?: DomainErrorCode | string;\n cause?: unknown;\n }) {\n super({ message, code, cause });\n }\n\n /**\n * Creates an InvariantViolationError from a caught error.\n *\n * @param cause - The original caught error\n * @returns A new InvariantViolationError instance with the cause attached\n */\n static override fromError(cause: unknown): InvariantViolationError {\n return new InvariantViolationError({\n message: cause instanceof Error ? cause.message : 'Invariant violation',\n cause,\n });\n }\n}\n","/**\n * Base audit user tracking value object.\n *\n * Tracks which user created and last updated an entity. User IDs are\n * optional to support system-initiated operations where no user context\n * is available.\n *\n * @example\n * ```typescript\n * const audit = BaseAuditByVo.create({\n * createdBy: userId,\n * });\n *\n * // Later, when updating\n * const updated = audit.update(updaterId);\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport type { BaseUuidV4Vo } from './base-uuid-v4.vo';\n\n/**\n * Value object for audit user tracking.\n *\n * @extends BaseValueObject\n */\nexport class BaseAuditByVo extends BaseValueObject<{\n createdBy?: BaseUuidV4Vo;\n updatedBy?: BaseUuidV4Vo;\n}> {\n /**\n * Creates an audit user tracking value object.\n * @param value - The user tracking values\n * @param value.createdBy - User who created the entity (optional for system ops)\n * @param value.updatedBy - User who last updated the entity (defaults to createdBy)\n */\n static create(value: BaseAuditByVo['value']): BaseAuditByVo {\n return new BaseAuditByVo({\n createdBy: value.createdBy,\n updatedBy: value.updatedBy ?? value.createdBy,\n });\n }\n\n /** The user who created the entity. */\n get createdBy(): BaseUuidV4Vo | undefined {\n return this.value.createdBy;\n }\n\n /** The user who last updated the entity. */\n get updatedBy(): BaseUuidV4Vo | undefined {\n return this.value.updatedBy;\n }\n\n /**\n * Creates a new audit user tracking with updated user ID.\n *\n * @param updatedBy - The user ID performing the update\n * @returns A new immutable audit user tracking instance\n */\n update(updatedBy: BaseUuidV4Vo): BaseAuditByVo {\n return new BaseAuditByVo({\n createdBy: this.createdBy,\n updatedBy,\n });\n }\n}\n","/**\n * Base audit timestamp value object.\n *\n * Tracks when an entity was created and last updated. Enforces the\n * domain invariant that `updatedAt` cannot be earlier than `createdAt`.\n *\n * **Domain Invariant:**\n * Throws {@link InvariantViolationError} if `updatedAt < createdAt`.\n *\n * @example\n * ```typescript\n * // Create with current timestamp\n * const audit = BaseAuditOnVo.now();\n *\n * // Create with specific dates\n * const audit = BaseAuditOnVo.create({\n * createdAt: new Date('2024-01-01'),\n * updatedAt: new Date('2024-01-15'),\n * });\n *\n * // Update timestamp\n * const updated = audit.update();\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for audit timestamps.\n *\n * @extends BaseValueObject\n * @throws {InvariantViolationError} When `updatedAt` is earlier than `createdAt`\n */\nexport class BaseAuditOnVo extends BaseValueObject<{\n createdAt: Date;\n updatedAt: Date;\n}> {\n /**\n * Creates an audit timestamp value object.\n * @param value - The timestamp values\n * @param value.createdAt - When the entity was created\n * @param value.updatedAt - When the entity was last updated\n * @throws {InvariantViolationError} When `updatedAt < createdAt`\n */\n static create(value: BaseAuditOnVo['value']): BaseAuditOnVo {\n if (value.updatedAt < value.createdAt) {\n throw new InvariantViolationError({\n message: 'UpdatedAt cannot be earlier than createdAt',\n code: 'INVALID_AUDIT_TIMESTAMPS',\n });\n }\n return new BaseAuditOnVo(value);\n }\n\n /**\n * Creates an audit timestamp with current time for both fields.\n * Convenience factory for new entities.\n */\n static now(): BaseAuditOnVo {\n const now = new Date();\n return new BaseAuditOnVo({ createdAt: now, updatedAt: now });\n }\n\n /** When the entity was created. Returns a clone to prevent mutation. */\n get createdAt(): Date {\n return new Date(this.value.createdAt);\n }\n\n /** When the entity was last updated. Returns a clone to prevent mutation. */\n get updatedAt(): Date {\n return new Date(this.value.updatedAt);\n }\n\n /**\n * Creates a new audit timestamp with current time as updatedAt.\n *\n * @returns A new immutable audit timestamp instance\n */\n update(): BaseAuditOnVo {\n return new BaseAuditOnVo({\n createdAt: this.value.createdAt,\n updatedAt: new Date(),\n });\n }\n}\n","/**\n * Base email value object.\n *\n * Represents a validated email address. Validates email format\n * in the factory method before construction.\n *\n * @example\n * ```typescript\n * const email = BaseEmailVo.create('user@example.com');\n * console.log(email.value); // \"user@example.com\"\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for email addresses.\n *\n * @extends BaseValueObject<string>\n */\nexport class BaseEmailVo extends BaseValueObject<string> {\n private static readonly EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n /**\n * Creates an email value object.\n * @param value - The email address string\n * @throws {InvariantViolationError} When email format is invalid\n */\n static create(value: BaseEmailVo['value']): BaseEmailVo {\n if (!BaseEmailVo.EMAIL_REGEX.test(value)) {\n throw new InvariantViolationError({\n message: 'Invalid email format',\n code: 'INVALID_EMAIL',\n });\n }\n return new BaseEmailVo(value);\n }\n}\n","/**\n * Base pagination value object.\n *\n * Represents pagination parameters for list queries. Validates that\n * page numbers and page sizes are positive integers within bounds.\n *\n * **Properties:**\n * - `page`: The current page number (1-indexed)\n * - `pageSize`: Number of items per page\n *\n * **Constraint Properties:**\n * - `maxPageSize`: Maximum allowed page size (default: 100)\n *\n * @example Subclass with custom max page size\n * ```typescript\n * class AdminPaginationVo extends BasePaginationVo {\n * static override maxPageSize = 500;\n * }\n * ```\n *\n * @example Usage in a use case\n * ```typescript\n * class ListUsersUseCase {\n * async execute(pagination: BasePaginationVo): Promise<User[]> {\n * const offset = (pagination.page - 1) * pagination.pageSize;\n * return this.userRepo.findAll({\n * offset,\n * limit: pagination.pageSize,\n * });\n * }\n * }\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for pagination parameters.\n *\n * @extends BaseValueObject<{ page: number; pageSize: number }>\n */\nexport class BasePaginationVo extends BaseValueObject<{ page: number; pageSize: number }> {\n /** Maximum allowed page size. Override in subclass. */\n // eslint-disable-next-line @typescript-eslint/class-literal-property-style\n static get maxPageSize(): number {\n return 100;\n }\n\n /**\n * Creates a pagination value object.\n * @param value - The pagination parameters\n * @param value.page - Page number (must be >= 1)\n * @param value.pageSize - Items per page (must be >= 1 and <= maxPageSize)\n * @throws {InvariantViolationError} When constraints are violated\n */\n static create(value: BasePaginationVo['value']): BasePaginationVo {\n const { page, pageSize } = value;\n\n if (!Number.isInteger(page) || page < 1) {\n throw new InvariantViolationError({\n message: 'Page must be a positive integer',\n code: 'INVALID_PAGE',\n });\n }\n\n if (!Number.isInteger(pageSize) || pageSize < 1) {\n throw new InvariantViolationError({\n message: 'Page size must be a positive integer',\n code: 'INVALID_PAGE_SIZE',\n });\n }\n\n if (pageSize > this.maxPageSize) {\n throw new InvariantViolationError({\n message: `Page size must be at most ${this.maxPageSize}`,\n code: 'PAGE_SIZE_TOO_LARGE',\n });\n }\n\n return new this(value);\n }\n\n /** The current page number. */\n get page(): number {\n return this.value.page;\n }\n\n /** The number of items per page. */\n get pageSize(): number {\n return this.value.pageSize;\n }\n\n /** The offset for database queries. */\n get offset(): number {\n return (this.page - 1) * this.pageSize;\n }\n}\n","/**\n * Base text value object with configurable length constraints.\n *\n * Provides a single text VO that can be configured for different length\n * requirements. Subclasses override static properties to define constraints.\n *\n * **Constraint Properties:**\n * - `defaultMinLength`: Minimum text length (undefined = no minimum)\n * - `defaultMaxLength`: Maximum text length (undefined = no maximum)\n * - `defaultPattern`: Regex pattern to match (undefined = no pattern)\n *\n * @example Subclass with constraints\n * ```typescript\n * class ProductNameVo extends BaseTextVo {\n * static override defaultMinLength = 1;\n * static override defaultMaxLength = 100;\n * }\n *\n * class SkuVo extends BaseTextVo {\n * static override defaultMinLength = 3;\n * static override defaultMaxLength = 20;\n * static override defaultPattern = /^[A-Z0-9-]+$/;\n * }\n * ```\n */\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for text strings with configurable constraints.\n *\n * @extends BaseValueObject<string>\n */\nexport class BaseTextVo extends BaseValueObject<string> {\n /** Minimum length constraint. Override in subclass. */\n static defaultMinLength: number | undefined = undefined;\n\n /** Maximum length constraint. Override in subclass. */\n static defaultMaxLength: number | undefined = undefined;\n\n /** Regex pattern constraint. Override in subclass. */\n static defaultPattern: RegExp | undefined = undefined;\n\n /**\n * Creates a text value object.\n * @param value - The text string\n * @throws {InvariantViolationError} When constraints are violated\n */\n static create(value: BaseTextVo['value']): BaseTextVo {\n const minLength = this.defaultMinLength;\n const maxLength = this.defaultMaxLength;\n const pattern = this.defaultPattern;\n\n if (minLength !== undefined && value.length < minLength) {\n throw new InvariantViolationError({\n message: `Text must be at least ${minLength} characters`,\n code: 'TEXT_TOO_SHORT',\n });\n }\n\n if (maxLength !== undefined && value.length > maxLength) {\n throw new InvariantViolationError({\n message: `Text must be at most ${maxLength} characters`,\n code: 'TEXT_TOO_LONG',\n });\n }\n\n if (pattern !== undefined && !pattern.test(value)) {\n throw new InvariantViolationError({\n message: 'Text does not match required pattern',\n code: 'TEXT_INVALID_PATTERN',\n });\n }\n\n return new this(value);\n }\n}\n\n// =============================================================================\n// Pre-configured Text VOs (for backwards compatibility)\n// =============================================================================\n\n/**\n * Short text value object (1-100 characters).\n *\n * Use for: names, titles, labels\n */\nexport class BaseShortTextVo extends BaseTextVo {\n static override defaultMinLength = 1;\n static override defaultMaxLength = 100;\n}\n\n/**\n * Medium text value object (1-500 characters).\n *\n * Use for: descriptions, summaries, comments\n */\nexport class BaseMediumTextVo extends BaseTextVo {\n static override defaultMinLength = 1;\n static override defaultMaxLength = 500;\n}\n\n/**\n * Long text value object (1-5000 characters).\n *\n * Use for: articles, content bodies, notes\n */\nexport class BaseLongTextVo extends BaseTextVo {\n static override defaultMinLength = 1;\n static override defaultMaxLength = 5000;\n}\n","/**\n * Base UUID v4 value object for random entity identifiers.\n *\n * UUID v4 is a randomly generated UUID, suitable for identifiers where\n * time-ordering is not required. For time-sortable IDs, use {@link BaseUuidV7Vo}.\n *\n * **Use Cases:**\n * - User IDs\n * - Session tokens\n * - Correlation IDs\n * - Any identifier where time-ordering doesn't matter\n *\n * @example\n * ```typescript\n * const id = BaseUuidV4Vo.generate();\n * const parsed = BaseUuidV4Vo.create('550e8400-e29b-41d4-a716-446655440000');\n * ```\n */\nimport { v4 } from 'uuid';\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for UUID v4 identifiers.\n *\n * @extends BaseValueObject<string>\n */\nexport class BaseUuidV4Vo extends BaseValueObject<string> {\n private static readonly UUID_V4_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n /**\n * Creates a UUID v4 value object from an existing UUID string.\n * @param value - The UUID string to validate and wrap\n * @throws {InvariantViolationError} When UUID format is invalid\n */\n static create(value: BaseUuidV4Vo['value']): BaseUuidV4Vo {\n if (!BaseUuidV4Vo.UUID_V4_REGEX.test(value)) {\n throw new InvariantViolationError({\n message: 'Invalid UUID v4 format',\n code: 'INVALID_UUID_V4',\n });\n }\n return new BaseUuidV4Vo(value);\n }\n\n /**\n * Generates a new UUID v4 value object.\n * No validation needed since uuid library guarantees valid output.\n */\n static generate(): BaseUuidV4Vo {\n return new BaseUuidV4Vo(v4());\n }\n}\n","/**\n * Base UUID v7 value object for time-sortable entity identifiers.\n *\n * UUID v7 is a time-ordered UUID that combines a Unix timestamp with\n * random bits, making it ideal for database primary keys because:\n *\n * **Benefits:**\n * - **Time-sortable**: IDs created later sort after earlier ones\n * - **Database-friendly**: Sequential nature reduces B-tree fragmentation\n * - **Globally unique**: Same uniqueness guarantees as other UUID versions\n * - **Timestamp extractable**: Creation time can be derived from the ID\n *\n * @example\n * ```typescript\n * const id = BaseUuidV7Vo.generate();\n * const parsed = BaseUuidV7Vo.create('018f3b1c-5e7d-7000-8000-000000000001');\n * ```\n */\nimport { v7 } from 'uuid';\nimport { BaseValueObject } from '../classes/base-value-object.class';\nimport { InvariantViolationError } from '../exceptions/invariant-violation.error';\n\n/**\n * Value object for UUID v7 identifiers.\n *\n * @extends BaseValueObject<string>\n */\nexport class BaseUuidV7Vo extends BaseValueObject<string> {\n private static readonly UUID_V7_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n /**\n * Creates a UUID v7 value object from an existing UUID string.\n * @param value - The UUID string to validate and wrap\n * @throws {InvariantViolationError} When UUID format is invalid\n */\n static create(value: BaseUuidV7Vo['value']): BaseUuidV7Vo {\n if (!BaseUuidV7Vo.UUID_V7_REGEX.test(value)) {\n throw new InvariantViolationError({\n message: 'Invalid UUID v7 format',\n code: 'INVALID_UUID_V7',\n });\n }\n return new BaseUuidV7Vo(value);\n }\n\n /**\n * Generates a new UUID v7 value object.\n * No validation needed since uuid library guarantees valid output.\n */\n static generate(): BaseUuidV7Vo {\n return new BaseUuidV7Vo(v7());\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 */\n 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":[]}