@haskou/value-objects 8.0.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -240,6 +240,7 @@ try {
240
240
  | Identifiers | `ShortId`, `UUID` |
241
241
  | Date & time | `Timestamp`, `CalendarDay`, `Hour`, `Duration`, `MonthOfYear` |
242
242
  | Coordinates | `Latitude`, `Longitude`, `Coordinates` |
243
+ | Money | `Money`, `Currency` |
243
244
  | Hashes | `MD5Hash`, `SHA256Hash`, `SHA512Hash` |
244
245
  | Media | `Media` |
245
246
  | Collections | `UniqueObjectArray` |
package/dist/index.cjs CHANGED
@@ -29,6 +29,13 @@ var DomainError = class extends BaseError {
29
29
  }
30
30
  };
31
31
  //#endregion
32
+ //#region src/errors/CurrencyMismatchError.ts
33
+ var CurrencyMismatchError = class extends DomainError {
34
+ constructor(expected, received) {
35
+ super(`Currency mismatch: expected ${expected}, received ${received}`);
36
+ }
37
+ };
38
+ //#endregion
32
39
  //#region src/errors/InvalidColorError.ts
33
40
  var InvalidColorError = class extends DomainError {
34
41
  constructor(value) {
@@ -106,6 +113,13 @@ var InvalidMinutesError = class extends DomainError {
106
113
  }
107
114
  };
108
115
  //#endregion
116
+ //#region src/errors/InvalidMoneyError.ts
117
+ var InvalidMoneyError = class extends DomainError {
118
+ constructor(value) {
119
+ super(`Invalid money ${String(value)}`);
120
+ }
121
+ };
122
+ //#endregion
109
123
  //#region src/errors/InvalidNumberError.ts
110
124
  var InvalidNumberError = class extends DomainError {
111
125
  constructor(invalidNumber) {
@@ -490,6 +504,81 @@ var Media = class Media extends ValueObject {
490
504
  }
491
505
  };
492
506
  //#endregion
507
+ //#region src/value-objects/Enum.ts
508
+ var Enum = class extends ValueObject {
509
+ constructor(value) {
510
+ super(value);
511
+ if (NullObject.isNullObject(this)) return this;
512
+ this.ensureIsValidValue();
513
+ }
514
+ ensureIsValidValue() {
515
+ assert(this.getValues().some((enumValue) => this.hasValue(enumValue)), new ValueNotInEnumError(this.valueOf(), this.getValues()));
516
+ }
517
+ };
518
+ //#endregion
519
+ //#region src/value-objects/money/Currency.ts
520
+ var Currency = class Currency extends Enum {
521
+ static MINOR_UNIT_DIGITS = {
522
+ AED: 2,
523
+ ARS: 2,
524
+ AUD: 2,
525
+ BRL: 2,
526
+ CAD: 2,
527
+ CHF: 2,
528
+ CLP: 0,
529
+ CNY: 2,
530
+ COP: 2,
531
+ CRC: 2,
532
+ CZK: 2,
533
+ DKK: 2,
534
+ EUR: 2,
535
+ GBP: 2,
536
+ HKD: 2,
537
+ HUF: 2,
538
+ IDR: 2,
539
+ ILS: 2,
540
+ INR: 2,
541
+ ISK: 0,
542
+ JPY: 0,
543
+ KRW: 0,
544
+ KWD: 3,
545
+ MXN: 2,
546
+ NOK: 2,
547
+ NZD: 2,
548
+ PEN: 2,
549
+ PLN: 2,
550
+ RON: 2,
551
+ SEK: 2,
552
+ SGD: 2,
553
+ THB: 2,
554
+ TRY: 2,
555
+ USD: 2,
556
+ ZAR: 2
557
+ };
558
+ static SYMBOLS = {
559
+ $: "USD",
560
+ "£": "GBP",
561
+ "¥": "JPY",
562
+ "₡": "CRC",
563
+ "₩": "KRW",
564
+ "₪": "ILS",
565
+ "€": "EUR",
566
+ "₹": "INR",
567
+ "₺": "TRY"
568
+ };
569
+ static fromSymbol(symbol) {
570
+ const code = Currency.SYMBOLS[symbol];
571
+ assert(code, new InvalidFormatError(symbol));
572
+ return new Currency(code);
573
+ }
574
+ getValues() {
575
+ return Object.keys(Currency.MINOR_UNIT_DIGITS);
576
+ }
577
+ getMinorUnitDigits() {
578
+ return Currency.MINOR_UNIT_DIGITS[this.valueOf()];
579
+ }
580
+ };
581
+ //#endregion
493
582
  //#region src/value-objects/Integer.ts
494
583
  var Integer = class extends NumberValueObject {
495
584
  constructor(value) {
@@ -502,6 +591,91 @@ var Integer = class extends NumberValueObject {
502
591
  }
503
592
  };
504
593
  //#endregion
594
+ //#region src/value-objects/money/Money.ts
595
+ var Money = class Money extends ValueObject {
596
+ static FORMAT = /^(-?)(\d+)(?:\.(\d+))? ([A-Z]{3})$/;
597
+ static TEXT_FORMAT = /^(-?)(?:([^\d\s.-]+)\s*)?(\d+(?:\.\d+)?)(?:\s*([^\d\s.-]+))?$/;
598
+ currency;
599
+ minorUnits;
600
+ static fromMinorUnits(minorUnits, currency) {
601
+ const units = new Integer(minorUnits.valueOf());
602
+ assert(Number.isSafeInteger(units.valueOf()), new InvalidMoneyError(units));
603
+ const code = new Currency(currency.valueOf());
604
+ const digits = code.getMinorUnitDigits();
605
+ const padded = String(Math.abs(units.valueOf())).padStart(digits + 1, "0");
606
+ const integer = padded.slice(0, padded.length - digits);
607
+ const fraction = digits > 0 ? `.${padded.slice(padded.length - digits)}` : "";
608
+ const sign = units.isLessThan(0) ? "-" : "";
609
+ return new Money(`${sign}${integer}${fraction} ${code}`);
610
+ }
611
+ static fromString(text) {
612
+ const match = Money.TEXT_FORMAT.exec(text.trim());
613
+ assert(match, new InvalidMoneyError(text));
614
+ const [, sign, prefix, amount, suffix] = match;
615
+ assert(!prefix !== !suffix, new InvalidMoneyError(text));
616
+ const token = prefix ?? suffix;
617
+ const currency = /^[A-Za-z]{3}$/.test(token) ? new Currency(token.toUpperCase()) : Currency.fromSymbol(token);
618
+ const [integer, fraction = ""] = amount.split(".");
619
+ const digits = currency.getMinorUnitDigits();
620
+ assert(fraction.length <= digits, new InvalidMoneyError(text));
621
+ return Money.fromMinorUnits(Number(`${sign}${integer}${fraction.padEnd(digits, "0")}`), currency);
622
+ }
623
+ constructor(value) {
624
+ super(value?.valueOf());
625
+ if (NullObject.isNullObject(this)) return this;
626
+ const match = Money.FORMAT.exec(this.value);
627
+ assert(match, new InvalidMoneyError(this.value));
628
+ const [, sign, integer, fraction = "", code] = match;
629
+ const currency = new Currency(code);
630
+ const minorUnits = new Integer(Number(`${sign}${integer}${fraction}`));
631
+ assert(fraction.length === currency.getMinorUnitDigits() && Number.isSafeInteger(minorUnits.valueOf()) && !(sign && minorUnits.isZero()), new InvalidMoneyError(this.value));
632
+ Object.defineProperties(this, {
633
+ currency: {
634
+ enumerable: false,
635
+ value: currency
636
+ },
637
+ minorUnits: {
638
+ enumerable: false,
639
+ value: minorUnits
640
+ }
641
+ });
642
+ }
643
+ ensureSameCurrency(other) {
644
+ assert(this.currency.isEqual(other.currency), new CurrencyMismatchError(this.currency.valueOf(), other.currency.valueOf()));
645
+ }
646
+ getCurrency() {
647
+ return this.currency;
648
+ }
649
+ getMinorUnits() {
650
+ return this.minorUnits;
651
+ }
652
+ isZero() {
653
+ return this.minorUnits.isZero();
654
+ }
655
+ isNegative() {
656
+ return this.minorUnits.isLessThan(0);
657
+ }
658
+ isGreaterThan(other) {
659
+ this.ensureSameCurrency(other);
660
+ return this.minorUnits.isGreaterThan(other.minorUnits);
661
+ }
662
+ isLessThan(other) {
663
+ this.ensureSameCurrency(other);
664
+ return this.minorUnits.isLessThan(other.minorUnits);
665
+ }
666
+ add(other) {
667
+ this.ensureSameCurrency(other);
668
+ return Money.fromMinorUnits(this.minorUnits.add(other.minorUnits), this.currency);
669
+ }
670
+ subtract(other) {
671
+ this.ensureSameCurrency(other);
672
+ return Money.fromMinorUnits(this.minorUnits.subtract(other.minorUnits), this.currency);
673
+ }
674
+ multiply(factor) {
675
+ return Money.fromMinorUnits(Math.round(this.minorUnits.valueOf() * factor), this.currency);
676
+ }
677
+ };
678
+ //#endregion
505
679
  //#region src/value-objects/time/Day.ts
506
680
  var Day = class extends Integer {
507
681
  constructor(value) {
@@ -514,18 +688,6 @@ var Day = class extends Integer {
514
688
  }
515
689
  };
516
690
  //#endregion
517
- //#region src/value-objects/Enum.ts
518
- var Enum = class extends ValueObject {
519
- constructor(value) {
520
- super(value);
521
- if (NullObject.isNullObject(this)) return this;
522
- this.ensureIsValidValue();
523
- }
524
- ensureIsValidValue() {
525
- assert(this.getValues().some((enumValue) => this.hasValue(enumValue)), new ValueNotInEnumError(this.valueOf(), this.getValues()));
526
- }
527
- };
528
- //#endregion
529
691
  //#region src/value-objects/time/DayOfWeek.ts
530
692
  let EDaysOfWeek = /* @__PURE__ */ function(EDaysOfWeek) {
531
693
  EDaysOfWeek["MONDAY"] = "monday";
@@ -1235,6 +1397,8 @@ exports.BaseError = BaseError;
1235
1397
  exports.CalendarDay = CalendarDay;
1236
1398
  exports.Color = Color;
1237
1399
  exports.Coordinates = Coordinates;
1400
+ exports.Currency = Currency;
1401
+ exports.CurrencyMismatchError = CurrencyMismatchError;
1238
1402
  exports.Day = Day;
1239
1403
  exports.DayOfWeek = DayOfWeek;
1240
1404
  exports.DomainError = DomainError;
@@ -1257,6 +1421,7 @@ exports.InvalidLatitudeError = InvalidLatitudeError;
1257
1421
  exports.InvalidLengthError = InvalidLengthError;
1258
1422
  exports.InvalidLongitudeError = InvalidLongitudeError;
1259
1423
  exports.InvalidMinutesError = InvalidMinutesError;
1424
+ exports.InvalidMoneyError = InvalidMoneyError;
1260
1425
  exports.InvalidNumberError = InvalidNumberError;
1261
1426
  exports.InvalidPasswordError = InvalidPasswordError;
1262
1427
  exports.InvalidPositiveNumberError = InvalidPositiveNumberError;
@@ -1266,6 +1431,7 @@ exports.Latitude = Latitude;
1266
1431
  exports.Longitude = Longitude;
1267
1432
  exports.MD5Hash = MD5Hash;
1268
1433
  exports.Media = Media;
1434
+ exports.Money = Money;
1269
1435
  exports.Month = Month;
1270
1436
  exports.MonthOfYear = MonthOfYear;
1271
1437
  exports.NullObject = NullObject;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/errors/BaseError.ts","../src/errors/DomainError.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/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/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/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 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 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","import { InvalidStringLengthError } from '../errors/InvalidStringLengthError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { ValueObject } from './ValueObject';\n\nexport class StringValueObject extends ValueObject<string> {\n constructor(value: string | StringValueObject, maxLength: number = 512) {\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(Latitude.isValid(value), new InvalidLatitudeError(value.valueOf()));\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 Longitude.isValid(value),\n new InvalidLongitudeError(value.valueOf()),\n );\n super(value.valueOf());\n }\n}\n","import { 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 super(latitude?.valueOf() + ',' + longitude?.valueOf());\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 { 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 { InvalidDayError } from '../../errors/InvalidDayError';\nimport { assert } from '../../patterns/Assert';\nimport { Integer } from '../Integer';\nimport { NumberValueObject } from '../NumberValueObject';\n\nexport class Day extends Integer {\n constructor(value: number | NumberValueObject) {\n super(value.valueOf());\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 { 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 { 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 { 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(Timestamp.valueMilliseconds(value));\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 date = new Date(this.valueOf());\n\n date.setSeconds(0);\n date.setMinutes(0);\n date.setMilliseconds(0);\n\n const value = Timestamp.new(date.getTime()).value;\n\n return this.clone(value);\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 { 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.valueOf()}-${end.valueOf()}`);\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 { 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 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 super(\n year.valueOf().toString() +\n '/' +\n month.valueOf().toString().padStart(2, '0'),\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;\n\n if (value !== undefined) {\n timestamp = CalendarDay.timestampFromValue(value);\n } else {\n timestamp = new Timestamp();\n }\n\n super(CalendarDay.generateStringValue(timestamp));\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 const [parsedHours, parsedMinutes] =\n typeof value === 'number' && minutes !== undefined\n ? Hour.parseFromNumber(value, minutes)\n : Hour.parseFromString(value as string);\n\n super(`${parsedHours}:${parsedMinutes}`);\n this.hours = parsedHours;\n this.minutes = parsedMinutes;\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 PATTERN =\n /^[\\w+\\-.!#$%&'*/=?^`{|}~]+@(?:[\\w-]+\\.)+(?:[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());\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","import { InvalidStringLengthError } from '../errors/InvalidStringLengthError';\nimport { assert } from '../patterns/Assert';\nimport { NullObject } from './NullObject';\nimport { ValueObject } from './ValueObject';\n\nexport class StringValueObject extends ValueObject<string> {\n constructor(value: string | StringValueObject, maxLength: number = 512) {\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(Latitude.isValid(value), new InvalidLatitudeError(value.valueOf()));\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 Longitude.isValid(value),\n new InvalidLongitudeError(value.valueOf()),\n );\n super(value.valueOf());\n }\n}\n","import { 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 super(latitude?.valueOf() + ',' + longitude?.valueOf());\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 { NumberValueObject } from '../NumberValueObject';\n\nexport class Day extends Integer {\n constructor(value: number | NumberValueObject) {\n super(value.valueOf());\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 { 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(Timestamp.valueMilliseconds(value));\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 date = new Date(this.valueOf());\n\n date.setSeconds(0);\n date.setMinutes(0);\n date.setMilliseconds(0);\n\n const value = Timestamp.new(date.getTime()).value;\n\n return this.clone(value);\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 { 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.valueOf()}-${end.valueOf()}`);\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 { 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 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 super(\n year.valueOf().toString() +\n '/' +\n month.valueOf().toString().padStart(2, '0'),\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;\n\n if (value !== undefined) {\n timestamp = CalendarDay.timestampFromValue(value);\n } else {\n timestamp = new Timestamp();\n }\n\n super(CalendarDay.generateStringValue(timestamp));\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 const [parsedHours, parsedMinutes] =\n typeof value === 'number' && minutes !== undefined\n ? Hour.parseFromNumber(value, minutes)\n : Hour.parseFromString(value as string);\n\n super(`${parsedHours}:${parsedMinutes}`);\n this.hours = parsedHours;\n this.minutes = parsedMinutes;\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 PATTERN =\n /^[\\w+\\-.!#$%&'*/=?^`{|}~]+@(?:[\\w-]+\\.)+(?:[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());\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
@@ -14,6 +14,11 @@ export declare class DomainError extends BaseError {
14
14
  constructor(message: string);
15
15
  }
16
16
  //#endregion
17
+ //#region src/errors/CurrencyMismatchError.d.ts
18
+ export declare class CurrencyMismatchError extends DomainError {
19
+ constructor(expected: string, received: string);
20
+ }
21
+ //#endregion
17
22
  //#region src/errors/InvalidColorError.d.ts
18
23
  export declare class InvalidColorError extends DomainError {
19
24
  constructor(value: string);
@@ -69,6 +74,11 @@ export declare class InvalidMinutesError extends DomainError {
69
74
  constructor();
70
75
  }
71
76
  //#endregion
77
+ //#region src/errors/InvalidMoneyError.d.ts
78
+ export declare class InvalidMoneyError extends DomainError {
79
+ constructor(value: unknown);
80
+ }
81
+ //#endregion
72
82
  //#region src/errors/InvalidNumberError.d.ts
73
83
  export declare class InvalidNumberError extends DomainError {
74
84
  constructor(invalidNumber: unknown);
@@ -451,6 +461,36 @@ export declare class Media extends ValueObject<string> {
451
461
  hasValue(other: unknown): boolean;
452
462
  }
453
463
  //#endregion
464
+ //#region src/value-objects/money/Currency.d.ts
465
+ export declare class Currency extends Enum<string> {
466
+ private static readonly MINOR_UNIT_DIGITS;
467
+ private static readonly SYMBOLS;
468
+ static fromSymbol(symbol: string): Currency;
469
+ getValues(): string[];
470
+ getMinorUnitDigits(): number;
471
+ }
472
+ //#endregion
473
+ //#region src/value-objects/money/Money.d.ts
474
+ export declare class Money extends ValueObject<string> {
475
+ private static readonly FORMAT;
476
+ private static readonly TEXT_FORMAT;
477
+ private readonly currency;
478
+ private readonly minorUnits;
479
+ static fromMinorUnits(minorUnits: number | NumberValueObject, currency: string | Currency): Money;
480
+ static fromString(text: string): Money;
481
+ constructor(value: string | StringValueObject);
482
+ private ensureSameCurrency;
483
+ getCurrency(): Currency;
484
+ getMinorUnits(): Integer;
485
+ isZero(): boolean;
486
+ isNegative(): boolean;
487
+ isGreaterThan(other: Money): boolean;
488
+ isLessThan(other: Money): boolean;
489
+ add(other: Money): Money;
490
+ subtract(other: Money): Money;
491
+ multiply(factor: number): Money;
492
+ }
493
+ //#endregion
454
494
  //#region src/value-objects/time/Hour.d.ts
455
495
  export declare class Hour extends StringValueObject {
456
496
  private readonly minutes;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors/BaseError.ts","../src/errors/DomainError.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/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/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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"}
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;;;;qBC5DI,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;;;;qBCVG,YAAY;EACX,YAAA,gBAAgB;UAMpB;;;;8BCNY,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,oBAAoB;SAQ5C,UAAU,gBAAgB,oBAAoB;SAQ9C,YAAY,kBAAkB,oBAAoB;SAQlD,YAAY,kBAAkB,oBAAoB;SAQlD,iBACZ,uBAAuB,oBACtB;EAIS,YAAA,cAAc,oBAAoB;EAIvC,gBAAgB;EAIhB,iBAAiB;EAIjB,mBAAmB;EAInB,mBAAmB;EAInB,wBAAwB;EAIxB,WAAW;EAQX,YAAY;EAQZ,cAAc;EAUd,cAAc;EAUd,mBAAmB;;;;qBC9Hf,0BAA0B;mBAWlB;mBACA;SAXL,eACZ,YAAY,YAAY,qBACvB;EAQgB,YAAA,OAAO,WACP,KAAK;EAUjB;;;;EAOA,YAAY;EAIZ,UAAU;EAIV,eAAe;EAMf,mBAAmB,WAAW;EAmB9B,0BAA0B;EAc1B,uBACL,gBAAgB,oBACf;EAeI,SAAS,WAAW;;;;qBCnGhB,aAAa;0BACA;0BACA;EAEZ,YAAA,gBAAgB;EAQrB;EAIA;;;;qBCdI,oBAAoB;mBACd;mBACA;SAEH,cAAc,WAAW,YAAY;SAIrC,WAAW,gBAAgB;EAM7B,YAAA,gBAAgB,OAAO,eAAe;EAU3C,YAAY;EAIZ,WAAW;EAIX;EAIA,wBAAwB;;;;qBChCpB,oBAAoB;mBACd;mBACA;mBACA;iBAEF;iBAOA;iBAOA;iBAIA;iBAkBA;EAYH,YAAA,iBAAiB,gBAAgB;EAgBtC,QAAQ,MAAM;EAId,SAAS,MAAM;EAIf;EAIA,YAAY;EAIZ,kBAAkB;EAIlB,UAAU;EAIV,gBAAgB;EAIhB,eAAe;;;;KC/FnB,0BAA0B,OAAO;qBAEzB,kBAAkB;0BACL;iBAQT;iBAgBA;iBAqBA;iBAIA;SAsBD,IAAI,OAAO,iBAAiB;SAI5B,OAAO;SAIP,YAAY,kBAAkB,oBAAoB;EAI7C,YAAA,QAAQ;EASpB,eAAe;EAYf;EAIA;EAIA,UAAU;EAIV;EAIA,SAAS,OAAO;EAIhB,QAAQ,OAAO;EAIf,gBAAgB,OAAO;EAIvB,eAAe,OAAO;EAItB,gBAAgB,uBAAuB,oBAAoB;EAM3D,WAAW,kBAAkB,oBAAoB;EAMjD,WAAW,kBAAkB,oBAAoB;EAMjD,SAAS,gBAAgB,oBAAoB;EAM7C,QAAQ,eAAe,oBAAoB;EAM3C,SAAS,gBAAgB,oBAAoB;EAM7C,UAAU,iBAAiB,oBAAoB;EAwB/C,SAAS,gBAAgB,oBAAoB;EAsB7C,YAAY,UAAU,WAAW;EAMjC,UAAU,OAAO;EAIjB,YAAY,OAAO;EAInB,WAAW,OAAO;EAIlB,kBAAkB;EAIlB,UAAU;EAIV,YAAY;EAIZ,WAAW;EAIX;EAIA;EAIA;EAIA;EAIA;EAIA,kBAAkB;;;;qBC5Rd,sCAAsC;EACrC,YAAA,OAAO,WAAW,KAAK;;;;qBCFxB,2BAA2B;EAC1B,YAAA,gBAAgB;;;;qBCDjB,wCAAwC;EACvC,YAAA;;;;qBCDD,wBAAwB;EACvB,YAAA;;;;qBCDD,4BAA4B;EAC3B,YAAA,gBAAgB;;;;YCAlB,SAAS,QAAQ,YAAY;wBAEzB,OACd,0CACA,gBAAgB,iBACP;;;qBCHE,0BAA0B;EACzB,YAAA,gBAAgB,mBAAmB;UAUvC;EAOD;;;;qBCnBI,iBAAiB;iBACb;iBACA;iBAEA;EAUH,YAAA,gBAAgB;;;;qBCdjB,kBAAkB;iBACd;iBACA;iBAEA;EAUH,YAAA,gBAAgB;;;;qBCdjB,oBAAoB;UACvB;UACA;SAEM,WAAW,gBAAgB;EAO7B,YAAA,mBAAmB,UAAU,oBAAoB;EAOtD,eAAe;EAIf,gBAAgB;;;;8BCtBH,aAAa;EACrB,YAAA,iBAAiB;EAQtB,YAAY;;;;qBCPR,gBAAgB;SACb,QAAQ,eAAe;EAIzB,YAAA,iBAAiB;;;;qBCLlB,mBAAmB;SAChB,QAAQ,eAAe;EAIzB,YAAA,iBAAiB;;;;qBCLlB,mBAAmB;SAChB,QAAQ,eAAe;EAIzB,YAAA,iBAAiB;;;;qBCJlB,gBAAgB;0BACH;0BACA;iBAET;SAUD,YAAY;EAId,YAAA,gBAAgB;UASpB;;;;qBC3BG,aAAa;0BACA;0BACA;0BAGA;SAGV,YAAY;EAoBd,YAAA,gBAAgB;UASpB;;;;qBCzCG,cAAc;0BACD;mBAEP;EAEL,YAAA,gBAAgB;EAerB,aAAa;EAMb;EAIA;EAcA,SAAS;;;;qBC3CL,iBAAiB;0BACJ;0BAsCA;SAYV,WAAW,iBAAiB;EAOnC;EAIA;;;;qBCxDI,cAAc;0BACD;0BACA;mBAGP;mBACA;SAEH,eACZ,qBAAqB,mBACrB,mBAAmB,WAClB;SAeW,WAAW,eAAe;EAqB5B,YAAA,gBAAgB;UA2BpB;EAUD,eAAe;EAIf,iBAAiB;EAIjB;EAIA;EAIA,cAAc,OAAO;EAMrB,WAAW,OAAO;EAMlB,IAAI,OAAO,QAAQ;EASnB,SAAS,OAAO,QAAQ;EASxB,SAAS,iBAAiB;;;;qBCvItB,aAAa;mBACP;mBACA;iBAEF;iBAIA;iBAMA;iBAaA;EAsBH,YAAA;EACA,YAAA,eAAe;EAYpB,WAAW,kBAAkB;EAS7B,cAAc,OAAO;EAiBrB;EAIA;EAIA,cAAc,MAAM;EAQpB,WAAW,MAAM;;;;qBCvGb,cAAc;kBACF,KAAG;kBACH,OAAK;kBACL,MAAI;kBACJ,OAAK;kBACL,OAAK;kBACL,QAAM;kBACN,MAAI;kBACJ,SAAO;kBACP,QAAM;kBACN,QAAM;kBACN,MAAI;kBACJ,OAAK;EAEhB,YAAA,gBAAgB;UAUpB;EAMD,SAAS;;;;qBC/BL,cAAc;0BACD;EAGZ,YAAA,gBAAgB;UAUpB;;;;qBCdG,iBAAiB;0BACJ;0BACA;EAEZ,YAAA,gBAAgB;UAapB;;;;qBCjBG,uBAAuB;EACtB,YAAA,gBAAgB;UAUpB;;;;KCbL,YAAY,sBAAsB,gBAAgB;8BAOjC;iBACL;SAiCD,IAAI,GAAG,OAAO,YAAY,KAAK;SAY/B,aAAa;;;;UCxDnB;EACR,QAAQ;;qBAGG,kBACX,UAAU,2BACC,SAAS;mBACH;mBACA;iBAEF;SAID,UAAU,UAAU,gBAChC,OAAO,SAAS,KACf,kBAAkB;EAIT,YAAA,QAAO,SAAS;MAmBjB;EAIJ,SAAS,MAAM;EAMf,QAAQ,OAAO,MAAM,kBAAkB;EAIvC,OAAO,MAAM,IAAI,kBAAkB;EAInC;EAIA,GAAG,gBAAgB;EAInB,KAAK,YAAY,MAAM,GAAG,4BAA4B;EAItD,OACL,YAAY,MAAM,GAAG,4BACpB,kBAAkB;EAId,IAAI,GAAG,WAAW,MAAM,GAAG,kBAAkB,IAAI;EAIjD,KAAK,YAAY,MAAM,GAAG;EAI1B,MAAM,YAAY,MAAM,GAAG;EAI3B,QAAQ,WAAW,MAAM,GAAG;EAI5B,OAAO,GACZ,WAAW,aAAa,GAAG,MAAM,GAAG,kBAAkB,GACtD,cAAc,IACb;GAIK,OAAO,aAAa,SAAS;EAI9B,WAAW"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  import runtime from './index.cjs';
2
- export const { BaseError, CalendarDay, Color, Coordinates, Day, DayOfWeek, DomainError, Duration, EDaysOfWeek, Email, Enum, Hash, Hour, Integer, InvalidColorError, InvalidDayError, InvalidDayFormatError, InvalidEmailError, InvalidFormatError, InvalidHashError, InvalidHourError, InvalidIntegerError, InvalidLatitudeError, InvalidLengthError, InvalidLongitudeError, InvalidMinutesError, InvalidNumberError, InvalidPasswordError, InvalidPositiveNumberError, InvalidStringLengthError, InvalidTimestampIntervalError, Latitude, Longitude, MD5Hash, Media, Month, MonthOfYear, NullObject, NullObjectCreationDisabledError, NullObjectError, NumberValueObject, Password, PositiveNumber, SHA256Hash, SHA512Hash, ShortId, StringValueObject, Timestamp, TimestampInterval, UUID, UniqueObjectArray, ValueNotInEnumError, ValueObject, Year, assert, timeStampDayToDaysMap } = runtime;
2
+ export const { BaseError, CalendarDay, Color, Coordinates, Currency, CurrencyMismatchError, Day, DayOfWeek, DomainError, Duration, EDaysOfWeek, Email, Enum, Hash, Hour, Integer, InvalidColorError, InvalidDayError, InvalidDayFormatError, InvalidEmailError, InvalidFormatError, InvalidHashError, InvalidHourError, InvalidIntegerError, InvalidLatitudeError, InvalidLengthError, InvalidLongitudeError, InvalidMinutesError, InvalidMoneyError, InvalidNumberError, InvalidPasswordError, InvalidPositiveNumberError, InvalidStringLengthError, InvalidTimestampIntervalError, Latitude, Longitude, MD5Hash, Media, Money, Month, MonthOfYear, NullObject, NullObjectCreationDisabledError, NullObjectError, NumberValueObject, Password, PositiveNumber, SHA256Hash, SHA512Hash, ShortId, StringValueObject, Timestamp, TimestampInterval, UUID, UniqueObjectArray, ValueNotInEnumError, ValueObject, Year, assert, timeStampDayToDaysMap } = runtime;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haskou/value-objects",
3
- "version": "8.0.0",
3
+ "version": "8.1.0",
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",