atomic-fns 0.3.5 → 0.4.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 +2 -2
- package/{core → dist}/collections/BTree.d.ts +6 -6
- package/{core → dist}/collections/BTree.js +17 -17
- package/{core → dist}/collections/Heap.d.ts +3 -3
- package/{core → dist}/collections/Heap.js +0 -0
- package/dist/collections/LRUCache.d.ts +80 -0
- package/dist/collections/LRUCache.js +126 -0
- package/{core → dist}/collections/SortedMap.d.ts +2 -2
- package/{core → dist}/collections/SortedMap.js +0 -0
- package/{core → dist}/collections/SortedSet.d.ts +3 -3
- package/{core → dist}/collections/SortedSet.js +1 -1
- package/{core → dist}/collections/SortedTree.d.ts +3 -3
- package/{core → dist}/collections/SortedTree.js +1 -1
- package/{core → dist}/collections/SplayTree.d.ts +5 -5
- package/{core → dist}/collections/SplayTree.js +0 -0
- package/{core → dist}/collections/abc.d.ts +0 -0
- package/{core → dist}/collections/abc.js +0 -0
- package/{core → dist}/collections/deque.d.ts +6 -6
- package/{core → dist}/collections/deque.js +0 -0
- package/{core → dist}/collections/frozenset.d.ts +0 -0
- package/{core → dist}/collections/frozenset.js +3 -6
- package/{core → dist}/collections/index.d.ts +4 -4
- package/{core → dist}/collections/index.js +0 -0
- package/{core → dist}/functools/index.d.ts +27 -13
- package/{core → dist}/functools/index.js +34 -12
- package/{core → dist}/globals/index.d.ts +7 -10
- package/{core → dist}/globals/index.js +7 -14
- package/dist/i18n/date/index.d.ts +204 -0
- package/dist/i18n/date/index.js +530 -0
- package/dist/i18n/date/utils.d.ts +65 -0
- package/dist/i18n/date/utils.js +312 -0
- package/dist/i18n/duration.d.ts +112 -0
- package/dist/i18n/duration.js +392 -0
- package/dist/i18n/format.d.ts +26 -0
- package/dist/i18n/format.js +495 -0
- package/{core → dist}/i18n/index.d.ts +1 -1
- package/{core → dist}/i18n/index.js +1 -1
- package/{core → dist}/index.d.ts +0 -0
- package/{core → dist}/index.js +0 -0
- package/{core → dist}/itertools/index.d.ts +27 -27
- package/{core → dist}/itertools/index.js +24 -24
- package/{core → dist}/math/index.d.ts +3 -3
- package/{core → dist}/math/index.js +0 -0
- package/{core → dist}/operators/index.d.ts +2 -2
- package/{core → dist}/operators/index.js +2 -2
- package/{core → dist}/random/index.d.ts +1 -1
- package/{core → dist}/random/index.js +3 -3
- package/package.json +28 -42
- package/.editorconfig +0 -12
- package/.esdoc.json +0 -27
- package/.eslintignore +0 -1
- package/.eslintrc.json +0 -35
- package/.firebaserc +0 -5
- package/.prettierrc +0 -19
- package/core/collections/BTree.ts +0 -1340
- package/core/collections/Heap.ts +0 -189
- package/core/collections/LRUCache.d.ts +0 -152
- package/core/collections/LRUCache.js +0 -409
- package/core/collections/LRUCache.ts +0 -486
- package/core/collections/SortedMap.ts +0 -146
- package/core/collections/SortedSet.ts +0 -110
- package/core/collections/SortedTree.ts +0 -160
- package/core/collections/SplayTree.ts +0 -354
- package/core/collections/abc.ts +0 -176
- package/core/collections/deque.ts +0 -338
- package/core/collections/frozenset.ts +0 -37
- package/core/collections/index.ts +0 -1024
- package/core/collections/test.html +0 -10
- package/core/collections/typedArrays.d.ts +0 -31
- package/core/collections/typedArrays.js +0 -143
- package/core/collections/typedArrays.ts +0 -163
- package/core/functools/index.ts +0 -260
- package/core/globals/index.ts +0 -481
- package/core/i18n/date/format.d.ts +0 -16
- package/core/i18n/date/format.js +0 -307
- package/core/i18n/date/format.ts +0 -343
- package/core/i18n/date/index.d.ts +0 -224
- package/core/i18n/date/index.js +0 -387
- package/core/i18n/date/index.ts +0 -471
- package/core/i18n/date/test.html +0 -67
- package/core/i18n/index.ts +0 -8
- package/core/index.ts +0 -8
- package/core/itertools/index.ts +0 -494
- package/core/math/index.ts +0 -152
- package/core/operators/index.ts +0 -310
- package/core/random/index.ts +0 -66
- package/firebase.json +0 -10
- package/jasmine.json +0 -14
- package/tests/BTree.spec.ts +0 -143
- package/tests/Cache.spec.ts +0 -161
- package/tests/Heap.spec.ts +0 -66
- package/tests/SortedMap.spec.ts +0 -144
- package/tests/SortedSet.spec.ts +0 -84
- package/tests/SortedTree.spec.ts +0 -164
- package/tests/SplayTree.spec.ts +0 -121
- package/tests/collections.spec.ts +0 -288
- package/tests/deque.spec.ts +0 -107
- package/tests/globals.spec.ts +0 -270
- package/tests/itertools.spec.ts +0 -266
- package/tests/math.spec.ts +0 -25
- package/tests/operators.spec.ts +0 -40
- package/tests/random.spec.ts +0 -46
- package/tsconfig.json +0 -126
- package/tsconfig.node.json +0 -18
- package/tsconfig.xo.json +0 -9
package/core/i18n/date/format.js
DELETED
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
const NATIVE_DATE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
|
|
2
|
-
/**
|
|
3
|
-
* Returns a new Date from the given arguments.
|
|
4
|
-
* @param {string | number | Date} date The date value
|
|
5
|
-
* @param {?boolean} [utc=false] Interprets the given value as a UTC date
|
|
6
|
-
* @returns {Date} The new date object
|
|
7
|
-
*/
|
|
8
|
-
export function getDate(date, utc = false) {
|
|
9
|
-
if (date === null)
|
|
10
|
-
return new Date(NaN);
|
|
11
|
-
if (!date)
|
|
12
|
-
return new Date();
|
|
13
|
-
if (date instanceof Date)
|
|
14
|
-
return new Date(date);
|
|
15
|
-
if (typeof date === 'string' && !/Z$/i.test(date)) {
|
|
16
|
-
const d = date.match(NATIVE_DATE);
|
|
17
|
-
if (d) {
|
|
18
|
-
const m = d[2] - 1 || 0;
|
|
19
|
-
const ms = (d[7] || '0').slice(0, 3);
|
|
20
|
-
if (utc) {
|
|
21
|
-
return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));
|
|
22
|
-
}
|
|
23
|
-
return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return new Date(date);
|
|
27
|
-
}
|
|
28
|
-
const n = 'numeric', s = 'short', l = 'long', dd = '2-digit', TOKEN_MAP = {
|
|
29
|
-
// weekday
|
|
30
|
-
'%A': { weekday: l },
|
|
31
|
-
'%a': { weekday: s },
|
|
32
|
-
'%aa': { weekday: n },
|
|
33
|
-
// day
|
|
34
|
-
'%d': { day: dd },
|
|
35
|
-
'%-d': { day: n },
|
|
36
|
-
// month
|
|
37
|
-
'%m': { month: dd },
|
|
38
|
-
'%-m': { month: n },
|
|
39
|
-
'%B': { month: l },
|
|
40
|
-
'%b': { month: s },
|
|
41
|
-
'%bb': { month: n },
|
|
42
|
-
// year
|
|
43
|
-
'%y': { year: n },
|
|
44
|
-
'%Y': { year: dd },
|
|
45
|
-
// hour
|
|
46
|
-
'%K': { hourCycle: 'h11', hour: dd },
|
|
47
|
-
'%I': { hourCycle: 'h12', hour: dd },
|
|
48
|
-
'%-I': { hourCycle: 'h12', hour: n },
|
|
49
|
-
'%H': { hourCycle: 'h23', hour: dd },
|
|
50
|
-
'%-H': { hourCycle: 'h23', hour: n },
|
|
51
|
-
'%k': { hourCycle: 'h24', hour: n },
|
|
52
|
-
// minutes
|
|
53
|
-
'%M': { minute: dd },
|
|
54
|
-
'%-M': { minute: n },
|
|
55
|
-
// seconds
|
|
56
|
-
'%S': { second: dd },
|
|
57
|
-
'%-S': { second: n },
|
|
58
|
-
// day period
|
|
59
|
-
'%P': { dayPeriod: l },
|
|
60
|
-
'%p': { dayPeriod: s },
|
|
61
|
-
'%pp': { dayPeriod: 'narrow' },
|
|
62
|
-
// era
|
|
63
|
-
'%N': { era: l, year: dd },
|
|
64
|
-
'%n': { era: s, year: dd },
|
|
65
|
-
'%nn': { era: n, year: 'narrow' },
|
|
66
|
-
// timeZoneName
|
|
67
|
-
'%Z': { timeZoneName: 'longGeneric', year: dd },
|
|
68
|
-
'%-Z': { timeZoneName: 'shortGeneric', year: dd },
|
|
69
|
-
'%z': { timeZoneName: 'longOffset', year: dd },
|
|
70
|
-
'%-z': { timeZoneName: 'shortOffset', year: dd },
|
|
71
|
-
'%ZZ': { timeZoneName: l, year: dd },
|
|
72
|
-
'%-ZZ': { timeZoneName: s, year: dd }
|
|
73
|
-
};
|
|
74
|
-
const HOUR_PARTS = { '%I': 1, '%-I': 1, '%K': 1, '%k': 1 };
|
|
75
|
-
const ERA_PARTS = { '%n': 1, '%N': 1, '%nn': 1 };
|
|
76
|
-
const TZ_PARTS = { '%ZZ': 1, '%-ZZ': 1, '%-z': 1, '%z': 1, '%-Z': 1, '%Z': 1 };
|
|
77
|
-
const formatter = (locale, opts) => new Intl.DateTimeFormat(locale, opts);
|
|
78
|
-
/**
|
|
79
|
-
* Formats a date using a formatting string in the {@link https://strftime.org/ strftime} format, in any given locale.
|
|
80
|
-
* @param {string} fmt The format string to apply
|
|
81
|
-
* @param {number | Date} date The date value
|
|
82
|
-
* @param {?string} locale The locale to use when formatting (default is system locale).
|
|
83
|
-
* @returns {string} The string representation of date
|
|
84
|
-
* @see {@link https://strftime.org/ strftime format}
|
|
85
|
-
*/
|
|
86
|
-
export function format(fmt, date, locale) {
|
|
87
|
-
let results = [], dayPeriod = '', dayPeriodIndex = -1;
|
|
88
|
-
for (let i = 0; i < fmt.length; i++) {
|
|
89
|
-
let part = fmt[i];
|
|
90
|
-
if (part === '%') {
|
|
91
|
-
// check for escaped '%'
|
|
92
|
-
if (fmt[++i] == '%') {
|
|
93
|
-
results.push('%');
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
if (fmt[i] === '-') {
|
|
97
|
-
part += fmt[i++];
|
|
98
|
-
}
|
|
99
|
-
part += fmt[i];
|
|
100
|
-
// add any repeated characters that come after
|
|
101
|
-
while (i < fmt.length - 1 && fmt[i + 1] === fmt[i])
|
|
102
|
-
part += fmt[++i];
|
|
103
|
-
if (HOUR_PARTS[part]) {
|
|
104
|
-
let res = formatter(locale, TOKEN_MAP[part]).format(date).split(' ');
|
|
105
|
-
// save the AM/PM for the correct spot
|
|
106
|
-
results.push(res[0]);
|
|
107
|
-
dayPeriod = res[1];
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
if (part === '%P' || part === '%p') {
|
|
111
|
-
// leave this flag in place for later
|
|
112
|
-
dayPeriodIndex = results.length;
|
|
113
|
-
results.push(part);
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
if (ERA_PARTS[part] || TZ_PARTS[part]) {
|
|
117
|
-
// the formatting includes the date/year so we take what comes after
|
|
118
|
-
let res = formatter(locale, TOKEN_MAP[part]).format(date).split(' ');
|
|
119
|
-
results.push(res.slice(1).join(' '));
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
// format any other parts
|
|
123
|
-
let res = formatter(locale, TOKEN_MAP[part]).format(date);
|
|
124
|
-
if (part === '%S' && res.length === 1)
|
|
125
|
-
res = '0' + res;
|
|
126
|
-
results.push(res);
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
// output as literal
|
|
130
|
-
results.push(part);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// insert the AM/PM at the correct spot
|
|
134
|
-
if (dayPeriodIndex >= 0)
|
|
135
|
-
results[dayPeriodIndex] = dayPeriod || '';
|
|
136
|
-
return results.join('');
|
|
137
|
-
}
|
|
138
|
-
const DATETIME_DEFAULT = {};
|
|
139
|
-
/** 10/14/1983 */
|
|
140
|
-
const DATE_SHORT = {
|
|
141
|
-
year: n,
|
|
142
|
-
month: n,
|
|
143
|
-
day: n
|
|
144
|
-
};
|
|
145
|
-
/** Oct 14, 1983 */
|
|
146
|
-
const DATE_MED = {
|
|
147
|
-
year: n,
|
|
148
|
-
month: s,
|
|
149
|
-
day: n
|
|
150
|
-
};
|
|
151
|
-
/** Fri, Oct 14, 1983 */
|
|
152
|
-
const DATE_MED_WITH_WEEKDAY = {
|
|
153
|
-
year: n,
|
|
154
|
-
month: s,
|
|
155
|
-
day: n,
|
|
156
|
-
weekday: s
|
|
157
|
-
};
|
|
158
|
-
/** October 14, 1983 */
|
|
159
|
-
const DATE_FULL = {
|
|
160
|
-
year: n,
|
|
161
|
-
month: l,
|
|
162
|
-
day: n
|
|
163
|
-
};
|
|
164
|
-
/** Tuesday, October 14, 1983 */
|
|
165
|
-
const DATE_HUGE = {
|
|
166
|
-
year: n,
|
|
167
|
-
month: l,
|
|
168
|
-
day: n,
|
|
169
|
-
weekday: l
|
|
170
|
-
};
|
|
171
|
-
/** 09:30 AM */
|
|
172
|
-
const TIME_SIMPLE = {
|
|
173
|
-
hour: n,
|
|
174
|
-
minute: n
|
|
175
|
-
};
|
|
176
|
-
/** 09:30:23 AM */
|
|
177
|
-
const TIME_WITH_SECONDS = {
|
|
178
|
-
hour: n,
|
|
179
|
-
minute: n,
|
|
180
|
-
second: n
|
|
181
|
-
};
|
|
182
|
-
/** 09:30:23 AM EDT */
|
|
183
|
-
const TIME_WITH_SHORT_OFFSET = {
|
|
184
|
-
hour: n,
|
|
185
|
-
minute: n,
|
|
186
|
-
second: n,
|
|
187
|
-
timeZoneName: s
|
|
188
|
-
};
|
|
189
|
-
/** 09:30:23 AM Eastern Daylight Time */
|
|
190
|
-
const TIME_WITH_LONG_OFFSET = {
|
|
191
|
-
hour: n,
|
|
192
|
-
minute: n,
|
|
193
|
-
second: n,
|
|
194
|
-
timeZoneName: l
|
|
195
|
-
};
|
|
196
|
-
/** 09:30 */
|
|
197
|
-
const TIME_24_SIMPLE = {
|
|
198
|
-
hour: n,
|
|
199
|
-
minute: n,
|
|
200
|
-
hourCycle: 'h23'
|
|
201
|
-
};
|
|
202
|
-
/** 09:30:23 */
|
|
203
|
-
const TIME_24_WITH_SECONDS = {
|
|
204
|
-
hour: n,
|
|
205
|
-
minute: n,
|
|
206
|
-
second: n,
|
|
207
|
-
hourCycle: 'h23'
|
|
208
|
-
};
|
|
209
|
-
/** 09:30:23 EDT */
|
|
210
|
-
const TIME_24_WITH_SHORT_OFFSET = {
|
|
211
|
-
hour: n,
|
|
212
|
-
minute: n,
|
|
213
|
-
second: n,
|
|
214
|
-
hourCycle: 'h23',
|
|
215
|
-
timeZoneName: s
|
|
216
|
-
};
|
|
217
|
-
/** 09:30:23 Eastern Daylight Time */
|
|
218
|
-
const TIME_24_WITH_LONG_OFFSET = {
|
|
219
|
-
hour: n,
|
|
220
|
-
minute: n,
|
|
221
|
-
second: n,
|
|
222
|
-
hourCycle: 'h23',
|
|
223
|
-
timeZoneName: l
|
|
224
|
-
};
|
|
225
|
-
/** 10/14/1983, 9:30 AM */
|
|
226
|
-
const DATETIME_SHORT = {
|
|
227
|
-
year: n,
|
|
228
|
-
month: n,
|
|
229
|
-
day: n,
|
|
230
|
-
hour: n,
|
|
231
|
-
minute: n
|
|
232
|
-
};
|
|
233
|
-
/** 10/14/1983, 9:30:33 AM */
|
|
234
|
-
const DATETIME_SHORT_WITH_SECONDS = {
|
|
235
|
-
year: n,
|
|
236
|
-
month: n,
|
|
237
|
-
day: n,
|
|
238
|
-
hour: n,
|
|
239
|
-
minute: n,
|
|
240
|
-
second: n
|
|
241
|
-
};
|
|
242
|
-
/** Oct 14, 1983, 9:30 AM */
|
|
243
|
-
const DATETIME_MED = {
|
|
244
|
-
year: n,
|
|
245
|
-
month: s,
|
|
246
|
-
day: n,
|
|
247
|
-
hour: n,
|
|
248
|
-
minute: n
|
|
249
|
-
};
|
|
250
|
-
/** Oct 14, 1983, 9:30:33 AM */
|
|
251
|
-
const DATETIME_MED_WITH_SECONDS = {
|
|
252
|
-
year: n,
|
|
253
|
-
month: s,
|
|
254
|
-
day: n,
|
|
255
|
-
hour: n,
|
|
256
|
-
minute: n,
|
|
257
|
-
second: n
|
|
258
|
-
};
|
|
259
|
-
/** Fri, 14 Oct 1983, 9:30 AM */
|
|
260
|
-
const DATETIME_MED_WITH_WEEKDAY = {
|
|
261
|
-
year: n,
|
|
262
|
-
month: s,
|
|
263
|
-
day: n,
|
|
264
|
-
weekday: s,
|
|
265
|
-
hour: n,
|
|
266
|
-
minute: n
|
|
267
|
-
};
|
|
268
|
-
/** October 14, 1983, 9:30 AM EDT */
|
|
269
|
-
const DATETIME_FULL = {
|
|
270
|
-
year: n,
|
|
271
|
-
month: l,
|
|
272
|
-
day: n,
|
|
273
|
-
hour: n,
|
|
274
|
-
minute: n,
|
|
275
|
-
timeZoneName: s
|
|
276
|
-
};
|
|
277
|
-
/** October 14, 1983, 9:30:33 AM EDT */
|
|
278
|
-
const DATETIME_FULL_WITH_SECONDS = {
|
|
279
|
-
year: n,
|
|
280
|
-
month: l,
|
|
281
|
-
day: n,
|
|
282
|
-
hour: n,
|
|
283
|
-
minute: n,
|
|
284
|
-
second: n,
|
|
285
|
-
timeZoneName: s
|
|
286
|
-
};
|
|
287
|
-
/** Friday, October 14, 1983, 9:30 AM Eastern Daylight Time */
|
|
288
|
-
const DATETIME_HUGE = {
|
|
289
|
-
year: n,
|
|
290
|
-
month: l,
|
|
291
|
-
day: n,
|
|
292
|
-
weekday: l,
|
|
293
|
-
hour: n,
|
|
294
|
-
minute: n,
|
|
295
|
-
timeZoneName: l
|
|
296
|
-
};
|
|
297
|
-
/** Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time */
|
|
298
|
-
const DATETIME_HUGE_WITH_SECONDS = {
|
|
299
|
-
year: n,
|
|
300
|
-
month: l,
|
|
301
|
-
day: n,
|
|
302
|
-
weekday: l,
|
|
303
|
-
hour: n,
|
|
304
|
-
minute: n,
|
|
305
|
-
second: n,
|
|
306
|
-
timeZoneName: l
|
|
307
|
-
};
|
package/core/i18n/date/format.ts
DELETED
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
const NATIVE_DATE =
|
|
2
|
-
/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Returns a new Date from the given arguments.
|
|
6
|
-
* @param {string | number | Date} date The date value
|
|
7
|
-
* @param {?boolean} [utc=false] Interprets the given value as a UTC date
|
|
8
|
-
* @returns {Date} The new date object
|
|
9
|
-
*/
|
|
10
|
-
export function getDate(date: string | number | Date, utc = false) {
|
|
11
|
-
if (date === null) return new Date(NaN)
|
|
12
|
-
if (!date) return new Date()
|
|
13
|
-
if (date instanceof Date) return new Date(date)
|
|
14
|
-
if (typeof date === 'string' && !/Z$/i.test(date)) {
|
|
15
|
-
const d = date.match(NATIVE_DATE) as any
|
|
16
|
-
if (d) {
|
|
17
|
-
const m = d[2] - 1 || 0
|
|
18
|
-
const ms = (d[7] || '0').slice(0, 3)
|
|
19
|
-
if (utc) {
|
|
20
|
-
return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms))
|
|
21
|
-
}
|
|
22
|
-
return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms)
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return new Date(date)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const n = 'numeric',
|
|
29
|
-
s = 'short',
|
|
30
|
-
l = 'long',
|
|
31
|
-
dd = '2-digit',
|
|
32
|
-
TOKEN_MAP = {
|
|
33
|
-
// weekday
|
|
34
|
-
'%A': { weekday: l },
|
|
35
|
-
'%a': { weekday: s },
|
|
36
|
-
'%aa': { weekday: n },
|
|
37
|
-
// day
|
|
38
|
-
'%d': { day: dd },
|
|
39
|
-
'%-d': { day: n },
|
|
40
|
-
// month
|
|
41
|
-
'%m': { month: dd },
|
|
42
|
-
'%-m': { month: n },
|
|
43
|
-
'%B': { month: l },
|
|
44
|
-
'%b': { month: s },
|
|
45
|
-
'%bb': { month: n },
|
|
46
|
-
// year
|
|
47
|
-
'%y': { year: n },
|
|
48
|
-
'%Y': { year: dd },
|
|
49
|
-
// hour
|
|
50
|
-
'%K': { hourCycle: 'h11', hour: dd },
|
|
51
|
-
'%I': { hourCycle: 'h12', hour: dd },
|
|
52
|
-
'%-I': { hourCycle: 'h12', hour: n },
|
|
53
|
-
'%H': { hourCycle: 'h23', hour: dd },
|
|
54
|
-
'%-H': { hourCycle: 'h23', hour: n },
|
|
55
|
-
'%k': { hourCycle: 'h24', hour: n },
|
|
56
|
-
// minutes
|
|
57
|
-
'%M': { minute: dd },
|
|
58
|
-
'%-M': { minute: n },
|
|
59
|
-
// seconds
|
|
60
|
-
'%S': { second: dd },
|
|
61
|
-
'%-S': { second: n },
|
|
62
|
-
// day period
|
|
63
|
-
'%P': { dayPeriod: l },
|
|
64
|
-
'%p': { dayPeriod: s },
|
|
65
|
-
'%pp': { dayPeriod: 'narrow' },
|
|
66
|
-
// era
|
|
67
|
-
'%N': { era: l, year: dd },
|
|
68
|
-
'%n': { era: s, year: dd },
|
|
69
|
-
'%nn': { era: n, year: 'narrow' },
|
|
70
|
-
// timeZoneName
|
|
71
|
-
'%Z': { timeZoneName: 'longGeneric', year: dd },
|
|
72
|
-
'%-Z': { timeZoneName: 'shortGeneric', year: dd },
|
|
73
|
-
'%z': { timeZoneName: 'longOffset', year: dd },
|
|
74
|
-
'%-z': { timeZoneName: 'shortOffset', year: dd },
|
|
75
|
-
'%ZZ': { timeZoneName: l, year: dd },
|
|
76
|
-
'%-ZZ': { timeZoneName: s, year: dd }
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const HOUR_PARTS = { '%I': 1, '%-I': 1, '%K': 1, '%k': 1 }
|
|
80
|
-
const ERA_PARTS = { '%n': 1, '%N': 1, '%nn': 1 }
|
|
81
|
-
const TZ_PARTS = { '%ZZ': 1, '%-ZZ': 1, '%-z': 1, '%z': 1, '%-Z': 1, '%Z': 1 }
|
|
82
|
-
|
|
83
|
-
const formatter = (locale: string, opts) => new Intl.DateTimeFormat(locale, opts)
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Formats a date using a formatting string in the {@link https://strftime.org/ strftime} format, in any given locale.
|
|
87
|
-
* @param {string} fmt The format string to apply
|
|
88
|
-
* @param {number | Date} date The date value
|
|
89
|
-
* @param {?string} locale The locale to use when formatting (default is system locale).
|
|
90
|
-
* @returns {string} The string representation of date
|
|
91
|
-
* @see {@link https://strftime.org/ strftime format}
|
|
92
|
-
*/
|
|
93
|
-
export function format(fmt: string, date: number | Date, locale?) {
|
|
94
|
-
let results: string[] = [],
|
|
95
|
-
dayPeriod: string = '',
|
|
96
|
-
dayPeriodIndex = -1
|
|
97
|
-
for (let i = 0; i < fmt.length; i++) {
|
|
98
|
-
let part = fmt[i]
|
|
99
|
-
if (part === '%') {
|
|
100
|
-
// check for escaped '%'
|
|
101
|
-
if (fmt[++i] == '%') {
|
|
102
|
-
results.push('%')
|
|
103
|
-
continue
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (fmt[i] === '-') {
|
|
107
|
-
part += fmt[i++]
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
part += fmt[i]
|
|
111
|
-
// add any repeated characters that come after
|
|
112
|
-
while (i < fmt.length - 1 && fmt[i + 1] === fmt[i]) part += fmt[++i]
|
|
113
|
-
|
|
114
|
-
if (HOUR_PARTS[part]) {
|
|
115
|
-
let res = formatter(locale, TOKEN_MAP[part]).format(date).split(' ')
|
|
116
|
-
// save the AM/PM for the correct spot
|
|
117
|
-
results.push(res[0])
|
|
118
|
-
dayPeriod = res[1]
|
|
119
|
-
continue
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (part === '%P' || part === '%p') {
|
|
123
|
-
// leave this flag in place for later
|
|
124
|
-
dayPeriodIndex = results.length
|
|
125
|
-
results.push(part)
|
|
126
|
-
continue
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if (ERA_PARTS[part] || TZ_PARTS[part]) {
|
|
130
|
-
// the formatting includes the date/year so we take what comes after
|
|
131
|
-
let res = formatter(locale, TOKEN_MAP[part]).format(date).split(' ')
|
|
132
|
-
results.push(res.slice(1).join(' '))
|
|
133
|
-
continue
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// format any other parts
|
|
137
|
-
let res = formatter(locale, TOKEN_MAP[part]).format(date)
|
|
138
|
-
if (part === '%S' && res.length === 1) res = '0' + res
|
|
139
|
-
results.push(res)
|
|
140
|
-
} else {
|
|
141
|
-
// output as literal
|
|
142
|
-
results.push(part)
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// insert the AM/PM at the correct spot
|
|
147
|
-
if (dayPeriodIndex >= 0) results[dayPeriodIndex] = dayPeriod || ''
|
|
148
|
-
|
|
149
|
-
return results.join('')
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const DATETIME_DEFAULT = {}
|
|
153
|
-
|
|
154
|
-
/** 10/14/1983 */
|
|
155
|
-
const DATE_SHORT = {
|
|
156
|
-
year: n,
|
|
157
|
-
month: n,
|
|
158
|
-
day: n
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/** Oct 14, 1983 */
|
|
162
|
-
const DATE_MED = {
|
|
163
|
-
year: n,
|
|
164
|
-
month: s,
|
|
165
|
-
day: n
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/** Fri, Oct 14, 1983 */
|
|
169
|
-
const DATE_MED_WITH_WEEKDAY = {
|
|
170
|
-
year: n,
|
|
171
|
-
month: s,
|
|
172
|
-
day: n,
|
|
173
|
-
weekday: s
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/** October 14, 1983 */
|
|
177
|
-
const DATE_FULL = {
|
|
178
|
-
year: n,
|
|
179
|
-
month: l,
|
|
180
|
-
day: n
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/** Tuesday, October 14, 1983 */
|
|
184
|
-
const DATE_HUGE = {
|
|
185
|
-
year: n,
|
|
186
|
-
month: l,
|
|
187
|
-
day: n,
|
|
188
|
-
weekday: l
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/** 09:30 AM */
|
|
192
|
-
const TIME_SIMPLE = {
|
|
193
|
-
hour: n,
|
|
194
|
-
minute: n
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/** 09:30:23 AM */
|
|
198
|
-
const TIME_WITH_SECONDS = {
|
|
199
|
-
hour: n,
|
|
200
|
-
minute: n,
|
|
201
|
-
second: n
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/** 09:30:23 AM EDT */
|
|
205
|
-
const TIME_WITH_SHORT_OFFSET = {
|
|
206
|
-
hour: n,
|
|
207
|
-
minute: n,
|
|
208
|
-
second: n,
|
|
209
|
-
timeZoneName: s
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/** 09:30:23 AM Eastern Daylight Time */
|
|
213
|
-
const TIME_WITH_LONG_OFFSET = {
|
|
214
|
-
hour: n,
|
|
215
|
-
minute: n,
|
|
216
|
-
second: n,
|
|
217
|
-
timeZoneName: l
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/** 09:30 */
|
|
221
|
-
const TIME_24_SIMPLE = {
|
|
222
|
-
hour: n,
|
|
223
|
-
minute: n,
|
|
224
|
-
hourCycle: 'h23'
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/** 09:30:23 */
|
|
228
|
-
const TIME_24_WITH_SECONDS = {
|
|
229
|
-
hour: n,
|
|
230
|
-
minute: n,
|
|
231
|
-
second: n,
|
|
232
|
-
hourCycle: 'h23'
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/** 09:30:23 EDT */
|
|
236
|
-
const TIME_24_WITH_SHORT_OFFSET = {
|
|
237
|
-
hour: n,
|
|
238
|
-
minute: n,
|
|
239
|
-
second: n,
|
|
240
|
-
hourCycle: 'h23',
|
|
241
|
-
timeZoneName: s
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/** 09:30:23 Eastern Daylight Time */
|
|
245
|
-
const TIME_24_WITH_LONG_OFFSET = {
|
|
246
|
-
hour: n,
|
|
247
|
-
minute: n,
|
|
248
|
-
second: n,
|
|
249
|
-
hourCycle: 'h23',
|
|
250
|
-
timeZoneName: l
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/** 10/14/1983, 9:30 AM */
|
|
254
|
-
const DATETIME_SHORT = {
|
|
255
|
-
year: n,
|
|
256
|
-
month: n,
|
|
257
|
-
day: n,
|
|
258
|
-
hour: n,
|
|
259
|
-
minute: n
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/** 10/14/1983, 9:30:33 AM */
|
|
263
|
-
const DATETIME_SHORT_WITH_SECONDS = {
|
|
264
|
-
year: n,
|
|
265
|
-
month: n,
|
|
266
|
-
day: n,
|
|
267
|
-
hour: n,
|
|
268
|
-
minute: n,
|
|
269
|
-
second: n
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/** Oct 14, 1983, 9:30 AM */
|
|
273
|
-
const DATETIME_MED = {
|
|
274
|
-
year: n,
|
|
275
|
-
month: s,
|
|
276
|
-
day: n,
|
|
277
|
-
hour: n,
|
|
278
|
-
minute: n
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/** Oct 14, 1983, 9:30:33 AM */
|
|
282
|
-
const DATETIME_MED_WITH_SECONDS = {
|
|
283
|
-
year: n,
|
|
284
|
-
month: s,
|
|
285
|
-
day: n,
|
|
286
|
-
hour: n,
|
|
287
|
-
minute: n,
|
|
288
|
-
second: n
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/** Fri, 14 Oct 1983, 9:30 AM */
|
|
292
|
-
const DATETIME_MED_WITH_WEEKDAY = {
|
|
293
|
-
year: n,
|
|
294
|
-
month: s,
|
|
295
|
-
day: n,
|
|
296
|
-
weekday: s,
|
|
297
|
-
hour: n,
|
|
298
|
-
minute: n
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/** October 14, 1983, 9:30 AM EDT */
|
|
302
|
-
const DATETIME_FULL = {
|
|
303
|
-
year: n,
|
|
304
|
-
month: l,
|
|
305
|
-
day: n,
|
|
306
|
-
hour: n,
|
|
307
|
-
minute: n,
|
|
308
|
-
timeZoneName: s
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
/** October 14, 1983, 9:30:33 AM EDT */
|
|
312
|
-
const DATETIME_FULL_WITH_SECONDS = {
|
|
313
|
-
year: n,
|
|
314
|
-
month: l,
|
|
315
|
-
day: n,
|
|
316
|
-
hour: n,
|
|
317
|
-
minute: n,
|
|
318
|
-
second: n,
|
|
319
|
-
timeZoneName: s
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/** Friday, October 14, 1983, 9:30 AM Eastern Daylight Time */
|
|
323
|
-
const DATETIME_HUGE = {
|
|
324
|
-
year: n,
|
|
325
|
-
month: l,
|
|
326
|
-
day: n,
|
|
327
|
-
weekday: l,
|
|
328
|
-
hour: n,
|
|
329
|
-
minute: n,
|
|
330
|
-
timeZoneName: l
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/** Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time */
|
|
334
|
-
const DATETIME_HUGE_WITH_SECONDS = {
|
|
335
|
-
year: n,
|
|
336
|
-
month: l,
|
|
337
|
-
day: n,
|
|
338
|
-
weekday: l,
|
|
339
|
-
hour: n,
|
|
340
|
-
minute: n,
|
|
341
|
-
second: n,
|
|
342
|
-
timeZoneName: l
|
|
343
|
-
}
|