{"version":3,"sources":["../src/domain/DateTime.ts"],"sourcesContent":["import { DateTime as LuxonDateTime, DateTimeUnit as LuxonDateTimeUnit, DurationUnit as LuxonDurationUnit, Settings } from 'luxon';\nimport { Value } from '../types/Value';\nimport { Optional } from '../types/Types';\nimport { choose } from '../types/Case';\nimport { isDefined, isNumber, isString } from '../types/Is';\nimport { isDate } from '../types/IsDate';\nimport { isA } from '../types/IsA';\nimport { ifDefined } from '../utils/If';\nimport { JsonValue } from '../types/Json';\nimport { seconds } from '../utils/Seconds';\nimport { tryTo } from '../types/Try';\nimport { use } from '../types/Constructor';\n\nSettings.defaultZone = 'utc';\n\nexport type DateTimeUnit = LuxonDateTimeUnit;\nexport type DurationUnit = LuxonDurationUnit;\nexport type Duration = Partial<Record<DurationUnit, number>>;\n\nexport type DiffOptions = {\n  rounding: 'floor' | 'ceil' | 'round';\n};\n\nexport type DatetimeInput = string | number | Date | DateTime | null;\n\nexport class DateTime extends Value<Optional<string>> {\n  protected readonly luxon: LuxonDateTime;\n\n  constructor(value?: DatetimeInput);\n  constructor(value?: string, format?: string);\n  constructor(value?: DatetimeInput, format?: string) {\n    const luxon = choose(value)\n      .type(isString, v => (format ? LuxonDateTime.fromFormat(v, format, { setZone: true }) : LuxonDateTime.fromISO(v, { setZone: true })))\n      .type(isNumber, v => LuxonDateTime.fromMillis(v))\n      .type(isDate, v => LuxonDateTime.fromJSDate(v))\n      .type(isDateTime, v => v.luxon)\n      // Allow constructing with LuxonDateTime without exposing types\n      .else(value instanceof LuxonDateTime ? value : LuxonDateTime.fromISO(undefined as any));\n\n    super(luxon.toISO() ?? undefined);\n    this.luxon = luxon;\n  }\n\n  static get now(): DateTime {\n    return new DateTime(LuxonDateTime.utc() as any);\n  }\n\n  get isValid(): boolean {\n    return isDefined(this.value) && this.utc.isValid;\n  }\n\n  /**\n   * @deprecated Deprecated in favor for DateTime.from as that also accepts locales and another DateTime\n   */\n  get fromNow(): string {\n    return this.from();\n  }\n\n  get inAmsterdam(): DateTime {\n    return this.withZone('Europe/Amsterdam');\n  }\n\n  get inNewYork(): DateTime {\n    return this.withZone('America/New_York');\n  }\n\n  get inLondon(): DateTime {\n    return this.withZone('Europe/London');\n  }\n\n  get inWarsaw(): DateTime {\n    return this.withZone('Europe/Warsaw');\n  }\n\n  protected get utc(): LuxonDateTime {\n    return this.luxon.setZone('utc');\n  }\n\n  from(locale?: string): string;\n\n  from(date?: DateTime, locale?: string): string;\n\n  from(dateOrLocale?: string | DateTime, maybeLocale?: string): string {\n    return (\n      use((isString(dateOrLocale) ? dateOrLocale : maybeLocale) ?? 'en', locale =>\n        ifDefined(\n          isA<DateTime>(dateOrLocale) ? dateOrLocale : undefined,\n          d => this.utc.setLocale(locale).toRelative({ base: d.utc }),\n          () => this.utc.setLocale(locale).toRelative()\n        )\n      ) ?? ''\n    );\n  }\n\n  isAfter(dt: DateTime): boolean {\n    return this.utc > dt.utc;\n  }\n\n  isBefore(dt: DateTime): boolean {\n    return this.utc < dt.utc;\n  }\n\n  equals(dt: DateTime): boolean {\n    return this.utc.hasSame(dt.utc, 'millisecond');\n  }\n\n  add(n: number, unit?: DurationUnit): DateTime;\n\n  add(duration: Duration): DateTime;\n\n  add(n: number | Duration, unit: DurationUnit = 'day'): DateTime {\n    return new DateTime(this.luxon.plus(isNumber(n) ? { [unit]: n } : n) as any);\n  }\n\n  subtract(n: number, unit?: DurationUnit): DateTime;\n\n  subtract(duration: Duration): DateTime;\n\n  subtract(n: number | Duration, unit: DurationUnit = 'day'): DateTime {\n    return new DateTime(this.luxon.minus(isNumber(n) ? { [unit]: n } : n) as any);\n  }\n\n  diff(other: DateTime, unit: DateTimeUnit = 'day', opts?: DiffOptions): number {\n    return Math[opts?.rounding ?? 'floor'](this.utc.diff(other.utc).as(unit));\n  }\n\n  startOf(unit: DateTimeUnit = 'day'): DateTime {\n    return new DateTime(this.luxon.startOf(unit) as any);\n  }\n\n  endOf(unit: DateTimeUnit = 'day'): DateTime {\n    return new DateTime(this.luxon.endOf(unit) as any);\n  }\n\n  isWeekend(): boolean {\n    return this.luxon.isWeekend;\n  }\n\n  withZone(zone: string): DateTime {\n    return new DateTime(this.luxon.setZone(zone) as any);\n  }\n\n  toString(): string {\n    return this.value ?? '';\n  }\n\n  toJSON(): JsonValue {\n    return this.utc.toISO();\n  }\n\n  toFormat(format: string): string {\n    return this.luxon.toFormat(format);\n  }\n\n  toLocale(locale = 'nl-NL', format = 'D'): string {\n    return this.luxon.setLocale(locale).toFormat(format);\n  }\n\n  toFull(locale?: string): string {\n    return this.toLocale(locale, 'DDD');\n  }\n\n  toDate(): Optional<Date> {\n    return this.isValid ? this.utc.toJSDate() : undefined;\n  }\n\n  toEpoch(): number {\n    return this.luxon.toMillis();\n  }\n\n  ago(end: DateTime = DateTime.now): string {\n    return seconds.toText(end.diff(this, 'second'));\n  }\n\n  withClock(clock: DateTime): DateTime {\n    return tryTo(() => [this.toDate() as Date, clock.toDate() as Date])\n      .map(([td, cd]) => new Date(td.getFullYear(), td.getMonth(), td.getDate(), cd.getHours(), cd.getMinutes(), cd.getSeconds()))\n      .map(d => new DateTime(d)).value;\n  }\n}\n\nexport const isDateTime = (dt?: unknown): dt is DateTime => isDefined(dt) && dt instanceof DateTime;\n\nexport const dt = (dt?: DatetimeInput): DateTime => new DateTime(dt);\n"],"mappings":"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","names":["dt"]}