@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 +201 -0
- package/dist/index.d.mts +351 -0
- package/dist/index.d.ts +351 -0
- package/dist/index.js +447 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +404 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +59 -0
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.
|
package/dist/index.d.mts
ADDED
|
@@ -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 };
|