date-vir 9.0.0 → 9.1.1

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.
@@ -5,3 +5,297 @@ import { DurationUnit } from '@date-vir/duration';
5
5
  * @category Duration
6
6
  */
7
7
  export declare const anyDurationShape: import("object-shape-tester").Shape<import("@sinclair/typebox").TUnsafe<Partial<Record<DurationUnit, number>>>>;
8
+ /**
9
+ * A shape definition for {@link AtLeastOneDuration}.
10
+ *
11
+ * @category Duration
12
+ */
13
+ export declare const atLeastOneDurationShape: (defaultValue?: (((Required<Pick<{
14
+ years: number;
15
+ months: number;
16
+ weeks: number;
17
+ days: number;
18
+ hours: number;
19
+ minutes: number;
20
+ seconds: number;
21
+ milliseconds: number;
22
+ }, DurationUnit.Years>> & Partial<Pick<{
23
+ years: number;
24
+ months: number;
25
+ weeks: number;
26
+ days: number;
27
+ hours: number;
28
+ minutes: number;
29
+ seconds: number;
30
+ milliseconds: number;
31
+ }, DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
32
+ years: number;
33
+ months: number;
34
+ weeks: number;
35
+ days: number;
36
+ hours: number;
37
+ minutes: number;
38
+ seconds: number;
39
+ milliseconds: number;
40
+ }, DurationUnit.Months>> & Partial<Pick<{
41
+ years: number;
42
+ months: number;
43
+ weeks: number;
44
+ days: number;
45
+ hours: number;
46
+ minutes: number;
47
+ seconds: number;
48
+ milliseconds: number;
49
+ }, DurationUnit.Years | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
50
+ years: number;
51
+ months: number;
52
+ weeks: number;
53
+ days: number;
54
+ hours: number;
55
+ minutes: number;
56
+ seconds: number;
57
+ milliseconds: number;
58
+ }, DurationUnit.Weeks>> & Partial<Pick<{
59
+ years: number;
60
+ months: number;
61
+ weeks: number;
62
+ days: number;
63
+ hours: number;
64
+ minutes: number;
65
+ seconds: number;
66
+ milliseconds: number;
67
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
68
+ years: number;
69
+ months: number;
70
+ weeks: number;
71
+ days: number;
72
+ hours: number;
73
+ minutes: number;
74
+ seconds: number;
75
+ milliseconds: number;
76
+ }, DurationUnit.Days>> & Partial<Pick<{
77
+ years: number;
78
+ months: number;
79
+ weeks: number;
80
+ days: number;
81
+ hours: number;
82
+ minutes: number;
83
+ seconds: number;
84
+ milliseconds: number;
85
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
86
+ years: number;
87
+ months: number;
88
+ weeks: number;
89
+ days: number;
90
+ hours: number;
91
+ minutes: number;
92
+ seconds: number;
93
+ milliseconds: number;
94
+ }, DurationUnit.Hours>> & Partial<Pick<{
95
+ years: number;
96
+ months: number;
97
+ weeks: number;
98
+ days: number;
99
+ hours: number;
100
+ minutes: number;
101
+ seconds: number;
102
+ milliseconds: number;
103
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
104
+ years: number;
105
+ months: number;
106
+ weeks: number;
107
+ days: number;
108
+ hours: number;
109
+ minutes: number;
110
+ seconds: number;
111
+ milliseconds: number;
112
+ }, DurationUnit.Minutes>> & Partial<Pick<{
113
+ years: number;
114
+ months: number;
115
+ weeks: number;
116
+ days: number;
117
+ hours: number;
118
+ minutes: number;
119
+ seconds: number;
120
+ milliseconds: number;
121
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
122
+ years: number;
123
+ months: number;
124
+ weeks: number;
125
+ days: number;
126
+ hours: number;
127
+ minutes: number;
128
+ seconds: number;
129
+ milliseconds: number;
130
+ }, DurationUnit.Seconds>> & Partial<Pick<{
131
+ years: number;
132
+ months: number;
133
+ weeks: number;
134
+ days: number;
135
+ hours: number;
136
+ minutes: number;
137
+ seconds: number;
138
+ milliseconds: number;
139
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Milliseconds>>) | (Required<Pick<{
140
+ years: number;
141
+ months: number;
142
+ weeks: number;
143
+ days: number;
144
+ hours: number;
145
+ minutes: number;
146
+ seconds: number;
147
+ milliseconds: number;
148
+ }, DurationUnit.Milliseconds>> & Partial<Pick<{
149
+ years: number;
150
+ months: number;
151
+ weeks: number;
152
+ days: number;
153
+ hours: number;
154
+ minutes: number;
155
+ seconds: number;
156
+ milliseconds: number;
157
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds>>)) & {}) | undefined) => import("object-shape-tester").Shape<import("@sinclair/typebox").TUnsafe<((Required<Pick<{
158
+ years: number;
159
+ months: number;
160
+ weeks: number;
161
+ days: number;
162
+ hours: number;
163
+ minutes: number;
164
+ seconds: number;
165
+ milliseconds: number;
166
+ }, DurationUnit.Years>> & Partial<Pick<{
167
+ years: number;
168
+ months: number;
169
+ weeks: number;
170
+ days: number;
171
+ hours: number;
172
+ minutes: number;
173
+ seconds: number;
174
+ milliseconds: number;
175
+ }, DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
176
+ years: number;
177
+ months: number;
178
+ weeks: number;
179
+ days: number;
180
+ hours: number;
181
+ minutes: number;
182
+ seconds: number;
183
+ milliseconds: number;
184
+ }, DurationUnit.Months>> & Partial<Pick<{
185
+ years: number;
186
+ months: number;
187
+ weeks: number;
188
+ days: number;
189
+ hours: number;
190
+ minutes: number;
191
+ seconds: number;
192
+ milliseconds: number;
193
+ }, DurationUnit.Years | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
194
+ years: number;
195
+ months: number;
196
+ weeks: number;
197
+ days: number;
198
+ hours: number;
199
+ minutes: number;
200
+ seconds: number;
201
+ milliseconds: number;
202
+ }, DurationUnit.Weeks>> & Partial<Pick<{
203
+ years: number;
204
+ months: number;
205
+ weeks: number;
206
+ days: number;
207
+ hours: number;
208
+ minutes: number;
209
+ seconds: number;
210
+ milliseconds: number;
211
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
212
+ years: number;
213
+ months: number;
214
+ weeks: number;
215
+ days: number;
216
+ hours: number;
217
+ minutes: number;
218
+ seconds: number;
219
+ milliseconds: number;
220
+ }, DurationUnit.Days>> & Partial<Pick<{
221
+ years: number;
222
+ months: number;
223
+ weeks: number;
224
+ days: number;
225
+ hours: number;
226
+ minutes: number;
227
+ seconds: number;
228
+ milliseconds: number;
229
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
230
+ years: number;
231
+ months: number;
232
+ weeks: number;
233
+ days: number;
234
+ hours: number;
235
+ minutes: number;
236
+ seconds: number;
237
+ milliseconds: number;
238
+ }, DurationUnit.Hours>> & Partial<Pick<{
239
+ years: number;
240
+ months: number;
241
+ weeks: number;
242
+ days: number;
243
+ hours: number;
244
+ minutes: number;
245
+ seconds: number;
246
+ milliseconds: number;
247
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Minutes | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
248
+ years: number;
249
+ months: number;
250
+ weeks: number;
251
+ days: number;
252
+ hours: number;
253
+ minutes: number;
254
+ seconds: number;
255
+ milliseconds: number;
256
+ }, DurationUnit.Minutes>> & Partial<Pick<{
257
+ years: number;
258
+ months: number;
259
+ weeks: number;
260
+ days: number;
261
+ hours: number;
262
+ minutes: number;
263
+ seconds: number;
264
+ milliseconds: number;
265
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Seconds | DurationUnit.Milliseconds>>) | (Required<Pick<{
266
+ years: number;
267
+ months: number;
268
+ weeks: number;
269
+ days: number;
270
+ hours: number;
271
+ minutes: number;
272
+ seconds: number;
273
+ milliseconds: number;
274
+ }, DurationUnit.Seconds>> & Partial<Pick<{
275
+ years: number;
276
+ months: number;
277
+ weeks: number;
278
+ days: number;
279
+ hours: number;
280
+ minutes: number;
281
+ seconds: number;
282
+ milliseconds: number;
283
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Milliseconds>>) | (Required<Pick<{
284
+ years: number;
285
+ months: number;
286
+ weeks: number;
287
+ days: number;
288
+ hours: number;
289
+ minutes: number;
290
+ seconds: number;
291
+ milliseconds: number;
292
+ }, DurationUnit.Milliseconds>> & Partial<Pick<{
293
+ years: number;
294
+ months: number;
295
+ weeks: number;
296
+ days: number;
297
+ hours: number;
298
+ minutes: number;
299
+ seconds: number;
300
+ milliseconds: number;
301
+ }, DurationUnit.Years | DurationUnit.Months | DurationUnit.Weeks | DurationUnit.Days | DurationUnit.Hours | DurationUnit.Minutes | DurationUnit.Seconds>>)) & {}>>;
@@ -1,5 +1,6 @@
1
+ import { check } from '@augment-vir/assert';
1
2
  import { DurationUnit } from '@date-vir/duration';
2
- import { enumShape, recordShape } from 'object-shape-tester';
3
+ import { checkValidShape, createCustomShape, enumShape, recordShape } from 'object-shape-tester';
3
4
  /**
4
5
  * A shape definition for `AnyDuration`.
5
6
  *
@@ -10,3 +11,19 @@ export const anyDurationShape = recordShape({
10
11
  values: -1,
11
12
  partial: true,
12
13
  });
14
+ /**
15
+ * A shape definition for {@link AtLeastOneDuration}.
16
+ *
17
+ * @category Duration
18
+ */
19
+ export const atLeastOneDurationShape = createCustomShape({
20
+ default: {
21
+ milliseconds: 0,
22
+ },
23
+ name: 'AtLeastOneDuration',
24
+ checkValue(value) {
25
+ return (checkValidShape(value, anyDurationShape, {
26
+ preventExtraKeys: true,
27
+ }) && !check.isEmpty(value));
28
+ },
29
+ });
@@ -7,9 +7,11 @@ const knownTimezones = new Set(allTimezoneNames);
7
7
  * Caches the result of the {@link Info.isValidIANAZone} fallback. That call constructs an
8
8
  * `Intl.DateTimeFormat` every time (~30µs), so memoizing it keeps repeated checks of the same
9
9
  * string (a legacy alias or an invalid value) cheap. Only strings outside the typed
10
- * {@link knownTimezones} set ever land here, so the cache stays small in practice.
10
+ * {@link knownTimezones} set ever land here. The cache is capped to keep untrusted input from
11
+ * growing it without bound.
11
12
  */
12
13
  const ianaValidityCache = new Map();
14
+ const maxIanaValidityCacheEntries = 1000;
13
15
  /**
14
16
  * Checks that the given timezone is valid.
15
17
  *
@@ -28,6 +30,12 @@ export function isValidTimezone(raw) {
28
30
  return cached;
29
31
  }
30
32
  const isValid = Info.isValidIANAZone(raw);
33
+ if (ianaValidityCache.size >= maxIanaValidityCacheEntries) {
34
+ const oldestEntry = ianaValidityCache.keys().next();
35
+ if (!oldestEntry.done) {
36
+ ianaValidityCache.delete(oldestEntry.value);
37
+ }
38
+ }
31
39
  ianaValidityCache.set(raw, isValid);
32
40
  return isValid;
33
41
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "date-vir",
3
- "version": "9.0.0",
3
+ "version": "9.1.1",
4
4
  "description": "Easy and explicit dates and times.",
5
5
  "keywords": [
6
6
  "date",
@@ -37,7 +37,7 @@
37
37
  "dependencies": {
38
38
  "@augment-vir/assert": "^32.2.1",
39
39
  "@augment-vir/common": "^32.2.1",
40
- "@date-vir/duration": "^9.0.0",
40
+ "@date-vir/duration": "^9.1.1",
41
41
  "@types/luxon": "^3.7.3",
42
42
  "luxon": "^3.7.2",
43
43
  "object-shape-tester": "^6.14.1",