@react-hive/honey-utils 4.0.0 โ 4.2.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/README.md +80 -6
- package/dist/README.md +80 -6
- package/dist/array/index.d.ts +1 -0
- package/dist/array/toggle-array-item.d.ts +26 -0
- package/dist/dom/history.d.ts +24 -0
- package/dist/dom/index.d.ts +1 -0
- package/dist/encoding/encode-base64-json.d.ts +1 -0
- package/dist/encoding/encode-base64.d.ts +1 -0
- package/dist/encoding/index.d.ts +2 -0
- package/dist/guards.d.ts +23 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.dev.cjs +256 -45
- package/dist/index.dev.cjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/math/clamp.d.ts +18 -0
- package/dist/math/index.d.ts +1 -0
- package/package.json +9 -9
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ A lightweight TypeScript utility library providing a collection of helper functi
|
|
|
17
17
|
- ๐งฎ **Math Utilities** - Common mathematical calculations
|
|
18
18
|
- ๐ฏ **Function Utilities** - Function handling helpers
|
|
19
19
|
- ๐ฅ๏ธ **DOM Utilities** - Browser DOM manipulation helpers
|
|
20
|
-
- ๐งฌ **Encoding Utilities** - Base64 decoding and encoded JSON helpers
|
|
20
|
+
- ๐งฌ **Encoding Utilities** - Base64 encoding and decoding, and encoded JSON helpers
|
|
21
21
|
- ๐งพ **JSON Utilities** - Safe JSON parsing
|
|
22
22
|
- ๐ฆ **Zero Dependencies** - Lightweight and dependency-free
|
|
23
23
|
- ๐ **TypeScript Support** - Full TypeScript type definitions
|
|
@@ -105,7 +105,12 @@ const hash = hashString('background-color: red;');
|
|
|
105
105
|
### Encoding Utilities
|
|
106
106
|
|
|
107
107
|
```ts
|
|
108
|
-
import {
|
|
108
|
+
import {
|
|
109
|
+
decodeBase64,
|
|
110
|
+
decodeBase64Json,
|
|
111
|
+
encodeBase64,
|
|
112
|
+
encodeBase64Json,
|
|
113
|
+
} from '@react-hive/honey-utils';
|
|
109
114
|
|
|
110
115
|
/**
|
|
111
116
|
* Decode a base64 string
|
|
@@ -130,6 +135,24 @@ decodeBase64Json<{ name: string; age: number }>('eyJuYW1lIjoiTWlrZSIsImFnZSI6MzN
|
|
|
130
135
|
*/
|
|
131
136
|
decodeBase64Json('invalid');
|
|
132
137
|
// โ null
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Encode a string as base64
|
|
141
|
+
*/
|
|
142
|
+
encodeBase64('Hello world');
|
|
143
|
+
// โ 'SGVsbG8gd29ybGQ='
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Unicode text is encoded from its UTF-8 bytes
|
|
147
|
+
*/
|
|
148
|
+
encodeBase64('ะัะธะฒะตั ะผะธั');
|
|
149
|
+
// โ '0J/RgNC40LLQtdGCINC80LjRgA=='
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Serialize a value as JSON and encode it as base64
|
|
153
|
+
*/
|
|
154
|
+
encodeBase64Json({ name: 'Mike', age: 33 });
|
|
155
|
+
// โ 'eyJuYW1lIjoiTWlrZSIsImFnZSI6MzN9'
|
|
133
156
|
```
|
|
134
157
|
|
|
135
158
|
### JSON Utilities
|
|
@@ -176,6 +199,7 @@ import {
|
|
|
176
199
|
chunk,
|
|
177
200
|
intersection,
|
|
178
201
|
difference,
|
|
202
|
+
toggleArrayItem,
|
|
179
203
|
pipe,
|
|
180
204
|
compose,
|
|
181
205
|
} from '@react-hive/honey-utils';
|
|
@@ -226,6 +250,16 @@ intersection([1, 2, 3], [2, 3, 4]);
|
|
|
226
250
|
difference([1, 2, 3, 4], [2, 4]);
|
|
227
251
|
// โ [1, 3]
|
|
228
252
|
|
|
253
|
+
/**
|
|
254
|
+
* Add an item to an array or remove it
|
|
255
|
+
*/
|
|
256
|
+
toggleArrayItem(['a', 'b'], 'c', true);
|
|
257
|
+
// โ ['a', 'b', 'c']
|
|
258
|
+
toggleArrayItem(['a', 'b'], 'b', false);
|
|
259
|
+
// โ ['a']
|
|
260
|
+
toggleArrayItem(['a', 'b'], 'a');
|
|
261
|
+
// โ ['b']
|
|
262
|
+
|
|
229
263
|
/**
|
|
230
264
|
* Compose functions from left to right
|
|
231
265
|
*/
|
|
@@ -408,7 +442,8 @@ import {
|
|
|
408
442
|
isValidDate,
|
|
409
443
|
isRegExp,
|
|
410
444
|
isMap,
|
|
411
|
-
isSet
|
|
445
|
+
isSet,
|
|
446
|
+
isEnumValue,
|
|
412
447
|
} from '@react-hive/honey-utils';
|
|
413
448
|
|
|
414
449
|
/**
|
|
@@ -484,6 +519,19 @@ isMap(new Map());
|
|
|
484
519
|
// โ true
|
|
485
520
|
isSet(new Set());
|
|
486
521
|
// โ true
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Check if value is one of a string enum's values
|
|
525
|
+
*/
|
|
526
|
+
enum Fruit {
|
|
527
|
+
APPLE = 'apple',
|
|
528
|
+
PEAR = 'pear',
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
isEnumValue(Fruit, 'apple');
|
|
532
|
+
// โ true
|
|
533
|
+
isEnumValue(Fruit, 'APPLE');
|
|
534
|
+
// โ false
|
|
487
535
|
```
|
|
488
536
|
|
|
489
537
|
### Math Utilities
|
|
@@ -492,7 +540,8 @@ isSet(new Set());
|
|
|
492
540
|
import {
|
|
493
541
|
calculateEuclideanDistance,
|
|
494
542
|
calculateMovingSpeed,
|
|
495
|
-
calculatePercentage
|
|
543
|
+
calculatePercentage,
|
|
544
|
+
clamp,
|
|
496
545
|
} from '@react-hive/honey-utils';
|
|
497
546
|
|
|
498
547
|
/**
|
|
@@ -512,12 +561,18 @@ calculateMovingSpeed(100, 5);
|
|
|
512
561
|
*/
|
|
513
562
|
calculatePercentage(200, 25);
|
|
514
563
|
// โ 50
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* Restrict a number to a range
|
|
567
|
+
*/
|
|
568
|
+
clamp(42, 0, 10);
|
|
569
|
+
// โ 10
|
|
515
570
|
```
|
|
516
571
|
|
|
517
572
|
### DOM Utilities
|
|
518
573
|
|
|
519
574
|
```ts
|
|
520
|
-
import { parse2DMatrix, cloneBlob } from '@react-hive/honey-utils';
|
|
575
|
+
import { parse2DMatrix, cloneBlob, replaceHistorySearchParams } from '@react-hive/honey-utils';
|
|
521
576
|
|
|
522
577
|
/**
|
|
523
578
|
* Extract transformation values from an HTML element's 2D matrix
|
|
@@ -539,6 +594,16 @@ const clonedBlob = cloneBlob(originalBlob);
|
|
|
539
594
|
|
|
540
595
|
console.log(clonedBlob.type);
|
|
541
596
|
// โ 'text/plain'
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Replace the query string of the current URL without adding a history entry
|
|
600
|
+
*/
|
|
601
|
+
const searchParams = new URLSearchParams(window.location.search);
|
|
602
|
+
|
|
603
|
+
searchParams.set('page', '2');
|
|
604
|
+
|
|
605
|
+
replaceHistorySearchParams(searchParams);
|
|
606
|
+
// โ /products?page=2#reviews
|
|
542
607
|
```
|
|
543
608
|
|
|
544
609
|
### File Utilities
|
|
@@ -628,8 +693,10 @@ function divide(a: number, b: number): number {
|
|
|
628
693
|
|
|
629
694
|
---
|
|
630
695
|
|
|
631
|
-
- `decodeBase64(value: string): Nullable<string>` - Decodes a base64-encoded string into UTF-8 text. Returns `null` when
|
|
696
|
+
- `decodeBase64(value: string): Nullable<string>` - Decodes a base64-encoded string into UTF-8 text. Returns `null` when the value is not padded standard base64 or its bytes are not valid UTF-8.
|
|
632
697
|
- `decodeBase64Json<Value>(value: string): Nullable<Value>` - Decodes a base64-encoded string and safely parses the decoded result as JSON. Returns `null` when base64 decoding fails or when the decoded value is not valid JSON.
|
|
698
|
+
- `encodeBase64(value: string): string` - Encodes a string as base64 from its UTF-8 bytes - the counterpart of `decodeBase64`.
|
|
699
|
+
- `encodeBase64Json<Value>(value: Value): string` - Serializes a value as JSON and encodes the result as base64 - the counterpart of `decodeBase64Json`. Throws as `JSON.stringify` does, for a circular structure or a `BigInt`.
|
|
633
700
|
|
|
634
701
|
### JSON Utilities
|
|
635
702
|
|
|
@@ -663,6 +730,7 @@ function divide(a: number, b: number): number {
|
|
|
663
730
|
- `pipe(...fns: Function[]): Function` - Composes unary functions left-to-right. Returns a new function that applies all given functions in a sequence.
|
|
664
731
|
- `compose(...fns: Function[]): Function` - Composes unary functions **right-to-left**. Same as `pipe`, but applies functions in reverse order.
|
|
665
732
|
- `getAdjacentItems<T>(items: Nullable<T[]> | undefined, targetItem: Nullable<T> | undefined, isSameItem: (item: T, targetItem: T) => boolean): AdjacentItems` - Returns the previous, current, and next items for the matched item in the array. If the target is not found, all returned values are `null`.
|
|
733
|
+
- `toggleArrayItem<T>(array: T[], item: T, isIncluded?: boolean): T[]` - Adds an item to an array or removes it, without changing the source array. `isIncluded` says whether the item should be in the array; when omitted, the item's presence is flipped. Returns the source array itself when it already is as asked, and never adds an item already present a second time.
|
|
666
734
|
|
|
667
735
|
### Function Utilities
|
|
668
736
|
|
|
@@ -698,6 +766,7 @@ function divide(a: number, b: number): number {
|
|
|
698
766
|
- `isSymbol(value: unknown): value is symbol` - Checks if a value is a `Symbol`.
|
|
699
767
|
- `isBlob(value: unknown): value is Blob` โ Checks if a value is a `Blob`.
|
|
700
768
|
- `isError(value: unknown): value is Error` โ Checks if a value is an `Error` object.
|
|
769
|
+
- `isEnumValue<Value extends string>(enumObject: Record<string, Value>, value: unknown): value is Value` - Checks if a value is one of a string enum's values, narrowing it to the enum's type.
|
|
701
770
|
|
|
702
771
|
### Math Utilities
|
|
703
772
|
|
|
@@ -707,6 +776,7 @@ function divide(a: number, b: number): number {
|
|
|
707
776
|
- `calculateMovingSpeed(distance: number, elapsedTime: number): number` - Calculates moving speed.
|
|
708
777
|
- `calculatePercentage(value: number, percentage: number): number` - Calculates the specified percentage of a value.
|
|
709
778
|
- `hashString(input: string): string` - Generates a short hash from a string.
|
|
779
|
+
- `clamp(value: number, min: number, max: number): number` - Restricts a number to the inclusive range between `min` and `max`. `max` wins when the bounds cross.
|
|
710
780
|
|
|
711
781
|
### ENV
|
|
712
782
|
|
|
@@ -742,6 +812,10 @@ function divide(a: number, b: number): number {
|
|
|
742
812
|
|
|
743
813
|
- `downloadFile(file: Downloadable, options?: DownloadFileOptions): void` - Initiates a file download in a browser environment from a URL string or binary source (`Blob` / `MediaSource`). Automatically creates and revokes object URLs when required and safely no-ops in non-DOM environments (e.g. SSR).
|
|
744
814
|
|
|
815
|
+
#### History
|
|
816
|
+
|
|
817
|
+
- `replaceHistorySearchParams(searchParams: URLSearchParams): void` - Replaces the query string of the current URL with `history.replaceState()`, without navigating or adding a history entry. Keeps the path, the hash and the history entry's state, which routers such as React Router keep their own bookkeeping in. Empty search params remove the query string altogether.
|
|
818
|
+
|
|
745
819
|
#### Layout
|
|
746
820
|
|
|
747
821
|
- `hasXOverflow(element: HTMLElement): boolean` - Checks whether an element has horizontal overflow. Returns `true` if the content overflows beyond the visible width.
|
package/dist/README.md
CHANGED
|
@@ -17,7 +17,7 @@ A lightweight TypeScript utility library providing a collection of helper functi
|
|
|
17
17
|
- ๐งฎ **Math Utilities** - Common mathematical calculations
|
|
18
18
|
- ๐ฏ **Function Utilities** - Function handling helpers
|
|
19
19
|
- ๐ฅ๏ธ **DOM Utilities** - Browser DOM manipulation helpers
|
|
20
|
-
- ๐งฌ **Encoding Utilities** - Base64 decoding and encoded JSON helpers
|
|
20
|
+
- ๐งฌ **Encoding Utilities** - Base64 encoding and decoding, and encoded JSON helpers
|
|
21
21
|
- ๐งพ **JSON Utilities** - Safe JSON parsing
|
|
22
22
|
- ๐ฆ **Zero Dependencies** - Lightweight and dependency-free
|
|
23
23
|
- ๐ **TypeScript Support** - Full TypeScript type definitions
|
|
@@ -105,7 +105,12 @@ const hash = hashString('background-color: red;');
|
|
|
105
105
|
### Encoding Utilities
|
|
106
106
|
|
|
107
107
|
```ts
|
|
108
|
-
import {
|
|
108
|
+
import {
|
|
109
|
+
decodeBase64,
|
|
110
|
+
decodeBase64Json,
|
|
111
|
+
encodeBase64,
|
|
112
|
+
encodeBase64Json,
|
|
113
|
+
} from '@react-hive/honey-utils';
|
|
109
114
|
|
|
110
115
|
/**
|
|
111
116
|
* Decode a base64 string
|
|
@@ -130,6 +135,24 @@ decodeBase64Json<{ name: string; age: number }>('eyJuYW1lIjoiTWlrZSIsImFnZSI6MzN
|
|
|
130
135
|
*/
|
|
131
136
|
decodeBase64Json('invalid');
|
|
132
137
|
// โ null
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Encode a string as base64
|
|
141
|
+
*/
|
|
142
|
+
encodeBase64('Hello world');
|
|
143
|
+
// โ 'SGVsbG8gd29ybGQ='
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Unicode text is encoded from its UTF-8 bytes
|
|
147
|
+
*/
|
|
148
|
+
encodeBase64('ะัะธะฒะตั ะผะธั');
|
|
149
|
+
// โ '0J/RgNC40LLQtdGCINC80LjRgA=='
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Serialize a value as JSON and encode it as base64
|
|
153
|
+
*/
|
|
154
|
+
encodeBase64Json({ name: 'Mike', age: 33 });
|
|
155
|
+
// โ 'eyJuYW1lIjoiTWlrZSIsImFnZSI6MzN9'
|
|
133
156
|
```
|
|
134
157
|
|
|
135
158
|
### JSON Utilities
|
|
@@ -176,6 +199,7 @@ import {
|
|
|
176
199
|
chunk,
|
|
177
200
|
intersection,
|
|
178
201
|
difference,
|
|
202
|
+
toggleArrayItem,
|
|
179
203
|
pipe,
|
|
180
204
|
compose,
|
|
181
205
|
} from '@react-hive/honey-utils';
|
|
@@ -226,6 +250,16 @@ intersection([1, 2, 3], [2, 3, 4]);
|
|
|
226
250
|
difference([1, 2, 3, 4], [2, 4]);
|
|
227
251
|
// โ [1, 3]
|
|
228
252
|
|
|
253
|
+
/**
|
|
254
|
+
* Add an item to an array or remove it
|
|
255
|
+
*/
|
|
256
|
+
toggleArrayItem(['a', 'b'], 'c', true);
|
|
257
|
+
// โ ['a', 'b', 'c']
|
|
258
|
+
toggleArrayItem(['a', 'b'], 'b', false);
|
|
259
|
+
// โ ['a']
|
|
260
|
+
toggleArrayItem(['a', 'b'], 'a');
|
|
261
|
+
// โ ['b']
|
|
262
|
+
|
|
229
263
|
/**
|
|
230
264
|
* Compose functions from left to right
|
|
231
265
|
*/
|
|
@@ -408,7 +442,8 @@ import {
|
|
|
408
442
|
isValidDate,
|
|
409
443
|
isRegExp,
|
|
410
444
|
isMap,
|
|
411
|
-
isSet
|
|
445
|
+
isSet,
|
|
446
|
+
isEnumValue,
|
|
412
447
|
} from '@react-hive/honey-utils';
|
|
413
448
|
|
|
414
449
|
/**
|
|
@@ -484,6 +519,19 @@ isMap(new Map());
|
|
|
484
519
|
// โ true
|
|
485
520
|
isSet(new Set());
|
|
486
521
|
// โ true
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Check if value is one of a string enum's values
|
|
525
|
+
*/
|
|
526
|
+
enum Fruit {
|
|
527
|
+
APPLE = 'apple',
|
|
528
|
+
PEAR = 'pear',
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
isEnumValue(Fruit, 'apple');
|
|
532
|
+
// โ true
|
|
533
|
+
isEnumValue(Fruit, 'APPLE');
|
|
534
|
+
// โ false
|
|
487
535
|
```
|
|
488
536
|
|
|
489
537
|
### Math Utilities
|
|
@@ -492,7 +540,8 @@ isSet(new Set());
|
|
|
492
540
|
import {
|
|
493
541
|
calculateEuclideanDistance,
|
|
494
542
|
calculateMovingSpeed,
|
|
495
|
-
calculatePercentage
|
|
543
|
+
calculatePercentage,
|
|
544
|
+
clamp,
|
|
496
545
|
} from '@react-hive/honey-utils';
|
|
497
546
|
|
|
498
547
|
/**
|
|
@@ -512,12 +561,18 @@ calculateMovingSpeed(100, 5);
|
|
|
512
561
|
*/
|
|
513
562
|
calculatePercentage(200, 25);
|
|
514
563
|
// โ 50
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* Restrict a number to a range
|
|
567
|
+
*/
|
|
568
|
+
clamp(42, 0, 10);
|
|
569
|
+
// โ 10
|
|
515
570
|
```
|
|
516
571
|
|
|
517
572
|
### DOM Utilities
|
|
518
573
|
|
|
519
574
|
```ts
|
|
520
|
-
import { parse2DMatrix, cloneBlob } from '@react-hive/honey-utils';
|
|
575
|
+
import { parse2DMatrix, cloneBlob, replaceHistorySearchParams } from '@react-hive/honey-utils';
|
|
521
576
|
|
|
522
577
|
/**
|
|
523
578
|
* Extract transformation values from an HTML element's 2D matrix
|
|
@@ -539,6 +594,16 @@ const clonedBlob = cloneBlob(originalBlob);
|
|
|
539
594
|
|
|
540
595
|
console.log(clonedBlob.type);
|
|
541
596
|
// โ 'text/plain'
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Replace the query string of the current URL without adding a history entry
|
|
600
|
+
*/
|
|
601
|
+
const searchParams = new URLSearchParams(window.location.search);
|
|
602
|
+
|
|
603
|
+
searchParams.set('page', '2');
|
|
604
|
+
|
|
605
|
+
replaceHistorySearchParams(searchParams);
|
|
606
|
+
// โ /products?page=2#reviews
|
|
542
607
|
```
|
|
543
608
|
|
|
544
609
|
### File Utilities
|
|
@@ -628,8 +693,10 @@ function divide(a: number, b: number): number {
|
|
|
628
693
|
|
|
629
694
|
---
|
|
630
695
|
|
|
631
|
-
- `decodeBase64(value: string): Nullable<string>` - Decodes a base64-encoded string into UTF-8 text. Returns `null` when
|
|
696
|
+
- `decodeBase64(value: string): Nullable<string>` - Decodes a base64-encoded string into UTF-8 text. Returns `null` when the value is not padded standard base64 or its bytes are not valid UTF-8.
|
|
632
697
|
- `decodeBase64Json<Value>(value: string): Nullable<Value>` - Decodes a base64-encoded string and safely parses the decoded result as JSON. Returns `null` when base64 decoding fails or when the decoded value is not valid JSON.
|
|
698
|
+
- `encodeBase64(value: string): string` - Encodes a string as base64 from its UTF-8 bytes - the counterpart of `decodeBase64`.
|
|
699
|
+
- `encodeBase64Json<Value>(value: Value): string` - Serializes a value as JSON and encodes the result as base64 - the counterpart of `decodeBase64Json`. Throws as `JSON.stringify` does, for a circular structure or a `BigInt`.
|
|
633
700
|
|
|
634
701
|
### JSON Utilities
|
|
635
702
|
|
|
@@ -663,6 +730,7 @@ function divide(a: number, b: number): number {
|
|
|
663
730
|
- `pipe(...fns: Function[]): Function` - Composes unary functions left-to-right. Returns a new function that applies all given functions in a sequence.
|
|
664
731
|
- `compose(...fns: Function[]): Function` - Composes unary functions **right-to-left**. Same as `pipe`, but applies functions in reverse order.
|
|
665
732
|
- `getAdjacentItems<T>(items: Nullable<T[]> | undefined, targetItem: Nullable<T> | undefined, isSameItem: (item: T, targetItem: T) => boolean): AdjacentItems` - Returns the previous, current, and next items for the matched item in the array. If the target is not found, all returned values are `null`.
|
|
733
|
+
- `toggleArrayItem<T>(array: T[], item: T, isIncluded?: boolean): T[]` - Adds an item to an array or removes it, without changing the source array. `isIncluded` says whether the item should be in the array; when omitted, the item's presence is flipped. Returns the source array itself when it already is as asked, and never adds an item already present a second time.
|
|
666
734
|
|
|
667
735
|
### Function Utilities
|
|
668
736
|
|
|
@@ -698,6 +766,7 @@ function divide(a: number, b: number): number {
|
|
|
698
766
|
- `isSymbol(value: unknown): value is symbol` - Checks if a value is a `Symbol`.
|
|
699
767
|
- `isBlob(value: unknown): value is Blob` โ Checks if a value is a `Blob`.
|
|
700
768
|
- `isError(value: unknown): value is Error` โ Checks if a value is an `Error` object.
|
|
769
|
+
- `isEnumValue<Value extends string>(enumObject: Record<string, Value>, value: unknown): value is Value` - Checks if a value is one of a string enum's values, narrowing it to the enum's type.
|
|
701
770
|
|
|
702
771
|
### Math Utilities
|
|
703
772
|
|
|
@@ -707,6 +776,7 @@ function divide(a: number, b: number): number {
|
|
|
707
776
|
- `calculateMovingSpeed(distance: number, elapsedTime: number): number` - Calculates moving speed.
|
|
708
777
|
- `calculatePercentage(value: number, percentage: number): number` - Calculates the specified percentage of a value.
|
|
709
778
|
- `hashString(input: string): string` - Generates a short hash from a string.
|
|
779
|
+
- `clamp(value: number, min: number, max: number): number` - Restricts a number to the inclusive range between `min` and `max`. `max` wins when the bounds cross.
|
|
710
780
|
|
|
711
781
|
### ENV
|
|
712
782
|
|
|
@@ -742,6 +812,10 @@ function divide(a: number, b: number): number {
|
|
|
742
812
|
|
|
743
813
|
- `downloadFile(file: Downloadable, options?: DownloadFileOptions): void` - Initiates a file download in a browser environment from a URL string or binary source (`Blob` / `MediaSource`). Automatically creates and revokes object URLs when required and safely no-ops in non-DOM environments (e.g. SSR).
|
|
744
814
|
|
|
815
|
+
#### History
|
|
816
|
+
|
|
817
|
+
- `replaceHistorySearchParams(searchParams: URLSearchParams): void` - Replaces the query string of the current URL with `history.replaceState()`, without navigating or adding a history entry. Keeps the path, the hash and the history entry's state, which routers such as React Router keep their own bookkeeping in. Empty search params remove the query string altogether.
|
|
818
|
+
|
|
745
819
|
#### Layout
|
|
746
820
|
|
|
747
821
|
- `hasXOverflow(element: HTMLElement): boolean` - Checks whether an element has horizontal overflow. Returns `true` if the content overflows beyond the visible width.
|
package/dist/array/index.d.ts
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adds an item to an array or removes it from the array, without changing the source array.
|
|
3
|
+
*
|
|
4
|
+
* With `isIncluded` given, the item ends up in the array or out of it as asked - what a checkbox
|
|
5
|
+
* in a list of them reports. Without it, the item's presence is flipped.
|
|
6
|
+
*
|
|
7
|
+
* The source array itself is returned when it already is as asked, and an item already present is
|
|
8
|
+
* never added a second time. Items are matched as `includes()` matches them.
|
|
9
|
+
*
|
|
10
|
+
* @template T - The type of the items in the array.
|
|
11
|
+
*
|
|
12
|
+
* @param array - The source array.
|
|
13
|
+
* @param item - The item to add or remove.
|
|
14
|
+
* @param isIncluded - Whether the item should be in the array. Flips its presence when omitted.
|
|
15
|
+
*
|
|
16
|
+
* @returns The array with the item in it or out of it.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* toggleArrayItem(['a', 'b'], 'c', true); // ['a', 'b', 'c']
|
|
21
|
+
* toggleArrayItem(['a', 'b'], 'b', false); // ['a']
|
|
22
|
+
* toggleArrayItem(['a', 'b'], 'a'); // ['b']
|
|
23
|
+
* toggleArrayItem(['a', 'b'], 'c'); // ['a', 'b', 'c']
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare const toggleArrayItem: <T>(array: T[], item: T, isIncluded?: boolean) => T[];
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replaces the query string of the current URL without navigating or adding a history entry.
|
|
3
|
+
*
|
|
4
|
+
* The path and the hash are kept, and so is the history entry's state, which routers such as
|
|
5
|
+
* React Router keep their own bookkeeping in. Empty search params remove the query string
|
|
6
|
+
* altogether rather than leaving a bare `?`.
|
|
7
|
+
*
|
|
8
|
+
* `history.replaceState()` fires no event, so a router listening for navigation is not told: its
|
|
9
|
+
* own location keeps the previous query until it next navigates.
|
|
10
|
+
*
|
|
11
|
+
* @param searchParams - The search params the URL should carry.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* // https://example.com/products?page=1#reviews
|
|
16
|
+
* const searchParams = new URLSearchParams(window.location.search);
|
|
17
|
+
*
|
|
18
|
+
* searchParams.set('page', '2');
|
|
19
|
+
*
|
|
20
|
+
* replaceHistorySearchParams(searchParams);
|
|
21
|
+
* // โ https://example.com/products?page=2#reviews
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare const replaceHistorySearchParams: (searchParams: URLSearchParams) => void;
|
package/dist/dom/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const encodeBase64Json: <Value>(value: Value) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const encodeBase64: (value: string) => string;
|
package/dist/encoding/index.d.ts
CHANGED
package/dist/guards.d.ts
CHANGED
|
@@ -203,3 +203,26 @@ export declare const isInteger: (value: unknown) => value is number;
|
|
|
203
203
|
* ```
|
|
204
204
|
*/
|
|
205
205
|
export declare const isDecimal: (value: unknown) => value is number;
|
|
206
|
+
/**
|
|
207
|
+
* Checks if a value is one of a string enum's values.
|
|
208
|
+
*
|
|
209
|
+
* @template Value - The type of the enum's values.
|
|
210
|
+
*
|
|
211
|
+
* @param enumObject - The enum, or any object whose values are the allowed strings.
|
|
212
|
+
* @param value - The value to check.
|
|
213
|
+
*
|
|
214
|
+
* @returns `true` if the value is one of the enum's values; otherwise, `false`.
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```ts
|
|
218
|
+
* enum Fruit {
|
|
219
|
+
* APPLE = 'apple',
|
|
220
|
+
* PEAR = 'pear',
|
|
221
|
+
* }
|
|
222
|
+
*
|
|
223
|
+
* isEnumValue(Fruit, 'apple'); // true
|
|
224
|
+
* isEnumValue(Fruit, 'APPLE'); // false
|
|
225
|
+
* isEnumValue(Fruit, null); // false
|
|
226
|
+
* ```
|
|
227
|
+
*/
|
|
228
|
+
export declare const isEnumValue: <Value extends string>(enumObject: Record<string, Value>, value: unknown) => value is Value;
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{"use strict";var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{DATA_TRANSFER_JSON_MIME:()=>re,FOCUSABLE_HTML_TAGS:()=>i,applyInertiaStep:()=>Me,assert:()=>p,blobToFile:()=>Se,calculateCenterOffset:()=>he,calculateEuclideanDistance:()=>Te,calculateMovingSpeed:()=>Fe,calculatePercentage:()=>Pe,camelToDashCase:()=>Ne,camelToWords:()=>Re,centerElementInContainer:()=>me,chunk:()=>N,clampOffsetToOverflow:()=>de,cloneBlob:()=>n,compact:()=>R,compose:()=>f,decodeBase64:()=>qe,decodeBase64Json:()=>Ve,definedProps:()=>_e,delay:()=>Q,difference:()=>h,downloadFile:()=>oe,everyAsync:()=>V,fileListToFiles:()=>we,filterParallel:()=>Z,filterSequential:()=>J,findAsync:()=>K,findCharIndices:()=>$e,flattenTree:()=>He,forEachChar:()=>Be,generateEphemeralId:()=>Ce,getAdjacentItems:()=>X,getDOMRectIntersectionRatio:()=>Oe,getDataTransferJson:()=>le,getElementOffsetRect:()=>r,getFocusableHtmlElements:()=>s,getLocalStorageCapabilities:()=>ye,getTreeChildren:()=>ze,getWordsInitials:()=>We,getXOverflowWidth:()=>ce,getYOverflowHeight:()=>fe,hasXOverflow:()=>se,hasYOverflow:()=>ue,hashString:()=>De,hexWithAlpha:()=>Je,intersection:()=>m,invokeIfFunction:()=>xe,isAnchorHtmlElement:()=>a,isArray:()=>j,isBlob:()=>M,isBool:()=>A,isContentEditableHtmlElement:()=>l,isDate:()=>I,isDecimal:()=>L,isDefined:()=>b,isEmptyArray:()=>k,isEmptyObject:()=>x,isError:()=>C,isFile:()=>be,isFiniteNumber:()=>D,isFunction:()=>B,isHtmlElementFocusable:()=>o,isInteger:()=>_,isLocalStorageReadable:()=>ge,isMap:()=>T,isNil:()=>y,isNilOrEmptyString:()=>ke,isNull:()=>g,isNumber:()=>S,isObject:()=>v,isPromise:()=>H,isRegExp:()=>E,isSet:()=>F,isString:()=>ie,isSymbol:()=>P,isUndefined:()=>w,isValidDate:()=>O,moveFocusWithinContainer:()=>c,noop:()=>$,not:()=>W,once:()=>Y,parse2DMatrix:()=>pe,parseFileName:()=>Xe,parseJson:()=>ne,pipe:()=>u,readFilesFromDataTransfer:()=>ve,reduceAsync:()=>G,resolveAxisDelta:()=>Ee,resolveBoundedDelta:()=>Ie,retry:()=>te,runParallel:()=>U,runSequential:()=>z,searchTree:()=>Ue,setDataTransferJson:()=>ae,someAsync:()=>q,splitMapJoin:()=>Ye,splitStringIntoWords:()=>je,timeout:()=>ee,toKebabCase:()=>Le,traverseFileSystemDirectory:()=>Ae,unique:()=>d});const n=e=>new Blob([e],{type:e.type}),r=e=>new DOMRect(e.offsetLeft,e.offsetTop,e.clientWidth,e.clientHeight),a=e=>"A"===e.tagName,l=e=>"true"===e.getAttribute("contenteditable"),i=["INPUT","SELECT","TEXTAREA","BUTTON","A"],o=e=>{if(!e)return!1;const t=window.getComputedStyle(e);if("hidden"===t.visibility||"none"===t.display)return!1;if("disabled"in e&&e.disabled)return!1;const n=e.getAttribute("tabindex");return"-1"!==n&&(i.includes(e.tagName)?!a(e)||""!==e.href:!!l(e)||null!==n)},s=e=>Array.from(e.querySelectorAll("*")).filter(o),c=(e,t=null,{wrap:n=!0,getNextIndex:r}={})=>{const a=document.activeElement,l=t??a?.parentElement;if(!a||!l)return;const i=s(l);if(0===i.length)return;const o=i.indexOf(a);if(-1===o)return;let c;r?c=r(o,e,i):"next"===e?(c=o+1,c>=i.length&&(c=n?0:null)):(c=o-1,c<0&&(c=n?i.length-1:null)),null!==c&&i[c]?.focus()},u=(...e)=>t=>e.reduce((e,t)=>t(e),t),f=(...e)=>t=>e.reduceRight((e,t)=>t(e),t),h=(e,t)=>e.filter(e=>!t.includes(e)),d=e=>[...new Set(e)],m=(...e)=>{if(0===e.length)return[];if(1===e.length)return[...e[0]];const[t,...n]=e;return d(t).filter(e=>n.every(t=>t.includes(e)))};function p(e,t){if(!e)throw new Error(t)}const g=e=>null===e,y=e=>null==e,b=e=>null!=e,w=e=>void 0===e,S=e=>"number"==typeof e,A=e=>"boolean"==typeof e,v=e=>"object"==typeof e,x=e=>v(e)&&!g(e)&&0===Object.keys(e).length,I=e=>e instanceof Date,M=e=>e instanceof Blob,C=e=>e instanceof Error,O=e=>I(e)&&!isNaN(e.getTime()),E=e=>e instanceof RegExp,T=e=>e instanceof Map,F=e=>e instanceof Set,P=e=>"symbol"==typeof e,D=e=>S(e)&&isFinite(e),_=e=>S(e)&&Number.isInteger(e),L=e=>D(e)&&!Number.isInteger(e),N=(e,t)=>(p(t>0,"Chunk size must be greater than 0"),Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))),R=e=>e.filter(Boolean),j=e=>Array.isArray(e),k=e=>j(e)&&0===e.length,X=(e,t,n)=>{if(!e?.length||!t)return{previousItem:null,currentItem:null,nextItem:null};const r=e.findIndex(e=>n(e,t));return-1===r?{previousItem:null,currentItem:null,nextItem:null}:{previousItem:r>0?e[r-1]:null,currentItem:e[r],nextItem:r<e.length-1?e[r+1]:null}},$=()=>{},B=e=>"function"==typeof e,W=e=>(...t)=>!e(...t),Y=e=>{let t,n=!1;return function(...r){return n||(n=!0,t=e.apply(this,r)),t}},H=e=>B(e?.then),z=async(e,t)=>{const n=[];for(let r=0;r<e.length;r++)n.push(await t(e[r],r,e));return n},U=async(e,t)=>Promise.all(e.map(t)),J=async(e,t)=>{const n=[];for(let r=0;r<e.length;r++){const a=e[r];await t(a,r,e)&&n.push(a)}return n},Z=async(e,t)=>{const n=await U(e,async(e,n,r)=>!!await t(e,n,r)&&e);return R(n)},q=async(e,t)=>{for(let n=0;n<e.length;n++)if(await t(e[n],n,e))return!0;return!1},V=async(e,t)=>{for(let n=0;n<e.length;n++)if(!await t(e[n],n,e))return!1;return!0},G=async(e,t,n)=>{let r=n;for(let n=0;n<e.length;n++)r=await t(r,e[n],n,e);return r},K=async(e,t)=>{for(let n=0;n<e.length;n++)if(await t(e[n],n,e))return e[n];return null},Q=e=>new Promise(t=>setTimeout(t,e)),ee=async(e,t,n="Operation timed out")=>{try{return await Promise.race([e,Q(t).then(()=>Promise.reject(new Error(n)))])}finally{}},te=(e,{maxAttempts:t=3,delayMs:n=300,backoff:r=!0,onRetry:a}={})=>async(...l)=>{let i;for(let o=1;o<=t;o++)try{return await e(...l)}catch(e){if(i=e,o<t){a?.(o,e);const t=r?n*2**(o-1):n;await Q(t)}}throw i},ne=e=>{try{return JSON.parse(e)}catch{return null}},re="application/json",ae=(e,t)=>{e.setData(re,JSON.stringify(t))},le=e=>{const t=e.getData(re);return t?ne(t):null},ie=e=>"string"==typeof e,oe=(e,{fileName:t,target:n}={})=>{if(w(document))return;const r=document.createElement("a");let a=null;try{const l=ie(e)?e:a=URL.createObjectURL(e);r.href=l,t&&(r.download=t),n&&(r.target=n),document.body.appendChild(r),r.click()}finally{r.remove(),a&&setTimeout(()=>{p(a,"Object URL should not be null"),URL.revokeObjectURL(a)},0)}},se=e=>e.scrollWidth>e.clientWidth,ce=e=>Math.max(0,e.scrollWidth-e.clientWidth),ue=e=>e.scrollHeight>e.clientHeight,fe=e=>Math.max(0,e.scrollHeight-e.clientHeight),he=({containerSize:e,elementOffset:t,elementSize:n})=>-(t+n/2-e/2),de=(e,t)=>t<=0?0:Math.max(-t,Math.min(e,0)),me=(e,t,{axis:n="both",shouldClamp:r=!0}={})=>{let a=0,l=0;if("x"===n||"both"===n){const n=he({containerSize:e.clientWidth,elementOffset:t.offsetLeft,elementSize:t.clientWidth});a=r?de(n,ce(e)):n}if("y"===n||"both"===n){const n=he({containerSize:e.clientHeight,elementOffset:t.offsetTop,elementSize:t.clientHeight});l=r?de(n,fe(e)):n}e.style.transform=`translate(${a}px, ${l}px)`},pe=e=>{const t=window.getComputedStyle(e).getPropertyValue("transform").match(/^matrix\((.+)\)$/);if(!t)return{translateX:0,translateY:0,scaleX:1,scaleY:1,skewX:0,skewY:0};const[n,r,a,l,i,o]=t[1].split(", ").map(parseFloat);return{translateX:i,translateY:o,scaleX:n,scaleY:l,skewX:a,skewY:r}},ge=()=>{if("undefined"==typeof window||!window.localStorage)return!1;try{return window.localStorage.getItem("__non_existing_key__"),!0}catch{return!1}},ye=()=>{if(!ge())return{readable:!1,writable:!1};try{const e="__test_write__";return window.localStorage.setItem(e,"1"),window.localStorage.removeItem(e),{readable:!0,writable:!0}}catch{}return{readable:!0,writable:!1}},be=e=>e instanceof File,we=e=>{if(!e)return[];const t=[];for(let n=0;n<e.length;n++)t.push(e[n]);return t},Se=(e,t)=>new File([e],t,{type:e.type}),Ae=async(e,{skipFiles:t=[".DS_Store","Thumbs.db","desktop.ini","ehthumbs.db",".Spotlight-V100",".Trashes",".fseventsd","__MACOSX"]}={})=>{const n=new Set(t),r=await(async e=>{const t=e.createReader(),n=async()=>new Promise((e,r)=>{t.readEntries(async t=>{if(t.length)try{const r=await n();e([...t,...r])}catch(e){r(e)}else e([])},r)});return n()})(e);return(await U(r,async e=>e.isDirectory?Ae(e,{skipFiles:t}):n.has(e.name)?[]:[await new Promise((t,n)=>{e.file(t,n)})])).flat()},ve=async(e,t={})=>{const n=e?.items;if(!n)return[];const r=[];for(let e=0;e<n.length;e++){const a=n[e];if("webkitGetAsEntry"in a){const e=a.webkitGetAsEntry?.();if(e?.isDirectory){r.push(Ae(e,t));continue}if(e?.isFile){r.push(new Promise((t,n)=>e.file(e=>t([e]),n)));continue}}const l=a.getAsFile();l&&r.push(Promise.resolve([l]))}return(await Promise.all(r)).flat()},xe=(e,...t)=>"function"==typeof e?e(...t):e,Ie=({delta:e,value:t,min:n,max:r})=>{if(0===e)return null;const a=t+e;return e<0?t<=n?null:Math.max(a,n):e>0?t>=r?null:Math.min(a,r):null},Me=({value:e,min:t,max:n,velocityPxMs:r,deltaTimeMs:a,friction:l=.002,minVelocityPxMs:i=.01,emaAlpha:o=.2})=>{if(Math.abs(r)<i)return null;const s=Ie({delta:r*a,value:e,min:t,max:n});if(null===s)return null;const c=r*Math.exp(-l*a),u=o>0?r*(1-o)+c*o:c;return Math.abs(u)<i?null:{value:s,velocityPxMs:u}},Ce=()=>`${Math.floor(1e3*performance.now()).toString(36)}${Math.random().toString(36).slice(2,10)}`,Oe=(e,t)=>Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left))*Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top))/(t.width*t.height),Ee=(e,t,{allowFallback:n=!0,invert:r=!0}={})=>{const a=r?-1:1;switch(t){case"x":return{deltaX:a*(0!==e.deltaX?e.deltaX:n?e.deltaY:0),deltaY:0};case"y":return{deltaX:0,deltaY:a*e.deltaY};default:return{deltaX:a*e.deltaX,deltaY:a*e.deltaY}}},Te=(e,t,n,r)=>{const a=n-e,l=r-t;return Math.hypot(a,l)},Fe=(e,t)=>Math.abs(e/t),Pe=(e,t)=>e*t/100,De=e=>{let t=5381;for(let n=0;n<e.length;n++)t=33*t^e.charCodeAt(n);return(t>>>0).toString(36)},_e=e=>Object.entries(e).reduce((e,[t,n])=>(void 0!==n&&(e[t]=n),e),{}),Le=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Ne=e=>{const t=e.charAt(0),n=e.slice(1);return t.toLowerCase()+n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)},Re=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),je=e=>0===e.length?[]:e.split(" ").filter(Boolean),ke=e=>""===e||y(e),Xe=e=>{const t=e.lastIndexOf(".");return t<=0||t===e.length-1?[e,""]:[e.slice(0,t),e.slice(t+1).toLowerCase()]},$e=(e,t)=>{if(0===e.length)return[];const n=t.charCodeAt(0),r=[];for(let t=0;t<e.length;t++)e.charCodeAt(t)===n&&r.push(t);return r},Be=(e,t,n)=>{if(0===e.length)return;const r=e.length;for(let a=0;a<r;a++){const l=e[a],i={charIndex:a,prevChar:a>0?e[a-1]:null,nextChar:a<r-1?e[a+1]:null};n?.(l,i)||t(l,i)}},We=(e,t=1/0)=>0===e.length?"":je(e).slice(0,t).map(e=>e[0]).join("").toUpperCase(),Ye=(e,t,n,r=t)=>e.split(t).map((e,t)=>n(e.trim(),t)).join(r),He=(e,t,n,r=[],a=void 0,l=0)=>(e?.forEach(e=>{const{[n]:i,...o}=e,s=e[n],c=Array.isArray(s);if(r.push({...o,parentId:a,depthLevel:l,childCount:c?s.length:0}),c){const a=e[t];He(s,t,n,r,a,l+1)}}),r),ze=(e,t,n)=>e.filter(e=>e.parentId===t&&(!n||n(e))),Ue=(e,t,n,r)=>{const a=je(r.toLowerCase());if(!a.length)return e;const l=e.reduce((e,n,r)=>(e[n[t]]=r,e),{});return e.reduce((r,i)=>{const o=i[n];if(!o)return r;if(r.some(e=>e[t]===i[t]))return r;const s=je(o.toLowerCase());if(a.every(e=>s.some(t=>t.startsWith(e))))if(w(i.parentId)){r.push(i);const n=a=>{a.childCount&&e.forEach(e=>{e.parentId===a[t]&&(r.push(e),n(e))})};n(i)}else{const t=n=>{const a=l[n.parentId],i=e[a];w(i.parentId)||t(i);const o=r.length?r[r.length-1].parentId:null;(g(o)||o!==n.parentId)&&(p(i,"[@react-hive/honey-utils]: Parent node was not found."),r.push(i))};t(i),r.push(i)}return r},[])},Je=(e,t)=>{p(t>=0&&t<=1,`[@react-hive/honey-utils]: Alpha "${t}" must be a number between 0 and 1.`);const n=e.match(/^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/);p(n,`[@react-hive/honey-utils]: Invalid hex format: ${e}`);const r=n[1];return`#${(3===r.length?r[0]+r[0]+r[1]+r[1]+r[2]+r[2]:r)+Math.round(255*t).toString(16).toUpperCase().padStart(2,"0")}`},Ze=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,qe=e=>{try{return Ze.test(e)?"undefined"!=typeof Buffer?Buffer.from(e,"base64").toString("utf-8"):decodeURIComponent(atob(e).split("").map(e=>`%${e.charCodeAt(0).toString(16).padStart(2,"0")}`).join("")):null}catch{return null}},Ve=e=>{const t=qe(e);return null===t?null:ne(t)};module.exports=t})();
|
|
1
|
+
(()=>{"use strict";const e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}};let t={};e.r(t),e.d(t,{DATA_TRANSFER_JSON_MIME:()=>le,FOCUSABLE_HTML_TAGS:()=>i,applyInertiaStep:()=>Ee,assert:()=>p,blobToFile:()=>ve,calculateCenterOffset:()=>pe,calculateEuclideanDistance:()=>Be,calculateMovingSpeed:()=>De,calculatePercentage:()=>Le,camelToDashCase:()=>ke,camelToWords:()=>Re,centerElementInContainer:()=>ye,chunk:()=>_,clamp:()=>_e,clampOffsetToOverflow:()=>ge,cloneBlob:()=>n,compact:()=>$,compose:()=>f,decodeBase64:()=>Qe,decodeBase64Json:()=>et,definedProps:()=>$e,delay:()=>te,difference:()=>h,downloadFile:()=>ce,encodeBase64:()=>tt,encodeBase64Json:()=>nt,everyAsync:()=>K,fileListToFiles:()=>xe,filterParallel:()=>q,filterSequential:()=>V,findAsync:()=>ee,findCharIndices:()=>We,flattenTree:()=>Ze,forEachChar:()=>Ye,generateEphemeralId:()=>Te,getAdjacentItems:()=>R,getDOMRectIntersectionRatio:()=>Fe,getDataTransferJson:()=>oe,getElementOffsetRect:()=>r,getFocusableHtmlElements:()=>s,getLocalStorageCapabilities:()=>Se,getTreeChildren:()=>Ve,getWordsInitials:()=>ze,getXOverflowWidth:()=>he,getYOverflowHeight:()=>me,hasXOverflow:()=>fe,hasYOverflow:()=>de,hashString:()=>Ne,hexWithAlpha:()=>Ge,intersection:()=>m,invokeIfFunction:()=>Oe,isAnchorHtmlElement:()=>a,isArray:()=>j,isBlob:()=>I,isBool:()=>A,isContentEditableHtmlElement:()=>l,isDate:()=>M,isDecimal:()=>L,isDefined:()=>w,isEmptyArray:()=>k,isEmptyObject:()=>v,isEnumValue:()=>N,isError:()=>O,isFile:()=>Ae,isFiniteNumber:()=>B,isFunction:()=>U,isHtmlElementFocusable:()=>o,isInteger:()=>D,isLocalStorageReadable:()=>be,isMap:()=>T,isNil:()=>y,isNilOrEmptyString:()=>He,isNull:()=>g,isNumber:()=>S,isObject:()=>x,isPromise:()=>z,isRegExp:()=>E,isSet:()=>F,isString:()=>se,isSymbol:()=>P,isUndefined:()=>b,isValidDate:()=>C,moveFocusWithinContainer:()=>c,noop:()=>H,not:()=>W,once:()=>Y,parse2DMatrix:()=>we,parseFileName:()=>Ue,parseJson:()=>ae,pipe:()=>u,readFilesFromDataTransfer:()=>Ie,reduceAsync:()=>Q,replaceHistorySearchParams:()=>ue,resolveAxisDelta:()=>Pe,resolveBoundedDelta:()=>Ce,retry:()=>re,runParallel:()=>Z,runSequential:()=>J,searchTree:()=>qe,setDataTransferJson:()=>ie,someAsync:()=>G,splitMapJoin:()=>Je,splitStringIntoWords:()=>Xe,timeout:()=>ne,toKebabCase:()=>je,toggleArrayItem:()=>X,traverseFileSystemDirectory:()=>Me,unique:()=>d});const n=e=>new Blob([e],{type:e.type}),r=e=>new DOMRect(e.offsetLeft,e.offsetTop,e.clientWidth,e.clientHeight),a=e=>"A"===e.tagName,l=e=>"true"===e.getAttribute("contenteditable"),i=["INPUT","SELECT","TEXTAREA","BUTTON","A"],o=e=>{if(!e)return!1;const t=window.getComputedStyle(e);if("hidden"===t.visibility||"none"===t.display)return!1;if("disabled"in e&&e.disabled)return!1;const n=e.getAttribute("tabindex");return"-1"!==n&&(i.includes(e.tagName)?!a(e)||""!==e.href:!!l(e)||null!==n)},s=e=>Array.from(e.querySelectorAll("*")).filter(o),c=(e,t=null,{wrap:n=!0,getNextIndex:r}={})=>{const a=document.activeElement,l=t??a?.parentElement;if(!a||!l)return;const i=s(l);if(0===i.length)return;const o=i.indexOf(a);if(-1===o)return;let c;r?c=r(o,e,i):"next"===e?(c=o+1,c>=i.length&&(c=n?0:null)):(c=o-1,c<0&&(c=n?i.length-1:null)),null!==c&&i[c]?.focus()},u=(...e)=>t=>e.reduce((e,t)=>t(e),t),f=(...e)=>t=>e.reduceRight((e,t)=>t(e),t),h=(e,t)=>e.filter(e=>!t.includes(e)),d=e=>[...new Set(e)],m=(...e)=>{if(0===e.length)return[];if(1===e.length)return[...e[0]];const[t,...n]=e;return d(t).filter(e=>n.every(t=>t.includes(e)))};function p(e,t){if(!e)throw new Error(t)}const g=e=>null===e,y=e=>null==e,w=e=>null!=e,b=e=>void 0===e,S=e=>"number"==typeof e,A=e=>"boolean"==typeof e,x=e=>"object"==typeof e,v=e=>x(e)&&!g(e)&&0===Object.keys(e).length,M=e=>e instanceof Date,I=e=>e instanceof Blob,O=e=>e instanceof Error,C=e=>M(e)&&!isNaN(e.getTime()),E=e=>e instanceof RegExp,T=e=>e instanceof Map,F=e=>e instanceof Set,P=e=>"symbol"==typeof e,B=e=>S(e)&&isFinite(e),D=e=>S(e)&&Number.isInteger(e),L=e=>B(e)&&!Number.isInteger(e),N=(e,t)=>Object.values(e).includes(t),_=(e,t)=>(p(t>0,"Chunk size must be greater than 0"),Array.from({length:Math.ceil(e.length/t)},(n,r)=>e.slice(r*t,(r+1)*t))),$=e=>e.filter(Boolean),j=e=>Array.isArray(e),k=e=>j(e)&&0===e.length,R=(e,t,n)=>{if(!e?.length||!t)return{previousItem:null,currentItem:null,nextItem:null};const r=e.findIndex(e=>n(e,t));return-1===r?{previousItem:null,currentItem:null,nextItem:null}:{previousItem:r>0?e[r-1]:null,currentItem:e[r],nextItem:r<e.length-1?e[r+1]:null}},X=(e,t,n)=>{const r=e.includes(t);return r===(n??!r)?e:r?h(e,[t]):[...e,t]},H=()=>{},U=e=>"function"==typeof e,W=e=>(...t)=>!e(...t),Y=e=>{let t,n=!1;return function(...r){return n||(n=!0,t=e.apply(this,r)),t}},z=e=>U(e?.then),J=async(e,t)=>{const n=[];for(let r=0;r<e.length;r++)n.push(await t(e[r],r,e));return n},Z=async(e,t)=>Promise.all(e.map(t)),V=async(e,t)=>{const n=[];for(let r=0;r<e.length;r++){const a=e[r];await t(a,r,e)&&n.push(a)}return n},q=async(e,t)=>{const n=await Z(e,async(e,n,r)=>!!await t(e,n,r)&&e);return $(n)},G=async(e,t)=>{for(let n=0;n<e.length;n++)if(await t(e[n],n,e))return!0;return!1},K=async(e,t)=>{for(let n=0;n<e.length;n++)if(!await t(e[n],n,e))return!1;return!0},Q=async(e,t,n)=>{let r=n;for(let n=0;n<e.length;n++)r=await t(r,e[n],n,e);return r},ee=async(e,t)=>{for(let n=0;n<e.length;n++)if(await t(e[n],n,e))return e[n];return null},te=e=>new Promise(t=>setTimeout(t,e)),ne=async(e,t,n="Operation timed out")=>{try{return await Promise.race([e,te(t).then(()=>Promise.reject(new Error(n)))])}finally{}},re=(e,{maxAttempts:t=3,delayMs:n=300,backoff:r=!0,onRetry:a}={})=>async(...l)=>{let i;for(let o=1;o<=t;o++)try{return await e(...l)}catch(e){if(i=e,o<t){a?.(o,e);const t=r?n*2**(o-1):n;await te(t)}}throw i},ae=e=>{try{return JSON.parse(e)}catch{return null}},le="application/json",ie=(e,t)=>{e.setData(le,JSON.stringify(t))},oe=e=>{const t=e.getData(le);return t?ae(t):null},se=e=>"string"==typeof e,ce=(e,{fileName:t,target:n}={})=>{if(b(document))return;const r=document.createElement("a");let a=null;try{const l=se(e)?e:a=URL.createObjectURL(e);r.href=l,t&&(r.download=t),n&&(r.target=n),document.body.appendChild(r),r.click()}finally{r.remove(),a&&setTimeout(()=>{p(a,"Object URL should not be null"),URL.revokeObjectURL(a)},0)}},ue=e=>{const t=e.toString();window.history.replaceState(window.history.state,"",`${window.location.pathname}${t?`?${t}`:""}${window.location.hash}`)},fe=e=>e.scrollWidth>e.clientWidth,he=e=>Math.max(0,e.scrollWidth-e.clientWidth),de=e=>e.scrollHeight>e.clientHeight,me=e=>Math.max(0,e.scrollHeight-e.clientHeight),pe=({containerSize:e,elementOffset:t,elementSize:n})=>-(t+n/2-e/2),ge=(e,t)=>t<=0?0:Math.max(-t,Math.min(e,0)),ye=(e,t,{axis:n="both",shouldClamp:r=!0}={})=>{let a=0,l=0;if("x"===n||"both"===n){const n=pe({containerSize:e.clientWidth,elementOffset:t.offsetLeft,elementSize:t.clientWidth});a=r?ge(n,he(e)):n}if("y"===n||"both"===n){const n=pe({containerSize:e.clientHeight,elementOffset:t.offsetTop,elementSize:t.clientHeight});l=r?ge(n,me(e)):n}e.style.transform=`translate(${a}px, ${l}px)`},we=e=>{const t=window.getComputedStyle(e).getPropertyValue("transform").match(/^matrix\((.+)\)$/);if(!t)return{translateX:0,translateY:0,scaleX:1,scaleY:1,skewX:0,skewY:0};const[n,r,a,l,i,o]=t[1].split(", ").map(parseFloat);return{translateX:i,translateY:o,scaleX:n,scaleY:l,skewX:a,skewY:r}},be=()=>{if("undefined"==typeof window||!window.localStorage)return!1;try{return window.localStorage.getItem("__non_existing_key__"),!0}catch{return!1}},Se=()=>{if(!be())return{readable:!1,writable:!1};try{const e="__test_write__";return window.localStorage.setItem(e,"1"),window.localStorage.removeItem(e),{readable:!0,writable:!0}}catch{}return{readable:!0,writable:!1}},Ae=e=>e instanceof File,xe=e=>{if(!e)return[];const t=[];for(let n=0;n<e.length;n++)t.push(e[n]);return t},ve=(e,t)=>new File([e],t,{type:e.type}),Me=async(e,{skipFiles:t=[".DS_Store","Thumbs.db","desktop.ini","ehthumbs.db",".Spotlight-V100",".Trashes",".fseventsd","__MACOSX"]}={})=>{const n=new Set(t),r=await(async e=>{const t=e.createReader(),n=async()=>new Promise((e,r)=>{t.readEntries(async t=>{if(t.length)try{const r=await n();e([...t,...r])}catch(e){r(e)}else e([])},r)});return n()})(e);return(await Z(r,async e=>e.isDirectory?Me(e,{skipFiles:t}):n.has(e.name)?[]:[await new Promise((t,n)=>{e.file(t,n)})])).flat()},Ie=async(e,t={})=>{const n=e?.items;if(!n)return[];const r=[];for(let e=0;e<n.length;e++){const a=n[e];if("webkitGetAsEntry"in a){const e=a.webkitGetAsEntry?.();if(e?.isDirectory){r.push(Me(e,t));continue}if(e?.isFile){r.push(new Promise((t,n)=>e.file(e=>t([e]),n)));continue}}const l=a.getAsFile();l&&r.push(Promise.resolve([l]))}return(await Promise.all(r)).flat()},Oe=(e,...t)=>"function"==typeof e?e(...t):e,Ce=({delta:e,value:t,min:n,max:r})=>{if(0===e)return null;const a=t+e;return e<0?t<=n?null:Math.max(a,n):e>0?t>=r?null:Math.min(a,r):null},Ee=({value:e,min:t,max:n,velocityPxMs:r,deltaTimeMs:a,friction:l=.002,minVelocityPxMs:i=.01,emaAlpha:o=.2})=>{if(Math.abs(r)<i)return null;const s=Ce({delta:r*a,value:e,min:t,max:n});if(null===s)return null;const c=r*Math.exp(-l*a),u=o>0?r*(1-o)+c*o:c;return Math.abs(u)<i?null:{value:s,velocityPxMs:u}},Te=()=>`${Math.floor(1e3*performance.now()).toString(36)}${Math.random().toString(36).slice(2,10)}`,Fe=(e,t)=>Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left))*Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top))/(t.width*t.height),Pe=(e,t,{allowFallback:n=!0,invert:r=!0}={})=>{const a=r?-1:1;switch(t){case"x":return{deltaX:a*(0!==e.deltaX?e.deltaX:n?e.deltaY:0),deltaY:0};case"y":return{deltaX:0,deltaY:a*e.deltaY};default:return{deltaX:a*e.deltaX,deltaY:a*e.deltaY}}},Be=(e,t,n,r)=>{const a=n-e,l=r-t;return Math.hypot(a,l)},De=(e,t)=>Math.abs(e/t),Le=(e,t)=>e*t/100,Ne=e=>{let t=5381;for(let n=0;n<e.length;n++)t=33*t^e.charCodeAt(n);return(t>>>0).toString(36)},_e=(e,t,n)=>Math.min(Math.max(e,t),n),$e=e=>Object.entries(e).reduce((e,[t,n])=>(void 0!==n&&(e[t]=n),e),{}),je=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),ke=e=>{const t=e.charAt(0),n=e.slice(1);return t.toLowerCase()+n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)},Re=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1 $2"),Xe=e=>0===e.length?[]:e.split(" ").filter(Boolean),He=e=>""===e||y(e),Ue=e=>{const t=e.lastIndexOf(".");return t<=0||t===e.length-1?[e,""]:[e.slice(0,t),e.slice(t+1).toLowerCase()]},We=(e,t)=>{if(0===e.length)return[];const n=t.charCodeAt(0),r=[];for(let t=0;t<e.length;t++)e.charCodeAt(t)===n&&r.push(t);return r},Ye=(e,t,n)=>{if(0===e.length)return;const r=e.length;for(let a=0;a<r;a++){const l=e[a],i={charIndex:a,prevChar:a>0?e[a-1]:null,nextChar:a<r-1?e[a+1]:null};n?.(l,i)||t(l,i)}},ze=(e,t=1/0)=>0===e.length?"":Xe(e).slice(0,t).map(e=>e[0]).join("").toUpperCase(),Je=(e,t,n,r=t)=>e.split(t).map((e,t)=>n(e.trim(),t)).join(r),Ze=(e,t,n,r=[],a=void 0,l=0)=>(e?.forEach(e=>{const{[n]:i,...o}=e,s=e[n],c=Array.isArray(s);if(r.push({...o,parentId:a,depthLevel:l,childCount:c?s.length:0}),c){const a=e[t];Ze(s,t,n,r,a,l+1)}}),r),Ve=(e,t,n)=>e.filter(e=>e.parentId===t&&(!n||n(e))),qe=(e,t,n,r)=>{const a=Xe(r.toLowerCase());if(!a.length)return e;const l=e.reduce((e,n,r)=>(e[n[t]]=r,e),{});return e.reduce((r,i)=>{const o=i[n];if(!o)return r;if(r.some(e=>e[t]===i[t]))return r;const s=Xe(o.toLowerCase());if(a.every(e=>s.some(t=>t.startsWith(e))))if(b(i.parentId)){r.push(i);const n=a=>{a.childCount&&e.forEach(e=>{e.parentId===a[t]&&(r.push(e),n(e))})};n(i)}else{const t=n=>{const a=l[n.parentId],i=e[a];b(i.parentId)||t(i);const o=r.length?r[r.length-1].parentId:null;(g(o)||o!==n.parentId)&&(p(i,"[@react-hive/honey-utils]: Parent node was not found."),r.push(i))};t(i),r.push(i)}return r},[])},Ge=(e,t)=>{p(t>=0&&t<=1,`[@react-hive/honey-utils]: Alpha "${t}" must be a number between 0 and 1.`);const n=e.match(/^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/);p(n,`[@react-hive/honey-utils]: Invalid hex format: ${e}`);const r=n[1];return`#${(3===r.length?r[0]+r[0]+r[1]+r[1]+r[2]+r[2]:r)+Math.round(255*t).toString(16).toUpperCase().padStart(2,"0")}`},Ke=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Qe=e=>{if(!Ke.test(e))return null;try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode((e=>{if("function"==typeof Uint8Array.fromBase64)return Uint8Array.fromBase64(e);if("undefined"!=typeof Buffer)return Buffer.from(e,"base64");const t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n})(e))}catch{return null}},et=e=>{const t=Qe(e);return null===t?null:ae(t)},tt=e=>(e=>{if("function"==typeof e.toBase64)return e.toBase64();if("undefined"!=typeof Buffer)return Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString("base64");let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return btoa(t)})((new TextEncoder).encode(e)),nt=e=>tt(JSON.stringify(e));module.exports=t})();
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|