4lessandrodev / type-ddd

This package provide utils files and interfaces to assistant build a complex application with domain driving design.
https://www.npmjs.com/package/@type-ddd/core
MIT License
253 stars 14 forks source link

Implement `DateValueObject` as an individual package #448

Closed 4lessandrodev closed 2 hours ago

4lessandrodev commented 2 hours ago

Implement a DateValueObject:


import { Result } from 'rich-domain';

interface IDateValueObject {
  // Instance Methods
  value(): Date;

  // Validation
  isBefore(date: DateValueObject | Date): boolean;
  isAfter(date: DateValueObject | Date): boolean;
  isGreaterThan(date: DateValueObject | Date): boolean;
  isLessThan(date: DateValueObject | Date): boolean;
  isEqual(date: DateValueObject | Date): boolean;

  // Date Arithmetic - Days
  addDays(days: number): DateValueObject;
  subtractDays(days: number): DateValueObject;
  differenceInDays(date: DateValueObject | Date): number;

  // Date Arithmetic - Months and Years
  addMonths(months: number): DateValueObject;
  addYears(years: number): DateValueObject;

  // Time Arithmetic - Hours
  addHours(hours: number): DateValueObject;
  subtractHours(hours: number): DateValueObject;
  differenceInHours(date: DateValueObject | Date): number;

  // Time Arithmetic - Minutes
  addMinutes(minutes: number): DateValueObject;
  subtractMinutes(minutes: number): DateValueObject;
  differenceInMinutes(date: DateValueObject | Date): number;

  // Time Arithmetic - Seconds
  addSeconds(seconds: number): DateValueObject;
  subtractSeconds(seconds: number): DateValueObject;
  differenceInSeconds(date: DateValueObject | Date): number;

  // Formatting
  format(locale?: string, options?: Intl.DateTimeFormatOptions): string;
  toISOString(): string;

  // Start and End of Day
  startOfDay(): DateValueObject;
  endOfDay(): DateValueObject;

  // Day Checks
  isWeekend(): boolean;
  isWeekday(): boolean;

  // Age Calculation
  getAge(): number;

  // Static Methods

  /**
   * Validates if the provided value is a valid date.
   * @param value The date to validate.
   * @returns A boolean indicating whether the date is valid.
   */
  isValid(value: Date): boolean;

  /**
   * Creates a new DateValueObject representing the current date and time.
   * @returns A new DateValueObject instance.
   */
  now(): DateValueObject;

  /**
   * Initializes a DateValueObject with the provided value.
   * @param value The date to initialize.
   * @returns A new DateValueObject instance.
   * @throws {Error} If the provided date is invalid.
   */
  init(value: Date): DateValueObject;

  /**
   * Creates a Result object containing a DateValueObject initialized with the provided value.
   * @param value The date to initialize.
   * @returns A Result object containing either a DateValueObject or an error message.
   */
  create(value: Date): Result<DateValueObject>;
}

Originally posted by @4lessandrodev in https://github.com/4lessandrodev/type-ddd/issues/446#issuecomment-2371948992

4lessandrodev commented 2 hours ago

I just found the package published at https://www.npmjs.com/package/@type-ddd/date and available in /packages/date.