@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.
- package/README.md +1 -1
- package/dist/{chunk-EGGEJRWA.mjs → chunk-2GYEWYBU.mjs} +4 -4
- package/dist/{chunk-UG3NG43J.mjs → chunk-44GORRHT.mjs} +3 -3
- package/dist/{chunk-WLTKHBFQ.mjs → chunk-4GK27OOO.mjs} +3 -3
- package/dist/{chunk-XVZYKKLD.mjs → chunk-66DVBO4C.mjs} +2 -2
- package/dist/{chunk-4FXDIYQT.mjs → chunk-6HTOXMLP.mjs} +3 -3
- package/dist/{chunk-PNSMLGOA.mjs → chunk-A7KUHZ3A.mjs} +2 -2
- package/dist/{chunk-I2VWZJ2K.mjs → chunk-AVHYDITZ.mjs} +4 -4
- package/dist/{chunk-4UKOKM72.mjs → chunk-CR2ZP2PA.mjs} +2 -2
- package/dist/{chunk-EFFUHXDK.mjs → chunk-DWSZUI3N.mjs} +4 -4
- package/dist/{chunk-ZO6LH5HU.mjs → chunk-FBZHPHXB.mjs} +2 -2
- package/dist/{chunk-YYXHD3PC.mjs → chunk-G6EOJ3XG.mjs} +2 -2
- package/dist/{chunk-3VDUMU5P.mjs → chunk-GYJHZJKL.mjs} +2 -2
- package/dist/chunk-HFRGTGH6.mjs +140 -0
- package/dist/chunk-HFRGTGH6.mjs.map +1 -0
- package/dist/{chunk-4NRVIWNE.mjs → chunk-HIM2UTGC.mjs} +2 -2
- package/dist/{chunk-RF23BV6J.mjs → chunk-IKUC55KC.mjs} +2 -2
- package/dist/{chunk-V5TW476J.mjs → chunk-IUZTBZYP.mjs} +2 -2
- package/dist/{chunk-M7OD5QSB.mjs → chunk-J6OJWNBP.mjs} +2 -2
- package/dist/{chunk-P4XVLBXB.mjs → chunk-JMAWKYXN.mjs} +2 -2
- package/dist/{chunk-M7MW5CXO.mjs → chunk-KGW3CVDO.mjs} +2 -2
- package/dist/{chunk-DODBPVV5.mjs → chunk-M2LLIIPG.mjs} +7 -7
- package/dist/{chunk-NQYUWVJT.mjs → chunk-MRV7FQNU.mjs} +2 -2
- package/dist/{chunk-J2RU23YZ.mjs → chunk-NUFTFLAY.mjs} +3 -3
- package/dist/{chunk-52VT3UEM.mjs → chunk-OWUSKHPI.mjs} +3 -3
- package/dist/{chunk-EHVMIXKR.mjs → chunk-PDPNMABX.mjs} +4 -4
- package/dist/{chunk-YDYQTX4H.mjs → chunk-QIBUS2GL.mjs} +3 -3
- package/dist/{chunk-HN3HW22I.mjs → chunk-RMQZRTTG.mjs} +2 -2
- package/dist/{chunk-KMEBQTNE.mjs → chunk-RPZ2XDQQ.mjs} +2 -2
- package/dist/{chunk-KXYGCS7S.mjs → chunk-TNJ2KFPQ.mjs} +2 -2
- package/dist/{chunk-BSN5WGZ6.mjs → chunk-TXXJY2Y7.mjs} +3 -3
- package/dist/{chunk-TNLJ45P5.mjs → chunk-ULOORN2E.mjs} +2 -2
- package/dist/{chunk-BODG3KPC.mjs → chunk-VENBCZAM.mjs} +3 -3
- package/dist/{chunk-YRVCY3KC.mjs → chunk-VOZBRY56.mjs} +4 -4
- package/dist/{chunk-4AEHKWWI.mjs → chunk-YTXIST3O.mjs} +2 -2
- package/dist/{chunk-HAGNDCSR.mjs → chunk-ZB323SGD.mjs} +2 -2
- package/dist/{chunk-5VP4WNID.mjs → chunk-ZPT6E6AF.mjs} +5 -5
- package/dist/data/Condition.mjs +4 -4
- package/dist/data/Database.mjs +3 -3
- package/dist/data/Field.mjs +4 -4
- package/dist/data/InMemoryGateway.mjs +4 -4
- package/dist/domain/Audit.mjs +8 -8
- package/dist/domain/Child.mjs +5 -5
- package/dist/domain/DateTime.d.ts +5 -7
- package/dist/domain/DateTime.mjs +4 -4
- package/dist/domain/Entity.mjs +8 -8
- package/dist/domain/Repo.mjs +4 -4
- package/dist/domain/Struct.mjs +4 -4
- package/dist/domain/Typo.mjs +4 -4
- package/dist/http/CacheControl.mjs +4 -4
- package/dist/http/ContentType.mjs +3 -3
- package/dist/http/HttpStatus.mjs +3 -3
- package/dist/http/HttpVerb.mjs +3 -3
- package/dist/http/LocalRequestStore.mjs +2 -2
- package/dist/http/RequestOptions.mjs +4 -4
- package/dist/http/RestResult.mjs +4 -4
- package/dist/http/toResponse.mjs +5 -5
- package/dist/index.js +33 -165
- package/dist/index.js.map +1 -1
- package/dist/process/App.mjs +3 -3
- package/dist/process/Manage.mjs +4 -4
- package/dist/process/Scope.mjs +3 -3
- package/dist/process/Search.mjs +4 -4
- package/dist/process/UseCase.mjs +2 -2
- package/dist/resources/Req.mjs +3 -3
- package/dist/services/Api.mjs +12 -12
- package/dist/services/ApiGateway.mjs +15 -15
- package/dist/services/AxiosProvider.mjs +10 -10
- package/dist/services/MappedRouteGateway.mjs +18 -18
- package/dist/services/RouteGateway.mjs +16 -16
- package/dist/services/ViewRouteGateway.mjs +18 -18
- package/dist/sql/Column.mjs +3 -3
- package/dist/sql/Count.mjs +5 -5
- package/dist/sql/Delete.mjs +4 -4
- package/dist/sql/Insert.mjs +4 -4
- package/dist/sql/Select.mjs +4 -4
- package/dist/sql/SqlQuery.mjs +3 -3
- package/dist/sql/Table.mjs +12 -12
- package/dist/sql/TableGateway.mjs +4 -4
- package/dist/sql/Update.mjs +4 -4
- package/dist/types/Cache.mjs +2 -2
- package/dist/types/CacheAge.mjs +4 -4
- package/dist/types/Case.mjs +2 -2
- package/dist/types/Context.mjs +2 -2
- package/dist/types/Enum.mjs +2 -2
- package/dist/types/Environment.mjs +2 -2
- package/dist/types/Exception.mjs +2 -2
- package/dist/types/Gateway.mjs +3 -3
- package/dist/types/IsEqual.mjs +2 -2
- package/dist/types/Json.mjs +3 -3
- package/dist/types/List.mjs +2 -2
- package/dist/types/Meta.mjs +2 -2
- package/dist/types/Number.mjs +3 -3
- package/dist/types/Object.mjs +2 -2
- package/dist/types/PageList.mjs +3 -3
- package/dist/types/Parser.mjs +2 -2
- package/dist/types/Repository.mjs +3 -3
- package/dist/types/Result.mjs +2 -2
- package/dist/types/Results.mjs +2 -2
- package/dist/types/Tag.mjs +2 -2
- package/dist/types/Template.mjs +2 -2
- package/dist/types/ToText.mjs +2 -2
- package/dist/types/Try.mjs +2 -2
- package/dist/types/Uri.mjs +2 -2
- package/dist/utils/If.mjs +2 -2
- package/dist/utils/Mapper.mjs +4 -4
- package/dist/utils/Period.mjs +4 -4
- package/dist/utils/Promise.mjs +2 -2
- package/dist/utils/Seconds.mjs +3 -3
- package/dist/utils/Sentence.mjs +2 -2
- package/dist/utils/View.mjs +5 -5
- package/dist/validation/Contraints.mjs +3 -3
- package/dist/validation/Validate.mjs +2 -2
- package/dist/validation/When.mjs +2 -2
- package/package.json +4 -9
- package/src/domain/DateTime.ts +40 -206
- package/dist/chunk-GRDUTNMZ.mjs +0 -272
- package/dist/chunk-GRDUTNMZ.mjs.map +0 -1
- /package/dist/{chunk-EGGEJRWA.mjs.map → chunk-2GYEWYBU.mjs.map} +0 -0
- /package/dist/{chunk-UG3NG43J.mjs.map → chunk-44GORRHT.mjs.map} +0 -0
- /package/dist/{chunk-WLTKHBFQ.mjs.map → chunk-4GK27OOO.mjs.map} +0 -0
- /package/dist/{chunk-XVZYKKLD.mjs.map → chunk-66DVBO4C.mjs.map} +0 -0
- /package/dist/{chunk-4FXDIYQT.mjs.map → chunk-6HTOXMLP.mjs.map} +0 -0
- /package/dist/{chunk-PNSMLGOA.mjs.map → chunk-A7KUHZ3A.mjs.map} +0 -0
- /package/dist/{chunk-I2VWZJ2K.mjs.map → chunk-AVHYDITZ.mjs.map} +0 -0
- /package/dist/{chunk-4UKOKM72.mjs.map → chunk-CR2ZP2PA.mjs.map} +0 -0
- /package/dist/{chunk-EFFUHXDK.mjs.map → chunk-DWSZUI3N.mjs.map} +0 -0
- /package/dist/{chunk-ZO6LH5HU.mjs.map → chunk-FBZHPHXB.mjs.map} +0 -0
- /package/dist/{chunk-YYXHD3PC.mjs.map → chunk-G6EOJ3XG.mjs.map} +0 -0
- /package/dist/{chunk-3VDUMU5P.mjs.map → chunk-GYJHZJKL.mjs.map} +0 -0
- /package/dist/{chunk-4NRVIWNE.mjs.map → chunk-HIM2UTGC.mjs.map} +0 -0
- /package/dist/{chunk-RF23BV6J.mjs.map → chunk-IKUC55KC.mjs.map} +0 -0
- /package/dist/{chunk-V5TW476J.mjs.map → chunk-IUZTBZYP.mjs.map} +0 -0
- /package/dist/{chunk-M7OD5QSB.mjs.map → chunk-J6OJWNBP.mjs.map} +0 -0
- /package/dist/{chunk-P4XVLBXB.mjs.map → chunk-JMAWKYXN.mjs.map} +0 -0
- /package/dist/{chunk-M7MW5CXO.mjs.map → chunk-KGW3CVDO.mjs.map} +0 -0
- /package/dist/{chunk-DODBPVV5.mjs.map → chunk-M2LLIIPG.mjs.map} +0 -0
- /package/dist/{chunk-NQYUWVJT.mjs.map → chunk-MRV7FQNU.mjs.map} +0 -0
- /package/dist/{chunk-J2RU23YZ.mjs.map → chunk-NUFTFLAY.mjs.map} +0 -0
- /package/dist/{chunk-52VT3UEM.mjs.map → chunk-OWUSKHPI.mjs.map} +0 -0
- /package/dist/{chunk-EHVMIXKR.mjs.map → chunk-PDPNMABX.mjs.map} +0 -0
- /package/dist/{chunk-YDYQTX4H.mjs.map → chunk-QIBUS2GL.mjs.map} +0 -0
- /package/dist/{chunk-HN3HW22I.mjs.map → chunk-RMQZRTTG.mjs.map} +0 -0
- /package/dist/{chunk-KMEBQTNE.mjs.map → chunk-RPZ2XDQQ.mjs.map} +0 -0
- /package/dist/{chunk-KXYGCS7S.mjs.map → chunk-TNJ2KFPQ.mjs.map} +0 -0
- /package/dist/{chunk-BSN5WGZ6.mjs.map → chunk-TXXJY2Y7.mjs.map} +0 -0
- /package/dist/{chunk-TNLJ45P5.mjs.map → chunk-ULOORN2E.mjs.map} +0 -0
- /package/dist/{chunk-BODG3KPC.mjs.map → chunk-VENBCZAM.mjs.map} +0 -0
- /package/dist/{chunk-YRVCY3KC.mjs.map → chunk-VOZBRY56.mjs.map} +0 -0
- /package/dist/{chunk-4AEHKWWI.mjs.map → chunk-YTXIST3O.mjs.map} +0 -0
- /package/dist/{chunk-HAGNDCSR.mjs.map → chunk-ZB323SGD.mjs.map} +0 -0
- /package/dist/{chunk-5VP4WNID.mjs.map → chunk-ZPT6E6AF.mjs.map} +0 -0
package/src/domain/DateTime.ts
CHANGED
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
import
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
27
|
+
protected readonly luxon: LuxonDateTime;
|
|
91
28
|
|
|
92
29
|
constructor(value?: DatetimeInput);
|
|
93
30
|
constructor(value?: string, format?: string);
|
|
94
|
-
constructor(value?:
|
|
95
|
-
const
|
|
96
|
-
.type(
|
|
97
|
-
.type(
|
|
98
|
-
.type(
|
|
99
|
-
.type(
|
|
100
|
-
|
|
101
|
-
.else(
|
|
102
|
-
|
|
103
|
-
super(
|
|
104
|
-
this.
|
|
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
|
|
45
|
+
return new DateTime(LuxonDateTime.utc() as any);
|
|
109
46
|
}
|
|
110
47
|
|
|
111
48
|
get isValid(): boolean {
|
|
112
|
-
return isDefined(this.value) && this.
|
|
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():
|
|
139
|
-
return this.
|
|
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.
|
|
152
|
-
() => this.utc.
|
|
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
|
|
96
|
+
return this.utc > dt.utc;
|
|
160
97
|
}
|
|
161
98
|
|
|
162
99
|
isBefore(dt: DateTime): boolean {
|
|
163
|
-
return this.utc
|
|
100
|
+
return this.utc < dt.utc;
|
|
164
101
|
}
|
|
165
102
|
|
|
166
103
|
equals(dt: DateTime): boolean {
|
|
167
|
-
return this.utc.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
128
|
+
return new DateTime(this.luxon.startOf(unit) as any);
|
|
192
129
|
}
|
|
193
130
|
|
|
194
131
|
endOf(unit: DateTimeUnit = 'day'): DateTime {
|
|
195
|
-
return
|
|
132
|
+
return new DateTime(this.luxon.endOf(unit) as any);
|
|
196
133
|
}
|
|
197
134
|
|
|
198
135
|
isWeekend(): boolean {
|
|
199
|
-
|
|
200
|
-
return day === 0 || day === 6;
|
|
136
|
+
return this.luxon.isWeekend;
|
|
201
137
|
}
|
|
202
138
|
|
|
203
139
|
withZone(zone: string): DateTime {
|
|
204
|
-
return
|
|
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.
|
|
148
|
+
return this.utc.toISO();
|
|
213
149
|
}
|
|
214
150
|
|
|
215
151
|
toFormat(format: string): string {
|
|
216
|
-
return this.
|
|
152
|
+
return this.luxon.toFormat(format);
|
|
217
153
|
}
|
|
218
154
|
|
|
219
155
|
toLocale(locale = 'nl-NL', format = 'D'): string {
|
|
220
|
-
|
|
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.
|
|
164
|
+
return this.isValid ? this.utc.toJSDate() : undefined;
|
|
244
165
|
}
|
|
245
166
|
|
|
246
167
|
toEpoch(): number {
|
|
247
|
-
return this.
|
|
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(
|
|
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;
|
package/dist/chunk-GRDUTNMZ.mjs
DELETED
|
@@ -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"]}
|