@rineex/ddd 2.0.0 → 2.2.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.
- package/dist/index.d.mts +990 -303
- package/dist/index.d.ts +990 -303
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -3
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var $=Object.create;var T=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var C=t=>{throw TypeError(t)};var X=(t,e)=>{for(var r in e)T(t,r,{get:e[r],enumerable:!0})},L=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of Q(e))!W.call(t,c)&&c!==r&&T(t,c,{get:()=>e[c],enumerable:!(o=B(e,c))||o.enumerable});return t};var I=(t,e,r)=>(r=t!=null?$(K(t)):{},L(e||!t||!t.__esModule?T(r,"default",{value:t,enumerable:!0}):r,t)),J=t=>L(T({},"__esModule",{value:!0}),t);var V=(t,e,r)=>e.has(t)||C("Cannot "+r);var s=(t,e,r)=>(V(t,e,"read from private field"),r?r.call(t):e.get(t)),y=(t,e,r)=>e.has(t)?C("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),l=(t,e,r,o)=>(V(t,e,"write to private field"),o?o.call(t,r):e.set(t,r),r);var ee={};X(ee,{AggregateId:()=>v,AggregateRoot:()=>O,ApplicationError:()=>f,DomainError:()=>a,DomainEvent:()=>S,DomainID:()=>U,Email:()=>M,Entity:()=>u,EntityValidationError:()=>_,HttpStatus:()=>Z,HttpStatusMessage:()=>b,InternalError:()=>h,InvalidValueObjectError:()=>p,PrimitiveValueObject:()=>d,Result:()=>N,TimeoutError:()=>P,UUID:()=>m,ValueObject:()=>x,deepFreeze:()=>i});module.exports=J(ee);var Z=Object.freeze({REQUEST_HEADER_FIELDS_TOO_LARGE:431,NETWORK_AUTHENTICATION_REQUIRED:511,NON_AUTHORITATIVE_INFORMATION:203,PROXY_AUTHENTICATION_REQUIRED:407,UNAVAILABLE_FOR_LEGAL_REASONS:451,HTTP_VERSION_NOT_SUPPORTED:505,BANDWIDTH_LIMIT_EXCEEDED:509,VARIANT_ALSO_NEGOTIATES:506,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,PRECONDITION_REQUIRED:428,INTERNAL_SERVER_ERROR:500,UNPROCESSABLE_ENTITY:422,INSUFFICIENT_STORAGE:507,SWITCHING_PROTOCOLS:101,PRECONDITION_FAILED:412,MISDIRECTED_REQUEST:421,SERVICE_UNAVAILABLE:503,TEMPORARY_REDIRECT:307,PERMANENT_REDIRECT:308,METHOD_NOT_ALLOWED:405,EXPECTATION_FAILED:417,MOVED_PERMANENTLY:301,PAYLOAD_TOO_LARGE:413,FAILED_DEPENDENCY:424,TOO_MANY_REQUESTS:429,ALREADY_REPORTED:208,MULTIPLE_CHOICES:300,PAYMENT_REQUIRED:402,UPGRADE_REQUIRED:426,PARTIAL_CONTENT:206,REQUEST_TIMEOUT:408,LENGTH_REQUIRED:411,NOT_IMPLEMENTED:501,GATEWAY_TIMEOUT:504,NOT_ACCEPTABLE:406,RESET_CONTENT:205,LOOP_DETECTED:508,MULTI_STATUS:207,NOT_MODIFIED:304,UNAUTHORIZED:401,URI_TOO_LONG:414,NOT_EXTENDED:510,EARLY_HINTS:103,BAD_REQUEST:400,IM_A_TEAPOT:418,BAD_GATEWAY:502,PROCESSING:102,NO_CONTENT:204,SEE_OTHER:303,USE_PROXY:305,FORBIDDEN:403,NOT_FOUND:404,TOO_EARLY:425,CONTINUE:100,ACCEPTED:202,CONFLICT:409,CREATED:201,IM_USED:226,LOCKED:423,FOUND:302,GONE:410,OK:200}),b={431:"Request Header Fields Too Large",511:"Network Authentication Required",203:"Non-Authoritative Information",407:"Proxy Authentication Required",451:"Unavailable For Legal Reasons",505:"HTTP Version Not Supported",509:"Bandwidth Limit Exceeded",506:"Variant Also Negotiates",415:"Unsupported Media Type",416:"Range Not Satisfiable",428:"Precondition Required",500:"Internal Server Error",422:"Unprocessable Entity",507:"Insufficient Storage",101:"Switching Protocols",412:"Precondition Failed",421:"Misdirected Request",503:"Service Unavailable",307:"Temporary Redirect",308:"Permanent Redirect",405:"Method Not Allowed",417:"Expectation Failed",301:"Moved Permanently",413:"Payload Too Large",424:"Failed Dependency",429:"Too Many Requests",208:"Already Reported",300:"Multiple Choices",402:"Payment Required",426:"Upgrade Required",206:"Partial Content",408:"Request Timeout",411:"Length Required",501:"Not Implemented",504:"Gateway Timeout",406:"Not Acceptable",205:"Reset Content",508:"Loop Detected",207:"Multi-Status",304:"Not Modified",401:"Unauthorized",414:"URI Too Long",418:"I'm a Teapot",510:"Not Extended",103:"Early Hints",400:"Bad Request",502:"Bad Gateway",102:"Processing",204:"No Content",303:"See Other",305:"Use Proxy",403:"Forbidden",404:"Not Found",425:"Too Early",100:"Continue",202:"Accepted",226:"I'm Used",409:"Conflict",201:"Created",423:"Locked",302:"Found",410:"Gone",200:"OK"};var f=class extends Error{constructor({code:e=b[500],isOperational:r=!1,status:o=500,metadata:c,message:z,cause:q}){super(z),this.name=new.target.name,this.code=e,this.status=o,this.isOperational=r,this.metadata=c,this.cause=q,Error.captureStackTrace(this,new.target)}};function i(t,e=new WeakSet){if(t===null||typeof t!="object"||typeof t=="function"||Object.isFrozen(t)||e.has(t))return t;if(e.add(t),Array.isArray(t))for(let r of t)i(r,e);else for(let r of Object.keys(t))i(t[r],e);return Object.freeze(t)}var E,u=class{constructor(e){y(this,E);var r;this.id=e.id,this.createdAt=(r=e.createdAt)!=null?r:new Date,l(this,E,i(e.props)),this.validate()}get props(){return s(this,E)}equals(e){return e==null?!1:this===e?!0:this.id.equals(e.id)}mutate(e){let r=e(s(this,E));l(this,E,i(r)),this.validate()}};E=new WeakMap;var O=class extends u{constructor(){super(...arguments);this._domainEvents=[]}get domainEvents(){return[...this._domainEvents]}addEvent(r){this._domainEvents.push(r)}pullDomainEvents(){let r=[...this._domainEvents];return this._domainEvents.length=0,r}};var n,A=class A{constructor(e){y(this,n);this.validate(e),l(this,n,e)}get value(){return s(this,n)}equals(e){return e==null||Object.getPrototypeOf(this)!==Object.getPrototypeOf(e)||!(e instanceof A)?!1:s(this,n)===s(e,n)}getValue(){return s(this,n)}toString(){return String(s(this,n))}};n=new WeakMap;var d=A;var F=I(require("fast-deep-equal/es6"));var x=class t{get value(){return this.props}constructor(e){this.validate(e),this.props=i(e)}static is(e){return e instanceof t}equals(e){return e==null||Object.getPrototypeOf(this)!==Object.getPrototypeOf(e)?!1:(0,F.default)(this.props,e.props)}toJSON(){return this.props}toString(){return JSON.stringify(this.props)}};var a=class{get errorName(){return this.code.split(".")[1]}get namespace(){return this.code.split(".")[0]}constructor(e,...r){var o;this.message=e,this.metadata=Object.freeze((o=r[0])!=null?o:{})}toObject(){return{metadata:this.metadata,message:this.message,code:this.code,type:this.type}}toString(){return`[${this.code}] ${this.message}`}};var h=class extends a{constructor(r="An unexpected internal error occurred",o){super(r,o);this.code="CORE.INTERNAL_ERROR";this.type="DOMAIN.INVALID_STATE"}};var P=class extends a{constructor(r,o){super(r,o);this.code="SYSTEM.TIMEOUT";this.type="DOMAIN.INVALID_STATE"}};var N=class t{constructor(e){let r=e.error!==void 0;this.isFailure=r,this.isSuccess=!r,this._value=e.value,this._error=e.error,Object.freeze(this)}static fail(e){return new t({error:e})}static ok(e){return new t({value:e})}getError(){return this._error}getValue(){return this._value}isFailureResult(){return this.isFailure}isSuccessResult(){return this.isSuccess}};var _=class t extends a{constructor(){super(...arguments);this.code="CORE.VALIDATION_FAILED";this.type="DOMAIN.INVALID_STATE"}static create(r){return new t(r)}};var p=class t extends a{constructor(){super(...arguments);this.code="DOMAIN.INVALID_VALUE";this.type="DOMAIN.INVALID_VALUE"}static create(r="Provided value object is incorrect",o){return new t(r,o)}};var w=require("crypto");var S=class{constructor(e){var r;this.id=(r=e.id)!=null?r:(0,w.randomUUID)(),this.aggregateId=e.aggregateId,this.schemaVersion=e.schemaVersion,this.occurredAt=e.occurredAt,this.payload=i(e.payload)}toPrimitives(){return{aggregateId:this.aggregateId.toString(),schemaVersion:this.schemaVersion,occurredAt:this.occurredAt,eventName:this.eventName,payload:this.payload,id:this.id}}};var H=require("uuid"),k=I(require("zod"));var D=class D extends d{constructor(e){super(e),this.validate(e)}static fromString(e){return new this(e)}static generate(){return new this((0,H.v4)())}validate(e){if(!D.schema.safeParse(e).success)throw p.create(`Invalid ${this.constructor.name}: ${e}`,{value:e})}};D.schema=k.default.uuid();var m=D;var v=class extends m{};var j=require("uuid"),G=I(require("zod"));var R=class R extends d{constructor(e){super(e)}static fromString(e){return new this(e)}static generate(){return new this((0,j.v4)())}validate(e){if(!R.schema.safeParse(e).success)throw p.create(`Invalid UUID: ${e}`)}};R.schema=G.default.uuid();var U=R;var Y=I(require("zod"));var g=class g extends d{constructor(e){super(e),this.validate(e)}static fromString(e){return new this(e)}validate(e){if(!g.schema.safeParse(e).success)throw p.create(`Invalid ${this.constructor.name}: ${e}`,{value:e})}};g.schema=Y.default.email();var M=g;0&&(module.exports={AggregateId,AggregateRoot,ApplicationError,DomainError,DomainEvent,DomainID,Email,Entity,EntityValidationError,HttpStatus,HttpStatusMessage,InternalError,InvalidValueObjectError,PrimitiveValueObject,Result,TimeoutError,UUID,ValueObject,deepFreeze});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/domain/entities/entity.ts","../src/domain/aggregates/aggregate-root.ts","../src/domain/base/domain.error.ts","../src/domain/base/primitive-vo.ts","../src/domain/base/vo.ts","../src/utils/deep-freeze.util.ts","../src/domain/errors/entity-validation.error.ts","../src/domain/errors/invalid-vo.error.ts","../src/domain/events/domain.event.ts","../src/domain/value-objects/id.vo.ts","../src/domain/value-objects/aggregate-id.vo.ts","../src/gateway/constants/http-code.ts","../src/utils/errors/application.error.ts","../src/utils/unwrap-vo.util.ts"],"sourcesContent":["export * from './application';\nexport * from './domain/aggregates';\nexport * from './domain/base/domain.error';\nexport * from './domain/base/primitive-vo';\nexport * from './domain/base/vo';\nexport * from './domain/entities';\nexport * from './domain/errors/entity-validation.error';\nexport * from './domain/errors/invalid-vo.error';\nexport * from './domain/events';\nexport * from './domain/types';\nexport * from './domain/value-objects/aggregate-id.vo';\nexport * from './domain/value-objects/id.vo';\nexport * from './gateway/constants/http-code';\nexport * from './utils';\n","import { EntityId } from '../types';\n\n/**\n * Configuration for the base Entity constructor.\n * Forces a single-object argument pattern to avoid positional argument errors.\n * @template ID - A type satisfying the EntityId interface.\n */\nexport interface EntityProps<ID extends EntityId, Props> {\n /** The unique identity of the entity */\n readonly id: ID;\n /** Optional creation timestamp; defaults to 'now' if not provided */\n readonly createdAt?: Date;\n\n readonly props: Props;\n}\n\n/**\n * Abstract Base Entity for Domain-Driven Design (DDD).\n * This class provides the standard contract for entity equality and identity.\n * It intentionally avoids \"magic\" property bags to ensure V8 engine optimization\n * and better IDE intellisense.\n * @template ID - The specific Identity Value Object type.\n */\nexport abstract class Entity<ID extends EntityId, Props> {\n /** The timestamp when this entity was first instantiated/created */\n public readonly createdAt: Date;\n /** The immutable unique identifier for this entity */\n public readonly id: ID;\n\n /**\n * Protected constructor to be called by subclasses.\n * @param props - Initial identity and metadata.\n */\n protected constructor(props: EntityProps<ID, Props>) {\n this.id = props.id;\n this.createdAt = props.createdAt ?? new Date();\n }\n\n /**\n * Compares entities by identity.\n * In DDD, two entities are considered equal if their IDs match,\n * regardless of their other properties.\n * @param other - The entity to compare against.\n * @returns True if IDs are equal.\n */\n public equals(other?: Entity<ID, Props>): boolean {\n if (other == null) return false;\n if (this === other) return true;\n return this.id.equals(other.id);\n }\n\n /**\n * Converts the Entity into a plain Javascript object.\n * Subclasses must implement this to explicitly control serialization,\n * @returns A plain object representation of the entity.\n */\n public abstract toObject(): Record<string, unknown>;\n\n /**\n * Validates the current state of the entity against domain invariants.\n * This method should be called after construction and any mutation.\n * @throws {Error} Should throw a specific DomainError if validation fails.\n */\n public abstract validate(): void;\n}\n","import { Entity, EntityProps } from '../entities/entity';\nimport { DomainEvent } from '../events';\nimport { EntityId } from '../types';\n\n/**\n * Interface for AggregateRoot to ensure type safety and extensibility.\n */\nexport interface Props<P> extends EntityProps<EntityId, P> {\n readonly domainEvents: readonly DomainEvent[];\n /**\n * Adds a domain event to the aggregate.\n * @param event The domain event to add.\n */\n addEvent: (event: DomainEvent) => void;\n\n /**\n * Retrieves and clears all domain events recorded by this aggregate.\n *\n * Domain events represent facts that occurred as a result of state changes\n * within the aggregate. This method transfers ownership of those events\n * to the application layer for further processing (e.g. publishing).\n *\n * Calling this method has the side effect of clearing the aggregate's\n * internal event collection to prevent duplicate handling.\n *\n * This method is intended to be invoked by application services\n * after the aggregate has been successfully persisted.\n *\n * @returns A read-only list of domain events raised by this aggregate.\n */\n pullDomainEvents: () => readonly DomainEvent[];\n}\n\n/**\n * Base class for aggregate roots in DDD, encapsulating domain events and validation.\n * @template EntityProps The type of the entity's properties.\n */\nexport abstract class AggregateRoot<ID extends EntityId, P> extends Entity<\n ID,\n P\n> {\n /**\n * Gets a read-only copy of the domain events.\n */\n get domainEvents(): readonly DomainEvent[] {\n return [...this._domainEvents];\n }\n\n /**\n * Internal list of domain events.\n */\n private readonly _domainEvents: DomainEvent[] = [];\n\n /**\n * Adds a domain event to the aggregate after validating invariants.\n * @param domainEvent The domain event to add.\n * @throws {EntityValidationError} If invariants are not met.\n */\n addEvent(domainEvent: DomainEvent): void {\n this._domainEvents.push(domainEvent);\n }\n\n public pullDomainEvents(): readonly DomainEvent[] {\n const events = [...this._domainEvents];\n this._domainEvents.length = 0;\n return events;\n }\n}\n","export interface DomainErrorMetadata {\n cause?: { name: string; message: string; stack?: string };\n [key: string]: unknown;\n}\n\nconst getCauseInfo = (cause: Error | undefined) => {\n // 1. Handle Error objects specifically\n if (cause instanceof Error) {\n return {\n cause: {\n message: cause.message,\n stack: cause.stack,\n name: cause.name,\n },\n };\n }\n\n // 2. Handle other existing values\n if (cause) {\n return { cause };\n }\n\n // 3. Default to empty\n return {};\n};\n\n/**\n * Base class for all Domain Errors in the application.\n *\n * This class ensures:\n * 1. Serializable and structured for logs or API responses.\n * 2. Identifiable via stable error codes (not just class names).\n * 3. Contextual with optional structured metadata.\n * 4. Supports error chaining (cause) and stack trace preservation.\n *\n * @example\n * export class InsufficientFundsError extends DomainError {\n * constructor(accountId: string, currentBalance: number) {\n * super(\n * `Account ${accountId} has insufficient funds.`,\n * 'INSUFFICIENT_FUNDS',\n * { accountId, currentBalance }\n * );\n * }\n * }\n */\nexport abstract class DomainError extends Error {\n /** Stable, machine-readable error code */\n public readonly code: string;\n /** Structured, immutable domain metadata */\n public readonly metadata: Readonly<DomainErrorMetadata>;\n\n /**\n * @param message - Human-readable error message\n * @param code - Stable error code\n * @param metadata - Domain-specific structured data; optional `cause` can be included\n */\n protected constructor(\n message: string,\n code: string,\n metadata: DomainErrorMetadata = {},\n ) {\n super(message, { ...getCauseInfo(metadata.cause) });\n\n // Restore prototype chain for proper `instanceof` checks\n Object.setPrototypeOf(this, new.target.prototype);\n\n this.name = new.target.name;\n this.code = code;\n this.metadata = Object.freeze({ ...metadata });\n }\n}\n","import { EntityId } from '../types';\n\ntype Primitive = boolean | number | string;\n\n/**\n * Base class for primitive-based Value Objects.\n *\n * This class is intended for Value Objects that are represented by\n * a single primitive value (string, number, or boolean).\n *\n * Characteristics:\n * - Immutable by construction\n * - Cheap equality comparison\n * - No deep cloning or freezing\n * - Safe for serialization and logging\n *\n * Examples:\n * - AggregateId\n * - EmailAddress\n * - Username\n * - Slug\n */\nexport abstract class PrimitiveValueObject<\n T extends Primitive,\n> implements EntityId {\n /**\n * The underlying primitive value.\n * Guaranteed to be valid after construction.\n */\n protected readonly value: T;\n\n /**\n * Constructs a new PrimitiveValueObject.\n *\n * @param value - The primitive value to wrap\n * @throws Error if validation fails\n */\n protected constructor(value: T) {\n this.validate(value);\n this.value = value;\n }\n\n /**\n * Compares two Value Objects for equality.\n *\n * Equality rules:\n * - Same concrete class\n * - Same primitive value (===)\n *\n * @param other - Another Value Object\n */\n public equals(other?: PrimitiveValueObject<T> | null | undefined): boolean {\n if (other === undefined || other === null) return false;\n\n if (Object.getPrototypeOf(this) !== Object.getPrototypeOf(other)) {\n return false;\n }\n\n return this.value === other.value;\n }\n\n /**\n * Returns the primitive value.\n * Prefer explicit access over implicit coercion.\n */\n public getValue(): T {\n return this.value;\n }\n\n /**\n * JSON serialization hook.\n * Produces the raw primitive value.\n */\n public toJSON(): T {\n return this.value;\n }\n\n /**\n * String representation.\n * Useful for logging and debugging.\n */\n public toString(): string {\n return String(this.value);\n }\n\n /**\n * Domain invariant validation.\n * Must throw if the value is invalid.\n *\n * @param value - The value to validate\n */\n protected abstract validate(value: T): void;\n}\n","import deepEqual from 'fast-deep-equal/es6';\n\nimport { deepFreeze } from '@/utils/deep-freeze.util';\n\nexport abstract class ValueObject<T> {\n get value(): T {\n return this.props;\n }\n\n protected readonly props: Readonly<T>;\n\n protected constructor(props: T) {\n this.validate(props);\n this.props = deepFreeze(props);\n }\n\n /**\n * Type guard to check if an unknown object is an instance of ValueObject.\n * This is useful for runtime type checking.\n *\n * @param vo The object to check.\n * @returns True if the object is a ValueObject instance, false otherwise.\n */\n public static is(vo: unknown): vo is ValueObject<unknown> {\n return vo instanceof ValueObject;\n }\n\n /**\n * Deep equality comparison of ValueObjects\n */\n public equals(other?: ValueObject<T>): boolean {\n if (other === null || other === undefined) return false;\n\n // Check if they share the same constructor (Type check)\n if (Object.getPrototypeOf(this) !== Object.getPrototypeOf(other)) {\n return false;\n }\n\n return deepEqual(this.props, other.props);\n }\n\n /**\n * Standard for clean API integration and logging.\n */\n public toJSON(): T {\n return this.props;\n }\n\n /**\n * Useful for debugging and string-based indexing.\n */\n public toString(): string {\n return JSON.stringify(this.props);\n }\n\n /**\n * Validates the value object props\n * @throws InvalidValueObjectError if validation fails\n */\n protected abstract validate(props: T): void;\n}\n","/**\n * Utility to deeply freeze objects to ensure immutability - handles nested objects and arrays.\n *\n * @param obj - The object to be deeply frozen.\n * @param seen - A WeakSet to track already processed objects (for circular references).\n * @returns A deeply frozen version of the input object.\n */\nexport function deepFreeze<T>(\n obj: T,\n seen = new WeakSet<object>(),\n): Readonly<T> {\n // Handle null, undefined, or non-object types\n if (obj == null || (typeof obj !== 'object' && !Array.isArray(obj))) {\n return obj;\n }\n\n // Skip if already frozen\n if (Object.isFrozen(obj)) {\n return obj as Readonly<T>;\n }\n\n // Handle circular references\n if (seen.has(obj as object)) {\n return obj as Readonly<T>;\n }\n\n seen.add(obj as object);\n\n // Handle arrays explicitly\n if (Array.isArray(obj)) {\n obj.forEach(item => deepFreeze(item, seen));\n } else {\n // Handle plain objects\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n deepFreeze((obj as Record<string, unknown>)[key], seen);\n }\n }\n }\n\n return Object.freeze(obj) as Readonly<T>;\n}\n","import { DomainError } from '../base/domain.error';\n\n/**\n * Custom error class for entity validation failures.\n */\nexport class EntityValidationError extends DomainError {\n constructor(message: string, cause?: Error) {\n super(message, 'ENTITY_VALIDATION_ERROR', { cause });\n }\n}\n","import { DomainError } from '../base/domain.error';\n\nexport class InvalidValueObjectError extends DomainError {\n constructor(message: string) {\n super(message, 'INVALID_VALUE_OBJECT');\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { EntityId } from '../types';\n\ntype Primitive = boolean | number | string | null;\n\ntype Serializable =\n | Primitive\n | Serializable[]\n | { [key: string]: Serializable };\n\nexport type DomainEventPayload = Record<string, Serializable>;\n\nexport type UnixTimestampMillis = number;\n\ntype DomainEventProps<AggregateId extends EntityId, Payload> = {\n id?: string;\n aggregateId: AggregateId;\n schemaVersion: number;\n occurredAt: UnixTimestampMillis;\n payload: Payload;\n};\n\n// Abstract base class for domain events\nexport abstract class DomainEvent<\n AggregateId extends EntityId = EntityId,\n T extends DomainEventPayload = DomainEventPayload,\n> {\n public readonly aggregateId: AggregateId;\n\n public abstract readonly eventName: string;\n public readonly id: string;\n public readonly occurredAt: number;\n public readonly payload: Readonly<T>;\n public readonly schemaVersion: number;\n\n protected constructor(props: DomainEventProps<AggregateId, T>) {\n this.id = props.id ?? randomUUID();\n this.aggregateId = props.aggregateId;\n this.schemaVersion = props.schemaVersion;\n this.occurredAt = props.occurredAt;\n this.payload = Object.freeze(props.payload);\n }\n\n public toPrimitives(): Readonly<{\n id: string;\n eventName: string;\n aggregateId: string;\n schemaVersion: number;\n occurredAt: UnixTimestampMillis;\n payload: T;\n }> {\n return {\n aggregateId: this.aggregateId.toString(),\n schemaVersion: this.schemaVersion,\n occurredAt: this.occurredAt,\n eventName: this.eventName,\n payload: this.payload,\n id: this.id,\n };\n }\n}\n","import { v4 } from 'uuid';\nimport z from 'zod';\n\nimport { InvalidValueObjectError } from '../errors/invalid-vo.error';\nimport { PrimitiveValueObject } from '../base/primitive-vo';\n\n/**\n * Represents a UUID (Universally Unique Identifier) value object.\n *\n * This class extends PrimitiveValueObject to provide type-safe UUID handling\n * with validation using Zod schema. UUIDs are immutable and can be generated\n * randomly or created from string values.\n *\n * @example\n * // Generate a new random UUID\n * const id = UUID.generate();\n *\n * @example\n * // Create UUID from an existing string\n * const id = UUID.fromString('550e8400-e29b-41d4-a716-446655440000');\n *\n * @throws {InvalidValueObjectError} When the provided string is not a valid UUID format\n */\nexport class UUID extends PrimitiveValueObject<string> {\n private static readonly schema = z.uuid();\n\n public constructor(value: string) {\n super(value);\n this.validate(value);\n }\n\n /**\n * Creates an UUID from an external string.\n * Use only for untrusted input.\n *\n * @param value - UUID string\n */\n public static fromString(value: string): UUID {\n return new this(value);\n }\n\n /**\n * Generates a new AggregateId.\n */\n public static generate<T extends typeof UUID>(this: T): InstanceType<T> {\n return new this(v4()) as InstanceType<T>;\n }\n\n protected validate(value: string): void {\n const result = UUID.schema.safeParse(value);\n\n if (!result.success) {\n throw new InvalidValueObjectError(\n `Invalid UUID: ${result.error.message}`,\n );\n }\n }\n}\n","import { UUID } from './id.vo';\n\n/**\n * AggregateId represents a strongly-typed aggregate identifier.\n *\n * - Backed by UUID v4\n * - Immutable\n * - Comparable only to AggregateId\n */\nexport class AggregateId extends UUID {}\n","/**\n * HTTP status code catalog.\n *\n * This object provides a typed, immutable map of standard HTTP status names\n * to their numeric codes. Designed for server-side frameworks such as Fastify.\n *\n * - All identifiers use clear, canonical semantic names.\n * - Values are numeric status codes.\n * - Frozen to prevent runtime mutation.\n * - Exporting `HttpStatus` ensures type-safe usage across the codebase.\n * Usage:\n * ```ts\n * import { HttpStatus } from 'path-to-this-file';\n *\n * function handleRequest() {\n * return {\n * statusCode: HttpStatus.OK,\n * body: 'Success',\n * };\n * }\n * ```\n */\nexport const HttpStatus = Object.freeze({\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n NETWORK_AUTHENTICATION_REQUIRED: 511,\n NON_AUTHORITATIVE_INFORMATION: 203,\n PROXY_AUTHENTICATION_REQUIRED: 407,\n\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n BANDWIDTH_LIMIT_EXCEEDED: 509,\n VARIANT_ALSO_NEGOTIATES: 506,\n UNSUPPORTED_MEDIA_TYPE: 415,\n RANGE_NOT_SATISFIABLE: 416,\n PRECONDITION_REQUIRED: 428,\n INTERNAL_SERVER_ERROR: 500,\n UNPROCESSABLE_ENTITY: 422,\n INSUFFICIENT_STORAGE: 507,\n\n SWITCHING_PROTOCOLS: 101,\n PRECONDITION_FAILED: 412,\n MISDIRECTED_REQUEST: 421,\n SERVICE_UNAVAILABLE: 503,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n METHOD_NOT_ALLOWED: 405,\n EXPECTATION_FAILED: 417,\n\n MOVED_PERMANENTLY: 301,\n PAYLOAD_TOO_LARGE: 413,\n FAILED_DEPENDENCY: 424,\n TOO_MANY_REQUESTS: 429,\n ALREADY_REPORTED: 208,\n MULTIPLE_CHOICES: 300,\n PAYMENT_REQUIRED: 402,\n UPGRADE_REQUIRED: 426,\n PARTIAL_CONTENT: 206,\n REQUEST_TIMEOUT: 408,\n LENGTH_REQUIRED: 411,\n NOT_IMPLEMENTED: 501,\n GATEWAY_TIMEOUT: 504,\n NOT_ACCEPTABLE: 406,\n RESET_CONTENT: 205,\n LOOP_DETECTED: 508,\n MULTI_STATUS: 207,\n NOT_MODIFIED: 304,\n UNAUTHORIZED: 401,\n URI_TOO_LONG: 414,\n NOT_EXTENDED: 510,\n EARLY_HINTS: 103,\n BAD_REQUEST: 400,\n IM_A_TEAPOT: 418,\n BAD_GATEWAY: 502,\n PROCESSING: 102,\n NO_CONTENT: 204,\n SEE_OTHER: 303,\n USE_PROXY: 305,\n\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n TOO_EARLY: 425,\n CONTINUE: 100,\n ACCEPTED: 202,\n CONFLICT: 409,\n CREATED: 201,\n IM_USED: 226,\n LOCKED: 423,\n FOUND: 302,\n GONE: 410,\n OK: 200,\n} as const);\n\n/**\n * HTTP status messages mapped by numeric code.\n * Use for sending descriptive text in responses or logging.\n */\nexport const HttpStatusMessage = {\n 431: 'Request Header Fields Too Large',\n 511: 'Network Authentication Required',\n 203: 'Non-Authoritative Information',\n 407: 'Proxy Authentication Required',\n 451: 'Unavailable For Legal Reasons',\n 505: 'HTTP Version Not Supported',\n 509: 'Bandwidth Limit Exceeded',\n 506: 'Variant Also Negotiates',\n 415: 'Unsupported Media Type',\n 416: 'Range Not Satisfiable',\n 428: 'Precondition Required',\n 500: 'Internal Server Error',\n 422: 'Unprocessable Entity',\n 507: 'Insufficient Storage',\n 101: 'Switching Protocols',\n 412: 'Precondition Failed',\n 421: 'Misdirected Request',\n 503: 'Service Unavailable',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 405: 'Method Not Allowed',\n 417: 'Expectation Failed',\n 301: 'Moved Permanently',\n 413: 'Payload Too Large',\n 424: 'Failed Dependency',\n 429: 'Too Many Requests',\n 208: 'Already Reported',\n 300: 'Multiple Choices',\n 402: 'Payment Required',\n 426: 'Upgrade Required',\n 206: 'Partial Content',\n 408: 'Request Timeout',\n 411: 'Length Required',\n 501: 'Not Implemented',\n 504: 'Gateway Timeout',\n 406: 'Not Acceptable',\n 205: 'Reset Content',\n 508: 'Loop Detected',\n 207: 'Multi-Status',\n 304: 'Not Modified',\n 401: 'Unauthorized',\n 414: 'URI Too Long',\n 418: \"I'm a Teapot\",\n 510: 'Not Extended',\n 103: 'Early Hints',\n 400: 'Bad Request',\n 502: 'Bad Gateway',\n 102: 'Processing',\n 204: 'No Content',\n 303: 'See Other',\n 305: 'Use Proxy',\n 403: 'Forbidden',\n 404: 'Not Found',\n 425: 'Too Early',\n 100: 'Continue',\n 202: 'Accepted',\n 226: \"I'm Used\",\n 409: 'Conflict',\n 201: 'Created',\n 423: 'Locked',\n 302: 'Found',\n 410: 'Gone',\n 200: 'OK',\n} as const;\n\nexport type HttpStatusCode = keyof typeof HttpStatusMessage;\n\nexport type HttpStatusMessage =\n (typeof HttpStatusMessage)[keyof typeof HttpStatusMessage];\n","import {\n HttpStatusCode,\n HttpStatusMessage,\n} from '@/gateway/constants/http-code';\n\ninterface ErrorParams {\n message: string;\n code: HttpStatusMessage;\n status?: HttpStatusCode;\n metadata?: Record<string, unknown> | undefined;\n isOperational?: boolean;\n cause?: Error | undefined;\n}\n\n/**\n * Abstract base class for application-level errors with structured error handling.\n *\n * Extends the native Error class to provide machine-readable error codes, HTTP status codes,\n * operational error classification, and optional metadata for better error tracking and client communication.\n *\n * @abstract\n * @extends {Error}\n *\n * @example\n * ```typescript\n * class UserNotFoundError extends ApplicationError {\n * constructor(userId: string) {\n * super({\n * code: HttpStatusMessage['404'],\n * status: 404,\n * isOperational: true,\n * message: `User with id ${userId} not found`,\n * metadata: { userId }\n * });\n * }\n * }\n * ```\n */\nexport abstract class ApplicationError extends Error {\n /** Optional cause (linked error) */\n public readonly cause?: Error | undefined;\n /** Machine-readable error code (e.g. `OTP_LOCKED`, `USER_NOT_FOUND`) */\n public readonly code: HttpStatusMessage;\n /** Operational vs programmer error flag */\n public readonly isOperational: boolean;\n /** Optional structured metadata for debugging or clients */\n public readonly metadata?: Record<string, unknown> | undefined;\n /** HTTP status code intended for response layer */\n public readonly status: HttpStatusCode;\n\n constructor({\n code = HttpStatusMessage['500'],\n isOperational = false,\n status = 500,\n metadata,\n message,\n cause,\n }: ErrorParams) {\n super(message);\n\n this.name = new.target.name;\n this.code = code;\n this.status = status;\n this.isOperational = isOperational;\n this.metadata = metadata;\n this.cause = cause;\n\n Error.captureStackTrace(this, new.target);\n }\n}\n","import { ValueObject } from '@/domain/base/vo';\n\nexport type UnwrapValueObject<T> =\n T extends ValueObject<infer V>\n ? UnwrapValueObject<V>\n : T extends (infer U)[]\n ? UnwrapValueObject<U>[]\n : T extends Map<infer K, infer V>\n ? Map<K, UnwrapValueObject<V>>\n : T extends Set<infer V>\n ? Set<UnwrapValueObject<V>>\n : T extends Date\n ? string\n : T extends object\n ? { [K in keyof T]: UnwrapValueObject<T[K]> }\n : T;\n\nexport function unwrapValueObject<T>(\n input: T,\n seen = new WeakSet(),\n): UnwrapValueObject<T> {\n if (input === null || input === undefined) {\n return input as UnwrapValueObject<T>;\n }\n\n if (typeof input !== 'object') {\n return input as UnwrapValueObject<T>;\n }\n\n if (seen.has(input)) {\n // Prevent circular reference infinite recursion, just return input or throw\n throw new Error('Circular reference detected in ValueObject unwrap');\n }\n\n seen.add(input);\n\n if (Array.isArray(input)) {\n const result = input.map(item => unwrapValueObject(item, seen));\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n }\n\n if (input instanceof ValueObject) {\n const result = unwrapValueObject(input.value, seen);\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n }\n\n if (input instanceof Date) {\n seen.delete(input);\n return input.toISOString() as UnwrapValueObject<T>;\n }\n\n if (input instanceof Map) {\n const result = new Map();\n input.forEach((value, key) => {\n result.set(key, unwrapValueObject(value, seen));\n });\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n }\n\n if (input instanceof Set) {\n const result = new Set(\n Array.from(input.values()).map(v => unwrapValueObject(v, seen)),\n );\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n }\n\n // generic object\n const result: Record<string, unknown> = {};\n\n for (const key in input) {\n if (Object.hasOwn(input, key)) {\n result[key] = unwrapValueObject((input as any)[key], seen);\n }\n }\n\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n}\n\nexport function ensureObject<T>(input: UnwrapValueObject<T>): object {\n if (input === null || input === undefined) {\n return {};\n }\n if (typeof input === 'object') {\n return input;\n }\n\n // for primitives, wrap inside object with default key (or throw)\n return { value: input };\n}\n"],"mappings":"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","names":["index_exports","__export","AggregateId","AggregateRoot","ApplicationError","DomainError","DomainEvent","Entity","EntityValidationError","HttpStatus","HttpStatusMessage","InvalidValueObjectError","PrimitiveValueObject","UUID","ValueObject","deepFreeze","ensureObject","unwrapValueObject","__toCommonJS","Entity","props","_a","other","AggregateRoot","Entity","domainEvent","events","getCauseInfo","cause","DomainError","message","code","metadata","__spreadValues","PrimitiveValueObject","value","other","import_es6","deepFreeze","obj","seen","item","key","ValueObject","_ValueObject","props","deepFreeze","vo","other","deepEqual","EntityValidationError","DomainError","message","cause","InvalidValueObjectError","DomainError","message","import_node_crypto","DomainEvent","props","_a","import_uuid","import_zod","_UUID","PrimitiveValueObject","value","result","InvalidValueObjectError","z","UUID","AggregateId","UUID","HttpStatus","HttpStatusMessage","ApplicationError","code","HttpStatusMessage","isOperational","status","metadata","message","cause","unwrapValueObject","input","seen","result","item","ValueObject","value","key","v","ensureObject"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/gateway/constants/http-code.ts","../src/application/errors/application.error.ts","../src/utils/deep-freeze.util.ts","../src/domain/entities/entity.ts","../src/domain/aggregates/aggregate-root.ts","../src/domain/base/primitive-vo.ts","../src/domain/base/vo.ts","../src/shared/domain/domain.error.ts","../src/shared/domain/errors/internal.error.ts","../src/shared/domain/errors/timeout.error.ts","../src/shared/domain/result.ts","../src/domain/errors/entity-validation.error.ts","../src/domain/errors/invalid-vo.error.ts","../src/domain/events/domain.event.ts","../src/domain/value-objects/id.vo.ts","../src/domain/value-objects/aggregate-id.vo.ts","../src/domain/value-objects/domain-id.vo.ts","../src/domain/value-objects/email.vo.ts"],"sourcesContent":["export * from './application';\nexport * from './domain/aggregates';\nexport * from './domain/base/primitive-vo';\nexport * from './domain/base/vo';\nexport * from './domain/entities';\nexport * from './domain/errors/entity-validation.error';\nexport * from './domain/errors/invalid-vo.error';\nexport * from './domain/events';\nexport * from './domain/types';\nexport * from './domain/value-objects/aggregate-id.vo';\nexport * from './domain/value-objects/domain-id.vo';\n\nexport * from './domain/value-objects/email.vo';\nexport * from './domain/value-objects/id.vo';\nexport * from './gateway/constants/http-code';\nexport * from './shared';\nexport { Result } from './shared/domain/result';\nexport * from './utils';\n","/**\n * HTTP status code catalog.\n *\n * This object provides a typed, immutable map of standard HTTP status names\n * to their numeric codes. Designed for server-side frameworks such as Fastify.\n *\n * - All identifiers use clear, canonical semantic names.\n * - Values are numeric status codes.\n * - Frozen to prevent runtime mutation.\n * - Exporting `HttpStatus` ensures type-safe usage across the codebase.\n * Usage:\n * ```ts\n * import { HttpStatus } from 'path-to-this-file';\n *\n * function handleRequest() {\n * return {\n * statusCode: HttpStatus.OK,\n * body: 'Success',\n * };\n * }\n * ```\n */\nexport const HttpStatus = Object.freeze({\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n NETWORK_AUTHENTICATION_REQUIRED: 511,\n NON_AUTHORITATIVE_INFORMATION: 203,\n PROXY_AUTHENTICATION_REQUIRED: 407,\n\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n BANDWIDTH_LIMIT_EXCEEDED: 509,\n VARIANT_ALSO_NEGOTIATES: 506,\n UNSUPPORTED_MEDIA_TYPE: 415,\n RANGE_NOT_SATISFIABLE: 416,\n PRECONDITION_REQUIRED: 428,\n INTERNAL_SERVER_ERROR: 500,\n UNPROCESSABLE_ENTITY: 422,\n INSUFFICIENT_STORAGE: 507,\n\n SWITCHING_PROTOCOLS: 101,\n PRECONDITION_FAILED: 412,\n MISDIRECTED_REQUEST: 421,\n SERVICE_UNAVAILABLE: 503,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n METHOD_NOT_ALLOWED: 405,\n EXPECTATION_FAILED: 417,\n\n MOVED_PERMANENTLY: 301,\n PAYLOAD_TOO_LARGE: 413,\n FAILED_DEPENDENCY: 424,\n TOO_MANY_REQUESTS: 429,\n ALREADY_REPORTED: 208,\n MULTIPLE_CHOICES: 300,\n PAYMENT_REQUIRED: 402,\n UPGRADE_REQUIRED: 426,\n PARTIAL_CONTENT: 206,\n REQUEST_TIMEOUT: 408,\n LENGTH_REQUIRED: 411,\n NOT_IMPLEMENTED: 501,\n GATEWAY_TIMEOUT: 504,\n NOT_ACCEPTABLE: 406,\n RESET_CONTENT: 205,\n LOOP_DETECTED: 508,\n MULTI_STATUS: 207,\n NOT_MODIFIED: 304,\n UNAUTHORIZED: 401,\n URI_TOO_LONG: 414,\n NOT_EXTENDED: 510,\n EARLY_HINTS: 103,\n BAD_REQUEST: 400,\n IM_A_TEAPOT: 418,\n BAD_GATEWAY: 502,\n PROCESSING: 102,\n NO_CONTENT: 204,\n SEE_OTHER: 303,\n USE_PROXY: 305,\n\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n TOO_EARLY: 425,\n CONTINUE: 100,\n ACCEPTED: 202,\n CONFLICT: 409,\n CREATED: 201,\n IM_USED: 226,\n LOCKED: 423,\n FOUND: 302,\n GONE: 410,\n OK: 200,\n} as const);\n\n/**\n * HTTP status messages mapped by numeric code.\n * Use for sending descriptive text in responses or logging.\n */\nexport const HttpStatusMessage = {\n 431: 'Request Header Fields Too Large',\n 511: 'Network Authentication Required',\n 203: 'Non-Authoritative Information',\n 407: 'Proxy Authentication Required',\n 451: 'Unavailable For Legal Reasons',\n 505: 'HTTP Version Not Supported',\n 509: 'Bandwidth Limit Exceeded',\n 506: 'Variant Also Negotiates',\n 415: 'Unsupported Media Type',\n 416: 'Range Not Satisfiable',\n 428: 'Precondition Required',\n 500: 'Internal Server Error',\n 422: 'Unprocessable Entity',\n 507: 'Insufficient Storage',\n 101: 'Switching Protocols',\n 412: 'Precondition Failed',\n 421: 'Misdirected Request',\n 503: 'Service Unavailable',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 405: 'Method Not Allowed',\n 417: 'Expectation Failed',\n 301: 'Moved Permanently',\n 413: 'Payload Too Large',\n 424: 'Failed Dependency',\n 429: 'Too Many Requests',\n 208: 'Already Reported',\n 300: 'Multiple Choices',\n 402: 'Payment Required',\n 426: 'Upgrade Required',\n 206: 'Partial Content',\n 408: 'Request Timeout',\n 411: 'Length Required',\n 501: 'Not Implemented',\n 504: 'Gateway Timeout',\n 406: 'Not Acceptable',\n 205: 'Reset Content',\n 508: 'Loop Detected',\n 207: 'Multi-Status',\n 304: 'Not Modified',\n 401: 'Unauthorized',\n 414: 'URI Too Long',\n 418: \"I'm a Teapot\",\n 510: 'Not Extended',\n 103: 'Early Hints',\n 400: 'Bad Request',\n 502: 'Bad Gateway',\n 102: 'Processing',\n 204: 'No Content',\n 303: 'See Other',\n 305: 'Use Proxy',\n 403: 'Forbidden',\n 404: 'Not Found',\n 425: 'Too Early',\n 100: 'Continue',\n 202: 'Accepted',\n 226: \"I'm Used\",\n 409: 'Conflict',\n 201: 'Created',\n 423: 'Locked',\n 302: 'Found',\n 410: 'Gone',\n 200: 'OK',\n} as const;\n\nexport type HttpStatusCode = keyof typeof HttpStatusMessage;\n\nexport type HttpStatusMessage =\n (typeof HttpStatusMessage)[keyof typeof HttpStatusMessage];\n","import {\n HttpStatusCode,\n HttpStatusMessage,\n} from '@/gateway/constants/http-code';\n\ninterface ErrorParams {\n message: string;\n code: HttpStatusMessage;\n status?: HttpStatusCode;\n metadata?: Record<string, unknown>;\n isOperational?: boolean;\n cause?: Error;\n}\n\n/**\n * Abstract base class for application-level errors with structured error handling.\n *\n * Extends the native Error class to provide machine-readable error codes, HTTP status codes,\n * operational error classification, and optional metadata for better error tracking and client communication.\n *\n * @abstract\n * @extends {Error}\n *\n * @example\n * ```typescript\n * class UserNotFoundError extends ApplicationError {\n * constructor(userId: string) {\n * super({\n * code: HttpStatusMessage['404'],\n * status: 404,\n * isOperational: true,\n * message: `User with id ${userId} not found`,\n * metadata: { userId }\n * });\n * }\n * }\n * ```\n */\nexport abstract class ApplicationError extends Error {\n /** Optional cause (linked error) */\n public readonly cause?: Error | undefined;\n /** Machine-readable error code (e.g. `OTP_LOCKED`, `USER_NOT_FOUND`) */\n public readonly code: HttpStatusMessage;\n /** Operational vs programmer error flag */\n public readonly isOperational: boolean;\n /** Optional structured metadata for debugging or clients */\n public readonly metadata?: Record<string, unknown> | undefined;\n /** HTTP status code intended for response layer */\n public readonly status: HttpStatusCode;\n\n constructor({\n code = HttpStatusMessage['500'],\n isOperational = false,\n status = 500,\n metadata,\n message,\n cause,\n }: ErrorParams) {\n super(message);\n\n this.name = new.target.name;\n this.code = code;\n this.status = status;\n this.isOperational = isOperational;\n this.metadata = metadata;\n this.cause = cause;\n\n Error.captureStackTrace(this, new.target);\n }\n}\n","/**\n * Deeply freezes an object graph to enforce runtime immutability.\n * - Handles arrays\n * - Handles circular references\n * - Skips functions\n * - Skips already frozen objects\n *\n * Intended for aggregate and value object state only.\n */\nexport function deepFreeze<T>(\n value: T,\n seen = new WeakSet<object>(),\n): Readonly<T> {\n // Primitives, null, undefined\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Functions should never be frozen\n if (typeof value === 'function') {\n return value;\n }\n\n // Avoid re-processing\n if (Object.isFrozen(value)) {\n return value as Readonly<T>;\n }\n\n // Handle circular references\n if (seen.has(value)) {\n return value as Readonly<T>;\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n for (const item of value) {\n deepFreeze(item, seen);\n }\n } else {\n for (const key of Object.keys(value)) {\n deepFreeze((value as Record<string, unknown>)[key], seen);\n }\n }\n\n return Object.freeze(value) as Readonly<T>;\n}\n","import { deepFreeze } from '@/utils';\n\nimport { EntityId } from '../types';\n\n// export type Immutable<T> = {\n// readonly [K in keyof T]: Immutable<T[K]>;\n// };\n\nexport type Immutable<T> = T extends (...args: any[]) => any\n ? T\n : T extends Date\n ? T\n : T extends Map<infer K, infer V>\n ? ReadonlyMap<Immutable<K>, Immutable<V>>\n : T extends Set<infer U>\n ? ReadonlySet<Immutable<U>>\n : T extends object\n ? { readonly [K in keyof T]: Immutable<T[K]> }\n : T;\n\n/**\n * Configuration for the base Entity constructor.\n * Forces a single-object argument pattern to avoid positional argument errors.\n * @template ID - A type satisfying the EntityId interface.\n */\nexport interface EntityProps<ID extends EntityId, Props> {\n /** The unique identity of the entity */\n readonly id: ID;\n /** Optional creation timestamp; defaults to 'now' if not provided */\n readonly createdAt?: Date;\n\n props: Props;\n}\n\n/**\n * Abstract Base Entity for Domain-Driven Design (DDD).\n * This class provides the standard contract for entity equality and identity.\n * It intentionally avoids \"magic\" property bags to ensure V8 engine optimization\n * and better IDE intellisense.\n * @template ID - The specific Identity Value Object type.\n */\nexport abstract class Entity<ID extends EntityId, Props> {\n /** The timestamp when this entity was first instantiated/created */\n public readonly createdAt: Date;\n /** The immutable unique identifier for this entity */\n public readonly id: ID;\n\n /**\n * Read-only view of entity state.\n * External code can never mutate internal state.\n */\n protected get props(): Immutable<Props> {\n return this.#props as Immutable<Props>;\n }\n\n // protected props: Props;\n #props: Props;\n\n /**\n * Protected constructor to be called by subclasses.\n * @param params - Initial identity and metadata.\n */\n protected constructor(params: EntityProps<ID, Props>) {\n this.id = params.id;\n this.createdAt = params.createdAt ?? new Date();\n this.#props = deepFreeze(params.props);\n\n this.validate();\n }\n\n /**\n * Compares entities by identity.\n * In DDD, two entities are considered equal if their IDs match,\n * regardless of their other properties.\n * @param other - The entity to compare against.\n * @returns True if IDs are equal.\n */\n public equals(other?: Entity<ID, Props>): boolean {\n if (other == null) return false;\n if (this === other) return true;\n return this.id.equals(other.id);\n }\n\n /**\n * Converts the Entity into a plain Javascript object.\n * Subclasses must implement this to explicitly control serialization,\n * @returns A plain object representation of the entity.\n */\n public abstract toObject(): Record<string, unknown>;\n\n /**\n * Validates the current state of the entity against domain invariants.\n * This method should be called after construction and any mutation.\n * @throws {Error} Should throw a specific DomainError if validation fails.\n */\n public abstract validate(): void;\n\n protected mutate(updater: (current: Props) => Props): void {\n const next = updater(this.#props);\n\n this.#props = deepFreeze(next);\n this.validate();\n }\n}\n","import { Entity, EntityProps } from '../entities/entity';\nimport { DomainEvent } from '../events';\nimport { EntityId } from '../types';\n\n/**\n * Base class for aggregate roots in DDD, encapsulating domain events and validation.\n *\n * Aggregate roots are entities that serve as entry points to aggregates. They:\n * - Enforce invariants across the aggregate\n * - Manage domain events\n * - Define transaction boundaries\n *\n * @template ID - The type of the aggregate's identity (must extend EntityId)\n * @template P - The type of the aggregate's properties\n *\n * @example\n * ```typescript\n * interface UserProps {\n * email: string;\n * isActive: boolean;\n * }\n *\n * class User extends AggregateRoot<AggregateId, UserProps> {\n * // Implementation...\n * }\n * ```\n */\nexport abstract class AggregateRoot<ID extends EntityId, P> extends Entity<\n ID,\n P\n> {\n /**\n * Gets a read-only copy of the domain events.\n */\n get domainEvents(): readonly DomainEvent[] {\n return [...this._domainEvents];\n }\n\n /**\n * Internal list of domain events.\n */\n private readonly _domainEvents: DomainEvent[] = [];\n\n /**\n * Adds a domain event to the aggregate after validating invariants.\n * @param domainEvent The domain event to add.\n * @throws {EntityValidationError} If invariants are not met.\n */\n addEvent(domainEvent: DomainEvent): void {\n this._domainEvents.push(domainEvent);\n }\n\n public pullDomainEvents(): readonly DomainEvent[] {\n const events = [...this._domainEvents];\n this._domainEvents.length = 0;\n return events;\n }\n}\n","import { Primitive } from 'type-fest';\n\nimport { EntityId } from '../types';\n\n/**\n * Base class for primitive-based Value Objects.\n *\n * This class is intended for Value Objects that are represented by\n * a single primitive value (string, number, or boolean).\n *\n * Characteristics:\n * - Immutable by construction\n * - Cheap equality comparison\n * - No deep cloning or freezing\n * - Safe for serialization and logging\n *\n * Examples:\n * - AggregateId\n * - EmailAddress\n * - Username\n * - Slug\n */\nexport abstract class PrimitiveValueObject<\n T extends Primitive,\n> implements EntityId {\n /**\n * The underlying primitive value.\n * Guaranteed to be valid after construction.\n */\n get value(): T {\n return this.#value;\n }\n\n readonly #value: Readonly<T>;\n\n /**\n * Constructs a new PrimitiveValueObject.\n *\n * @param value - The primitive value to wrap\n * @throws Error if validation fails\n */\n protected constructor(value: T) {\n this.validate(value);\n this.#value = value;\n }\n\n /**\n * Compares two Value Objects for equality.\n *\n * Equality rules:\n * - Same concrete class\n * - Same primitive value (===)\n *\n * @param other - Another Value Object\n */\n public equals(other: any): boolean {\n if (other == null) return false;\n\n if (Object.getPrototypeOf(this) !== Object.getPrototypeOf(other)) {\n return false;\n }\n\n if (!(other instanceof PrimitiveValueObject)) return false;\n\n return this.#value === other.#value;\n }\n\n /**\n * Returns the primitive value.\n * Prefer explicit access over implicit coercion.\n * @deprecated - instead use instance.value\n */\n public getValue(): T {\n return this.#value;\n }\n\n /**\n * String representation.\n * Useful for logging and debugging.\n */\n public toString(): string {\n return String(this.#value);\n }\n\n /**\n * Domain invariant validation.\n * Must throw if the value is invalid.\n *\n * @param value - The value to validate\n */\n protected abstract validate(value: T): void;\n}\n","import deepEqual from 'fast-deep-equal/es6';\n\nimport { deepFreeze } from '@/utils/deep-freeze.util';\n\nexport abstract class ValueObject<T> {\n get value(): T {\n return this.props;\n }\n\n protected readonly props: Readonly<T>;\n\n protected constructor(props: T) {\n this.validate(props);\n this.props = deepFreeze(props);\n }\n\n /**\n * Type guard to check if an unknown object is an instance of ValueObject.\n * This is useful for runtime type checking.\n *\n * @param vo The object to check.\n * @returns True if the object is a ValueObject instance, false otherwise.\n */\n public static is(vo: unknown): vo is ValueObject<unknown> {\n return vo instanceof ValueObject;\n }\n\n /**\n * Deep equality comparison of ValueObjects\n */\n public equals(other?: ValueObject<T>): boolean {\n if (other == null) return false;\n\n // Check if they share the same constructor (Type check)\n if (Object.getPrototypeOf(this) !== Object.getPrototypeOf(other)) {\n return false;\n }\n\n return deepEqual(this.props, other.props);\n }\n\n /**\n * Standard for clean API integration and logging.\n */\n public toJSON(): T {\n return this.props;\n }\n\n /**\n * Useful for debugging and string-based indexing.\n */\n public toString(): string {\n return JSON.stringify(this.props);\n }\n\n /**\n * Validates the value object props\n * @throws InvalidValueObjectError if validation fails\n */\n protected abstract validate(props: T): void;\n}\n","export type Primitive = boolean | number | string | null | undefined;\n\nexport type Metadata<T = {}> = T extends Record<string, Primitive> ? T : {};\n\n/**\n * Categories of domain errors based on the nature of the violation.\n *\n * @typedef {'DOMAIN.INVALID_STATE' | 'DOMAIN.INVALID_VALUE'} DomainErrorType\n *\n * @example\n * // DomainErrorType usage:\n * const errorType: DomainErrorType = 'DOMAIN.INVALID_STATE';\n */\nexport type DomainErrorType = 'DOMAIN.INVALID_STATE' | 'DOMAIN.INVALID_VALUE';\n\n// ============ TYPE UTILITIES ============\nexport type ValueOf<T> = T[keyof T];\nexport type UnionToIntersection<U> = (\n U extends any ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never;\n\n/**\n * Interface for declaring domain error namespaces via declaration merging.\n * Projects extend this interface to add their own namespaces and error codes.\n *\n * @example\n * // In your project's type definition file (.d.ts):\n * declare module '@your-org/domain-errors' {\n * interface DomainErrorNamespaces {\n * USER: ['NOT_FOUND', 'INVALID_EMAIL', 'SUSPENDED'];\n * ORDER: ['NOT_FOUND', 'INVALID_STATUS', 'OUT_OF_STOCK'];\n * // Override default namespace (optional):\n * CORE: ['INTERNAL_ERROR', 'VALIDATION_FAILED', 'CONFIGURATION_ERROR'];\n * }\n * }\n *\n * @example\n * // This enables type-safe error codes:\n * const code: DomainErrorCode = 'USER.NOT_FOUND'; // ✅ Valid\n * const code: DomainErrorCode = 'USER.INVALID'; // ❌ TypeScript error\n */\nexport interface DomainErrorNamespaces {\n // Built-in core namespaces (available in all projects)\n DOMAIN: ['INVALID_VALUE', 'INVALID_STATE'];\n CORE: [\n 'INTERNAL_ERROR',\n 'VALIDATION_FAILED',\n 'CONFIGURATION_ERROR',\n 'NOT_IMPLEMENTED',\n ];\n SYSTEM: ['UNEXPECTED', 'TIMEOUT', 'NETWORK_ERROR', 'DEPENDENCY_ERROR'];\n}\n\n// ============ INFER TYPES FROM REGISTRY ============\ntype Namespace = keyof DomainErrorNamespaces;\ntype ErrorName<N extends Namespace> = DomainErrorNamespaces[N][number];\n\n/**\n * Union type of all valid domain error codes derived from registered namespaces.\n * Automatically updates when projects extend DomainErrorNamespaces.\n *\n * @example\n * // After extending DomainErrorNamespaces with USER namespace:\n * type ErrorCode = DomainErrorCode;\n * // Becomes: 'CORE.INTERNAL_ERROR' | 'CORE.VALIDATION_FAILED' |\n * // 'USER.NOT_FOUND' | 'USER.INVALID_EMAIL' | ...\n */\nexport type DomainErrorCode = {\n [N in Namespace]: `${Uppercase<string & N>}.${Uppercase<ErrorName<N>>}`;\n}[Namespace];\n\n// Extract namespace from code\nexport type ExtractNamespace<Code extends DomainErrorCode> =\n Code extends `${infer N}.${string}` ? N : never;\n\n// Extract error name from code\nexport type ExtractErrorName<Code extends DomainErrorCode> =\n Code extends `${string}.${infer E}` ? E : never;\n\n/**\n * Base class for all domain errors in a Domain-Driven Design architecture.\n *\n * Domain errors represent violations of business rules and domain invariants.\n * They are pure value objects without infrastructure concerns like IDs or timestamps.\n *\n * @typeParam Code - The specific error code from DomainErrorCode union\n * @typeParam Meta - Type of metadata associated with this error\n *\n * @example\n * // 1. First, declare your namespaces:\n * declare module '@your-org/domain-errors' {\n * interface DomainErrorNamespaces {\n * USER: ['NOT_FOUND', 'INVALID_EMAIL'];\n * }\n * }\n *\n * @example\n * // 2. Create a concrete domain error:\n * class UserNotFoundError extends DomainError<'USER.NOT_FOUND', { userId: string }> {\n * public readonly code = 'USER.NOT_FOUND' as const;\n * public readonly type: DomainErrorType = 'DOMAIN.INVALID_VALUE';\n *\n * constructor(userId: string) {\n * super(`User with ID '${userId}' not found`, { userId });\n * }\n * }\n *\n * @example\n * // 3. Usage in domain services:\n * class UserService {\n * async activateUser(userId: string): Promise<Result<User, DomainError>> {\n * const user = await this.repository.findById(userId);\n *\n * if (!user) {\n * return Result.failure(new UserNotFoundError(userId));\n * }\n *\n * if (user.isSuspended) {\n * return Result.failure(new UserSuspendedError(userId));\n * }\n *\n * // Business logic...\n * }\n * }\n *\n * @abstract\n */\nexport abstract class DomainError<\n Meta extends Record<string, Primitive> = {},\n Code extends DomainErrorCode = DomainErrorCode,\n> {\n /**\n * Machine-readable error code in format: NAMESPACE.ERROR_NAME\n *\n * @remarks\n * - Must be uppercase (e.g., 'USER.NOT_FOUND')\n * - Namespace must be declared in DomainErrorNamespaces\n * - Error name must be in the namespace's array\n *\n * @example\n * public readonly code = 'USER.NOT_FOUND' as const;\n */\n public abstract readonly code: Code;\n /**\n * Human-readable error message describing the domain rule violation.\n * Should be meaningful to developers and potentially end-users.\n *\n * @remarks\n * - Avoid technical implementation details\n * - Focus on the business rule that was violated\n * - Can include values from metadata for context\n *\n * @example\n * // Good: \"Order amount $150 exceeds maximum limit of $100\"\n * // Bad: \"Amount validation failed: 150 > 100\"\n */\n public readonly message: string;\n\n /**\n * Immutable structured context providing additional information about the error.\n * Useful for debugging, logging, and creating detailed error messages.\n *\n * @remarks\n * - Values must be primitive types (string, number, boolean, etc.)\n * - Object is frozen to prevent mutation\n * - Type-safe based on the error code\n *\n * @example\n * // For UserNotFoundError:\n * { userId: 'usr_123', attemptedAction: 'activate' }\n *\n * @readonly\n */\n public readonly metadata: Readonly<Meta>;\n\n /**\n * Category of domain error indicating the nature of violation.\n *\n * @remarks\n * Use 'DOMAIN.INVALID_STATE' for state violations (e.g., \"Cannot checkout empty cart\")\n * Use 'DOMAIN.INVALID_VALUE' for value violations (e.g., \"Email format is invalid\")\n *\n * @example\n * public readonly type: DomainErrorType = 'DOMAIN.INVALID_VALUE';\n */\n public abstract readonly type: DomainErrorType;\n\n /** Get error name from error code */\n public get errorName(): ExtractErrorName<Code> {\n return this.code.split('.')[1] as ExtractErrorName<Code>;\n }\n\n // ============ COMPUTED PROPERTIES ============\n /** Get namespace from error code */\n public get namespace(): ExtractNamespace<Code> {\n return this.code.split('.')[0] as ExtractNamespace<Code>;\n }\n\n /**\n * Creates a new DomainError instance.\n *\n * @param message - Human-readable description of the domain rule violation\n * @param metadata - Optional structured context (primitive values only)\n *\n * @example\n * constructor(userId: string) {\n * super(`User with ID '${userId}' not found`, { userId });\n * }\n *\n * @example\n * constructor(amount: number, maxLimit: number) {\n * super(\n * `Order amount $${amount} exceeds maximum limit of $${maxLimit}`,\n * { amount, maxLimit }\n * );\n * }\n */\n protected constructor(\n message: string,\n ...args: keyof Meta extends never\n ? [] | [metadata?: Meta]\n : [metadata: Meta]\n ) {\n this.message = message;\n this.metadata = Object.freeze(args[0] ?? {}) as Readonly<Meta>;\n }\n\n /**\n * Serializes the error to a plain object for debugging, logging, or transport.\n * Does not include infrastructure concerns like stack traces or timestamps.\n *\n * @returns Plain object with error details\n *\n * @example\n * const error = new UserNotFoundError('usr_123');\n * const json = error.toJSON();\n * // Result:\n * // {\n * // code: 'USER.NOT_FOUND',\n * // message: \"User with ID 'usr_123' not found\",\n * // type: 'DOMAIN.INVALID_VALUE',\n * // metadata: { userId: 'usr_123' }\n * // }\n */\n public toObject() {\n return {\n metadata: this.metadata,\n message: this.message,\n code: this.code,\n type: this.type,\n };\n }\n\n /**\n * Returns a string representation of the error.\n * Format: [CODE] MESSAGE\n *\n * @returns Human-readable string representation\n *\n * @example\n * const error = new UserNotFoundError('usr_123');\n * console.log(error.toString());\n * // Output: [USER.NOT_FOUND] User with ID 'usr_123' not found\n *\n * @override\n */\n public toString(): string {\n return `[${this.code}] ${this.message}`;\n }\n}\n","/* eslint-disable @typescript-eslint/class-literal-property-style */\n\nimport {\n DomainError,\n DomainErrorType,\n Metadata,\n Primitive,\n} from '../domain.error';\n\n/**\n * Default domain errors for common scenarios.\n * These errors are available across all projects using this module.\n */\n\n/**\n * Error thrown when an unexpected internal error occurs.\n * Typically used for programming bugs, invalid assumptions, or states that should never happen.\n *\n * @remarks\n * - Metadata is optional for empty metadata types and required if a non-empty type is provided.\n * - Useful for debugging, logging, and adding context to unexpected failures.\n *\n * @example\n * // Catch a programming error:\n * try {\n * complexBusinessLogic();\n * } catch (error) {\n * throw new InternalError({\n * message: 'Unexpected error in complexBusinessLogic',\n * metadata: { originalError: error.message, timestamp: Date.now() }\n * });\n * }\n *\n * @example\n * // Fallback for unhandled cases:\n * switch (status) {\n * case 'PENDING':\n * break;\n * case 'COMPLETED':\n * break;\n * default:\n * throw new InternalError({\n * message: `Unhandled status: ${status}`,\n * metadata: { status }\n * });\n * }\n */\nexport class InternalError<T = Record<string, Primitive>> extends DomainError<\n Metadata<T>\n> {\n /** @inheritdoc */\n public readonly code = 'CORE.INTERNAL_ERROR' as const;\n\n /** @inheritdoc */\n public readonly type: DomainErrorType = 'DOMAIN.INVALID_STATE';\n\n /**\n * Creates a new InternalError.\n *\n * @param message - Description of the internal error\n * @param metadata - Optional debug information\n */\n constructor(\n message: string = 'An unexpected internal error occurred',\n metadata?: Metadata<T>,\n ) {\n super(message, metadata);\n }\n}\n","/* eslint-disable @typescript-eslint/class-literal-property-style */\n\nimport {\n DomainError,\n DomainErrorType,\n Metadata,\n Primitive,\n} from '../domain.error';\n\n/**\n * Error thrown when an operation times out.\n * Use for operations that exceed their allowed execution time.\n *\n * @example\n * // Operation timeout:\n * const timeout = setTimeout(() => {\n * throw new TimeoutError(\n * 'User registration timed out'\n * );\n * }, 5000);\n *\n * @example\n * // With Promise.race:\n * type Props = { url: string, timeoutMs: number }\n * async function fetchWithTimeout(url: string, timeoutMs: number) {\n * const timeoutPromise = new Promise<never>((_, reject) => {\n * setTimeout(() => {\n * reject(new TimeoutError<Props>(\n * `Request to ${url} timed out`,\n * { url, timeoutMs }\n * ));\n * }, timeoutMs);\n * });\n *\n * return await Promise.race([fetch(url), timeoutPromise]);\n * }\n */\nexport class TimeoutError<T = Record<string, Primitive>> extends DomainError<\n Metadata<T>\n> {\n /** @inheritdoc */\n public readonly code = 'SYSTEM.TIMEOUT' as const;\n\n /** @inheritdoc */\n public readonly type: DomainErrorType = 'DOMAIN.INVALID_STATE';\n\n /**\n * Creates a new TimeoutError.\n *\n * @param message - Description of the timeout\n * @param metadata - Optional timeout context\n */\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(message: string, metadata?: Metadata<T>) {\n super(message, metadata);\n }\n}\n","import { DomainError } from './domain.error';\n\n/**\n * Represents the result of an operation, which can be either a success or a failure.\n *\n * This is a functional programming pattern that helps avoid throwing exceptions\n * and makes error handling explicit in the type system. It's commonly used in\n * Domain-Driven Design (DDD) to represent domain operation outcomes.\n *\n * @template T The type of a successful result.\n * @template E The type of the error in case of failure (defaults to DomainError).\n *\n * @example\n * ```typescript\n * // Creating a successful result\n * const success = Result.ok({ id: 1, name: 'John' });\n * if (success.isSuccess) {\n * const user = success.getValue(); // { id: 1, name: 'John' }\n * }\n *\n * // Creating a failed result\n * const failure = Result.fail(new InvalidUserError('User not found'));\n * if (failure.isFailure) {\n * const error = failure.getError(); // InvalidUserError instance\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Using in a domain service\n * function createUser(name: string): Result<User, DomainError> {\n * if (!name || name.trim().length === 0) {\n * return Result.fail(new InvalidValueError('Name cannot be empty'));\n * }\n *\n * const user = new User(name);\n * return Result.ok(user);\n * }\n *\n * const result = createUser('John Doe');\n * if (result.isSuccess) {\n * console.log('User created:', result.getValue());\n * } else {\n * console.error('Failed:', result.getError()?.message);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Chaining operations\n * function validateEmail(email: string): Result<string, DomainError> {\n * if (!email.includes('@')) {\n * return Result.fail(new InvalidValueError('Invalid email format'));\n * }\n * return Result.ok(email);\n * }\n *\n * function createAccount(email: string): Result<Account, DomainError> {\n * const emailResult = validateEmail(email);\n * if (emailResult.isFailure) {\n * return emailResult; // Forward the error\n * }\n *\n * const account = new Account(emailResult.getValue()!);\n * return Result.ok(account);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Working with async operations\n * async function fetchUser(id: number): Promise<Result<User, DomainError>> {\n * try {\n * const user = await userRepository.findById(id);\n * if (!user) {\n * return Result.fail(new NotFoundError(`User ${id} not found`));\n * }\n * return Result.ok(user);\n * } catch (error) {\n * return Result.fail(new SystemError('Database connection failed'));\n * }\n * }\n *\n * const result = await fetchUser(123);\n * if (result.isSuccess) {\n * // Handle success\n * } else {\n * // Handle failure\n * }\n * ```\n */\nexport class Result<T, E> {\n /**\n * Indicates if the result is a failure.\n *\n * @example\n * ```typescript\n * const result = Result.fail(new Error('Something went wrong'));\n * if (result.isFailure) {\n * // Handle error case\n * console.error(result.getError());\n * }\n * ```\n */\n public readonly isFailure: boolean;\n\n /**\n * Indicates if the result is a success.\n *\n * @example\n * ```typescript\n * const result = Result.ok(42);\n * if (result.isSuccess) {\n * // Handle success case\n * const value = result.getValue(); // 42\n * }\n * ```\n */\n public readonly isSuccess: boolean;\n\n /**\n * The error, if any.\n * @private\n */\n private readonly _error?: E;\n\n /**\n * The value, if any.\n * @private\n */\n private readonly _value?: T;\n\n /**\n * Private constructor to enforce the use of static methods.\n * @param params.value The value on success.\n * @param params.error The error on failure.\n * @private\n */\n private constructor(params: { value?: T; error?: E }) {\n const hasError = params.error !== undefined;\n this.isFailure = hasError;\n this.isSuccess = !hasError;\n\n this._value = params.value;\n this._error = params.error;\n Object.freeze(this);\n }\n\n /**\n * Creates a failed result.\n *\n * @template T The type of a successful result (never for failure).\n * @template E The type of the error (defaults to DomainError).\n * @param error The error object.\n * @returns {Result<T, E>} A failed Result instance.\n *\n * @example\n * ```typescript\n * // With DomainError\n * class InvalidValueError extends DomainError {\n * public readonly code = 'DOMAIN.INVALID_VALUE' as const;\n * constructor(message: string) {\n * super({ message });\n * }\n * }\n *\n * const result = Result.fail(new InvalidValueError('Value must be positive'));\n * // result.isFailure === true\n * // result.getError() === InvalidValueError instance\n * ```\n *\n * @example\n * ```typescript\n * // With custom error type\n * interface ValidationError {\n * field: string;\n * message: string;\n * }\n *\n * const result = Result.fail<never, ValidationError>({\n * field: 'email',\n * message: 'Invalid email format'\n * });\n * ```\n *\n * @example\n * ```typescript\n * // In a validation function\n * function validateAge(age: number): Result<number, DomainError> {\n * if (age < 0) {\n * return Result.fail(new InvalidValueError('Age cannot be negative'));\n * }\n * if (age > 150) {\n * return Result.fail(new InvalidValueError('Age seems unrealistic'));\n * }\n * return Result.ok(age);\n * }\n * ```\n */\n public static fail<T = never, E = DomainError>(error: E): Result<T, E> {\n return new Result({ error });\n }\n\n /**\n * Creates a successful result.\n *\n * @template T The type of the successful result.\n * @template E The type of the error (never for success).\n * @param value The success value.\n * @returns {Result<T, E>} A successful Result instance.\n *\n * @example\n * ```typescript\n * // With primitive value\n * const result = Result.ok(42);\n * // result.isSuccess === true\n * // result.getValue() === 42\n * ```\n *\n * @example\n * ```typescript\n * // With object\n * const user = { id: 1, name: 'John', email: 'john@example.com' };\n * const result = Result.ok(user);\n * if (result.isSuccess) {\n * const savedUser = result.getValue(); // { id: 1, name: 'John', ... }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With domain entity\n * class User {\n * constructor(public readonly id: number, public readonly name: string) {}\n * }\n *\n * function createUser(name: string): Result<User, DomainError> {\n * const user = new User(Date.now(), name);\n * return Result.ok(user);\n * }\n *\n * const result = createUser('Alice');\n * if (result.isSuccess) {\n * console.log(`Created user: ${result.getValue()?.name}`);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With void/undefined (for operations that don't return a value)\n * function deleteUser(id: number): Result<void, DomainError> {\n * // ... deletion logic ...\n * return Result.ok(undefined);\n * }\n *\n * const result = deleteUser(123);\n * if (result.isSuccess) {\n * console.log('User deleted successfully');\n * }\n * ```\n */\n public static ok<T, E = never>(value: T): Result<T, E> {\n return new Result({ value });\n }\n\n /**\n * Returns the error if present, otherwise undefined.\n *\n * **Note:** Always check `isFailure` before calling this method to ensure\n * the result is actually a failure. This method will return `undefined` for\n * successful results.\n *\n * @returns {E | undefined} The error or undefined if successful.\n *\n * @example\n * ```typescript\n * const result = Result.fail(new InvalidValueError('Invalid input'));\n *\n * if (result.isFailure) {\n * const error = result.getError();\n * if (error) {\n * console.error(`Error code: ${error.code}, Message: ${error.message}`);\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Safe error handling pattern\n * function handleResult<T>(result: Result<T, DomainError>): void {\n * if (result.isFailure) {\n * const error = result.getError();\n * if (error) {\n * // Log error with metadata\n * console.error({\n * code: error.code,\n * message: error.message,\n * metadata: error.metadata\n * });\n * }\n * }\n * }\n * ```\n */\n public getError(): E | undefined {\n return this._error;\n }\n\n /**\n * Returns the value if present, otherwise undefined.\n *\n * **Note:** Always check `isSuccess` before calling this method to ensure\n * the result is actually a success. This method will return `undefined` for\n * failed results.\n *\n * @returns {T | undefined} The value or undefined if failed.\n *\n * @example\n * ```typescript\n * const result = Result.ok({ id: 1, name: 'John' });\n *\n * if (result.isSuccess) {\n * const user = result.getValue();\n * if (user) {\n * console.log(`User: ${user.name} (ID: ${user.id})`);\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Type-safe value extraction\n * function processUser(result: Result<User, DomainError>): void {\n * if (result.isSuccess) {\n * const user = result.getValue();\n * // TypeScript knows user is User | undefined here\n * if (user) {\n * // Process the user\n * userRepository.save(user);\n * }\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Using non-null assertion (use with caution)\n * const result = Result.ok(42);\n * if (result.isSuccess) {\n * const value = result.getValue()!; // Safe because we checked isSuccess\n * console.log(value * 2); // 84\n * }\n * ```\n */\n public getValue(): T | undefined {\n return this._value;\n }\n\n /**\n * Type guard for failure.\n */\n public isFailureResult(): this is Result<never, E> {\n return this.isFailure;\n }\n\n /**\n * Type guard for success.\n */\n public isSuccessResult(): this is Result<T, never> {\n return this.isSuccess;\n }\n}\n","import { DomainError, DomainErrorCode, DomainErrorType } from '@/shared';\n\n/**\n * Custom error class for entity validation failures.\n */\nexport class EntityValidationError extends DomainError {\n public code: DomainErrorCode = 'CORE.VALIDATION_FAILED';\n public type: DomainErrorType = 'DOMAIN.INVALID_STATE';\n\n public static create(msg: string) {\n return new EntityValidationError(msg);\n }\n}\n","import {\n DomainError,\n DomainErrorCode,\n DomainErrorType,\n Metadata,\n} from '@/shared';\n\ntype Params = {\n value: string;\n};\n\ntype Props = Metadata<Params>;\nexport class InvalidValueObjectError extends DomainError<Props> {\n public code = 'DOMAIN.INVALID_VALUE' as DomainErrorCode;\n public type: DomainErrorType = 'DOMAIN.INVALID_VALUE';\n\n public static create(\n msg = 'Provided value object is incorrect',\n meta?: Props,\n ) {\n return new InvalidValueObjectError(msg, meta);\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { deepFreeze } from '@/utils';\n\nimport { EntityId } from '../types';\n\ntype Primitive = boolean | number | string | null;\n\ntype Serializable =\n | Primitive\n | Serializable[]\n | { [key: string]: Serializable };\n\nexport type DomainEventPayload = Record<string, Serializable>;\n\nexport type UnixTimestampMillis = number;\n\ntype DomainEventProps<Payload, AggregateId extends EntityId> = {\n id?: string;\n aggregateId: AggregateId;\n schemaVersion: number;\n occurredAt: UnixTimestampMillis;\n payload: Payload;\n};\n\nexport type CreateEventProps<\n EventProps,\n ID extends EntityId,\n> = DomainEventProps<EventProps, ID>;\n\n// Abstract base class for domain events\nexport abstract class DomainEvent<\n AggregateId extends EntityId = EntityId,\n T extends DomainEventPayload = DomainEventPayload,\n> {\n public readonly aggregateId: AggregateId;\n\n public abstract readonly eventName: string;\n public readonly id: string;\n public readonly occurredAt: number;\n public readonly payload: Readonly<T>;\n public readonly schemaVersion: number;\n\n protected constructor(props: DomainEventProps<T, AggregateId>) {\n this.id = props.id ?? randomUUID();\n this.aggregateId = props.aggregateId;\n this.schemaVersion = props.schemaVersion;\n this.occurredAt = props.occurredAt;\n this.payload = deepFreeze(props.payload);\n }\n\n public toPrimitives(): Readonly<{\n id: string;\n eventName: string;\n aggregateId: string;\n schemaVersion: number;\n occurredAt: UnixTimestampMillis;\n payload: T;\n }> {\n return {\n aggregateId: this.aggregateId.toString(),\n schemaVersion: this.schemaVersion,\n occurredAt: this.occurredAt,\n eventName: this.eventName,\n payload: this.payload,\n id: this.id,\n };\n }\n}\n","import { v4 } from 'uuid';\nimport z from 'zod';\n\nimport { InvalidValueObjectError } from '../errors/invalid-vo.error';\nimport { PrimitiveValueObject } from '../base/primitive-vo';\n\n/**\n * Represents a UUID (Universally Unique Identifier) value object.\n *\n * This class extends PrimitiveValueObject to provide type-safe UUID handling\n * with validation using Zod schema. UUIDs are immutable and can be generated\n * randomly or created from string values.\n * @deprecated\n * @example\n * // Generate a new random UUID\n * const id = UUID.generate();\n *\n * @example\n * // Create UUID from an existing string\n * const id = UUID.fromString('550e8400-e29b-41d4-a716-446655440000');\n *\n * @throws {InvalidValueObjectError} When the provided string is not a valid UUID format\n */\nexport class UUID extends PrimitiveValueObject<string> {\n private static readonly schema = z.uuid();\n\n public constructor(value: string) {\n super(value);\n this.validate(value);\n }\n\n /**\n * Creates an UUID from an external string.\n * Use only for untrusted input.\n *\n * @param value - UUID string\n */\n public static fromString(value: string): UUID {\n return new this(value);\n }\n\n /**\n * Generates a new AggregateId.\n */\n public static generate<T extends typeof UUID>(this: T): InstanceType<T> {\n return new this(v4()) as InstanceType<T>;\n }\n\n protected validate(value: string): void {\n const result = UUID.schema.safeParse(value);\n\n if (!result.success) {\n throw InvalidValueObjectError.create(\n `Invalid ${this.constructor.name}: ${value}`,\n {\n value,\n },\n );\n }\n }\n}\n","import { UUID } from './id.vo';\n\n/**\n * AggregateId represents a strongly-typed aggregate identifier.\n *\n * - Backed by UUID v4\n * - Immutable\n * - Comparable only to AggregateId\n */\nexport class AggregateId extends UUID {}\n","import type { Tagged } from 'type-fest';\nimport { v4 } from 'uuid';\nimport z from 'zod';\n\nimport { InvalidValueObjectError } from '../errors/invalid-vo.error';\nimport { PrimitiveValueObject } from '../base/primitive-vo';\n\n/**\n * UUID is a branded string type.\n *\n * - Prevents accidental use of arbitrary strings\n * - Requires explicit validation or construction\n * - Zero runtime cost after creation\n */\n\nexport type UuID = Tagged<string, 'UUID'>;\n\n/**\n * Abstract base class for all domain identifiers.\n *\n * Responsibilities:\n * - Enforces that every DomainID wraps a primitive string value.\n * - Provides a type-safe static factory `fromString` for creating concrete IDs.\n * - Leaves domain-specific validation to subclasses via `validate`.\n *\n * Design Notes:\n * - The class cannot know how to validate the ID itself, because validation\n * rules differ between ID types (e.g., UUID v4, ULID, NanoID).\n * - Static factory uses `new this(value)` pattern; hence, base class is **not abstract** in TypeScript terms.\n * - Subclasses must implement `validate(value: string)` inherited from PrimitiveValueObject.\n *\n * Usage:\n * ```ts\n * class AuthAttemptId extends DomainID {\n * protected validate(value: string): void {\n * if (!isValidUuid(value)) {\n * throw new Error('Invalid AuthAttemptId');\n * }\n * }\n * }\n *\n * const id = AuthAttemptId.fromString('550e8400-e29b-41d4-a716-446655440000');\n * ```\n */\nexport abstract class DomainID extends PrimitiveValueObject<UuID> {\n public static schema = z.uuid();\n\n public constructor(value: string) {\n super(value as UuID);\n }\n\n /**\n * Creates a concrete DomainID from a trusted string value.\n *\n * - Validation is enforced in the subclass constructor.\n * - Intended for application or infrastructure layers to produce IDs.\n *\n * @template T - Concrete subclass of DomainID\n * @param this - The constructor of the concrete subclass\n * @param value - Raw string value of the ID\n * @returns Instance of the concrete DomainID subclass\n */\n public static fromString<T extends new (value: string) => DomainID>(\n this: T,\n value: string,\n ): InstanceType<T> {\n return new this(value) as InstanceType<T>;\n }\n\n public static generate<T extends new (value: string) => DomainID>(\n this: T,\n ): InstanceType<T> {\n return new this(v4()) as InstanceType<T>;\n }\n\n protected validate(value: UuID): void {\n const result = DomainID.schema.safeParse(value);\n\n if (!result.success) {\n throw InvalidValueObjectError.create(`Invalid UUID: ${value}`);\n }\n }\n}\n","import z from 'zod';\n\nimport { InvalidValueObjectError } from '../errors/invalid-vo.error';\nimport { PrimitiveValueObject } from '../base/primitive-vo';\n\nexport class Email extends PrimitiveValueObject<string> {\n private static readonly schema = z.email();\n\n public constructor(value: string) {\n super(value);\n this.validate(value);\n }\n\n public static fromString(value: string): Email {\n return new this(value);\n }\n\n protected validate(value: string): void {\n const result = Email.schema.safeParse(value);\n\n if (!result.success) {\n throw InvalidValueObjectError.create(\n `Invalid ${this.constructor.name}: ${value}`,\n {\n value,\n },\n );\n }\n }\n}\n"],"mappings":"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","names":["index_exports","__export","AggregateId","AggregateRoot","ApplicationError","DomainError","DomainEvent","DomainID","Email","Entity","EntityValidationError","HttpStatus","HttpStatusMessage","InternalError","InvalidValueObjectError","PrimitiveValueObject","Result","TimeoutError","UUID","ValueObject","deepFreeze","__toCommonJS","HttpStatus","HttpStatusMessage","ApplicationError","code","HttpStatusMessage","isOperational","status","metadata","message","cause","deepFreeze","value","seen","item","key","_props","Entity","params","__privateAdd","_a","__privateSet","deepFreeze","__privateGet","other","updater","next","AggregateRoot","Entity","domainEvent","events","_value","_PrimitiveValueObject","value","__privateAdd","__privateSet","__privateGet","other","PrimitiveValueObject","import_es6","ValueObject","_ValueObject","props","deepFreeze","vo","other","deepEqual","DomainError","message","args","_a","InternalError","DomainError","message","metadata","TimeoutError","DomainError","message","metadata","Result","_Result","params","hasError","error","value","EntityValidationError","_EntityValidationError","DomainError","msg","InvalidValueObjectError","_InvalidValueObjectError","DomainError","msg","meta","import_node_crypto","DomainEvent","props","_a","deepFreeze","import_uuid","import_zod","_UUID","PrimitiveValueObject","value","InvalidValueObjectError","z","UUID","AggregateId","UUID","import_uuid","import_zod","_DomainID","PrimitiveValueObject","value","InvalidValueObjectError","z","DomainID","import_zod","_Email","PrimitiveValueObject","value","InvalidValueObjectError","z","Email"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var R=t=>{throw TypeError(t)};var g=(t,e,r)=>e.has(t)||R("Cannot "+r);var i=(t,e,r)=>(g(t,e,"read from private field"),r?r.call(t):e.get(t)),l=(t,e,r)=>e.has(t)?R("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),E=(t,e,r,o)=>(g(t,e,"write to private field"),o?o.call(t,r):e.set(t,r),r);var z=Object.freeze({REQUEST_HEADER_FIELDS_TOO_LARGE:431,NETWORK_AUTHENTICATION_REQUIRED:511,NON_AUTHORITATIVE_INFORMATION:203,PROXY_AUTHENTICATION_REQUIRED:407,UNAVAILABLE_FOR_LEGAL_REASONS:451,HTTP_VERSION_NOT_SUPPORTED:505,BANDWIDTH_LIMIT_EXCEEDED:509,VARIANT_ALSO_NEGOTIATES:506,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,PRECONDITION_REQUIRED:428,INTERNAL_SERVER_ERROR:500,UNPROCESSABLE_ENTITY:422,INSUFFICIENT_STORAGE:507,SWITCHING_PROTOCOLS:101,PRECONDITION_FAILED:412,MISDIRECTED_REQUEST:421,SERVICE_UNAVAILABLE:503,TEMPORARY_REDIRECT:307,PERMANENT_REDIRECT:308,METHOD_NOT_ALLOWED:405,EXPECTATION_FAILED:417,MOVED_PERMANENTLY:301,PAYLOAD_TOO_LARGE:413,FAILED_DEPENDENCY:424,TOO_MANY_REQUESTS:429,ALREADY_REPORTED:208,MULTIPLE_CHOICES:300,PAYMENT_REQUIRED:402,UPGRADE_REQUIRED:426,PARTIAL_CONTENT:206,REQUEST_TIMEOUT:408,LENGTH_REQUIRED:411,NOT_IMPLEMENTED:501,GATEWAY_TIMEOUT:504,NOT_ACCEPTABLE:406,RESET_CONTENT:205,LOOP_DETECTED:508,MULTI_STATUS:207,NOT_MODIFIED:304,UNAUTHORIZED:401,URI_TOO_LONG:414,NOT_EXTENDED:510,EARLY_HINTS:103,BAD_REQUEST:400,IM_A_TEAPOT:418,BAD_GATEWAY:502,PROCESSING:102,NO_CONTENT:204,SEE_OTHER:303,USE_PROXY:305,FORBIDDEN:403,NOT_FOUND:404,TOO_EARLY:425,CONTINUE:100,ACCEPTED:202,CONFLICT:409,CREATED:201,IM_USED:226,LOCKED:423,FOUND:302,GONE:410,OK:200}),b={431:"Request Header Fields Too Large",511:"Network Authentication Required",203:"Non-Authoritative Information",407:"Proxy Authentication Required",451:"Unavailable For Legal Reasons",505:"HTTP Version Not Supported",509:"Bandwidth Limit Exceeded",506:"Variant Also Negotiates",415:"Unsupported Media Type",416:"Range Not Satisfiable",428:"Precondition Required",500:"Internal Server Error",422:"Unprocessable Entity",507:"Insufficient Storage",101:"Switching Protocols",412:"Precondition Failed",421:"Misdirected Request",503:"Service Unavailable",307:"Temporary Redirect",308:"Permanent Redirect",405:"Method Not Allowed",417:"Expectation Failed",301:"Moved Permanently",413:"Payload Too Large",424:"Failed Dependency",429:"Too Many Requests",208:"Already Reported",300:"Multiple Choices",402:"Payment Required",426:"Upgrade Required",206:"Partial Content",408:"Request Timeout",411:"Length Required",501:"Not Implemented",504:"Gateway Timeout",406:"Not Acceptable",205:"Reset Content",508:"Loop Detected",207:"Multi-Status",304:"Not Modified",401:"Unauthorized",414:"URI Too Long",418:"I'm a Teapot",510:"Not Extended",103:"Early Hints",400:"Bad Request",502:"Bad Gateway",102:"Processing",204:"No Content",303:"See Other",305:"Use Proxy",403:"Forbidden",404:"Not Found",425:"Too Early",100:"Continue",202:"Accepted",226:"I'm Used",409:"Conflict",201:"Created",423:"Locked",302:"Found",410:"Gone",200:"OK"};var f=class extends Error{constructor({code:e=b[500],isOperational:r=!1,status:o=500,metadata:M,message:C,cause:L}){super(C),this.name=new.target.name,this.code=e,this.status=o,this.isOperational=r,this.metadata=M,this.cause=L,Error.captureStackTrace(this,new.target)}};function s(t,e=new WeakSet){if(t===null||typeof t!="object"||typeof t=="function"||Object.isFrozen(t)||e.has(t))return t;if(e.add(t),Array.isArray(t))for(let r of t)s(r,e);else for(let r of Object.keys(t))s(t[r],e);return Object.freeze(t)}var c,u=class{constructor(e){l(this,c);var r;this.id=e.id,this.createdAt=(r=e.createdAt)!=null?r:new Date,E(this,c,s(e.props)),this.validate()}get props(){return i(this,c)}equals(e){return e==null?!1:this===e?!0:this.id.equals(e.id)}mutate(e){let r=e(i(this,c));E(this,c,s(r)),this.validate()}};c=new WeakMap;var O=class extends u{constructor(){super(...arguments);this._domainEvents=[]}get domainEvents(){return[...this._domainEvents]}addEvent(r){this._domainEvents.push(r)}pullDomainEvents(){let r=[...this._domainEvents];return this._domainEvents.length=0,r}};var n,N=class N{constructor(e){l(this,n);this.validate(e),E(this,n,e)}get value(){return i(this,n)}equals(e){return e==null||Object.getPrototypeOf(this)!==Object.getPrototypeOf(e)||!(e instanceof N)?!1:i(this,n)===i(e,n)}getValue(){return i(this,n)}toString(){return String(i(this,n))}};n=new WeakMap;var d=N;import V from"fast-deep-equal/es6";var A=class t{get value(){return this.props}constructor(e){this.validate(e),this.props=s(e)}static is(e){return e instanceof t}equals(e){return e==null||Object.getPrototypeOf(this)!==Object.getPrototypeOf(e)?!1:V(this.props,e.props)}toJSON(){return this.props}toString(){return JSON.stringify(this.props)}};var a=class{get errorName(){return this.code.split(".")[1]}get namespace(){return this.code.split(".")[0]}constructor(e,...r){var o;this.message=e,this.metadata=Object.freeze((o=r[0])!=null?o:{})}toObject(){return{metadata:this.metadata,message:this.message,code:this.code,type:this.type}}toString(){return`[${this.code}] ${this.message}`}};var x=class extends a{constructor(r="An unexpected internal error occurred",o){super(r,o);this.code="CORE.INTERNAL_ERROR";this.type="DOMAIN.INVALID_STATE"}};var h=class extends a{constructor(r,o){super(r,o);this.code="SYSTEM.TIMEOUT";this.type="DOMAIN.INVALID_STATE"}};var D=class t{constructor(e){let r=e.error!==void 0;this.isFailure=r,this.isSuccess=!r,this._value=e.value,this._error=e.error,Object.freeze(this)}static fail(e){return new t({error:e})}static ok(e){return new t({value:e})}getError(){return this._error}getValue(){return this._value}isFailureResult(){return this.isFailure}isSuccessResult(){return this.isSuccess}};var P=class t extends a{constructor(){super(...arguments);this.code="CORE.VALIDATION_FAILED";this.type="DOMAIN.INVALID_STATE"}static create(r){return new t(r)}};var p=class t extends a{constructor(){super(...arguments);this.code="DOMAIN.INVALID_VALUE";this.type="DOMAIN.INVALID_VALUE"}static create(r="Provided value object is incorrect",o){return new t(r,o)}};import{randomUUID as F}from"crypto";var _=class{constructor(e){var r;this.id=(r=e.id)!=null?r:F(),this.aggregateId=e.aggregateId,this.schemaVersion=e.schemaVersion,this.occurredAt=e.occurredAt,this.payload=s(e.payload)}toPrimitives(){return{aggregateId:this.aggregateId.toString(),schemaVersion:this.schemaVersion,occurredAt:this.occurredAt,eventName:this.eventName,payload:this.payload,id:this.id}}};import{v4 as w}from"uuid";import H from"zod";var T=class T extends d{constructor(e){super(e),this.validate(e)}static fromString(e){return new this(e)}static generate(){return new this(w())}validate(e){if(!T.schema.safeParse(e).success)throw p.create(`Invalid ${this.constructor.name}: ${e}`,{value:e})}};T.schema=H.uuid();var m=T;var S=class extends m{};import{v4 as k}from"uuid";import j from"zod";var I=class I extends d{constructor(e){super(e)}static fromString(e){return new this(e)}static generate(){return new this(k())}validate(e){if(!I.schema.safeParse(e).success)throw p.create(`Invalid UUID: ${e}`)}};I.schema=j.uuid();var v=I;import G from"zod";var y=class y extends d{constructor(e){super(e),this.validate(e)}static fromString(e){return new this(e)}validate(e){if(!y.schema.safeParse(e).success)throw p.create(`Invalid ${this.constructor.name}: ${e}`,{value:e})}};y.schema=G.email();var U=y;export{S as AggregateId,O as AggregateRoot,f as ApplicationError,a as DomainError,_ as DomainEvent,v as DomainID,U as Email,u as Entity,P as EntityValidationError,z as HttpStatus,b as HttpStatusMessage,x as InternalError,p as InvalidValueObjectError,d as PrimitiveValueObject,D as Result,h as TimeoutError,m as UUID,A as ValueObject,s as deepFreeze};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/domain/entities/entity.ts","../src/domain/aggregates/aggregate-root.ts","../src/domain/base/domain.error.ts","../src/domain/base/primitive-vo.ts","../src/domain/base/vo.ts","../src/utils/deep-freeze.util.ts","../src/domain/errors/entity-validation.error.ts","../src/domain/errors/invalid-vo.error.ts","../src/domain/events/domain.event.ts","../src/domain/value-objects/id.vo.ts","../src/domain/value-objects/aggregate-id.vo.ts","../src/gateway/constants/http-code.ts","../src/utils/errors/application.error.ts","../src/utils/unwrap-vo.util.ts"],"sourcesContent":["import { EntityId } from '../types';\n\n/**\n * Configuration for the base Entity constructor.\n * Forces a single-object argument pattern to avoid positional argument errors.\n * @template ID - A type satisfying the EntityId interface.\n */\nexport interface EntityProps<ID extends EntityId, Props> {\n /** The unique identity of the entity */\n readonly id: ID;\n /** Optional creation timestamp; defaults to 'now' if not provided */\n readonly createdAt?: Date;\n\n readonly props: Props;\n}\n\n/**\n * Abstract Base Entity for Domain-Driven Design (DDD).\n * This class provides the standard contract for entity equality and identity.\n * It intentionally avoids \"magic\" property bags to ensure V8 engine optimization\n * and better IDE intellisense.\n * @template ID - The specific Identity Value Object type.\n */\nexport abstract class Entity<ID extends EntityId, Props> {\n /** The timestamp when this entity was first instantiated/created */\n public readonly createdAt: Date;\n /** The immutable unique identifier for this entity */\n public readonly id: ID;\n\n /**\n * Protected constructor to be called by subclasses.\n * @param props - Initial identity and metadata.\n */\n protected constructor(props: EntityProps<ID, Props>) {\n this.id = props.id;\n this.createdAt = props.createdAt ?? new Date();\n }\n\n /**\n * Compares entities by identity.\n * In DDD, two entities are considered equal if their IDs match,\n * regardless of their other properties.\n * @param other - The entity to compare against.\n * @returns True if IDs are equal.\n */\n public equals(other?: Entity<ID, Props>): boolean {\n if (other == null) return false;\n if (this === other) return true;\n return this.id.equals(other.id);\n }\n\n /**\n * Converts the Entity into a plain Javascript object.\n * Subclasses must implement this to explicitly control serialization,\n * @returns A plain object representation of the entity.\n */\n public abstract toObject(): Record<string, unknown>;\n\n /**\n * Validates the current state of the entity against domain invariants.\n * This method should be called after construction and any mutation.\n * @throws {Error} Should throw a specific DomainError if validation fails.\n */\n public abstract validate(): void;\n}\n","import { Entity, EntityProps } from '../entities/entity';\nimport { DomainEvent } from '../events';\nimport { EntityId } from '../types';\n\n/**\n * Interface for AggregateRoot to ensure type safety and extensibility.\n */\nexport interface Props<P> extends EntityProps<EntityId, P> {\n readonly domainEvents: readonly DomainEvent[];\n /**\n * Adds a domain event to the aggregate.\n * @param event The domain event to add.\n */\n addEvent: (event: DomainEvent) => void;\n\n /**\n * Retrieves and clears all domain events recorded by this aggregate.\n *\n * Domain events represent facts that occurred as a result of state changes\n * within the aggregate. This method transfers ownership of those events\n * to the application layer for further processing (e.g. publishing).\n *\n * Calling this method has the side effect of clearing the aggregate's\n * internal event collection to prevent duplicate handling.\n *\n * This method is intended to be invoked by application services\n * after the aggregate has been successfully persisted.\n *\n * @returns A read-only list of domain events raised by this aggregate.\n */\n pullDomainEvents: () => readonly DomainEvent[];\n}\n\n/**\n * Base class for aggregate roots in DDD, encapsulating domain events and validation.\n * @template EntityProps The type of the entity's properties.\n */\nexport abstract class AggregateRoot<ID extends EntityId, P> extends Entity<\n ID,\n P\n> {\n /**\n * Gets a read-only copy of the domain events.\n */\n get domainEvents(): readonly DomainEvent[] {\n return [...this._domainEvents];\n }\n\n /**\n * Internal list of domain events.\n */\n private readonly _domainEvents: DomainEvent[] = [];\n\n /**\n * Adds a domain event to the aggregate after validating invariants.\n * @param domainEvent The domain event to add.\n * @throws {EntityValidationError} If invariants are not met.\n */\n addEvent(domainEvent: DomainEvent): void {\n this._domainEvents.push(domainEvent);\n }\n\n public pullDomainEvents(): readonly DomainEvent[] {\n const events = [...this._domainEvents];\n this._domainEvents.length = 0;\n return events;\n }\n}\n","export interface DomainErrorMetadata {\n cause?: { name: string; message: string; stack?: string };\n [key: string]: unknown;\n}\n\nconst getCauseInfo = (cause: Error | undefined) => {\n // 1. Handle Error objects specifically\n if (cause instanceof Error) {\n return {\n cause: {\n message: cause.message,\n stack: cause.stack,\n name: cause.name,\n },\n };\n }\n\n // 2. Handle other existing values\n if (cause) {\n return { cause };\n }\n\n // 3. Default to empty\n return {};\n};\n\n/**\n * Base class for all Domain Errors in the application.\n *\n * This class ensures:\n * 1. Serializable and structured for logs or API responses.\n * 2. Identifiable via stable error codes (not just class names).\n * 3. Contextual with optional structured metadata.\n * 4. Supports error chaining (cause) and stack trace preservation.\n *\n * @example\n * export class InsufficientFundsError extends DomainError {\n * constructor(accountId: string, currentBalance: number) {\n * super(\n * `Account ${accountId} has insufficient funds.`,\n * 'INSUFFICIENT_FUNDS',\n * { accountId, currentBalance }\n * );\n * }\n * }\n */\nexport abstract class DomainError extends Error {\n /** Stable, machine-readable error code */\n public readonly code: string;\n /** Structured, immutable domain metadata */\n public readonly metadata: Readonly<DomainErrorMetadata>;\n\n /**\n * @param message - Human-readable error message\n * @param code - Stable error code\n * @param metadata - Domain-specific structured data; optional `cause` can be included\n */\n protected constructor(\n message: string,\n code: string,\n metadata: DomainErrorMetadata = {},\n ) {\n super(message, { ...getCauseInfo(metadata.cause) });\n\n // Restore prototype chain for proper `instanceof` checks\n Object.setPrototypeOf(this, new.target.prototype);\n\n this.name = new.target.name;\n this.code = code;\n this.metadata = Object.freeze({ ...metadata });\n }\n}\n","import { EntityId } from '../types';\n\ntype Primitive = boolean | number | string;\n\n/**\n * Base class for primitive-based Value Objects.\n *\n * This class is intended for Value Objects that are represented by\n * a single primitive value (string, number, or boolean).\n *\n * Characteristics:\n * - Immutable by construction\n * - Cheap equality comparison\n * - No deep cloning or freezing\n * - Safe for serialization and logging\n *\n * Examples:\n * - AggregateId\n * - EmailAddress\n * - Username\n * - Slug\n */\nexport abstract class PrimitiveValueObject<\n T extends Primitive,\n> implements EntityId {\n /**\n * The underlying primitive value.\n * Guaranteed to be valid after construction.\n */\n protected readonly value: T;\n\n /**\n * Constructs a new PrimitiveValueObject.\n *\n * @param value - The primitive value to wrap\n * @throws Error if validation fails\n */\n protected constructor(value: T) {\n this.validate(value);\n this.value = value;\n }\n\n /**\n * Compares two Value Objects for equality.\n *\n * Equality rules:\n * - Same concrete class\n * - Same primitive value (===)\n *\n * @param other - Another Value Object\n */\n public equals(other?: PrimitiveValueObject<T> | null | undefined): boolean {\n if (other === undefined || other === null) return false;\n\n if (Object.getPrototypeOf(this) !== Object.getPrototypeOf(other)) {\n return false;\n }\n\n return this.value === other.value;\n }\n\n /**\n * Returns the primitive value.\n * Prefer explicit access over implicit coercion.\n */\n public getValue(): T {\n return this.value;\n }\n\n /**\n * JSON serialization hook.\n * Produces the raw primitive value.\n */\n public toJSON(): T {\n return this.value;\n }\n\n /**\n * String representation.\n * Useful for logging and debugging.\n */\n public toString(): string {\n return String(this.value);\n }\n\n /**\n * Domain invariant validation.\n * Must throw if the value is invalid.\n *\n * @param value - The value to validate\n */\n protected abstract validate(value: T): void;\n}\n","import deepEqual from 'fast-deep-equal/es6';\n\nimport { deepFreeze } from '@/utils/deep-freeze.util';\n\nexport abstract class ValueObject<T> {\n get value(): T {\n return this.props;\n }\n\n protected readonly props: Readonly<T>;\n\n protected constructor(props: T) {\n this.validate(props);\n this.props = deepFreeze(props);\n }\n\n /**\n * Type guard to check if an unknown object is an instance of ValueObject.\n * This is useful for runtime type checking.\n *\n * @param vo The object to check.\n * @returns True if the object is a ValueObject instance, false otherwise.\n */\n public static is(vo: unknown): vo is ValueObject<unknown> {\n return vo instanceof ValueObject;\n }\n\n /**\n * Deep equality comparison of ValueObjects\n */\n public equals(other?: ValueObject<T>): boolean {\n if (other === null || other === undefined) return false;\n\n // Check if they share the same constructor (Type check)\n if (Object.getPrototypeOf(this) !== Object.getPrototypeOf(other)) {\n return false;\n }\n\n return deepEqual(this.props, other.props);\n }\n\n /**\n * Standard for clean API integration and logging.\n */\n public toJSON(): T {\n return this.props;\n }\n\n /**\n * Useful for debugging and string-based indexing.\n */\n public toString(): string {\n return JSON.stringify(this.props);\n }\n\n /**\n * Validates the value object props\n * @throws InvalidValueObjectError if validation fails\n */\n protected abstract validate(props: T): void;\n}\n","/**\n * Utility to deeply freeze objects to ensure immutability - handles nested objects and arrays.\n *\n * @param obj - The object to be deeply frozen.\n * @param seen - A WeakSet to track already processed objects (for circular references).\n * @returns A deeply frozen version of the input object.\n */\nexport function deepFreeze<T>(\n obj: T,\n seen = new WeakSet<object>(),\n): Readonly<T> {\n // Handle null, undefined, or non-object types\n if (obj == null || (typeof obj !== 'object' && !Array.isArray(obj))) {\n return obj;\n }\n\n // Skip if already frozen\n if (Object.isFrozen(obj)) {\n return obj as Readonly<T>;\n }\n\n // Handle circular references\n if (seen.has(obj as object)) {\n return obj as Readonly<T>;\n }\n\n seen.add(obj as object);\n\n // Handle arrays explicitly\n if (Array.isArray(obj)) {\n obj.forEach(item => deepFreeze(item, seen));\n } else {\n // Handle plain objects\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n deepFreeze((obj as Record<string, unknown>)[key], seen);\n }\n }\n }\n\n return Object.freeze(obj) as Readonly<T>;\n}\n","import { DomainError } from '../base/domain.error';\n\n/**\n * Custom error class for entity validation failures.\n */\nexport class EntityValidationError extends DomainError {\n constructor(message: string, cause?: Error) {\n super(message, 'ENTITY_VALIDATION_ERROR', { cause });\n }\n}\n","import { DomainError } from '../base/domain.error';\n\nexport class InvalidValueObjectError extends DomainError {\n constructor(message: string) {\n super(message, 'INVALID_VALUE_OBJECT');\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { EntityId } from '../types';\n\ntype Primitive = boolean | number | string | null;\n\ntype Serializable =\n | Primitive\n | Serializable[]\n | { [key: string]: Serializable };\n\nexport type DomainEventPayload = Record<string, Serializable>;\n\nexport type UnixTimestampMillis = number;\n\ntype DomainEventProps<AggregateId extends EntityId, Payload> = {\n id?: string;\n aggregateId: AggregateId;\n schemaVersion: number;\n occurredAt: UnixTimestampMillis;\n payload: Payload;\n};\n\n// Abstract base class for domain events\nexport abstract class DomainEvent<\n AggregateId extends EntityId = EntityId,\n T extends DomainEventPayload = DomainEventPayload,\n> {\n public readonly aggregateId: AggregateId;\n\n public abstract readonly eventName: string;\n public readonly id: string;\n public readonly occurredAt: number;\n public readonly payload: Readonly<T>;\n public readonly schemaVersion: number;\n\n protected constructor(props: DomainEventProps<AggregateId, T>) {\n this.id = props.id ?? randomUUID();\n this.aggregateId = props.aggregateId;\n this.schemaVersion = props.schemaVersion;\n this.occurredAt = props.occurredAt;\n this.payload = Object.freeze(props.payload);\n }\n\n public toPrimitives(): Readonly<{\n id: string;\n eventName: string;\n aggregateId: string;\n schemaVersion: number;\n occurredAt: UnixTimestampMillis;\n payload: T;\n }> {\n return {\n aggregateId: this.aggregateId.toString(),\n schemaVersion: this.schemaVersion,\n occurredAt: this.occurredAt,\n eventName: this.eventName,\n payload: this.payload,\n id: this.id,\n };\n }\n}\n","import { v4 } from 'uuid';\nimport z from 'zod';\n\nimport { InvalidValueObjectError } from '../errors/invalid-vo.error';\nimport { PrimitiveValueObject } from '../base/primitive-vo';\n\n/**\n * Represents a UUID (Universally Unique Identifier) value object.\n *\n * This class extends PrimitiveValueObject to provide type-safe UUID handling\n * with validation using Zod schema. UUIDs are immutable and can be generated\n * randomly or created from string values.\n *\n * @example\n * // Generate a new random UUID\n * const id = UUID.generate();\n *\n * @example\n * // Create UUID from an existing string\n * const id = UUID.fromString('550e8400-e29b-41d4-a716-446655440000');\n *\n * @throws {InvalidValueObjectError} When the provided string is not a valid UUID format\n */\nexport class UUID extends PrimitiveValueObject<string> {\n private static readonly schema = z.uuid();\n\n public constructor(value: string) {\n super(value);\n this.validate(value);\n }\n\n /**\n * Creates an UUID from an external string.\n * Use only for untrusted input.\n *\n * @param value - UUID string\n */\n public static fromString(value: string): UUID {\n return new this(value);\n }\n\n /**\n * Generates a new AggregateId.\n */\n public static generate<T extends typeof UUID>(this: T): InstanceType<T> {\n return new this(v4()) as InstanceType<T>;\n }\n\n protected validate(value: string): void {\n const result = UUID.schema.safeParse(value);\n\n if (!result.success) {\n throw new InvalidValueObjectError(\n `Invalid UUID: ${result.error.message}`,\n );\n }\n }\n}\n","import { UUID } from './id.vo';\n\n/**\n * AggregateId represents a strongly-typed aggregate identifier.\n *\n * - Backed by UUID v4\n * - Immutable\n * - Comparable only to AggregateId\n */\nexport class AggregateId extends UUID {}\n","/**\n * HTTP status code catalog.\n *\n * This object provides a typed, immutable map of standard HTTP status names\n * to their numeric codes. Designed for server-side frameworks such as Fastify.\n *\n * - All identifiers use clear, canonical semantic names.\n * - Values are numeric status codes.\n * - Frozen to prevent runtime mutation.\n * - Exporting `HttpStatus` ensures type-safe usage across the codebase.\n * Usage:\n * ```ts\n * import { HttpStatus } from 'path-to-this-file';\n *\n * function handleRequest() {\n * return {\n * statusCode: HttpStatus.OK,\n * body: 'Success',\n * };\n * }\n * ```\n */\nexport const HttpStatus = Object.freeze({\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n NETWORK_AUTHENTICATION_REQUIRED: 511,\n NON_AUTHORITATIVE_INFORMATION: 203,\n PROXY_AUTHENTICATION_REQUIRED: 407,\n\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n BANDWIDTH_LIMIT_EXCEEDED: 509,\n VARIANT_ALSO_NEGOTIATES: 506,\n UNSUPPORTED_MEDIA_TYPE: 415,\n RANGE_NOT_SATISFIABLE: 416,\n PRECONDITION_REQUIRED: 428,\n INTERNAL_SERVER_ERROR: 500,\n UNPROCESSABLE_ENTITY: 422,\n INSUFFICIENT_STORAGE: 507,\n\n SWITCHING_PROTOCOLS: 101,\n PRECONDITION_FAILED: 412,\n MISDIRECTED_REQUEST: 421,\n SERVICE_UNAVAILABLE: 503,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n METHOD_NOT_ALLOWED: 405,\n EXPECTATION_FAILED: 417,\n\n MOVED_PERMANENTLY: 301,\n PAYLOAD_TOO_LARGE: 413,\n FAILED_DEPENDENCY: 424,\n TOO_MANY_REQUESTS: 429,\n ALREADY_REPORTED: 208,\n MULTIPLE_CHOICES: 300,\n PAYMENT_REQUIRED: 402,\n UPGRADE_REQUIRED: 426,\n PARTIAL_CONTENT: 206,\n REQUEST_TIMEOUT: 408,\n LENGTH_REQUIRED: 411,\n NOT_IMPLEMENTED: 501,\n GATEWAY_TIMEOUT: 504,\n NOT_ACCEPTABLE: 406,\n RESET_CONTENT: 205,\n LOOP_DETECTED: 508,\n MULTI_STATUS: 207,\n NOT_MODIFIED: 304,\n UNAUTHORIZED: 401,\n URI_TOO_LONG: 414,\n NOT_EXTENDED: 510,\n EARLY_HINTS: 103,\n BAD_REQUEST: 400,\n IM_A_TEAPOT: 418,\n BAD_GATEWAY: 502,\n PROCESSING: 102,\n NO_CONTENT: 204,\n SEE_OTHER: 303,\n USE_PROXY: 305,\n\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n TOO_EARLY: 425,\n CONTINUE: 100,\n ACCEPTED: 202,\n CONFLICT: 409,\n CREATED: 201,\n IM_USED: 226,\n LOCKED: 423,\n FOUND: 302,\n GONE: 410,\n OK: 200,\n} as const);\n\n/**\n * HTTP status messages mapped by numeric code.\n * Use for sending descriptive text in responses or logging.\n */\nexport const HttpStatusMessage = {\n 431: 'Request Header Fields Too Large',\n 511: 'Network Authentication Required',\n 203: 'Non-Authoritative Information',\n 407: 'Proxy Authentication Required',\n 451: 'Unavailable For Legal Reasons',\n 505: 'HTTP Version Not Supported',\n 509: 'Bandwidth Limit Exceeded',\n 506: 'Variant Also Negotiates',\n 415: 'Unsupported Media Type',\n 416: 'Range Not Satisfiable',\n 428: 'Precondition Required',\n 500: 'Internal Server Error',\n 422: 'Unprocessable Entity',\n 507: 'Insufficient Storage',\n 101: 'Switching Protocols',\n 412: 'Precondition Failed',\n 421: 'Misdirected Request',\n 503: 'Service Unavailable',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 405: 'Method Not Allowed',\n 417: 'Expectation Failed',\n 301: 'Moved Permanently',\n 413: 'Payload Too Large',\n 424: 'Failed Dependency',\n 429: 'Too Many Requests',\n 208: 'Already Reported',\n 300: 'Multiple Choices',\n 402: 'Payment Required',\n 426: 'Upgrade Required',\n 206: 'Partial Content',\n 408: 'Request Timeout',\n 411: 'Length Required',\n 501: 'Not Implemented',\n 504: 'Gateway Timeout',\n 406: 'Not Acceptable',\n 205: 'Reset Content',\n 508: 'Loop Detected',\n 207: 'Multi-Status',\n 304: 'Not Modified',\n 401: 'Unauthorized',\n 414: 'URI Too Long',\n 418: \"I'm a Teapot\",\n 510: 'Not Extended',\n 103: 'Early Hints',\n 400: 'Bad Request',\n 502: 'Bad Gateway',\n 102: 'Processing',\n 204: 'No Content',\n 303: 'See Other',\n 305: 'Use Proxy',\n 403: 'Forbidden',\n 404: 'Not Found',\n 425: 'Too Early',\n 100: 'Continue',\n 202: 'Accepted',\n 226: \"I'm Used\",\n 409: 'Conflict',\n 201: 'Created',\n 423: 'Locked',\n 302: 'Found',\n 410: 'Gone',\n 200: 'OK',\n} as const;\n\nexport type HttpStatusCode = keyof typeof HttpStatusMessage;\n\nexport type HttpStatusMessage =\n (typeof HttpStatusMessage)[keyof typeof HttpStatusMessage];\n","import {\n HttpStatusCode,\n HttpStatusMessage,\n} from '@/gateway/constants/http-code';\n\ninterface ErrorParams {\n message: string;\n code: HttpStatusMessage;\n status?: HttpStatusCode;\n metadata?: Record<string, unknown> | undefined;\n isOperational?: boolean;\n cause?: Error | undefined;\n}\n\n/**\n * Abstract base class for application-level errors with structured error handling.\n *\n * Extends the native Error class to provide machine-readable error codes, HTTP status codes,\n * operational error classification, and optional metadata for better error tracking and client communication.\n *\n * @abstract\n * @extends {Error}\n *\n * @example\n * ```typescript\n * class UserNotFoundError extends ApplicationError {\n * constructor(userId: string) {\n * super({\n * code: HttpStatusMessage['404'],\n * status: 404,\n * isOperational: true,\n * message: `User with id ${userId} not found`,\n * metadata: { userId }\n * });\n * }\n * }\n * ```\n */\nexport abstract class ApplicationError extends Error {\n /** Optional cause (linked error) */\n public readonly cause?: Error | undefined;\n /** Machine-readable error code (e.g. `OTP_LOCKED`, `USER_NOT_FOUND`) */\n public readonly code: HttpStatusMessage;\n /** Operational vs programmer error flag */\n public readonly isOperational: boolean;\n /** Optional structured metadata for debugging or clients */\n public readonly metadata?: Record<string, unknown> | undefined;\n /** HTTP status code intended for response layer */\n public readonly status: HttpStatusCode;\n\n constructor({\n code = HttpStatusMessage['500'],\n isOperational = false,\n status = 500,\n metadata,\n message,\n cause,\n }: ErrorParams) {\n super(message);\n\n this.name = new.target.name;\n this.code = code;\n this.status = status;\n this.isOperational = isOperational;\n this.metadata = metadata;\n this.cause = cause;\n\n Error.captureStackTrace(this, new.target);\n }\n}\n","import { ValueObject } from '@/domain/base/vo';\n\nexport type UnwrapValueObject<T> =\n T extends ValueObject<infer V>\n ? UnwrapValueObject<V>\n : T extends (infer U)[]\n ? UnwrapValueObject<U>[]\n : T extends Map<infer K, infer V>\n ? Map<K, UnwrapValueObject<V>>\n : T extends Set<infer V>\n ? Set<UnwrapValueObject<V>>\n : T extends Date\n ? string\n : T extends object\n ? { [K in keyof T]: UnwrapValueObject<T[K]> }\n : T;\n\nexport function unwrapValueObject<T>(\n input: T,\n seen = new WeakSet(),\n): UnwrapValueObject<T> {\n if (input === null || input === undefined) {\n return input as UnwrapValueObject<T>;\n }\n\n if (typeof input !== 'object') {\n return input as UnwrapValueObject<T>;\n }\n\n if (seen.has(input)) {\n // Prevent circular reference infinite recursion, just return input or throw\n throw new Error('Circular reference detected in ValueObject unwrap');\n }\n\n seen.add(input);\n\n if (Array.isArray(input)) {\n const result = input.map(item => unwrapValueObject(item, seen));\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n }\n\n if (input instanceof ValueObject) {\n const result = unwrapValueObject(input.value, seen);\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n }\n\n if (input instanceof Date) {\n seen.delete(input);\n return input.toISOString() as UnwrapValueObject<T>;\n }\n\n if (input instanceof Map) {\n const result = new Map();\n input.forEach((value, key) => {\n result.set(key, unwrapValueObject(value, seen));\n });\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n }\n\n if (input instanceof Set) {\n const result = new Set(\n Array.from(input.values()).map(v => unwrapValueObject(v, seen)),\n );\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n }\n\n // generic object\n const result: Record<string, unknown> = {};\n\n for (const key in input) {\n if (Object.hasOwn(input, key)) {\n result[key] = unwrapValueObject((input as any)[key], seen);\n }\n }\n\n seen.delete(input);\n return result as UnwrapValueObject<T>;\n}\n\nexport function ensureObject<T>(input: UnwrapValueObject<T>): object {\n if (input === null || input === undefined) {\n return {};\n }\n if (typeof input === 'object') {\n return input;\n }\n\n // for primitives, wrap inside object with default key (or throw)\n return { value: input };\n}\n"],"mappings":"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","names":["Entity","props","_a","other","AggregateRoot","Entity","domainEvent","events","getCauseInfo","cause","DomainError","message","code","metadata","__spreadValues","PrimitiveValueObject","value","other","deepEqual","deepFreeze","obj","seen","item","key","ValueObject","_ValueObject","props","deepFreeze","vo","other","deepEqual","EntityValidationError","DomainError","message","cause","InvalidValueObjectError","DomainError","message","randomUUID","DomainEvent","props","_a","v4","z","_UUID","PrimitiveValueObject","value","v4","result","InvalidValueObjectError","z","UUID","AggregateId","UUID","HttpStatus","HttpStatusMessage","ApplicationError","code","HttpStatusMessage","isOperational","status","metadata","message","cause","unwrapValueObject","input","seen","result","item","ValueObject","value","key","v","ensureObject"]}
|
|
1
|
+
{"version":3,"sources":["../src/gateway/constants/http-code.ts","../src/application/errors/application.error.ts","../src/utils/deep-freeze.util.ts","../src/domain/entities/entity.ts","../src/domain/aggregates/aggregate-root.ts","../src/domain/base/primitive-vo.ts","../src/domain/base/vo.ts","../src/shared/domain/domain.error.ts","../src/shared/domain/errors/internal.error.ts","../src/shared/domain/errors/timeout.error.ts","../src/shared/domain/result.ts","../src/domain/errors/entity-validation.error.ts","../src/domain/errors/invalid-vo.error.ts","../src/domain/events/domain.event.ts","../src/domain/value-objects/id.vo.ts","../src/domain/value-objects/aggregate-id.vo.ts","../src/domain/value-objects/domain-id.vo.ts","../src/domain/value-objects/email.vo.ts"],"sourcesContent":["/**\n * HTTP status code catalog.\n *\n * This object provides a typed, immutable map of standard HTTP status names\n * to their numeric codes. Designed for server-side frameworks such as Fastify.\n *\n * - All identifiers use clear, canonical semantic names.\n * - Values are numeric status codes.\n * - Frozen to prevent runtime mutation.\n * - Exporting `HttpStatus` ensures type-safe usage across the codebase.\n * Usage:\n * ```ts\n * import { HttpStatus } from 'path-to-this-file';\n *\n * function handleRequest() {\n * return {\n * statusCode: HttpStatus.OK,\n * body: 'Success',\n * };\n * }\n * ```\n */\nexport const HttpStatus = Object.freeze({\n REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n NETWORK_AUTHENTICATION_REQUIRED: 511,\n NON_AUTHORITATIVE_INFORMATION: 203,\n PROXY_AUTHENTICATION_REQUIRED: 407,\n\n UNAVAILABLE_FOR_LEGAL_REASONS: 451,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n BANDWIDTH_LIMIT_EXCEEDED: 509,\n VARIANT_ALSO_NEGOTIATES: 506,\n UNSUPPORTED_MEDIA_TYPE: 415,\n RANGE_NOT_SATISFIABLE: 416,\n PRECONDITION_REQUIRED: 428,\n INTERNAL_SERVER_ERROR: 500,\n UNPROCESSABLE_ENTITY: 422,\n INSUFFICIENT_STORAGE: 507,\n\n SWITCHING_PROTOCOLS: 101,\n PRECONDITION_FAILED: 412,\n MISDIRECTED_REQUEST: 421,\n SERVICE_UNAVAILABLE: 503,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n METHOD_NOT_ALLOWED: 405,\n EXPECTATION_FAILED: 417,\n\n MOVED_PERMANENTLY: 301,\n PAYLOAD_TOO_LARGE: 413,\n FAILED_DEPENDENCY: 424,\n TOO_MANY_REQUESTS: 429,\n ALREADY_REPORTED: 208,\n MULTIPLE_CHOICES: 300,\n PAYMENT_REQUIRED: 402,\n UPGRADE_REQUIRED: 426,\n PARTIAL_CONTENT: 206,\n REQUEST_TIMEOUT: 408,\n LENGTH_REQUIRED: 411,\n NOT_IMPLEMENTED: 501,\n GATEWAY_TIMEOUT: 504,\n NOT_ACCEPTABLE: 406,\n RESET_CONTENT: 205,\n LOOP_DETECTED: 508,\n MULTI_STATUS: 207,\n NOT_MODIFIED: 304,\n UNAUTHORIZED: 401,\n URI_TOO_LONG: 414,\n NOT_EXTENDED: 510,\n EARLY_HINTS: 103,\n BAD_REQUEST: 400,\n IM_A_TEAPOT: 418,\n BAD_GATEWAY: 502,\n PROCESSING: 102,\n NO_CONTENT: 204,\n SEE_OTHER: 303,\n USE_PROXY: 305,\n\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n TOO_EARLY: 425,\n CONTINUE: 100,\n ACCEPTED: 202,\n CONFLICT: 409,\n CREATED: 201,\n IM_USED: 226,\n LOCKED: 423,\n FOUND: 302,\n GONE: 410,\n OK: 200,\n} as const);\n\n/**\n * HTTP status messages mapped by numeric code.\n * Use for sending descriptive text in responses or logging.\n */\nexport const HttpStatusMessage = {\n 431: 'Request Header Fields Too Large',\n 511: 'Network Authentication Required',\n 203: 'Non-Authoritative Information',\n 407: 'Proxy Authentication Required',\n 451: 'Unavailable For Legal Reasons',\n 505: 'HTTP Version Not Supported',\n 509: 'Bandwidth Limit Exceeded',\n 506: 'Variant Also Negotiates',\n 415: 'Unsupported Media Type',\n 416: 'Range Not Satisfiable',\n 428: 'Precondition Required',\n 500: 'Internal Server Error',\n 422: 'Unprocessable Entity',\n 507: 'Insufficient Storage',\n 101: 'Switching Protocols',\n 412: 'Precondition Failed',\n 421: 'Misdirected Request',\n 503: 'Service Unavailable',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 405: 'Method Not Allowed',\n 417: 'Expectation Failed',\n 301: 'Moved Permanently',\n 413: 'Payload Too Large',\n 424: 'Failed Dependency',\n 429: 'Too Many Requests',\n 208: 'Already Reported',\n 300: 'Multiple Choices',\n 402: 'Payment Required',\n 426: 'Upgrade Required',\n 206: 'Partial Content',\n 408: 'Request Timeout',\n 411: 'Length Required',\n 501: 'Not Implemented',\n 504: 'Gateway Timeout',\n 406: 'Not Acceptable',\n 205: 'Reset Content',\n 508: 'Loop Detected',\n 207: 'Multi-Status',\n 304: 'Not Modified',\n 401: 'Unauthorized',\n 414: 'URI Too Long',\n 418: \"I'm a Teapot\",\n 510: 'Not Extended',\n 103: 'Early Hints',\n 400: 'Bad Request',\n 502: 'Bad Gateway',\n 102: 'Processing',\n 204: 'No Content',\n 303: 'See Other',\n 305: 'Use Proxy',\n 403: 'Forbidden',\n 404: 'Not Found',\n 425: 'Too Early',\n 100: 'Continue',\n 202: 'Accepted',\n 226: \"I'm Used\",\n 409: 'Conflict',\n 201: 'Created',\n 423: 'Locked',\n 302: 'Found',\n 410: 'Gone',\n 200: 'OK',\n} as const;\n\nexport type HttpStatusCode = keyof typeof HttpStatusMessage;\n\nexport type HttpStatusMessage =\n (typeof HttpStatusMessage)[keyof typeof HttpStatusMessage];\n","import {\n HttpStatusCode,\n HttpStatusMessage,\n} from '@/gateway/constants/http-code';\n\ninterface ErrorParams {\n message: string;\n code: HttpStatusMessage;\n status?: HttpStatusCode;\n metadata?: Record<string, unknown>;\n isOperational?: boolean;\n cause?: Error;\n}\n\n/**\n * Abstract base class for application-level errors with structured error handling.\n *\n * Extends the native Error class to provide machine-readable error codes, HTTP status codes,\n * operational error classification, and optional metadata for better error tracking and client communication.\n *\n * @abstract\n * @extends {Error}\n *\n * @example\n * ```typescript\n * class UserNotFoundError extends ApplicationError {\n * constructor(userId: string) {\n * super({\n * code: HttpStatusMessage['404'],\n * status: 404,\n * isOperational: true,\n * message: `User with id ${userId} not found`,\n * metadata: { userId }\n * });\n * }\n * }\n * ```\n */\nexport abstract class ApplicationError extends Error {\n /** Optional cause (linked error) */\n public readonly cause?: Error | undefined;\n /** Machine-readable error code (e.g. `OTP_LOCKED`, `USER_NOT_FOUND`) */\n public readonly code: HttpStatusMessage;\n /** Operational vs programmer error flag */\n public readonly isOperational: boolean;\n /** Optional structured metadata for debugging or clients */\n public readonly metadata?: Record<string, unknown> | undefined;\n /** HTTP status code intended for response layer */\n public readonly status: HttpStatusCode;\n\n constructor({\n code = HttpStatusMessage['500'],\n isOperational = false,\n status = 500,\n metadata,\n message,\n cause,\n }: ErrorParams) {\n super(message);\n\n this.name = new.target.name;\n this.code = code;\n this.status = status;\n this.isOperational = isOperational;\n this.metadata = metadata;\n this.cause = cause;\n\n Error.captureStackTrace(this, new.target);\n }\n}\n","/**\n * Deeply freezes an object graph to enforce runtime immutability.\n * - Handles arrays\n * - Handles circular references\n * - Skips functions\n * - Skips already frozen objects\n *\n * Intended for aggregate and value object state only.\n */\nexport function deepFreeze<T>(\n value: T,\n seen = new WeakSet<object>(),\n): Readonly<T> {\n // Primitives, null, undefined\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Functions should never be frozen\n if (typeof value === 'function') {\n return value;\n }\n\n // Avoid re-processing\n if (Object.isFrozen(value)) {\n return value as Readonly<T>;\n }\n\n // Handle circular references\n if (seen.has(value)) {\n return value as Readonly<T>;\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n for (const item of value) {\n deepFreeze(item, seen);\n }\n } else {\n for (const key of Object.keys(value)) {\n deepFreeze((value as Record<string, unknown>)[key], seen);\n }\n }\n\n return Object.freeze(value) as Readonly<T>;\n}\n","import { deepFreeze } from '@/utils';\n\nimport { EntityId } from '../types';\n\n// export type Immutable<T> = {\n// readonly [K in keyof T]: Immutable<T[K]>;\n// };\n\nexport type Immutable<T> = T extends (...args: any[]) => any\n ? T\n : T extends Date\n ? T\n : T extends Map<infer K, infer V>\n ? ReadonlyMap<Immutable<K>, Immutable<V>>\n : T extends Set<infer U>\n ? ReadonlySet<Immutable<U>>\n : T extends object\n ? { readonly [K in keyof T]: Immutable<T[K]> }\n : T;\n\n/**\n * Configuration for the base Entity constructor.\n * Forces a single-object argument pattern to avoid positional argument errors.\n * @template ID - A type satisfying the EntityId interface.\n */\nexport interface EntityProps<ID extends EntityId, Props> {\n /** The unique identity of the entity */\n readonly id: ID;\n /** Optional creation timestamp; defaults to 'now' if not provided */\n readonly createdAt?: Date;\n\n props: Props;\n}\n\n/**\n * Abstract Base Entity for Domain-Driven Design (DDD).\n * This class provides the standard contract for entity equality and identity.\n * It intentionally avoids \"magic\" property bags to ensure V8 engine optimization\n * and better IDE intellisense.\n * @template ID - The specific Identity Value Object type.\n */\nexport abstract class Entity<ID extends EntityId, Props> {\n /** The timestamp when this entity was first instantiated/created */\n public readonly createdAt: Date;\n /** The immutable unique identifier for this entity */\n public readonly id: ID;\n\n /**\n * Read-only view of entity state.\n * External code can never mutate internal state.\n */\n protected get props(): Immutable<Props> {\n return this.#props as Immutable<Props>;\n }\n\n // protected props: Props;\n #props: Props;\n\n /**\n * Protected constructor to be called by subclasses.\n * @param params - Initial identity and metadata.\n */\n protected constructor(params: EntityProps<ID, Props>) {\n this.id = params.id;\n this.createdAt = params.createdAt ?? new Date();\n this.#props = deepFreeze(params.props);\n\n this.validate();\n }\n\n /**\n * Compares entities by identity.\n * In DDD, two entities are considered equal if their IDs match,\n * regardless of their other properties.\n * @param other - The entity to compare against.\n * @returns True if IDs are equal.\n */\n public equals(other?: Entity<ID, Props>): boolean {\n if (other == null) return false;\n if (this === other) return true;\n return this.id.equals(other.id);\n }\n\n /**\n * Converts the Entity into a plain Javascript object.\n * Subclasses must implement this to explicitly control serialization,\n * @returns A plain object representation of the entity.\n */\n public abstract toObject(): Record<string, unknown>;\n\n /**\n * Validates the current state of the entity against domain invariants.\n * This method should be called after construction and any mutation.\n * @throws {Error} Should throw a specific DomainError if validation fails.\n */\n public abstract validate(): void;\n\n protected mutate(updater: (current: Props) => Props): void {\n const next = updater(this.#props);\n\n this.#props = deepFreeze(next);\n this.validate();\n }\n}\n","import { Entity, EntityProps } from '../entities/entity';\nimport { DomainEvent } from '../events';\nimport { EntityId } from '../types';\n\n/**\n * Base class for aggregate roots in DDD, encapsulating domain events and validation.\n *\n * Aggregate roots are entities that serve as entry points to aggregates. They:\n * - Enforce invariants across the aggregate\n * - Manage domain events\n * - Define transaction boundaries\n *\n * @template ID - The type of the aggregate's identity (must extend EntityId)\n * @template P - The type of the aggregate's properties\n *\n * @example\n * ```typescript\n * interface UserProps {\n * email: string;\n * isActive: boolean;\n * }\n *\n * class User extends AggregateRoot<AggregateId, UserProps> {\n * // Implementation...\n * }\n * ```\n */\nexport abstract class AggregateRoot<ID extends EntityId, P> extends Entity<\n ID,\n P\n> {\n /**\n * Gets a read-only copy of the domain events.\n */\n get domainEvents(): readonly DomainEvent[] {\n return [...this._domainEvents];\n }\n\n /**\n * Internal list of domain events.\n */\n private readonly _domainEvents: DomainEvent[] = [];\n\n /**\n * Adds a domain event to the aggregate after validating invariants.\n * @param domainEvent The domain event to add.\n * @throws {EntityValidationError} If invariants are not met.\n */\n addEvent(domainEvent: DomainEvent): void {\n this._domainEvents.push(domainEvent);\n }\n\n public pullDomainEvents(): readonly DomainEvent[] {\n const events = [...this._domainEvents];\n this._domainEvents.length = 0;\n return events;\n }\n}\n","import { Primitive } from 'type-fest';\n\nimport { EntityId } from '../types';\n\n/**\n * Base class for primitive-based Value Objects.\n *\n * This class is intended for Value Objects that are represented by\n * a single primitive value (string, number, or boolean).\n *\n * Characteristics:\n * - Immutable by construction\n * - Cheap equality comparison\n * - No deep cloning or freezing\n * - Safe for serialization and logging\n *\n * Examples:\n * - AggregateId\n * - EmailAddress\n * - Username\n * - Slug\n */\nexport abstract class PrimitiveValueObject<\n T extends Primitive,\n> implements EntityId {\n /**\n * The underlying primitive value.\n * Guaranteed to be valid after construction.\n */\n get value(): T {\n return this.#value;\n }\n\n readonly #value: Readonly<T>;\n\n /**\n * Constructs a new PrimitiveValueObject.\n *\n * @param value - The primitive value to wrap\n * @throws Error if validation fails\n */\n protected constructor(value: T) {\n this.validate(value);\n this.#value = value;\n }\n\n /**\n * Compares two Value Objects for equality.\n *\n * Equality rules:\n * - Same concrete class\n * - Same primitive value (===)\n *\n * @param other - Another Value Object\n */\n public equals(other: any): boolean {\n if (other == null) return false;\n\n if (Object.getPrototypeOf(this) !== Object.getPrototypeOf(other)) {\n return false;\n }\n\n if (!(other instanceof PrimitiveValueObject)) return false;\n\n return this.#value === other.#value;\n }\n\n /**\n * Returns the primitive value.\n * Prefer explicit access over implicit coercion.\n * @deprecated - instead use instance.value\n */\n public getValue(): T {\n return this.#value;\n }\n\n /**\n * String representation.\n * Useful for logging and debugging.\n */\n public toString(): string {\n return String(this.#value);\n }\n\n /**\n * Domain invariant validation.\n * Must throw if the value is invalid.\n *\n * @param value - The value to validate\n */\n protected abstract validate(value: T): void;\n}\n","import deepEqual from 'fast-deep-equal/es6';\n\nimport { deepFreeze } from '@/utils/deep-freeze.util';\n\nexport abstract class ValueObject<T> {\n get value(): T {\n return this.props;\n }\n\n protected readonly props: Readonly<T>;\n\n protected constructor(props: T) {\n this.validate(props);\n this.props = deepFreeze(props);\n }\n\n /**\n * Type guard to check if an unknown object is an instance of ValueObject.\n * This is useful for runtime type checking.\n *\n * @param vo The object to check.\n * @returns True if the object is a ValueObject instance, false otherwise.\n */\n public static is(vo: unknown): vo is ValueObject<unknown> {\n return vo instanceof ValueObject;\n }\n\n /**\n * Deep equality comparison of ValueObjects\n */\n public equals(other?: ValueObject<T>): boolean {\n if (other == null) return false;\n\n // Check if they share the same constructor (Type check)\n if (Object.getPrototypeOf(this) !== Object.getPrototypeOf(other)) {\n return false;\n }\n\n return deepEqual(this.props, other.props);\n }\n\n /**\n * Standard for clean API integration and logging.\n */\n public toJSON(): T {\n return this.props;\n }\n\n /**\n * Useful for debugging and string-based indexing.\n */\n public toString(): string {\n return JSON.stringify(this.props);\n }\n\n /**\n * Validates the value object props\n * @throws InvalidValueObjectError if validation fails\n */\n protected abstract validate(props: T): void;\n}\n","export type Primitive = boolean | number | string | null | undefined;\n\nexport type Metadata<T = {}> = T extends Record<string, Primitive> ? T : {};\n\n/**\n * Categories of domain errors based on the nature of the violation.\n *\n * @typedef {'DOMAIN.INVALID_STATE' | 'DOMAIN.INVALID_VALUE'} DomainErrorType\n *\n * @example\n * // DomainErrorType usage:\n * const errorType: DomainErrorType = 'DOMAIN.INVALID_STATE';\n */\nexport type DomainErrorType = 'DOMAIN.INVALID_STATE' | 'DOMAIN.INVALID_VALUE';\n\n// ============ TYPE UTILITIES ============\nexport type ValueOf<T> = T[keyof T];\nexport type UnionToIntersection<U> = (\n U extends any ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never;\n\n/**\n * Interface for declaring domain error namespaces via declaration merging.\n * Projects extend this interface to add their own namespaces and error codes.\n *\n * @example\n * // In your project's type definition file (.d.ts):\n * declare module '@your-org/domain-errors' {\n * interface DomainErrorNamespaces {\n * USER: ['NOT_FOUND', 'INVALID_EMAIL', 'SUSPENDED'];\n * ORDER: ['NOT_FOUND', 'INVALID_STATUS', 'OUT_OF_STOCK'];\n * // Override default namespace (optional):\n * CORE: ['INTERNAL_ERROR', 'VALIDATION_FAILED', 'CONFIGURATION_ERROR'];\n * }\n * }\n *\n * @example\n * // This enables type-safe error codes:\n * const code: DomainErrorCode = 'USER.NOT_FOUND'; // ✅ Valid\n * const code: DomainErrorCode = 'USER.INVALID'; // ❌ TypeScript error\n */\nexport interface DomainErrorNamespaces {\n // Built-in core namespaces (available in all projects)\n DOMAIN: ['INVALID_VALUE', 'INVALID_STATE'];\n CORE: [\n 'INTERNAL_ERROR',\n 'VALIDATION_FAILED',\n 'CONFIGURATION_ERROR',\n 'NOT_IMPLEMENTED',\n ];\n SYSTEM: ['UNEXPECTED', 'TIMEOUT', 'NETWORK_ERROR', 'DEPENDENCY_ERROR'];\n}\n\n// ============ INFER TYPES FROM REGISTRY ============\ntype Namespace = keyof DomainErrorNamespaces;\ntype ErrorName<N extends Namespace> = DomainErrorNamespaces[N][number];\n\n/**\n * Union type of all valid domain error codes derived from registered namespaces.\n * Automatically updates when projects extend DomainErrorNamespaces.\n *\n * @example\n * // After extending DomainErrorNamespaces with USER namespace:\n * type ErrorCode = DomainErrorCode;\n * // Becomes: 'CORE.INTERNAL_ERROR' | 'CORE.VALIDATION_FAILED' |\n * // 'USER.NOT_FOUND' | 'USER.INVALID_EMAIL' | ...\n */\nexport type DomainErrorCode = {\n [N in Namespace]: `${Uppercase<string & N>}.${Uppercase<ErrorName<N>>}`;\n}[Namespace];\n\n// Extract namespace from code\nexport type ExtractNamespace<Code extends DomainErrorCode> =\n Code extends `${infer N}.${string}` ? N : never;\n\n// Extract error name from code\nexport type ExtractErrorName<Code extends DomainErrorCode> =\n Code extends `${string}.${infer E}` ? E : never;\n\n/**\n * Base class for all domain errors in a Domain-Driven Design architecture.\n *\n * Domain errors represent violations of business rules and domain invariants.\n * They are pure value objects without infrastructure concerns like IDs or timestamps.\n *\n * @typeParam Code - The specific error code from DomainErrorCode union\n * @typeParam Meta - Type of metadata associated with this error\n *\n * @example\n * // 1. First, declare your namespaces:\n * declare module '@your-org/domain-errors' {\n * interface DomainErrorNamespaces {\n * USER: ['NOT_FOUND', 'INVALID_EMAIL'];\n * }\n * }\n *\n * @example\n * // 2. Create a concrete domain error:\n * class UserNotFoundError extends DomainError<'USER.NOT_FOUND', { userId: string }> {\n * public readonly code = 'USER.NOT_FOUND' as const;\n * public readonly type: DomainErrorType = 'DOMAIN.INVALID_VALUE';\n *\n * constructor(userId: string) {\n * super(`User with ID '${userId}' not found`, { userId });\n * }\n * }\n *\n * @example\n * // 3. Usage in domain services:\n * class UserService {\n * async activateUser(userId: string): Promise<Result<User, DomainError>> {\n * const user = await this.repository.findById(userId);\n *\n * if (!user) {\n * return Result.failure(new UserNotFoundError(userId));\n * }\n *\n * if (user.isSuspended) {\n * return Result.failure(new UserSuspendedError(userId));\n * }\n *\n * // Business logic...\n * }\n * }\n *\n * @abstract\n */\nexport abstract class DomainError<\n Meta extends Record<string, Primitive> = {},\n Code extends DomainErrorCode = DomainErrorCode,\n> {\n /**\n * Machine-readable error code in format: NAMESPACE.ERROR_NAME\n *\n * @remarks\n * - Must be uppercase (e.g., 'USER.NOT_FOUND')\n * - Namespace must be declared in DomainErrorNamespaces\n * - Error name must be in the namespace's array\n *\n * @example\n * public readonly code = 'USER.NOT_FOUND' as const;\n */\n public abstract readonly code: Code;\n /**\n * Human-readable error message describing the domain rule violation.\n * Should be meaningful to developers and potentially end-users.\n *\n * @remarks\n * - Avoid technical implementation details\n * - Focus on the business rule that was violated\n * - Can include values from metadata for context\n *\n * @example\n * // Good: \"Order amount $150 exceeds maximum limit of $100\"\n * // Bad: \"Amount validation failed: 150 > 100\"\n */\n public readonly message: string;\n\n /**\n * Immutable structured context providing additional information about the error.\n * Useful for debugging, logging, and creating detailed error messages.\n *\n * @remarks\n * - Values must be primitive types (string, number, boolean, etc.)\n * - Object is frozen to prevent mutation\n * - Type-safe based on the error code\n *\n * @example\n * // For UserNotFoundError:\n * { userId: 'usr_123', attemptedAction: 'activate' }\n *\n * @readonly\n */\n public readonly metadata: Readonly<Meta>;\n\n /**\n * Category of domain error indicating the nature of violation.\n *\n * @remarks\n * Use 'DOMAIN.INVALID_STATE' for state violations (e.g., \"Cannot checkout empty cart\")\n * Use 'DOMAIN.INVALID_VALUE' for value violations (e.g., \"Email format is invalid\")\n *\n * @example\n * public readonly type: DomainErrorType = 'DOMAIN.INVALID_VALUE';\n */\n public abstract readonly type: DomainErrorType;\n\n /** Get error name from error code */\n public get errorName(): ExtractErrorName<Code> {\n return this.code.split('.')[1] as ExtractErrorName<Code>;\n }\n\n // ============ COMPUTED PROPERTIES ============\n /** Get namespace from error code */\n public get namespace(): ExtractNamespace<Code> {\n return this.code.split('.')[0] as ExtractNamespace<Code>;\n }\n\n /**\n * Creates a new DomainError instance.\n *\n * @param message - Human-readable description of the domain rule violation\n * @param metadata - Optional structured context (primitive values only)\n *\n * @example\n * constructor(userId: string) {\n * super(`User with ID '${userId}' not found`, { userId });\n * }\n *\n * @example\n * constructor(amount: number, maxLimit: number) {\n * super(\n * `Order amount $${amount} exceeds maximum limit of $${maxLimit}`,\n * { amount, maxLimit }\n * );\n * }\n */\n protected constructor(\n message: string,\n ...args: keyof Meta extends never\n ? [] | [metadata?: Meta]\n : [metadata: Meta]\n ) {\n this.message = message;\n this.metadata = Object.freeze(args[0] ?? {}) as Readonly<Meta>;\n }\n\n /**\n * Serializes the error to a plain object for debugging, logging, or transport.\n * Does not include infrastructure concerns like stack traces or timestamps.\n *\n * @returns Plain object with error details\n *\n * @example\n * const error = new UserNotFoundError('usr_123');\n * const json = error.toJSON();\n * // Result:\n * // {\n * // code: 'USER.NOT_FOUND',\n * // message: \"User with ID 'usr_123' not found\",\n * // type: 'DOMAIN.INVALID_VALUE',\n * // metadata: { userId: 'usr_123' }\n * // }\n */\n public toObject() {\n return {\n metadata: this.metadata,\n message: this.message,\n code: this.code,\n type: this.type,\n };\n }\n\n /**\n * Returns a string representation of the error.\n * Format: [CODE] MESSAGE\n *\n * @returns Human-readable string representation\n *\n * @example\n * const error = new UserNotFoundError('usr_123');\n * console.log(error.toString());\n * // Output: [USER.NOT_FOUND] User with ID 'usr_123' not found\n *\n * @override\n */\n public toString(): string {\n return `[${this.code}] ${this.message}`;\n }\n}\n","/* eslint-disable @typescript-eslint/class-literal-property-style */\n\nimport {\n DomainError,\n DomainErrorType,\n Metadata,\n Primitive,\n} from '../domain.error';\n\n/**\n * Default domain errors for common scenarios.\n * These errors are available across all projects using this module.\n */\n\n/**\n * Error thrown when an unexpected internal error occurs.\n * Typically used for programming bugs, invalid assumptions, or states that should never happen.\n *\n * @remarks\n * - Metadata is optional for empty metadata types and required if a non-empty type is provided.\n * - Useful for debugging, logging, and adding context to unexpected failures.\n *\n * @example\n * // Catch a programming error:\n * try {\n * complexBusinessLogic();\n * } catch (error) {\n * throw new InternalError({\n * message: 'Unexpected error in complexBusinessLogic',\n * metadata: { originalError: error.message, timestamp: Date.now() }\n * });\n * }\n *\n * @example\n * // Fallback for unhandled cases:\n * switch (status) {\n * case 'PENDING':\n * break;\n * case 'COMPLETED':\n * break;\n * default:\n * throw new InternalError({\n * message: `Unhandled status: ${status}`,\n * metadata: { status }\n * });\n * }\n */\nexport class InternalError<T = Record<string, Primitive>> extends DomainError<\n Metadata<T>\n> {\n /** @inheritdoc */\n public readonly code = 'CORE.INTERNAL_ERROR' as const;\n\n /** @inheritdoc */\n public readonly type: DomainErrorType = 'DOMAIN.INVALID_STATE';\n\n /**\n * Creates a new InternalError.\n *\n * @param message - Description of the internal error\n * @param metadata - Optional debug information\n */\n constructor(\n message: string = 'An unexpected internal error occurred',\n metadata?: Metadata<T>,\n ) {\n super(message, metadata);\n }\n}\n","/* eslint-disable @typescript-eslint/class-literal-property-style */\n\nimport {\n DomainError,\n DomainErrorType,\n Metadata,\n Primitive,\n} from '../domain.error';\n\n/**\n * Error thrown when an operation times out.\n * Use for operations that exceed their allowed execution time.\n *\n * @example\n * // Operation timeout:\n * const timeout = setTimeout(() => {\n * throw new TimeoutError(\n * 'User registration timed out'\n * );\n * }, 5000);\n *\n * @example\n * // With Promise.race:\n * type Props = { url: string, timeoutMs: number }\n * async function fetchWithTimeout(url: string, timeoutMs: number) {\n * const timeoutPromise = new Promise<never>((_, reject) => {\n * setTimeout(() => {\n * reject(new TimeoutError<Props>(\n * `Request to ${url} timed out`,\n * { url, timeoutMs }\n * ));\n * }, timeoutMs);\n * });\n *\n * return await Promise.race([fetch(url), timeoutPromise]);\n * }\n */\nexport class TimeoutError<T = Record<string, Primitive>> extends DomainError<\n Metadata<T>\n> {\n /** @inheritdoc */\n public readonly code = 'SYSTEM.TIMEOUT' as const;\n\n /** @inheritdoc */\n public readonly type: DomainErrorType = 'DOMAIN.INVALID_STATE';\n\n /**\n * Creates a new TimeoutError.\n *\n * @param message - Description of the timeout\n * @param metadata - Optional timeout context\n */\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(message: string, metadata?: Metadata<T>) {\n super(message, metadata);\n }\n}\n","import { DomainError } from './domain.error';\n\n/**\n * Represents the result of an operation, which can be either a success or a failure.\n *\n * This is a functional programming pattern that helps avoid throwing exceptions\n * and makes error handling explicit in the type system. It's commonly used in\n * Domain-Driven Design (DDD) to represent domain operation outcomes.\n *\n * @template T The type of a successful result.\n * @template E The type of the error in case of failure (defaults to DomainError).\n *\n * @example\n * ```typescript\n * // Creating a successful result\n * const success = Result.ok({ id: 1, name: 'John' });\n * if (success.isSuccess) {\n * const user = success.getValue(); // { id: 1, name: 'John' }\n * }\n *\n * // Creating a failed result\n * const failure = Result.fail(new InvalidUserError('User not found'));\n * if (failure.isFailure) {\n * const error = failure.getError(); // InvalidUserError instance\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Using in a domain service\n * function createUser(name: string): Result<User, DomainError> {\n * if (!name || name.trim().length === 0) {\n * return Result.fail(new InvalidValueError('Name cannot be empty'));\n * }\n *\n * const user = new User(name);\n * return Result.ok(user);\n * }\n *\n * const result = createUser('John Doe');\n * if (result.isSuccess) {\n * console.log('User created:', result.getValue());\n * } else {\n * console.error('Failed:', result.getError()?.message);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Chaining operations\n * function validateEmail(email: string): Result<string, DomainError> {\n * if (!email.includes('@')) {\n * return Result.fail(new InvalidValueError('Invalid email format'));\n * }\n * return Result.ok(email);\n * }\n *\n * function createAccount(email: string): Result<Account, DomainError> {\n * const emailResult = validateEmail(email);\n * if (emailResult.isFailure) {\n * return emailResult; // Forward the error\n * }\n *\n * const account = new Account(emailResult.getValue()!);\n * return Result.ok(account);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Working with async operations\n * async function fetchUser(id: number): Promise<Result<User, DomainError>> {\n * try {\n * const user = await userRepository.findById(id);\n * if (!user) {\n * return Result.fail(new NotFoundError(`User ${id} not found`));\n * }\n * return Result.ok(user);\n * } catch (error) {\n * return Result.fail(new SystemError('Database connection failed'));\n * }\n * }\n *\n * const result = await fetchUser(123);\n * if (result.isSuccess) {\n * // Handle success\n * } else {\n * // Handle failure\n * }\n * ```\n */\nexport class Result<T, E> {\n /**\n * Indicates if the result is a failure.\n *\n * @example\n * ```typescript\n * const result = Result.fail(new Error('Something went wrong'));\n * if (result.isFailure) {\n * // Handle error case\n * console.error(result.getError());\n * }\n * ```\n */\n public readonly isFailure: boolean;\n\n /**\n * Indicates if the result is a success.\n *\n * @example\n * ```typescript\n * const result = Result.ok(42);\n * if (result.isSuccess) {\n * // Handle success case\n * const value = result.getValue(); // 42\n * }\n * ```\n */\n public readonly isSuccess: boolean;\n\n /**\n * The error, if any.\n * @private\n */\n private readonly _error?: E;\n\n /**\n * The value, if any.\n * @private\n */\n private readonly _value?: T;\n\n /**\n * Private constructor to enforce the use of static methods.\n * @param params.value The value on success.\n * @param params.error The error on failure.\n * @private\n */\n private constructor(params: { value?: T; error?: E }) {\n const hasError = params.error !== undefined;\n this.isFailure = hasError;\n this.isSuccess = !hasError;\n\n this._value = params.value;\n this._error = params.error;\n Object.freeze(this);\n }\n\n /**\n * Creates a failed result.\n *\n * @template T The type of a successful result (never for failure).\n * @template E The type of the error (defaults to DomainError).\n * @param error The error object.\n * @returns {Result<T, E>} A failed Result instance.\n *\n * @example\n * ```typescript\n * // With DomainError\n * class InvalidValueError extends DomainError {\n * public readonly code = 'DOMAIN.INVALID_VALUE' as const;\n * constructor(message: string) {\n * super({ message });\n * }\n * }\n *\n * const result = Result.fail(new InvalidValueError('Value must be positive'));\n * // result.isFailure === true\n * // result.getError() === InvalidValueError instance\n * ```\n *\n * @example\n * ```typescript\n * // With custom error type\n * interface ValidationError {\n * field: string;\n * message: string;\n * }\n *\n * const result = Result.fail<never, ValidationError>({\n * field: 'email',\n * message: 'Invalid email format'\n * });\n * ```\n *\n * @example\n * ```typescript\n * // In a validation function\n * function validateAge(age: number): Result<number, DomainError> {\n * if (age < 0) {\n * return Result.fail(new InvalidValueError('Age cannot be negative'));\n * }\n * if (age > 150) {\n * return Result.fail(new InvalidValueError('Age seems unrealistic'));\n * }\n * return Result.ok(age);\n * }\n * ```\n */\n public static fail<T = never, E = DomainError>(error: E): Result<T, E> {\n return new Result({ error });\n }\n\n /**\n * Creates a successful result.\n *\n * @template T The type of the successful result.\n * @template E The type of the error (never for success).\n * @param value The success value.\n * @returns {Result<T, E>} A successful Result instance.\n *\n * @example\n * ```typescript\n * // With primitive value\n * const result = Result.ok(42);\n * // result.isSuccess === true\n * // result.getValue() === 42\n * ```\n *\n * @example\n * ```typescript\n * // With object\n * const user = { id: 1, name: 'John', email: 'john@example.com' };\n * const result = Result.ok(user);\n * if (result.isSuccess) {\n * const savedUser = result.getValue(); // { id: 1, name: 'John', ... }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With domain entity\n * class User {\n * constructor(public readonly id: number, public readonly name: string) {}\n * }\n *\n * function createUser(name: string): Result<User, DomainError> {\n * const user = new User(Date.now(), name);\n * return Result.ok(user);\n * }\n *\n * const result = createUser('Alice');\n * if (result.isSuccess) {\n * console.log(`Created user: ${result.getValue()?.name}`);\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With void/undefined (for operations that don't return a value)\n * function deleteUser(id: number): Result<void, DomainError> {\n * // ... deletion logic ...\n * return Result.ok(undefined);\n * }\n *\n * const result = deleteUser(123);\n * if (result.isSuccess) {\n * console.log('User deleted successfully');\n * }\n * ```\n */\n public static ok<T, E = never>(value: T): Result<T, E> {\n return new Result({ value });\n }\n\n /**\n * Returns the error if present, otherwise undefined.\n *\n * **Note:** Always check `isFailure` before calling this method to ensure\n * the result is actually a failure. This method will return `undefined` for\n * successful results.\n *\n * @returns {E | undefined} The error or undefined if successful.\n *\n * @example\n * ```typescript\n * const result = Result.fail(new InvalidValueError('Invalid input'));\n *\n * if (result.isFailure) {\n * const error = result.getError();\n * if (error) {\n * console.error(`Error code: ${error.code}, Message: ${error.message}`);\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Safe error handling pattern\n * function handleResult<T>(result: Result<T, DomainError>): void {\n * if (result.isFailure) {\n * const error = result.getError();\n * if (error) {\n * // Log error with metadata\n * console.error({\n * code: error.code,\n * message: error.message,\n * metadata: error.metadata\n * });\n * }\n * }\n * }\n * ```\n */\n public getError(): E | undefined {\n return this._error;\n }\n\n /**\n * Returns the value if present, otherwise undefined.\n *\n * **Note:** Always check `isSuccess` before calling this method to ensure\n * the result is actually a success. This method will return `undefined` for\n * failed results.\n *\n * @returns {T | undefined} The value or undefined if failed.\n *\n * @example\n * ```typescript\n * const result = Result.ok({ id: 1, name: 'John' });\n *\n * if (result.isSuccess) {\n * const user = result.getValue();\n * if (user) {\n * console.log(`User: ${user.name} (ID: ${user.id})`);\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Type-safe value extraction\n * function processUser(result: Result<User, DomainError>): void {\n * if (result.isSuccess) {\n * const user = result.getValue();\n * // TypeScript knows user is User | undefined here\n * if (user) {\n * // Process the user\n * userRepository.save(user);\n * }\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Using non-null assertion (use with caution)\n * const result = Result.ok(42);\n * if (result.isSuccess) {\n * const value = result.getValue()!; // Safe because we checked isSuccess\n * console.log(value * 2); // 84\n * }\n * ```\n */\n public getValue(): T | undefined {\n return this._value;\n }\n\n /**\n * Type guard for failure.\n */\n public isFailureResult(): this is Result<never, E> {\n return this.isFailure;\n }\n\n /**\n * Type guard for success.\n */\n public isSuccessResult(): this is Result<T, never> {\n return this.isSuccess;\n }\n}\n","import { DomainError, DomainErrorCode, DomainErrorType } from '@/shared';\n\n/**\n * Custom error class for entity validation failures.\n */\nexport class EntityValidationError extends DomainError {\n public code: DomainErrorCode = 'CORE.VALIDATION_FAILED';\n public type: DomainErrorType = 'DOMAIN.INVALID_STATE';\n\n public static create(msg: string) {\n return new EntityValidationError(msg);\n }\n}\n","import {\n DomainError,\n DomainErrorCode,\n DomainErrorType,\n Metadata,\n} from '@/shared';\n\ntype Params = {\n value: string;\n};\n\ntype Props = Metadata<Params>;\nexport class InvalidValueObjectError extends DomainError<Props> {\n public code = 'DOMAIN.INVALID_VALUE' as DomainErrorCode;\n public type: DomainErrorType = 'DOMAIN.INVALID_VALUE';\n\n public static create(\n msg = 'Provided value object is incorrect',\n meta?: Props,\n ) {\n return new InvalidValueObjectError(msg, meta);\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { deepFreeze } from '@/utils';\n\nimport { EntityId } from '../types';\n\ntype Primitive = boolean | number | string | null;\n\ntype Serializable =\n | Primitive\n | Serializable[]\n | { [key: string]: Serializable };\n\nexport type DomainEventPayload = Record<string, Serializable>;\n\nexport type UnixTimestampMillis = number;\n\ntype DomainEventProps<Payload, AggregateId extends EntityId> = {\n id?: string;\n aggregateId: AggregateId;\n schemaVersion: number;\n occurredAt: UnixTimestampMillis;\n payload: Payload;\n};\n\nexport type CreateEventProps<\n EventProps,\n ID extends EntityId,\n> = DomainEventProps<EventProps, ID>;\n\n// Abstract base class for domain events\nexport abstract class DomainEvent<\n AggregateId extends EntityId = EntityId,\n T extends DomainEventPayload = DomainEventPayload,\n> {\n public readonly aggregateId: AggregateId;\n\n public abstract readonly eventName: string;\n public readonly id: string;\n public readonly occurredAt: number;\n public readonly payload: Readonly<T>;\n public readonly schemaVersion: number;\n\n protected constructor(props: DomainEventProps<T, AggregateId>) {\n this.id = props.id ?? randomUUID();\n this.aggregateId = props.aggregateId;\n this.schemaVersion = props.schemaVersion;\n this.occurredAt = props.occurredAt;\n this.payload = deepFreeze(props.payload);\n }\n\n public toPrimitives(): Readonly<{\n id: string;\n eventName: string;\n aggregateId: string;\n schemaVersion: number;\n occurredAt: UnixTimestampMillis;\n payload: T;\n }> {\n return {\n aggregateId: this.aggregateId.toString(),\n schemaVersion: this.schemaVersion,\n occurredAt: this.occurredAt,\n eventName: this.eventName,\n payload: this.payload,\n id: this.id,\n };\n }\n}\n","import { v4 } from 'uuid';\nimport z from 'zod';\n\nimport { InvalidValueObjectError } from '../errors/invalid-vo.error';\nimport { PrimitiveValueObject } from '../base/primitive-vo';\n\n/**\n * Represents a UUID (Universally Unique Identifier) value object.\n *\n * This class extends PrimitiveValueObject to provide type-safe UUID handling\n * with validation using Zod schema. UUIDs are immutable and can be generated\n * randomly or created from string values.\n * @deprecated\n * @example\n * // Generate a new random UUID\n * const id = UUID.generate();\n *\n * @example\n * // Create UUID from an existing string\n * const id = UUID.fromString('550e8400-e29b-41d4-a716-446655440000');\n *\n * @throws {InvalidValueObjectError} When the provided string is not a valid UUID format\n */\nexport class UUID extends PrimitiveValueObject<string> {\n private static readonly schema = z.uuid();\n\n public constructor(value: string) {\n super(value);\n this.validate(value);\n }\n\n /**\n * Creates an UUID from an external string.\n * Use only for untrusted input.\n *\n * @param value - UUID string\n */\n public static fromString(value: string): UUID {\n return new this(value);\n }\n\n /**\n * Generates a new AggregateId.\n */\n public static generate<T extends typeof UUID>(this: T): InstanceType<T> {\n return new this(v4()) as InstanceType<T>;\n }\n\n protected validate(value: string): void {\n const result = UUID.schema.safeParse(value);\n\n if (!result.success) {\n throw InvalidValueObjectError.create(\n `Invalid ${this.constructor.name}: ${value}`,\n {\n value,\n },\n );\n }\n }\n}\n","import { UUID } from './id.vo';\n\n/**\n * AggregateId represents a strongly-typed aggregate identifier.\n *\n * - Backed by UUID v4\n * - Immutable\n * - Comparable only to AggregateId\n */\nexport class AggregateId extends UUID {}\n","import type { Tagged } from 'type-fest';\nimport { v4 } from 'uuid';\nimport z from 'zod';\n\nimport { InvalidValueObjectError } from '../errors/invalid-vo.error';\nimport { PrimitiveValueObject } from '../base/primitive-vo';\n\n/**\n * UUID is a branded string type.\n *\n * - Prevents accidental use of arbitrary strings\n * - Requires explicit validation or construction\n * - Zero runtime cost after creation\n */\n\nexport type UuID = Tagged<string, 'UUID'>;\n\n/**\n * Abstract base class for all domain identifiers.\n *\n * Responsibilities:\n * - Enforces that every DomainID wraps a primitive string value.\n * - Provides a type-safe static factory `fromString` for creating concrete IDs.\n * - Leaves domain-specific validation to subclasses via `validate`.\n *\n * Design Notes:\n * - The class cannot know how to validate the ID itself, because validation\n * rules differ between ID types (e.g., UUID v4, ULID, NanoID).\n * - Static factory uses `new this(value)` pattern; hence, base class is **not abstract** in TypeScript terms.\n * - Subclasses must implement `validate(value: string)` inherited from PrimitiveValueObject.\n *\n * Usage:\n * ```ts\n * class AuthAttemptId extends DomainID {\n * protected validate(value: string): void {\n * if (!isValidUuid(value)) {\n * throw new Error('Invalid AuthAttemptId');\n * }\n * }\n * }\n *\n * const id = AuthAttemptId.fromString('550e8400-e29b-41d4-a716-446655440000');\n * ```\n */\nexport abstract class DomainID extends PrimitiveValueObject<UuID> {\n public static schema = z.uuid();\n\n public constructor(value: string) {\n super(value as UuID);\n }\n\n /**\n * Creates a concrete DomainID from a trusted string value.\n *\n * - Validation is enforced in the subclass constructor.\n * - Intended for application or infrastructure layers to produce IDs.\n *\n * @template T - Concrete subclass of DomainID\n * @param this - The constructor of the concrete subclass\n * @param value - Raw string value of the ID\n * @returns Instance of the concrete DomainID subclass\n */\n public static fromString<T extends new (value: string) => DomainID>(\n this: T,\n value: string,\n ): InstanceType<T> {\n return new this(value) as InstanceType<T>;\n }\n\n public static generate<T extends new (value: string) => DomainID>(\n this: T,\n ): InstanceType<T> {\n return new this(v4()) as InstanceType<T>;\n }\n\n protected validate(value: UuID): void {\n const result = DomainID.schema.safeParse(value);\n\n if (!result.success) {\n throw InvalidValueObjectError.create(`Invalid UUID: ${value}`);\n }\n }\n}\n","import z from 'zod';\n\nimport { InvalidValueObjectError } from '../errors/invalid-vo.error';\nimport { PrimitiveValueObject } from '../base/primitive-vo';\n\nexport class Email extends PrimitiveValueObject<string> {\n private static readonly schema = z.email();\n\n public constructor(value: string) {\n super(value);\n this.validate(value);\n }\n\n public static fromString(value: string): Email {\n return new this(value);\n }\n\n protected validate(value: string): void {\n const result = Email.schema.safeParse(value);\n\n if (!result.success) {\n throw InvalidValueObjectError.create(\n `Invalid ${this.constructor.name}: ${value}`,\n {\n value,\n },\n );\n }\n }\n}\n"],"mappings":"2UAsBO,IAAMA,EAAa,OAAO,OAAO,CACtC,gCAAiC,IACjC,gCAAiC,IACjC,8BAA+B,IAC/B,8BAA+B,IAE/B,8BAA+B,IAC/B,2BAA4B,IAC5B,yBAA0B,IAC1B,wBAAyB,IACzB,uBAAwB,IACxB,sBAAuB,IACvB,sBAAuB,IACvB,sBAAuB,IACvB,qBAAsB,IACtB,qBAAsB,IAEtB,oBAAqB,IACrB,oBAAqB,IACrB,oBAAqB,IACrB,oBAAqB,IACrB,mBAAoB,IACpB,mBAAoB,IACpB,mBAAoB,IACpB,mBAAoB,IAEpB,kBAAmB,IACnB,kBAAmB,IACnB,kBAAmB,IACnB,kBAAmB,IACnB,iBAAkB,IAClB,iBAAkB,IAClB,iBAAkB,IAClB,iBAAkB,IAClB,gBAAiB,IACjB,gBAAiB,IACjB,gBAAiB,IACjB,gBAAiB,IACjB,gBAAiB,IACjB,eAAgB,IAChB,cAAe,IACf,cAAe,IACf,aAAc,IACd,aAAc,IACd,aAAc,IACd,aAAc,IACd,aAAc,IACd,YAAa,IACb,YAAa,IACb,YAAa,IACb,YAAa,IACb,WAAY,IACZ,WAAY,IACZ,UAAW,IACX,UAAW,IAEX,UAAW,IACX,UAAW,IACX,UAAW,IACX,SAAU,IACV,SAAU,IACV,SAAU,IACV,QAAS,IACT,QAAS,IACT,OAAQ,IACR,MAAO,IACP,KAAM,IACN,GAAI,GACN,CAAU,EAMGC,EAAoB,CAC/B,IAAK,kCACL,IAAK,kCACL,IAAK,gCACL,IAAK,gCACL,IAAK,gCACL,IAAK,6BACL,IAAK,2BACL,IAAK,0BACL,IAAK,yBACL,IAAK,wBACL,IAAK,wBACL,IAAK,wBACL,IAAK,uBACL,IAAK,uBACL,IAAK,sBACL,IAAK,sBACL,IAAK,sBACL,IAAK,sBACL,IAAK,qBACL,IAAK,qBACL,IAAK,qBACL,IAAK,qBACL,IAAK,oBACL,IAAK,oBACL,IAAK,oBACL,IAAK,oBACL,IAAK,mBACL,IAAK,mBACL,IAAK,mBACL,IAAK,mBACL,IAAK,kBACL,IAAK,kBACL,IAAK,kBACL,IAAK,kBACL,IAAK,kBACL,IAAK,iBACL,IAAK,gBACL,IAAK,gBACL,IAAK,eACL,IAAK,eACL,IAAK,eACL,IAAK,eACL,IAAK,eACL,IAAK,eACL,IAAK,cACL,IAAK,cACL,IAAK,cACL,IAAK,aACL,IAAK,aACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,WACL,IAAK,WACL,IAAK,WACL,IAAK,WACL,IAAK,UACL,IAAK,SACL,IAAK,QACL,IAAK,OACL,IAAK,IACP,EC1HO,IAAeC,EAAf,cAAwC,KAAM,CAYnD,YAAY,CACV,KAAAC,EAAOC,EAAkB,GAAK,EAC9B,cAAAC,EAAgB,GAChB,OAAAC,EAAS,IACT,SAAAC,EACA,QAAAC,EACA,MAAAC,CACF,EAAgB,CACd,MAAMD,CAAO,EAEb,KAAK,KAAO,WAAW,KACvB,KAAK,KAAOL,EACZ,KAAK,OAASG,EACd,KAAK,cAAgBD,EACrB,KAAK,SAAWE,EAChB,KAAK,MAAQE,EAEb,MAAM,kBAAkB,KAAM,UAAU,CAC1C,CACF,EC5DO,SAASC,EACdC,EACAC,EAAO,IAAI,QACE,CAiBb,GAfID,IAAU,MAAQ,OAAOA,GAAU,UAKnC,OAAOA,GAAU,YAKjB,OAAO,SAASA,CAAK,GAKrBC,EAAK,IAAID,CAAK,EAChB,OAAOA,EAKT,GAFAC,EAAK,IAAID,CAAK,EAEV,MAAM,QAAQA,CAAK,EACrB,QAAWE,KAAQF,EACjBD,EAAWG,EAAMD,CAAI,MAGvB,SAAWE,KAAO,OAAO,KAAKH,CAAK,EACjCD,EAAYC,EAAkCG,CAAG,EAAGF,CAAI,EAI5D,OAAO,OAAO,OAAOD,CAAK,CAC5B,CC9CA,IAAAI,EAyCsBC,EAAf,KAAkD,CAqB7C,YAAYC,EAAgC,CANtDC,EAAA,KAAAH,GAxDF,IAAAI,EA+DI,KAAK,GAAKF,EAAO,GACjB,KAAK,WAAYE,EAAAF,EAAO,YAAP,KAAAE,EAAoB,IAAI,KACzCC,EAAA,KAAKL,EAASM,EAAWJ,EAAO,KAAK,GAErC,KAAK,SAAS,CAChB,CAjBA,IAAc,OAA0B,CACtC,OAAOK,EAAA,KAAKP,EACd,CAwBO,OAAOQ,EAAoC,CAChD,OAAIA,GAAS,KAAa,GACtB,OAASA,EAAc,GACpB,KAAK,GAAG,OAAOA,EAAM,EAAE,CAChC,CAgBU,OAAOC,EAA0C,CACzD,IAAMC,EAAOD,EAAQF,EAAA,KAAKP,EAAM,EAEhCK,EAAA,KAAKL,EAASM,EAAWI,CAAI,GAC7B,KAAK,SAAS,CAChB,CACF,EA/CEV,EAAA,YC7BK,IAAeW,EAAf,cAA6DC,CAGlE,CAHK,kCAcL,KAAiB,cAA+B,CAAC,EAPjD,IAAI,cAAuC,CACzC,MAAO,CAAC,GAAG,KAAK,aAAa,CAC/B,CAYA,SAASC,EAAgC,CACvC,KAAK,cAAc,KAAKA,CAAW,CACrC,CAEO,kBAA2C,CAChD,IAAMC,EAAS,CAAC,GAAG,KAAK,aAAa,EACrC,YAAK,cAAc,OAAS,EACrBA,CACT,CACF,ECzDA,IAAAC,EAsBsBC,EAAf,MAAeA,CAEA,CAiBV,YAAYC,EAAU,CARhCC,EAAA,KAASH,GASP,KAAK,SAASE,CAAK,EACnBE,EAAA,KAAKJ,EAASE,EAChB,CAfA,IAAI,OAAW,CACb,OAAOG,EAAA,KAAKL,EACd,CAwBO,OAAOM,EAAqB,CAOjC,OANIA,GAAS,MAET,OAAO,eAAe,IAAI,IAAM,OAAO,eAAeA,CAAK,GAI3D,EAAEA,aAAiBL,GAA8B,GAE9CI,EAAA,KAAKL,KAAWK,EAAAC,EAAMN,EAC/B,CAOO,UAAc,CACnB,OAAOK,EAAA,KAAKL,EACd,CAMO,UAAmB,CACxB,OAAO,OAAOK,EAAA,KAAKL,EAAM,CAC3B,CASF,EA1DWA,EAAA,YAXJ,IAAeO,EAAfN,ECtBP,OAAOO,MAAe,sBAIf,IAAeC,EAAf,MAAeC,CAAe,CACnC,IAAI,OAAW,CACb,OAAO,KAAK,KACd,CAIU,YAAYC,EAAU,CAC9B,KAAK,SAASA,CAAK,EACnB,KAAK,MAAQC,EAAWD,CAAK,CAC/B,CASA,OAAc,GAAGE,EAAyC,CACxD,OAAOA,aAAcH,CACvB,CAKO,OAAOI,EAAiC,CAI7C,OAHIA,GAAS,MAGT,OAAO,eAAe,IAAI,IAAM,OAAO,eAAeA,CAAK,EACtD,GAGFC,EAAU,KAAK,MAAOD,EAAM,KAAK,CAC1C,CAKO,QAAY,CACjB,OAAO,KAAK,KACd,CAKO,UAAmB,CACxB,OAAO,KAAK,UAAU,KAAK,KAAK,CAClC,CAOF,ECqEO,IAAeE,EAAf,KAGL,CA0DA,IAAW,WAAoC,CAC7C,OAAO,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC,CAC/B,CAIA,IAAW,WAAoC,CAC7C,OAAO,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC,CAC/B,CAqBU,YACRC,KACGC,EAGH,CAhOJ,IAAAC,EAiOI,KAAK,QAAUF,EACf,KAAK,SAAW,OAAO,QAAOE,EAAAD,EAAK,CAAC,IAAN,KAAAC,EAAW,CAAC,CAAC,CAC7C,CAmBO,UAAW,CAChB,MAAO,CACL,SAAU,KAAK,SACf,QAAS,KAAK,QACd,KAAM,KAAK,KACX,KAAM,KAAK,IACb,CACF,CAeO,UAAmB,CACxB,MAAO,IAAI,KAAK,IAAI,KAAK,KAAK,OAAO,EACvC,CACF,EChOO,IAAMC,EAAN,cAA2DC,CAEhE,CAaA,YACEC,EAAkB,wCAClBC,EACA,CACA,MAAMD,EAASC,CAAQ,EAfzB,KAAgB,KAAO,sBAGvB,KAAgB,KAAwB,sBAaxC,CACF,EC/BO,IAAMC,EAAN,cAA0DC,CAE/D,CAcA,YAAYC,EAAiBC,EAAwB,CACnD,MAAMD,EAASC,CAAQ,EAbzB,KAAgB,KAAO,iBAGvB,KAAgB,KAAwB,sBAWxC,CACF,ECmCO,IAAMC,EAAN,MAAMC,CAAa,CA+ChB,YAAYC,EAAkC,CACpD,IAAMC,EAAWD,EAAO,QAAU,OAClC,KAAK,UAAYC,EACjB,KAAK,UAAY,CAACA,EAElB,KAAK,OAASD,EAAO,MACrB,KAAK,OAASA,EAAO,MACrB,OAAO,OAAO,IAAI,CACpB,CAqDA,OAAc,KAAiCE,EAAwB,CACrE,OAAO,IAAIH,EAAO,CAAE,MAAAG,CAAM,CAAC,CAC7B,CA4DA,OAAc,GAAiBC,EAAwB,CACrD,OAAO,IAAIJ,EAAO,CAAE,MAAAI,CAAM,CAAC,CAC7B,CAyCO,UAA0B,CAC/B,OAAO,KAAK,MACd,CAgDO,UAA0B,CAC/B,OAAO,KAAK,MACd,CAKO,iBAA4C,CACjD,OAAO,KAAK,SACd,CAKO,iBAA4C,CACjD,OAAO,KAAK,SACd,CACF,EC9WO,IAAMC,EAAN,MAAMC,UAA8BC,CAAY,CAAhD,kCACL,KAAO,KAAwB,yBAC/B,KAAO,KAAwB,uBAE/B,OAAc,OAAOC,EAAa,CAChC,OAAO,IAAIF,EAAsBE,CAAG,CACtC,CACF,ECAO,IAAMC,EAAN,MAAMC,UAAgCC,CAAmB,CAAzD,kCACL,KAAO,KAAO,uBACd,KAAO,KAAwB,uBAE/B,OAAc,OACZC,EAAM,qCACNC,EACA,CACA,OAAO,IAAIH,EAAwBE,EAAKC,CAAI,CAC9C,CACF,ECtBA,OAAS,cAAAC,MAAkB,SA+BpB,IAAeC,EAAf,KAGL,CASU,YAAYC,EAAyC,CA3CjE,IAAAC,EA4CI,KAAK,IAAKA,EAAAD,EAAM,KAAN,KAAAC,EAAYC,EAAW,EACjC,KAAK,YAAcF,EAAM,YACzB,KAAK,cAAgBA,EAAM,cAC3B,KAAK,WAAaA,EAAM,WACxB,KAAK,QAAUG,EAAWH,EAAM,OAAO,CACzC,CAEO,cAOJ,CACD,MAAO,CACL,YAAa,KAAK,YAAY,SAAS,EACvC,cAAe,KAAK,cACpB,WAAY,KAAK,WACjB,UAAW,KAAK,UAChB,QAAS,KAAK,QACd,GAAI,KAAK,EACX,CACF,CACF,ECpEA,OAAS,MAAAI,MAAU,OACnB,OAAOC,MAAO,MAsBP,IAAMC,EAAN,MAAMA,UAAaC,CAA6B,CAG9C,YAAYC,EAAe,CAChC,MAAMA,CAAK,EACX,KAAK,SAASA,CAAK,CACrB,CAQA,OAAc,WAAWA,EAAqB,CAC5C,OAAO,IAAI,KAAKA,CAAK,CACvB,CAKA,OAAc,UAA0D,CACtE,OAAO,IAAI,KAAKC,EAAG,CAAC,CACtB,CAEU,SAASD,EAAqB,CAGtC,GAAI,CAFWF,EAAK,OAAO,UAAUE,CAAK,EAE9B,QACV,MAAME,EAAwB,OAC5B,WAAW,KAAK,YAAY,IAAI,KAAKF,CAAK,GAC1C,CACE,MAAAA,CACF,CACF,CAEJ,CACF,EArCaF,EACa,OAASK,EAAE,KAAK,EADnC,IAAMC,EAANN,ECdA,IAAMO,EAAN,cAA0BC,CAAK,CAAC,ECRvC,OAAS,MAAAC,MAAU,OACnB,OAAOC,MAAO,MA0CP,IAAeC,EAAf,MAAeA,UAAiBC,CAA2B,CAGzD,YAAYC,EAAe,CAChC,MAAMA,CAAa,CACrB,CAaA,OAAc,WAEZA,EACiB,CACjB,OAAO,IAAI,KAAKA,CAAK,CACvB,CAEA,OAAc,UAEK,CACjB,OAAO,IAAI,KAAKC,EAAG,CAAC,CACtB,CAEU,SAASD,EAAmB,CAGpC,GAAI,CAFWF,EAAS,OAAO,UAAUE,CAAK,EAElC,QACV,MAAME,EAAwB,OAAO,iBAAiBF,CAAK,EAAE,CAEjE,CACF,EAtCsBF,EACN,OAASK,EAAE,KAAK,EADzB,IAAeC,EAAfN,EC5CP,OAAOO,MAAO,MAKP,IAAMC,EAAN,MAAMA,UAAcC,CAA6B,CAG/C,YAAYC,EAAe,CAChC,MAAMA,CAAK,EACX,KAAK,SAASA,CAAK,CACrB,CAEA,OAAc,WAAWA,EAAsB,CAC7C,OAAO,IAAI,KAAKA,CAAK,CACvB,CAEU,SAASA,EAAqB,CAGtC,GAAI,CAFWF,EAAM,OAAO,UAAUE,CAAK,EAE/B,QACV,MAAMC,EAAwB,OAC5B,WAAW,KAAK,YAAY,IAAI,KAAKD,CAAK,GAC1C,CACE,MAAAA,CACF,CACF,CAEJ,CACF,EAxBaF,EACa,OAASI,EAAE,MAAM,EADpC,IAAMC,EAANL","names":["HttpStatus","HttpStatusMessage","ApplicationError","code","HttpStatusMessage","isOperational","status","metadata","message","cause","deepFreeze","value","seen","item","key","_props","Entity","params","__privateAdd","_a","__privateSet","deepFreeze","__privateGet","other","updater","next","AggregateRoot","Entity","domainEvent","events","_value","_PrimitiveValueObject","value","__privateAdd","__privateSet","__privateGet","other","PrimitiveValueObject","deepEqual","ValueObject","_ValueObject","props","deepFreeze","vo","other","deepEqual","DomainError","message","args","_a","InternalError","DomainError","message","metadata","TimeoutError","DomainError","message","metadata","Result","_Result","params","hasError","error","value","EntityValidationError","_EntityValidationError","DomainError","msg","InvalidValueObjectError","_InvalidValueObjectError","DomainError","msg","meta","randomUUID","DomainEvent","props","_a","randomUUID","deepFreeze","v4","z","_UUID","PrimitiveValueObject","value","v4","InvalidValueObjectError","z","UUID","AggregateId","UUID","v4","z","_DomainID","PrimitiveValueObject","value","v4","InvalidValueObjectError","z","DomainID","z","_Email","PrimitiveValueObject","value","InvalidValueObjectError","z","Email"]}
|