@haskou/value-objects 8.3.2 → 8.3.4
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/README.md +122 -77
- package/dist/index.cjs +10 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -10
- package/dist/index.d.cts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Validated, immutable Value Objects for TypeScript and Domain-Driven Design.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Validate once, at the edge of your domain. Everything past that point receives a value that is already correct, with the behavior that belongs to it.
|
|
6
6
|
|
|
7
7
|
Dependency-less: zero runtime dependencies, for Node.js and browsers.
|
|
8
8
|
|
|
@@ -13,6 +13,21 @@ Dependency-less: zero runtime dependencies, for Node.js and browsers.
|
|
|
13
13
|
[](https://www.npmjs.com/package/@haskou/value-objects?activeTab=dependencies)
|
|
14
14
|
[](LICENSE.txt)
|
|
15
15
|
|
|
16
|
+
```typescript
|
|
17
|
+
import { Hour, Money, Timestamp } from '@haskou/value-objects';
|
|
18
|
+
|
|
19
|
+
const price = Money.fromString('19.99€').multiply(3);
|
|
20
|
+
const opens = new Hour('09:30').addMinutes(45);
|
|
21
|
+
|
|
22
|
+
JSON.stringify({ price, at: new Timestamp(1782218400000) });
|
|
23
|
+
// {"price":"59.97 EUR","at":1782218400000}
|
|
24
|
+
|
|
25
|
+
opens.toString();
|
|
26
|
+
// '10:15'
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Exact money arithmetic, time math and clean JSON, each type validating itself on construction.
|
|
30
|
+
|
|
16
31
|
## Installation
|
|
17
32
|
|
|
18
33
|
```bash
|
|
@@ -66,9 +81,7 @@ new Email('not-an-email');
|
|
|
66
81
|
// throws InvalidEmailError
|
|
67
82
|
```
|
|
68
83
|
|
|
69
|
-
The same idea applies to numbers, identifiers, dates, coordinates, hashes and your own domain concepts.
|
|
70
|
-
|
|
71
|
-
Validation happens when values enter the domain instead of being repeated everywhere they are used.
|
|
84
|
+
The same idea applies to numbers, identifiers, dates, money, coordinates, hashes and your own domain concepts.
|
|
72
85
|
|
|
73
86
|
## Build your own domain Value Objects
|
|
74
87
|
|
|
@@ -77,11 +90,7 @@ The built-in Value Objects are also intended to be extended.
|
|
|
77
90
|
If your domain has a `Username`, it should not remain a generic `string` with validation scattered around the application.
|
|
78
91
|
|
|
79
92
|
```typescript
|
|
80
|
-
import {
|
|
81
|
-
assert,
|
|
82
|
-
NullObject,
|
|
83
|
-
StringValueObject,
|
|
84
|
-
} from '@haskou/value-objects';
|
|
93
|
+
import { assert, NullObject, StringValueObject } from '@haskou/value-objects';
|
|
85
94
|
|
|
86
95
|
export class Username extends StringValueObject {
|
|
87
96
|
constructor(value: string) {
|
|
@@ -111,15 +120,107 @@ function createUser(username: Username) {
|
|
|
111
120
|
|
|
112
121
|
This is the main idea behind the library: use the provided Value Objects where they fit, and extend the base ones with your own domain invariants when they do not.
|
|
113
122
|
|
|
123
|
+
## Available Value Objects
|
|
124
|
+
|
|
125
|
+
| Category | Classes | What they give you |
|
|
126
|
+
| ----------- | ------------------------------------------------------------- | ----------------------------------------------------------------- |
|
|
127
|
+
| Base | `ValueObject`, `NullObject`, `Enum` | Immutability, equality by value, safe absence |
|
|
128
|
+
| Strings | `StringValueObject`, `Password`, `Email`, `Color` | Length, format and emptiness rules |
|
|
129
|
+
| Numbers | `NumberValueObject`, `Integer`, `PositiveNumber` | Range and integer guarantees |
|
|
130
|
+
| Money | `Money`, `Currency` | Exact arithmetic in minor units, no floating point errors |
|
|
131
|
+
| Identifiers | `ShortId`, `UUID` | Generated and validated identifiers |
|
|
132
|
+
| Date & time | `Timestamp`, `CalendarDay`, `Hour`, `Duration`, `MonthOfYear` | Arithmetic and comparison without hand-rolled `Date` code |
|
|
133
|
+
| Coordinates | `Latitude`, `Longitude`, `Coordinates` | Range-checked geographic points |
|
|
134
|
+
| Hashes | `MD5Hash`, `SHA256Hash`, `SHA512Hash` | Validated digests |
|
|
135
|
+
| Media | `Media` | Typed media references |
|
|
136
|
+
| Collections | `UniqueObjectArray` | Immutable collection without duplicates, by Value Object equality |
|
|
137
|
+
|
|
138
|
+
Every class has its own page in the [API reference](https://haskou.github.io/value-objects/reference/).
|
|
139
|
+
|
|
140
|
+
## How it compares
|
|
141
|
+
|
|
142
|
+
| | Value Objects (this package) | Zod / schema validators | Branded primitives | Hand-written classes |
|
|
143
|
+
| -------------------------------------------- | ---------------------------- | ----------------------- | --------------------------- | --------------------- |
|
|
144
|
+
| Validates on construction | Yes | Yes, at parse time | Only if you write the guard | Only if you write it |
|
|
145
|
+
| Carries behaviour (`addMinutes`, `multiply`) | Yes | No | No | Yes, but you write it |
|
|
146
|
+
| Equality by value and class | Built in | No | No | You write it |
|
|
147
|
+
| Immutable at runtime | Yes | No | No | You enforce it |
|
|
148
|
+
| Represents missing values | `NullObject` | `undefined` checks | `undefined` checks | You decide |
|
|
149
|
+
| Dependencies | None | Zod itself | None | None |
|
|
150
|
+
|
|
151
|
+
Choose schema validators to parse untrusted input shapes, and Value Objects for the domain types that input becomes. They combine well, see below.
|
|
152
|
+
|
|
153
|
+
## Integrations
|
|
154
|
+
|
|
155
|
+
### Zod
|
|
156
|
+
|
|
157
|
+
Parse at the boundary, then work with domain types.
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
import { Email } from '@haskou/value-objects';
|
|
161
|
+
import { z } from 'zod';
|
|
162
|
+
|
|
163
|
+
const emailSchema = z.string().transform((value, context) => {
|
|
164
|
+
try {
|
|
165
|
+
return new Email(value);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
context.addIssue({ code: 'custom', message: (error as Error).message });
|
|
168
|
+
|
|
169
|
+
return z.NEVER;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
emailSchema.parse('user@example.com').valueOf(); // 'user@example.com'
|
|
174
|
+
emailSchema.safeParse('nope').success; // false
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Persistence and APIs
|
|
178
|
+
|
|
179
|
+
Value Objects serialize to their primitive through `toJSON()` and `valueOf()`, and are rebuilt by passing that primitive back to the constructor. Persistence layers only need to store the primitive.
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
const stored = JSON.stringify({ email: new Email('user@example.com') });
|
|
183
|
+
// {"email":"user@example.com"}
|
|
184
|
+
|
|
185
|
+
const email = new Email(JSON.parse(stored).email);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Quick start
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
import { Color, Email, Hour, PositiveNumber } from '@haskou/value-objects';
|
|
192
|
+
|
|
193
|
+
const email = new Email('user@example.com');
|
|
194
|
+
const price = new PositiveNumber(29.99);
|
|
195
|
+
const color = new Color('#FF0000');
|
|
196
|
+
const hour = new Hour('09:30');
|
|
197
|
+
|
|
198
|
+
email.valueOf(); // 'user@example.com'
|
|
199
|
+
price.valueOf(); // 29.99
|
|
200
|
+
color.toString(); // '#FF0000'
|
|
201
|
+
hour.addMinutes(45).toString(); // '10:15'
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Validation errors use specific error types:
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
import { Email, InvalidEmailError } from '@haskou/value-objects';
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
new Email('not-an-email');
|
|
211
|
+
} catch (error) {
|
|
212
|
+
if (error instanceof InvalidEmailError) {
|
|
213
|
+
// Handle invalid domain input.
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
114
218
|
## Null without defensive programming
|
|
115
219
|
|
|
116
220
|
Missing values can be represented through the `NullObject` pattern instead of propagating `null | undefined` checks throughout the domain.
|
|
117
221
|
|
|
118
222
|
```typescript
|
|
119
|
-
import {
|
|
120
|
-
NullObject,
|
|
121
|
-
NumberValueObject,
|
|
122
|
-
} from '@haskou/value-objects';
|
|
223
|
+
import { NullObject, NumberValueObject } from '@haskou/value-objects';
|
|
123
224
|
|
|
124
225
|
const limit = new NumberValueObject(undefined as never);
|
|
125
226
|
|
|
@@ -151,10 +252,7 @@ This lets missing values travel through the same domain abstraction while still
|
|
|
151
252
|
Applications that prefer strict construction can disable automatic `NullObject` creation:
|
|
152
253
|
|
|
153
254
|
```typescript
|
|
154
|
-
import {
|
|
155
|
-
NumberValueObject,
|
|
156
|
-
ValueObject,
|
|
157
|
-
} from '@haskou/value-objects';
|
|
255
|
+
import { NumberValueObject, ValueObject } from '@haskou/value-objects';
|
|
158
256
|
|
|
159
257
|
ValueObject.disableNullObjectCreation();
|
|
160
258
|
|
|
@@ -192,59 +290,6 @@ Failed assertions throw the supplied error, or a `DomainError` when given a stri
|
|
|
192
290
|
|
|
193
291
|
Successful assertions use TypeScript assertion signatures, so the condition is narrowed afterwards.
|
|
194
292
|
|
|
195
|
-
## Quick start
|
|
196
|
-
|
|
197
|
-
```typescript
|
|
198
|
-
import {
|
|
199
|
-
Color,
|
|
200
|
-
Email,
|
|
201
|
-
Hour,
|
|
202
|
-
PositiveNumber,
|
|
203
|
-
} from '@haskou/value-objects';
|
|
204
|
-
|
|
205
|
-
const email = new Email('user@example.com');
|
|
206
|
-
const price = new PositiveNumber(29.99);
|
|
207
|
-
const color = new Color('#FF0000');
|
|
208
|
-
const hour = new Hour('09:30');
|
|
209
|
-
|
|
210
|
-
email.valueOf(); // 'user@example.com'
|
|
211
|
-
price.valueOf(); // 29.99
|
|
212
|
-
color.toString(); // '#FF0000'
|
|
213
|
-
hour.addMinutes(45).toString(); // '10:15'
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
Validation errors use specific error types:
|
|
217
|
-
|
|
218
|
-
```typescript
|
|
219
|
-
import {
|
|
220
|
-
Email,
|
|
221
|
-
InvalidEmailError,
|
|
222
|
-
} from '@haskou/value-objects';
|
|
223
|
-
|
|
224
|
-
try {
|
|
225
|
-
new Email('not-an-email');
|
|
226
|
-
} catch (error) {
|
|
227
|
-
if (error instanceof InvalidEmailError) {
|
|
228
|
-
// Handle invalid domain input.
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
## Available Value Objects
|
|
234
|
-
|
|
235
|
-
| Category | Examples |
|
|
236
|
-
| ----------- | ------------------------------------------------------------- |
|
|
237
|
-
| Base | `ValueObject`, `NullObject`, `Enum` |
|
|
238
|
-
| Strings | `StringValueObject`, `Password`, `Email`, `Color` |
|
|
239
|
-
| Numbers | `NumberValueObject`, `Integer`, `PositiveNumber` |
|
|
240
|
-
| Identifiers | `ShortId`, `UUID` |
|
|
241
|
-
| Date & time | `Timestamp`, `CalendarDay`, `Hour`, `Duration`, `MonthOfYear` |
|
|
242
|
-
| Coordinates | `Latitude`, `Longitude`, `Coordinates` |
|
|
243
|
-
| Money | `Money`, `Currency` |
|
|
244
|
-
| Hashes | `MD5Hash`, `SHA256Hash`, `SHA512Hash` |
|
|
245
|
-
| Media | `Media` |
|
|
246
|
-
| Collections | `UniqueObjectArray` |
|
|
247
|
-
|
|
248
293
|
The package is framework-agnostic and can be used in any TypeScript domain layer regardless of the framework, ORM or persistence technology around it.
|
|
249
294
|
|
|
250
295
|
## Documentation
|
|
@@ -257,7 +302,13 @@ API reference:
|
|
|
257
302
|
|
|
258
303
|
https://haskou.github.io/value-objects/reference/
|
|
259
304
|
|
|
260
|
-
##
|
|
305
|
+
## Contributing
|
|
306
|
+
|
|
307
|
+
Bug reports, feature requests and pull requests are welcome.
|
|
308
|
+
|
|
309
|
+
https://github.com/haskou/value-objects/issues
|
|
310
|
+
|
|
311
|
+
To work on the package locally:
|
|
261
312
|
|
|
262
313
|
```bash
|
|
263
314
|
git clone https://github.com/haskou/value-objects.git
|
|
@@ -268,12 +319,6 @@ yarn test
|
|
|
268
319
|
yarn build
|
|
269
320
|
```
|
|
270
321
|
|
|
271
|
-
## Contributing
|
|
272
|
-
|
|
273
|
-
Bug reports, feature requests and pull requests are welcome.
|
|
274
|
-
|
|
275
|
-
https://github.com/haskou/value-objects/issues
|
|
276
|
-
|
|
277
322
|
## License
|
|
278
323
|
|
|
279
324
|
MIT. See [LICENSE.txt](LICENSE.txt).
|
package/dist/index.cjs
CHANGED
|
@@ -435,7 +435,7 @@ var ShortId = class ShortId extends ValueObject {
|
|
|
435
435
|
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
436
436
|
}
|
|
437
437
|
static generate() {
|
|
438
|
-
return new
|
|
438
|
+
return new this(ShortId.generateObjectIdHex());
|
|
439
439
|
}
|
|
440
440
|
constructor(value) {
|
|
441
441
|
super(value?.valueOf());
|
|
@@ -458,7 +458,7 @@ var UUID = class UUID extends ValueObject {
|
|
|
458
458
|
bytes[6] = bytes[6] % 16 + 64;
|
|
459
459
|
bytes[8] = bytes[8] % 64 + 128;
|
|
460
460
|
const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
461
|
-
return new
|
|
461
|
+
return new this([
|
|
462
462
|
hex.slice(0, 8),
|
|
463
463
|
hex.slice(8, 12),
|
|
464
464
|
hex.slice(12, 16),
|
|
@@ -837,13 +837,13 @@ var Timestamp = class Timestamp extends ValueObject {
|
|
|
837
837
|
return target.valueOf() + fractionalMilliseconds;
|
|
838
838
|
}
|
|
839
839
|
static new(value) {
|
|
840
|
-
return new
|
|
840
|
+
return new this(value);
|
|
841
841
|
}
|
|
842
842
|
static now() {
|
|
843
|
-
return new
|
|
843
|
+
return new this();
|
|
844
844
|
}
|
|
845
845
|
static fromSeconds(seconds) {
|
|
846
|
-
return new
|
|
846
|
+
return new this(seconds.valueOf() * Timestamp.FACTORS.SECONDS);
|
|
847
847
|
}
|
|
848
848
|
constructor(value) {
|
|
849
849
|
super(value === null ? null : Timestamp.valueMilliseconds(value));
|
|
@@ -1000,19 +1000,19 @@ var Duration = class Duration extends NumberValueObject {
|
|
|
1000
1000
|
YEARS: new NumberValueObject(this.SECOND_UNITS.YEARS * this.MILLISECOND_FACTOR)
|
|
1001
1001
|
};
|
|
1002
1002
|
static fromDays(days) {
|
|
1003
|
-
return new
|
|
1003
|
+
return new this(new NumberValueObject(days.valueOf()).multiply(Duration.millisecondFactors.DAYS));
|
|
1004
1004
|
}
|
|
1005
1005
|
static fromHours(hours) {
|
|
1006
|
-
return new
|
|
1006
|
+
return new this(new NumberValueObject(hours.valueOf()).multiply(Duration.millisecondFactors.HOURS));
|
|
1007
1007
|
}
|
|
1008
1008
|
static fromMinutes(minutes) {
|
|
1009
|
-
return new
|
|
1009
|
+
return new this(new NumberValueObject(minutes.valueOf()).multiply(Duration.millisecondFactors.MINUTES));
|
|
1010
1010
|
}
|
|
1011
1011
|
static fromSeconds(seconds) {
|
|
1012
|
-
return new
|
|
1012
|
+
return new this(new NumberValueObject(seconds.valueOf()).multiply(Duration.millisecondFactors.SECONDS));
|
|
1013
1013
|
}
|
|
1014
1014
|
static fromMilliseconds(milliseconds) {
|
|
1015
|
-
return new
|
|
1015
|
+
return new this(new NumberValueObject(milliseconds.valueOf()));
|
|
1016
1016
|
}
|
|
1017
1017
|
constructor(milliseconds) {
|
|
1018
1018
|
super(milliseconds?.valueOf());
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/errors/BaseError.ts","../src/errors/DomainError.ts","../src/errors/CurrencyMismatchError.ts","../src/errors/InvalidColorError.ts","../src/errors/InvalidDayError.ts","../src/errors/InvalidDayFormatError.ts","../src/errors/InvalidHourError.ts","../src/errors/InvalidEmailError.ts","../src/errors/InvalidFormatError.ts","../src/errors/InvalidHashError.ts","../src/errors/InvalidIntegerError.ts","../src/errors/InvalidLatitudeError.ts","../src/errors/InvalidLongitudeError.ts","../src/errors/InvalidMinutesError.ts","../src/errors/InvalidMoneyError.ts","../src/errors/InvalidNumberError.ts","../src/errors/InvalidPasswordError.ts","../src/errors/InvalidPositiveNumberError.ts","../src/errors/InvalidStringLengthError.ts","../src/errors/InvalidTimestampIntervalError.ts","../src/errors/InvalidLengthError.ts","../src/errors/NullObjectCreationDisabledError.ts","../src/errors/NullObjectError.ts","../src/errors/ValueNotInEnumError.ts","../src/patterns/Assert.ts","../src/value-objects/NullObject.ts","../src/value-objects/ValueObject.ts","../src/value-objects/StringValueObject.ts","../src/value-objects/NumberValueObject.ts","../src/value-objects/coordinates/Latitude.ts","../src/value-objects/coordinates/Longitude.ts","../src/value-objects/coordinates/Coordinates.ts","../src/value-objects/hashes/Hash.ts","../src/value-objects/hashes/MD5Hash.ts","../src/value-objects/hashes/SHA256Hash.ts","../src/value-objects/hashes/SHA512Hash.ts","../src/value-objects/ids/ShortId.ts","../src/value-objects/ids/UUID.ts","../src/value-objects/media/Media.ts","../src/value-objects/Enum.ts","../src/value-objects/money/Currency.ts","../src/value-objects/Integer.ts","../src/value-objects/money/Money.ts","../src/value-objects/time/Day.ts","../src/value-objects/time/DayOfWeek.ts","../src/value-objects/time/Month.ts","../src/value-objects/time/Year.ts","../src/value-objects/time/Timestamp.ts","../src/value-objects/PositiveNumber.ts","../src/value-objects/time/Duration.ts","../src/value-objects/time/TimestampInterval.ts","../src/value-objects/time/MonthOfYear.ts","../src/value-objects/time/CalendarDay.ts","../src/value-objects/time/Hour.ts","../src/value-objects/Color.ts","../src/value-objects/Email.ts","../src/value-objects/Password.ts","../src/value-objects/UniqueObjectArray.ts"],"sourcesContent":["export class BaseError extends Error {\n private readonly isBaseError = true;\n public static isBaseError(error: unknown): boolean {\n return !!(error as BaseError).isBaseError;\n }\n\n constructor(message: string, prototype: object = BaseError.prototype) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, prototype);\n }\n\n public toString(): string {\n return `[${this.name}]: ${this.message}`;\n }\n\n public getStack(): string {\n return this.stack || '';\n }\n}\n","import { BaseError } from './BaseError';\n\nexport class DomainError extends BaseError {\n protected readonly isDomainError = true;\n public static isDomainError(error: unknown): boolean {\n return !!(error as DomainError).isDomainError;\n }\n\n constructor(message: string) {\n super(message, new.target.prototype);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class CurrencyMismatchError extends DomainError {\n constructor(expected: string, received: string) {\n super(`Currency mismatch: expected ${expected}, received ${received}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidColorError extends DomainError {\n constructor(value: string) {\n super(`Invalid color value: ${value}. Must be a valid hex color code.`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidDayError extends DomainError {\n constructor(invalidDay: unknown) {\n super(`Invalid day ${String(invalidDay)}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidDayFormatError extends DomainError {\n constructor(invalidDate: string) {\n super(`Invalid day ${invalidDate}. Expected YYYY-MM-DD. `);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidHourError extends DomainError {\n constructor() {\n super(`Invalid hour`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidEmailError extends DomainError {\n constructor(value: string) {\n super(`Invalid email format: ${value}`);\n }\n}\n","import { DomainError } from '../errors/DomainError';\n\nexport class InvalidFormatError extends DomainError {\n constructor(value?: string) {\n super(`Invalid Format Error with value: '${value}'`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidHashError extends DomainError {\n constructor(type: string, value: string) {\n super(`Invalid ${type} hash: ${value}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidIntegerError extends DomainError {\n constructor(value: number) {\n super(`Invalid integer value ${value}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidLatitudeError extends DomainError {\n constructor(value: number) {\n super(`Invalid latitude: ${value}. Must be between -90 and 90`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidLongitudeError extends DomainError {\n constructor(value: number) {\n super(`Invalid longitude: ${value}. Must be between -180 and 180`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidMinutesError extends DomainError {\n constructor() {\n super(`Invalid minutes`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidMoneyError extends DomainError {\n constructor(value: unknown) {\n super(`Invalid money ${String(value)}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidNumberError extends DomainError {\n constructor(invalidNumber: unknown) {\n super(`Invalid number ${String(invalidNumber)}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidPasswordError extends DomainError {\n constructor(minLength: number, maxLength: number) {\n super(\n `Password must be between ${minLength} and ${maxLength} characters long and include at least one uppercase letter, one lowercase letter, one number and one symbol.`,\n );\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidPositiveNumberError extends DomainError {\n constructor() {\n super(`Value must be greater or equal than 0`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidStringLengthError extends DomainError {\n constructor(value: string, length: number) {\n super(\n `String length '${value.length}' exceeds the expected length: '${length}'`,\n );\n }\n}\n","import { Timestamp } from '../value-objects/time/Timestamp';\nimport { DomainError } from './DomainError';\n\nexport class InvalidTimestampIntervalError extends DomainError {\n constructor(start: Timestamp, end: Timestamp) {\n super(\n `Invalid TimestampInterval, start (${start.valueOf()}) must be before the end (${end.valueOf()})`,\n );\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidLengthError extends DomainError {\n constructor(value: unknown, length: number) {\n super(\n `Invalid Length Error with value: '${value}' expected length: '${length}'`,\n );\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class NullObjectCreationDisabledError extends DomainError {\n constructor(valueObjectName: string) {\n super(\n `[NullObjectCreationDisabledError]: ${valueObjectName} received null or undefined while automatic NullObject creation is disabled`,\n );\n Object.setPrototypeOf(this, NullObjectCreationDisabledError.prototype);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class NullObjectError extends DomainError {\n constructor(message: string) {\n super(`[NullObjectError]: ${message} is NullObject`);\n Object.setPrototypeOf(this, NullObjectError.prototype);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class ValueNotInEnumError extends DomainError {\n constructor(value: unknown, enumerate: unknown) {\n super(\n `${Object.values(enumerate as object).join(',')} enum does not include value: ${value}`,\n );\n }\n}\n","import { BaseError } from '../errors/BaseError';\nimport { DomainError } from '../errors/DomainError';\n\nexport type Errors = Error | BaseError | DomainError | string;\n\nexport function assert(\n condition: boolean | unknown | undefined,\n error: string | Errors,\n): asserts condition {\n if (condition) {\n return;\n }\n\n throw typeof error === 'string' ? new DomainError(error) : error;\n}\n","import { NullObjectError } from '../errors/NullObjectError';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T> = abstract new (...args: any[]) => T;\ntype NullableObject = Nullable & Record<string, unknown>;\ninterface Nullable {\n isNullObject: boolean;\n valueOf(): undefined;\n}\n\nexport abstract class NullObject {\n private static setFakeProps<T>(\n nullObject: NullableObject,\n klass: Constructor<T>,\n ): void {\n const visited = new Set<string>();\n let proto = klass.prototype;\n\n while (proto && proto !== Object.prototype) {\n const props = Object.getOwnPropertyNames(proto);\n\n for (const prop of props) {\n if (\n prop === 'constructor' ||\n prop === 'isNullObject' ||\n prop === 'valueOf' ||\n visited.has(prop)\n ) {\n continue;\n }\n\n visited.add(prop);\n // eslint-disable-next-line no-param-reassign\n nullObject[prop] = () => {\n throw new NullObjectError(klass.name);\n };\n }\n\n proto = Object.getPrototypeOf(proto);\n }\n\n Object.setPrototypeOf(nullObject, NullObject.prototype);\n }\n\n public static new<T>(klass: Constructor<T>): T {\n const nullObject: NullableObject = {\n isNullObject: true,\n valueOf: () => {\n return undefined;\n },\n };\n NullObject.setFakeProps(nullObject, klass);\n\n return nullObject as T;\n }\n\n public static isNullObject(nullable: unknown): boolean {\n return !!(nullable as NullableObject)?.isNullObject;\n }\n}\n","import { NullObjectCreationDisabledError } from '../errors';\nimport { Primitive, Nullish } from '../types';\nimport { NullObject } from './NullObject';\n\nexport abstract class ValueObject<T extends Primitive = Primitive> {\n private static nullObjectCreationEnabled = true;\n\n protected readonly value!: T;\n\n public static disableNullObjectCreation(): void {\n ValueObject.nullObjectCreationEnabled = false;\n }\n\n public static enableNullObjectCreation(): void {\n ValueObject.nullObjectCreationEnabled = true;\n }\n\n constructor(value: T | Nullish) {\n if (this.isNullish(value)) {\n if (ValueObject.nullObjectCreationEnabled === false) {\n throw new NullObjectCreationDisabledError(new.target.name);\n }\n\n return NullObject.new(new.target);\n }\n Object.defineProperty(this, 'value', {\n value,\n writable: false,\n configurable: false,\n enumerable: true,\n });\n }\n\n private isNullish(value: T | Nullish): value is null | undefined {\n return value === null || value === undefined;\n }\n\n protected clone(value: T): this {\n return new (this.constructor as new (value: Primitive) => this)(\n this.isNullish(value) ? this.value : value,\n ) as this;\n }\n\n public hasValue(other: unknown): boolean {\n const otherValue = other instanceof ValueObject ? other.valueOf() : other;\n\n return this.value === otherValue;\n }\n\n public isEqual(other: unknown): boolean {\n return (\n other instanceof ValueObject &&\n this.constructor === other.constructor &&\n this.hasValue(other)\n );\n }\n\n public isNotEqual(other: unknown): boolean {\n return this.isEqual(other) === false;\n }\n\n public valueOf(): T {\n return this.value;\n }\n\n public toString(): string {\n return this.value!.toString();\n }\n\n public toJSON(): T {\n return this.value;\n }\n}\n","import { InvalidStringLengthError } from '../errors/InvalidStringLengthError';\nimport { assert } from '../patterns/Assert';\nimport { Nullish } from '../types';\nimport { NullObject } from './NullObject';\nimport { ValueObject } from './ValueObject';\n\nexport class StringValueObject extends ValueObject<string> {\n constructor(\n value: string | StringValueObject | Nullish,\n maxLength: number = 512,\n ) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureDoesNotExceedsMaxLength(maxLength);\n }\n\n private ensureDoesNotExceedsMaxLength(maxLength: number): void {\n assert(\n this.value.length <= maxLength,\n new InvalidStringLengthError(this.value, maxLength),\n );\n }\n\n public isEmpty(): boolean {\n return !this.value;\n }\n}\n","import { InvalidNumberError } from '../errors/InvalidNumberError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { ValueObject } from './ValueObject';\n\nexport class NumberValueObject extends ValueObject<number> {\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(this.isValidNumber(this.value), new InvalidNumberError(this.value));\n }\n\n private isValidNumber(value: number): boolean {\n return Number.isFinite(value.valueOf());\n }\n\n public isZero(): boolean {\n return this.value === 0;\n }\n\n public isGreaterThan(other: number | NumberValueObject): boolean {\n return this.value > other.valueOf();\n }\n\n public isGreaterOrEqualThan(other: number | NumberValueObject): boolean {\n return this.value >= other.valueOf();\n }\n\n public isLessThan(other: number | NumberValueObject): boolean {\n return this.value < other.valueOf();\n }\n\n public isLessOrEqualThan(other: number | NumberValueObject): boolean {\n return this.value <= other.valueOf();\n }\n\n public add(other: number | NumberValueObject): NumberValueObject {\n return this.clone(this.value + other.valueOf());\n }\n\n public subtract(other: number | NumberValueObject): NumberValueObject {\n return this.clone(this.value - other.valueOf());\n }\n\n public multiply(other: number | NumberValueObject): NumberValueObject {\n return this.clone(this.value * other.valueOf());\n }\n\n public divide(other: number | NumberValueObject): NumberValueObject {\n return this.clone(this.value / other.valueOf());\n }\n}\n","import { InvalidLatitudeError } from '../../errors/InvalidLatitudeError';\nimport { assert } from '../../patterns/Assert';\nimport { NumberValueObject } from '../NumberValueObject';\n\nexport class Latitude extends NumberValueObject {\n private static MIN_VALUE = new NumberValueObject(-90);\n private static MAX_VALUE = new NumberValueObject(90);\n\n private static isValid(value: number | NumberValueObject): boolean {\n const primitive = value.valueOf();\n\n return (\n Number.isFinite(primitive) &&\n primitive >= this.MIN_VALUE.valueOf() &&\n primitive <= this.MAX_VALUE.valueOf()\n );\n }\n\n constructor(value: number | NumberValueObject) {\n assert(\n value === null || value === undefined || Latitude.isValid(value),\n new InvalidLatitudeError(value?.valueOf()),\n );\n super(value?.valueOf());\n }\n}\n","import { InvalidLongitudeError } from '../../errors/InvalidLongitudeError';\nimport { assert } from '../../patterns/Assert';\nimport { NumberValueObject } from '../NumberValueObject';\n\nexport class Longitude extends NumberValueObject {\n private static MIN_VALUE = new NumberValueObject(-180);\n private static MAX_VALUE = new NumberValueObject(180);\n\n private static isValid(value: number | NumberValueObject): boolean {\n const primitive = value.valueOf();\n\n return (\n Number.isFinite(primitive) &&\n primitive >= this.MIN_VALUE.valueOf() &&\n primitive <= this.MAX_VALUE.valueOf()\n );\n }\n\n constructor(value: number | NumberValueObject) {\n assert(\n value === null || value === undefined || Longitude.isValid(value),\n new InvalidLongitudeError(value?.valueOf()),\n );\n super(value?.valueOf());\n }\n}\n","import { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { Latitude } from './Latitude';\nimport { Longitude } from './Longitude';\n\nexport class Coordinates extends StringValueObject {\n private latitude!: Latitude;\n private longitude!: Longitude;\n\n public static fromString(value: string): Coordinates {\n const latitude = parseFloat(value.split(',')[0]);\n const longitude = parseFloat(value.split(',')[1]);\n\n return new Coordinates(latitude, longitude);\n }\n\n constructor(latitude: number | Latitude, longitude: number | Longitude) {\n const hasValues =\n latitude !== null &&\n latitude !== undefined &&\n longitude !== null &&\n longitude !== undefined;\n\n super(hasValues ? latitude.valueOf() + ',' + longitude.valueOf() : null);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.latitude = new Latitude(latitude.valueOf());\n this.longitude = new Longitude(longitude.valueOf());\n }\n\n public getLatitude(): Latitude {\n return this.latitude;\n }\n\n public getLongitude(): Longitude {\n return this.longitude;\n }\n}\n","import { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { ValueObject } from '../ValueObject';\n\nexport abstract class Hash extends ValueObject<string> {\n constructor(source: string | StringValueObject) {\n super(source?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n }\n\n public toBase64(): StringValueObject {\n const bytes = Array.from(this.valueOf().matchAll(/../g), ([pair]) =>\n parseInt(pair, 16),\n );\n\n return new StringValueObject(btoa(String.fromCharCode(...bytes)));\n }\n}\n","import { InvalidHashError } from '../../errors/InvalidHashError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { Hash } from './Hash';\n\nexport class MD5Hash extends Hash {\n public static isValid(hash: string | StringValueObject): boolean {\n return !!hash.valueOf().match(/^[a-f0-9]{32}$/);\n }\n\n constructor(source: string | StringValueObject) {\n super(source?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n MD5Hash.isValid(this.valueOf()),\n new InvalidHashError('MD5', source.valueOf()),\n );\n }\n}\n","import { InvalidHashError } from '../../errors/InvalidHashError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { Hash } from './Hash';\n\nexport class SHA256Hash extends Hash {\n public static isValid(hash: string | StringValueObject): boolean {\n return !!hash.valueOf().match(/^[a-f0-9]{64}$/i);\n }\n\n constructor(source: string | StringValueObject) {\n super(source?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n SHA256Hash.isValid(this.valueOf()),\n new InvalidHashError('SHA256', source.valueOf()),\n );\n }\n}\n","import { InvalidHashError } from '../../errors/InvalidHashError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { Hash } from './Hash';\n\nexport class SHA512Hash extends Hash {\n public static isValid(hash: string | StringValueObject): boolean {\n return !!hash.valueOf().match(/^[a-f0-9]{128}$/i);\n }\n\n constructor(source: string | StringValueObject) {\n super(source?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n SHA512Hash.isValid(this.valueOf()),\n new InvalidHashError('SHA512', source.valueOf()),\n );\n }\n}\n","import { InvalidFormatError } from '../../errors/InvalidFormatError';\nimport { InvalidLengthError } from '../../errors/InvalidLengthError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { ValueObject } from '../ValueObject';\n\nexport class ShortId extends ValueObject<string> {\n private static readonly LENGTH = 24;\n private static readonly PATTERN = new RegExp(`[a-zA-Z0-9]{${this.LENGTH}}$`);\n\n private static generateObjectIdHex(): string {\n const bytes = new Uint8Array(12);\n new DataView(bytes.buffer).setUint32(0, Math.floor(Date.now() / 1000));\n bytes.set(globalThis.crypto.getRandomValues(new Uint8Array(8)), 4);\n\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join(\n '',\n );\n }\n\n public static generate(): ShortId {\n return new ShortId(ShortId.generateObjectIdHex());\n }\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n this.ensureIsShortId(this.value);\n }\n\n private ensureIsShortId(value: string): void {\n assert(\n value.length === ShortId.LENGTH,\n new InvalidLengthError(this.value, ShortId.LENGTH),\n );\n assert(ShortId.PATTERN.test(value), new InvalidFormatError(this.value));\n }\n}\n","import { InvalidFormatError } from '../../errors/InvalidFormatError';\nimport { InvalidLengthError } from '../../errors/InvalidLengthError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { ValueObject } from '../ValueObject';\n\nexport class UUID extends ValueObject<string> {\n private static readonly LENGTH = 36;\n private static readonly PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n private static readonly SENTINEL_PATTERN =\n /^(?:00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n\n public static generate(): UUID {\n const bytes = globalThis.crypto.getRandomValues(new Uint8Array(16));\n // RFC 4122 §4.4: version 4 and variant 10xx.\n bytes[6] = (bytes[6] % 16) + 64;\n bytes[8] = (bytes[8] % 64) + 128;\n const hex = Array.from(bytes, (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n\n return new UUID(\n [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20),\n ].join('-'),\n );\n }\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n this.ensureIsUUID(this.value);\n }\n\n private ensureIsUUID(value: string): void {\n assert(\n value.length === UUID.LENGTH,\n new InvalidLengthError(this.value, UUID.LENGTH),\n );\n assert(\n UUID.PATTERN.test(value) || UUID.SENTINEL_PATTERN.test(value),\n new InvalidFormatError(this.value),\n );\n }\n}\n","import { NullObject } from '../NullObject';\nimport { ValueObject } from '../ValueObject';\n\nexport class Media extends ValueObject<string> {\n private static readonly BASE64_CHUNK_SIZE = 0x8000;\n\n private readonly buffer?: Uint8Array;\n\n constructor(value: string | Uint8Array) {\n super(\n value instanceof Uint8Array\n ? new TextDecoder('utf-8', { ignoreBOM: true }).decode(value)\n : value,\n );\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.buffer =\n value instanceof Uint8Array ? new Uint8Array(value) : undefined;\n }\n\n public getBuffer(): Uint8Array {\n return this.buffer === undefined\n ? new TextEncoder().encode(this.value)\n : new Uint8Array(this.buffer);\n }\n\n public getSize(): number {\n return this.getBuffer().length;\n }\n\n public getBase64(): string {\n const bytes = this.getBuffer();\n const chunks: string[] = [];\n\n // Chunked so large payloads do not overflow the call stack.\n for (let i = 0; i < bytes.length; i += Media.BASE64_CHUNK_SIZE) {\n chunks.push(\n String.fromCharCode(...bytes.subarray(i, i + Media.BASE64_CHUNK_SIZE)),\n );\n }\n\n return btoa(chunks.join(''));\n }\n\n public hasValue(other: unknown): boolean {\n let otherBytes: Uint8Array | undefined;\n\n if (other instanceof Media) {\n otherBytes = other.getBuffer();\n } else if (other instanceof Uint8Array) {\n otherBytes = other;\n }\n\n if (otherBytes === undefined) {\n return super.hasValue(other);\n }\n\n const bytes = this.getBuffer();\n\n return (\n bytes.length === otherBytes.length &&\n bytes.every((byte, i) => byte === otherBytes[i])\n );\n }\n}\n","import { ValueNotInEnumError } from '../errors/ValueNotInEnumError';\nimport { assert } from '../patterns/Assert';\nimport { Primitive } from '../types';\nimport { NullObject } from './NullObject';\nimport { ValueObject } from './ValueObject';\n\nexport abstract class Enum<\n T extends Primitive = Primitive,\n> extends ValueObject<T> {\n constructor(value: T) {\n super(value);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsValidValue();\n }\n\n public abstract getValues(): T[];\n\n private ensureIsValidValue(): void {\n const isValueInEnum = this.getValues().some((enumValue) =>\n this.hasValue(enumValue),\n );\n assert(\n isValueInEnum,\n new ValueNotInEnumError(this.valueOf(), this.getValues()),\n );\n }\n}\n","import { InvalidFormatError } from '../../errors/InvalidFormatError';\nimport { assert } from '../../patterns/Assert';\nimport { Enum } from '../Enum';\n\nexport class Currency extends Enum<string> {\n private static readonly MINOR_UNIT_DIGITS: Record<string, number> = {\n AED: 2,\n ARS: 2,\n AUD: 2,\n BRL: 2,\n CAD: 2,\n CHF: 2,\n CLP: 0,\n CNY: 2,\n COP: 2,\n CRC: 2,\n CZK: 2,\n DKK: 2,\n EUR: 2,\n GBP: 2,\n HKD: 2,\n HUF: 2,\n IDR: 2,\n ILS: 2,\n INR: 2,\n ISK: 0,\n JPY: 0,\n KRW: 0,\n KWD: 3,\n MXN: 2,\n NOK: 2,\n NZD: 2,\n PEN: 2,\n PLN: 2,\n RON: 2,\n SEK: 2,\n SGD: 2,\n THB: 2,\n TRY: 2,\n USD: 2,\n ZAR: 2,\n };\n\n private static readonly SYMBOLS: Record<string, string> = {\n $: 'USD',\n '£': 'GBP',\n '¥': 'JPY',\n '₡': 'CRC',\n '₩': 'KRW',\n '₪': 'ILS',\n '€': 'EUR',\n '₹': 'INR',\n '₺': 'TRY',\n };\n\n public static fromSymbol(symbol: string): Currency {\n const code = Currency.SYMBOLS[symbol];\n assert(code, new InvalidFormatError(symbol));\n\n return new Currency(code);\n }\n\n public getValues(): string[] {\n return Object.keys(Currency.MINOR_UNIT_DIGITS);\n }\n\n public getMinorUnitDigits(): number {\n return Currency.MINOR_UNIT_DIGITS[this.valueOf()];\n }\n}\n","import { InvalidIntegerError } from '../errors/InvalidIntegerError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { NumberValueObject } from './NumberValueObject';\n\nexport class Integer extends NumberValueObject {\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n this.ensureIsInteger();\n }\n\n private ensureIsInteger(): void {\n assert(\n this.value.valueOf() % 1 === 0,\n new InvalidIntegerError(this.value.valueOf()),\n );\n }\n}\n","import { CurrencyMismatchError } from '../../errors/CurrencyMismatchError';\nimport { InvalidMoneyError } from '../../errors/InvalidMoneyError';\nimport { assert } from '../../patterns/Assert';\nimport { Integer } from '../Integer';\nimport { NullObject } from '../NullObject';\nimport { NumberValueObject } from '../NumberValueObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { ValueObject } from '../ValueObject';\nimport { Currency } from './Currency';\n\nexport class Money extends ValueObject<string> {\n private static readonly FORMAT = /^(-?)(\\d+)(?:\\.(\\d+))? ([A-Z]{3})$/;\n private static readonly TEXT_FORMAT =\n /^(-?)(?:([^\\d\\s.-]+)\\s*)?(\\d+(?:\\.\\d+)?)(?:\\s*([^\\d\\s.-]+))?$/;\n\n private readonly currency!: Currency;\n private readonly minorUnits!: Integer;\n\n public static fromMinorUnits(\n minorUnits: number | NumberValueObject,\n currency: string | Currency,\n ): Money {\n const units = new Integer(minorUnits.valueOf());\n assert(Number.isSafeInteger(units.valueOf()), new InvalidMoneyError(units));\n\n const code = new Currency(currency.valueOf());\n const digits = code.getMinorUnitDigits();\n const padded = String(Math.abs(units.valueOf())).padStart(digits + 1, '0');\n const integer = padded.slice(0, padded.length - digits);\n const fraction =\n digits > 0 ? `.${padded.slice(padded.length - digits)}` : '';\n const sign = units.isLessThan(0) ? '-' : '';\n\n return new Money(`${sign}${integer}${fraction} ${code}`);\n }\n\n public static fromString(text: string): Money {\n const match = Money.TEXT_FORMAT.exec(text.trim());\n assert(match, new InvalidMoneyError(text));\n\n const [, sign, prefix, amount, suffix] = match;\n assert(!prefix !== !suffix, new InvalidMoneyError(text));\n\n const token = prefix ?? suffix;\n const currency = /^[A-Za-z]{3}$/.test(token)\n ? new Currency(token.toUpperCase())\n : Currency.fromSymbol(token);\n const [integer, fraction = ''] = amount.split('.');\n const digits = currency.getMinorUnitDigits();\n assert(fraction.length <= digits, new InvalidMoneyError(text));\n\n return Money.fromMinorUnits(\n Number(`${sign}${integer}${fraction.padEnd(digits, '0')}`),\n currency,\n );\n }\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n const match = Money.FORMAT.exec(this.value);\n assert(match, new InvalidMoneyError(this.value));\n\n const [, sign, integer, fraction = '', code] = match;\n const currency = new Currency(code);\n const minorUnits = new Integer(Number(`${sign}${integer}${fraction}`));\n\n assert(\n fraction.length === currency.getMinorUnitDigits() &&\n Number.isSafeInteger(minorUnits.valueOf()) &&\n !(sign && minorUnits.isZero()),\n new InvalidMoneyError(this.value),\n );\n\n Object.defineProperties(this, {\n currency: { enumerable: false, value: currency },\n minorUnits: { enumerable: false, value: minorUnits },\n });\n }\n\n private ensureSameCurrency(other: Money): void {\n assert(\n this.currency.isEqual(other.currency),\n new CurrencyMismatchError(\n this.currency.valueOf(),\n other.currency.valueOf(),\n ),\n );\n }\n\n public getCurrency(): Currency {\n return this.currency;\n }\n\n public getMinorUnits(): Integer {\n return this.minorUnits;\n }\n\n public isZero(): boolean {\n return this.minorUnits.isZero();\n }\n\n public isNegative(): boolean {\n return this.minorUnits.isLessThan(0);\n }\n\n public isGreaterThan(other: Money): boolean {\n this.ensureSameCurrency(other);\n\n return this.minorUnits.isGreaterThan(other.minorUnits);\n }\n\n public isLessThan(other: Money): boolean {\n this.ensureSameCurrency(other);\n\n return this.minorUnits.isLessThan(other.minorUnits);\n }\n\n public add(other: Money): Money {\n this.ensureSameCurrency(other);\n\n return Money.fromMinorUnits(\n this.minorUnits.add(other.minorUnits),\n this.currency,\n );\n }\n\n public subtract(other: Money): Money {\n this.ensureSameCurrency(other);\n\n return Money.fromMinorUnits(\n this.minorUnits.subtract(other.minorUnits),\n this.currency,\n );\n }\n\n public multiply(factor: number): Money {\n return Money.fromMinorUnits(\n Math.round(this.minorUnits.valueOf() * factor),\n this.currency,\n );\n }\n}\n","import { InvalidDayError } from '../../errors/InvalidDayError';\nimport { assert } from '../../patterns/Assert';\nimport { Integer } from '../Integer';\nimport { NullObject } from '../NullObject';\nimport { NumberValueObject } from '../NumberValueObject';\n\nexport class Day extends Integer {\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsValidDay();\n }\n\n private ensureIsValidDay(): void {\n assert(this.isGreaterOrEqualThan(1), new InvalidDayError(this.value));\n assert(this.isLessOrEqualThan(31), new InvalidDayError(this.value));\n }\n}\n","import { InvalidDayError } from '../../errors/InvalidDayError';\nimport { assert } from '../../patterns';\nimport { Enum } from '../Enum';\nimport { Timestamp } from './Timestamp';\n\nexport enum EDaysOfWeek {\n MONDAY = 'monday',\n TUESDAY = 'tuesday',\n WEDNESDAY = 'wednesday',\n THURSDAY = 'thursday',\n FRIDAY = 'friday',\n SATURDAY = 'saturday',\n SUNDAY = 'sunday',\n}\n\nexport const timeStampDayToDaysMap = {\n [EDaysOfWeek.FRIDAY]: 5,\n [EDaysOfWeek.MONDAY]: 1,\n [EDaysOfWeek.SATURDAY]: 6,\n [EDaysOfWeek.SUNDAY]: 0,\n [EDaysOfWeek.THURSDAY]: 4,\n [EDaysOfWeek.TUESDAY]: 2,\n [EDaysOfWeek.WEDNESDAY]: 3,\n};\n\nexport class DayOfWeek extends Enum {\n public static MONDAY = new DayOfWeek(EDaysOfWeek.MONDAY);\n public static TUESDAY = new DayOfWeek(EDaysOfWeek.TUESDAY);\n public static WEDNESDAY = new DayOfWeek(EDaysOfWeek.WEDNESDAY);\n public static THURSDAY = new DayOfWeek(EDaysOfWeek.THURSDAY);\n public static FRIDAY = new DayOfWeek(EDaysOfWeek.FRIDAY);\n public static SATURDAY = new DayOfWeek(EDaysOfWeek.SATURDAY);\n public static SUNDAY = new DayOfWeek(EDaysOfWeek.SUNDAY);\n\n public static fromNumber(day: number): DayOfWeek {\n const [eDay] =\n Object.entries(timeStampDayToDaysMap).find(\n ([, value]) => value === day,\n ) || [];\n\n assert(eDay, new InvalidDayError(eDay));\n\n return new DayOfWeek(eDay);\n }\n\n public static fromTimestamp(timestamp: Timestamp): DayOfWeek {\n const dayOfWeekNumber = timestamp.getDayOfWeek();\n\n return DayOfWeek.fromNumber(dayOfWeekNumber);\n }\n\n public getValues(): string[] {\n return Object.values(EDaysOfWeek);\n }\n\n public toNumber(): number {\n return timeStampDayToDaysMap[this.value as EDaysOfWeek];\n }\n}\n","import { Enum } from '../Enum';\n\nenum MonthEnum {\n JANUARY = 1,\n FEBRUARY = 2,\n MARCH = 3,\n APRIL = 4,\n MAY = 5,\n JUNE = 6,\n JULY = 7,\n AUGUST = 8,\n SEPTEMBER = 9,\n OCTOBER = 10,\n NOVEMBER = 11,\n DECEMBER = 12,\n}\n\nexport class Month extends Enum<number> {\n public static readonly JANUARY = new Month(MonthEnum.JANUARY);\n public static readonly FEBRUARY = new Month(MonthEnum.FEBRUARY);\n public static readonly MARCH = new Month(MonthEnum.MARCH);\n public static readonly APRIL = new Month(MonthEnum.APRIL);\n public static readonly MAY = new Month(MonthEnum.MAY);\n public static readonly JUNE = new Month(MonthEnum.JUNE);\n public static readonly JULY = new Month(MonthEnum.JULY);\n public static readonly AUGUST = new Month(MonthEnum.AUGUST);\n public static readonly SEPTEMBER = new Month(MonthEnum.SEPTEMBER);\n public static readonly OCTOBER = new Month(MonthEnum.OCTOBER);\n public static readonly NOVEMBER = new Month(MonthEnum.NOVEMBER);\n public static readonly DECEMBER = new Month(MonthEnum.DECEMBER);\n\n public getValues(): number[] {\n return Object.values(MonthEnum) as number[];\n }\n\n public getIndex(): number {\n return Number(this.valueOf()) - 1;\n }\n}\n","import { Integer } from '../Integer';\nimport { NullObject } from '../NullObject';\nimport { NumberValueObject } from '../NumberValueObject';\n\nexport class Year extends Integer {\n private static readonly YEAR_DAYS = 365;\n private static readonly LEAP_YEAR_DAYS = 366;\n\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n }\n\n public isLeapYear(): boolean {\n return this.getNumberOfDays() === Year.LEAP_YEAR_DAYS;\n }\n\n public getNumberOfDays(): number {\n return (this.value % 4 === 0 && this.value % 100 !== 0) ||\n this.value % 400 === 0\n ? Year.LEAP_YEAR_DAYS\n : Year.YEAR_DAYS;\n }\n}\n","import { InvalidIntegerError } from '../../errors/InvalidIntegerError';\nimport { InvalidNumberError } from '../../errors/InvalidNumberError';\nimport { assert } from '../../patterns/Assert';\nimport { NullObject } from '../NullObject';\nimport { NumberValueObject } from '../NumberValueObject';\nimport { ValueObject } from '../ValueObject';\nimport { CalendarDay } from './CalendarDay';\nimport { Day } from './Day';\nimport { Duration } from './Duration';\nimport { Month } from './Month';\nimport { MonthOfYear } from './MonthOfYear';\nimport { Year } from './Year';\n\ntype TimestampValue = number | Date | Timestamp | string;\n\nexport class Timestamp extends ValueObject<number> {\n private static readonly FACTORS = {\n DAYS: 24 * 60 * 60 * 1000,\n HOURS: 60 * 60 * 1000,\n MINUTES: 60 * 1000,\n SECONDS: 1000,\n WEEKS: 7 * 24 * 60 * 60 * 1000,\n };\n\n private static valueMilliseconds(value?: TimestampValue): number {\n if (value instanceof Timestamp || value instanceof Date) {\n return value.valueOf();\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'string') {\n return new Date(value).valueOf();\n }\n\n return Date.now().valueOf();\n }\n\n private static getLastDayOfUtcMonth(year: number, month: number): number {\n const normalizedYear = year + Math.floor(month / 12);\n const normalizedMonth = ((month % 12) + 12) % 12;\n const days = [\n 31,\n new Year(normalizedYear).isLeapYear() ? 29 : 28,\n 31,\n 30,\n 31,\n 30,\n 31,\n 31,\n 30,\n 31,\n 30,\n 31,\n ];\n\n return days[normalizedMonth];\n }\n\n private static ensureCalendarDelta(value: number): void {\n assert(Number.isInteger(value), new InvalidIntegerError(value));\n }\n\n private static createUtcCalendarValue(\n sourceValue: number,\n year: number,\n month: number,\n day: number,\n ): number {\n const integerValue = Math.floor(sourceValue);\n const fractionalMilliseconds = sourceValue - integerValue;\n const source = new Date(integerValue);\n const target = new Date(0);\n\n target.setUTCFullYear(year, month, day);\n target.setUTCHours(\n source.getUTCHours(),\n source.getUTCMinutes(),\n source.getUTCSeconds(),\n source.getUTCMilliseconds(),\n );\n\n return target.valueOf() + fractionalMilliseconds;\n }\n\n public static new(value: TimestampValue): Timestamp {\n return new Timestamp(value);\n }\n\n public static now(): Timestamp {\n return new Timestamp();\n }\n\n public static fromSeconds(seconds: number | NumberValueObject): Timestamp {\n return new Timestamp(seconds.valueOf() * Timestamp.FACTORS.SECONDS);\n }\n\n public constructor(value?: TimestampValue) {\n super(value === null ? null : Timestamp.valueMilliseconds(value));\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n Number.isFinite(new Date(this.value).valueOf()),\n new InvalidNumberError(this.value),\n );\n }\n\n public toExactHour(): Timestamp {\n const hours = Math.floor(this.value / Timestamp.FACTORS.HOURS);\n\n return this.clone(hours * Timestamp.FACTORS.HOURS);\n }\n\n public toMilliseconds(): number {\n return this.value;\n }\n\n public toSeconds(): number {\n return Math.round(this.value / Timestamp.FACTORS.SECONDS);\n }\n\n public toDate(): Date {\n return new Date(this.value);\n }\n\n public toString(): string {\n return `${this.valueOf()}`;\n }\n\n public isBefore(other: Timestamp): boolean {\n return this.value < other.valueOf();\n }\n\n public isAfter(other: Timestamp): boolean {\n return this.value > other.valueOf();\n }\n\n public isBeforeOrEqual(other: Timestamp): boolean {\n return this.value <= other.valueOf();\n }\n\n public isAfterOrEqual(other: Timestamp): boolean {\n return this.value >= other.valueOf();\n }\n\n public addMilliseconds(milliseconds: number | NumberValueObject): Timestamp {\n const value = this.value + milliseconds.valueOf();\n\n return this.clone(value);\n }\n\n public addSeconds(seconds: number | NumberValueObject): Timestamp {\n const value = this.value + seconds.valueOf() * Timestamp.FACTORS.SECONDS;\n\n return this.clone(value);\n }\n\n public addMinutes(minutes: number | NumberValueObject): Timestamp {\n const value = this.value + minutes.valueOf() * Timestamp.FACTORS.MINUTES;\n\n return this.clone(value);\n }\n\n public addHours(hours: number | NumberValueObject): Timestamp {\n const value = this.value + hours.valueOf() * Timestamp.FACTORS.HOURS;\n\n return this.clone(value);\n }\n\n public addDays(days: number | NumberValueObject): Timestamp {\n const value = this.value + days.valueOf() * Timestamp.FACTORS.DAYS;\n\n return this.clone(value);\n }\n\n public addWeeks(weeks: number | NumberValueObject): Timestamp {\n const value = this.value + weeks.valueOf() * Timestamp.FACTORS.WEEKS;\n\n return this.clone(value);\n }\n\n public addMonths(months: number | NumberValueObject): Timestamp {\n const delta = months.valueOf();\n Timestamp.ensureCalendarDelta(delta);\n\n const source = new Date(Math.floor(this.value));\n const totalMonths =\n source.getUTCFullYear() * 12 + source.getUTCMonth() + delta;\n const targetYear = Math.floor(totalMonths / 12);\n const targetMonth = totalMonths - targetYear * 12;\n const targetDay = Math.min(\n source.getUTCDate(),\n Timestamp.getLastDayOfUtcMonth(targetYear, targetMonth),\n );\n\n return this.clone(\n Timestamp.createUtcCalendarValue(\n this.value,\n targetYear,\n targetMonth,\n targetDay,\n ),\n );\n }\n\n public addYears(years: number | NumberValueObject): Timestamp {\n const delta = years.valueOf();\n Timestamp.ensureCalendarDelta(delta);\n\n const source = new Date(Math.floor(this.value));\n const targetYear = source.getUTCFullYear() + delta;\n const targetMonth = source.getUTCMonth();\n const targetDay = Math.min(\n source.getUTCDate(),\n Timestamp.getLastDayOfUtcMonth(targetYear, targetMonth),\n );\n\n return this.clone(\n Timestamp.createUtcCalendarValue(\n this.value,\n targetYear,\n targetMonth,\n targetDay,\n ),\n );\n }\n\n public addDuration(duration: Duration): Timestamp {\n const value = this.value + duration.valueOf();\n\n return this.clone(value);\n }\n\n public isSameDay(other: Timestamp): boolean {\n return this.getCalendarDay().isEqual(other.getCalendarDay());\n }\n\n public isSameMonth(other: Timestamp): boolean {\n return this.getMonthOfYear().isEqual(other.getMonthOfYear());\n }\n\n public isSameYear(other: Timestamp): boolean {\n return this.getYear().isEqual(other.getYear());\n }\n\n public getCalendarDay(): CalendarDay {\n return new CalendarDay(this);\n }\n\n public getDay(): Day {\n return new Day(this.toDate().getUTCDate());\n }\n\n public getMonth(): Month {\n return new Month(this.toDate().getUTCMonth() + 1);\n }\n\n public getYear(): Year {\n return new Year(this.toDate().getUTCFullYear());\n }\n\n public getHours(): number {\n return this.toDate().getUTCHours();\n }\n\n public getMinutes(): number {\n return this.toDate().getUTCMinutes();\n }\n\n public getSeconds(): number {\n return this.toDate().getUTCSeconds();\n }\n\n public getMilliseconds(): number {\n return this.toDate().getUTCMilliseconds();\n }\n\n public getDayOfWeek(): number {\n return this.toDate().getUTCDay();\n }\n\n public getMonthOfYear(): MonthOfYear {\n return new MonthOfYear(this.getMonth(), this.getYear());\n }\n}\n","import { InvalidPositiveNumberError } from '../errors/InvalidPositiveNumberError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { NumberValueObject } from './NumberValueObject';\n\nexport class PositiveNumber extends NumberValueObject {\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsPositive(this.value);\n }\n\n private ensureIsPositive(value: number): void {\n assert(value >= 0, new InvalidPositiveNumberError());\n }\n}\n","import { NumberValueObject } from '../NumberValueObject';\n\nexport class Duration extends NumberValueObject {\n private static readonly MILLISECOND_FACTOR = 1000;\n private static readonly SECOND_UNITS = {\n DAYS: 24 * 60 * 60,\n HOURS: 60 * 60,\n MINUTES: 60,\n MONTHS: 30 * 24 * 60 * 60,\n SECONDS: 1,\n WEEKS: 7 * 24 * 60 * 60,\n YEARS: 365 * 24 * 60 * 60,\n };\n\n private static readonly millisecondFactors = {\n DAYS: new NumberValueObject(\n this.SECOND_UNITS.DAYS * this.MILLISECOND_FACTOR,\n ),\n HOURS: new NumberValueObject(\n this.SECOND_UNITS.HOURS * this.MILLISECOND_FACTOR,\n ),\n MINUTES: new NumberValueObject(\n this.SECOND_UNITS.MINUTES * this.MILLISECOND_FACTOR,\n ),\n MONTHS: new NumberValueObject(\n this.SECOND_UNITS.MONTHS * this.MILLISECOND_FACTOR,\n ),\n SECONDS: new NumberValueObject(\n this.SECOND_UNITS.SECONDS * this.MILLISECOND_FACTOR,\n ),\n WEEKS: new NumberValueObject(\n this.SECOND_UNITS.WEEKS * this.MILLISECOND_FACTOR,\n ),\n YEARS: new NumberValueObject(\n this.SECOND_UNITS.YEARS * this.MILLISECOND_FACTOR,\n ),\n };\n\n public static fromDays(days: number | NumberValueObject): Duration {\n return new Duration(\n new NumberValueObject(days.valueOf()).multiply(\n this.millisecondFactors.DAYS,\n ),\n );\n }\n\n public static fromHours(hours: number | NumberValueObject): Duration {\n return new Duration(\n new NumberValueObject(hours.valueOf()).multiply(\n this.millisecondFactors.HOURS,\n ),\n );\n }\n\n public static fromMinutes(minutes: number | NumberValueObject): Duration {\n return new Duration(\n new NumberValueObject(minutes.valueOf()).multiply(\n this.millisecondFactors.MINUTES,\n ),\n );\n }\n\n public static fromSeconds(seconds: number | NumberValueObject): Duration {\n return new Duration(\n new NumberValueObject(seconds.valueOf()).multiply(\n this.millisecondFactors.SECONDS,\n ),\n );\n }\n\n public static fromMilliseconds(\n milliseconds: number | NumberValueObject,\n ): Duration {\n return new Duration(new NumberValueObject(milliseconds.valueOf()));\n }\n\n constructor(milliseconds: NumberValueObject | Duration) {\n super(milliseconds?.valueOf());\n }\n\n public getTotalDays(): NumberValueObject {\n return new Duration(this).divide(Duration.millisecondFactors.DAYS);\n }\n\n public getTotalHours(): NumberValueObject {\n return new Duration(this).divide(Duration.millisecondFactors.HOURS);\n }\n\n public getTotalMinutes(): NumberValueObject {\n return new Duration(this).divide(Duration.millisecondFactors.MINUTES);\n }\n\n public getTotalSeconds(): NumberValueObject {\n return new Duration(this).divide(Duration.millisecondFactors.SECONDS);\n }\n\n public getTotalMilliseconds(): NumberValueObject {\n return new NumberValueObject(this.valueOf());\n }\n\n public getDays(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(\n new Duration(this).divide(Duration.millisecondFactors.DAYS).valueOf(),\n ),\n );\n }\n\n public getHours(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(\n new Duration(this).divide(Duration.millisecondFactors.HOURS).valueOf(),\n ) % 24,\n );\n }\n\n public getMinutes(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(\n new Duration(this)\n .divide(Duration.millisecondFactors.MINUTES)\n .valueOf(),\n ) % Duration.SECOND_UNITS.MINUTES,\n );\n }\n\n public getSeconds(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(\n new Duration(this)\n .divide(Duration.millisecondFactors.SECONDS)\n .valueOf(),\n ) % Duration.SECOND_UNITS.MINUTES,\n );\n }\n\n public getMilliseconds(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(new Duration(this).valueOf()) % Duration.MILLISECOND_FACTOR,\n );\n }\n}\n","import { InvalidTimestampIntervalError } from '../../errors/InvalidTimestampIntervalError';\nimport { PrimitiveOf } from '../../interfaces/PrimitiveOf';\nimport { assert } from '../../patterns/Assert';\nimport { NullObject } from '../NullObject';\nimport { PositiveNumber } from '../PositiveNumber';\nimport { ValueObject } from '../ValueObject';\nimport { CalendarDay } from './CalendarDay';\nimport { DayOfWeek } from './DayOfWeek';\nimport { Duration } from './Duration';\nimport { Timestamp } from './Timestamp';\n\nexport class TimestampInterval extends ValueObject<string> {\n public static fromPrimitives(\n primitives: PrimitiveOf<TimestampInterval>,\n ): TimestampInterval {\n return new TimestampInterval(\n new Timestamp(primitives.start),\n new Timestamp(primitives.end),\n );\n }\n\n constructor(\n private readonly start: Timestamp,\n private readonly end: Timestamp,\n ) {\n super(start && end ? `${start.valueOf()}-${end.valueOf()}` : null);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n start.isBeforeOrEqual(end),\n new InvalidTimestampIntervalError(start, end),\n );\n }\n\n public toPrimitives() {\n return {\n end: this.end.valueOf(),\n start: this.start.valueOf(),\n };\n }\n\n public getStart(): Timestamp {\n return this.start;\n }\n\n public getEnd(): Timestamp {\n return this.end;\n }\n\n public getDuration(): Duration {\n return new Duration(\n new PositiveNumber(this.end.valueOf() - this.start.valueOf()),\n );\n }\n\n public getTotalDaysOfWeek(dayOfWeek: DayOfWeek): number {\n const oneDayInMilliseconds = 24 * 60 * 60 * 1000;\n const daysToCheck: number = Math.trunc(\n this.getDuration().valueOf() / oneDayInMilliseconds,\n );\n\n let count = 0;\n\n for (let daysChecked = 0; daysChecked <= daysToCheck; daysChecked++) {\n const iteratorDay = new Timestamp(this.start).addDays(daysChecked);\n\n if (iteratorDay.getDayOfWeek() === dayOfWeek.toNumber()) {\n count++;\n }\n }\n\n return count;\n }\n\n public getDaysBetweenInterval(): CalendarDay[] {\n const days: CalendarDay[] = [];\n\n let iteratorTimestamp = new Timestamp(this.getStart());\n const endTimestamp = new Timestamp(this.getEnd());\n\n while (iteratorTimestamp.isBeforeOrEqual(endTimestamp)) {\n days.push(new CalendarDay(iteratorTimestamp));\n iteratorTimestamp = iteratorTimestamp.addDays(1);\n }\n\n return days;\n }\n\n public getOverlappingInterval(\n searchInterval: TimestampInterval,\n ): TimestampInterval | null {\n const start = this.start.isAfter(searchInterval.getStart())\n ? this.start\n : searchInterval.getStart();\n const end = this.end.isBefore(searchInterval.getEnd())\n ? this.end\n : searchInterval.getEnd();\n\n if (start.isAfterOrEqual(end)) {\n return null;\n }\n\n return new TimestampInterval(start, end);\n }\n\n public includes(timestamp: Timestamp): boolean {\n return (\n timestamp.isAfterOrEqual(this.start) &&\n timestamp.isBeforeOrEqual(this.end)\n );\n }\n}\n","import { InvalidFormatError } from '../../errors/InvalidFormatError';\nimport { assert } from '../../patterns/Assert';\nimport { ValueObject } from '../ValueObject';\nimport { Month } from './Month';\nimport { Timestamp } from './Timestamp';\nimport { TimestampInterval } from './TimestampInterval';\nimport { Year } from './Year';\n\nexport class MonthOfYear extends ValueObject<string> {\n private readonly month!: Month;\n private readonly year!: Year;\n\n public static fromTimestamp(timestamp: Timestamp): MonthOfYear {\n return new MonthOfYear(timestamp.getMonth(), timestamp.getYear());\n }\n\n public static fromString(value: string): MonthOfYear {\n assert(/^[^/]+\\/[^/]+$/.test(value), new InvalidFormatError(value));\n\n const [year, month] = value.split('/').map(Number);\n\n return new MonthOfYear(month, year);\n }\n\n constructor(month: number | Month, year: number | Year) {\n const hasValues =\n month !== null &&\n month !== undefined &&\n year !== null &&\n year !== undefined;\n\n super(\n hasValues\n ? year.valueOf().toString() +\n '/' +\n month.valueOf().toString().padStart(2, '0')\n : null,\n );\n\n if (!hasValues) {\n return this;\n }\n\n this.month = new Month(month.valueOf());\n this.year = new Year(year.valueOf());\n }\n\n public getMonth(): Month {\n return new Month(this.month.valueOf());\n }\n\n public getYear(): Year {\n return new Year(this.year);\n }\n\n public getNumberOfDays(): number {\n return new Date(this.year.valueOf(), this.month.valueOf(), 0).getDate();\n }\n\n public getTimestampInterval(): TimestampInterval {\n const firstMonthDay = '01';\n const month = this.month.valueOf().toString().padStart(2, '0');\n const lastDay = this.getNumberOfDays().toString();\n const startDate = new Timestamp(`${this.year}-${month}-${firstMonthDay}`);\n const endDate = new Timestamp(`${this.year}-${month}-${lastDay}`);\n\n return new TimestampInterval(startDate, endDate);\n }\n}\n","import { InvalidDayError } from '../../errors/InvalidDayError';\nimport { InvalidDayFormatError } from '../../errors/InvalidDayFormatError';\nimport { assert } from '../../patterns/Assert';\nimport { ValueObject } from '../ValueObject';\nimport { Day } from './Day';\nimport { DayOfWeek } from './DayOfWeek';\nimport { Month } from './Month';\nimport { MonthOfYear } from './MonthOfYear';\nimport { Timestamp } from './Timestamp';\n\nexport class CalendarDay extends ValueObject<string> {\n private readonly year!: number;\n private readonly month!: number;\n private readonly day!: number;\n\n private static ensureIsValidString(value: string): void {\n assert(\n value.match(/^\\d{4}-\\d{1,2}-\\d{1,2}$/),\n new InvalidDayFormatError(value),\n );\n }\n\n private static generateStringValue(timestamp: Timestamp): string {\n const paddedMonth = timestamp.getMonth().toString().padStart(2, '0');\n const paddedDay = timestamp.getDay().toString().padStart(2, '0');\n\n return `${timestamp.getYear().toString()}-${paddedMonth}-${paddedDay}`;\n }\n\n private static ensureIsValidDate(value: Date | number | Timestamp): void {\n assert(Number.isFinite(value.valueOf()), new InvalidDayError(value));\n }\n\n private static timestampFromString(value: string): Timestamp {\n CalendarDay.ensureIsValidString(value);\n\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(0);\n date.setUTCHours(0, 0, 0, 0);\n date.setUTCFullYear(year, month - 1, day);\n\n assert(\n date.getUTCFullYear() === year &&\n date.getUTCMonth() === month - 1 &&\n date.getUTCDate() === day,\n new InvalidDayError(value),\n );\n\n return new Timestamp(date);\n }\n\n private static timestampFromValue(\n value: string | Date | number | Timestamp,\n ): Timestamp {\n if (typeof value === 'string') {\n return CalendarDay.timestampFromString(value);\n }\n\n CalendarDay.ensureIsValidDate(value);\n\n return new Timestamp(value);\n }\n\n constructor(value?: string | Date | number | Timestamp) {\n let timestamp: Timestamp | undefined;\n\n if (value === undefined) {\n timestamp = new Timestamp();\n } else if (value !== null) {\n timestamp = CalendarDay.timestampFromValue(value);\n }\n\n super(timestamp && CalendarDay.generateStringValue(timestamp));\n\n if (timestamp === undefined) {\n return this;\n }\n\n this.year = timestamp.getYear().valueOf();\n this.month = timestamp.getMonth().getIndex() + 1;\n this.day = timestamp.getDay().valueOf();\n }\n\n public isAfter(date: CalendarDay): boolean {\n return this.valueOf() > date.valueOf();\n }\n\n public isBefore(date: CalendarDay): boolean {\n return this.valueOf() < date.valueOf();\n }\n\n public getYear(): number {\n return this.year;\n }\n\n public getMonth(): Month {\n return new Month(this.month);\n }\n\n public getMonthOfYear(): MonthOfYear {\n return new MonthOfYear(this.month, this.year);\n }\n\n public getDay(): Day {\n return new Day(this.day);\n }\n\n public getDayOfWeek(): DayOfWeek {\n return DayOfWeek.fromNumber(this.toTimestamp().getDayOfWeek());\n }\n\n public toTimestamp(): Timestamp {\n const date = new Date(0);\n date.setUTCHours(0, 0, 0, 0);\n date.setUTCFullYear(this.year, this.month - 1, this.day);\n\n return new Timestamp(date);\n }\n}\n","import { InvalidHourError } from '../../errors/InvalidHourError';\nimport { InvalidMinutesError } from '../../errors/InvalidMinutesError';\nimport { assert } from '../../patterns/Assert';\nimport { StringValueObject } from '../StringValueObject';\n\nexport class Hour extends StringValueObject {\n private readonly minutes!: string;\n private readonly hours!: string;\n\n private static addTrailZero(value: number): string {\n return value < 10 ? `0${value}` : value.toString();\n }\n\n private static normalizeMinutes(totalMinutes: number): number {\n const minutesPerDay = 24 * 60;\n\n return ((totalMinutes % minutesPerDay) + minutesPerDay) % minutesPerDay;\n }\n\n private static parseFromNumber(value: number, minutes: number): string[] {\n assert(\n Number.isInteger(value) && value >= 0 && value <= 23,\n new InvalidHourError(),\n );\n assert(\n Number.isInteger(minutes) && minutes >= 0 && minutes <= 59,\n new InvalidMinutesError(),\n );\n\n return [Hour.addTrailZero(value), Hour.addTrailZero(minutes)];\n }\n\n private static parseFromString(value: string): string[] {\n const parts = value.split(':');\n\n assert(parts.length === 2 && parts[1] !== '', new InvalidHourError());\n\n const [hours, minutes] = parts;\n\n assert(/^\\d{1,2}$/.test(hours), new InvalidHourError());\n assert(/^\\d{1,2}$/.test(minutes), new InvalidMinutesError());\n\n const parsedHours = Number(hours);\n const parsedMinutes = Number(minutes);\n\n assert(parsedHours >= 0 && parsedHours <= 23, new InvalidHourError());\n assert(\n parsedMinutes >= 0 && parsedMinutes <= 59,\n new InvalidMinutesError(),\n );\n\n return [Hour.addTrailZero(parsedHours), Hour.addTrailZero(parsedMinutes)];\n }\n\n constructor(value: string);\n constructor(value: number, minutes?: number);\n constructor(value: string | number, minutes?: number) {\n let parsed: string[] | undefined;\n\n if (value !== null && value !== undefined) {\n parsed =\n typeof value === 'number' && minutes !== undefined\n ? Hour.parseFromNumber(value, minutes)\n : Hour.parseFromString(value as string);\n }\n\n super(parsed && `${parsed[0]}:${parsed[1]}`);\n\n if (parsed === undefined) {\n return this;\n }\n\n [this.hours, this.minutes] = parsed;\n }\n\n public addMinutes(minutes: number): Hour {\n const currentMinutes = Number(this.hours) * 60 + Number(this.minutes);\n const normalizedMinutes = Hour.normalizeMinutes(currentMinutes + minutes);\n const newHour = Math.floor(normalizedMinutes / 60);\n const newMinutes = normalizedMinutes % 60;\n\n return new Hour(newHour, newMinutes);\n }\n\n public diffInMinutes(other: Hour): number {\n let endHour = Number(other.hours);\n\n if (\n other.hours < this.hours ||\n (other.hours === this.hours && other.minutes < this.minutes)\n ) {\n endHour += 24;\n }\n\n const totalMinutes =\n (endHour - Number(this.hours)) * 60 +\n (Number(other.minutes) - Number(this.minutes));\n\n return totalMinutes;\n }\n\n public getMinutes(): number {\n return Number(this.minutes);\n }\n\n public getHours(): number {\n return Number(this.hours);\n }\n\n public isGreaterThan(hour: Hour): boolean {\n if (this.hours === hour.hours) {\n return Number(this.minutes) > Number(hour.minutes);\n }\n\n return Number(this.hours) > Number(hour.hours);\n }\n\n public isLessThan(hour: Hour): boolean {\n if (this.hours === hour.hours) {\n return Number(this.minutes) < Number(hour.minutes);\n }\n\n return Number(this.hours) < Number(hour.hours);\n }\n}\n","import { InvalidColorError } from '../errors/InvalidColorError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { StringValueObject } from './StringValueObject';\nimport { ValueObject } from './ValueObject';\n\nexport class Color extends StringValueObject {\n public static readonly RED = new Color('#FF0000');\n public static readonly GREEN = new Color('#00FF00');\n public static readonly BLUE = new Color('#0000FF');\n public static readonly BLACK = new Color('#000000');\n public static readonly WHITE = new Color('#FFFFFF');\n public static readonly YELLOW = new Color('#FFFF00');\n public static readonly CYAN = new Color('#00FFFF');\n public static readonly MAGENTA = new Color('#FF00FF');\n public static readonly ORANGE = new Color('#FFA500');\n public static readonly PURPLE = new Color('#800080');\n public static readonly PINK = new Color('#FFC0CB');\n public static readonly BROWN = new Color('#A52A2A');\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsValidColor();\n }\n\n private ensureIsValidColor(): void {\n const hexColorPattern = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/;\n\n assert(hexColorPattern.test(this.value), new InvalidColorError(this.value));\n }\n\n public hasValue(other: unknown): boolean {\n const otherValue = other instanceof ValueObject ? other.valueOf() : other;\n\n return (\n typeof otherValue === 'string' &&\n this.value.toLowerCase() === otherValue.toLowerCase()\n );\n }\n}\n","import { InvalidEmailError } from '../errors/InvalidEmailError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { StringValueObject } from './StringValueObject';\n\nexport class Email extends StringValueObject {\n private static readonly MAX_LENGTH = 254;\n private static readonly PATTERN =\n /^[\\w+\\-.!#$%&'*/=?^`{|}~]{1,64}@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+(?:[a-z]{2,63}|xn--[a-z0-9](?:[a-z0-9-]{0,57}[a-z0-9])?)$/i;\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf(), Email.MAX_LENGTH);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsValidEmail(this.value);\n }\n\n private ensureIsValidEmail(value: string): void {\n assert(Email.PATTERN.test(value), new InvalidEmailError(value));\n }\n}\n","import { InvalidPasswordError } from '../errors/InvalidPasswordError';\nimport { assert } from '../patterns';\nimport { NullObject } from './NullObject';\nimport { StringValueObject } from './StringValueObject';\n\nexport class Password extends StringValueObject {\n private static readonly MAX_LENGTH = 256;\n private static readonly MIN_LENGTH = 12;\n\n constructor(value: string | StringValueObject) {\n super(value);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n this.isValidPassword(),\n new InvalidPasswordError(Password.MIN_LENGTH, Password.MAX_LENGTH),\n );\n }\n\n private isValidPassword(): boolean {\n return (\n this.value.length >= Password.MIN_LENGTH &&\n this.value.length <= Password.MAX_LENGTH &&\n /[A-Z]/.test(this.value) &&\n /[a-z]/.test(this.value) &&\n /[0-9]/.test(this.value) &&\n /[^A-Za-z0-9]/.test(this.value)\n );\n }\n}\n","interface ComparableItem {\n isEqual(item: unknown): boolean;\n}\n\nexport class UniqueObjectArray<\n T extends ComparableItem,\n> implements Iterable<T> {\n private readonly items: readonly T[];\n private readonly buckets = new Map<string, T[]>();\n\n private static keyOf(item: ComparableItem): string {\n return `${item.constructor.name}:${String(item.valueOf())}`;\n }\n\n public static fromArray<T extends ComparableItem>(\n array: Iterable<T>,\n ): UniqueObjectArray<T> {\n return new UniqueObjectArray<T>(array);\n }\n\n constructor(items: Iterable<T> = []) {\n const unique: T[] = [];\n\n for (const item of items) {\n const key = UniqueObjectArray.keyOf(item);\n const bucket = this.buckets.get(key);\n\n if (bucket === undefined) {\n this.buckets.set(key, [item]);\n unique.push(item);\n } else if (!bucket.some((one) => one.isEqual(item))) {\n bucket.push(item);\n unique.push(item);\n }\n }\n\n this.items = unique;\n }\n\n public get length(): number {\n return this.items.length;\n }\n\n public includes(item: T): boolean {\n const bucket = this.buckets.get(UniqueObjectArray.keyOf(item));\n\n return bucket !== undefined && bucket.some((one) => one.isEqual(item));\n }\n\n public push(...items: T[]): UniqueObjectArray<T> {\n return new UniqueObjectArray<T>([...this.items, ...items]);\n }\n\n public remove(item: T): UniqueObjectArray<T> {\n return this.filter((one) => !one.isEqual(item));\n }\n\n public isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n public at(index: number): T | undefined {\n return this.items.at(index);\n }\n\n public find(predicate: (item: T, index: number) => boolean): T | undefined {\n return this.items.find(predicate);\n }\n\n public filter(\n predicate: (item: T, index: number) => boolean,\n ): UniqueObjectArray<T> {\n return new UniqueObjectArray<T>(this.items.filter(predicate));\n }\n\n public map<U>(callback: (item: T, index: number) => U): U[] {\n return this.items.map(callback);\n }\n\n public some(predicate: (item: T, index: number) => boolean): boolean {\n return this.items.some(predicate);\n }\n\n public every(predicate: (item: T, index: number) => boolean): boolean {\n return this.items.every(predicate);\n }\n\n public forEach(callback: (item: T, index: number) => void): void {\n this.items.forEach(callback);\n }\n\n public reduce<U>(\n callback: (accumulator: U, item: T, index: number) => U,\n initialValue: U,\n ): U {\n return this.items.reduce(callback, initialValue);\n }\n\n public [Symbol.iterator](): Iterator<T> {\n return this.items[Symbol.iterator]();\n }\n\n public toArray(): T[] {\n return Array.from(this.items);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/errors/BaseError.ts","../src/errors/DomainError.ts","../src/errors/CurrencyMismatchError.ts","../src/errors/InvalidColorError.ts","../src/errors/InvalidDayError.ts","../src/errors/InvalidDayFormatError.ts","../src/errors/InvalidHourError.ts","../src/errors/InvalidEmailError.ts","../src/errors/InvalidFormatError.ts","../src/errors/InvalidHashError.ts","../src/errors/InvalidIntegerError.ts","../src/errors/InvalidLatitudeError.ts","../src/errors/InvalidLongitudeError.ts","../src/errors/InvalidMinutesError.ts","../src/errors/InvalidMoneyError.ts","../src/errors/InvalidNumberError.ts","../src/errors/InvalidPasswordError.ts","../src/errors/InvalidPositiveNumberError.ts","../src/errors/InvalidStringLengthError.ts","../src/errors/InvalidTimestampIntervalError.ts","../src/errors/InvalidLengthError.ts","../src/errors/NullObjectCreationDisabledError.ts","../src/errors/NullObjectError.ts","../src/errors/ValueNotInEnumError.ts","../src/patterns/Assert.ts","../src/value-objects/NullObject.ts","../src/value-objects/ValueObject.ts","../src/value-objects/StringValueObject.ts","../src/value-objects/NumberValueObject.ts","../src/value-objects/coordinates/Latitude.ts","../src/value-objects/coordinates/Longitude.ts","../src/value-objects/coordinates/Coordinates.ts","../src/value-objects/hashes/Hash.ts","../src/value-objects/hashes/MD5Hash.ts","../src/value-objects/hashes/SHA256Hash.ts","../src/value-objects/hashes/SHA512Hash.ts","../src/value-objects/ids/ShortId.ts","../src/value-objects/ids/UUID.ts","../src/value-objects/media/Media.ts","../src/value-objects/Enum.ts","../src/value-objects/money/Currency.ts","../src/value-objects/Integer.ts","../src/value-objects/money/Money.ts","../src/value-objects/time/Day.ts","../src/value-objects/time/DayOfWeek.ts","../src/value-objects/time/Month.ts","../src/value-objects/time/Year.ts","../src/value-objects/time/Timestamp.ts","../src/value-objects/PositiveNumber.ts","../src/value-objects/time/Duration.ts","../src/value-objects/time/TimestampInterval.ts","../src/value-objects/time/MonthOfYear.ts","../src/value-objects/time/CalendarDay.ts","../src/value-objects/time/Hour.ts","../src/value-objects/Color.ts","../src/value-objects/Email.ts","../src/value-objects/Password.ts","../src/value-objects/UniqueObjectArray.ts"],"sourcesContent":["export class BaseError extends Error {\n private readonly isBaseError = true;\n public static isBaseError(error: unknown): boolean {\n return !!(error as BaseError).isBaseError;\n }\n\n constructor(message: string, prototype: object = BaseError.prototype) {\n super(message);\n this.name = this.constructor.name;\n Object.setPrototypeOf(this, prototype);\n }\n\n public toString(): string {\n return `[${this.name}]: ${this.message}`;\n }\n\n public getStack(): string {\n return this.stack || '';\n }\n}\n","import { BaseError } from './BaseError';\n\nexport class DomainError extends BaseError {\n protected readonly isDomainError = true;\n public static isDomainError(error: unknown): boolean {\n return !!(error as DomainError).isDomainError;\n }\n\n constructor(message: string) {\n super(message, new.target.prototype);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class CurrencyMismatchError extends DomainError {\n constructor(expected: string, received: string) {\n super(`Currency mismatch: expected ${expected}, received ${received}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidColorError extends DomainError {\n constructor(value: string) {\n super(`Invalid color value: ${value}. Must be a valid hex color code.`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidDayError extends DomainError {\n constructor(invalidDay: unknown) {\n super(`Invalid day ${String(invalidDay)}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidDayFormatError extends DomainError {\n constructor(invalidDate: string) {\n super(`Invalid day ${invalidDate}. Expected YYYY-MM-DD. `);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidHourError extends DomainError {\n constructor() {\n super(`Invalid hour`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidEmailError extends DomainError {\n constructor(value: string) {\n super(`Invalid email format: ${value}`);\n }\n}\n","import { DomainError } from '../errors/DomainError';\n\nexport class InvalidFormatError extends DomainError {\n constructor(value?: string) {\n super(`Invalid Format Error with value: '${value}'`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidHashError extends DomainError {\n constructor(type: string, value: string) {\n super(`Invalid ${type} hash: ${value}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidIntegerError extends DomainError {\n constructor(value: number) {\n super(`Invalid integer value ${value}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidLatitudeError extends DomainError {\n constructor(value: number) {\n super(`Invalid latitude: ${value}. Must be between -90 and 90`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidLongitudeError extends DomainError {\n constructor(value: number) {\n super(`Invalid longitude: ${value}. Must be between -180 and 180`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidMinutesError extends DomainError {\n constructor() {\n super(`Invalid minutes`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidMoneyError extends DomainError {\n constructor(value: unknown) {\n super(`Invalid money ${String(value)}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidNumberError extends DomainError {\n constructor(invalidNumber: unknown) {\n super(`Invalid number ${String(invalidNumber)}`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidPasswordError extends DomainError {\n constructor(minLength: number, maxLength: number) {\n super(\n `Password must be between ${minLength} and ${maxLength} characters long and include at least one uppercase letter, one lowercase letter, one number and one symbol.`,\n );\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidPositiveNumberError extends DomainError {\n constructor() {\n super(`Value must be greater or equal than 0`);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidStringLengthError extends DomainError {\n constructor(value: string, length: number) {\n super(\n `String length '${value.length}' exceeds the expected length: '${length}'`,\n );\n }\n}\n","import { Timestamp } from '../value-objects/time/Timestamp';\nimport { DomainError } from './DomainError';\n\nexport class InvalidTimestampIntervalError extends DomainError {\n constructor(start: Timestamp, end: Timestamp) {\n super(\n `Invalid TimestampInterval, start (${start.valueOf()}) must be before the end (${end.valueOf()})`,\n );\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class InvalidLengthError extends DomainError {\n constructor(value: unknown, length: number) {\n super(\n `Invalid Length Error with value: '${value}' expected length: '${length}'`,\n );\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class NullObjectCreationDisabledError extends DomainError {\n constructor(valueObjectName: string) {\n super(\n `[NullObjectCreationDisabledError]: ${valueObjectName} received null or undefined while automatic NullObject creation is disabled`,\n );\n Object.setPrototypeOf(this, NullObjectCreationDisabledError.prototype);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class NullObjectError extends DomainError {\n constructor(message: string) {\n super(`[NullObjectError]: ${message} is NullObject`);\n Object.setPrototypeOf(this, NullObjectError.prototype);\n }\n}\n","import { DomainError } from './DomainError';\n\nexport class ValueNotInEnumError extends DomainError {\n constructor(value: unknown, enumerate: unknown) {\n super(\n `${Object.values(enumerate as object).join(',')} enum does not include value: ${value}`,\n );\n }\n}\n","import { BaseError } from '../errors/BaseError';\nimport { DomainError } from '../errors/DomainError';\n\nexport type Errors = Error | BaseError | DomainError | string;\n\nexport function assert(\n condition: boolean | unknown | undefined,\n error: string | Errors,\n): asserts condition {\n if (condition) {\n return;\n }\n\n throw typeof error === 'string' ? new DomainError(error) : error;\n}\n","import { NullObjectError } from '../errors/NullObjectError';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T> = abstract new (...args: any[]) => T;\ntype NullableObject = Nullable & Record<string, unknown>;\ninterface Nullable {\n isNullObject: boolean;\n valueOf(): undefined;\n}\n\nexport abstract class NullObject {\n private static setFakeProps<T>(\n nullObject: NullableObject,\n klass: Constructor<T>,\n ): void {\n const visited = new Set<string>();\n let proto = klass.prototype;\n\n while (proto && proto !== Object.prototype) {\n const props = Object.getOwnPropertyNames(proto);\n\n for (const prop of props) {\n if (\n prop === 'constructor' ||\n prop === 'isNullObject' ||\n prop === 'valueOf' ||\n visited.has(prop)\n ) {\n continue;\n }\n\n visited.add(prop);\n // eslint-disable-next-line no-param-reassign\n nullObject[prop] = () => {\n throw new NullObjectError(klass.name);\n };\n }\n\n proto = Object.getPrototypeOf(proto);\n }\n\n Object.setPrototypeOf(nullObject, NullObject.prototype);\n }\n\n public static new<T>(klass: Constructor<T>): T {\n const nullObject: NullableObject = {\n isNullObject: true,\n valueOf: () => {\n return undefined;\n },\n };\n NullObject.setFakeProps(nullObject, klass);\n\n return nullObject as T;\n }\n\n public static isNullObject(nullable: unknown): boolean {\n return !!(nullable as NullableObject)?.isNullObject;\n }\n}\n","import { NullObjectCreationDisabledError } from '../errors';\nimport { Primitive, Nullish } from '../types';\nimport { NullObject } from './NullObject';\n\nexport abstract class ValueObject<T extends Primitive = Primitive> {\n private static nullObjectCreationEnabled = true;\n\n protected readonly value!: T;\n\n public static disableNullObjectCreation(): void {\n ValueObject.nullObjectCreationEnabled = false;\n }\n\n public static enableNullObjectCreation(): void {\n ValueObject.nullObjectCreationEnabled = true;\n }\n\n constructor(value: T | Nullish) {\n if (this.isNullish(value)) {\n if (ValueObject.nullObjectCreationEnabled === false) {\n throw new NullObjectCreationDisabledError(new.target.name);\n }\n\n return NullObject.new(new.target);\n }\n Object.defineProperty(this, 'value', {\n value,\n writable: false,\n configurable: false,\n enumerable: true,\n });\n }\n\n private isNullish(value: T | Nullish): value is null | undefined {\n return value === null || value === undefined;\n }\n\n protected clone(value: T): this {\n return new (this.constructor as new (value: Primitive) => this)(\n this.isNullish(value) ? this.value : value,\n ) as this;\n }\n\n public hasValue(other: unknown): boolean {\n const otherValue = other instanceof ValueObject ? other.valueOf() : other;\n\n return this.value === otherValue;\n }\n\n public isEqual(other: unknown): boolean {\n return (\n other instanceof ValueObject &&\n this.constructor === other.constructor &&\n this.hasValue(other)\n );\n }\n\n public isNotEqual(other: unknown): boolean {\n return this.isEqual(other) === false;\n }\n\n public valueOf(): T {\n return this.value;\n }\n\n public toString(): string {\n return this.value!.toString();\n }\n\n public toJSON(): T {\n return this.value;\n }\n}\n","import { InvalidStringLengthError } from '../errors/InvalidStringLengthError';\nimport { assert } from '../patterns/Assert';\nimport { Nullish } from '../types';\nimport { NullObject } from './NullObject';\nimport { ValueObject } from './ValueObject';\n\nexport class StringValueObject extends ValueObject<string> {\n constructor(\n value: string | StringValueObject | Nullish,\n maxLength: number = 512,\n ) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureDoesNotExceedsMaxLength(maxLength);\n }\n\n private ensureDoesNotExceedsMaxLength(maxLength: number): void {\n assert(\n this.value.length <= maxLength,\n new InvalidStringLengthError(this.value, maxLength),\n );\n }\n\n public isEmpty(): boolean {\n return !this.value;\n }\n}\n","import { InvalidNumberError } from '../errors/InvalidNumberError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { ValueObject } from './ValueObject';\n\nexport class NumberValueObject extends ValueObject<number> {\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(this.isValidNumber(this.value), new InvalidNumberError(this.value));\n }\n\n private isValidNumber(value: number): boolean {\n return Number.isFinite(value.valueOf());\n }\n\n public isZero(): boolean {\n return this.value === 0;\n }\n\n public isGreaterThan(other: number | NumberValueObject): boolean {\n return this.value > other.valueOf();\n }\n\n public isGreaterOrEqualThan(other: number | NumberValueObject): boolean {\n return this.value >= other.valueOf();\n }\n\n public isLessThan(other: number | NumberValueObject): boolean {\n return this.value < other.valueOf();\n }\n\n public isLessOrEqualThan(other: number | NumberValueObject): boolean {\n return this.value <= other.valueOf();\n }\n\n public add(other: number | NumberValueObject): NumberValueObject {\n return this.clone(this.value + other.valueOf());\n }\n\n public subtract(other: number | NumberValueObject): NumberValueObject {\n return this.clone(this.value - other.valueOf());\n }\n\n public multiply(other: number | NumberValueObject): NumberValueObject {\n return this.clone(this.value * other.valueOf());\n }\n\n public divide(other: number | NumberValueObject): NumberValueObject {\n return this.clone(this.value / other.valueOf());\n }\n}\n","import { InvalidLatitudeError } from '../../errors/InvalidLatitudeError';\nimport { assert } from '../../patterns/Assert';\nimport { NumberValueObject } from '../NumberValueObject';\n\nexport class Latitude extends NumberValueObject {\n private static MIN_VALUE = new NumberValueObject(-90);\n private static MAX_VALUE = new NumberValueObject(90);\n\n private static isValid(value: number | NumberValueObject): boolean {\n const primitive = value.valueOf();\n\n return (\n Number.isFinite(primitive) &&\n primitive >= this.MIN_VALUE.valueOf() &&\n primitive <= this.MAX_VALUE.valueOf()\n );\n }\n\n constructor(value: number | NumberValueObject) {\n assert(\n value === null || value === undefined || Latitude.isValid(value),\n new InvalidLatitudeError(value?.valueOf()),\n );\n super(value?.valueOf());\n }\n}\n","import { InvalidLongitudeError } from '../../errors/InvalidLongitudeError';\nimport { assert } from '../../patterns/Assert';\nimport { NumberValueObject } from '../NumberValueObject';\n\nexport class Longitude extends NumberValueObject {\n private static MIN_VALUE = new NumberValueObject(-180);\n private static MAX_VALUE = new NumberValueObject(180);\n\n private static isValid(value: number | NumberValueObject): boolean {\n const primitive = value.valueOf();\n\n return (\n Number.isFinite(primitive) &&\n primitive >= this.MIN_VALUE.valueOf() &&\n primitive <= this.MAX_VALUE.valueOf()\n );\n }\n\n constructor(value: number | NumberValueObject) {\n assert(\n value === null || value === undefined || Longitude.isValid(value),\n new InvalidLongitudeError(value?.valueOf()),\n );\n super(value?.valueOf());\n }\n}\n","import { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { Latitude } from './Latitude';\nimport { Longitude } from './Longitude';\n\nexport class Coordinates extends StringValueObject {\n private latitude!: Latitude;\n private longitude!: Longitude;\n\n public static fromString(value: string): Coordinates {\n const latitude = parseFloat(value.split(',')[0]);\n const longitude = parseFloat(value.split(',')[1]);\n\n return new Coordinates(latitude, longitude);\n }\n\n constructor(latitude: number | Latitude, longitude: number | Longitude) {\n const hasValues =\n latitude !== null &&\n latitude !== undefined &&\n longitude !== null &&\n longitude !== undefined;\n\n super(hasValues ? latitude.valueOf() + ',' + longitude.valueOf() : null);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.latitude = new Latitude(latitude.valueOf());\n this.longitude = new Longitude(longitude.valueOf());\n }\n\n public getLatitude(): Latitude {\n return this.latitude;\n }\n\n public getLongitude(): Longitude {\n return this.longitude;\n }\n}\n","import { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { ValueObject } from '../ValueObject';\n\nexport abstract class Hash extends ValueObject<string> {\n constructor(source: string | StringValueObject) {\n super(source?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n }\n\n public toBase64(): StringValueObject {\n const bytes = Array.from(this.valueOf().matchAll(/../g), ([pair]) =>\n parseInt(pair, 16),\n );\n\n return new StringValueObject(btoa(String.fromCharCode(...bytes)));\n }\n}\n","import { InvalidHashError } from '../../errors/InvalidHashError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { Hash } from './Hash';\n\nexport class MD5Hash extends Hash {\n public static isValid(hash: string | StringValueObject): boolean {\n return !!hash.valueOf().match(/^[a-f0-9]{32}$/);\n }\n\n constructor(source: string | StringValueObject) {\n super(source?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n MD5Hash.isValid(this.valueOf()),\n new InvalidHashError('MD5', source.valueOf()),\n );\n }\n}\n","import { InvalidHashError } from '../../errors/InvalidHashError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { Hash } from './Hash';\n\nexport class SHA256Hash extends Hash {\n public static isValid(hash: string | StringValueObject): boolean {\n return !!hash.valueOf().match(/^[a-f0-9]{64}$/i);\n }\n\n constructor(source: string | StringValueObject) {\n super(source?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n SHA256Hash.isValid(this.valueOf()),\n new InvalidHashError('SHA256', source.valueOf()),\n );\n }\n}\n","import { InvalidHashError } from '../../errors/InvalidHashError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { Hash } from './Hash';\n\nexport class SHA512Hash extends Hash {\n public static isValid(hash: string | StringValueObject): boolean {\n return !!hash.valueOf().match(/^[a-f0-9]{128}$/i);\n }\n\n constructor(source: string | StringValueObject) {\n super(source?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n SHA512Hash.isValid(this.valueOf()),\n new InvalidHashError('SHA512', source.valueOf()),\n );\n }\n}\n","import { InvalidFormatError } from '../../errors/InvalidFormatError';\nimport { InvalidLengthError } from '../../errors/InvalidLengthError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { ValueObject } from '../ValueObject';\n\nexport class ShortId extends ValueObject<string> {\n private static readonly LENGTH = 24;\n private static readonly PATTERN = new RegExp(`[a-zA-Z0-9]{${this.LENGTH}}$`);\n\n private static generateObjectIdHex(): string {\n const bytes = new Uint8Array(12);\n new DataView(bytes.buffer).setUint32(0, Math.floor(Date.now() / 1000));\n bytes.set(globalThis.crypto.getRandomValues(new Uint8Array(8)), 4);\n\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join(\n '',\n );\n }\n\n public static generate<T extends ShortId = ShortId>(\n this: new (value: string) => T,\n ): T {\n return new this(ShortId.generateObjectIdHex());\n }\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n this.ensureIsShortId(this.value);\n }\n\n private ensureIsShortId(value: string): void {\n assert(\n value.length === ShortId.LENGTH,\n new InvalidLengthError(this.value, ShortId.LENGTH),\n );\n assert(ShortId.PATTERN.test(value), new InvalidFormatError(this.value));\n }\n}\n","import { InvalidFormatError } from '../../errors/InvalidFormatError';\nimport { InvalidLengthError } from '../../errors/InvalidLengthError';\nimport { assert } from '../../patterns';\nimport { NullObject } from '../NullObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { ValueObject } from '../ValueObject';\n\nexport class UUID extends ValueObject<string> {\n private static readonly LENGTH = 36;\n private static readonly PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n private static readonly SENTINEL_PATTERN =\n /^(?:00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n\n public static generate<T extends UUID = UUID>(\n this: new (value: string) => T,\n ): T {\n const bytes = globalThis.crypto.getRandomValues(new Uint8Array(16));\n // RFC 4122 §4.4: version 4 and variant 10xx.\n bytes[6] = (bytes[6] % 16) + 64;\n bytes[8] = (bytes[8] % 64) + 128;\n const hex = Array.from(bytes, (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n\n return new this(\n [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20),\n ].join('-'),\n );\n }\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n this.ensureIsUUID(this.value);\n }\n\n private ensureIsUUID(value: string): void {\n assert(\n value.length === UUID.LENGTH,\n new InvalidLengthError(this.value, UUID.LENGTH),\n );\n assert(\n UUID.PATTERN.test(value) || UUID.SENTINEL_PATTERN.test(value),\n new InvalidFormatError(this.value),\n );\n }\n}\n","import { NullObject } from '../NullObject';\nimport { ValueObject } from '../ValueObject';\n\nexport class Media extends ValueObject<string> {\n private static readonly BASE64_CHUNK_SIZE = 0x8000;\n\n private readonly buffer?: Uint8Array;\n\n constructor(value: string | Uint8Array) {\n super(\n value instanceof Uint8Array\n ? new TextDecoder('utf-8', { ignoreBOM: true }).decode(value)\n : value,\n );\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.buffer =\n value instanceof Uint8Array ? new Uint8Array(value) : undefined;\n }\n\n public getBuffer(): Uint8Array {\n return this.buffer === undefined\n ? new TextEncoder().encode(this.value)\n : new Uint8Array(this.buffer);\n }\n\n public getSize(): number {\n return this.getBuffer().length;\n }\n\n public getBase64(): string {\n const bytes = this.getBuffer();\n const chunks: string[] = [];\n\n // Chunked so large payloads do not overflow the call stack.\n for (let i = 0; i < bytes.length; i += Media.BASE64_CHUNK_SIZE) {\n chunks.push(\n String.fromCharCode(...bytes.subarray(i, i + Media.BASE64_CHUNK_SIZE)),\n );\n }\n\n return btoa(chunks.join(''));\n }\n\n public hasValue(other: unknown): boolean {\n let otherBytes: Uint8Array | undefined;\n\n if (other instanceof Media) {\n otherBytes = other.getBuffer();\n } else if (other instanceof Uint8Array) {\n otherBytes = other;\n }\n\n if (otherBytes === undefined) {\n return super.hasValue(other);\n }\n\n const bytes = this.getBuffer();\n\n return (\n bytes.length === otherBytes.length &&\n bytes.every((byte, i) => byte === otherBytes[i])\n );\n }\n}\n","import { ValueNotInEnumError } from '../errors/ValueNotInEnumError';\nimport { assert } from '../patterns/Assert';\nimport { Primitive } from '../types';\nimport { NullObject } from './NullObject';\nimport { ValueObject } from './ValueObject';\n\nexport abstract class Enum<\n T extends Primitive = Primitive,\n> extends ValueObject<T> {\n constructor(value: T) {\n super(value);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsValidValue();\n }\n\n public abstract getValues(): T[];\n\n private ensureIsValidValue(): void {\n const isValueInEnum = this.getValues().some((enumValue) =>\n this.hasValue(enumValue),\n );\n assert(\n isValueInEnum,\n new ValueNotInEnumError(this.valueOf(), this.getValues()),\n );\n }\n}\n","import { InvalidFormatError } from '../../errors/InvalidFormatError';\nimport { assert } from '../../patterns/Assert';\nimport { Enum } from '../Enum';\n\nexport class Currency extends Enum<string> {\n private static readonly MINOR_UNIT_DIGITS: Record<string, number> = {\n AED: 2,\n ARS: 2,\n AUD: 2,\n BRL: 2,\n CAD: 2,\n CHF: 2,\n CLP: 0,\n CNY: 2,\n COP: 2,\n CRC: 2,\n CZK: 2,\n DKK: 2,\n EUR: 2,\n GBP: 2,\n HKD: 2,\n HUF: 2,\n IDR: 2,\n ILS: 2,\n INR: 2,\n ISK: 0,\n JPY: 0,\n KRW: 0,\n KWD: 3,\n MXN: 2,\n NOK: 2,\n NZD: 2,\n PEN: 2,\n PLN: 2,\n RON: 2,\n SEK: 2,\n SGD: 2,\n THB: 2,\n TRY: 2,\n USD: 2,\n ZAR: 2,\n };\n\n private static readonly SYMBOLS: Record<string, string> = {\n $: 'USD',\n '£': 'GBP',\n '¥': 'JPY',\n '₡': 'CRC',\n '₩': 'KRW',\n '₪': 'ILS',\n '€': 'EUR',\n '₹': 'INR',\n '₺': 'TRY',\n };\n\n public static fromSymbol(symbol: string): Currency {\n const code = Currency.SYMBOLS[symbol];\n assert(code, new InvalidFormatError(symbol));\n\n return new Currency(code);\n }\n\n public getValues(): string[] {\n return Object.keys(Currency.MINOR_UNIT_DIGITS);\n }\n\n public getMinorUnitDigits(): number {\n return Currency.MINOR_UNIT_DIGITS[this.valueOf()];\n }\n}\n","import { InvalidIntegerError } from '../errors/InvalidIntegerError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { NumberValueObject } from './NumberValueObject';\n\nexport class Integer extends NumberValueObject {\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n this.ensureIsInteger();\n }\n\n private ensureIsInteger(): void {\n assert(\n this.value.valueOf() % 1 === 0,\n new InvalidIntegerError(this.value.valueOf()),\n );\n }\n}\n","import { CurrencyMismatchError } from '../../errors/CurrencyMismatchError';\nimport { InvalidMoneyError } from '../../errors/InvalidMoneyError';\nimport { assert } from '../../patterns/Assert';\nimport { Integer } from '../Integer';\nimport { NullObject } from '../NullObject';\nimport { NumberValueObject } from '../NumberValueObject';\nimport { StringValueObject } from '../StringValueObject';\nimport { ValueObject } from '../ValueObject';\nimport { Currency } from './Currency';\n\nexport class Money extends ValueObject<string> {\n private static readonly FORMAT = /^(-?)(\\d+)(?:\\.(\\d+))? ([A-Z]{3})$/;\n private static readonly TEXT_FORMAT =\n /^(-?)(?:([^\\d\\s.-]+)\\s*)?(\\d+(?:\\.\\d+)?)(?:\\s*([^\\d\\s.-]+))?$/;\n\n private readonly currency!: Currency;\n private readonly minorUnits!: Integer;\n\n public static fromMinorUnits(\n minorUnits: number | NumberValueObject,\n currency: string | Currency,\n ): Money {\n const units = new Integer(minorUnits.valueOf());\n assert(Number.isSafeInteger(units.valueOf()), new InvalidMoneyError(units));\n\n const code = new Currency(currency.valueOf());\n const digits = code.getMinorUnitDigits();\n const padded = String(Math.abs(units.valueOf())).padStart(digits + 1, '0');\n const integer = padded.slice(0, padded.length - digits);\n const fraction =\n digits > 0 ? `.${padded.slice(padded.length - digits)}` : '';\n const sign = units.isLessThan(0) ? '-' : '';\n\n return new Money(`${sign}${integer}${fraction} ${code}`);\n }\n\n public static fromString(text: string): Money {\n const match = Money.TEXT_FORMAT.exec(text.trim());\n assert(match, new InvalidMoneyError(text));\n\n const [, sign, prefix, amount, suffix] = match;\n assert(!prefix !== !suffix, new InvalidMoneyError(text));\n\n const token = prefix ?? suffix;\n const currency = /^[A-Za-z]{3}$/.test(token)\n ? new Currency(token.toUpperCase())\n : Currency.fromSymbol(token);\n const [integer, fraction = ''] = amount.split('.');\n const digits = currency.getMinorUnitDigits();\n assert(fraction.length <= digits, new InvalidMoneyError(text));\n\n return Money.fromMinorUnits(\n Number(`${sign}${integer}${fraction.padEnd(digits, '0')}`),\n currency,\n );\n }\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n const match = Money.FORMAT.exec(this.value);\n assert(match, new InvalidMoneyError(this.value));\n\n const [, sign, integer, fraction = '', code] = match;\n const currency = new Currency(code);\n const minorUnits = new Integer(Number(`${sign}${integer}${fraction}`));\n\n assert(\n fraction.length === currency.getMinorUnitDigits() &&\n Number.isSafeInteger(minorUnits.valueOf()) &&\n !(sign && minorUnits.isZero()),\n new InvalidMoneyError(this.value),\n );\n\n Object.defineProperties(this, {\n currency: { enumerable: false, value: currency },\n minorUnits: { enumerable: false, value: minorUnits },\n });\n }\n\n private ensureSameCurrency(other: Money): void {\n assert(\n this.currency.isEqual(other.currency),\n new CurrencyMismatchError(\n this.currency.valueOf(),\n other.currency.valueOf(),\n ),\n );\n }\n\n public getCurrency(): Currency {\n return this.currency;\n }\n\n public getMinorUnits(): Integer {\n return this.minorUnits;\n }\n\n public isZero(): boolean {\n return this.minorUnits.isZero();\n }\n\n public isNegative(): boolean {\n return this.minorUnits.isLessThan(0);\n }\n\n public isGreaterThan(other: Money): boolean {\n this.ensureSameCurrency(other);\n\n return this.minorUnits.isGreaterThan(other.minorUnits);\n }\n\n public isLessThan(other: Money): boolean {\n this.ensureSameCurrency(other);\n\n return this.minorUnits.isLessThan(other.minorUnits);\n }\n\n public add(other: Money): Money {\n this.ensureSameCurrency(other);\n\n return Money.fromMinorUnits(\n this.minorUnits.add(other.minorUnits),\n this.currency,\n );\n }\n\n public subtract(other: Money): Money {\n this.ensureSameCurrency(other);\n\n return Money.fromMinorUnits(\n this.minorUnits.subtract(other.minorUnits),\n this.currency,\n );\n }\n\n public multiply(factor: number): Money {\n return Money.fromMinorUnits(\n Math.round(this.minorUnits.valueOf() * factor),\n this.currency,\n );\n }\n}\n","import { InvalidDayError } from '../../errors/InvalidDayError';\nimport { assert } from '../../patterns/Assert';\nimport { Integer } from '../Integer';\nimport { NullObject } from '../NullObject';\nimport { NumberValueObject } from '../NumberValueObject';\n\nexport class Day extends Integer {\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsValidDay();\n }\n\n private ensureIsValidDay(): void {\n assert(this.isGreaterOrEqualThan(1), new InvalidDayError(this.value));\n assert(this.isLessOrEqualThan(31), new InvalidDayError(this.value));\n }\n}\n","import { InvalidDayError } from '../../errors/InvalidDayError';\nimport { assert } from '../../patterns';\nimport { Enum } from '../Enum';\nimport { Timestamp } from './Timestamp';\n\nexport enum EDaysOfWeek {\n MONDAY = 'monday',\n TUESDAY = 'tuesday',\n WEDNESDAY = 'wednesday',\n THURSDAY = 'thursday',\n FRIDAY = 'friday',\n SATURDAY = 'saturday',\n SUNDAY = 'sunday',\n}\n\nexport const timeStampDayToDaysMap = {\n [EDaysOfWeek.FRIDAY]: 5,\n [EDaysOfWeek.MONDAY]: 1,\n [EDaysOfWeek.SATURDAY]: 6,\n [EDaysOfWeek.SUNDAY]: 0,\n [EDaysOfWeek.THURSDAY]: 4,\n [EDaysOfWeek.TUESDAY]: 2,\n [EDaysOfWeek.WEDNESDAY]: 3,\n};\n\nexport class DayOfWeek extends Enum {\n public static MONDAY = new DayOfWeek(EDaysOfWeek.MONDAY);\n public static TUESDAY = new DayOfWeek(EDaysOfWeek.TUESDAY);\n public static WEDNESDAY = new DayOfWeek(EDaysOfWeek.WEDNESDAY);\n public static THURSDAY = new DayOfWeek(EDaysOfWeek.THURSDAY);\n public static FRIDAY = new DayOfWeek(EDaysOfWeek.FRIDAY);\n public static SATURDAY = new DayOfWeek(EDaysOfWeek.SATURDAY);\n public static SUNDAY = new DayOfWeek(EDaysOfWeek.SUNDAY);\n\n public static fromNumber(day: number): DayOfWeek {\n const [eDay] =\n Object.entries(timeStampDayToDaysMap).find(\n ([, value]) => value === day,\n ) || [];\n\n assert(eDay, new InvalidDayError(eDay));\n\n return new DayOfWeek(eDay);\n }\n\n public static fromTimestamp(timestamp: Timestamp): DayOfWeek {\n const dayOfWeekNumber = timestamp.getDayOfWeek();\n\n return DayOfWeek.fromNumber(dayOfWeekNumber);\n }\n\n public getValues(): string[] {\n return Object.values(EDaysOfWeek);\n }\n\n public toNumber(): number {\n return timeStampDayToDaysMap[this.value as EDaysOfWeek];\n }\n}\n","import { Enum } from '../Enum';\n\nenum MonthEnum {\n JANUARY = 1,\n FEBRUARY = 2,\n MARCH = 3,\n APRIL = 4,\n MAY = 5,\n JUNE = 6,\n JULY = 7,\n AUGUST = 8,\n SEPTEMBER = 9,\n OCTOBER = 10,\n NOVEMBER = 11,\n DECEMBER = 12,\n}\n\nexport class Month extends Enum<number> {\n public static readonly JANUARY = new Month(MonthEnum.JANUARY);\n public static readonly FEBRUARY = new Month(MonthEnum.FEBRUARY);\n public static readonly MARCH = new Month(MonthEnum.MARCH);\n public static readonly APRIL = new Month(MonthEnum.APRIL);\n public static readonly MAY = new Month(MonthEnum.MAY);\n public static readonly JUNE = new Month(MonthEnum.JUNE);\n public static readonly JULY = new Month(MonthEnum.JULY);\n public static readonly AUGUST = new Month(MonthEnum.AUGUST);\n public static readonly SEPTEMBER = new Month(MonthEnum.SEPTEMBER);\n public static readonly OCTOBER = new Month(MonthEnum.OCTOBER);\n public static readonly NOVEMBER = new Month(MonthEnum.NOVEMBER);\n public static readonly DECEMBER = new Month(MonthEnum.DECEMBER);\n\n public getValues(): number[] {\n return Object.values(MonthEnum) as number[];\n }\n\n public getIndex(): number {\n return Number(this.valueOf()) - 1;\n }\n}\n","import { Integer } from '../Integer';\nimport { NullObject } from '../NullObject';\nimport { NumberValueObject } from '../NumberValueObject';\n\nexport class Year extends Integer {\n private static readonly YEAR_DAYS = 365;\n private static readonly LEAP_YEAR_DAYS = 366;\n\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n }\n\n public isLeapYear(): boolean {\n return this.getNumberOfDays() === Year.LEAP_YEAR_DAYS;\n }\n\n public getNumberOfDays(): number {\n return (this.value % 4 === 0 && this.value % 100 !== 0) ||\n this.value % 400 === 0\n ? Year.LEAP_YEAR_DAYS\n : Year.YEAR_DAYS;\n }\n}\n","import { InvalidIntegerError } from '../../errors/InvalidIntegerError';\nimport { InvalidNumberError } from '../../errors/InvalidNumberError';\nimport { assert } from '../../patterns/Assert';\nimport { NullObject } from '../NullObject';\nimport { NumberValueObject } from '../NumberValueObject';\nimport { ValueObject } from '../ValueObject';\nimport { CalendarDay } from './CalendarDay';\nimport { Day } from './Day';\nimport { Duration } from './Duration';\nimport { Month } from './Month';\nimport { MonthOfYear } from './MonthOfYear';\nimport { Year } from './Year';\n\ntype TimestampValue = number | Date | Timestamp | string;\n\nexport class Timestamp extends ValueObject<number> {\n private static readonly FACTORS = {\n DAYS: 24 * 60 * 60 * 1000,\n HOURS: 60 * 60 * 1000,\n MINUTES: 60 * 1000,\n SECONDS: 1000,\n WEEKS: 7 * 24 * 60 * 60 * 1000,\n };\n\n private static valueMilliseconds(value?: TimestampValue): number {\n if (value instanceof Timestamp || value instanceof Date) {\n return value.valueOf();\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'string') {\n return new Date(value).valueOf();\n }\n\n return Date.now().valueOf();\n }\n\n private static getLastDayOfUtcMonth(year: number, month: number): number {\n const normalizedYear = year + Math.floor(month / 12);\n const normalizedMonth = ((month % 12) + 12) % 12;\n const days = [\n 31,\n new Year(normalizedYear).isLeapYear() ? 29 : 28,\n 31,\n 30,\n 31,\n 30,\n 31,\n 31,\n 30,\n 31,\n 30,\n 31,\n ];\n\n return days[normalizedMonth];\n }\n\n private static ensureCalendarDelta(value: number): void {\n assert(Number.isInteger(value), new InvalidIntegerError(value));\n }\n\n private static createUtcCalendarValue(\n sourceValue: number,\n year: number,\n month: number,\n day: number,\n ): number {\n const integerValue = Math.floor(sourceValue);\n const fractionalMilliseconds = sourceValue - integerValue;\n const source = new Date(integerValue);\n const target = new Date(0);\n\n target.setUTCFullYear(year, month, day);\n target.setUTCHours(\n source.getUTCHours(),\n source.getUTCMinutes(),\n source.getUTCSeconds(),\n source.getUTCMilliseconds(),\n );\n\n return target.valueOf() + fractionalMilliseconds;\n }\n\n public static new<T extends Timestamp = Timestamp>(\n this: new (value?: TimestampValue) => T,\n value: TimestampValue,\n ): T {\n return new this(value);\n }\n\n public static now<T extends Timestamp = Timestamp>(\n this: new (value?: TimestampValue) => T,\n ): T {\n return new this();\n }\n\n public static fromSeconds<T extends Timestamp = Timestamp>(\n this: new (value?: TimestampValue) => T,\n seconds: number | NumberValueObject,\n ): T {\n return new this(seconds.valueOf() * Timestamp.FACTORS.SECONDS);\n }\n\n public constructor(value?: TimestampValue) {\n super(value === null ? null : Timestamp.valueMilliseconds(value));\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n Number.isFinite(new Date(this.value).valueOf()),\n new InvalidNumberError(this.value),\n );\n }\n\n public toExactHour(): Timestamp {\n const hours = Math.floor(this.value / Timestamp.FACTORS.HOURS);\n\n return this.clone(hours * Timestamp.FACTORS.HOURS);\n }\n\n public toMilliseconds(): number {\n return this.value;\n }\n\n public toSeconds(): number {\n return Math.round(this.value / Timestamp.FACTORS.SECONDS);\n }\n\n public toDate(): Date {\n return new Date(this.value);\n }\n\n public toString(): string {\n return `${this.valueOf()}`;\n }\n\n public isBefore(other: Timestamp): boolean {\n return this.value < other.valueOf();\n }\n\n public isAfter(other: Timestamp): boolean {\n return this.value > other.valueOf();\n }\n\n public isBeforeOrEqual(other: Timestamp): boolean {\n return this.value <= other.valueOf();\n }\n\n public isAfterOrEqual(other: Timestamp): boolean {\n return this.value >= other.valueOf();\n }\n\n public addMilliseconds(milliseconds: number | NumberValueObject): Timestamp {\n const value = this.value + milliseconds.valueOf();\n\n return this.clone(value);\n }\n\n public addSeconds(seconds: number | NumberValueObject): Timestamp {\n const value = this.value + seconds.valueOf() * Timestamp.FACTORS.SECONDS;\n\n return this.clone(value);\n }\n\n public addMinutes(minutes: number | NumberValueObject): Timestamp {\n const value = this.value + minutes.valueOf() * Timestamp.FACTORS.MINUTES;\n\n return this.clone(value);\n }\n\n public addHours(hours: number | NumberValueObject): Timestamp {\n const value = this.value + hours.valueOf() * Timestamp.FACTORS.HOURS;\n\n return this.clone(value);\n }\n\n public addDays(days: number | NumberValueObject): Timestamp {\n const value = this.value + days.valueOf() * Timestamp.FACTORS.DAYS;\n\n return this.clone(value);\n }\n\n public addWeeks(weeks: number | NumberValueObject): Timestamp {\n const value = this.value + weeks.valueOf() * Timestamp.FACTORS.WEEKS;\n\n return this.clone(value);\n }\n\n public addMonths(months: number | NumberValueObject): Timestamp {\n const delta = months.valueOf();\n Timestamp.ensureCalendarDelta(delta);\n\n const source = new Date(Math.floor(this.value));\n const totalMonths =\n source.getUTCFullYear() * 12 + source.getUTCMonth() + delta;\n const targetYear = Math.floor(totalMonths / 12);\n const targetMonth = totalMonths - targetYear * 12;\n const targetDay = Math.min(\n source.getUTCDate(),\n Timestamp.getLastDayOfUtcMonth(targetYear, targetMonth),\n );\n\n return this.clone(\n Timestamp.createUtcCalendarValue(\n this.value,\n targetYear,\n targetMonth,\n targetDay,\n ),\n );\n }\n\n public addYears(years: number | NumberValueObject): Timestamp {\n const delta = years.valueOf();\n Timestamp.ensureCalendarDelta(delta);\n\n const source = new Date(Math.floor(this.value));\n const targetYear = source.getUTCFullYear() + delta;\n const targetMonth = source.getUTCMonth();\n const targetDay = Math.min(\n source.getUTCDate(),\n Timestamp.getLastDayOfUtcMonth(targetYear, targetMonth),\n );\n\n return this.clone(\n Timestamp.createUtcCalendarValue(\n this.value,\n targetYear,\n targetMonth,\n targetDay,\n ),\n );\n }\n\n public addDuration(duration: Duration): Timestamp {\n const value = this.value + duration.valueOf();\n\n return this.clone(value);\n }\n\n public isSameDay(other: Timestamp): boolean {\n return this.getCalendarDay().isEqual(other.getCalendarDay());\n }\n\n public isSameMonth(other: Timestamp): boolean {\n return this.getMonthOfYear().isEqual(other.getMonthOfYear());\n }\n\n public isSameYear(other: Timestamp): boolean {\n return this.getYear().isEqual(other.getYear());\n }\n\n public getCalendarDay(): CalendarDay {\n return new CalendarDay(this);\n }\n\n public getDay(): Day {\n return new Day(this.toDate().getUTCDate());\n }\n\n public getMonth(): Month {\n return new Month(this.toDate().getUTCMonth() + 1);\n }\n\n public getYear(): Year {\n return new Year(this.toDate().getUTCFullYear());\n }\n\n public getHours(): number {\n return this.toDate().getUTCHours();\n }\n\n public getMinutes(): number {\n return this.toDate().getUTCMinutes();\n }\n\n public getSeconds(): number {\n return this.toDate().getUTCSeconds();\n }\n\n public getMilliseconds(): number {\n return this.toDate().getUTCMilliseconds();\n }\n\n public getDayOfWeek(): number {\n return this.toDate().getUTCDay();\n }\n\n public getMonthOfYear(): MonthOfYear {\n return new MonthOfYear(this.getMonth(), this.getYear());\n }\n}\n","import { InvalidPositiveNumberError } from '../errors/InvalidPositiveNumberError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { NumberValueObject } from './NumberValueObject';\n\nexport class PositiveNumber extends NumberValueObject {\n constructor(value: number | NumberValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsPositive(this.value);\n }\n\n private ensureIsPositive(value: number): void {\n assert(value >= 0, new InvalidPositiveNumberError());\n }\n}\n","import { NumberValueObject } from '../NumberValueObject';\n\nexport class Duration extends NumberValueObject {\n private static readonly MILLISECOND_FACTOR = 1000;\n private static readonly SECOND_UNITS = {\n DAYS: 24 * 60 * 60,\n HOURS: 60 * 60,\n MINUTES: 60,\n MONTHS: 30 * 24 * 60 * 60,\n SECONDS: 1,\n WEEKS: 7 * 24 * 60 * 60,\n YEARS: 365 * 24 * 60 * 60,\n };\n\n private static readonly millisecondFactors = {\n DAYS: new NumberValueObject(\n this.SECOND_UNITS.DAYS * this.MILLISECOND_FACTOR,\n ),\n HOURS: new NumberValueObject(\n this.SECOND_UNITS.HOURS * this.MILLISECOND_FACTOR,\n ),\n MINUTES: new NumberValueObject(\n this.SECOND_UNITS.MINUTES * this.MILLISECOND_FACTOR,\n ),\n MONTHS: new NumberValueObject(\n this.SECOND_UNITS.MONTHS * this.MILLISECOND_FACTOR,\n ),\n SECONDS: new NumberValueObject(\n this.SECOND_UNITS.SECONDS * this.MILLISECOND_FACTOR,\n ),\n WEEKS: new NumberValueObject(\n this.SECOND_UNITS.WEEKS * this.MILLISECOND_FACTOR,\n ),\n YEARS: new NumberValueObject(\n this.SECOND_UNITS.YEARS * this.MILLISECOND_FACTOR,\n ),\n };\n\n public static fromDays<T extends Duration = Duration>(\n this: new (milliseconds: NumberValueObject) => T,\n days: number | NumberValueObject,\n ): T {\n return new this(\n new NumberValueObject(days.valueOf()).multiply(\n Duration.millisecondFactors.DAYS,\n ),\n );\n }\n\n public static fromHours<T extends Duration = Duration>(\n this: new (milliseconds: NumberValueObject) => T,\n hours: number | NumberValueObject,\n ): T {\n return new this(\n new NumberValueObject(hours.valueOf()).multiply(\n Duration.millisecondFactors.HOURS,\n ),\n );\n }\n\n public static fromMinutes<T extends Duration = Duration>(\n this: new (milliseconds: NumberValueObject) => T,\n minutes: number | NumberValueObject,\n ): T {\n return new this(\n new NumberValueObject(minutes.valueOf()).multiply(\n Duration.millisecondFactors.MINUTES,\n ),\n );\n }\n\n public static fromSeconds<T extends Duration = Duration>(\n this: new (milliseconds: NumberValueObject) => T,\n seconds: number | NumberValueObject,\n ): T {\n return new this(\n new NumberValueObject(seconds.valueOf()).multiply(\n Duration.millisecondFactors.SECONDS,\n ),\n );\n }\n\n public static fromMilliseconds<T extends Duration = Duration>(\n this: new (milliseconds: NumberValueObject) => T,\n milliseconds: number | NumberValueObject,\n ): T {\n return new this(new NumberValueObject(milliseconds.valueOf()));\n }\n\n constructor(milliseconds: NumberValueObject | Duration) {\n super(milliseconds?.valueOf());\n }\n\n public getTotalDays(): NumberValueObject {\n return new Duration(this).divide(Duration.millisecondFactors.DAYS);\n }\n\n public getTotalHours(): NumberValueObject {\n return new Duration(this).divide(Duration.millisecondFactors.HOURS);\n }\n\n public getTotalMinutes(): NumberValueObject {\n return new Duration(this).divide(Duration.millisecondFactors.MINUTES);\n }\n\n public getTotalSeconds(): NumberValueObject {\n return new Duration(this).divide(Duration.millisecondFactors.SECONDS);\n }\n\n public getTotalMilliseconds(): NumberValueObject {\n return new NumberValueObject(this.valueOf());\n }\n\n public getDays(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(\n new Duration(this).divide(Duration.millisecondFactors.DAYS).valueOf(),\n ),\n );\n }\n\n public getHours(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(\n new Duration(this).divide(Duration.millisecondFactors.HOURS).valueOf(),\n ) % 24,\n );\n }\n\n public getMinutes(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(\n new Duration(this)\n .divide(Duration.millisecondFactors.MINUTES)\n .valueOf(),\n ) % Duration.SECOND_UNITS.MINUTES,\n );\n }\n\n public getSeconds(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(\n new Duration(this)\n .divide(Duration.millisecondFactors.SECONDS)\n .valueOf(),\n ) % Duration.SECOND_UNITS.MINUTES,\n );\n }\n\n public getMilliseconds(): NumberValueObject {\n return new NumberValueObject(\n Math.floor(new Duration(this).valueOf()) % Duration.MILLISECOND_FACTOR,\n );\n }\n}\n","import { InvalidTimestampIntervalError } from '../../errors/InvalidTimestampIntervalError';\nimport { PrimitiveOf } from '../../interfaces/PrimitiveOf';\nimport { assert } from '../../patterns/Assert';\nimport { NullObject } from '../NullObject';\nimport { PositiveNumber } from '../PositiveNumber';\nimport { ValueObject } from '../ValueObject';\nimport { CalendarDay } from './CalendarDay';\nimport { DayOfWeek } from './DayOfWeek';\nimport { Duration } from './Duration';\nimport { Timestamp } from './Timestamp';\n\nexport class TimestampInterval extends ValueObject<string> {\n public static fromPrimitives(\n primitives: PrimitiveOf<TimestampInterval>,\n ): TimestampInterval {\n return new TimestampInterval(\n new Timestamp(primitives.start),\n new Timestamp(primitives.end),\n );\n }\n\n constructor(\n private readonly start: Timestamp,\n private readonly end: Timestamp,\n ) {\n super(start && end ? `${start.valueOf()}-${end.valueOf()}` : null);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n start.isBeforeOrEqual(end),\n new InvalidTimestampIntervalError(start, end),\n );\n }\n\n public toPrimitives() {\n return {\n end: this.end.valueOf(),\n start: this.start.valueOf(),\n };\n }\n\n public getStart(): Timestamp {\n return this.start;\n }\n\n public getEnd(): Timestamp {\n return this.end;\n }\n\n public getDuration(): Duration {\n return new Duration(\n new PositiveNumber(this.end.valueOf() - this.start.valueOf()),\n );\n }\n\n public getTotalDaysOfWeek(dayOfWeek: DayOfWeek): number {\n const oneDayInMilliseconds = 24 * 60 * 60 * 1000;\n const daysToCheck: number = Math.trunc(\n this.getDuration().valueOf() / oneDayInMilliseconds,\n );\n\n let count = 0;\n\n for (let daysChecked = 0; daysChecked <= daysToCheck; daysChecked++) {\n const iteratorDay = new Timestamp(this.start).addDays(daysChecked);\n\n if (iteratorDay.getDayOfWeek() === dayOfWeek.toNumber()) {\n count++;\n }\n }\n\n return count;\n }\n\n public getDaysBetweenInterval(): CalendarDay[] {\n const days: CalendarDay[] = [];\n\n let iteratorTimestamp = new Timestamp(this.getStart());\n const endTimestamp = new Timestamp(this.getEnd());\n\n while (iteratorTimestamp.isBeforeOrEqual(endTimestamp)) {\n days.push(new CalendarDay(iteratorTimestamp));\n iteratorTimestamp = iteratorTimestamp.addDays(1);\n }\n\n return days;\n }\n\n public getOverlappingInterval(\n searchInterval: TimestampInterval,\n ): TimestampInterval | null {\n const start = this.start.isAfter(searchInterval.getStart())\n ? this.start\n : searchInterval.getStart();\n const end = this.end.isBefore(searchInterval.getEnd())\n ? this.end\n : searchInterval.getEnd();\n\n if (start.isAfterOrEqual(end)) {\n return null;\n }\n\n return new TimestampInterval(start, end);\n }\n\n public includes(timestamp: Timestamp): boolean {\n return (\n timestamp.isAfterOrEqual(this.start) &&\n timestamp.isBeforeOrEqual(this.end)\n );\n }\n}\n","import { InvalidFormatError } from '../../errors/InvalidFormatError';\nimport { assert } from '../../patterns/Assert';\nimport { ValueObject } from '../ValueObject';\nimport { Month } from './Month';\nimport { Timestamp } from './Timestamp';\nimport { TimestampInterval } from './TimestampInterval';\nimport { Year } from './Year';\n\nexport class MonthOfYear extends ValueObject<string> {\n private readonly month!: Month;\n private readonly year!: Year;\n\n public static fromTimestamp(timestamp: Timestamp): MonthOfYear {\n return new MonthOfYear(timestamp.getMonth(), timestamp.getYear());\n }\n\n public static fromString(value: string): MonthOfYear {\n assert(/^[^/]+\\/[^/]+$/.test(value), new InvalidFormatError(value));\n\n const [year, month] = value.split('/').map(Number);\n\n return new MonthOfYear(month, year);\n }\n\n constructor(month: number | Month, year: number | Year) {\n const hasValues =\n month !== null &&\n month !== undefined &&\n year !== null &&\n year !== undefined;\n\n super(\n hasValues\n ? year.valueOf().toString() +\n '/' +\n month.valueOf().toString().padStart(2, '0')\n : null,\n );\n\n if (!hasValues) {\n return this;\n }\n\n this.month = new Month(month.valueOf());\n this.year = new Year(year.valueOf());\n }\n\n public getMonth(): Month {\n return new Month(this.month.valueOf());\n }\n\n public getYear(): Year {\n return new Year(this.year);\n }\n\n public getNumberOfDays(): number {\n return new Date(this.year.valueOf(), this.month.valueOf(), 0).getDate();\n }\n\n public getTimestampInterval(): TimestampInterval {\n const firstMonthDay = '01';\n const month = this.month.valueOf().toString().padStart(2, '0');\n const lastDay = this.getNumberOfDays().toString();\n const startDate = new Timestamp(`${this.year}-${month}-${firstMonthDay}`);\n const endDate = new Timestamp(`${this.year}-${month}-${lastDay}`);\n\n return new TimestampInterval(startDate, endDate);\n }\n}\n","import { InvalidDayError } from '../../errors/InvalidDayError';\nimport { InvalidDayFormatError } from '../../errors/InvalidDayFormatError';\nimport { assert } from '../../patterns/Assert';\nimport { ValueObject } from '../ValueObject';\nimport { Day } from './Day';\nimport { DayOfWeek } from './DayOfWeek';\nimport { Month } from './Month';\nimport { MonthOfYear } from './MonthOfYear';\nimport { Timestamp } from './Timestamp';\n\nexport class CalendarDay extends ValueObject<string> {\n private readonly year!: number;\n private readonly month!: number;\n private readonly day!: number;\n\n private static ensureIsValidString(value: string): void {\n assert(\n value.match(/^\\d{4}-\\d{1,2}-\\d{1,2}$/),\n new InvalidDayFormatError(value),\n );\n }\n\n private static generateStringValue(timestamp: Timestamp): string {\n const paddedMonth = timestamp.getMonth().toString().padStart(2, '0');\n const paddedDay = timestamp.getDay().toString().padStart(2, '0');\n\n return `${timestamp.getYear().toString()}-${paddedMonth}-${paddedDay}`;\n }\n\n private static ensureIsValidDate(value: Date | number | Timestamp): void {\n assert(Number.isFinite(value.valueOf()), new InvalidDayError(value));\n }\n\n private static timestampFromString(value: string): Timestamp {\n CalendarDay.ensureIsValidString(value);\n\n const [year, month, day] = value.split('-').map(Number);\n const date = new Date(0);\n date.setUTCHours(0, 0, 0, 0);\n date.setUTCFullYear(year, month - 1, day);\n\n assert(\n date.getUTCFullYear() === year &&\n date.getUTCMonth() === month - 1 &&\n date.getUTCDate() === day,\n new InvalidDayError(value),\n );\n\n return new Timestamp(date);\n }\n\n private static timestampFromValue(\n value: string | Date | number | Timestamp,\n ): Timestamp {\n if (typeof value === 'string') {\n return CalendarDay.timestampFromString(value);\n }\n\n CalendarDay.ensureIsValidDate(value);\n\n return new Timestamp(value);\n }\n\n constructor(value?: string | Date | number | Timestamp) {\n let timestamp: Timestamp | undefined;\n\n if (value === undefined) {\n timestamp = new Timestamp();\n } else if (value !== null) {\n timestamp = CalendarDay.timestampFromValue(value);\n }\n\n super(timestamp && CalendarDay.generateStringValue(timestamp));\n\n if (timestamp === undefined) {\n return this;\n }\n\n this.year = timestamp.getYear().valueOf();\n this.month = timestamp.getMonth().getIndex() + 1;\n this.day = timestamp.getDay().valueOf();\n }\n\n public isAfter(date: CalendarDay): boolean {\n return this.valueOf() > date.valueOf();\n }\n\n public isBefore(date: CalendarDay): boolean {\n return this.valueOf() < date.valueOf();\n }\n\n public getYear(): number {\n return this.year;\n }\n\n public getMonth(): Month {\n return new Month(this.month);\n }\n\n public getMonthOfYear(): MonthOfYear {\n return new MonthOfYear(this.month, this.year);\n }\n\n public getDay(): Day {\n return new Day(this.day);\n }\n\n public getDayOfWeek(): DayOfWeek {\n return DayOfWeek.fromNumber(this.toTimestamp().getDayOfWeek());\n }\n\n public toTimestamp(): Timestamp {\n const date = new Date(0);\n date.setUTCHours(0, 0, 0, 0);\n date.setUTCFullYear(this.year, this.month - 1, this.day);\n\n return new Timestamp(date);\n }\n}\n","import { InvalidHourError } from '../../errors/InvalidHourError';\nimport { InvalidMinutesError } from '../../errors/InvalidMinutesError';\nimport { assert } from '../../patterns/Assert';\nimport { StringValueObject } from '../StringValueObject';\n\nexport class Hour extends StringValueObject {\n private readonly minutes!: string;\n private readonly hours!: string;\n\n private static addTrailZero(value: number): string {\n return value < 10 ? `0${value}` : value.toString();\n }\n\n private static normalizeMinutes(totalMinutes: number): number {\n const minutesPerDay = 24 * 60;\n\n return ((totalMinutes % minutesPerDay) + minutesPerDay) % minutesPerDay;\n }\n\n private static parseFromNumber(value: number, minutes: number): string[] {\n assert(\n Number.isInteger(value) && value >= 0 && value <= 23,\n new InvalidHourError(),\n );\n assert(\n Number.isInteger(minutes) && minutes >= 0 && minutes <= 59,\n new InvalidMinutesError(),\n );\n\n return [Hour.addTrailZero(value), Hour.addTrailZero(minutes)];\n }\n\n private static parseFromString(value: string): string[] {\n const parts = value.split(':');\n\n assert(parts.length === 2 && parts[1] !== '', new InvalidHourError());\n\n const [hours, minutes] = parts;\n\n assert(/^\\d{1,2}$/.test(hours), new InvalidHourError());\n assert(/^\\d{1,2}$/.test(minutes), new InvalidMinutesError());\n\n const parsedHours = Number(hours);\n const parsedMinutes = Number(minutes);\n\n assert(parsedHours >= 0 && parsedHours <= 23, new InvalidHourError());\n assert(\n parsedMinutes >= 0 && parsedMinutes <= 59,\n new InvalidMinutesError(),\n );\n\n return [Hour.addTrailZero(parsedHours), Hour.addTrailZero(parsedMinutes)];\n }\n\n constructor(value: string);\n constructor(value: number, minutes?: number);\n constructor(value: string | number, minutes?: number) {\n let parsed: string[] | undefined;\n\n if (value !== null && value !== undefined) {\n parsed =\n typeof value === 'number' && minutes !== undefined\n ? Hour.parseFromNumber(value, minutes)\n : Hour.parseFromString(value as string);\n }\n\n super(parsed && `${parsed[0]}:${parsed[1]}`);\n\n if (parsed === undefined) {\n return this;\n }\n\n [this.hours, this.minutes] = parsed;\n }\n\n public addMinutes(minutes: number): Hour {\n const currentMinutes = Number(this.hours) * 60 + Number(this.minutes);\n const normalizedMinutes = Hour.normalizeMinutes(currentMinutes + minutes);\n const newHour = Math.floor(normalizedMinutes / 60);\n const newMinutes = normalizedMinutes % 60;\n\n return new Hour(newHour, newMinutes);\n }\n\n public diffInMinutes(other: Hour): number {\n let endHour = Number(other.hours);\n\n if (\n other.hours < this.hours ||\n (other.hours === this.hours && other.minutes < this.minutes)\n ) {\n endHour += 24;\n }\n\n const totalMinutes =\n (endHour - Number(this.hours)) * 60 +\n (Number(other.minutes) - Number(this.minutes));\n\n return totalMinutes;\n }\n\n public getMinutes(): number {\n return Number(this.minutes);\n }\n\n public getHours(): number {\n return Number(this.hours);\n }\n\n public isGreaterThan(hour: Hour): boolean {\n if (this.hours === hour.hours) {\n return Number(this.minutes) > Number(hour.minutes);\n }\n\n return Number(this.hours) > Number(hour.hours);\n }\n\n public isLessThan(hour: Hour): boolean {\n if (this.hours === hour.hours) {\n return Number(this.minutes) < Number(hour.minutes);\n }\n\n return Number(this.hours) < Number(hour.hours);\n }\n}\n","import { InvalidColorError } from '../errors/InvalidColorError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { StringValueObject } from './StringValueObject';\nimport { ValueObject } from './ValueObject';\n\nexport class Color extends StringValueObject {\n public static readonly RED = new Color('#FF0000');\n public static readonly GREEN = new Color('#00FF00');\n public static readonly BLUE = new Color('#0000FF');\n public static readonly BLACK = new Color('#000000');\n public static readonly WHITE = new Color('#FFFFFF');\n public static readonly YELLOW = new Color('#FFFF00');\n public static readonly CYAN = new Color('#00FFFF');\n public static readonly MAGENTA = new Color('#FF00FF');\n public static readonly ORANGE = new Color('#FFA500');\n public static readonly PURPLE = new Color('#800080');\n public static readonly PINK = new Color('#FFC0CB');\n public static readonly BROWN = new Color('#A52A2A');\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf());\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsValidColor();\n }\n\n private ensureIsValidColor(): void {\n const hexColorPattern = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/;\n\n assert(hexColorPattern.test(this.value), new InvalidColorError(this.value));\n }\n\n public hasValue(other: unknown): boolean {\n const otherValue = other instanceof ValueObject ? other.valueOf() : other;\n\n return (\n typeof otherValue === 'string' &&\n this.value.toLowerCase() === otherValue.toLowerCase()\n );\n }\n}\n","import { InvalidEmailError } from '../errors/InvalidEmailError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { StringValueObject } from './StringValueObject';\n\nexport class Email extends StringValueObject {\n private static readonly MAX_LENGTH = 254;\n private static readonly PATTERN =\n /^[\\w+\\-.!#$%&'*/=?^`{|}~]{1,64}@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+(?:[a-z]{2,63}|xn--[a-z0-9](?:[a-z0-9-]{0,57}[a-z0-9])?)$/i;\n\n constructor(value: string | StringValueObject) {\n super(value?.valueOf(), Email.MAX_LENGTH);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n this.ensureIsValidEmail(this.value);\n }\n\n private ensureIsValidEmail(value: string): void {\n assert(Email.PATTERN.test(value), new InvalidEmailError(value));\n }\n}\n","import { InvalidPasswordError } from '../errors/InvalidPasswordError';\nimport { assert } from '../patterns';\nimport { NullObject } from './NullObject';\nimport { StringValueObject } from './StringValueObject';\n\nexport class Password extends StringValueObject {\n private static readonly MAX_LENGTH = 256;\n private static readonly MIN_LENGTH = 12;\n\n constructor(value: string | StringValueObject) {\n super(value);\n\n if (NullObject.isNullObject(this)) {\n return this;\n }\n\n assert(\n this.isValidPassword(),\n new InvalidPasswordError(Password.MIN_LENGTH, Password.MAX_LENGTH),\n );\n }\n\n private isValidPassword(): boolean {\n return (\n this.value.length >= Password.MIN_LENGTH &&\n this.value.length <= Password.MAX_LENGTH &&\n /[A-Z]/.test(this.value) &&\n /[a-z]/.test(this.value) &&\n /[0-9]/.test(this.value) &&\n /[^A-Za-z0-9]/.test(this.value)\n );\n }\n}\n","interface ComparableItem {\n isEqual(item: unknown): boolean;\n}\n\nexport class UniqueObjectArray<\n T extends ComparableItem,\n> implements Iterable<T> {\n private readonly items: readonly T[];\n private readonly buckets = new Map<string, T[]>();\n\n private static keyOf(item: ComparableItem): string {\n return `${item.constructor.name}:${String(item.valueOf())}`;\n }\n\n public static fromArray<T extends ComparableItem>(\n array: Iterable<T>,\n ): UniqueObjectArray<T> {\n return new UniqueObjectArray<T>(array);\n }\n\n constructor(items: Iterable<T> = []) {\n const unique: T[] = [];\n\n for (const item of items) {\n const key = UniqueObjectArray.keyOf(item);\n const bucket = this.buckets.get(key);\n\n if (bucket === undefined) {\n this.buckets.set(key, [item]);\n unique.push(item);\n } else if (!bucket.some((one) => one.isEqual(item))) {\n bucket.push(item);\n unique.push(item);\n }\n }\n\n this.items = unique;\n }\n\n public get length(): number {\n return this.items.length;\n }\n\n public includes(item: T): boolean {\n const bucket = this.buckets.get(UniqueObjectArray.keyOf(item));\n\n return bucket !== undefined && bucket.some((one) => one.isEqual(item));\n }\n\n public push(...items: T[]): UniqueObjectArray<T> {\n return new UniqueObjectArray<T>([...this.items, ...items]);\n }\n\n public remove(item: T): UniqueObjectArray<T> {\n return this.filter((one) => !one.isEqual(item));\n }\n\n public isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n public at(index: number): T | undefined {\n return this.items.at(index);\n }\n\n public find(predicate: (item: T, index: number) => boolean): T | undefined {\n return this.items.find(predicate);\n }\n\n public filter(\n predicate: (item: T, index: number) => boolean,\n ): UniqueObjectArray<T> {\n return new UniqueObjectArray<T>(this.items.filter(predicate));\n }\n\n public map<U>(callback: (item: T, index: number) => U): U[] {\n return this.items.map(callback);\n }\n\n public some(predicate: (item: T, index: number) => boolean): boolean {\n return this.items.some(predicate);\n }\n\n public every(predicate: (item: T, index: number) => boolean): boolean {\n return this.items.every(predicate);\n }\n\n public forEach(callback: (item: T, index: number) => void): void {\n this.items.forEach(callback);\n }\n\n public reduce<U>(\n callback: (accumulator: U, item: T, index: number) => U,\n initialValue: U,\n ): U {\n return this.items.reduce(callback, initialValue);\n }\n\n public [Symbol.iterator](): Iterator<T> {\n return this.items[Symbol.iterator]();\n }\n\n public toArray(): T[] {\n return Array.from(this.items);\n }\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -220,11 +220,11 @@ export declare class Duration extends NumberValueObject {
|
|
|
220
220
|
private static readonly MILLISECOND_FACTOR;
|
|
221
221
|
private static readonly SECOND_UNITS;
|
|
222
222
|
private static readonly millisecondFactors;
|
|
223
|
-
static fromDays(days: number | NumberValueObject):
|
|
224
|
-
static fromHours(hours: number | NumberValueObject):
|
|
225
|
-
static fromMinutes(minutes: number | NumberValueObject):
|
|
226
|
-
static fromSeconds(seconds: number | NumberValueObject):
|
|
227
|
-
static fromMilliseconds(milliseconds: number | NumberValueObject):
|
|
223
|
+
static fromDays<T extends Duration = Duration>(this: new (milliseconds: NumberValueObject) => T, days: number | NumberValueObject): T;
|
|
224
|
+
static fromHours<T extends Duration = Duration>(this: new (milliseconds: NumberValueObject) => T, hours: number | NumberValueObject): T;
|
|
225
|
+
static fromMinutes<T extends Duration = Duration>(this: new (milliseconds: NumberValueObject) => T, minutes: number | NumberValueObject): T;
|
|
226
|
+
static fromSeconds<T extends Duration = Duration>(this: new (milliseconds: NumberValueObject) => T, seconds: number | NumberValueObject): T;
|
|
227
|
+
static fromMilliseconds<T extends Duration = Duration>(this: new (milliseconds: NumberValueObject) => T, milliseconds: number | NumberValueObject): T;
|
|
228
228
|
constructor(milliseconds: NumberValueObject | Duration);
|
|
229
229
|
getTotalDays(): NumberValueObject;
|
|
230
230
|
getTotalHours(): NumberValueObject;
|
|
@@ -308,9 +308,9 @@ export declare class Timestamp extends ValueObject<number> {
|
|
|
308
308
|
private static getLastDayOfUtcMonth;
|
|
309
309
|
private static ensureCalendarDelta;
|
|
310
310
|
private static createUtcCalendarValue;
|
|
311
|
-
static new(value: TimestampValue):
|
|
312
|
-
static now():
|
|
313
|
-
static fromSeconds(seconds: number | NumberValueObject):
|
|
311
|
+
static new<T extends Timestamp = Timestamp>(this: new (value?: TimestampValue) => T, value: TimestampValue): T;
|
|
312
|
+
static now<T extends Timestamp = Timestamp>(this: new (value?: TimestampValue) => T): T;
|
|
313
|
+
static fromSeconds<T extends Timestamp = Timestamp>(this: new (value?: TimestampValue) => T, seconds: number | NumberValueObject): T;
|
|
314
314
|
constructor(value?: TimestampValue);
|
|
315
315
|
toExactHour(): Timestamp;
|
|
316
316
|
toMilliseconds(): number;
|
|
@@ -436,7 +436,7 @@ export declare class ShortId extends ValueObject<string> {
|
|
|
436
436
|
private static readonly LENGTH;
|
|
437
437
|
private static readonly PATTERN;
|
|
438
438
|
private static generateObjectIdHex;
|
|
439
|
-
static generate():
|
|
439
|
+
static generate<T extends ShortId = ShortId>(this: new (value: string) => T): T;
|
|
440
440
|
constructor(value: string | StringValueObject);
|
|
441
441
|
private ensureIsShortId;
|
|
442
442
|
}
|
|
@@ -446,7 +446,7 @@ export declare class UUID extends ValueObject<string> {
|
|
|
446
446
|
private static readonly LENGTH;
|
|
447
447
|
private static readonly PATTERN;
|
|
448
448
|
private static readonly SENTINEL_PATTERN;
|
|
449
|
-
static generate():
|
|
449
|
+
static generate<T extends UUID = UUID>(this: new (value: string) => T): T;
|
|
450
450
|
constructor(value: string | StringValueObject);
|
|
451
451
|
private ensureIsUUID;
|
|
452
452
|
}
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors/BaseError.ts","../src/errors/DomainError.ts","../src/errors/CurrencyMismatchError.ts","../src/errors/InvalidColorError.ts","../src/errors/InvalidDayError.ts","../src/errors/InvalidDayFormatError.ts","../src/errors/InvalidHourError.ts","../src/errors/InvalidEmailError.ts","../src/errors/InvalidFormatError.ts","../src/errors/InvalidHashError.ts","../src/errors/InvalidIntegerError.ts","../src/errors/InvalidLatitudeError.ts","../src/errors/InvalidLongitudeError.ts","../src/errors/InvalidMinutesError.ts","../src/errors/InvalidMoneyError.ts","../src/errors/InvalidNumberError.ts","../src/errors/InvalidPasswordError.ts","../src/errors/InvalidPositiveNumberError.ts","../src/errors/InvalidStringLengthError.ts","../src/types/Primitive.ts","../src/types/Nullish.ts","../src/value-objects/ValueObject.ts","../src/value-objects/NumberValueObject.ts","../src/value-objects/Integer.ts","../src/value-objects/time/Day.ts","../src/value-objects/Enum.ts","../src/value-objects/time/DayOfWeek.ts","../src/value-objects/time/Month.ts","../src/interfaces/PrimitiveOf.ts","../src/value-objects/time/Duration.ts","../src/value-objects/time/TimestampInterval.ts","../src/value-objects/time/Year.ts","../src/value-objects/time/MonthOfYear.ts","../src/value-objects/time/CalendarDay.ts","../src/value-objects/time/Timestamp.ts","../src/errors/InvalidTimestampIntervalError.ts","../src/errors/InvalidLengthError.ts","../src/errors/NullObjectCreationDisabledError.ts","../src/errors/NullObjectError.ts","../src/errors/ValueNotInEnumError.ts","../src/patterns/Assert.ts","../src/value-objects/StringValueObject.ts","../src/value-objects/coordinates/Latitude.ts","../src/value-objects/coordinates/Longitude.ts","../src/value-objects/coordinates/Coordinates.ts","../src/value-objects/hashes/Hash.ts","../src/value-objects/hashes/MD5Hash.ts","../src/value-objects/hashes/SHA256Hash.ts","../src/value-objects/hashes/SHA512Hash.ts","../src/value-objects/ids/ShortId.ts","../src/value-objects/ids/UUID.ts","../src/value-objects/media/Media.ts","../src/value-objects/money/Currency.ts","../src/value-objects/money/Money.ts","../src/value-objects/time/Hour.ts","../src/value-objects/Color.ts","../src/value-objects/Email.ts","../src/value-objects/Password.ts","../src/value-objects/PositiveNumber.ts","../src/value-objects/NullObject.ts","../src/value-objects/UniqueObjectArray.ts"],"mappings":";qBAAa,kBAAkB;mBACZ;SACH,YAAY;EAId,YAAA,iBAAiB;EAMtB;EAIA;;;;qBCdI,oBAAoB;qBACZ;SACL,cAAc;EAIhB,YAAA;;;;qBCND,8BAA8B;EAC7B,YAAA,kBAAkB;;;;qBCDnB,0BAA0B;EACzB,YAAA;;;;qBCDD,wBAAwB;EACvB,YAAA;;;;qBCDD,8BAA8B;EAC7B,YAAA;;;;qBCDD,yBAAyB;EAAA;;;;qBCAzB,0BAA0B;EACzB,YAAA;;;;qBCDD,2BAA2B;EAC1B,YAAA;;;;qBCDD,yBAAyB;EACxB,YAAA,cAAc;;;;qBCDf,4BAA4B;EAC3B,YAAA;;;;qBCDD,6BAA6B;EAC5B,YAAA;;;;qBCDD,8BAA8B;EAC7B,YAAA;;;;qBCDD,4BAA4B;EAAA;;;;qBCA5B,0BAA0B;EACzB,YAAA;;;;qBCDD,2BAA2B;EAC1B,YAAA;;;;qBCDD,6BAA6B;EAC5B,YAAA,mBAAmB;;;;qBCDpB,mCAAmC;EAAA;;;;qBCAnC,iCAAiC;EAChC,YAAA,eAAe;;;;YCHjB;;;YCAA;;;8BCIU,YAAY,UAAU,YAAY;iBACvC;qBAEI,OAAQ;SAEb;SAIA;EAIF,YAAA,OAAO,IAAI;UAgBf;YAIE,MAAM,OAAO;EAMhB,SAAS;EAMT,QAAQ;EAQR,WAAW;EAIX,WAAW;EAIX;EAIA,UAAU;;;;qBChEN,0BAA0B;EACzB,YAAA,gBAAgB;UAUpB;EAID;EAIA,cAAc,gBAAgB;EAI9B,qBAAqB,gBAAgB;EAIrC,WAAW,gBAAgB;EAI3B,kBAAkB,gBAAgB;EAIlC,IAAI,gBAAgB,oBAAoB;EAIxC,SAAS,gBAAgB,oBAAoB;EAI7C,SAAS,gBAAgB,oBAAoB;EAI7C,OAAO,gBAAgB,oBAAoB;;;;qBC/CvC,gBAAgB;EACf,YAAA,gBAAgB;UASpB;;;;qBCTG,YAAY;EACX,YAAA,gBAAgB;UAUpB;;;;8BCXY,KACpB,UAAU,YAAY,mBACd,YAAY;EACR,YAAA,OAAO;WAUH,aAAa;UAErB;;;;oBChBE;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;qBAGW;;;;;;;;;qBAUA,kBAAkB;SACf,QAAM;SACN,SAAO;SACP,WAAS;SACT,UAAQ;SACR,QAAM;SACN,UAAQ;SACR,QAAM;SAEN,WAAW,cAAc;SAWzB,cAAc,WAAW,YAAY;EAM5C;EAIA;;;;qBCtCI,cAAc;kBACF,SAAO;kBACP,UAAQ;kBACR,OAAK;kBACL,OAAK;kBACL,KAAG;kBACH,MAAI;kBACJ,MAAI;kBACJ,QAAM;kBACN,WAAS;kBACT,SAAO;kBACP,UAAQ;kBACR,UAAQ;EAExB;EAIA;;;;KCjCJ,kBACD,YACA;GAEG,cAAc;;YAGT,YAAY;EAAY,gBAAgB;KAClD,WAAW;;;qBCRA,iBAAiB;0BACJ;0BACA;0BAUA;SAwBV,SAAS,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors/BaseError.ts","../src/errors/DomainError.ts","../src/errors/CurrencyMismatchError.ts","../src/errors/InvalidColorError.ts","../src/errors/InvalidDayError.ts","../src/errors/InvalidDayFormatError.ts","../src/errors/InvalidHourError.ts","../src/errors/InvalidEmailError.ts","../src/errors/InvalidFormatError.ts","../src/errors/InvalidHashError.ts","../src/errors/InvalidIntegerError.ts","../src/errors/InvalidLatitudeError.ts","../src/errors/InvalidLongitudeError.ts","../src/errors/InvalidMinutesError.ts","../src/errors/InvalidMoneyError.ts","../src/errors/InvalidNumberError.ts","../src/errors/InvalidPasswordError.ts","../src/errors/InvalidPositiveNumberError.ts","../src/errors/InvalidStringLengthError.ts","../src/types/Primitive.ts","../src/types/Nullish.ts","../src/value-objects/ValueObject.ts","../src/value-objects/NumberValueObject.ts","../src/value-objects/Integer.ts","../src/value-objects/time/Day.ts","../src/value-objects/Enum.ts","../src/value-objects/time/DayOfWeek.ts","../src/value-objects/time/Month.ts","../src/interfaces/PrimitiveOf.ts","../src/value-objects/time/Duration.ts","../src/value-objects/time/TimestampInterval.ts","../src/value-objects/time/Year.ts","../src/value-objects/time/MonthOfYear.ts","../src/value-objects/time/CalendarDay.ts","../src/value-objects/time/Timestamp.ts","../src/errors/InvalidTimestampIntervalError.ts","../src/errors/InvalidLengthError.ts","../src/errors/NullObjectCreationDisabledError.ts","../src/errors/NullObjectError.ts","../src/errors/ValueNotInEnumError.ts","../src/patterns/Assert.ts","../src/value-objects/StringValueObject.ts","../src/value-objects/coordinates/Latitude.ts","../src/value-objects/coordinates/Longitude.ts","../src/value-objects/coordinates/Coordinates.ts","../src/value-objects/hashes/Hash.ts","../src/value-objects/hashes/MD5Hash.ts","../src/value-objects/hashes/SHA256Hash.ts","../src/value-objects/hashes/SHA512Hash.ts","../src/value-objects/ids/ShortId.ts","../src/value-objects/ids/UUID.ts","../src/value-objects/media/Media.ts","../src/value-objects/money/Currency.ts","../src/value-objects/money/Money.ts","../src/value-objects/time/Hour.ts","../src/value-objects/Color.ts","../src/value-objects/Email.ts","../src/value-objects/Password.ts","../src/value-objects/PositiveNumber.ts","../src/value-objects/NullObject.ts","../src/value-objects/UniqueObjectArray.ts"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haskou/value-objects",
|
|
3
|
-
"version": "8.3.
|
|
3
|
+
"version": "8.3.4",
|
|
4
4
|
"description": "TypeScript value objects for validated, immutable primitive values and small domain-safe data structures.",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.mjs",
|