@fluixi/utils 1.0.0-alpha.100
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/LICENSE +21 -0
- package/README.md +68 -0
- package/dist/index.cjs +2858 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +2838 -0
- package/dist/lib/array/advanced.cjs +2227 -0
- package/dist/lib/array/advanced.d.ts +1116 -0
- package/dist/lib/array/advanced.d.ts.map +1 -0
- package/dist/lib/array/advanced.js +2429 -0
- package/dist/lib/array/advanced.mjs +2204 -0
- package/dist/lib/array/array.cjs +57 -0
- package/dist/lib/array/array.d.ts +6 -0
- package/dist/lib/array/array.d.ts.map +1 -0
- package/dist/lib/array/array.js +31 -0
- package/dist/lib/array/array.mjs +36 -0
- package/dist/lib/array/index.cjs +2344 -0
- package/dist/lib/array/index.d.ts +4 -0
- package/dist/lib/array/index.d.ts.map +1 -0
- package/dist/lib/array/index.js +3 -0
- package/dist/lib/array/index.mjs +2322 -0
- package/dist/lib/array/utils.cjs +103 -0
- package/dist/lib/array/utils.d.ts +100 -0
- package/dist/lib/array/utils.d.ts.map +1 -0
- package/dist/lib/array/utils.js +165 -0
- package/dist/lib/array/utils.mjs +82 -0
- package/dist/lib/color/color.cjs +2190 -0
- package/dist/lib/color/color.d.ts +366 -0
- package/dist/lib/color/color.d.ts.map +1 -0
- package/dist/lib/color/color.js +722 -0
- package/dist/lib/color/color.mjs +2167 -0
- package/dist/lib/color/constants.cjs +380 -0
- package/dist/lib/color/constants.d.ts +361 -0
- package/dist/lib/color/constants.d.ts.map +1 -0
- package/dist/lib/color/constants.js +358 -0
- package/dist/lib/color/constants.mjs +359 -0
- package/dist/lib/color/conversions.cjs +629 -0
- package/dist/lib/color/conversions.d.ts +166 -0
- package/dist/lib/color/conversions.d.ts.map +1 -0
- package/dist/lib/color/conversions.js +766 -0
- package/dist/lib/color/conversions.mjs +608 -0
- package/dist/lib/color/helpers.cjs +2534 -0
- package/dist/lib/color/helpers.d.ts +75 -0
- package/dist/lib/color/helpers.d.ts.map +1 -0
- package/dist/lib/color/helpers.js +419 -0
- package/dist/lib/color/helpers.mjs +2511 -0
- package/dist/lib/color/index.cjs +2641 -0
- package/dist/lib/color/index.d.ts +12 -0
- package/dist/lib/color/index.d.ts.map +1 -0
- package/dist/lib/color/index.js +15 -0
- package/dist/lib/color/index.mjs +2619 -0
- package/dist/lib/color/types.cjs +18 -0
- package/dist/lib/color/types.d.ts +179 -0
- package/dist/lib/color/types.d.ts.map +1 -0
- package/dist/lib/color/types.js +1 -0
- package/dist/lib/color/types.mjs +0 -0
- package/dist/lib/color/utils.cjs +962 -0
- package/dist/lib/color/utils.d.ts +199 -0
- package/dist/lib/color/utils.d.ts.map +1 -0
- package/dist/lib/color/utils.js +858 -0
- package/dist/lib/color/utils.mjs +939 -0
- package/dist/lib/compare/comparators.cjs +171 -0
- package/dist/lib/compare/comparators.d.ts +65 -0
- package/dist/lib/compare/comparators.d.ts.map +1 -0
- package/dist/lib/compare/comparators.js +210 -0
- package/dist/lib/compare/comparators.mjs +150 -0
- package/dist/lib/compare/index.cjs +172 -0
- package/dist/lib/compare/index.d.ts +2 -0
- package/dist/lib/compare/index.d.ts.map +1 -0
- package/dist/lib/compare/index.js +1 -0
- package/dist/lib/compare/index.mjs +152 -0
- package/dist/lib/cookie/codec.cjs +72 -0
- package/dist/lib/cookie/codec.d.ts +22 -0
- package/dist/lib/cookie/codec.d.ts.map +1 -0
- package/dist/lib/cookie/codec.js +67 -0
- package/dist/lib/cookie/codec.mjs +51 -0
- package/dist/lib/cookie/index.cjs +75 -0
- package/dist/lib/cookie/index.d.ts +2 -0
- package/dist/lib/cookie/index.d.ts.map +1 -0
- package/dist/lib/cookie/index.js +1 -0
- package/dist/lib/cookie/index.mjs +53 -0
- package/dist/lib/crypto/hash.cjs +83 -0
- package/dist/lib/crypto/hash.d.ts +6 -0
- package/dist/lib/crypto/hash.d.ts.map +1 -0
- package/dist/lib/crypto/hash.js +53 -0
- package/dist/lib/crypto/hash.mjs +62 -0
- package/dist/lib/crypto/index.cjs +85 -0
- package/dist/lib/crypto/index.d.ts +2 -0
- package/dist/lib/crypto/index.d.ts.map +1 -0
- package/dist/lib/crypto/index.js +1 -0
- package/dist/lib/crypto/index.mjs +62 -0
- package/dist/lib/dom/events.cjs +40 -0
- package/dist/lib/dom/events.d.ts +159 -0
- package/dist/lib/dom/events.d.ts.map +1 -0
- package/dist/lib/dom/events.js +50 -0
- package/dist/lib/dom/events.mjs +19 -0
- package/dist/lib/dom/index.cjs +78 -0
- package/dist/lib/dom/index.d.ts +3 -0
- package/dist/lib/dom/index.d.ts.map +1 -0
- package/dist/lib/dom/index.js +2 -0
- package/dist/lib/dom/index.mjs +56 -0
- package/dist/lib/dom/utils.cjs +57 -0
- package/dist/lib/dom/utils.d.ts +6 -0
- package/dist/lib/dom/utils.d.ts.map +1 -0
- package/dist/lib/dom/utils.js +37 -0
- package/dist/lib/dom/utils.mjs +36 -0
- package/dist/lib/functions/functions.cjs +366 -0
- package/dist/lib/functions/functions.d.ts +329 -0
- package/dist/lib/functions/functions.d.ts.map +1 -0
- package/dist/lib/functions/functions.js +585 -0
- package/dist/lib/functions/functions.mjs +345 -0
- package/dist/lib/functions/index.cjs +369 -0
- package/dist/lib/functions/index.d.ts +3 -0
- package/dist/lib/functions/index.d.ts.map +1 -0
- package/dist/lib/functions/index.js +1 -0
- package/dist/lib/functions/index.mjs +347 -0
- package/dist/lib/functions/types.cjs +18 -0
- package/dist/lib/functions/types.d.ts +2 -0
- package/dist/lib/functions/types.d.ts.map +1 -0
- package/dist/lib/functions/types.js +1 -0
- package/dist/lib/functions/types.mjs +0 -0
- package/dist/lib/helpers.cjs +78 -0
- package/dist/lib/helpers.d.ts +13 -0
- package/dist/lib/helpers.d.ts.map +1 -0
- package/dist/lib/helpers.js +66 -0
- package/dist/lib/helpers.mjs +59 -0
- package/dist/lib/index.cjs +2857 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +8 -0
- package/dist/lib/index.mjs +2836 -0
- package/dist/lib/maths/constants.cjs +70 -0
- package/dist/lib/maths/constants.d.ts +84 -0
- package/dist/lib/maths/constants.d.ts.map +1 -0
- package/dist/lib/maths/constants.js +79 -0
- package/dist/lib/maths/constants.mjs +50 -0
- package/dist/lib/maths/fn/advanced.cjs +231 -0
- package/dist/lib/maths/fn/advanced.d.ts +149 -0
- package/dist/lib/maths/fn/advanced.d.ts.map +1 -0
- package/dist/lib/maths/fn/advanced.js +264 -0
- package/dist/lib/maths/fn/advanced.mjs +208 -0
- package/dist/lib/maths/fn/basic.cjs +212 -0
- package/dist/lib/maths/fn/basic.d.ts +182 -0
- package/dist/lib/maths/fn/basic.d.ts.map +1 -0
- package/dist/lib/maths/fn/basic.js +343 -0
- package/dist/lib/maths/fn/basic.mjs +191 -0
- package/dist/lib/maths/fn/complex.cjs +268 -0
- package/dist/lib/maths/fn/complex.d.ts +153 -0
- package/dist/lib/maths/fn/complex.d.ts.map +1 -0
- package/dist/lib/maths/fn/complex.js +383 -0
- package/dist/lib/maths/fn/complex.mjs +247 -0
- package/dist/lib/maths/fn/index.cjs +877 -0
- package/dist/lib/maths/fn/index.d.ts +10 -0
- package/dist/lib/maths/fn/index.d.ts.map +1 -0
- package/dist/lib/maths/fn/index.js +9 -0
- package/dist/lib/maths/fn/index.mjs +855 -0
- package/dist/lib/maths/fn/trigo.cjs +179 -0
- package/dist/lib/maths/fn/trigo.d.ts +147 -0
- package/dist/lib/maths/fn/trigo.d.ts.map +1 -0
- package/dist/lib/maths/fn/trigo.js +227 -0
- package/dist/lib/maths/fn/trigo.mjs +156 -0
- package/dist/lib/maths/fn/vector.cjs +728 -0
- package/dist/lib/maths/fn/vector.d.ts +512 -0
- package/dist/lib/maths/fn/vector.d.ts.map +1 -0
- package/dist/lib/maths/fn/vector.js +1136 -0
- package/dist/lib/maths/fn/vector.mjs +707 -0
- package/dist/lib/maths/formatter.cjs +61 -0
- package/dist/lib/maths/formatter.d.ts +35 -0
- package/dist/lib/maths/formatter.d.ts.map +1 -0
- package/dist/lib/maths/formatter.js +56 -0
- package/dist/lib/maths/formatter.mjs +40 -0
- package/dist/lib/maths/guards.cjs +164 -0
- package/dist/lib/maths/guards.d.ts +166 -0
- package/dist/lib/maths/guards.d.ts.map +1 -0
- package/dist/lib/maths/guards.js +315 -0
- package/dist/lib/maths/guards.mjs +144 -0
- package/dist/lib/maths/index.cjs +1152 -0
- package/dist/lib/maths/index.d.ts +24 -0
- package/dist/lib/maths/index.d.ts.map +1 -0
- package/dist/lib/maths/index.js +29 -0
- package/dist/lib/maths/index.mjs +1130 -0
- package/dist/lib/maths/parser.cjs +75 -0
- package/dist/lib/maths/parser.d.ts +20 -0
- package/dist/lib/maths/parser.d.ts.map +1 -0
- package/dist/lib/maths/parser.js +78 -0
- package/dist/lib/maths/parser.mjs +54 -0
- package/dist/lib/maths/random.cjs +49 -0
- package/dist/lib/maths/random.d.ts +27 -0
- package/dist/lib/maths/random.d.ts.map +1 -0
- package/dist/lib/maths/random.js +49 -0
- package/dist/lib/maths/random.mjs +28 -0
- package/dist/lib/maths/types/advanced.cjs +18 -0
- package/dist/lib/maths/types/advanced.d.ts +357 -0
- package/dist/lib/maths/types/advanced.d.ts.map +1 -0
- package/dist/lib/maths/types/advanced.js +5 -0
- package/dist/lib/maths/types/advanced.mjs +0 -0
- package/dist/lib/maths/types/basic.cjs +18 -0
- package/dist/lib/maths/types/basic.d.ts +95 -0
- package/dist/lib/maths/types/basic.d.ts.map +1 -0
- package/dist/lib/maths/types/basic.js +5 -0
- package/dist/lib/maths/types/basic.mjs +0 -0
- package/dist/lib/maths/types/index.cjs +19 -0
- package/dist/lib/maths/types/index.d.ts +4 -0
- package/dist/lib/maths/types/index.d.ts.map +1 -0
- package/dist/lib/maths/types/index.js +3 -0
- package/dist/lib/maths/types/index.mjs +1 -0
- package/dist/lib/maths/types/negative.cjs +18 -0
- package/dist/lib/maths/types/negative.d.ts +51 -0
- package/dist/lib/maths/types/negative.d.ts.map +1 -0
- package/dist/lib/maths/types/negative.js +5 -0
- package/dist/lib/maths/types/negative.mjs +0 -0
- package/dist/lib/maths/types/operations.cjs +18 -0
- package/dist/lib/maths/types/operations.d.ts +188 -0
- package/dist/lib/maths/types/operations.d.ts.map +1 -0
- package/dist/lib/maths/types/operations.js +6 -0
- package/dist/lib/maths/types/operations.mjs +0 -0
- package/dist/lib/object/clone.cjs +88 -0
- package/dist/lib/object/clone.d.ts +46 -0
- package/dist/lib/object/clone.d.ts.map +1 -0
- package/dist/lib/object/clone.js +104 -0
- package/dist/lib/object/clone.mjs +65 -0
- package/dist/lib/object/diff.cjs +573 -0
- package/dist/lib/object/diff.d.ts +203 -0
- package/dist/lib/object/diff.d.ts.map +1 -0
- package/dist/lib/object/diff.js +805 -0
- package/dist/lib/object/diff.mjs +550 -0
- package/dist/lib/object/getter-setter.cjs +2351 -0
- package/dist/lib/object/getter-setter.d.ts +361 -0
- package/dist/lib/object/getter-setter.d.ts.map +1 -0
- package/dist/lib/object/getter-setter.js +1771 -0
- package/dist/lib/object/getter-setter.mjs +2330 -0
- package/dist/lib/object/index.cjs +3956 -0
- package/dist/lib/object/index.d.ts +13 -0
- package/dist/lib/object/index.d.ts.map +1 -0
- package/dist/lib/object/index.js +12 -0
- package/dist/lib/object/index.mjs +3936 -0
- package/dist/lib/object/merge.cjs +1029 -0
- package/dist/lib/object/merge.d.ts +93 -0
- package/dist/lib/object/merge.d.ts.map +1 -0
- package/dist/lib/object/merge.js +474 -0
- package/dist/lib/object/merge.mjs +1006 -0
- package/dist/lib/object/object.cjs +280 -0
- package/dist/lib/object/object.d.ts +128 -0
- package/dist/lib/object/object.d.ts.map +1 -0
- package/dist/lib/object/object.js +432 -0
- package/dist/lib/object/object.mjs +257 -0
- package/dist/lib/object/omit.cjs +2022 -0
- package/dist/lib/object/omit.d.ts +351 -0
- package/dist/lib/object/omit.d.ts.map +1 -0
- package/dist/lib/object/omit.js +656 -0
- package/dist/lib/object/omit.mjs +1999 -0
- package/dist/lib/object/reconcile.cjs +126 -0
- package/dist/lib/object/reconcile.d.ts +7 -0
- package/dist/lib/object/reconcile.d.ts.map +1 -0
- package/dist/lib/object/reconcile.js +122 -0
- package/dist/lib/object/reconcile.mjs +105 -0
- package/dist/lib/object/selector.cjs +303 -0
- package/dist/lib/object/selector.d.ts +50 -0
- package/dist/lib/object/selector.d.ts.map +1 -0
- package/dist/lib/object/selector.js +371 -0
- package/dist/lib/object/selector.mjs +282 -0
- package/dist/lib/object/sort.cjs +209 -0
- package/dist/lib/object/sort.d.ts +149 -0
- package/dist/lib/object/sort.d.ts.map +1 -0
- package/dist/lib/object/sort.js +298 -0
- package/dist/lib/object/sort.mjs +186 -0
- package/dist/lib/object/transform.cjs +2211 -0
- package/dist/lib/object/transform.d.ts +620 -0
- package/dist/lib/object/transform.d.ts.map +1 -0
- package/dist/lib/object/transform.js +1058 -0
- package/dist/lib/object/transform.mjs +2190 -0
- package/dist/lib/object/types.cjs +18 -0
- package/dist/lib/object/types.d.ts +250 -0
- package/dist/lib/object/types.d.ts.map +1 -0
- package/dist/lib/object/types.js +1 -0
- package/dist/lib/object/types.mjs +0 -0
- package/dist/lib/object/utils.cjs +326 -0
- package/dist/lib/object/utils.d.ts +165 -0
- package/dist/lib/object/utils.d.ts.map +1 -0
- package/dist/lib/object/utils.js +444 -0
- package/dist/lib/object/utils.mjs +305 -0
- package/dist/lib/primitive/boolean/boolean.cjs +407 -0
- package/dist/lib/primitive/boolean/boolean.d.ts +276 -0
- package/dist/lib/primitive/boolean/boolean.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/boolean.js +615 -0
- package/dist/lib/primitive/boolean/boolean.mjs +386 -0
- package/dist/lib/primitive/boolean/index.cjs +382 -0
- package/dist/lib/primitive/boolean/index.d.ts +3 -0
- package/dist/lib/primitive/boolean/index.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/index.js +2 -0
- package/dist/lib/primitive/boolean/index.mjs +359 -0
- package/dist/lib/primitive/boolean/types.cjs +18 -0
- package/dist/lib/primitive/boolean/types.d.ts +14 -0
- package/dist/lib/primitive/boolean/types.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/types.js +1 -0
- package/dist/lib/primitive/boolean/types.mjs +0 -0
- package/dist/lib/primitive/date/date.cjs +1126 -0
- package/dist/lib/primitive/date/date.d.ts +641 -0
- package/dist/lib/primitive/date/date.d.ts.map +1 -0
- package/dist/lib/primitive/date/date.js +1998 -0
- package/dist/lib/primitive/date/date.mjs +1105 -0
- package/dist/lib/primitive/date/index.cjs +1128 -0
- package/dist/lib/primitive/date/index.d.ts +3 -0
- package/dist/lib/primitive/date/index.d.ts.map +1 -0
- package/dist/lib/primitive/date/index.js +2 -0
- package/dist/lib/primitive/date/index.mjs +1105 -0
- package/dist/lib/primitive/date/types.cjs +18 -0
- package/dist/lib/primitive/date/types.d.ts +205 -0
- package/dist/lib/primitive/date/types.d.ts.map +1 -0
- package/dist/lib/primitive/date/types.js +7 -0
- package/dist/lib/primitive/date/types.mjs +0 -0
- package/dist/lib/primitive/index.cjs +2338 -0
- package/dist/lib/primitive/index.d.ts +5 -0
- package/dist/lib/primitive/index.d.ts.map +1 -0
- package/dist/lib/primitive/index.js +4 -0
- package/dist/lib/primitive/index.mjs +2316 -0
- package/dist/lib/primitive/string/index.cjs +875 -0
- package/dist/lib/primitive/string/index.d.ts +3 -0
- package/dist/lib/primitive/string/index.d.ts.map +1 -0
- package/dist/lib/primitive/string/index.js +2 -0
- package/dist/lib/primitive/string/index.mjs +852 -0
- package/dist/lib/primitive/string/parser-2.cjs +543 -0
- package/dist/lib/primitive/string/parser-2.d.ts +17 -0
- package/dist/lib/primitive/string/parser-2.d.ts.map +1 -0
- package/dist/lib/primitive/string/parser-2.js +656 -0
- package/dist/lib/primitive/string/parser-2.mjs +522 -0
- package/dist/lib/primitive/string/parser.cjs +236 -0
- package/dist/lib/primitive/string/parser.d.ts +9 -0
- package/dist/lib/primitive/string/parser.d.ts.map +1 -0
- package/dist/lib/primitive/string/parser.js +775 -0
- package/dist/lib/primitive/string/parser.mjs +215 -0
- package/dist/lib/primitive/string/string.cjs +926 -0
- package/dist/lib/primitive/string/string.d.ts +535 -0
- package/dist/lib/primitive/string/string.d.ts.map +1 -0
- package/dist/lib/primitive/string/string.js +1301 -0
- package/dist/lib/primitive/string/string.mjs +903 -0
- package/dist/lib/primitive/string/types.cjs +18 -0
- package/dist/lib/primitive/string/types.d.ts +318 -0
- package/dist/lib/primitive/string/types.d.ts.map +1 -0
- package/dist/lib/primitive/string/types.js +5 -0
- package/dist/lib/primitive/string/types.mjs +0 -0
- package/dist/lib/primitive/types.cjs +18 -0
- package/dist/lib/primitive/types.d.ts +27 -0
- package/dist/lib/primitive/types.d.ts.map +1 -0
- package/dist/lib/primitive/types.js +1 -0
- package/dist/lib/primitive/types.mjs +0 -0
- package/dist/lib/url/index.cjs +327 -0
- package/dist/lib/url/index.d.ts +3 -0
- package/dist/lib/url/index.d.ts.map +1 -0
- package/dist/lib/url/index.js +2 -0
- package/dist/lib/url/index.mjs +304 -0
- package/dist/lib/url/parser.cjs +325 -0
- package/dist/lib/url/parser.d.ts +216 -0
- package/dist/lib/url/parser.d.ts.map +1 -0
- package/dist/lib/url/parser.js +488 -0
- package/dist/lib/url/parser.mjs +304 -0
- package/dist/lib/url/types.cjs +18 -0
- package/dist/lib/url/types.d.ts +18 -0
- package/dist/lib/url/types.d.ts.map +1 -0
- package/dist/lib/url/types.js +1 -0
- package/dist/lib/url/types.mjs +0 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +127 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import { isObject } from './utils.js';
|
|
2
|
+
import { deepClone } from './clone.js';
|
|
3
|
+
/**
|
|
4
|
+
* Inverts an object (swaps keys and values)
|
|
5
|
+
* @param obj - Source object
|
|
6
|
+
* @returns Inverted object
|
|
7
|
+
* @example
|
|
8
|
+
* invert({a: 1, b: 2}) // {1: 'a', 2: 'b'}
|
|
9
|
+
*/
|
|
10
|
+
export const invert = (obj, deep = false) => {
|
|
11
|
+
if (Array.isArray(obj)) {
|
|
12
|
+
return obj.map((item) => invert(item, deep));
|
|
13
|
+
}
|
|
14
|
+
if (!isObject(obj)) {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
const result = {};
|
|
18
|
+
for (const key in obj) {
|
|
19
|
+
let value = obj[key];
|
|
20
|
+
// Only invert if value can be used as a key
|
|
21
|
+
if (typeof value === 'string' ||
|
|
22
|
+
typeof value === 'number' ||
|
|
23
|
+
typeof value === 'symbol') {
|
|
24
|
+
result[value] = key;
|
|
25
|
+
}
|
|
26
|
+
else if (isObject(value)) {
|
|
27
|
+
if (deep) {
|
|
28
|
+
result[key] = invert(value, deep);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (Array.isArray(value)) {
|
|
32
|
+
if (deep) {
|
|
33
|
+
result[key] = value.map((item) => invert(item, deep));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Maps object values using a callback function
|
|
41
|
+
* @param obj - Source object
|
|
42
|
+
* @param callback - Mapping function
|
|
43
|
+
* @returns New object with mapped values
|
|
44
|
+
* @example
|
|
45
|
+
* mapValues({a: 1, b: 2}, (value) => value * 2) // {a: 2, b: 4}
|
|
46
|
+
*/
|
|
47
|
+
// export const mapValues = <T extends AnyObject, U>(
|
|
48
|
+
// obj: T,
|
|
49
|
+
// callback: (value: T[keyof T], key: keyof T) => U
|
|
50
|
+
// ): Record<keyof T, U> => {
|
|
51
|
+
// if (Array.isArray(obj)) {
|
|
52
|
+
// return (obj as any).map(callback);
|
|
53
|
+
// }
|
|
54
|
+
// if (!isObject(obj)) {
|
|
55
|
+
// return {} as Record<keyof T, U>;
|
|
56
|
+
// }
|
|
57
|
+
// const result: Partial<Record<keyof T, U>> = {};
|
|
58
|
+
// for (const key in obj) {
|
|
59
|
+
// result[key] = callback(obj[key], key as any);
|
|
60
|
+
// }
|
|
61
|
+
// return result as Record<keyof T, U>;
|
|
62
|
+
// };
|
|
63
|
+
/**
|
|
64
|
+
* Maps object keys using a callback function
|
|
65
|
+
* @param obj - Source object
|
|
66
|
+
* @param callback - Mapping function
|
|
67
|
+
* @returns New object with mapped keys
|
|
68
|
+
* @example
|
|
69
|
+
* mapKeys({a: 1, b: 2}, (key) => key.toUpperCase()) // {A: 1, B: 2}
|
|
70
|
+
*/
|
|
71
|
+
// export const mapKeys = <T extends AnyObject>(
|
|
72
|
+
// obj: T,
|
|
73
|
+
// callback: (key: keyof T, value: T[keyof T]) => string
|
|
74
|
+
// ): AnyObject => {
|
|
75
|
+
// if (Array.isArray(obj)) {
|
|
76
|
+
// return (obj as any).map(callback);
|
|
77
|
+
// }
|
|
78
|
+
// if (!isObject(obj)) {
|
|
79
|
+
// return {};
|
|
80
|
+
// }
|
|
81
|
+
// const result: AnyObject = {};
|
|
82
|
+
// for (const key in obj) {
|
|
83
|
+
// const newKey = callback(key as any, obj[key]);
|
|
84
|
+
// result[newKey] = obj[key];
|
|
85
|
+
// }
|
|
86
|
+
// return result;
|
|
87
|
+
// };
|
|
88
|
+
/**
|
|
89
|
+
* Filters object properties using a predicate
|
|
90
|
+
* @param obj - Source object
|
|
91
|
+
* @param predicate - Filter function
|
|
92
|
+
* @returns New object with filtered properties
|
|
93
|
+
* @example
|
|
94
|
+
* filter({a: 1, b: 2, c: 3}, (value) => value > 1) // {b: 2, c: 3}
|
|
95
|
+
*/
|
|
96
|
+
export const filter = (obj, predicate) => {
|
|
97
|
+
if (Array.isArray(obj)) {
|
|
98
|
+
return obj.filter(predicate);
|
|
99
|
+
}
|
|
100
|
+
if (!isObject(obj)) {
|
|
101
|
+
return {};
|
|
102
|
+
}
|
|
103
|
+
const result = {};
|
|
104
|
+
for (const key in obj) {
|
|
105
|
+
if (predicate(obj[key], key)) {
|
|
106
|
+
result[key] = obj[key];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Flattens a nested object
|
|
113
|
+
* @param obj - Source object
|
|
114
|
+
* @param separator - Separator for nested keys (default: '.')
|
|
115
|
+
* @returns Flattened object
|
|
116
|
+
* @example
|
|
117
|
+
* flatten({a: {b: {c: 1}}, d: 2}) // {'a.b.c': 1, d: 2}
|
|
118
|
+
*/
|
|
119
|
+
// export const flatten = (obj: AnyObject, separator: string = '.'): AnyObject => {
|
|
120
|
+
// if (Array.isArray(obj)) {
|
|
121
|
+
// return obj.map((item) => flatten(item, separator));
|
|
122
|
+
// // return obj.reduce((acc, item) => {
|
|
123
|
+
// // return {
|
|
124
|
+
// // ...acc,
|
|
125
|
+
// // ...flatten(item, separator),
|
|
126
|
+
// // };
|
|
127
|
+
// // }, {});
|
|
128
|
+
// }
|
|
129
|
+
// const result: AnyObject = {};
|
|
130
|
+
// const flattenRecursive = (current: any, path: string = '') => {
|
|
131
|
+
// if (!isObject(current) && !Array.isArray(current)) {
|
|
132
|
+
// if (path) {
|
|
133
|
+
// result[path] = current;
|
|
134
|
+
// }
|
|
135
|
+
// return;
|
|
136
|
+
// }
|
|
137
|
+
// if (Array.isArray(current)) {
|
|
138
|
+
// for (let i = 0; i < current.length; i++) {
|
|
139
|
+
// const newPath = path ? `${path}[${i}]` : `[${i}]`;
|
|
140
|
+
// flattenRecursive(current[i], newPath);
|
|
141
|
+
// }
|
|
142
|
+
// } else {
|
|
143
|
+
// for (const key in current) {
|
|
144
|
+
// const newPath = path ? `${path}${separator}${key}` : key;
|
|
145
|
+
// flattenRecursive(current[key], newPath);
|
|
146
|
+
// }
|
|
147
|
+
// // Handle symbols
|
|
148
|
+
// const symbols = Object.getOwnPropertySymbols(current);
|
|
149
|
+
// for (const symbol of symbols) {
|
|
150
|
+
// const newPath = path
|
|
151
|
+
// ? `${path}${separator}${symbol.toString()}`
|
|
152
|
+
// : symbol.toString();
|
|
153
|
+
// flattenRecursive(current[symbol], newPath);
|
|
154
|
+
// }
|
|
155
|
+
// }
|
|
156
|
+
// };
|
|
157
|
+
// flattenRecursive(obj);
|
|
158
|
+
// return result;
|
|
159
|
+
// };
|
|
160
|
+
/**
|
|
161
|
+
* Unflattens an object (reverse of flatten)
|
|
162
|
+
* @param obj - Source object
|
|
163
|
+
* @param separator - Separator used for nested keys (default: '.')
|
|
164
|
+
* @returns Unflattened object
|
|
165
|
+
* @example
|
|
166
|
+
* unflatten({'a.b.c': 1, d: 2}) // {a: {b: {c: 1}}, d: 2}
|
|
167
|
+
*/
|
|
168
|
+
// export const unflatten = (
|
|
169
|
+
// obj: AnyObject,
|
|
170
|
+
// separator: string = '.'
|
|
171
|
+
// ): AnyObject => {
|
|
172
|
+
// const result: AnyObject = {};
|
|
173
|
+
// for (const key in obj) {
|
|
174
|
+
// const keys = key.split(separator);
|
|
175
|
+
// let current: any = result;
|
|
176
|
+
// for (let i = 0; i < keys.length - 1; i++) {
|
|
177
|
+
// const part = keys[i];
|
|
178
|
+
// // Handle array indices
|
|
179
|
+
// if (part.startsWith('[') && part.endsWith(']')) {
|
|
180
|
+
// const index = parseInt(part.slice(1, -1), 10);
|
|
181
|
+
// if (!Array.isArray(current)) {
|
|
182
|
+
// current = [];
|
|
183
|
+
// }
|
|
184
|
+
// if (current[index] == null) {
|
|
185
|
+
// current[index] = {};
|
|
186
|
+
// }
|
|
187
|
+
// current = current[index];
|
|
188
|
+
// } else {
|
|
189
|
+
// if (current[part] == null) {
|
|
190
|
+
// current[part] = {};
|
|
191
|
+
// }
|
|
192
|
+
// current = current[part];
|
|
193
|
+
// }
|
|
194
|
+
// }
|
|
195
|
+
// const lastKey = keys[keys.length - 1];
|
|
196
|
+
// // Handle array indices
|
|
197
|
+
// if (lastKey.startsWith('[') && lastKey.endsWith(']')) {
|
|
198
|
+
// const index = parseInt(lastKey.slice(1, -1), 10);
|
|
199
|
+
// if (!Array.isArray(current)) {
|
|
200
|
+
// current = [];
|
|
201
|
+
// }
|
|
202
|
+
// if (index >= current.length) {
|
|
203
|
+
// for (let i = current.length; i <= index; i++) {
|
|
204
|
+
// current.push(undefined);
|
|
205
|
+
// }
|
|
206
|
+
// }
|
|
207
|
+
// current[index] = obj[key];
|
|
208
|
+
// } else {
|
|
209
|
+
// current[lastKey] = obj[key];
|
|
210
|
+
// }
|
|
211
|
+
// }
|
|
212
|
+
// return result;
|
|
213
|
+
// };
|
|
214
|
+
/**
|
|
215
|
+
* Removes undefined or null properties from an object
|
|
216
|
+
* @param obj - Source object
|
|
217
|
+
* @param deep - Whether to clean recursively (default: false)
|
|
218
|
+
* @returns Cleaned object
|
|
219
|
+
* @example
|
|
220
|
+
* clean({a: 1, b: null, c: undefined, d: {e: null}}) // {a: 1, d: {}}
|
|
221
|
+
* clean({a: 1, b: null, d: {e: null}}, true) // {a: 1}
|
|
222
|
+
*/
|
|
223
|
+
export const clean = (obj, deep = false) => {
|
|
224
|
+
if (!isObject(obj)) {
|
|
225
|
+
return {};
|
|
226
|
+
}
|
|
227
|
+
const result = {};
|
|
228
|
+
for (const key in obj) {
|
|
229
|
+
const value = obj[key];
|
|
230
|
+
if (value != null) {
|
|
231
|
+
if (deep && isObject(value)) {
|
|
232
|
+
const cleaned = clean(value, true);
|
|
233
|
+
if (Object.keys(cleaned).length > 0) {
|
|
234
|
+
result[key] = cleaned;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
result[key] = value;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return result;
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* Creates a new object with default values
|
|
246
|
+
* @param defaults - Default values
|
|
247
|
+
* @param overrides - Override values
|
|
248
|
+
* @returns Merged object with defaults
|
|
249
|
+
* @example
|
|
250
|
+
* defaults({a: 1, b: 2}, {b: 3, c: 4}) // {a: 1, b: 3, c: 4}
|
|
251
|
+
*/
|
|
252
|
+
export const defaults = (current, overrides) => {
|
|
253
|
+
if (Array.isArray(current)) {
|
|
254
|
+
if (Array.isArray(overrides)) {
|
|
255
|
+
return [...current, ...overrides];
|
|
256
|
+
}
|
|
257
|
+
return [...current, overrides];
|
|
258
|
+
}
|
|
259
|
+
const result = deepClone(current);
|
|
260
|
+
for (const key in overrides) {
|
|
261
|
+
if (result[key] === undefined) {
|
|
262
|
+
result[key] = overrides[key];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return result;
|
|
266
|
+
};
|
|
267
|
+
/**
|
|
268
|
+
* Gets the size of an object (number of own enumerable properties)
|
|
269
|
+
* @param obj - Source object
|
|
270
|
+
* @returns Number of properties
|
|
271
|
+
* @example
|
|
272
|
+
* size({a: 1, b: 2, c: 3}) // 3
|
|
273
|
+
*/
|
|
274
|
+
export const size = (obj) => {
|
|
275
|
+
if (!isObject(obj)) {
|
|
276
|
+
return 0;
|
|
277
|
+
}
|
|
278
|
+
return Object.keys(obj).length;
|
|
279
|
+
};
|
|
280
|
+
/**
|
|
281
|
+
* Creates a new object with the same keys but transformed values
|
|
282
|
+
* @param obj - Source object
|
|
283
|
+
* @param transformer - Transformation function
|
|
284
|
+
* @returns Transformed object
|
|
285
|
+
* @example
|
|
286
|
+
* transform({a: 1, b: 2}, (key, value) => ({[key]: value * 2})) // {a: 2, b: 4}
|
|
287
|
+
*/
|
|
288
|
+
export const transform = (obj, transformer) => {
|
|
289
|
+
if (Array.isArray(obj)) {
|
|
290
|
+
return obj.map(transformer);
|
|
291
|
+
}
|
|
292
|
+
if (!isObject(obj)) {
|
|
293
|
+
return {};
|
|
294
|
+
}
|
|
295
|
+
const result = {};
|
|
296
|
+
for (const key in obj) {
|
|
297
|
+
const [newKey, newValue] = transformer(key, obj[key]);
|
|
298
|
+
result[newKey] = newValue;
|
|
299
|
+
}
|
|
300
|
+
return result;
|
|
301
|
+
};
|
|
302
|
+
/**
|
|
303
|
+
* Groups an array of objects by a key
|
|
304
|
+
* @param array - Array of objects
|
|
305
|
+
* @param key - Key to group by
|
|
306
|
+
* @returns Grouped object
|
|
307
|
+
* @example
|
|
308
|
+
* groupBy([{type: 'a', value: 1}, {type: 'b', value: 2}, {type: 'a', value: 3}], 'type')
|
|
309
|
+
* // {a: [{type: 'a', value: 1}, {type: 'a', value: 3}], b: [{type: 'b', value: 2}]}
|
|
310
|
+
*/
|
|
311
|
+
export const groupBy = (array, key) => {
|
|
312
|
+
if (!Array.isArray(array)) {
|
|
313
|
+
return {};
|
|
314
|
+
}
|
|
315
|
+
return array.reduce((groups, item) => {
|
|
316
|
+
const groupKey = item[key];
|
|
317
|
+
if (groupKey == null) {
|
|
318
|
+
return groups;
|
|
319
|
+
}
|
|
320
|
+
const keyStr = String(groupKey);
|
|
321
|
+
if (!groups[keyStr]) {
|
|
322
|
+
groups[keyStr] = [];
|
|
323
|
+
}
|
|
324
|
+
groups[keyStr].push(item);
|
|
325
|
+
return groups;
|
|
326
|
+
}, {});
|
|
327
|
+
};
|
|
328
|
+
/**
|
|
329
|
+
* Converts an object to a query string
|
|
330
|
+
* @param obj - Source object
|
|
331
|
+
* @returns Query string
|
|
332
|
+
* @example
|
|
333
|
+
* toQueryString({a: 1, b: 'test', c: [1, 2, 3]}) // 'a=1&b=test&c=1&c=2&c=3'
|
|
334
|
+
*/
|
|
335
|
+
export const toQueryString = (obj) => {
|
|
336
|
+
if (!isObject(obj)) {
|
|
337
|
+
return '';
|
|
338
|
+
}
|
|
339
|
+
const params = [];
|
|
340
|
+
const addParam = (key, value) => {
|
|
341
|
+
if (value == null)
|
|
342
|
+
return;
|
|
343
|
+
if (Array.isArray(value)) {
|
|
344
|
+
value.forEach((item) => {
|
|
345
|
+
params.push(`${encodeURIComponent(key)}=${encodeURIComponent(item)}`);
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
for (const key in obj) {
|
|
353
|
+
addParam(key, obj[key]);
|
|
354
|
+
}
|
|
355
|
+
return params.join('&');
|
|
356
|
+
};
|
|
357
|
+
/**
|
|
358
|
+
* Parses a query string to an object
|
|
359
|
+
* @param queryString - Query string
|
|
360
|
+
* @returns Parsed object
|
|
361
|
+
* @example
|
|
362
|
+
* fromQueryString('a=1&b=test&c=1&c=2&c=3') // {a: '1', b: 'test', c: ['1', '2', '3']}
|
|
363
|
+
*/
|
|
364
|
+
export const fromQueryString = (queryString) => {
|
|
365
|
+
if (!queryString || typeof queryString !== 'string') {
|
|
366
|
+
return {};
|
|
367
|
+
}
|
|
368
|
+
// Remove leading ?
|
|
369
|
+
const str = queryString.startsWith('?') ? queryString.slice(1) : queryString;
|
|
370
|
+
if (!str) {
|
|
371
|
+
return {};
|
|
372
|
+
}
|
|
373
|
+
const result = {};
|
|
374
|
+
const pairs = str.split('&');
|
|
375
|
+
for (const pair of pairs) {
|
|
376
|
+
const [key, value] = pair.split('=').map(decodeURIComponent);
|
|
377
|
+
if (key) {
|
|
378
|
+
if (key in result) {
|
|
379
|
+
// Handle duplicate keys as arrays
|
|
380
|
+
if (Array.isArray(result[key])) {
|
|
381
|
+
result[key].push(value || '');
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
result[key] = [result[key], value || ''];
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
result[key] = value || '';
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return result;
|
|
393
|
+
};
|
|
394
|
+
/**
|
|
395
|
+
* Creates a frozen deep clone of an object
|
|
396
|
+
* @param obj - Source object
|
|
397
|
+
* @returns Deep frozen object
|
|
398
|
+
* @example
|
|
399
|
+
* const frozen = deepFreeze({a: {b: 1}})
|
|
400
|
+
* frozen.a.b = 2 // Error in strict mode
|
|
401
|
+
*/
|
|
402
|
+
export const deepFreeze = (obj) => {
|
|
403
|
+
if (obj == null || typeof obj !== 'object') {
|
|
404
|
+
return obj;
|
|
405
|
+
}
|
|
406
|
+
// Freeze the object itself
|
|
407
|
+
Object.freeze(obj);
|
|
408
|
+
// Recursively freeze all properties
|
|
409
|
+
for (const key in obj) {
|
|
410
|
+
const value = obj[key];
|
|
411
|
+
if (value != null && typeof value === 'object') {
|
|
412
|
+
deepFreeze(value);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// Freeze symbols
|
|
416
|
+
const symbols = Object.getOwnPropertySymbols(obj);
|
|
417
|
+
for (const symbol of symbols) {
|
|
418
|
+
const value = obj[symbol];
|
|
419
|
+
if (value != null && typeof value === 'object') {
|
|
420
|
+
deepFreeze(value);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return obj;
|
|
424
|
+
};
|
|
425
|
+
/**
|
|
426
|
+
* Type guard for non-null object
|
|
427
|
+
* @param value - Value to check
|
|
428
|
+
* @returns True if value is a non-null object
|
|
429
|
+
*/
|
|
430
|
+
export const isNonNullObject = (value) => {
|
|
431
|
+
return value != null && typeof value === 'object' && !Array.isArray(value);
|
|
432
|
+
};
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
// src/lib/object/utils.ts
|
|
2
|
+
var isObject = (value) => {
|
|
3
|
+
if (value == null) return false;
|
|
4
|
+
if (Array.isArray(value)) return false;
|
|
5
|
+
if (typeof value === "function") return false;
|
|
6
|
+
if (value instanceof Date) return false;
|
|
7
|
+
if (value instanceof RegExp) return false;
|
|
8
|
+
if (value instanceof Map) return false;
|
|
9
|
+
if (value instanceof Set) return false;
|
|
10
|
+
if (value instanceof Error) return false;
|
|
11
|
+
return typeof value === "object";
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// src/lib/object/clone.ts
|
|
15
|
+
var deepClone = (obj, skipKeys) => {
|
|
16
|
+
if (obj == null || typeof obj !== "object") {
|
|
17
|
+
return obj;
|
|
18
|
+
}
|
|
19
|
+
if (obj instanceof Date) {
|
|
20
|
+
return new Date(obj.getTime());
|
|
21
|
+
}
|
|
22
|
+
if (obj instanceof RegExp) {
|
|
23
|
+
return new RegExp(obj.source, obj.flags);
|
|
24
|
+
}
|
|
25
|
+
if (obj instanceof Map) {
|
|
26
|
+
const clone = /* @__PURE__ */ new Map();
|
|
27
|
+
obj.forEach((value, key) => {
|
|
28
|
+
if (!skipKeys || !skipKeys.some((k) => k.toString() === key.toString())) {
|
|
29
|
+
clone.set(key, deepClone(value));
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return clone;
|
|
33
|
+
}
|
|
34
|
+
if (obj instanceof Set) {
|
|
35
|
+
const clone = /* @__PURE__ */ new Set();
|
|
36
|
+
obj.forEach((value) => {
|
|
37
|
+
clone.add(deepClone(value));
|
|
38
|
+
});
|
|
39
|
+
return clone;
|
|
40
|
+
}
|
|
41
|
+
if (Array.isArray(obj)) {
|
|
42
|
+
return Array.from(obj).map((item) => deepClone(item));
|
|
43
|
+
}
|
|
44
|
+
if (isObject(obj)) {
|
|
45
|
+
const clone = {};
|
|
46
|
+
for (const key in obj) {
|
|
47
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
48
|
+
if (!skipKeys || !skipKeys.some((k) => k.toString() === key.toString())) {
|
|
49
|
+
clone[key] = deepClone(obj[key]);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const symbols = Object.getOwnPropertySymbols(obj);
|
|
54
|
+
for (const symbol of symbols) {
|
|
55
|
+
if (!skipKeys || !skipKeys.some((s) => s.toString() === symbol.toString())) {
|
|
56
|
+
clone[symbol] = deepClone(obj[symbol]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return clone;
|
|
60
|
+
}
|
|
61
|
+
return obj;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// src/lib/object/object.ts
|
|
65
|
+
var invert = (obj, deep = false) => {
|
|
66
|
+
if (Array.isArray(obj)) {
|
|
67
|
+
return obj.map((item) => invert(item, deep));
|
|
68
|
+
}
|
|
69
|
+
if (!isObject(obj)) {
|
|
70
|
+
return {};
|
|
71
|
+
}
|
|
72
|
+
const result = {};
|
|
73
|
+
for (const key in obj) {
|
|
74
|
+
let value = obj[key];
|
|
75
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "symbol") {
|
|
76
|
+
result[value] = key;
|
|
77
|
+
} else if (isObject(value)) {
|
|
78
|
+
if (deep) {
|
|
79
|
+
result[key] = invert(value, deep);
|
|
80
|
+
}
|
|
81
|
+
} else if (Array.isArray(value)) {
|
|
82
|
+
if (deep) {
|
|
83
|
+
result[key] = value.map((item) => invert(item, deep));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
};
|
|
89
|
+
var filter = (obj, predicate) => {
|
|
90
|
+
if (Array.isArray(obj)) {
|
|
91
|
+
return obj.filter(predicate);
|
|
92
|
+
}
|
|
93
|
+
if (!isObject(obj)) {
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
const result = {};
|
|
97
|
+
for (const key in obj) {
|
|
98
|
+
if (predicate(obj[key], key)) {
|
|
99
|
+
result[key] = obj[key];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
};
|
|
104
|
+
var clean = (obj, deep = false) => {
|
|
105
|
+
if (!isObject(obj)) {
|
|
106
|
+
return {};
|
|
107
|
+
}
|
|
108
|
+
const result = {};
|
|
109
|
+
for (const key in obj) {
|
|
110
|
+
const value = obj[key];
|
|
111
|
+
if (value != null) {
|
|
112
|
+
if (deep && isObject(value)) {
|
|
113
|
+
const cleaned = clean(value, true);
|
|
114
|
+
if (Object.keys(cleaned).length > 0) {
|
|
115
|
+
result[key] = cleaned;
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
result[key] = value;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
};
|
|
124
|
+
var defaults = (current, overrides) => {
|
|
125
|
+
if (Array.isArray(current)) {
|
|
126
|
+
if (Array.isArray(overrides)) {
|
|
127
|
+
return [...current, ...overrides];
|
|
128
|
+
}
|
|
129
|
+
return [...current, overrides];
|
|
130
|
+
}
|
|
131
|
+
const result = deepClone(current);
|
|
132
|
+
for (const key in overrides) {
|
|
133
|
+
if (result[key] === void 0) {
|
|
134
|
+
result[key] = overrides[key];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
};
|
|
139
|
+
var size = (obj) => {
|
|
140
|
+
if (!isObject(obj)) {
|
|
141
|
+
return 0;
|
|
142
|
+
}
|
|
143
|
+
return Object.keys(obj).length;
|
|
144
|
+
};
|
|
145
|
+
var transform = (obj, transformer) => {
|
|
146
|
+
if (Array.isArray(obj)) {
|
|
147
|
+
return obj.map(transformer);
|
|
148
|
+
}
|
|
149
|
+
if (!isObject(obj)) {
|
|
150
|
+
return {};
|
|
151
|
+
}
|
|
152
|
+
const result = {};
|
|
153
|
+
for (const key in obj) {
|
|
154
|
+
const [newKey, newValue] = transformer(key, obj[key]);
|
|
155
|
+
result[newKey] = newValue;
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
};
|
|
159
|
+
var groupBy = (array, key) => {
|
|
160
|
+
if (!Array.isArray(array)) {
|
|
161
|
+
return {};
|
|
162
|
+
}
|
|
163
|
+
return array.reduce((groups, item) => {
|
|
164
|
+
const groupKey = item[key];
|
|
165
|
+
if (groupKey == null) {
|
|
166
|
+
return groups;
|
|
167
|
+
}
|
|
168
|
+
const keyStr = String(groupKey);
|
|
169
|
+
if (!groups[keyStr]) {
|
|
170
|
+
groups[keyStr] = [];
|
|
171
|
+
}
|
|
172
|
+
groups[keyStr].push(item);
|
|
173
|
+
return groups;
|
|
174
|
+
}, {});
|
|
175
|
+
};
|
|
176
|
+
var toQueryString = (obj) => {
|
|
177
|
+
if (!isObject(obj)) {
|
|
178
|
+
return "";
|
|
179
|
+
}
|
|
180
|
+
const params = [];
|
|
181
|
+
const addParam = (key, value) => {
|
|
182
|
+
if (value == null) return;
|
|
183
|
+
if (Array.isArray(value)) {
|
|
184
|
+
value.forEach((item) => {
|
|
185
|
+
params.push(`${encodeURIComponent(key)}=${encodeURIComponent(item)}`);
|
|
186
|
+
});
|
|
187
|
+
} else {
|
|
188
|
+
params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
for (const key in obj) {
|
|
192
|
+
addParam(key, obj[key]);
|
|
193
|
+
}
|
|
194
|
+
return params.join("&");
|
|
195
|
+
};
|
|
196
|
+
var fromQueryString = (queryString) => {
|
|
197
|
+
if (!queryString || typeof queryString !== "string") {
|
|
198
|
+
return {};
|
|
199
|
+
}
|
|
200
|
+
const str = queryString.startsWith("?") ? queryString.slice(1) : queryString;
|
|
201
|
+
if (!str) {
|
|
202
|
+
return {};
|
|
203
|
+
}
|
|
204
|
+
const result = {};
|
|
205
|
+
const pairs = str.split("&");
|
|
206
|
+
for (const pair of pairs) {
|
|
207
|
+
const [key, value] = pair.split("=").map(decodeURIComponent);
|
|
208
|
+
if (key) {
|
|
209
|
+
if (key in result) {
|
|
210
|
+
if (Array.isArray(result[key])) {
|
|
211
|
+
result[key].push(value || "");
|
|
212
|
+
} else {
|
|
213
|
+
result[key] = [result[key], value || ""];
|
|
214
|
+
}
|
|
215
|
+
} else {
|
|
216
|
+
result[key] = value || "";
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
};
|
|
222
|
+
var deepFreeze = (obj) => {
|
|
223
|
+
if (obj == null || typeof obj !== "object") {
|
|
224
|
+
return obj;
|
|
225
|
+
}
|
|
226
|
+
Object.freeze(obj);
|
|
227
|
+
for (const key in obj) {
|
|
228
|
+
const value = obj[key];
|
|
229
|
+
if (value != null && typeof value === "object") {
|
|
230
|
+
deepFreeze(value);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const symbols = Object.getOwnPropertySymbols(obj);
|
|
234
|
+
for (const symbol of symbols) {
|
|
235
|
+
const value = obj[symbol];
|
|
236
|
+
if (value != null && typeof value === "object") {
|
|
237
|
+
deepFreeze(value);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return obj;
|
|
241
|
+
};
|
|
242
|
+
var isNonNullObject = (value) => {
|
|
243
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
244
|
+
};
|
|
245
|
+
export {
|
|
246
|
+
clean,
|
|
247
|
+
deepFreeze,
|
|
248
|
+
defaults,
|
|
249
|
+
filter,
|
|
250
|
+
fromQueryString,
|
|
251
|
+
groupBy,
|
|
252
|
+
invert,
|
|
253
|
+
isNonNullObject,
|
|
254
|
+
size,
|
|
255
|
+
toQueryString,
|
|
256
|
+
transform
|
|
257
|
+
};
|