@thisisagile/easy 17.12.0 → 17.12.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thisisagile/easy",
3
- "version": "17.12.0",
3
+ "version": "17.12.2",
4
4
  "description": "Straightforward library for building domain-driven microservice architectures",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
@@ -22,20 +22,25 @@ export type DiffOptions = {
22
22
  type DatetimeInput = string | number | Date | DateTime | null;
23
23
 
24
24
  export class DateTime extends Value<Optional<string>> {
25
+ protected readonly luxon: LuxonDateTime;
26
+
27
+ constructor(value?: DatetimeInput);
28
+ constructor(value?: string, format?: string);
25
29
  constructor(value?: DatetimeInput, format?: string) {
26
- super(
27
- choose(value)
28
- .type(isString, v => (format ? LuxonDateTime.fromFormat(v, format, { setZone: true }) : LuxonDateTime.fromISO(v, { setZone: true })))
29
- .type(isNumber, v => LuxonDateTime.fromMillis(v))
30
- .type(isDate, v => LuxonDateTime.fromJSDate(v))
31
- .type(isDateTime, v => LuxonDateTime.fromISO(v.toString()))
32
- .else(undefined as unknown as LuxonDateTime)
33
- ?.toISO() as unknown as string
34
- );
30
+ const luxon = choose(value)
31
+ .type(isString, v => (format ? LuxonDateTime.fromFormat(v, format, { setZone: true }) : LuxonDateTime.fromISO(v, { setZone: true })))
32
+ .type(isNumber, v => LuxonDateTime.fromMillis(v))
33
+ .type(isDate, v => LuxonDateTime.fromJSDate(v))
34
+ .type(isDateTime, v => v.luxon)
35
+ // Allow constructing with LuxonDateTime without exposing types
36
+ .else(value instanceof LuxonDateTime ? value : LuxonDateTime.fromISO(undefined as any));
37
+
38
+ super(luxon.toISO() ?? undefined);
39
+ this.luxon = luxon;
35
40
  }
36
41
 
37
42
  static get now(): DateTime {
38
- return new DateTime(LuxonDateTime.utc().toISO());
43
+ return new DateTime(LuxonDateTime.utc() as any);
39
44
  }
40
45
 
41
46
  get isValid(): boolean {
@@ -53,24 +58,16 @@ export class DateTime extends Value<Optional<string>> {
53
58
  return this.luxon.setZone('utc');
54
59
  }
55
60
 
56
- protected get luxon(): LuxonDateTime {
57
- return LuxonDateTime.fromISO(this.value as string, { setZone: true });
58
- }
59
-
60
- from(date?: DateTime): string;
61
-
62
61
  from(locale?: string): string;
63
-
64
62
  from(date?: DateTime, locale?: string): string;
65
-
66
- from(param?: string | DateTime, other?: string): string {
67
- const date: Optional<DateTime> = isA<DateTime>(param) ? param : undefined;
68
- const locale: string = (isString(param) ? param : undefined) ?? other ?? 'en';
63
+ from(dateOrLocale?: string | DateTime, maybeLocale?: string): string {
64
+ const date: Optional<DateTime> = isA<DateTime>(dateOrLocale) ? dateOrLocale : undefined;
65
+ const locale: string = (isString(dateOrLocale) ? dateOrLocale : undefined) ?? maybeLocale ?? 'en';
69
66
  return ifDefined(
70
67
  date,
71
68
  d => this.utc.setLocale(locale).toRelative({ base: d.utc }),
72
69
  () => this.utc.setLocale(locale).toRelative()
73
- ) as string;
70
+ ) ?? "";
74
71
  }
75
72
 
76
73
  isAfter(dt: DateTime): boolean {
@@ -85,18 +82,16 @@ export class DateTime extends Value<Optional<string>> {
85
82
  return this.utc.hasSame(dt.utc, 'millisecond');
86
83
  }
87
84
 
88
- add(n: number): DateTime;
89
- add(n: number, unit: DurationUnit): DateTime;
85
+ add(n: number, unit?: DurationUnit): DateTime;
90
86
  add(duration: Duration): DateTime;
91
- add(n: number | Duration, unit?: DurationUnit): DateTime {
92
- return new DateTime(this.luxon.plus(isNumber(n) ? { [unit ?? ('day' as string)]: n } : n).toISO());
87
+ add(n: number | Duration, unit: DurationUnit = 'day'): DateTime {
88
+ return new DateTime(this.luxon.plus(isNumber(n) ? { [unit]: n } : n) as any);
93
89
  }
94
90
 
95
- subtract(n: number): DateTime;
96
- subtract(n: number, unit: DurationUnit): DateTime;
91
+ subtract(n: number, unit?: DurationUnit): DateTime;
97
92
  subtract(duration: Duration): DateTime;
98
- subtract(n: number | Duration, unit?: DurationUnit): DateTime {
99
- return new DateTime(this.luxon.minus(isNumber(n) ? { [unit ?? ('day' as string)]: n } : n).toISO());
93
+ subtract(n: number | Duration, unit: DurationUnit = 'day'): DateTime {
94
+ return new DateTime(this.luxon.minus(isNumber(n) ? { [unit]: n } : n) as any);
100
95
  }
101
96
 
102
97
  diff(other: DateTime, unit: DateTimeUnit = 'day', opts?: DiffOptions): number {
@@ -104,11 +99,11 @@ export class DateTime extends Value<Optional<string>> {
104
99
  }
105
100
 
106
101
  startOf(unit: DateTimeUnit = 'day'): DateTime {
107
- return new DateTime(this.luxon.startOf(unit).toISO());
102
+ return new DateTime(this.luxon.startOf(unit) as any);
108
103
  }
109
104
 
110
105
  endOf(unit: DateTimeUnit = 'day'): DateTime {
111
- return new DateTime(this.luxon.endOf(unit).toISO());
106
+ return new DateTime(this.luxon.endOf(unit) as any);
112
107
  }
113
108
 
114
109
  isWeekend(): boolean {
@@ -116,7 +111,7 @@ export class DateTime extends Value<Optional<string>> {
116
111
  }
117
112
 
118
113
  withZone(zone: string): DateTime {
119
- return new DateTime(this.utc.setZone(zone).toISO());
114
+ return new DateTime(this.luxon.setZone(zone) as any);
120
115
  }
121
116
 
122
117
  toString(): string {
@@ -124,7 +119,7 @@ export class DateTime extends Value<Optional<string>> {
124
119
  }
125
120
 
126
121
  toJSON(): JsonValue {
127
- return this.utc.toISO() as unknown as JsonValue;
122
+ return this.utc.toISO();
128
123
  }
129
124
 
130
125
  toFormat(format: string): string {
@@ -155,3 +150,4 @@ export class DateTime extends Value<Optional<string>> {
155
150
  export const isDateTime = (dt?: unknown): dt is DateTime => isDefined(dt) && dt instanceof DateTime;
156
151
 
157
152
  export const dt = (dt?: DatetimeInput): DateTime => new DateTime(dt);
153
+
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/domain/DateTime.ts"],"sourcesContent":["import { DateTime as LuxonDateTime, DateTimeUnit as LuxonDateTimeUnit, DurationUnit as LuxonDurationUnit, Settings } from 'luxon';\nimport { Value } from '../types/Value';\nimport { Optional } from '../types/Types';\nimport { choose } from '../types/Case';\nimport { isDefined, isNumber, isString } from '../types/Is';\nimport { isDate } from '../types/IsDate';\nimport { isA } from '../types/IsA';\nimport { ifDefined } from '../utils/If';\nimport { JsonValue } from '../types/Json';\nimport { seconds } from '../utils/Seconds';\n\nSettings.defaultZone = 'utc';\n\nexport type DateTimeUnit = LuxonDateTimeUnit;\nexport type DurationUnit = LuxonDurationUnit;\nexport type Duration = Partial<Record<DurationUnit, number>>;\n\nexport type DiffOptions = {\n rounding: 'floor' | 'ceil' | 'round';\n};\n\ntype DatetimeInput = string | number | Date | DateTime | null;\n\nexport class DateTime extends Value<Optional<string>> {\n constructor(value?: DatetimeInput, format?: string) {\n super(\n choose(value)\n .type(isString, v => (format ? LuxonDateTime.fromFormat(v, format, { setZone: true }) : LuxonDateTime.fromISO(v, { setZone: true })))\n .type(isNumber, v => LuxonDateTime.fromMillis(v))\n .type(isDate, v => LuxonDateTime.fromJSDate(v))\n .type(isDateTime, v => LuxonDateTime.fromISO(v.toString()))\n .else(undefined as unknown as LuxonDateTime)\n ?.toISO() as unknown as string\n );\n }\n\n static get now(): DateTime {\n return new DateTime(LuxonDateTime.utc().toISO());\n }\n\n get isValid(): boolean {\n return isDefined(this.value) && this.utc.isValid;\n }\n\n /**\n * @deprecated Deprecated in favor for DateTime.from as that also accepts locales and another DateTime\n */\n get fromNow(): string {\n return this.from();\n }\n\n protected get utc(): LuxonDateTime {\n return this.luxon.setZone('utc');\n }\n\n protected get luxon(): LuxonDateTime {\n return LuxonDateTime.fromISO(this.value as string, { setZone: true });\n }\n\n from(date?: DateTime): string;\n\n from(locale?: string): string;\n\n from(date?: DateTime, locale?: string): string;\n\n from(param?: string | DateTime, other?: string): string {\n const date: Optional<DateTime> = isA<DateTime>(param) ? param : undefined;\n const locale: string = (isString(param) ? param : undefined) ?? other ?? 'en';\n return ifDefined(\n date,\n d => this.utc.setLocale(locale).toRelative({ base: d.utc }),\n () => this.utc.setLocale(locale).toRelative()\n ) as string;\n }\n\n isAfter(dt: DateTime): boolean {\n return this.utc > dt.utc;\n }\n\n isBefore(dt: DateTime): boolean {\n return this.utc < dt.utc;\n }\n\n equals(dt: DateTime): boolean {\n return this.utc.hasSame(dt.utc, 'millisecond');\n }\n\n add(n: number): DateTime;\n add(n: number, unit: DurationUnit): DateTime;\n add(duration: Duration): DateTime;\n add(n: number | Duration, unit?: DurationUnit): DateTime {\n return new DateTime(this.luxon.plus(isNumber(n) ? { [unit ?? ('day' as string)]: n } : n).toISO());\n }\n\n subtract(n: number): DateTime;\n subtract(n: number, unit: DurationUnit): DateTime;\n subtract(duration: Duration): DateTime;\n subtract(n: number | Duration, unit?: DurationUnit): DateTime {\n return new DateTime(this.luxon.minus(isNumber(n) ? { [unit ?? ('day' as string)]: n } : n).toISO());\n }\n\n diff(other: DateTime, unit: DateTimeUnit = 'day', opts?: DiffOptions): number {\n return Math[opts?.rounding ?? 'floor'](this.utc.diff(other.utc).as(unit));\n }\n\n startOf(unit: DateTimeUnit = 'day'): DateTime {\n return new DateTime(this.luxon.startOf(unit).toISO());\n }\n\n endOf(unit: DateTimeUnit = 'day'): DateTime {\n return new DateTime(this.luxon.endOf(unit).toISO());\n }\n\n isWeekend(): boolean {\n return this.luxon.isWeekend;\n }\n\n withZone(zone: string): DateTime {\n return new DateTime(this.utc.setZone(zone).toISO());\n }\n\n toString(): string {\n return this.value ?? '';\n }\n\n toJSON(): JsonValue {\n return this.utc.toISO() as unknown as JsonValue;\n }\n\n toFormat(format: string): string {\n return this.luxon.toFormat(format);\n }\n\n toLocale(locale = 'nl-NL', format = 'D'): string {\n return this.luxon.setLocale(locale).toFormat(format);\n }\n\n toFull(locale?: string): string {\n return this.toLocale(locale, 'DDD');\n }\n\n toDate(): Optional<Date> {\n return this.isValid ? this.utc.toJSDate() : undefined;\n }\n\n toEpoch(): number {\n return this.luxon.toMillis();\n }\n\n ago(end: DateTime = DateTime.now): string {\n return seconds.toText(end.diff(this, 'second'));\n }\n}\n\nexport const isDateTime = (dt?: unknown): dt is DateTime => isDefined(dt) && dt instanceof DateTime;\n\nexport const dt = (dt?: DatetimeInput): DateTime => new DateTime(dt);\n"],"mappings":"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","names":["dt"]}