@venizia/ignis-helpers 0.2.2-2 → 0.2.2-4
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/dist/cjs/modules/temporal/abstract.d.ts +310 -0
- package/dist/cjs/modules/temporal/abstract.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/abstract.js +363 -0
- package/dist/cjs/modules/temporal/abstract.js.map +1 -0
- package/dist/cjs/modules/temporal/adapters/dayjs.d.ts +1 -1
- package/dist/cjs/modules/temporal/adapters/dayjs.d.ts.map +1 -1
- package/dist/cjs/modules/temporal/adapters/dayjs.js +3 -3
- package/dist/cjs/modules/temporal/adapters/dayjs.js.map +1 -1
- package/dist/cjs/modules/temporal/adapters/intl.d.ts +1 -1
- package/dist/cjs/modules/temporal/adapters/intl.d.ts.map +1 -1
- package/dist/cjs/modules/temporal/adapters/intl.js +7 -7
- package/dist/cjs/modules/temporal/adapters/intl.js.map +1 -1
- package/dist/cjs/modules/temporal/adapters/luxon.d.ts +1 -1
- package/dist/cjs/modules/temporal/adapters/luxon.d.ts.map +1 -1
- package/dist/cjs/modules/temporal/adapters/luxon.js +3 -3
- package/dist/cjs/modules/temporal/adapters/luxon.js.map +1 -1
- package/dist/cjs/modules/temporal/adapters/native.d.ts +3 -1
- package/dist/cjs/modules/temporal/adapters/native.d.ts.map +1 -1
- package/dist/cjs/modules/temporal/adapters/native.js +13 -5
- package/dist/cjs/modules/temporal/adapters/native.js.map +1 -1
- package/dist/cjs/modules/temporal/calendar/calendar.d.ts +56 -0
- package/dist/cjs/modules/temporal/calendar/calendar.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/calendar/calendar.js +166 -0
- package/dist/cjs/modules/temporal/calendar/calendar.js.map +1 -0
- package/dist/cjs/modules/temporal/calendar/index.d.ts +2 -0
- package/dist/cjs/modules/temporal/calendar/index.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/calendar/index.js +18 -0
- package/dist/cjs/modules/temporal/calendar/index.js.map +1 -0
- package/dist/cjs/modules/temporal/common/constants.d.ts +14 -3
- package/dist/cjs/modules/temporal/common/constants.d.ts.map +1 -1
- package/dist/cjs/modules/temporal/common/constants.js +23 -4
- package/dist/cjs/modules/temporal/common/constants.js.map +1 -1
- package/dist/cjs/modules/temporal/common/types.d.ts +259 -5
- package/dist/cjs/modules/temporal/common/types.d.ts.map +1 -1
- package/dist/cjs/modules/temporal/{duration.d.ts → duration/duration.d.ts} +9 -2
- package/dist/cjs/modules/temporal/duration/duration.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/duration/duration.js +135 -0
- package/dist/cjs/modules/temporal/duration/duration.js.map +1 -0
- package/dist/cjs/modules/temporal/duration/index.d.ts +2 -0
- package/dist/cjs/modules/temporal/duration/index.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/duration/index.js +18 -0
- package/dist/cjs/modules/temporal/duration/index.js.map +1 -0
- package/dist/cjs/modules/temporal/helper.d.ts +107 -78
- package/dist/cjs/modules/temporal/helper.d.ts.map +1 -1
- package/dist/cjs/modules/temporal/helper.js +203 -258
- package/dist/cjs/modules/temporal/helper.js.map +1 -1
- package/dist/cjs/modules/temporal/index.d.ts +1 -0
- package/dist/cjs/modules/temporal/index.d.ts.map +1 -1
- package/dist/cjs/modules/temporal/index.js +1 -0
- package/dist/cjs/modules/temporal/index.js.map +1 -1
- package/dist/cjs/modules/temporal/locale/index.d.ts +2 -0
- package/dist/cjs/modules/temporal/locale/index.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/locale/index.js +18 -0
- package/dist/cjs/modules/temporal/locale/index.js.map +1 -0
- package/dist/{esm/modules/temporal → cjs/modules/temporal/locale}/locale.d.ts +3 -2
- package/dist/cjs/modules/temporal/locale/locale.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/{locale.js → locale/locale.js} +3 -3
- package/dist/cjs/modules/temporal/locale/locale.js.map +1 -0
- package/dist/cjs/modules/temporal/pattern/common/index.d.ts +2 -0
- package/dist/cjs/modules/temporal/pattern/common/index.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/pattern/common/index.js +18 -0
- package/dist/cjs/modules/temporal/pattern/common/index.js.map +1 -0
- package/dist/cjs/modules/temporal/pattern/common/types.d.ts +26 -0
- package/dist/cjs/modules/temporal/pattern/common/types.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/pattern/common/types.js +3 -0
- package/dist/cjs/modules/temporal/pattern/common/types.js.map +1 -0
- package/dist/cjs/modules/temporal/pattern/index.d.ts +4 -0
- package/dist/cjs/modules/temporal/pattern/index.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/pattern/index.js +20 -0
- package/dist/cjs/modules/temporal/pattern/index.js.map +1 -0
- package/dist/{esm/modules/temporal → cjs/modules/temporal/pattern}/pattern.d.ts +2 -1
- package/dist/cjs/modules/temporal/pattern/pattern.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/{pattern.js → pattern/pattern.js} +19 -14
- package/dist/cjs/modules/temporal/pattern/pattern.js.map +1 -0
- package/dist/cjs/modules/temporal/pattern/tokens.d.ts +59 -0
- package/dist/cjs/modules/temporal/pattern/tokens.d.ts.map +1 -0
- package/dist/cjs/modules/temporal/pattern/tokens.js +195 -0
- package/dist/cjs/modules/temporal/pattern/tokens.js.map +1 -0
- package/dist/esm/modules/temporal/abstract.d.ts +310 -0
- package/dist/esm/modules/temporal/abstract.d.ts.map +1 -0
- package/dist/esm/modules/temporal/abstract.js +359 -0
- package/dist/esm/modules/temporal/abstract.js.map +1 -0
- package/dist/esm/modules/temporal/adapters/dayjs.d.ts +1 -1
- package/dist/esm/modules/temporal/adapters/dayjs.d.ts.map +1 -1
- package/dist/esm/modules/temporal/adapters/dayjs.js +3 -3
- package/dist/esm/modules/temporal/adapters/dayjs.js.map +1 -1
- package/dist/esm/modules/temporal/adapters/intl.d.ts +1 -1
- package/dist/esm/modules/temporal/adapters/intl.d.ts.map +1 -1
- package/dist/esm/modules/temporal/adapters/intl.js +7 -7
- package/dist/esm/modules/temporal/adapters/intl.js.map +1 -1
- package/dist/esm/modules/temporal/adapters/luxon.d.ts +1 -1
- package/dist/esm/modules/temporal/adapters/luxon.d.ts.map +1 -1
- package/dist/esm/modules/temporal/adapters/luxon.js +3 -3
- package/dist/esm/modules/temporal/adapters/luxon.js.map +1 -1
- package/dist/esm/modules/temporal/adapters/native.d.ts +3 -1
- package/dist/esm/modules/temporal/adapters/native.d.ts.map +1 -1
- package/dist/esm/modules/temporal/adapters/native.js +13 -5
- package/dist/esm/modules/temporal/adapters/native.js.map +1 -1
- package/dist/esm/modules/temporal/calendar/calendar.d.ts +56 -0
- package/dist/esm/modules/temporal/calendar/calendar.d.ts.map +1 -0
- package/dist/esm/modules/temporal/calendar/calendar.js +162 -0
- package/dist/esm/modules/temporal/calendar/calendar.js.map +1 -0
- package/dist/esm/modules/temporal/calendar/index.d.ts +2 -0
- package/dist/esm/modules/temporal/calendar/index.d.ts.map +1 -0
- package/dist/esm/modules/temporal/calendar/index.js +2 -0
- package/dist/esm/modules/temporal/calendar/index.js.map +1 -0
- package/dist/esm/modules/temporal/common/constants.d.ts +14 -3
- package/dist/esm/modules/temporal/common/constants.d.ts.map +1 -1
- package/dist/esm/modules/temporal/common/constants.js +21 -3
- package/dist/esm/modules/temporal/common/constants.js.map +1 -1
- package/dist/esm/modules/temporal/common/types.d.ts +259 -5
- package/dist/esm/modules/temporal/common/types.d.ts.map +1 -1
- package/dist/esm/modules/temporal/{duration.d.ts → duration/duration.d.ts} +9 -2
- package/dist/esm/modules/temporal/duration/duration.d.ts.map +1 -0
- package/dist/esm/modules/temporal/duration/duration.js +131 -0
- package/dist/esm/modules/temporal/duration/duration.js.map +1 -0
- package/dist/esm/modules/temporal/duration/index.d.ts +2 -0
- package/dist/esm/modules/temporal/duration/index.d.ts.map +1 -0
- package/dist/esm/modules/temporal/duration/index.js +2 -0
- package/dist/esm/modules/temporal/duration/index.js.map +1 -0
- package/dist/esm/modules/temporal/helper.d.ts +107 -78
- package/dist/esm/modules/temporal/helper.d.ts.map +1 -1
- package/dist/esm/modules/temporal/helper.js +208 -263
- package/dist/esm/modules/temporal/helper.js.map +1 -1
- package/dist/esm/modules/temporal/index.d.ts +1 -0
- package/dist/esm/modules/temporal/index.d.ts.map +1 -1
- package/dist/esm/modules/temporal/index.js +1 -0
- package/dist/esm/modules/temporal/index.js.map +1 -1
- package/dist/esm/modules/temporal/locale/index.d.ts +2 -0
- package/dist/esm/modules/temporal/locale/index.d.ts.map +1 -0
- package/dist/esm/modules/temporal/locale/index.js +2 -0
- package/dist/esm/modules/temporal/locale/index.js.map +1 -0
- package/dist/{cjs/modules/temporal → esm/modules/temporal/locale}/locale.d.ts +3 -2
- package/dist/esm/modules/temporal/locale/locale.d.ts.map +1 -0
- package/dist/esm/modules/temporal/{locale.js → locale/locale.js} +3 -3
- package/dist/esm/modules/temporal/locale/locale.js.map +1 -0
- package/dist/esm/modules/temporal/pattern/common/index.d.ts +2 -0
- package/dist/esm/modules/temporal/pattern/common/index.d.ts.map +1 -0
- package/dist/esm/modules/temporal/pattern/common/index.js +2 -0
- package/dist/esm/modules/temporal/pattern/common/index.js.map +1 -0
- package/dist/esm/modules/temporal/pattern/common/types.d.ts +26 -0
- package/dist/esm/modules/temporal/pattern/common/types.d.ts.map +1 -0
- package/dist/esm/modules/temporal/pattern/common/types.js +2 -0
- package/dist/esm/modules/temporal/pattern/common/types.js.map +1 -0
- package/dist/esm/modules/temporal/pattern/index.d.ts +4 -0
- package/dist/esm/modules/temporal/pattern/index.d.ts.map +1 -0
- package/dist/esm/modules/temporal/pattern/index.js +4 -0
- package/dist/esm/modules/temporal/pattern/index.js.map +1 -0
- package/dist/{cjs/modules/temporal → esm/modules/temporal/pattern}/pattern.d.ts +2 -1
- package/dist/esm/modules/temporal/pattern/pattern.d.ts.map +1 -0
- package/dist/esm/modules/temporal/{pattern.js → pattern/pattern.js} +20 -15
- package/dist/esm/modules/temporal/pattern/pattern.js.map +1 -0
- package/dist/esm/modules/temporal/pattern/tokens.d.ts +59 -0
- package/dist/esm/modules/temporal/pattern/tokens.d.ts.map +1 -0
- package/dist/esm/modules/temporal/pattern/tokens.js +191 -0
- package/dist/esm/modules/temporal/pattern/tokens.js.map +1 -0
- package/package.json +1 -1
- package/dist/cjs/modules/temporal/adapters/guards.d.ts +0 -4
- package/dist/cjs/modules/temporal/adapters/guards.d.ts.map +0 -1
- package/dist/cjs/modules/temporal/adapters/guards.js +0 -14
- package/dist/cjs/modules/temporal/adapters/guards.js.map +0 -1
- package/dist/cjs/modules/temporal/calendar.d.ts +0 -52
- package/dist/cjs/modules/temporal/calendar.d.ts.map +0 -1
- package/dist/cjs/modules/temporal/calendar.js +0 -151
- package/dist/cjs/modules/temporal/calendar.js.map +0 -1
- package/dist/cjs/modules/temporal/duration.d.ts.map +0 -1
- package/dist/cjs/modules/temporal/duration.js +0 -64
- package/dist/cjs/modules/temporal/duration.js.map +0 -1
- package/dist/cjs/modules/temporal/locale.d.ts.map +0 -1
- package/dist/cjs/modules/temporal/locale.js.map +0 -1
- package/dist/cjs/modules/temporal/pattern.d.ts.map +0 -1
- package/dist/cjs/modules/temporal/pattern.js.map +0 -1
- package/dist/cjs/modules/temporal/tokens.d.ts +0 -78
- package/dist/cjs/modules/temporal/tokens.d.ts.map +0 -1
- package/dist/cjs/modules/temporal/tokens.js +0 -145
- package/dist/cjs/modules/temporal/tokens.js.map +0 -1
- package/dist/esm/modules/temporal/adapters/guards.d.ts +0 -4
- package/dist/esm/modules/temporal/adapters/guards.d.ts.map +0 -1
- package/dist/esm/modules/temporal/adapters/guards.js +0 -10
- package/dist/esm/modules/temporal/adapters/guards.js.map +0 -1
- package/dist/esm/modules/temporal/calendar.d.ts +0 -52
- package/dist/esm/modules/temporal/calendar.d.ts.map +0 -1
- package/dist/esm/modules/temporal/calendar.js +0 -138
- package/dist/esm/modules/temporal/calendar.js.map +0 -1
- package/dist/esm/modules/temporal/duration.d.ts.map +0 -1
- package/dist/esm/modules/temporal/duration.js +0 -60
- package/dist/esm/modules/temporal/duration.js.map +0 -1
- package/dist/esm/modules/temporal/locale.d.ts.map +0 -1
- package/dist/esm/modules/temporal/locale.js.map +0 -1
- package/dist/esm/modules/temporal/pattern.d.ts.map +0 -1
- package/dist/esm/modules/temporal/pattern.js.map +0 -1
- package/dist/esm/modules/temporal/tokens.d.ts +0 -78
- package/dist/esm/modules/temporal/tokens.d.ts.map +0 -1
- package/dist/esm/modules/temporal/tokens.js +0 -133
- package/dist/esm/modules/temporal/tokens.js.map +0 -1
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { HTTP } from '../../common/constants/http.js';
|
|
2
|
+
import { BaseHelper } from '../base.js';
|
|
3
|
+
import { getError, isApplicationError } from '../error/index.js';
|
|
4
|
+
import { IntlTemporalAdapter } from './adapters/intl.js';
|
|
5
|
+
import { NativeTemporalAdapter } from './adapters/native.js';
|
|
6
|
+
import { TemporalCalendar } from './calendar/index.js';
|
|
7
|
+
import { DEFAULT_TEMPORAL_LOCALE, DEFAULT_TEMPORAL_TZ as DEFAULT_TEMPORAL_TZ, TemporalUnits, } from './common/constants.js';
|
|
8
|
+
import { TemporalLocale } from './locale/index.js';
|
|
9
|
+
const DAY_MILLISECONDS = 86_400_000;
|
|
10
|
+
/** 0001-01-01T00:00:00.000Z and 9999-12-31T23:59:59.999Z. */
|
|
11
|
+
const MIN_INSTANT = -62_135_596_800_000;
|
|
12
|
+
const MAX_INSTANT = 253_402_300_799_999;
|
|
13
|
+
const MAX_KNOWN_TIME_ZONES = 256;
|
|
14
|
+
/** How many entries each `names` list must hold. */
|
|
15
|
+
const NAME_LENGTHS = {
|
|
16
|
+
months: 12,
|
|
17
|
+
monthsShort: 12,
|
|
18
|
+
weekdays: 7,
|
|
19
|
+
weekdaysShort: 7,
|
|
20
|
+
weekdaysMin: 7,
|
|
21
|
+
meridiem: 2,
|
|
22
|
+
};
|
|
23
|
+
const OUT_OF_RANGE = `outside the years ${TemporalCalendar.MIN_YEAR}-${TemporalCalendar.MAX_YEAR}`; /**
|
|
24
|
+
* The machinery every temporal helper shares: the adapter, the zone and locale it holds, reading a
|
|
25
|
+
* zone's offset, turning wall clocks into instants across daylight-saving gaps and repeats, and the
|
|
26
|
+
* input checks. A helper extends this and supplies the operations in `ITemporalHelper`.
|
|
27
|
+
*/
|
|
28
|
+
export class AbstractTemporalHelper extends BaseHelper {
|
|
29
|
+
/** Validated once per process: `Intl` answers the same for a zone name every time. */
|
|
30
|
+
static { this.knownTzs = new Set(); }
|
|
31
|
+
/**
|
|
32
|
+
* `locale` (default `en-US`) spells month and weekday names, AM/PM, relative time and durations,
|
|
33
|
+
* unless a call passes its own. `names` replaces `Intl`'s wording for a locale - month and weekday
|
|
34
|
+
* names, the AM/PM marker - keyed by a locale tag; a call in another tag of the same language (`vi`
|
|
35
|
+
* for a `vi-VN` entry) uses it too. `fallback` is what `format` and `formatIntl` write for a value
|
|
36
|
+
* that is not a date when a call gives none; without it, such a value is a 400.
|
|
37
|
+
*/
|
|
38
|
+
constructor(opts) {
|
|
39
|
+
super({ scope: opts?.scope ?? new.target.name });
|
|
40
|
+
/** Which `names` entry each locale a call wrote in resolved to - `names` never changes after construction. */
|
|
41
|
+
this.namesByLocale = new Map();
|
|
42
|
+
this.tz = AbstractTemporalHelper.ensureTz({
|
|
43
|
+
tz: opts?.tz ?? DEFAULT_TEMPORAL_TZ,
|
|
44
|
+
statusCode: HTTP.ResultCodes.RS_5.InternalServerError,
|
|
45
|
+
});
|
|
46
|
+
this.locale = AbstractTemporalHelper.ensureLocale({
|
|
47
|
+
locale: opts?.locale ?? DEFAULT_TEMPORAL_LOCALE,
|
|
48
|
+
});
|
|
49
|
+
this.adapter = opts?.adapter ?? AbstractTemporalHelper.defaultAdapter();
|
|
50
|
+
this.names = AbstractTemporalHelper.ensureNames({ names: opts?.names ?? {} });
|
|
51
|
+
this.fallback = opts?.fallback;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The zone a `Date`'s local getters use on this runtime - the browser's or the server's. The one
|
|
55
|
+
* place this helper reads the host zone, and only when a wall-clock bridge is not given one.
|
|
56
|
+
*/
|
|
57
|
+
static getHostTz() {
|
|
58
|
+
return new Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
59
|
+
}
|
|
60
|
+
/** The instant whose wall clock in `to` reads what `value`'s wall clock reads in `from`. */
|
|
61
|
+
moveWallClock(opts) {
|
|
62
|
+
const from = this.resolveTz({ tz: opts.from });
|
|
63
|
+
const to = this.resolveTz({ tz: opts.to });
|
|
64
|
+
const date = this.toDate({ value: opts.value, tz: from });
|
|
65
|
+
const wall = TemporalCalendar.wallClockOf({
|
|
66
|
+
parts: this.zonedParts({ epoch: date.getTime(), tz: from }),
|
|
67
|
+
});
|
|
68
|
+
return AbstractTemporalHelper.ensureInstant({
|
|
69
|
+
epoch: this.earliestOf({ parts: wall, tz: to }),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/** Every list the right length, so a bad table fails when the helper is built, not on a screen. */
|
|
73
|
+
static ensureNames(opts) {
|
|
74
|
+
for (const [locale, names] of Object.entries(opts.names)) {
|
|
75
|
+
AbstractTemporalHelper.ensureLocale({ locale });
|
|
76
|
+
for (const [key, length] of Object.entries(NAME_LENGTHS)) {
|
|
77
|
+
const list = Reflect.get(names, key);
|
|
78
|
+
if (list === undefined) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (!Array.isArray(list) ||
|
|
82
|
+
list.length !== length ||
|
|
83
|
+
!list.every(entry => typeof entry === 'string')) {
|
|
84
|
+
throw getError({
|
|
85
|
+
statusCode: HTTP.ResultCodes.RS_5.InternalServerError,
|
|
86
|
+
message: `[TemporalHelper] names['${locale}'].${key} must hold ${length} strings`,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return opts.names;
|
|
92
|
+
}
|
|
93
|
+
/** The wording this helper holds for `locale`, if any. */
|
|
94
|
+
namesOf(opts) {
|
|
95
|
+
const { locale } = opts;
|
|
96
|
+
if (Object.hasOwn(this.names, locale)) {
|
|
97
|
+
return this.names[locale];
|
|
98
|
+
}
|
|
99
|
+
if (this.namesByLocale.has(locale)) {
|
|
100
|
+
return this.namesByLocale.get(locale);
|
|
101
|
+
}
|
|
102
|
+
// A malformed tag is the caller's 400, before it reaches `Intl.Locale`.
|
|
103
|
+
AbstractTemporalHelper.ensureLocale({ locale });
|
|
104
|
+
// No entry for the exact tag: one for the same language serves - `vi` reads a `vi-VN` entry.
|
|
105
|
+
const language = new Intl.Locale(locale).language;
|
|
106
|
+
const match = Object.keys(this.names).find(key => new Intl.Locale(key).language === language);
|
|
107
|
+
const names = match === undefined ? undefined : this.names[match];
|
|
108
|
+
this.namesByLocale.set(locale, names);
|
|
109
|
+
return names;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The value as a date for a writer: with a fallback - the call's, else the helper's - a value that
|
|
113
|
+
* is not a date answers `null`; without one it is a 400, null included.
|
|
114
|
+
*/
|
|
115
|
+
readDate(opts) {
|
|
116
|
+
const { value, tz } = opts;
|
|
117
|
+
if ((opts.fallback ?? this.fallback) !== undefined) {
|
|
118
|
+
return this.tryToDate({ value, tz });
|
|
119
|
+
}
|
|
120
|
+
if (value === null || value === undefined) {
|
|
121
|
+
throw AbstractTemporalHelper.notADate({ value });
|
|
122
|
+
}
|
|
123
|
+
return this.toDate({ value, tz });
|
|
124
|
+
}
|
|
125
|
+
/** The runtime's `Temporal` where it has one; `Intl`, which every runtime has, everywhere else. */
|
|
126
|
+
static defaultAdapter() {
|
|
127
|
+
return NativeTemporalAdapter.isTemporalNamespace(Reflect.get(globalThis, 'Temporal'))
|
|
128
|
+
? new NativeTemporalAdapter()
|
|
129
|
+
: new IntlTemporalAdapter();
|
|
130
|
+
}
|
|
131
|
+
static ensureLocale(opts) {
|
|
132
|
+
TemporalLocale.of({ locale: opts.locale });
|
|
133
|
+
return opts.locale;
|
|
134
|
+
}
|
|
135
|
+
/** A parse or input error the caller may treat as "not a date"; anything else is a bug and still throws. */
|
|
136
|
+
static isRefusal(error) {
|
|
137
|
+
return isApplicationError(error) && error.statusCode === HTTP.ResultCodes.RS_4.BadRequest;
|
|
138
|
+
}
|
|
139
|
+
static ensureTz(opts) {
|
|
140
|
+
const { tz, statusCode } = opts;
|
|
141
|
+
if (AbstractTemporalHelper.knownTzs.has(tz)) {
|
|
142
|
+
return tz;
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
new Intl.DateTimeFormat('en-US', { timeZone: tz });
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
throw getError({
|
|
149
|
+
statusCode,
|
|
150
|
+
message: `[TemporalHelper] unknown time zone '${tz}' | ${error instanceof Error ? error.message : String(error)}`,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (AbstractTemporalHelper.knownTzs.size < MAX_KNOWN_TIME_ZONES) {
|
|
154
|
+
AbstractTemporalHelper.knownTzs.add(tz);
|
|
155
|
+
}
|
|
156
|
+
return tz;
|
|
157
|
+
}
|
|
158
|
+
static ensureUnit(opts) {
|
|
159
|
+
const { unit, amount } = opts;
|
|
160
|
+
if (!TemporalUnits.isValid(unit)) {
|
|
161
|
+
throw getError({
|
|
162
|
+
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
163
|
+
message: `[TemporalHelper] unknown unit '${unit}' | Supported: ${[...TemporalUnits.SCHEME_SET].join(', ')}`,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (amount === undefined) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Elapsed time takes a fraction (1.5 hours is 90 minutes); a calendar unit has no half.
|
|
170
|
+
const isElapsed = TemporalCalendar.EXACT_UNIT_MILLISECONDS[unit] !== undefined;
|
|
171
|
+
if (isElapsed ? !Number.isFinite(amount) : !Number.isInteger(amount)) {
|
|
172
|
+
throw getError({
|
|
173
|
+
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
174
|
+
message: isElapsed
|
|
175
|
+
? `[TemporalHelper] amount must be a finite number - received ${amount}`
|
|
176
|
+
: `[TemporalHelper] amount must be an integer for '${unit}' - received ${amount}`,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/** Every result passes here: an overflowing `add` is refused, never an Invalid Date. */
|
|
181
|
+
static ensureInstant(opts) {
|
|
182
|
+
const { epoch } = opts;
|
|
183
|
+
if (!(epoch >= MIN_INSTANT && epoch <= MAX_INSTANT)) {
|
|
184
|
+
throw getError({
|
|
185
|
+
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
186
|
+
message: `[TemporalHelper] ${Number.isNaN(epoch) ? 'invalid date' : OUT_OF_RANGE} - received ${epoch}`,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return new Date(epoch);
|
|
190
|
+
}
|
|
191
|
+
static ensureYear(opts) {
|
|
192
|
+
if (!TemporalCalendar.isSupportedYear({ year: opts.parts.year })) {
|
|
193
|
+
throw getError({
|
|
194
|
+
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
195
|
+
message: `[TemporalHelper] year ${opts.parts.year} is ${OUT_OF_RANGE}`,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
resolveTz(opts) {
|
|
200
|
+
return opts.tz === undefined
|
|
201
|
+
? this.tz
|
|
202
|
+
: AbstractTemporalHelper.ensureTz({
|
|
203
|
+
tz: opts.tz,
|
|
204
|
+
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/** The adapter's one answer, rounded: an offset is whole milliseconds, a library's float may not be. */
|
|
208
|
+
offsetAt(opts) {
|
|
209
|
+
return Math.round(this.adapter.getOffsetMilliseconds({ value: new Date(opts.epoch), tz: opts.tz }));
|
|
210
|
+
}
|
|
211
|
+
zonedParts(opts) {
|
|
212
|
+
const parts = TemporalCalendar.wallClockAt({
|
|
213
|
+
epoch: opts.epoch,
|
|
214
|
+
offsetMilliseconds: this.offsetAt(opts),
|
|
215
|
+
});
|
|
216
|
+
AbstractTemporalHelper.ensureYear({ parts });
|
|
217
|
+
return parts;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Every instant whose wall clock reads `parts` in the zone, earliest first: one as a rule, two
|
|
221
|
+
* when the clock goes back, none when it jumps forward. `forward` is where a skipped time lands -
|
|
222
|
+
* read with the offset from before the jump, so it moves past the gap.
|
|
223
|
+
*/
|
|
224
|
+
instantsOf(opts) {
|
|
225
|
+
const { parts, tz } = opts;
|
|
226
|
+
const local = TemporalCalendar.epochAtOffset({ parts, offsetMilliseconds: 0 });
|
|
227
|
+
const before = this.offsetAt({ epoch: local - DAY_MILLISECONDS, tz });
|
|
228
|
+
const after = this.offsetAt({ epoch: local + DAY_MILLISECONDS, tz });
|
|
229
|
+
const offsets = before === after ? [before] : [before, after];
|
|
230
|
+
const instants = [];
|
|
231
|
+
for (const offset of offsets) {
|
|
232
|
+
const candidate = local - offset;
|
|
233
|
+
if (this.offsetAt({ epoch: candidate, tz }) === offset) {
|
|
234
|
+
instants.push(candidate);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
instants.sort((left, right) => left - right);
|
|
238
|
+
return { instants, forward: local - before };
|
|
239
|
+
}
|
|
240
|
+
/** The instant wall-clock `parts` name: a skipped time moves forward, a repeated one takes the earlier. */
|
|
241
|
+
earliestOf(opts) {
|
|
242
|
+
const { instants, forward } = this.instantsOf(opts);
|
|
243
|
+
return instants[0] ?? forward;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* `[start, end)` of the unit holding `epoch`. A day or longer starts at its first instant. An hour
|
|
247
|
+
* or less repeats when the clock goes back, so it starts at the latest start not after `epoch`,
|
|
248
|
+
* and ends where the wall clock next shows either the following unit or this one's start again.
|
|
249
|
+
*/
|
|
250
|
+
unitBounds(opts) {
|
|
251
|
+
const { epoch, unit, tz } = opts;
|
|
252
|
+
const startParts = TemporalCalendar.truncate({
|
|
253
|
+
parts: this.zonedParts({ epoch, tz }),
|
|
254
|
+
unit,
|
|
255
|
+
});
|
|
256
|
+
const nextParts = TemporalCalendar.shift({ parts: startParts, amount: 1, unit });
|
|
257
|
+
AbstractTemporalHelper.ensureYear({ parts: nextParts });
|
|
258
|
+
const starts = this.instantsOf({ parts: startParts, tz });
|
|
259
|
+
if (TemporalCalendar.EXACT_UNIT_MILLISECONDS[unit] === undefined) {
|
|
260
|
+
const start = starts.instants[0] ?? starts.forward;
|
|
261
|
+
return { start, end: this.earliestOf({ parts: nextParts, tz }) };
|
|
262
|
+
}
|
|
263
|
+
const started = starts.instants.filter(instant => instant <= epoch);
|
|
264
|
+
const start = started.at(-1) ?? starts.instants[0] ?? starts.forward;
|
|
265
|
+
const nexts = this.instantsOf({ parts: nextParts, tz });
|
|
266
|
+
const following = nexts.instants.find(instant => instant > start) ?? nexts.forward;
|
|
267
|
+
const repeated = starts.instants.find(instant => instant > start);
|
|
268
|
+
return { start, end: repeated === undefined ? following : Math.min(repeated, following) };
|
|
269
|
+
}
|
|
270
|
+
getTz() {
|
|
271
|
+
return this.tz;
|
|
272
|
+
}
|
|
273
|
+
getLocale() {
|
|
274
|
+
return this.locale;
|
|
275
|
+
}
|
|
276
|
+
now() {
|
|
277
|
+
return new Date();
|
|
278
|
+
}
|
|
279
|
+
/** The instant a value names. An ISO string without an offset is read as wall clock in the zone. */
|
|
280
|
+
toDate(opts) {
|
|
281
|
+
const { value } = opts;
|
|
282
|
+
if (typeof value === 'string') {
|
|
283
|
+
return this.parse({ value, tz: opts.tz });
|
|
284
|
+
}
|
|
285
|
+
if (value instanceof Date) {
|
|
286
|
+
return AbstractTemporalHelper.ensureInstant({ epoch: value.getTime() });
|
|
287
|
+
}
|
|
288
|
+
if (typeof value === 'number') {
|
|
289
|
+
return AbstractTemporalHelper.ensureInstant({ epoch: value });
|
|
290
|
+
}
|
|
291
|
+
// `null` above all: read as a number it would be 1970, a date nobody meant.
|
|
292
|
+
throw AbstractTemporalHelper.notADate({ value });
|
|
293
|
+
}
|
|
294
|
+
static notADate(opts) {
|
|
295
|
+
const { value } = opts;
|
|
296
|
+
return getError({
|
|
297
|
+
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
298
|
+
message: `[TemporalHelper] not a date - received ${value === null ? 'null' : typeof value}`,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
/** `toDate`, answering `null` where `toDate` refuses the value: null, undefined, bad text, NaN. */
|
|
302
|
+
tryToDate(opts) {
|
|
303
|
+
const { value } = opts;
|
|
304
|
+
// Outside the try: a bad zone is the caller's bug, not an unreadable value.
|
|
305
|
+
const tz = this.resolveTz({ tz: opts.tz });
|
|
306
|
+
if (value === null || value === undefined) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
try {
|
|
310
|
+
return this.toDate({ value, tz });
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
if (AbstractTemporalHelper.isRefusal(error)) {
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/** The wall clock the value shows in the zone, with its ISO weekday and UTC offset. */
|
|
320
|
+
parts(opts) {
|
|
321
|
+
const tz = this.resolveTz({ tz: opts.tz });
|
|
322
|
+
const date = this.toDate({ value: opts.value, tz });
|
|
323
|
+
return this.zonedParts({ epoch: date.getTime(), tz });
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Fractional months from `other` to `value` (dayjs and moment's month difference): anchored on the
|
|
327
|
+
* date with the later day of the month, whole months by `add`, the rest as a share of the month
|
|
328
|
+
* it falls in.
|
|
329
|
+
*/
|
|
330
|
+
monthGap(opts) {
|
|
331
|
+
const { value, other, tz } = opts;
|
|
332
|
+
const valueParts = this.zonedParts({ epoch: value, tz });
|
|
333
|
+
const otherParts = this.zonedParts({ epoch: other, tz });
|
|
334
|
+
if (valueParts.day < otherParts.day) {
|
|
335
|
+
return -this.monthGap({ value: other, other: value, tz });
|
|
336
|
+
}
|
|
337
|
+
const whole = (otherParts.year - valueParts.year) * 12 + (otherParts.month - valueParts.month);
|
|
338
|
+
const anchor = this.shiftMonthsFrom({ parts: valueParts, months: whole, tz });
|
|
339
|
+
const isBelow = other - anchor < 0;
|
|
340
|
+
const nextAnchor = this.shiftMonthsFrom({
|
|
341
|
+
parts: valueParts,
|
|
342
|
+
months: whole + (isBelow ? -1 : 1),
|
|
343
|
+
tz,
|
|
344
|
+
});
|
|
345
|
+
const span = isBelow ? anchor - nextAnchor : nextAnchor - anchor;
|
|
346
|
+
return -(whole + (other - anchor) / span) || 0;
|
|
347
|
+
}
|
|
348
|
+
/** `add` by months without the 1-9999 check: an anchor one month past the range is still a number. */
|
|
349
|
+
shiftMonthsFrom(opts) {
|
|
350
|
+
const { parts, months, tz } = opts;
|
|
351
|
+
const shifted = TemporalCalendar.shift({
|
|
352
|
+
parts: TemporalCalendar.wallClockOf({ parts }),
|
|
353
|
+
amount: months,
|
|
354
|
+
unit: TemporalUnits.MONTH,
|
|
355
|
+
});
|
|
356
|
+
return this.earliestOf({ parts: shifted, tz });
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=abstract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../../src/modules/temporal/abstract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dayjs.d.ts","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/dayjs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAUvE;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;gBAE1B,IAAI,EAAE;QAAE,KAAK,EAAE,aAAa,CAAA;KAAE;IAY1C,qBAAqB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,
|
|
1
|
+
{"version":3,"file":"dayjs.d.ts","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/dayjs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAUvE;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;gBAE1B,IAAI,EAAE;QAAE,KAAK,EAAE,aAAa,CAAA;KAAE;IAY1C,qBAAqB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;CAiBjE"}
|
|
@@ -25,18 +25,18 @@ export class DayjsTemporalAdapter {
|
|
|
25
25
|
this.dayjs = opts.dayjs;
|
|
26
26
|
}
|
|
27
27
|
getOffsetMilliseconds(opts) {
|
|
28
|
-
const { value,
|
|
28
|
+
const { value, tz } = opts;
|
|
29
29
|
let epoch = value.getTime();
|
|
30
30
|
while (epoch < FIRST_SAFE_EPOCH) {
|
|
31
31
|
epoch += GREGORIAN_CYCLE_MILLISECONDS;
|
|
32
32
|
}
|
|
33
33
|
try {
|
|
34
|
-
return this.dayjs(epoch).tz(
|
|
34
|
+
return this.dayjs(epoch).tz(tz).utcOffset() * MILLISECONDS_PER_MINUTE;
|
|
35
35
|
}
|
|
36
36
|
catch (error) {
|
|
37
37
|
throw getError({
|
|
38
38
|
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
39
|
-
message: `[DayjsTemporalAdapter] no offset for ${
|
|
39
|
+
message: `[DayjsTemporalAdapter] no offset for ${tz} at ${value.getTime()} | ${error instanceof Error ? error.message : String(error)}`,
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dayjs.js","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/dayjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,kFAAkF;AAClF,MAAM,4BAA4B,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D,+GAA+G;AAC/G,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAG/B,YAAY,IAA8B;QACxC,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,UAAU,EAAE,CAAC;YACzC,MAAM,QAAQ,CAAC;gBACb,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB;gBACrD,OAAO,EACL,sIAAsI;aACzI,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"dayjs.js","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/dayjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,kFAAkF;AAClF,MAAM,4BAA4B,GAAG,OAAO,GAAG,UAAU,CAAC;AAE1D,+GAA+G;AAC/G,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAG/B,YAAY,IAA8B;QACxC,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,UAAU,EAAE,CAAC;YACzC,MAAM,QAAQ,CAAC;gBACb,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB;gBACrD,OAAO,EACL,sIAAsI;aACzI,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,qBAAqB,CAAC,IAAiC;QACrD,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;QAE3B,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,KAAK,GAAG,gBAAgB,EAAE,CAAC;YAChC,KAAK,IAAI,4BAA4B,CAAC;QACxC,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,uBAAuB,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,CAAC;gBACb,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU;gBAC5C,OAAO,EAAE,wCAAwC,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aACxI,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intl.d.ts","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/intl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAOxD;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,gBAAgB;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAG9B;IAEJ,gIAAgI;IAChI,OAAO,CAAC,MAAM,CAAC,WAAW;IA4C1B,qBAAqB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,
|
|
1
|
+
{"version":3,"file":"intl.d.ts","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/intl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAOxD;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,gBAAgB;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAG9B;IAEJ,gIAAgI;IAChI,OAAO,CAAC,MAAM,CAAC,WAAW;IA4C1B,qBAAqB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;CA+BjE"}
|
|
@@ -12,15 +12,15 @@ export class IntlTemporalAdapter {
|
|
|
12
12
|
static { this.formatters = new Map(); }
|
|
13
13
|
/** The zone's formatter, and how it spells the common era - so any other era is before year 1, whatever the engine calls it. */
|
|
14
14
|
static formatterOf(opts) {
|
|
15
|
-
const {
|
|
16
|
-
const cached = IntlTemporalAdapter.formatters.get(
|
|
15
|
+
const { tz } = opts;
|
|
16
|
+
const cached = IntlTemporalAdapter.formatters.get(tz);
|
|
17
17
|
if (cached) {
|
|
18
18
|
return cached;
|
|
19
19
|
}
|
|
20
20
|
let formatter;
|
|
21
21
|
try {
|
|
22
22
|
formatter = new Intl.DateTimeFormat('en-US', {
|
|
23
|
-
timeZone,
|
|
23
|
+
timeZone: tz,
|
|
24
24
|
hourCycle: 'h23',
|
|
25
25
|
era: 'short',
|
|
26
26
|
year: 'numeric',
|
|
@@ -34,7 +34,7 @@ export class IntlTemporalAdapter {
|
|
|
34
34
|
catch (error) {
|
|
35
35
|
throw getError({
|
|
36
36
|
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
37
|
-
message: `[IntlTemporalAdapter] unknown time zone '${
|
|
37
|
+
message: `[IntlTemporalAdapter] unknown time zone '${tz}' | ${error instanceof Error ? error.message : String(error)}`,
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
40
|
const commonEra = formatter.formatToParts(new Date(0)).find(part => part.type === 'era')?.value;
|
|
@@ -46,15 +46,15 @@ export class IntlTemporalAdapter {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
const entry = { formatter, commonEra };
|
|
49
|
-
IntlTemporalAdapter.formatters.set(
|
|
49
|
+
IntlTemporalAdapter.formatters.set(tz, entry);
|
|
50
50
|
return entry;
|
|
51
51
|
}
|
|
52
52
|
getOffsetMilliseconds(opts) {
|
|
53
|
-
const { value,
|
|
53
|
+
const { value, tz } = opts;
|
|
54
54
|
const epoch = value.getTime();
|
|
55
55
|
const fields = { year: 0, month: 1, day: 1, hour: 0, minute: 0, second: 0 };
|
|
56
56
|
let isBeforeCommonEra = false;
|
|
57
|
-
const { formatter, commonEra } = IntlTemporalAdapter.formatterOf({
|
|
57
|
+
const { formatter, commonEra } = IntlTemporalAdapter.formatterOf({ tz });
|
|
58
58
|
for (const part of formatter.formatToParts(value)) {
|
|
59
59
|
if (part.type === 'era') {
|
|
60
60
|
isBeforeCommonEra = commonEra !== undefined && part.value !== commonEra;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intl.js","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/intl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,+FAA+F;AAC/F,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;aACN,eAAU,GAAG,IAAI,GAAG,EAGzC,CAAC;IAEJ,gIAAgI;IACxH,MAAM,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"intl.js","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/intl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"luxon.d.ts","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/luxon.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAI/E,oFAAoF;AACpF,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;gBAErC,IAAI,EAAE;QAAE,QAAQ,EAAE,qBAAqB,CAAA;KAAE;IAIrD,qBAAqB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,
|
|
1
|
+
{"version":3,"file":"luxon.d.ts","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/luxon.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAI/E,oFAAoF;AACpF,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;gBAErC,IAAI,EAAE;QAAE,QAAQ,EAAE,qBAAqB,CAAA;KAAE;IAIrD,qBAAqB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;CAajE"}
|
|
@@ -7,13 +7,13 @@ export class LuxonTemporalAdapter {
|
|
|
7
7
|
this.dateTime = opts.DateTime;
|
|
8
8
|
}
|
|
9
9
|
getOffsetMilliseconds(opts) {
|
|
10
|
-
const { value,
|
|
11
|
-
const zoned = this.dateTime.fromMillis(value.getTime(), { zone:
|
|
10
|
+
const { value, tz } = opts;
|
|
11
|
+
const zoned = this.dateTime.fromMillis(value.getTime(), { zone: tz });
|
|
12
12
|
// Luxon answers an unusable zone with an invalid `DateTime` rather than a throw.
|
|
13
13
|
if (!zoned.isValid) {
|
|
14
14
|
throw getError({
|
|
15
15
|
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
16
|
-
message: `[LuxonTemporalAdapter] no offset for ${
|
|
16
|
+
message: `[LuxonTemporalAdapter] no offset for ${tz} at ${value.getTime()} | ${zoned.invalidReason ?? 'invalid'}`,
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
return zoned.offset * MILLISECONDS_PER_MINUTE;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"luxon.js","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/luxon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,oFAAoF;AACpF,MAAM,OAAO,oBAAoB;IAG/B,YAAY,IAAyC;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"luxon.js","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/luxon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,oFAAoF;AACpF,MAAM,OAAO,oBAAoB;IAG/B,YAAY,IAAyC;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,qBAAqB,CAAC,IAAiC;QACrD,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAEtE,iFAAiF;QACjF,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,QAAQ,CAAC;gBACb,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU;gBAC5C,OAAO,EAAE,wCAAwC,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,aAAa,IAAI,SAAS,EAAE;aAClH,CAAC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,GAAG,uBAAuB,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -5,12 +5,14 @@ import type { ITemporalAdapter, ITemporalNamespace } from '../common/types.js';
|
|
|
5
5
|
*/
|
|
6
6
|
export declare class NativeTemporalAdapter implements ITemporalAdapter {
|
|
7
7
|
private readonly temporal;
|
|
8
|
+
/** A `Temporal` namespace - the runtime's global or a polyfill's - by the one member the adapter drives. */
|
|
9
|
+
static isTemporalNamespace(value: unknown): value is ITemporalNamespace;
|
|
8
10
|
constructor(opts?: {
|
|
9
11
|
temporal?: ITemporalNamespace;
|
|
10
12
|
});
|
|
11
13
|
getOffsetMilliseconds(opts: {
|
|
12
14
|
value: Date;
|
|
13
|
-
|
|
15
|
+
tz: string;
|
|
14
16
|
}): number;
|
|
15
17
|
}
|
|
16
18
|
//# sourceMappingURL=native.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/native.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/native.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAI5E;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,gBAAgB;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C,4GAA4G;IAC5G,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB;gBAY3D,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,kBAAkB,CAAA;KAAE;IAcpD,qBAAqB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;CAejE"}
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { HTTP } from '../../../common/constants/http.js';
|
|
2
2
|
import { getError } from '../../error/index.js';
|
|
3
|
-
import { isTemporalNamespace } from './guards.js';
|
|
4
3
|
const NANOSECONDS_PER_MILLISECOND = 1_000_000;
|
|
5
4
|
/**
|
|
6
5
|
* Time zones through the TC39 `Temporal` API: the runtime's global (Bun has it, as do current
|
|
7
6
|
* browsers), or a polyfill's namespace passed as `temporal`.
|
|
8
7
|
*/
|
|
9
8
|
export class NativeTemporalAdapter {
|
|
9
|
+
/** A `Temporal` namespace - the runtime's global or a polyfill's - by the one member the adapter drives. */
|
|
10
|
+
static isTemporalNamespace(value) {
|
|
11
|
+
if (typeof value !== 'object' || value === null || !('Instant' in value)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const instant = value.Instant;
|
|
15
|
+
return ((typeof instant === 'function' || (typeof instant === 'object' && instant !== null)) &&
|
|
16
|
+
typeof Reflect.get(instant, 'fromEpochMilliseconds') === 'function');
|
|
17
|
+
}
|
|
10
18
|
constructor(opts) {
|
|
11
19
|
const temporal = opts?.temporal ?? Reflect.get(globalThis, 'Temporal');
|
|
12
|
-
if (!isTemporalNamespace(temporal)) {
|
|
20
|
+
if (!NativeTemporalAdapter.isTemporalNamespace(temporal)) {
|
|
13
21
|
throw getError({
|
|
14
22
|
statusCode: HTTP.ResultCodes.RS_5.InternalServerError,
|
|
15
23
|
message: '[NativeTemporalAdapter] Temporal is not available on this runtime | Pass a polyfill as `temporal`, or use DayjsTemporalAdapter / LuxonTemporalAdapter',
|
|
@@ -18,15 +26,15 @@ export class NativeTemporalAdapter {
|
|
|
18
26
|
this.temporal = temporal;
|
|
19
27
|
}
|
|
20
28
|
getOffsetMilliseconds(opts) {
|
|
21
|
-
const { value,
|
|
29
|
+
const { value, tz } = opts;
|
|
22
30
|
try {
|
|
23
|
-
const zoned = this.temporal.Instant.fromEpochMilliseconds(value.getTime()).toZonedDateTimeISO(
|
|
31
|
+
const zoned = this.temporal.Instant.fromEpochMilliseconds(value.getTime()).toZonedDateTimeISO(tz);
|
|
24
32
|
return zoned.offsetNanoseconds / NANOSECONDS_PER_MILLISECOND;
|
|
25
33
|
}
|
|
26
34
|
catch (error) {
|
|
27
35
|
throw getError({
|
|
28
36
|
statusCode: HTTP.ResultCodes.RS_4.BadRequest,
|
|
29
|
-
message: `[NativeTemporalAdapter] no offset for ${
|
|
37
|
+
message: `[NativeTemporalAdapter] no offset for ${tz} at ${value.getTime()} | ${error instanceof Error ? error.message : String(error)}`,
|
|
30
38
|
});
|
|
31
39
|
}
|
|
32
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../../../src/modules/temporal/adapters/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,MAAM,2BAA2B,GAAG,SAAS,CAAC;AAE9C;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IAGhC,4GAA4G;IAC5G,MAAM,CAAC,mBAAmB,CAAC,KAAc;QACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,EAAE,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,OAAO,CACL,CAAC,OAAO,OAAO,KAAK,UAAU,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;YACpF,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,uBAAuB,CAAC,KAAK,UAAU,CACpE,CAAC;IACJ,CAAC;IAED,YAAY,IAAwC;QAClD,MAAM,QAAQ,GAAY,IAAI,EAAE,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEhF,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,MAAM,QAAQ,CAAC;gBACb,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB;gBACrD,OAAO,EACL,uJAAuJ;aAC1J,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,qBAAqB,CAAC,IAAiC;QACrD,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,kBAAkB,CAC3F,EAAE,CACH,CAAC;YACF,OAAO,KAAK,CAAC,iBAAiB,GAAG,2BAA2B,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,CAAC;gBACb,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU;gBAC5C,OAAO,EAAE,yCAAyC,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aACzI,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|