@thisisagile/easy 18.11.1 → 18.11.2

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.
Files changed (152) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-EGGEJRWA.mjs → chunk-2GYEWYBU.mjs} +4 -4
  3. package/dist/{chunk-UG3NG43J.mjs → chunk-44GORRHT.mjs} +3 -3
  4. package/dist/{chunk-WLTKHBFQ.mjs → chunk-4GK27OOO.mjs} +3 -3
  5. package/dist/{chunk-XVZYKKLD.mjs → chunk-66DVBO4C.mjs} +2 -2
  6. package/dist/{chunk-4FXDIYQT.mjs → chunk-6HTOXMLP.mjs} +3 -3
  7. package/dist/{chunk-PNSMLGOA.mjs → chunk-A7KUHZ3A.mjs} +2 -2
  8. package/dist/{chunk-I2VWZJ2K.mjs → chunk-AVHYDITZ.mjs} +4 -4
  9. package/dist/{chunk-4UKOKM72.mjs → chunk-CR2ZP2PA.mjs} +2 -2
  10. package/dist/{chunk-EFFUHXDK.mjs → chunk-DWSZUI3N.mjs} +4 -4
  11. package/dist/{chunk-ZO6LH5HU.mjs → chunk-FBZHPHXB.mjs} +2 -2
  12. package/dist/{chunk-YYXHD3PC.mjs → chunk-G6EOJ3XG.mjs} +2 -2
  13. package/dist/{chunk-3VDUMU5P.mjs → chunk-GYJHZJKL.mjs} +2 -2
  14. package/dist/chunk-HFRGTGH6.mjs +140 -0
  15. package/dist/chunk-HFRGTGH6.mjs.map +1 -0
  16. package/dist/{chunk-4NRVIWNE.mjs → chunk-HIM2UTGC.mjs} +2 -2
  17. package/dist/{chunk-RF23BV6J.mjs → chunk-IKUC55KC.mjs} +2 -2
  18. package/dist/{chunk-V5TW476J.mjs → chunk-IUZTBZYP.mjs} +2 -2
  19. package/dist/{chunk-M7OD5QSB.mjs → chunk-J6OJWNBP.mjs} +2 -2
  20. package/dist/{chunk-P4XVLBXB.mjs → chunk-JMAWKYXN.mjs} +2 -2
  21. package/dist/{chunk-M7MW5CXO.mjs → chunk-KGW3CVDO.mjs} +2 -2
  22. package/dist/{chunk-DODBPVV5.mjs → chunk-M2LLIIPG.mjs} +7 -7
  23. package/dist/{chunk-NQYUWVJT.mjs → chunk-MRV7FQNU.mjs} +2 -2
  24. package/dist/{chunk-J2RU23YZ.mjs → chunk-NUFTFLAY.mjs} +3 -3
  25. package/dist/{chunk-52VT3UEM.mjs → chunk-OWUSKHPI.mjs} +3 -3
  26. package/dist/{chunk-EHVMIXKR.mjs → chunk-PDPNMABX.mjs} +4 -4
  27. package/dist/{chunk-YDYQTX4H.mjs → chunk-QIBUS2GL.mjs} +3 -3
  28. package/dist/{chunk-HN3HW22I.mjs → chunk-RMQZRTTG.mjs} +2 -2
  29. package/dist/{chunk-KMEBQTNE.mjs → chunk-RPZ2XDQQ.mjs} +2 -2
  30. package/dist/{chunk-KXYGCS7S.mjs → chunk-TNJ2KFPQ.mjs} +2 -2
  31. package/dist/{chunk-BSN5WGZ6.mjs → chunk-TXXJY2Y7.mjs} +3 -3
  32. package/dist/{chunk-TNLJ45P5.mjs → chunk-ULOORN2E.mjs} +2 -2
  33. package/dist/{chunk-BODG3KPC.mjs → chunk-VENBCZAM.mjs} +3 -3
  34. package/dist/{chunk-YRVCY3KC.mjs → chunk-VOZBRY56.mjs} +4 -4
  35. package/dist/{chunk-4AEHKWWI.mjs → chunk-YTXIST3O.mjs} +2 -2
  36. package/dist/{chunk-HAGNDCSR.mjs → chunk-ZB323SGD.mjs} +2 -2
  37. package/dist/{chunk-5VP4WNID.mjs → chunk-ZPT6E6AF.mjs} +5 -5
  38. package/dist/data/Condition.mjs +4 -4
  39. package/dist/data/Database.mjs +3 -3
  40. package/dist/data/Field.mjs +4 -4
  41. package/dist/data/InMemoryGateway.mjs +4 -4
  42. package/dist/domain/Audit.mjs +8 -8
  43. package/dist/domain/Child.mjs +5 -5
  44. package/dist/domain/DateTime.d.ts +5 -7
  45. package/dist/domain/DateTime.mjs +4 -4
  46. package/dist/domain/Entity.mjs +8 -8
  47. package/dist/domain/Repo.mjs +4 -4
  48. package/dist/domain/Struct.mjs +4 -4
  49. package/dist/domain/Typo.mjs +4 -4
  50. package/dist/http/CacheControl.mjs +4 -4
  51. package/dist/http/ContentType.mjs +3 -3
  52. package/dist/http/HttpStatus.mjs +3 -3
  53. package/dist/http/HttpVerb.mjs +3 -3
  54. package/dist/http/LocalRequestStore.mjs +2 -2
  55. package/dist/http/RequestOptions.mjs +4 -4
  56. package/dist/http/RestResult.mjs +4 -4
  57. package/dist/http/toResponse.mjs +5 -5
  58. package/dist/index.js +33 -165
  59. package/dist/index.js.map +1 -1
  60. package/dist/process/App.mjs +3 -3
  61. package/dist/process/Manage.mjs +4 -4
  62. package/dist/process/Scope.mjs +3 -3
  63. package/dist/process/Search.mjs +4 -4
  64. package/dist/process/UseCase.mjs +2 -2
  65. package/dist/resources/Req.mjs +3 -3
  66. package/dist/services/Api.mjs +12 -12
  67. package/dist/services/ApiGateway.mjs +15 -15
  68. package/dist/services/AxiosProvider.mjs +10 -10
  69. package/dist/services/MappedRouteGateway.mjs +18 -18
  70. package/dist/services/RouteGateway.mjs +16 -16
  71. package/dist/services/ViewRouteGateway.mjs +18 -18
  72. package/dist/sql/Column.mjs +3 -3
  73. package/dist/sql/Count.mjs +5 -5
  74. package/dist/sql/Delete.mjs +4 -4
  75. package/dist/sql/Insert.mjs +4 -4
  76. package/dist/sql/Select.mjs +4 -4
  77. package/dist/sql/SqlQuery.mjs +3 -3
  78. package/dist/sql/Table.mjs +12 -12
  79. package/dist/sql/TableGateway.mjs +4 -4
  80. package/dist/sql/Update.mjs +4 -4
  81. package/dist/types/Cache.mjs +2 -2
  82. package/dist/types/CacheAge.mjs +4 -4
  83. package/dist/types/Case.mjs +2 -2
  84. package/dist/types/Context.mjs +2 -2
  85. package/dist/types/Enum.mjs +2 -2
  86. package/dist/types/Environment.mjs +2 -2
  87. package/dist/types/Exception.mjs +2 -2
  88. package/dist/types/Gateway.mjs +3 -3
  89. package/dist/types/IsEqual.mjs +2 -2
  90. package/dist/types/Json.mjs +3 -3
  91. package/dist/types/List.mjs +2 -2
  92. package/dist/types/Meta.mjs +2 -2
  93. package/dist/types/Number.mjs +3 -3
  94. package/dist/types/Object.mjs +2 -2
  95. package/dist/types/PageList.mjs +3 -3
  96. package/dist/types/Parser.mjs +2 -2
  97. package/dist/types/Repository.mjs +3 -3
  98. package/dist/types/Result.mjs +2 -2
  99. package/dist/types/Results.mjs +2 -2
  100. package/dist/types/Tag.mjs +2 -2
  101. package/dist/types/Template.mjs +2 -2
  102. package/dist/types/ToText.mjs +2 -2
  103. package/dist/types/Try.mjs +2 -2
  104. package/dist/types/Uri.mjs +2 -2
  105. package/dist/utils/If.mjs +2 -2
  106. package/dist/utils/Mapper.mjs +4 -4
  107. package/dist/utils/Period.mjs +4 -4
  108. package/dist/utils/Promise.mjs +2 -2
  109. package/dist/utils/Seconds.mjs +3 -3
  110. package/dist/utils/Sentence.mjs +2 -2
  111. package/dist/utils/View.mjs +5 -5
  112. package/dist/validation/Contraints.mjs +3 -3
  113. package/dist/validation/Validate.mjs +2 -2
  114. package/dist/validation/When.mjs +2 -2
  115. package/package.json +4 -9
  116. package/src/domain/DateTime.ts +40 -206
  117. package/dist/chunk-GRDUTNMZ.mjs +0 -272
  118. package/dist/chunk-GRDUTNMZ.mjs.map +0 -1
  119. /package/dist/{chunk-EGGEJRWA.mjs.map → chunk-2GYEWYBU.mjs.map} +0 -0
  120. /package/dist/{chunk-UG3NG43J.mjs.map → chunk-44GORRHT.mjs.map} +0 -0
  121. /package/dist/{chunk-WLTKHBFQ.mjs.map → chunk-4GK27OOO.mjs.map} +0 -0
  122. /package/dist/{chunk-XVZYKKLD.mjs.map → chunk-66DVBO4C.mjs.map} +0 -0
  123. /package/dist/{chunk-4FXDIYQT.mjs.map → chunk-6HTOXMLP.mjs.map} +0 -0
  124. /package/dist/{chunk-PNSMLGOA.mjs.map → chunk-A7KUHZ3A.mjs.map} +0 -0
  125. /package/dist/{chunk-I2VWZJ2K.mjs.map → chunk-AVHYDITZ.mjs.map} +0 -0
  126. /package/dist/{chunk-4UKOKM72.mjs.map → chunk-CR2ZP2PA.mjs.map} +0 -0
  127. /package/dist/{chunk-EFFUHXDK.mjs.map → chunk-DWSZUI3N.mjs.map} +0 -0
  128. /package/dist/{chunk-ZO6LH5HU.mjs.map → chunk-FBZHPHXB.mjs.map} +0 -0
  129. /package/dist/{chunk-YYXHD3PC.mjs.map → chunk-G6EOJ3XG.mjs.map} +0 -0
  130. /package/dist/{chunk-3VDUMU5P.mjs.map → chunk-GYJHZJKL.mjs.map} +0 -0
  131. /package/dist/{chunk-4NRVIWNE.mjs.map → chunk-HIM2UTGC.mjs.map} +0 -0
  132. /package/dist/{chunk-RF23BV6J.mjs.map → chunk-IKUC55KC.mjs.map} +0 -0
  133. /package/dist/{chunk-V5TW476J.mjs.map → chunk-IUZTBZYP.mjs.map} +0 -0
  134. /package/dist/{chunk-M7OD5QSB.mjs.map → chunk-J6OJWNBP.mjs.map} +0 -0
  135. /package/dist/{chunk-P4XVLBXB.mjs.map → chunk-JMAWKYXN.mjs.map} +0 -0
  136. /package/dist/{chunk-M7MW5CXO.mjs.map → chunk-KGW3CVDO.mjs.map} +0 -0
  137. /package/dist/{chunk-DODBPVV5.mjs.map → chunk-M2LLIIPG.mjs.map} +0 -0
  138. /package/dist/{chunk-NQYUWVJT.mjs.map → chunk-MRV7FQNU.mjs.map} +0 -0
  139. /package/dist/{chunk-J2RU23YZ.mjs.map → chunk-NUFTFLAY.mjs.map} +0 -0
  140. /package/dist/{chunk-52VT3UEM.mjs.map → chunk-OWUSKHPI.mjs.map} +0 -0
  141. /package/dist/{chunk-EHVMIXKR.mjs.map → chunk-PDPNMABX.mjs.map} +0 -0
  142. /package/dist/{chunk-YDYQTX4H.mjs.map → chunk-QIBUS2GL.mjs.map} +0 -0
  143. /package/dist/{chunk-HN3HW22I.mjs.map → chunk-RMQZRTTG.mjs.map} +0 -0
  144. /package/dist/{chunk-KMEBQTNE.mjs.map → chunk-RPZ2XDQQ.mjs.map} +0 -0
  145. /package/dist/{chunk-KXYGCS7S.mjs.map → chunk-TNJ2KFPQ.mjs.map} +0 -0
  146. /package/dist/{chunk-BSN5WGZ6.mjs.map → chunk-TXXJY2Y7.mjs.map} +0 -0
  147. /package/dist/{chunk-TNLJ45P5.mjs.map → chunk-ULOORN2E.mjs.map} +0 -0
  148. /package/dist/{chunk-BODG3KPC.mjs.map → chunk-VENBCZAM.mjs.map} +0 -0
  149. /package/dist/{chunk-YRVCY3KC.mjs.map → chunk-VOZBRY56.mjs.map} +0 -0
  150. /package/dist/{chunk-4AEHKWWI.mjs.map → chunk-YTXIST3O.mjs.map} +0 -0
  151. /package/dist/{chunk-HAGNDCSR.mjs.map → chunk-ZB323SGD.mjs.map} +0 -0
  152. /package/dist/{chunk-5VP4WNID.mjs.map → chunk-ZPT6E6AF.mjs.map} +0 -0
@@ -1,16 +1,7 @@
1
- import dayjs, { Dayjs, ManipulateType, OpUnitType, QUnitType } from 'dayjs';
2
- import advancedFormat from 'dayjs/plugin/advancedFormat';
3
- import customParseFormat from 'dayjs/plugin/customParseFormat';
4
- import isoWeek from 'dayjs/plugin/isoWeek';
5
- import localizedFormat from 'dayjs/plugin/localizedFormat';
6
- import quarterOfYear from 'dayjs/plugin/quarterOfYear';
7
- import relativeTime from 'dayjs/plugin/relativeTime';
8
- import timezone from 'dayjs/plugin/timezone';
9
- import utc from 'dayjs/plugin/utc';
10
- import 'dayjs/locale/de';
11
- import 'dayjs/locale/nl';
1
+ import { DateTime as LuxonDateTime, DateTimeUnit as LuxonDateTimeUnit, DurationUnit as LuxonDurationUnit, Settings } from 'luxon';
12
2
  import { Value } from '../types/Value';
13
3
  import { Optional } from '../types/Types';
4
+ import { choose } from '../types/Case';
14
5
  import { isDefined, isNumber, isString } from '../types/Is';
15
6
  import { isDate } from '../types/IsDate';
16
7
  import { isA } from '../types/IsA';
@@ -19,30 +10,11 @@ import { JsonValue } from '../types/Json';
19
10
  import { seconds } from '../utils/Seconds';
20
11
  import { tryTo } from '../types/Try';
21
12
  import { use } from '../types/Constructor';
22
- import { choose } from '../types/Case';
23
13
 
24
- dayjs.extend(utc);
25
- dayjs.extend(timezone);
26
- dayjs.extend(customParseFormat);
27
- dayjs.extend(localizedFormat);
28
- dayjs.extend(relativeTime);
29
- dayjs.extend(isoWeek);
30
- dayjs.extend(advancedFormat);
31
- dayjs.extend(quarterOfYear);
32
- dayjs.tz.setDefault('UTC');
33
-
34
- export type DateTimeUnit = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';
35
- export type DurationUnit =
36
- | DateTimeUnit
37
- | 'years'
38
- | 'quarters'
39
- | 'months'
40
- | 'weeks'
41
- | 'days'
42
- | 'hours'
43
- | 'minutes'
44
- | 'seconds'
45
- | 'milliseconds';
14
+ Settings.defaultZone = 'utc';
15
+
16
+ export type DateTimeUnit = LuxonDateTimeUnit;
17
+ export type DurationUnit = LuxonDurationUnit;
46
18
  export type Duration = Partial<Record<DurationUnit, number>>;
47
19
 
48
20
  export type DiffOptions = {
@@ -51,65 +23,30 @@ export type DiffOptions = {
51
23
 
52
24
  export type DatetimeInput = string | number | Date | DateTime | null;
53
25
 
54
- type DateTimeConstructorInput = DatetimeInput | Dayjs;
55
- type ZonedDayjs = Dayjs & { $x?: { $timezone?: string } };
56
-
57
- const invalidDate = dayjs.utc(Number.NaN);
58
- const isDayjs = (value: unknown): value is Dayjs => dayjs.isDayjs(value);
59
- const isoFormats = [
60
- 'YYYY-MM-DD',
61
- 'YYYY-MM-DDTHH:mm',
62
- 'YYYY-MM-DDTHH:mm:ss',
63
- 'YYYY-MM-DDTHH:mm:ss.SSS',
64
- 'YYYY-MM-DDTHH:mm[Z]',
65
- 'YYYY-MM-DDTHH:mm:ss[Z]',
66
- 'YYYY-MM-DDTHH:mm:ss.SSS[Z]',
67
- 'YYYY-MM-DDTHH:mmZ',
68
- 'YYYY-MM-DDTHH:mmZZ',
69
- 'YYYY-MM-DDTHH:mm:ssZ',
70
- 'YYYY-MM-DDTHH:mm:ssZZ',
71
- 'YYYY-MM-DDTHH:mm:ss.SSSZ',
72
- 'YYYY-MM-DDTHH:mm:ss.SSSZZ',
73
- ];
74
- const fixedUnitMilliseconds: Partial<Record<DurationUnit, number>> = {
75
- day: 86400000,
76
- days: 86400000,
77
- week: 604800000,
78
- weeks: 604800000,
79
- };
80
- const calendarUnitMonths: Partial<Record<DurationUnit, number>> = {
81
- month: 1,
82
- months: 1,
83
- quarter: 3,
84
- quarters: 3,
85
- year: 12,
86
- years: 12,
87
- };
88
-
89
26
  export class DateTime extends Value<Optional<string>> {
90
- protected readonly date: Dayjs;
27
+ protected readonly luxon: LuxonDateTime;
91
28
 
92
29
  constructor(value?: DatetimeInput);
93
30
  constructor(value?: string, format?: string);
94
- constructor(value?: DateTimeConstructorInput, format?: string) {
95
- const date = choose<DateTimeConstructorInput | undefined>(value)
96
- .type(isDayjs, date => date)
97
- .type(isDateTime, dateTime => dateTime.date)
98
- .type(isNumber, timestamp => dayjs.utc(timestamp))
99
- .type(isDate, date => dayjs.utc(date))
100
- .type(isString, string => (string === '' ? invalidDate : format ? parseFormatted(string, format) : parseIso(string)))
101
- .else(invalidDate);
102
-
103
- super(date.isValid() ? formatDateTime(date) : undefined);
104
- this.date = date;
31
+ constructor(value?: DatetimeInput, format?: string) {
32
+ const luxon = choose(value)
33
+ .type(isString, v => (format ? LuxonDateTime.fromFormat(v, format, { setZone: true }) : LuxonDateTime.fromISO(v, { setZone: true })))
34
+ .type(isNumber, v => LuxonDateTime.fromMillis(v))
35
+ .type(isDate, v => LuxonDateTime.fromJSDate(v))
36
+ .type(isDateTime, v => v.luxon)
37
+ // Allow constructing with LuxonDateTime without exposing types
38
+ .else(value instanceof LuxonDateTime ? value : LuxonDateTime.fromISO(undefined as any));
39
+
40
+ super(luxon.toISO() ?? undefined);
41
+ this.luxon = luxon;
105
42
  }
106
43
 
107
44
  static get now(): DateTime {
108
- return fromDayjs(dayjs.utc(Date.now()));
45
+ return new DateTime(LuxonDateTime.utc() as any);
109
46
  }
110
47
 
111
48
  get isValid(): boolean {
112
- return isDefined(this.value) && this.date.isValid();
49
+ return isDefined(this.value) && this.utc.isValid;
113
50
  }
114
51
 
115
52
  /**
@@ -135,8 +72,8 @@ export class DateTime extends Value<Optional<string>> {
135
72
  return this.withZone('Europe/Warsaw');
136
73
  }
137
74
 
138
- protected get utc(): Dayjs {
139
- return this.date.utc();
75
+ protected get utc(): LuxonDateTime {
76
+ return this.luxon.setZone('utc');
140
77
  }
141
78
 
142
79
  from(locale?: string): string;
@@ -148,23 +85,23 @@ export class DateTime extends Value<Optional<string>> {
148
85
  use((isString(dateOrLocale) ? dateOrLocale : maybeLocale) ?? 'en', locale =>
149
86
  ifDefined(
150
87
  isA<DateTime>(dateOrLocale) ? dateOrLocale : undefined,
151
- d => this.utc.locale(toDayjsLocale(locale)).from(d.utc),
152
- () => this.utc.locale(toDayjsLocale(locale)).from(dayjs.utc(Date.now()))
88
+ d => this.utc.setLocale(locale).toRelative({ base: d.utc }),
89
+ () => this.utc.setLocale(locale).toRelative()
153
90
  )
154
91
  ) ?? ''
155
92
  );
156
93
  }
157
94
 
158
95
  isAfter(dt: DateTime): boolean {
159
- return this.utc.valueOf() > dt.utc.valueOf();
96
+ return this.utc > dt.utc;
160
97
  }
161
98
 
162
99
  isBefore(dt: DateTime): boolean {
163
- return this.utc.valueOf() < dt.utc.valueOf();
100
+ return this.utc < dt.utc;
164
101
  }
165
102
 
166
103
  equals(dt: DateTime): boolean {
167
- return this.utc.valueOf() === dt.utc.valueOf();
104
+ return this.utc.hasSame(dt.utc, 'millisecond');
168
105
  }
169
106
 
170
107
  add(n: number, unit?: DurationUnit): DateTime;
@@ -172,7 +109,7 @@ export class DateTime extends Value<Optional<string>> {
172
109
  add(duration: Duration): DateTime;
173
110
 
174
111
  add(n: number | Duration, unit: DurationUnit = 'day'): DateTime {
175
- return fromDayjs(change(this.date, n, unit, 'add'));
112
+ return new DateTime(this.luxon.plus(isNumber(n) ? { [unit]: n } : n) as any);
176
113
  }
177
114
 
178
115
  subtract(n: number, unit?: DurationUnit): DateTime;
@@ -180,28 +117,27 @@ export class DateTime extends Value<Optional<string>> {
180
117
  subtract(duration: Duration): DateTime;
181
118
 
182
119
  subtract(n: number | Duration, unit: DurationUnit = 'day'): DateTime {
183
- return fromDayjs(change(this.date, n, unit, 'subtract'));
120
+ return new DateTime(this.luxon.minus(isNumber(n) ? { [unit]: n } : n) as any);
184
121
  }
185
122
 
186
123
  diff(other: DateTime, unit: DateTimeUnit = 'day', opts?: DiffOptions): number {
187
- return Math[opts?.rounding ?? 'floor'](this.utc.diff(other.utc, toDayjsUnit(unit) as QUnitType | OpUnitType, true));
124
+ return Math[opts?.rounding ?? 'floor'](this.utc.diff(other.utc).as(unit));
188
125
  }
189
126
 
190
127
  startOf(unit: DateTimeUnit = 'day'): DateTime {
191
- return fromDayjs(this.date.startOf(toDayjsBoundaryUnit(unit)));
128
+ return new DateTime(this.luxon.startOf(unit) as any);
192
129
  }
193
130
 
194
131
  endOf(unit: DateTimeUnit = 'day'): DateTime {
195
- return fromDayjs(this.date.endOf(toDayjsBoundaryUnit(unit)));
132
+ return new DateTime(this.luxon.endOf(unit) as any);
196
133
  }
197
134
 
198
135
  isWeekend(): boolean {
199
- const day = this.date.day();
200
- return day === 0 || day === 6;
136
+ return this.luxon.isWeekend;
201
137
  }
202
138
 
203
139
  withZone(zone: string): DateTime {
204
- return fromDayjs(this.date.tz(zone));
140
+ return new DateTime(this.luxon.setZone(zone) as any);
205
141
  }
206
142
 
207
143
  toString(): string {
@@ -209,30 +145,15 @@ export class DateTime extends Value<Optional<string>> {
209
145
  }
210
146
 
211
147
  toJSON(): JsonValue {
212
- return this.isValid ? this.utc.format('YYYY-MM-DDTHH:mm:ss.SSS[Z]') : null;
148
+ return this.utc.toISO();
213
149
  }
214
150
 
215
151
  toFormat(format: string): string {
216
- return this.isValid ? this.date.format(toDayjsFormat(format)) : '';
152
+ return this.luxon.toFormat(format);
217
153
  }
218
154
 
219
155
  toLocale(locale = 'nl-NL', format = 'D'): string {
220
- if (!this.isValid) return '';
221
-
222
- if (format === 'D') return formatWithIntl(this.date, locale, { year: 'numeric', month: 'numeric', day: 'numeric' });
223
- if (format === 'DDD') return formatWithIntl(this.date, locale, { dateStyle: 'long' });
224
- if (format === 'ffff') {
225
- return formatWithIntl(this.date, locale, {
226
- weekday: 'long',
227
- year: 'numeric',
228
- month: 'long',
229
- day: 'numeric',
230
- hour: 'numeric',
231
- minute: '2-digit',
232
- timeZoneName: timezoneOf(this.date) ? 'long' : 'short',
233
- });
234
- }
235
- return this.date.locale(toDayjsLocale(locale)).format(toDayjsFormat(format));
156
+ return this.luxon.setLocale(locale).toFormat(format);
236
157
  }
237
158
 
238
159
  toFull(locale?: string): string {
@@ -240,11 +161,11 @@ export class DateTime extends Value<Optional<string>> {
240
161
  }
241
162
 
242
163
  toDate(): Optional<Date> {
243
- return this.isValid ? this.utc.toDate() : undefined;
164
+ return this.isValid ? this.utc.toJSDate() : undefined;
244
165
  }
245
166
 
246
167
  toEpoch(): number {
247
- return this.date.valueOf();
168
+ return this.luxon.toMillis();
248
169
  }
249
170
 
250
171
  ago(end: DateTime = DateTime.now): string {
@@ -253,7 +174,7 @@ export class DateTime extends Value<Optional<string>> {
253
174
 
254
175
  withClock(clock: DateTime): DateTime {
255
176
  return tryTo(() => [this.toDate() as Date, clock.toDate() as Date])
256
- .map(([td, cd]) => new Date(Date.UTC(td.getUTCFullYear(), td.getUTCMonth(), td.getUTCDate(), cd.getUTCHours(), cd.getUTCMinutes(), cd.getUTCSeconds())))
177
+ .map(([td, cd]) => new Date(td.getFullYear(), td.getMonth(), td.getDate(), cd.getHours(), cd.getMinutes(), cd.getSeconds()))
257
178
  .map(d => new DateTime(d)).value;
258
179
  }
259
180
  }
@@ -261,90 +182,3 @@ export class DateTime extends Value<Optional<string>> {
261
182
  export const isDateTime = (dt?: unknown): dt is DateTime => isDefined(dt) && dt instanceof DateTime;
262
183
 
263
184
  export const dt = (dt?: DatetimeInput): DateTime => new DateTime(dt);
264
-
265
- const parseIso = (value: string): Dayjs => {
266
- const offset = offsetOf(value);
267
- if (offset) {
268
- const date = dayjs.utc(value);
269
- return date.isValid() ? inOffsetZone(date, offset) : invalidDate;
270
- }
271
- return dayjs(value, isoFormats, true).isValid() ? dayjs.utc(value) : invalidDate;
272
- };
273
-
274
- const parseFormatted = (value: string, format: string): Dayjs => {
275
- const dayjsFormat = toDayjsFormat(format);
276
- const offset = offsetOf(value);
277
- if (format.includes('ZZZ') && offset) {
278
- const iso = dayjs.utc(value);
279
- return iso.isValid() ? inOffsetZone(iso, offset) : invalidDate;
280
- }
281
- return dayjs.utc(value, dayjsFormat, true);
282
- };
283
-
284
- const offsetOf = (value: string): string | undefined => value.match(/([+-]\d{2}:?\d{2})$/)?.[1];
285
-
286
- const fromDayjs = (date: Dayjs): DateTime => new DateTime(date as unknown as DatetimeInput);
287
-
288
- const formatDateTime = (date: Dayjs): string => {
289
- const formatted = date.format('YYYY-MM-DDTHH:mm:ss.SSSZ');
290
- return timezoneOf(date) ? formatted : formatted.replace('+00:00', 'Z');
291
- };
292
-
293
- const change = (date: Dayjs, value: number | Duration, unit: DurationUnit, direction: 'add' | 'subtract'): Dayjs => {
294
- if (isNumber(value)) return changeUnit(date, value, unit, direction);
295
- return Object.entries(value).reduce((result, [durationUnit, durationValue]) => changeUnit(result, durationValue ?? 0, durationUnit as DurationUnit, direction), date);
296
- };
297
-
298
- const changeUnit = (date: Dayjs, value: number, unit: DurationUnit, direction: 'add' | 'subtract'): Dayjs => {
299
- const amount = direction === 'add' ? value : -value;
300
- const milliseconds = fixedUnitMilliseconds[unit];
301
- const months = calendarUnitMonths[unit];
302
-
303
- if (months && !Number.isInteger(value)) return addMonths(date, amount * months);
304
- if (milliseconds && !Number.isInteger(value)) return date.add(amount * milliseconds, 'millisecond');
305
- return date.add(amount, toDayjsUnit(unit));
306
- };
307
-
308
- const addMonths = (date: Dayjs, months: number): Dayjs => {
309
- const wholeMonths = Math.trunc(months);
310
- const fraction = months - wholeMonths;
311
- const shifted = date.add(wholeMonths, 'month');
312
- if (fraction === 0) return shifted;
313
-
314
- const next = shifted.add(months > 0 ? 1 : -1, 'month');
315
- return shifted.add((next.valueOf() - shifted.valueOf()) * Math.abs(fraction), 'millisecond');
316
- };
317
-
318
- const inOffsetZone = (date: Dayjs, offset: string): Dayjs => offsetToTimeZone(offset).map(zone => date.tz(zone)).or(date.utcOffset(offset));
319
-
320
- const offsetToTimeZone = (offset: string) =>
321
- tryTo(() => {
322
- const [, sign, hours, minutes] = offset.match(/^([+-])(\d{2}):?(\d{2})$/) ?? [];
323
- if (minutes !== '00') throw new Error();
324
- if (hours === '00') return 'UTC';
325
- return `Etc/GMT${sign === '+' ? '-' : '+'}${Number(hours)}`;
326
- });
327
-
328
- const toDayjsUnit = (unit: DurationUnit): ManipulateType => unit.replace(/s$/, '') as ManipulateType;
329
-
330
- const toDayjsBoundaryUnit = (unit: DateTimeUnit): OpUnitType => {
331
- const dayjsUnit = toDayjsUnit(unit);
332
- return (dayjsUnit === 'week' ? 'isoWeek' : dayjsUnit) as OpUnitType;
333
- };
334
-
335
- const toDayjsFormat = (format: string): string =>
336
- format
337
- .replace(/'([^']+)'/g, '[$1]')
338
- .replace(/EEE/g, 'ddd')
339
- .replace(/yyyy/g, 'YYYY')
340
- .replace(/dd/g, 'DD')
341
- .replace(/LLL/g, 'MMM')
342
- .replace(/ZZZ/g, 'ZZ')
343
- .replace(/hh/g, 'HH');
344
-
345
- const toDayjsLocale = (locale: string): string => locale.toLowerCase().split('-')[0];
346
-
347
- const formatWithIntl = (date: Dayjs, locale: string, options: Intl.DateTimeFormatOptions): string =>
348
- new Intl.DateTimeFormat(locale, { ...options, timeZone: timezoneOf(date) ?? 'UTC' }).format(date.toDate());
349
-
350
- const timezoneOf = (date: Dayjs): string | undefined => (date as ZonedDayjs).$x?.$timezone;
@@ -1,272 +0,0 @@
1
- import {
2
- seconds
3
- } from "./chunk-RF23BV6J.mjs";
4
- import {
5
- isDate
6
- } from "./chunk-ADJAEGCT.mjs";
7
- import {
8
- choose,
9
- ifDefined,
10
- tryTo
11
- } from "./chunk-I2VWZJ2K.mjs";
12
- import {
13
- Value
14
- } from "./chunk-S3NSPQ7M.mjs";
15
- import {
16
- isA
17
- } from "./chunk-D5IYAIMK.mjs";
18
- import {
19
- use
20
- } from "./chunk-PF7HDF6B.mjs";
21
- import {
22
- isDefined,
23
- isNumber,
24
- isString
25
- } from "./chunk-AAND4MKF.mjs";
26
-
27
- // src/domain/DateTime.ts
28
- import dayjs from "dayjs";
29
- import advancedFormat from "dayjs/plugin/advancedFormat";
30
- import customParseFormat from "dayjs/plugin/customParseFormat";
31
- import isoWeek from "dayjs/plugin/isoWeek";
32
- import localizedFormat from "dayjs/plugin/localizedFormat";
33
- import quarterOfYear from "dayjs/plugin/quarterOfYear";
34
- import relativeTime from "dayjs/plugin/relativeTime";
35
- import timezone from "dayjs/plugin/timezone";
36
- import utc from "dayjs/plugin/utc";
37
- import "dayjs/locale/de";
38
- import "dayjs/locale/nl";
39
- dayjs.extend(utc);
40
- dayjs.extend(timezone);
41
- dayjs.extend(customParseFormat);
42
- dayjs.extend(localizedFormat);
43
- dayjs.extend(relativeTime);
44
- dayjs.extend(isoWeek);
45
- dayjs.extend(advancedFormat);
46
- dayjs.extend(quarterOfYear);
47
- dayjs.tz.setDefault("UTC");
48
- var invalidDate = dayjs.utc(Number.NaN);
49
- var isDayjs = (value) => dayjs.isDayjs(value);
50
- var isoFormats = [
51
- "YYYY-MM-DD",
52
- "YYYY-MM-DDTHH:mm",
53
- "YYYY-MM-DDTHH:mm:ss",
54
- "YYYY-MM-DDTHH:mm:ss.SSS",
55
- "YYYY-MM-DDTHH:mm[Z]",
56
- "YYYY-MM-DDTHH:mm:ss[Z]",
57
- "YYYY-MM-DDTHH:mm:ss.SSS[Z]",
58
- "YYYY-MM-DDTHH:mmZ",
59
- "YYYY-MM-DDTHH:mmZZ",
60
- "YYYY-MM-DDTHH:mm:ssZ",
61
- "YYYY-MM-DDTHH:mm:ssZZ",
62
- "YYYY-MM-DDTHH:mm:ss.SSSZ",
63
- "YYYY-MM-DDTHH:mm:ss.SSSZZ"
64
- ];
65
- var fixedUnitMilliseconds = {
66
- day: 864e5,
67
- days: 864e5,
68
- week: 6048e5,
69
- weeks: 6048e5
70
- };
71
- var calendarUnitMonths = {
72
- month: 1,
73
- months: 1,
74
- quarter: 3,
75
- quarters: 3,
76
- year: 12,
77
- years: 12
78
- };
79
- var DateTime = class _DateTime extends Value {
80
- date;
81
- constructor(value, format) {
82
- const date = choose(value).type(isDayjs, (date2) => date2).type(isDateTime, (dateTime) => dateTime.date).type(isNumber, (timestamp) => dayjs.utc(timestamp)).type(isDate, (date2) => dayjs.utc(date2)).type(isString, (string) => string === "" ? invalidDate : format ? parseFormatted(string, format) : parseIso(string)).else(invalidDate);
83
- super(date.isValid() ? formatDateTime(date) : void 0);
84
- this.date = date;
85
- }
86
- static get now() {
87
- return fromDayjs(dayjs.utc(Date.now()));
88
- }
89
- get isValid() {
90
- return isDefined(this.value) && this.date.isValid();
91
- }
92
- /**
93
- * @deprecated Deprecated in favor for DateTime.from as that also accepts locales and another DateTime
94
- */
95
- get fromNow() {
96
- return this.from();
97
- }
98
- get inAmsterdam() {
99
- return this.withZone("Europe/Amsterdam");
100
- }
101
- get inNewYork() {
102
- return this.withZone("America/New_York");
103
- }
104
- get inLondon() {
105
- return this.withZone("Europe/London");
106
- }
107
- get inWarsaw() {
108
- return this.withZone("Europe/Warsaw");
109
- }
110
- get utc() {
111
- return this.date.utc();
112
- }
113
- from(dateOrLocale, maybeLocale) {
114
- return use(
115
- (isString(dateOrLocale) ? dateOrLocale : maybeLocale) ?? "en",
116
- (locale) => ifDefined(
117
- isA(dateOrLocale) ? dateOrLocale : void 0,
118
- (d) => this.utc.locale(toDayjsLocale(locale)).from(d.utc),
119
- () => this.utc.locale(toDayjsLocale(locale)).from(dayjs.utc(Date.now()))
120
- )
121
- ) ?? "";
122
- }
123
- isAfter(dt2) {
124
- return this.utc.valueOf() > dt2.utc.valueOf();
125
- }
126
- isBefore(dt2) {
127
- return this.utc.valueOf() < dt2.utc.valueOf();
128
- }
129
- equals(dt2) {
130
- return this.utc.valueOf() === dt2.utc.valueOf();
131
- }
132
- add(n, unit = "day") {
133
- return fromDayjs(change(this.date, n, unit, "add"));
134
- }
135
- subtract(n, unit = "day") {
136
- return fromDayjs(change(this.date, n, unit, "subtract"));
137
- }
138
- diff(other, unit = "day", opts) {
139
- return Math[opts?.rounding ?? "floor"](this.utc.diff(other.utc, toDayjsUnit(unit), true));
140
- }
141
- startOf(unit = "day") {
142
- return fromDayjs(this.date.startOf(toDayjsBoundaryUnit(unit)));
143
- }
144
- endOf(unit = "day") {
145
- return fromDayjs(this.date.endOf(toDayjsBoundaryUnit(unit)));
146
- }
147
- isWeekend() {
148
- const day = this.date.day();
149
- return day === 0 || day === 6;
150
- }
151
- withZone(zone) {
152
- return fromDayjs(this.date.tz(zone));
153
- }
154
- toString() {
155
- return this.value ?? "";
156
- }
157
- toJSON() {
158
- return this.isValid ? this.utc.format("YYYY-MM-DDTHH:mm:ss.SSS[Z]") : null;
159
- }
160
- toFormat(format) {
161
- return this.isValid ? this.date.format(toDayjsFormat(format)) : "";
162
- }
163
- toLocale(locale = "nl-NL", format = "D") {
164
- if (!this.isValid)
165
- return "";
166
- if (format === "D")
167
- return formatWithIntl(this.date, locale, { year: "numeric", month: "numeric", day: "numeric" });
168
- if (format === "DDD")
169
- return formatWithIntl(this.date, locale, { dateStyle: "long" });
170
- if (format === "ffff") {
171
- return formatWithIntl(this.date, locale, {
172
- weekday: "long",
173
- year: "numeric",
174
- month: "long",
175
- day: "numeric",
176
- hour: "numeric",
177
- minute: "2-digit",
178
- timeZoneName: timezoneOf(this.date) ? "long" : "short"
179
- });
180
- }
181
- return this.date.locale(toDayjsLocale(locale)).format(toDayjsFormat(format));
182
- }
183
- toFull(locale) {
184
- return this.toLocale(locale, "DDD");
185
- }
186
- toDate() {
187
- return this.isValid ? this.utc.toDate() : void 0;
188
- }
189
- toEpoch() {
190
- return this.date.valueOf();
191
- }
192
- ago(end = _DateTime.now) {
193
- return seconds.toText(end.diff(this, "second"));
194
- }
195
- withClock(clock) {
196
- return tryTo(() => [this.toDate(), clock.toDate()]).map(([td, cd]) => new Date(Date.UTC(td.getUTCFullYear(), td.getUTCMonth(), td.getUTCDate(), cd.getUTCHours(), cd.getUTCMinutes(), cd.getUTCSeconds()))).map((d) => new _DateTime(d)).value;
197
- }
198
- };
199
- var isDateTime = (dt2) => isDefined(dt2) && dt2 instanceof DateTime;
200
- var dt = (dt2) => new DateTime(dt2);
201
- var parseIso = (value) => {
202
- const offset = offsetOf(value);
203
- if (offset) {
204
- const date = dayjs.utc(value);
205
- return date.isValid() ? inOffsetZone(date, offset) : invalidDate;
206
- }
207
- return dayjs(value, isoFormats, true).isValid() ? dayjs.utc(value) : invalidDate;
208
- };
209
- var parseFormatted = (value, format) => {
210
- const dayjsFormat = toDayjsFormat(format);
211
- const offset = offsetOf(value);
212
- if (format.includes("ZZZ") && offset) {
213
- const iso = dayjs.utc(value);
214
- return iso.isValid() ? inOffsetZone(iso, offset) : invalidDate;
215
- }
216
- return dayjs.utc(value, dayjsFormat, true);
217
- };
218
- var offsetOf = (value) => value.match(/([+-]\d{2}:?\d{2})$/)?.[1];
219
- var fromDayjs = (date) => new DateTime(date);
220
- var formatDateTime = (date) => {
221
- const formatted = date.format("YYYY-MM-DDTHH:mm:ss.SSSZ");
222
- return timezoneOf(date) ? formatted : formatted.replace("+00:00", "Z");
223
- };
224
- var change = (date, value, unit, direction) => {
225
- if (isNumber(value))
226
- return changeUnit(date, value, unit, direction);
227
- return Object.entries(value).reduce((result, [durationUnit, durationValue]) => changeUnit(result, durationValue ?? 0, durationUnit, direction), date);
228
- };
229
- var changeUnit = (date, value, unit, direction) => {
230
- const amount = direction === "add" ? value : -value;
231
- const milliseconds = fixedUnitMilliseconds[unit];
232
- const months = calendarUnitMonths[unit];
233
- if (months && !Number.isInteger(value))
234
- return addMonths(date, amount * months);
235
- if (milliseconds && !Number.isInteger(value))
236
- return date.add(amount * milliseconds, "millisecond");
237
- return date.add(amount, toDayjsUnit(unit));
238
- };
239
- var addMonths = (date, months) => {
240
- const wholeMonths = Math.trunc(months);
241
- const fraction = months - wholeMonths;
242
- const shifted = date.add(wholeMonths, "month");
243
- if (fraction === 0)
244
- return shifted;
245
- const next = shifted.add(months > 0 ? 1 : -1, "month");
246
- return shifted.add((next.valueOf() - shifted.valueOf()) * Math.abs(fraction), "millisecond");
247
- };
248
- var inOffsetZone = (date, offset) => offsetToTimeZone(offset).map((zone) => date.tz(zone)).or(date.utcOffset(offset));
249
- var offsetToTimeZone = (offset) => tryTo(() => {
250
- const [, sign, hours, minutes] = offset.match(/^([+-])(\d{2}):?(\d{2})$/) ?? [];
251
- if (minutes !== "00")
252
- throw new Error();
253
- if (hours === "00")
254
- return "UTC";
255
- return `Etc/GMT${sign === "+" ? "-" : "+"}${Number(hours)}`;
256
- });
257
- var toDayjsUnit = (unit) => unit.replace(/s$/, "");
258
- var toDayjsBoundaryUnit = (unit) => {
259
- const dayjsUnit = toDayjsUnit(unit);
260
- return dayjsUnit === "week" ? "isoWeek" : dayjsUnit;
261
- };
262
- var toDayjsFormat = (format) => format.replace(/'([^']+)'/g, "[$1]").replace(/EEE/g, "ddd").replace(/yyyy/g, "YYYY").replace(/dd/g, "DD").replace(/LLL/g, "MMM").replace(/ZZZ/g, "ZZ").replace(/hh/g, "HH");
263
- var toDayjsLocale = (locale) => locale.toLowerCase().split("-")[0];
264
- var formatWithIntl = (date, locale, options) => new Intl.DateTimeFormat(locale, { ...options, timeZone: timezoneOf(date) ?? "UTC" }).format(date.toDate());
265
- var timezoneOf = (date) => date.$x?.$timezone;
266
-
267
- export {
268
- DateTime,
269
- isDateTime,
270
- dt
271
- };
272
- //# sourceMappingURL=chunk-GRDUTNMZ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/domain/DateTime.ts"],"sourcesContent":["import dayjs, { Dayjs, ManipulateType, OpUnitType, QUnitType } from 'dayjs';\nimport advancedFormat from 'dayjs/plugin/advancedFormat';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport isoWeek from 'dayjs/plugin/isoWeek';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\nimport quarterOfYear from 'dayjs/plugin/quarterOfYear';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport timezone from 'dayjs/plugin/timezone';\nimport utc from 'dayjs/plugin/utc';\nimport 'dayjs/locale/de';\nimport 'dayjs/locale/nl';\nimport { Value } from '../types/Value';\nimport { Optional } from '../types/Types';\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';\nimport { choose } from '../types/Case';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(customParseFormat);\ndayjs.extend(localizedFormat);\ndayjs.extend(relativeTime);\ndayjs.extend(isoWeek);\ndayjs.extend(advancedFormat);\ndayjs.extend(quarterOfYear);\ndayjs.tz.setDefault('UTC');\n\nexport type DateTimeUnit = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\nexport type DurationUnit =\n | DateTimeUnit\n | 'years'\n | 'quarters'\n | 'months'\n | 'weeks'\n | 'days'\n | 'hours'\n | 'minutes'\n | 'seconds'\n | 'milliseconds';\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\ntype DateTimeConstructorInput = DatetimeInput | Dayjs;\ntype ZonedDayjs = Dayjs & { $x?: { $timezone?: string } };\n\nconst invalidDate = dayjs.utc(Number.NaN);\nconst isDayjs = (value: unknown): value is Dayjs => dayjs.isDayjs(value);\nconst isoFormats = [\n 'YYYY-MM-DD',\n 'YYYY-MM-DDTHH:mm',\n 'YYYY-MM-DDTHH:mm:ss',\n 'YYYY-MM-DDTHH:mm:ss.SSS',\n 'YYYY-MM-DDTHH:mm[Z]',\n 'YYYY-MM-DDTHH:mm:ss[Z]',\n 'YYYY-MM-DDTHH:mm:ss.SSS[Z]',\n 'YYYY-MM-DDTHH:mmZ',\n 'YYYY-MM-DDTHH:mmZZ',\n 'YYYY-MM-DDTHH:mm:ssZ',\n 'YYYY-MM-DDTHH:mm:ssZZ',\n 'YYYY-MM-DDTHH:mm:ss.SSSZ',\n 'YYYY-MM-DDTHH:mm:ss.SSSZZ',\n];\nconst fixedUnitMilliseconds: Partial<Record<DurationUnit, number>> = {\n day: 86400000,\n days: 86400000,\n week: 604800000,\n weeks: 604800000,\n};\nconst calendarUnitMonths: Partial<Record<DurationUnit, number>> = {\n month: 1,\n months: 1,\n quarter: 3,\n quarters: 3,\n year: 12,\n years: 12,\n};\n\nexport class DateTime extends Value<Optional<string>> {\n protected readonly date: Dayjs;\n\n constructor(value?: DatetimeInput);\n constructor(value?: string, format?: string);\n constructor(value?: DateTimeConstructorInput, format?: string) {\n const date = choose<DateTimeConstructorInput | undefined>(value)\n .type(isDayjs, date => date)\n .type(isDateTime, dateTime => dateTime.date)\n .type(isNumber, timestamp => dayjs.utc(timestamp))\n .type(isDate, date => dayjs.utc(date))\n .type(isString, string => (string === '' ? invalidDate : format ? parseFormatted(string, format) : parseIso(string)))\n .else(invalidDate);\n\n super(date.isValid() ? formatDateTime(date) : undefined);\n this.date = date;\n }\n\n static get now(): DateTime {\n return fromDayjs(dayjs.utc(Date.now()));\n }\n\n get isValid(): boolean {\n return isDefined(this.value) && this.date.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(): Dayjs {\n return this.date.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.locale(toDayjsLocale(locale)).from(d.utc),\n () => this.utc.locale(toDayjsLocale(locale)).from(dayjs.utc(Date.now()))\n )\n ) ?? ''\n );\n }\n\n isAfter(dt: DateTime): boolean {\n return this.utc.valueOf() > dt.utc.valueOf();\n }\n\n isBefore(dt: DateTime): boolean {\n return this.utc.valueOf() < dt.utc.valueOf();\n }\n\n equals(dt: DateTime): boolean {\n return this.utc.valueOf() === dt.utc.valueOf();\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 fromDayjs(change(this.date, n, unit, 'add'));\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 fromDayjs(change(this.date, n, unit, 'subtract'));\n }\n\n diff(other: DateTime, unit: DateTimeUnit = 'day', opts?: DiffOptions): number {\n return Math[opts?.rounding ?? 'floor'](this.utc.diff(other.utc, toDayjsUnit(unit) as QUnitType | OpUnitType, true));\n }\n\n startOf(unit: DateTimeUnit = 'day'): DateTime {\n return fromDayjs(this.date.startOf(toDayjsBoundaryUnit(unit)));\n }\n\n endOf(unit: DateTimeUnit = 'day'): DateTime {\n return fromDayjs(this.date.endOf(toDayjsBoundaryUnit(unit)));\n }\n\n isWeekend(): boolean {\n const day = this.date.day();\n return day === 0 || day === 6;\n }\n\n withZone(zone: string): DateTime {\n return fromDayjs(this.date.tz(zone));\n }\n\n toString(): string {\n return this.value ?? '';\n }\n\n toJSON(): JsonValue {\n return this.isValid ? this.utc.format('YYYY-MM-DDTHH:mm:ss.SSS[Z]') : null;\n }\n\n toFormat(format: string): string {\n return this.isValid ? this.date.format(toDayjsFormat(format)) : '';\n }\n\n toLocale(locale = 'nl-NL', format = 'D'): string {\n if (!this.isValid) return '';\n\n if (format === 'D') return formatWithIntl(this.date, locale, { year: 'numeric', month: 'numeric', day: 'numeric' });\n if (format === 'DDD') return formatWithIntl(this.date, locale, { dateStyle: 'long' });\n if (format === 'ffff') {\n return formatWithIntl(this.date, locale, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n timeZoneName: timezoneOf(this.date) ? 'long' : 'short',\n });\n }\n return this.date.locale(toDayjsLocale(locale)).format(toDayjsFormat(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.toDate() : undefined;\n }\n\n toEpoch(): number {\n return this.date.valueOf();\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(Date.UTC(td.getUTCFullYear(), td.getUTCMonth(), td.getUTCDate(), cd.getUTCHours(), cd.getUTCMinutes(), cd.getUTCSeconds())))\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\nconst parseIso = (value: string): Dayjs => {\n const offset = offsetOf(value);\n if (offset) {\n const date = dayjs.utc(value);\n return date.isValid() ? inOffsetZone(date, offset) : invalidDate;\n }\n return dayjs(value, isoFormats, true).isValid() ? dayjs.utc(value) : invalidDate;\n};\n\nconst parseFormatted = (value: string, format: string): Dayjs => {\n const dayjsFormat = toDayjsFormat(format);\n const offset = offsetOf(value);\n if (format.includes('ZZZ') && offset) {\n const iso = dayjs.utc(value);\n return iso.isValid() ? inOffsetZone(iso, offset) : invalidDate;\n }\n return dayjs.utc(value, dayjsFormat, true);\n};\n\nconst offsetOf = (value: string): string | undefined => value.match(/([+-]\\d{2}:?\\d{2})$/)?.[1];\n\nconst fromDayjs = (date: Dayjs): DateTime => new DateTime(date as unknown as DatetimeInput);\n\nconst formatDateTime = (date: Dayjs): string => {\n const formatted = date.format('YYYY-MM-DDTHH:mm:ss.SSSZ');\n return timezoneOf(date) ? formatted : formatted.replace('+00:00', 'Z');\n};\n\nconst change = (date: Dayjs, value: number | Duration, unit: DurationUnit, direction: 'add' | 'subtract'): Dayjs => {\n if (isNumber(value)) return changeUnit(date, value, unit, direction);\n return Object.entries(value).reduce((result, [durationUnit, durationValue]) => changeUnit(result, durationValue ?? 0, durationUnit as DurationUnit, direction), date);\n};\n\nconst changeUnit = (date: Dayjs, value: number, unit: DurationUnit, direction: 'add' | 'subtract'): Dayjs => {\n const amount = direction === 'add' ? value : -value;\n const milliseconds = fixedUnitMilliseconds[unit];\n const months = calendarUnitMonths[unit];\n\n if (months && !Number.isInteger(value)) return addMonths(date, amount * months);\n if (milliseconds && !Number.isInteger(value)) return date.add(amount * milliseconds, 'millisecond');\n return date.add(amount, toDayjsUnit(unit));\n};\n\nconst addMonths = (date: Dayjs, months: number): Dayjs => {\n const wholeMonths = Math.trunc(months);\n const fraction = months - wholeMonths;\n const shifted = date.add(wholeMonths, 'month');\n if (fraction === 0) return shifted;\n\n const next = shifted.add(months > 0 ? 1 : -1, 'month');\n return shifted.add((next.valueOf() - shifted.valueOf()) * Math.abs(fraction), 'millisecond');\n};\n\nconst inOffsetZone = (date: Dayjs, offset: string): Dayjs => offsetToTimeZone(offset).map(zone => date.tz(zone)).or(date.utcOffset(offset));\n\nconst offsetToTimeZone = (offset: string) =>\n tryTo(() => {\n const [, sign, hours, minutes] = offset.match(/^([+-])(\\d{2}):?(\\d{2})$/) ?? [];\n if (minutes !== '00') throw new Error();\n if (hours === '00') return 'UTC';\n return `Etc/GMT${sign === '+' ? '-' : '+'}${Number(hours)}`;\n });\n\nconst toDayjsUnit = (unit: DurationUnit): ManipulateType => unit.replace(/s$/, '') as ManipulateType;\n\nconst toDayjsBoundaryUnit = (unit: DateTimeUnit): OpUnitType => {\n const dayjsUnit = toDayjsUnit(unit);\n return (dayjsUnit === 'week' ? 'isoWeek' : dayjsUnit) as OpUnitType;\n};\n\nconst toDayjsFormat = (format: string): string =>\n format\n .replace(/'([^']+)'/g, '[$1]')\n .replace(/EEE/g, 'ddd')\n .replace(/yyyy/g, 'YYYY')\n .replace(/dd/g, 'DD')\n .replace(/LLL/g, 'MMM')\n .replace(/ZZZ/g, 'ZZ')\n .replace(/hh/g, 'HH');\n\nconst toDayjsLocale = (locale: string): string => locale.toLowerCase().split('-')[0];\n\nconst formatWithIntl = (date: Dayjs, locale: string, options: Intl.DateTimeFormatOptions): string =>\n new Intl.DateTimeFormat(locale, { ...options, timeZone: timezoneOf(date) ?? 'UTC' }).format(date.toDate());\n\nconst timezoneOf = (date: Dayjs): string | undefined => (date as ZonedDayjs).$x?.$timezone;\n"],"mappings":"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","names":["date","dt"]}