@ocavue/utils 1.3.0 → 1.4.0
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/index.d.ts +312 -37
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -29
- package/dist/index.js.map +1 -1
- package/package.json +12 -8
- package/src/__snapshots__/e2e.test.ts.snap +2 -2
- package/src/checker.test.ts +22 -1
- package/src/checker.ts +7 -0
- package/src/counter.test.ts +197 -0
- package/src/counter.ts +166 -0
- package/src/default-map.test.ts +1 -193
- package/src/default-map.ts +149 -51
- package/src/index.ts +2 -1
- package/src/map-group-by.test.ts +23 -10
- package/src/map-group-by.ts +7 -15
- package/src/map-values.ts +1 -1
- package/src/object-entries.ts +13 -8
- package/src/object-group-by.test.ts +25 -10
- package/src/object-group-by.ts +7 -17
- package/src/once.test.ts +1 -30
- package/src/sleep.ts +8 -1
- package/src/once-stub-1.ts +0 -13
- package/src/once-stub-2.ts +0 -3
package/dist/index.d.ts
CHANGED
|
@@ -11,35 +11,68 @@ declare function isMap(value: unknown): value is Map<unknown, unknown>;
|
|
|
11
11
|
* Checks if the given value is a Set.
|
|
12
12
|
*/
|
|
13
13
|
declare function isSet(value: unknown): value is Set<unknown>;
|
|
14
|
-
//#endregion
|
|
15
|
-
//#region src/default-map.d.ts
|
|
16
|
-
/**
|
|
17
|
-
* A map that automatically creates values for missing keys using a factory function.
|
|
18
|
-
*
|
|
19
|
-
* Similar to Python's [defaultdict](https://docs.python.org/3.13/library/collections.html#collections.defaultdict).
|
|
20
|
-
*/
|
|
21
|
-
declare class DefaultMap<K$1, V> extends Map<K$1, V> {
|
|
22
|
-
private readonly defaultFactory;
|
|
23
|
-
constructor(defaultFactory: () => V, iterable?: Iterable<readonly [K$1, V]>);
|
|
24
|
-
get(key: K$1): V;
|
|
25
|
-
}
|
|
26
14
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* Similar to DefaultMap but uses WeakMap as the base, allowing garbage collection of keys.
|
|
15
|
+
* Returns true if the given value is not null or undefined.
|
|
30
16
|
*/
|
|
31
|
-
declare
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
get(key: K$1): V;
|
|
35
|
-
}
|
|
17
|
+
declare function isNotNullish<T>(value: T): value is NonNullable<T>;
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/counter.d.ts
|
|
36
20
|
/**
|
|
37
21
|
* A map that counts occurrences of keys.
|
|
38
22
|
*
|
|
39
|
-
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Count word occurrences
|
|
26
|
+
* const wordCounter = new Counter<string>()
|
|
27
|
+
* const words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
|
|
28
|
+
*
|
|
29
|
+
* for (const word of words) {
|
|
30
|
+
* wordCounter.increment(word)
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* console.log(wordCounter.get('apple')) // 3
|
|
34
|
+
* console.log(wordCounter.get('banana')) // 2
|
|
35
|
+
* console.log(wordCounter.get('cherry')) // 1
|
|
36
|
+
* console.log(wordCounter.get('orange')) // 0 (defaults to 0)
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Initialize with existing counts
|
|
42
|
+
* const counter = new Counter<string>([
|
|
43
|
+
* ['red', 5],
|
|
44
|
+
* ['blue', 3],
|
|
45
|
+
* ['green', 7]
|
|
46
|
+
* ])
|
|
47
|
+
*
|
|
48
|
+
* counter.increment('red', 2) // red: 5 -> 7
|
|
49
|
+
* counter.decrement('blue') // blue: 3 -> 2
|
|
50
|
+
* counter.increment('yellow') // yellow: 0 -> 1
|
|
51
|
+
*
|
|
52
|
+
* console.log(counter.get('red')) // 7
|
|
53
|
+
* console.log(counter.get('blue')) // 2
|
|
54
|
+
* console.log(counter.get('yellow')) // 1
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* // Track event frequencies
|
|
60
|
+
* const eventCounter = new Counter<string>()
|
|
61
|
+
*
|
|
62
|
+
* eventCounter.increment('click', 5)
|
|
63
|
+
* eventCounter.increment('hover', 3)
|
|
64
|
+
* eventCounter.increment('click', 2)
|
|
65
|
+
*
|
|
66
|
+
* // Get most common events
|
|
67
|
+
* const events = [...eventCounter.entries()]
|
|
68
|
+
* .sort((a, b) => b[1] - a[1])
|
|
69
|
+
*
|
|
70
|
+
* console.log(events) // [['click', 7], ['hover', 3]]
|
|
71
|
+
* ```
|
|
40
72
|
*/
|
|
41
|
-
declare class Counter<K$1> extends
|
|
73
|
+
declare class Counter<K$1> extends Map<K$1, number> {
|
|
42
74
|
constructor(iterable?: Iterable<readonly [K$1, number]>);
|
|
75
|
+
get(key: K$1): number;
|
|
43
76
|
/**
|
|
44
77
|
* Increments the count for a key by a given amount (default 1).
|
|
45
78
|
*/
|
|
@@ -52,10 +85,72 @@ declare class Counter<K$1> extends DefaultMap<K$1, number> {
|
|
|
52
85
|
/**
|
|
53
86
|
* A weak map that counts occurrences of object keys.
|
|
54
87
|
*
|
|
55
|
-
* Similar to Counter but uses WeakMap as the base, allowing garbage collection of keys.
|
|
88
|
+
* Similar to {@link Counter} but uses WeakMap as the base, allowing garbage collection of keys.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* // Track reference counts for DOM elements
|
|
93
|
+
* const elementRefs = new WeakCounter<HTMLElement>()
|
|
94
|
+
*
|
|
95
|
+
* function addReference(element: HTMLElement) {
|
|
96
|
+
* elementRefs.increment(element)
|
|
97
|
+
* console.log(`References: ${elementRefs.get(element)}`)
|
|
98
|
+
* }
|
|
99
|
+
*
|
|
100
|
+
* function removeReference(element: HTMLElement) {
|
|
101
|
+
* elementRefs.decrement(element)
|
|
102
|
+
* console.log(`References: ${elementRefs.get(element)}`)
|
|
103
|
+
* }
|
|
104
|
+
*
|
|
105
|
+
* const div = document.createElement('div')
|
|
106
|
+
* addReference(div) // References: 1
|
|
107
|
+
* addReference(div) // References: 2
|
|
108
|
+
* removeReference(div) // References: 1
|
|
109
|
+
* ```
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* // Count object interactions without preventing garbage collection
|
|
114
|
+
* const objectInteractions = new WeakCounter<object>()
|
|
115
|
+
*
|
|
116
|
+
* function handleInteraction(obj: object, count = 1) {
|
|
117
|
+
* objectInteractions.increment(obj, count)
|
|
118
|
+
* }
|
|
119
|
+
*
|
|
120
|
+
* const user = { id: 1, name: 'Alice' }
|
|
121
|
+
* const session = { sessionId: 'abc123' }
|
|
122
|
+
*
|
|
123
|
+
* handleInteraction(user, 3)
|
|
124
|
+
* handleInteraction(session, 1)
|
|
125
|
+
* handleInteraction(user, 2)
|
|
126
|
+
*
|
|
127
|
+
* console.log(objectInteractions.get(user)) // 5
|
|
128
|
+
* console.log(objectInteractions.get(session)) // 1
|
|
129
|
+
* // When user and session are no longer referenced elsewhere,
|
|
130
|
+
* // they can be garbage collected along with their counts
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* // Initialize with existing counts
|
|
136
|
+
* const cache1 = {}
|
|
137
|
+
* const cache2 = {}
|
|
138
|
+
* const cache3 = {}
|
|
139
|
+
*
|
|
140
|
+
* const hitCounter = new WeakCounter<object>([
|
|
141
|
+
* [cache1, 10],
|
|
142
|
+
* [cache2, 5],
|
|
143
|
+
* [cache3, 15]
|
|
144
|
+
* ])
|
|
145
|
+
*
|
|
146
|
+
* hitCounter.increment(cache1, 3) // 10 -> 13
|
|
147
|
+
* console.log(hitCounter.get(cache1)) // 13
|
|
148
|
+
* console.log(hitCounter.get(cache2)) // 5
|
|
149
|
+
* ```
|
|
56
150
|
*/
|
|
57
|
-
declare class WeakCounter<K$1 extends WeakKey> extends
|
|
151
|
+
declare class WeakCounter<K$1 extends WeakKey> extends WeakMap<K$1, number> {
|
|
58
152
|
constructor(entries?: readonly (readonly [K$1, number])[] | null);
|
|
153
|
+
get(key: K$1): number;
|
|
59
154
|
/**
|
|
60
155
|
* Increments the count for a key by a given amount (default 1).
|
|
61
156
|
*/
|
|
@@ -66,6 +161,176 @@ declare class WeakCounter<K$1 extends WeakKey> extends DefaultWeakMap<K$1, numbe
|
|
|
66
161
|
decrement(key: K$1, amount?: number): void;
|
|
67
162
|
}
|
|
68
163
|
//#endregion
|
|
164
|
+
//#region src/default-map.d.ts
|
|
165
|
+
/**
|
|
166
|
+
* A map that automatically creates values for missing keys using a factory function.
|
|
167
|
+
*
|
|
168
|
+
* Similar to Python's [defaultdict](https://docs.python.org/3.13/library/collections.html#collections.defaultdict).
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```typescript
|
|
172
|
+
* // Group items by category using arrays
|
|
173
|
+
* const groupByCategory = new DefaultMap<string, string[]>(() => [])
|
|
174
|
+
*
|
|
175
|
+
* groupByCategory.get('fruits').push('apple', 'banana')
|
|
176
|
+
* groupByCategory.get('vegetables').push('carrot')
|
|
177
|
+
* groupByCategory.get('fruits').push('orange')
|
|
178
|
+
*
|
|
179
|
+
* console.log(groupByCategory.get('fruits')) // ['apple', 'banana', 'orange']
|
|
180
|
+
* console.log(groupByCategory.get('vegetables')) // ['carrot']
|
|
181
|
+
* console.log(groupByCategory.get('dairy')) // [] (auto-created)
|
|
182
|
+
* ```
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* // Build a graph with adjacency lists
|
|
187
|
+
* const graph = new DefaultMap<string, Set<string>>(() => new Set())
|
|
188
|
+
*
|
|
189
|
+
* graph.get('A').add('B').add('C')
|
|
190
|
+
* graph.get('B').add('C').add('D')
|
|
191
|
+
* graph.get('C').add('D')
|
|
192
|
+
*
|
|
193
|
+
* console.log([...graph.get('A')]) // ['B', 'C']
|
|
194
|
+
* console.log([...graph.get('B')]) // ['C', 'D']
|
|
195
|
+
* console.log([...graph.get('E')]) // [] (auto-created empty set)
|
|
196
|
+
* ```
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* // Initialize with existing entries
|
|
201
|
+
* const scores = new DefaultMap<string, number>(
|
|
202
|
+
* () => 0,
|
|
203
|
+
* [
|
|
204
|
+
* ['Alice', 100],
|
|
205
|
+
* ['Bob', 85]
|
|
206
|
+
* ]
|
|
207
|
+
* )
|
|
208
|
+
*
|
|
209
|
+
* scores.set('Alice', scores.get('Alice') + 10) // 100 -> 110
|
|
210
|
+
* console.log(scores.get('Alice')) // 110
|
|
211
|
+
* console.log(scores.get('Bob')) // 85
|
|
212
|
+
* console.log(scores.get('Charlie')) // 0 (auto-created)
|
|
213
|
+
* ```
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* ```typescript
|
|
217
|
+
* // Nested DefaultMaps for 2D data structures
|
|
218
|
+
* const matrix = new DefaultMap<number, DefaultMap<number, number>>(
|
|
219
|
+
* () => new DefaultMap<number, number>(() => 0)
|
|
220
|
+
* )
|
|
221
|
+
*
|
|
222
|
+
* matrix.get(0).set(0, 1)
|
|
223
|
+
* matrix.get(0).set(1, 2)
|
|
224
|
+
* matrix.get(1).set(1, 3)
|
|
225
|
+
*
|
|
226
|
+
* console.log(matrix.get(0).get(0)) // 1
|
|
227
|
+
* console.log(matrix.get(0).get(1)) // 2
|
|
228
|
+
* console.log(matrix.get(1).get(0)) // 0 (auto-created)
|
|
229
|
+
* console.log(matrix.get(2).get(3)) // 0 (both auto-created)
|
|
230
|
+
* ```
|
|
231
|
+
*/
|
|
232
|
+
declare class DefaultMap<K$1, V> extends Map<K$1, V> {
|
|
233
|
+
private readonly defaultFactory;
|
|
234
|
+
constructor(defaultFactory: () => V, iterable?: Iterable<readonly [K$1, V]>);
|
|
235
|
+
get(key: K$1): V;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* A weak map that automatically creates values for missing keys using a factory function.
|
|
239
|
+
*
|
|
240
|
+
* Similar to {@link DefaultMap} but uses WeakMap as the base, allowing garbage collection of keys.
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* // Store metadata for DOM elements without preventing garbage collection
|
|
245
|
+
* const elementMetadata = new DefaultWeakMap<HTMLElement, { clicks: number; hovers: number }>(
|
|
246
|
+
* () => ({ clicks: 0, hovers: 0 })
|
|
247
|
+
* )
|
|
248
|
+
*
|
|
249
|
+
* const button = document.querySelector('button')!
|
|
250
|
+
* const div = document.querySelector('div')!
|
|
251
|
+
*
|
|
252
|
+
* elementMetadata.get(button).clicks++
|
|
253
|
+
* elementMetadata.get(button).clicks++
|
|
254
|
+
* elementMetadata.get(div).hovers++
|
|
255
|
+
*
|
|
256
|
+
* console.log(elementMetadata.get(button)) // { clicks: 2, hovers: 0 }
|
|
257
|
+
* console.log(elementMetadata.get(div)) // { clicks: 0, hovers: 1 }
|
|
258
|
+
* // When elements are removed from DOM and not referenced,
|
|
259
|
+
* // their metadata can be garbage collected
|
|
260
|
+
* ```
|
|
261
|
+
*
|
|
262
|
+
* @example
|
|
263
|
+
* ```typescript
|
|
264
|
+
* // Cache computed properties for objects
|
|
265
|
+
* const computedCache = new DefaultWeakMap<object, Map<string, any>>(
|
|
266
|
+
* () => new Map()
|
|
267
|
+
* )
|
|
268
|
+
*
|
|
269
|
+
* function getOrCompute(obj: object, key: string, compute: () => any) {
|
|
270
|
+
* const cache = computedCache.get(obj)
|
|
271
|
+
* if (!cache.has(key)) {
|
|
272
|
+
* cache.set(key, compute())
|
|
273
|
+
* }
|
|
274
|
+
* return cache.get(key)
|
|
275
|
+
* }
|
|
276
|
+
*
|
|
277
|
+
* const user = { name: 'Alice', age: 30 }
|
|
278
|
+
* const displayName = getOrCompute(user, 'displayName', () => user.name.toUpperCase())
|
|
279
|
+
* const birthYear = getOrCompute(user, 'birthYear', () => new Date().getFullYear() - user.age)
|
|
280
|
+
*
|
|
281
|
+
* console.log(displayName) // 'ALICE'
|
|
282
|
+
* console.log(birthYear) // 1994 (or current year - 30)
|
|
283
|
+
* ```
|
|
284
|
+
*
|
|
285
|
+
* @example
|
|
286
|
+
* ```typescript
|
|
287
|
+
* // Initialize with existing entries
|
|
288
|
+
* const obj1 = {}
|
|
289
|
+
* const obj2 = {}
|
|
290
|
+
*
|
|
291
|
+
* const objectData = new DefaultWeakMap<object, string[]>(
|
|
292
|
+
* () => [],
|
|
293
|
+
* [
|
|
294
|
+
* [obj1, ['tag1', 'tag2']],
|
|
295
|
+
* [obj2, ['tag3']]
|
|
296
|
+
* ]
|
|
297
|
+
* )
|
|
298
|
+
*
|
|
299
|
+
* objectData.get(obj1).push('tag4')
|
|
300
|
+
* console.log(objectData.get(obj1)) // ['tag1', 'tag2', 'tag4']
|
|
301
|
+
* console.log(objectData.get(obj2)) // ['tag3']
|
|
302
|
+
*
|
|
303
|
+
* const obj3 = {}
|
|
304
|
+
* console.log(objectData.get(obj3)) // [] (auto-created)
|
|
305
|
+
* ```
|
|
306
|
+
*
|
|
307
|
+
* @example
|
|
308
|
+
* ```typescript
|
|
309
|
+
* // Track event listeners per element using both DefaultWeakMap and DefaultMap
|
|
310
|
+
* const eventListeners = new DefaultWeakMap<EventTarget, DefaultMap<string, Function[]>>(
|
|
311
|
+
* () => new DefaultMap<string, Function[]>(() => [])
|
|
312
|
+
* )
|
|
313
|
+
*
|
|
314
|
+
* function addListener(target: EventTarget, event: string, handler: Function) {
|
|
315
|
+
* eventListeners.get(target).get(event).push(handler)
|
|
316
|
+
* }
|
|
317
|
+
*
|
|
318
|
+
* const element = document.createElement('button')
|
|
319
|
+
* addListener(element, 'click', () => console.log('clicked'))
|
|
320
|
+
* addListener(element, 'click', () => console.log('also clicked'))
|
|
321
|
+
* addListener(element, 'hover', () => console.log('hovered'))
|
|
322
|
+
*
|
|
323
|
+
* console.log(eventListeners.get(element).get('click').length) // 2
|
|
324
|
+
* console.log(eventListeners.get(element).get('hover').length) // 1
|
|
325
|
+
* // No need for has() checks or null assertions - everything auto-initializes!
|
|
326
|
+
* ```
|
|
327
|
+
*/
|
|
328
|
+
declare class DefaultWeakMap<K$1 extends WeakKey, V> extends WeakMap<K$1, V> {
|
|
329
|
+
private readonly defaultFactory;
|
|
330
|
+
constructor(defaultFactory: () => V, entries?: readonly (readonly [K$1, V])[] | null);
|
|
331
|
+
get(key: K$1): V;
|
|
332
|
+
}
|
|
333
|
+
//#endregion
|
|
69
334
|
//#region src/dom.d.ts
|
|
70
335
|
/**
|
|
71
336
|
* Checks if the given DOM node is an Element.
|
|
@@ -148,11 +413,11 @@ declare function isDeepEqual(a: unknown, b: unknown): boolean;
|
|
|
148
413
|
//#endregion
|
|
149
414
|
//#region src/map-group-by.d.ts
|
|
150
415
|
/**
|
|
151
|
-
* A polyfill for the `Map.groupBy` static method.
|
|
416
|
+
* A polyfill for the [`Map.groupBy()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy) static method.
|
|
152
417
|
*
|
|
153
418
|
* @public
|
|
154
419
|
*/
|
|
155
|
-
declare
|
|
420
|
+
declare function mapGroupBy<K$1, T>(items: Iterable<T>, keySelector: (item: T, index: number) => K$1): Map<K$1, T[]>;
|
|
156
421
|
//#endregion
|
|
157
422
|
//#region src/map-values.d.ts
|
|
158
423
|
/**
|
|
@@ -207,13 +472,16 @@ declare function mapValues<ValueIn, ValueOut>(object: Record<string, ValueIn>, c
|
|
|
207
472
|
*/
|
|
208
473
|
type ObjectEntries<T extends Record<string, any>> = { [K in keyof T]: [K, T[K]] }[keyof T];
|
|
209
474
|
/**
|
|
210
|
-
* A type-safe wrapper around
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
475
|
+
* A type-safe wrapper around
|
|
476
|
+
* [`Object.entries()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries)
|
|
477
|
+
* that preserves the exact types of object keys and values. Unlike the standard
|
|
478
|
+
* `Object.entries()` which returns `[string, any][]`, this function returns an
|
|
479
|
+
* array of tuples where each tuple is precisely typed according to the input
|
|
480
|
+
* object's structure.
|
|
214
481
|
*
|
|
215
|
-
* This is particularly useful when working with objects that have known, fixed
|
|
216
|
-
* and you want to maintain type safety when iterating over
|
|
482
|
+
* This is particularly useful when working with objects that have known, fixed
|
|
483
|
+
* property types and you want to maintain type safety when iterating over
|
|
484
|
+
* entries.
|
|
217
485
|
*
|
|
218
486
|
* @example
|
|
219
487
|
* ```typescript
|
|
@@ -243,15 +511,15 @@ type ObjectEntries<T extends Record<string, any>> = { [K in keyof T]: [K, T[K]]
|
|
|
243
511
|
*
|
|
244
512
|
* @public
|
|
245
513
|
*/
|
|
246
|
-
declare
|
|
514
|
+
declare function objectEntries<T extends Record<string, any>>(obj: T): ObjectEntries<T>[];
|
|
247
515
|
//#endregion
|
|
248
516
|
//#region src/object-group-by.d.ts
|
|
249
517
|
/**
|
|
250
|
-
* A polyfill for the `Object.groupBy` static method.
|
|
518
|
+
* A polyfill for the [`Object.groupBy()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy) static method.
|
|
251
519
|
*
|
|
252
520
|
* @public
|
|
253
521
|
*/
|
|
254
|
-
declare
|
|
522
|
+
declare function objectGroupBy<K$1 extends PropertyKey, T>(items: Iterable<T>, keySelector: (item: T, index: number) => K$1): Partial<Record<K$1, T[]>>;
|
|
255
523
|
//#endregion
|
|
256
524
|
//#region src/once.d.ts
|
|
257
525
|
/**
|
|
@@ -271,9 +539,16 @@ declare function once<T>(fn: () => T): () => T;
|
|
|
271
539
|
//#endregion
|
|
272
540
|
//#region src/sleep.d.ts
|
|
273
541
|
/**
|
|
274
|
-
*
|
|
542
|
+
* Returns a Promise that resolves after a specified number of milliseconds.
|
|
543
|
+
*
|
|
544
|
+
* @param ms - The number of milliseconds to wait.
|
|
545
|
+
*
|
|
546
|
+
* @example
|
|
547
|
+
* ```js
|
|
548
|
+
* await sleep(1000) // Wait 1 second
|
|
549
|
+
* ```
|
|
275
550
|
*/
|
|
276
551
|
declare function sleep(ms: number): Promise<void>;
|
|
277
552
|
//#endregion
|
|
278
|
-
export { Counter, DefaultMap, DefaultWeakMap, type ObjectEntries, WeakCounter, formatBytes, getDocument, getDocumentElement, getId, getWindow, isDeepEqual, isDocument, isDocumentFragment, isElement, isElementLike, isHTMLElement, isMap, isMathMLElement, isNodeLike, isObject, isSVGElement, isSet, isShadowRoot, isTextNode, isWindowLike, mapGroupBy, mapValues, objectEntries, objectGroupBy, once, sleep };
|
|
553
|
+
export { Counter, DefaultMap, DefaultWeakMap, type ObjectEntries, WeakCounter, formatBytes, getDocument, getDocumentElement, getId, getWindow, isDeepEqual, isDocument, isDocumentFragment, isElement, isElementLike, isHTMLElement, isMap, isMathMLElement, isNodeLike, isNotNullish, isObject, isSVGElement, isSet, isShadowRoot, isTextNode, isWindowLike, mapGroupBy, mapValues, objectEntries, objectGroupBy, once, sleep };
|
|
279
554
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/checker.ts","../src/default-map.ts","../src/dom.ts","../src/format-bytes.ts","../src/get-id.ts","../src/is-deep-equal.ts","../src/map-group-by.ts","../src/map-values.ts","../src/object-entries.ts","../src/object-group-by.ts","../src/once.ts","../src/sleep.ts"],"sourcesContent":[],"mappings":";;AAGA;AASA;AAOgB,iBAhBA,QAAA,CAgBmC,KAAA,EAAA,OAAA,CAAA,EAAA,KAAA,IAdvC,MAcuC,CAAA,MAAA,GAAA,MAAA,GAAA,MAAA,EAAA,OAAA,CAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/checker.ts","../src/counter.ts","../src/default-map.ts","../src/dom.ts","../src/format-bytes.ts","../src/get-id.ts","../src/is-deep-equal.ts","../src/map-group-by.ts","../src/map-values.ts","../src/object-entries.ts","../src/object-group-by.ts","../src/once.ts","../src/sleep.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,27 +7,15 @@ function isMap(value) {
|
|
|
7
7
|
function isSet(value) {
|
|
8
8
|
return value instanceof Set;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
let value = this.defaultFactory();
|
|
17
|
-
return this.set(key, value), value;
|
|
18
|
-
}
|
|
19
|
-
}, DefaultWeakMap = class extends WeakMap {
|
|
20
|
-
constructor(defaultFactory, entries) {
|
|
21
|
-
super(entries), this.defaultFactory = defaultFactory;
|
|
10
|
+
function isNotNullish(value) {
|
|
11
|
+
return value != null;
|
|
12
|
+
}
|
|
13
|
+
var Counter = class extends Map {
|
|
14
|
+
constructor(iterable) {
|
|
15
|
+
super(iterable);
|
|
22
16
|
}
|
|
23
17
|
get(key) {
|
|
24
|
-
|
|
25
|
-
let value = this.defaultFactory();
|
|
26
|
-
return this.set(key, value), value;
|
|
27
|
-
}
|
|
28
|
-
}, Counter = class extends DefaultMap {
|
|
29
|
-
constructor(iterable) {
|
|
30
|
-
super(() => 0, iterable);
|
|
18
|
+
return super.get(key) ?? 0;
|
|
31
19
|
}
|
|
32
20
|
increment(key, amount = 1) {
|
|
33
21
|
this.set(key, this.get(key) + amount);
|
|
@@ -35,9 +23,12 @@ var DefaultMap = class extends Map {
|
|
|
35
23
|
decrement(key, amount = 1) {
|
|
36
24
|
this.set(key, this.get(key) - amount);
|
|
37
25
|
}
|
|
38
|
-
}, WeakCounter = class extends
|
|
26
|
+
}, WeakCounter = class extends WeakMap {
|
|
39
27
|
constructor(entries) {
|
|
40
|
-
super(
|
|
28
|
+
super(entries);
|
|
29
|
+
}
|
|
30
|
+
get(key) {
|
|
31
|
+
return super.get(key) ?? 0;
|
|
41
32
|
}
|
|
42
33
|
increment(key, amount = 1) {
|
|
43
34
|
this.set(key, this.get(key) + amount);
|
|
@@ -45,6 +36,24 @@ var DefaultMap = class extends Map {
|
|
|
45
36
|
decrement(key, amount = 1) {
|
|
46
37
|
this.set(key, this.get(key) - amount);
|
|
47
38
|
}
|
|
39
|
+
}, DefaultMap = class extends Map {
|
|
40
|
+
constructor(defaultFactory, iterable) {
|
|
41
|
+
super(iterable), this.defaultFactory = defaultFactory;
|
|
42
|
+
}
|
|
43
|
+
get(key) {
|
|
44
|
+
if (this.has(key)) return super.get(key);
|
|
45
|
+
let value = this.defaultFactory();
|
|
46
|
+
return this.set(key, value), value;
|
|
47
|
+
}
|
|
48
|
+
}, DefaultWeakMap = class extends WeakMap {
|
|
49
|
+
constructor(defaultFactory, entries) {
|
|
50
|
+
super(entries), this.defaultFactory = defaultFactory;
|
|
51
|
+
}
|
|
52
|
+
get(key) {
|
|
53
|
+
if (this.has(key)) return super.get(key);
|
|
54
|
+
let value = this.defaultFactory();
|
|
55
|
+
return this.set(key, value), value;
|
|
56
|
+
}
|
|
48
57
|
};
|
|
49
58
|
function isElement(node) {
|
|
50
59
|
return node.nodeType === 1;
|
|
@@ -146,16 +155,17 @@ function mapGroupByPolyfill(items, keySelector) {
|
|
|
146
155
|
}
|
|
147
156
|
return map;
|
|
148
157
|
}
|
|
149
|
-
function
|
|
150
|
-
return Map.groupBy(items, keySelector);
|
|
158
|
+
function mapGroupBy(items, keySelector) {
|
|
159
|
+
return Map.groupBy ? Map.groupBy(items, keySelector) : mapGroupByPolyfill(items, keySelector);
|
|
151
160
|
}
|
|
152
|
-
const mapGroupBy = /* @__PURE__ */ (() => !!Map.groupBy)() ? mapGroupByNative : mapGroupByPolyfill;
|
|
153
161
|
function mapValues(object, callback) {
|
|
154
162
|
let result = {};
|
|
155
163
|
for (let [key, value] of Object.entries(object)) result[key] = callback(value, key);
|
|
156
164
|
return result;
|
|
157
165
|
}
|
|
158
|
-
|
|
166
|
+
function objectEntries(obj) {
|
|
167
|
+
return Object.entries(obj);
|
|
168
|
+
}
|
|
159
169
|
function objectGroupByPolyfill(items, keySelector) {
|
|
160
170
|
let result = {}, index = 0;
|
|
161
171
|
for (let item of items) {
|
|
@@ -164,10 +174,9 @@ function objectGroupByPolyfill(items, keySelector) {
|
|
|
164
174
|
}
|
|
165
175
|
return result;
|
|
166
176
|
}
|
|
167
|
-
function
|
|
168
|
-
return Object.groupBy(items, keySelector);
|
|
177
|
+
function objectGroupBy(items, keySelector) {
|
|
178
|
+
return Object.groupBy ? Object.groupBy(items, keySelector) : objectGroupByPolyfill(items, keySelector);
|
|
169
179
|
}
|
|
170
|
-
const objectGroupBy = /* @__PURE__ */ (() => !!Object.groupBy)() ? objectGroupByNative : objectGroupByPolyfill;
|
|
171
180
|
function once(fn) {
|
|
172
181
|
let called = !1, result;
|
|
173
182
|
return () => (called || (result = fn(), called = !0, fn = void 0), result);
|
|
@@ -175,6 +184,6 @@ function once(fn) {
|
|
|
175
184
|
function sleep(ms) {
|
|
176
185
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
177
186
|
}
|
|
178
|
-
export { Counter, DefaultMap, DefaultWeakMap, WeakCounter, formatBytes, getDocument, getDocumentElement, getId, getWindow, isDeepEqual, isDocument, isDocumentFragment, isElement, isElementLike, isHTMLElement, isMap, isMathMLElement, isNodeLike, isObject, isSVGElement, isSet, isShadowRoot, isTextNode, isWindowLike, mapGroupBy, mapValues, objectEntries, objectGroupBy, once, sleep };
|
|
187
|
+
export { Counter, DefaultMap, DefaultWeakMap, WeakCounter, formatBytes, getDocument, getDocumentElement, getId, getWindow, isDeepEqual, isDocument, isDocumentFragment, isElement, isElementLike, isHTMLElement, isMap, isMathMLElement, isNodeLike, isNotNullish, isObject, isSVGElement, isSet, isShadowRoot, isTextNode, isWindowLike, mapGroupBy, mapValues, objectEntries, objectGroupBy, once, sleep };
|
|
179
188
|
|
|
180
189
|
//# sourceMappingURL=index.js.map
|