@rineex/ddd 0.0.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/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -0,0 +1,351 @@
1
+ /**
2
+ * Port interface for application services that execute commands or queries.
3
+ *
4
+ * @template I - The input type for the service execution
5
+ * @template O - The output type returned by the service execution
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * interface CreateUserInput {
10
+ * name: string;
11
+ * email: string;
12
+ * }
13
+ *
14
+ * interface CreateUserOutput {
15
+ * id: string;
16
+ * name: string;
17
+ * }
18
+ *
19
+ * class CreateUserService implements ApplicationServicePort<CreateUserInput, CreateUserOutput> {
20
+ * async execute(args: CreateUserInput): Promise<CreateUserOutput> {
21
+ * // implementation
22
+ * }
23
+ * }
24
+ * ```
25
+ */
26
+ interface ApplicationServicePort<I, O> {
27
+ execute: (args: I) => Promise<O>;
28
+ }
29
+
30
+ interface DomainErrorMetadata {
31
+ cause?: {
32
+ name: string;
33
+ message: string;
34
+ stack?: string;
35
+ };
36
+ [key: string]: unknown;
37
+ }
38
+ /**
39
+ * Base class for all Domain Errors in the application.
40
+ *
41
+ * This class ensures:
42
+ * 1. Serializable and structured for logs or API responses.
43
+ * 2. Identifiable via stable error codes (not just class names).
44
+ * 3. Contextual with optional structured metadata.
45
+ * 4. Supports error chaining (cause) and stack trace preservation.
46
+ *
47
+ * @example
48
+ * export class InsufficientFundsError extends DomainError {
49
+ * constructor(accountId: string, currentBalance: number) {
50
+ * super(
51
+ * `Account ${accountId} has insufficient funds.`,
52
+ * 'INSUFFICIENT_FUNDS',
53
+ * { accountId, currentBalance }
54
+ * );
55
+ * }
56
+ * }
57
+ */
58
+ declare abstract class DomainError extends Error {
59
+ /** Stable, machine-readable error code */
60
+ readonly code: string;
61
+ /** Structured, immutable domain metadata */
62
+ readonly metadata: Readonly<DomainErrorMetadata>;
63
+ /**
64
+ * @param message - Human-readable error message
65
+ * @param code - Stable error code
66
+ * @param metadata - Domain-specific structured data; optional `cause` can be included
67
+ */
68
+ protected constructor(message: string, code: string, metadata?: DomainErrorMetadata);
69
+ }
70
+
71
+ declare abstract class ValueObject<T> {
72
+ get value(): T;
73
+ protected readonly props: Readonly<T>;
74
+ protected constructor(props: T);
75
+ /**
76
+ * Type guard to check if an unknown object is an instance of ValueObject.
77
+ * This is useful for runtime type checking.
78
+ *
79
+ * @param vo The object to check.
80
+ * @returns True if the object is a ValueObject instance, false otherwise.
81
+ */
82
+ static is(vo: unknown): vo is ValueObject<unknown>;
83
+ /**
84
+ * Deep equality comparison of ValueObjects
85
+ */
86
+ equals(other?: ValueObject<T>): boolean;
87
+ /**
88
+ * Validates the value object props
89
+ * @throws InvalidValueObjectError if validation fails
90
+ */
91
+ protected abstract validate(props: T): void;
92
+ }
93
+
94
+ /**
95
+ * Custom error class for entity validation failures.
96
+ */
97
+ declare class EntityValidationError extends DomainError {
98
+ constructor(message: string, cause?: Error);
99
+ }
100
+
101
+ declare class InvalidValueObjectError extends DomainError {
102
+ constructor(message: string);
103
+ }
104
+
105
+ /**
106
+ * AggregateId is a ValueObject that represents a unique identifier for an aggregate.
107
+ */
108
+ declare class AggregateId extends ValueObject<string> {
109
+ /**
110
+ * The schema for the AggregateId
111
+ */
112
+ private static readonly schema;
113
+ /**
114
+ * Get the UUID of the AggregateId
115
+ * @returns The UUID of the AggregateId
116
+ */
117
+ get uuid(): string;
118
+ /**
119
+ * Create a new AggregateId
120
+ * @param value The value to create the AggregateId from
121
+ * @returns The new AggregateId
122
+ */
123
+ static create(value: string): AggregateId;
124
+ /**
125
+ * Create a new AggregateId with a random UUID v4
126
+ */
127
+ static generate(): AggregateId;
128
+ /**
129
+ * Check if the AggregateId is empty
130
+ * @returns True if the AggregateId is empty, false otherwise
131
+ */
132
+ isEmpty(): boolean;
133
+ /**
134
+ * Convert the AggregateId to a string
135
+ * @returns The string representation of the AggregateId
136
+ */
137
+ toString(): string;
138
+ /**
139
+ * Validate the AggregateId
140
+ * @param value The value to validate
141
+ * @throws InvalidValueObjectException if the value is invalid
142
+ */
143
+ protected validate(value: string): void;
144
+ }
145
+
146
+ /**
147
+ * HTTP status code catalog.
148
+ *
149
+ * This object provides a typed, immutable map of standard HTTP status names
150
+ * to their numeric codes. Designed for server-side frameworks such as Fastify.
151
+ *
152
+ * - All identifiers use clear, canonical semantic names.
153
+ * - Values are numeric status codes.
154
+ * - Frozen to prevent runtime mutation.
155
+ * - Exporting `HttpStatus` ensures type-safe usage across the codebase.
156
+ */
157
+ declare const HttpStatus: Readonly<{
158
+ readonly REQUEST_HEADER_FIELDS_TOO_LARGE: 431;
159
+ readonly NETWORK_AUTHENTICATION_REQUIRED: 511;
160
+ readonly NON_AUTHORITATIVE_INFORMATION: 203;
161
+ readonly PROXY_AUTHENTICATION_REQUIRED: 407;
162
+ readonly UNAVAILABLE_FOR_LEGAL_REASONS: 451;
163
+ readonly HTTP_VERSION_NOT_SUPPORTED: 505;
164
+ readonly BANDWIDTH_LIMIT_EXCEEDED: 509;
165
+ readonly VARIANT_ALSO_NEGOTIATES: 506;
166
+ readonly UNSUPPORTED_MEDIA_TYPE: 415;
167
+ readonly RANGE_NOT_SATISFIABLE: 416;
168
+ readonly PRECONDITION_REQUIRED: 428;
169
+ readonly INTERNAL_SERVER_ERROR: 500;
170
+ readonly UNPROCESSABLE_ENTITY: 422;
171
+ readonly INSUFFICIENT_STORAGE: 507;
172
+ readonly SWITCHING_PROTOCOLS: 101;
173
+ readonly PRECONDITION_FAILED: 412;
174
+ readonly MISDIRECTED_REQUEST: 421;
175
+ readonly SERVICE_UNAVAILABLE: 503;
176
+ readonly TEMPORARY_REDIRECT: 307;
177
+ readonly PERMANENT_REDIRECT: 308;
178
+ readonly METHOD_NOT_ALLOWED: 405;
179
+ readonly EXPECTATION_FAILED: 417;
180
+ readonly MOVED_PERMANENTLY: 301;
181
+ readonly PAYLOAD_TOO_LARGE: 413;
182
+ readonly FAILED_DEPENDENCY: 424;
183
+ readonly TOO_MANY_REQUESTS: 429;
184
+ readonly ALREADY_REPORTED: 208;
185
+ readonly MULTIPLE_CHOICES: 300;
186
+ readonly PAYMENT_REQUIRED: 402;
187
+ readonly UPGRADE_REQUIRED: 426;
188
+ readonly PARTIAL_CONTENT: 206;
189
+ readonly REQUEST_TIMEOUT: 408;
190
+ readonly LENGTH_REQUIRED: 411;
191
+ readonly NOT_IMPLEMENTED: 501;
192
+ readonly GATEWAY_TIMEOUT: 504;
193
+ readonly NOT_ACCEPTABLE: 406;
194
+ readonly RESET_CONTENT: 205;
195
+ readonly LOOP_DETECTED: 508;
196
+ readonly MULTI_STATUS: 207;
197
+ readonly NOT_MODIFIED: 304;
198
+ readonly UNAUTHORIZED: 401;
199
+ readonly URI_TOO_LONG: 414;
200
+ readonly NOT_EXTENDED: 510;
201
+ readonly EARLY_HINTS: 103;
202
+ readonly BAD_REQUEST: 400;
203
+ readonly IM_A_TEAPOT: 418;
204
+ readonly BAD_GATEWAY: 502;
205
+ readonly PROCESSING: 102;
206
+ readonly NO_CONTENT: 204;
207
+ readonly SEE_OTHER: 303;
208
+ readonly USE_PROXY: 305;
209
+ readonly FORBIDDEN: 403;
210
+ readonly NOT_FOUND: 404;
211
+ readonly TOO_EARLY: 425;
212
+ readonly CONTINUE: 100;
213
+ readonly ACCEPTED: 202;
214
+ readonly CONFLICT: 409;
215
+ readonly CREATED: 201;
216
+ readonly IM_USED: 226;
217
+ readonly LOCKED: 423;
218
+ readonly FOUND: 302;
219
+ readonly GONE: 410;
220
+ readonly OK: 200;
221
+ }>;
222
+ type HttpStatusCode = keyof typeof HttpStatusMessage;
223
+ /**
224
+ * HTTP status messages mapped by numeric code.
225
+ * Use for sending descriptive text in responses or logging.
226
+ */
227
+ declare const HttpStatusMessage: {
228
+ readonly 431: "Request Header Fields Too Large";
229
+ readonly 511: "Network Authentication Required";
230
+ readonly 203: "Non-Authoritative Information";
231
+ readonly 407: "Proxy Authentication Required";
232
+ readonly 451: "Unavailable For Legal Reasons";
233
+ readonly 505: "HTTP Version Not Supported";
234
+ readonly 509: "Bandwidth Limit Exceeded";
235
+ readonly 506: "Variant Also Negotiates";
236
+ readonly 415: "Unsupported Media Type";
237
+ readonly 416: "Range Not Satisfiable";
238
+ readonly 428: "Precondition Required";
239
+ readonly 500: "Internal Server Error";
240
+ readonly 422: "Unprocessable Entity";
241
+ readonly 507: "Insufficient Storage";
242
+ readonly 101: "Switching Protocols";
243
+ readonly 412: "Precondition Failed";
244
+ readonly 421: "Misdirected Request";
245
+ readonly 503: "Service Unavailable";
246
+ readonly 307: "Temporary Redirect";
247
+ readonly 308: "Permanent Redirect";
248
+ readonly 405: "Method Not Allowed";
249
+ readonly 417: "Expectation Failed";
250
+ readonly 301: "Moved Permanently";
251
+ readonly 413: "Payload Too Large";
252
+ readonly 424: "Failed Dependency";
253
+ readonly 429: "Too Many Requests";
254
+ readonly 208: "Already Reported";
255
+ readonly 300: "Multiple Choices";
256
+ readonly 402: "Payment Required";
257
+ readonly 426: "Upgrade Required";
258
+ readonly 206: "Partial Content";
259
+ readonly 408: "Request Timeout";
260
+ readonly 411: "Length Required";
261
+ readonly 501: "Not Implemented";
262
+ readonly 504: "Gateway Timeout";
263
+ readonly 406: "Not Acceptable";
264
+ readonly 205: "Reset Content";
265
+ readonly 508: "Loop Detected";
266
+ readonly 207: "Multi-Status";
267
+ readonly 304: "Not Modified";
268
+ readonly 401: "Unauthorized";
269
+ readonly 414: "URI Too Long";
270
+ readonly 418: "I'm a Teapot";
271
+ readonly 510: "Not Extended";
272
+ readonly 103: "Early Hints";
273
+ readonly 400: "Bad Request";
274
+ readonly 502: "Bad Gateway";
275
+ readonly 102: "Processing";
276
+ readonly 204: "No Content";
277
+ readonly 303: "See Other";
278
+ readonly 305: "Use Proxy";
279
+ readonly 403: "Forbidden";
280
+ readonly 404: "Not Found";
281
+ readonly 425: "Too Early";
282
+ readonly 100: "Continue";
283
+ readonly 202: "Accepted";
284
+ readonly 226: "I'm Used";
285
+ readonly 409: "Conflict";
286
+ readonly 201: "Created";
287
+ readonly 423: "Locked";
288
+ readonly 302: "Found";
289
+ readonly 410: "Gone";
290
+ readonly 200: "OK";
291
+ };
292
+ type HttpStatusMessage = (typeof HttpStatusMessage)[keyof typeof HttpStatusMessage];
293
+
294
+ /**
295
+ * Utility to deeply freeze objects to ensure immutability
296
+ */
297
+ declare function deepFreeze<T>(obj: T, seen?: WeakSet<object>): Readonly<T>;
298
+
299
+ interface ErrorParams {
300
+ message: string;
301
+ code: HttpStatusMessage;
302
+ status?: HttpStatusCode;
303
+ metadata?: Record<string, unknown> | undefined;
304
+ isOperational?: boolean;
305
+ cause?: Error | undefined;
306
+ }
307
+ /**
308
+ * Abstract base class for application-level errors with structured error handling.
309
+ *
310
+ * Extends the native Error class to provide machine-readable error codes, HTTP status codes,
311
+ * operational error classification, and optional metadata for better error tracking and client communication.
312
+ *
313
+ * @abstract
314
+ * @extends {Error}
315
+ *
316
+ * @example
317
+ * ```typescript
318
+ * class UserNotFoundError extends ApplicationError {
319
+ * constructor(userId: string) {
320
+ * super({
321
+ * code: HttpStatusMessage['404'],
322
+ * status: 404,
323
+ * isOperational: true,
324
+ * message: `User with id ${userId} not found`,
325
+ * metadata: { userId }
326
+ * });
327
+ * }
328
+ * }
329
+ * ```
330
+ */
331
+ declare abstract class ApplicationError extends Error {
332
+ /** Optional cause (linked error) */
333
+ readonly cause?: Error | undefined;
334
+ /** Machine-readable error code (e.g. `OTP_LOCKED`, `USER_NOT_FOUND`) */
335
+ readonly code: HttpStatusMessage;
336
+ /** Operational vs programmer error flag */
337
+ readonly isOperational: boolean;
338
+ /** Optional structured metadata for debugging or clients */
339
+ readonly metadata?: Record<string, unknown> | undefined;
340
+ /** HTTP status code intended for response layer */
341
+ readonly status: HttpStatusCode;
342
+ constructor({ code, isOperational, status, metadata, message, cause, }: ErrorParams);
343
+ }
344
+
345
+ type UnwrapValueObject<T> = T extends ValueObject<infer V> ? UnwrapValueObject<V> : T extends (infer U)[] ? UnwrapValueObject<U>[] : T extends Map<infer K, infer V> ? Map<K, UnwrapValueObject<V>> : T extends Set<infer V> ? Set<UnwrapValueObject<V>> : T extends Date ? string : T extends object ? {
346
+ [K in keyof T]: UnwrapValueObject<T[K]>;
347
+ } : T;
348
+ declare function unwrapValueObject<T>(input: T, seen?: WeakSet<object>): UnwrapValueObject<T>;
349
+ declare function ensureObject<T>(input: UnwrapValueObject<T>): object;
350
+
351
+ export { AggregateId, ApplicationError, type ApplicationServicePort, DomainError, type DomainErrorMetadata, EntityValidationError, HttpStatus, type HttpStatusCode, HttpStatusMessage, InvalidValueObjectError, type UnwrapValueObject, ValueObject, deepFreeze, ensureObject, unwrapValueObject };