@fluixi/utils 1.0.0-alpha.53
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 +73 -0
- package/dist/index.cjs +1 -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 +1 -0
- package/dist/lib/array/advanced.cjs +1 -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 +1 -0
- package/dist/lib/array/array.cjs +1 -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 +1 -0
- package/dist/lib/array/index.cjs +1 -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 +1 -0
- package/dist/lib/array/utils.cjs +1 -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 +1 -0
- package/dist/lib/color/color.cjs +1 -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 +1 -0
- package/dist/lib/color/constants.cjs +1 -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 +1 -0
- package/dist/lib/color/conversions.cjs +1 -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 +1 -0
- package/dist/lib/color/helpers.cjs +1 -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 +1 -0
- package/dist/lib/color/index.cjs +1 -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 +1 -0
- package/dist/lib/color/types.cjs +1 -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 +1 -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 +1 -0
- package/dist/lib/compare/comparators.cjs +1 -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 +1 -0
- package/dist/lib/compare/index.cjs +1 -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 +1 -0
- package/dist/lib/crypto/hash.cjs +1 -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 +1 -0
- package/dist/lib/crypto/index.cjs +1 -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 +1 -0
- package/dist/lib/dom/events.cjs +1 -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 +1 -0
- package/dist/lib/dom/index.cjs +1 -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 +1 -0
- package/dist/lib/dom/utils.cjs +1 -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 +1 -0
- package/dist/lib/functions/functions.cjs +1 -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 +1 -0
- package/dist/lib/functions/index.cjs +1 -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 +1 -0
- package/dist/lib/functions/types.cjs +1 -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 +1 -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 +1 -0
- package/dist/lib/index.cjs +1 -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 +1 -0
- package/dist/lib/maths/constants.cjs +1 -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 +1 -0
- package/dist/lib/maths/fn/advanced.cjs +1 -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 +1 -0
- package/dist/lib/maths/fn/basic.cjs +1 -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 +1 -0
- package/dist/lib/maths/fn/complex.cjs +1 -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 +1 -0
- package/dist/lib/maths/fn/index.cjs +1 -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 +1 -0
- package/dist/lib/maths/fn/trigo.cjs +1 -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 +1 -0
- package/dist/lib/maths/fn/vector.cjs +1 -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 +1 -0
- package/dist/lib/maths/formatter.cjs +1 -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 +1 -0
- package/dist/lib/maths/guards.cjs +1 -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 +1 -0
- package/dist/lib/maths/index.cjs +1 -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 +1 -0
- package/dist/lib/maths/parser.cjs +1 -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 +1 -0
- package/dist/lib/maths/random.cjs +1 -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 +1 -0
- package/dist/lib/maths/types/advanced.cjs +1 -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 +1 -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 +1 -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 +0 -0
- package/dist/lib/maths/types/negative.cjs +1 -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 +1 -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 +1 -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 +1 -0
- package/dist/lib/object/diff.cjs +1 -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 +1 -0
- package/dist/lib/object/getter-setter.cjs +1 -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 +1 -0
- package/dist/lib/object/index.cjs +6 -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 +6 -0
- package/dist/lib/object/merge.cjs +1 -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 +1 -0
- package/dist/lib/object/object.cjs +1 -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 +1 -0
- package/dist/lib/object/omit.cjs +1 -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 +1 -0
- package/dist/lib/object/reconcile.cjs +1 -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 +1 -0
- package/dist/lib/object/selector.cjs +1 -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 +1 -0
- package/dist/lib/object/sort.cjs +1 -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 +1 -0
- package/dist/lib/object/transform.cjs +1 -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 +1 -0
- package/dist/lib/object/types.cjs +1 -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 +6 -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 +6 -0
- package/dist/lib/primitive/boolean/boolean.cjs +1 -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 +1 -0
- package/dist/lib/primitive/boolean/index.cjs +1 -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 +1 -0
- package/dist/lib/primitive/boolean/types.cjs +1 -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 +1 -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 +1 -0
- package/dist/lib/primitive/date/index.cjs +1 -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 +1 -0
- package/dist/lib/primitive/date/types.cjs +1 -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 +5 -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 +5 -0
- package/dist/lib/primitive/string/index.cjs +5 -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 +5 -0
- package/dist/lib/primitive/string/parser-2.cjs +8 -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 +8 -0
- package/dist/lib/primitive/string/parser.cjs +3 -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 +3 -0
- package/dist/lib/primitive/string/string.cjs +5 -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 +5 -0
- package/dist/lib/primitive/string/types.cjs +1 -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 +1 -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 +1 -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 +1 -0
- package/dist/lib/url/parser.cjs +1 -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 +1 -0
- package/dist/lib/url/types.cjs +1 -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 +150 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-level mathematical operations that actually work.
|
|
3
|
+
* These use clever TypeScript tricks to perform type-level arithmetic.
|
|
4
|
+
* @module OperationTypes
|
|
5
|
+
*/
|
|
6
|
+
import { Integer, IsNegative } from "./basic.js";
|
|
7
|
+
import { MakeNegative } from "./negative.js";
|
|
8
|
+
/**
|
|
9
|
+
* Creates a tuple of length N.
|
|
10
|
+
* This is the foundation for all type-level arithmetic.
|
|
11
|
+
*/
|
|
12
|
+
type Tuple<N extends number, T = unknown, Acc extends T[] = []> = Acc['length'] extends N ? Acc : Tuple<N, T, [...Acc, T]>;
|
|
13
|
+
/**
|
|
14
|
+
* Converts a number to a tuple length.
|
|
15
|
+
*/
|
|
16
|
+
type NumberToTuple<N extends number> = Tuple<N>;
|
|
17
|
+
/**
|
|
18
|
+
* Converts a tuple to a number.
|
|
19
|
+
*/
|
|
20
|
+
type TupleToNumber<T extends unknown[]> = T['length'];
|
|
21
|
+
/**
|
|
22
|
+
* Helper type to get the numeric value of a digit string.
|
|
23
|
+
*/
|
|
24
|
+
type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
|
|
25
|
+
/**
|
|
26
|
+
* Adds two numbers at the type level (works up to ~50).
|
|
27
|
+
*/
|
|
28
|
+
type _Add<A extends number, B extends number> = IsNegative<A> extends true ? IsNegative<B> extends true ? Add<Absolute<A>, Absolute<B>> : Compare<Absolute<A>, Absolute<B>> extends -1 ? Subtract<B, Absolute<A>> : Subtract<Absolute<A>, B> : TupleToNumber<[...Tuple<A>, ...Tuple<B>]> & number;
|
|
29
|
+
/**
|
|
30
|
+
* Subtracts B from A at the type level (A - B).
|
|
31
|
+
*/
|
|
32
|
+
export type Subtract<A extends number, B extends number> = Tuple<A> extends [...Tuple<B>, ...infer R] ? TupleToNumber<R> : never;
|
|
33
|
+
/**
|
|
34
|
+
* Multiplies two numbers at the type level.
|
|
35
|
+
*/
|
|
36
|
+
type _Multiply<A extends number, B extends number> = B extends 0 ? 0 : B extends 1 ? A : MultiplyRec<A, B, 0>;
|
|
37
|
+
type MultiplyRec<A extends number, B extends number, Acc extends number> = B extends 0 ? Acc : MultiplyRec<A, Subtract<B, 1>, Add<Acc, A>>;
|
|
38
|
+
/**
|
|
39
|
+
* Divides A by B at the type level (integer division).
|
|
40
|
+
*/
|
|
41
|
+
type _Divide<A extends number, B extends number> = B extends 0 ? never : DivideRec<A, B, 0>;
|
|
42
|
+
type DivideRec<A extends number, B extends number, Q extends number> = A extends 0 ? Q : Subtract<A, B> extends never ? Q : DivideRec<Subtract<A, B>, B, Add<Q, 1>>;
|
|
43
|
+
/**
|
|
44
|
+
* Modulo operation at the type level (A % B).
|
|
45
|
+
*/
|
|
46
|
+
export type Mod<A extends number, B extends number> = B extends 0 ? never : Subtract<A, Multiply<Divide<A, B>, B>>;
|
|
47
|
+
export type Add<A extends number, B extends number> = IsNegative<A> extends true ? IsNegative<B> extends true ? MakeNegative<Add<Absolute<A>, Absolute<B>>> : Compare<Absolute<A>, Absolute<B>> extends 1 ? MakeNegative<Subtract<Absolute<A>, Absolute<B>>> : Subtract<Absolute<B>, Absolute<A>> : IsNegative<B> extends true ? Compare<A, Absolute<B>> extends 1 | 0 ? Subtract<A, Absolute<B>> : MakeNegative<Subtract<Absolute<B>, A>> : _Add<A, B>;
|
|
48
|
+
/**
|
|
49
|
+
* Multiplies two numbers, handling signs correctly.
|
|
50
|
+
*/
|
|
51
|
+
export type Multiply<A extends number, B extends number> = (IsNegative<A> extends true ? -1 : 1) extends infer SignA ? (IsNegative<B> extends true ? -1 : 1) extends infer SignB ? SignA extends -1 ? SignB extends -1 ? _Multiply<Absolute<A>, Absolute<B>> : MakeNegative<_Multiply<Absolute<A>, Absolute<B>>> : SignB extends -1 ? MakeNegative<_Multiply<Absolute<A>, Absolute<B>>> : _Multiply<Absolute<A>, Absolute<B>> : never : never;
|
|
52
|
+
/**
|
|
53
|
+
* Divides two numbers, handling signs correctly.
|
|
54
|
+
*/
|
|
55
|
+
export type Divide<A extends number, B extends number> = B extends 0 ? never : (IsNegative<A> extends true ? -1 : 1) extends infer SignA ? (IsNegative<B> extends true ? -1 : 1) extends infer SignB ? SignA extends -1 ? SignB extends -1 ? _Divide<Absolute<A>, Absolute<B>> : MakeNegative<_Divide<Absolute<A>, Absolute<B>>> : SignB extends -1 ? MakeNegative<_Divide<Absolute<A>, Absolute<B>>> : _Divide<Absolute<A>, Absolute<B>> : never : never;
|
|
56
|
+
/**
|
|
57
|
+
* Compares two numbers at the type level.
|
|
58
|
+
* Returns -1 if A < B, 0 if A = B, 1 if A > B.
|
|
59
|
+
*/
|
|
60
|
+
export type Compare<A extends number, B extends number> = A extends B ? 0 : Absolute<A> extends A ? Absolute<B> extends B ? Tuple<A> extends [...Tuple<B>, ...any] ? 1 : -1 : 1 : Absolute<B> extends B ? -1 : never;
|
|
61
|
+
/**
|
|
62
|
+
* Checks if A equals B at the type level.
|
|
63
|
+
*/
|
|
64
|
+
export type Equals<A extends number, B extends number> = A extends B ? (B extends A ? true : false) : false;
|
|
65
|
+
/**
|
|
66
|
+
* Checks if A is less than B at the type level.
|
|
67
|
+
*/
|
|
68
|
+
export type LessThan<A extends number, B extends number> = Compare<A, B> extends -1 ? true : false;
|
|
69
|
+
/**
|
|
70
|
+
* Checks if A is greater than B at the type level.
|
|
71
|
+
*/
|
|
72
|
+
export type GreaterThan<A extends number, B extends number> = Compare<A, B> extends 1 ? true : false;
|
|
73
|
+
/**
|
|
74
|
+
* Checks if A is less than or equal to B at the type level.
|
|
75
|
+
*/
|
|
76
|
+
export type LessThanOrEqual<A extends number, B extends number> = Compare<A, B> extends -1 | 0 ? true : false;
|
|
77
|
+
/**
|
|
78
|
+
* Checks if A is greater than or equal to B at the type level.
|
|
79
|
+
*/
|
|
80
|
+
export type GreaterThanOrEqual<A extends number, B extends number> = Compare<A, B> extends 1 | 0 ? true : false;
|
|
81
|
+
/**
|
|
82
|
+
* Returns the minimum of two numbers at the type level.
|
|
83
|
+
*/
|
|
84
|
+
export type Min<A extends number, B extends number> = Compare<A, B> extends -1 | 0 ? A : B;
|
|
85
|
+
/**
|
|
86
|
+
* Returns the maximum of two numbers at the type level.
|
|
87
|
+
*/
|
|
88
|
+
export type Max<A extends number, B extends number> = Compare<A, B> extends 1 | 0 ? A : B;
|
|
89
|
+
/**
|
|
90
|
+
* Extracts the absolute value type from a number.
|
|
91
|
+
*/
|
|
92
|
+
export type Absolute<T extends number> = `${T}` extends `-${infer U extends number}` ? U : T;
|
|
93
|
+
/**
|
|
94
|
+
* Represents a decimal number as a string for type manipulation.
|
|
95
|
+
*/
|
|
96
|
+
type DecimalString<N extends number> = `${N}` extends `${infer I}.${infer F}` ? [I, F] : [`${N}`, '0'];
|
|
97
|
+
/**
|
|
98
|
+
* Rounds a number to the nearest integer at the type level.
|
|
99
|
+
* This works for numbers up to 2 decimal places.
|
|
100
|
+
*/
|
|
101
|
+
export type Round<T extends number> = DecimalString<T> extends [infer I extends string, infer F extends string] ? F extends Digit ? `${F}` extends `${'5' | '6' | '7' | '8' | '9'}` ? Add<ToNumber<I>, 1> : ToNumber<I> : ToNumber<I> : T;
|
|
102
|
+
/**
|
|
103
|
+
* Helper to convert string to number.
|
|
104
|
+
*/
|
|
105
|
+
type ToNumber<S extends string> = S extends `${infer N extends number}` ? N : never;
|
|
106
|
+
/**
|
|
107
|
+
* Rounds a number down to the nearest integer at the type level.
|
|
108
|
+
*/
|
|
109
|
+
export type Floor<T extends number> = DecimalString<T> extends [infer I extends string, any] ? ToNumber<I> : T;
|
|
110
|
+
/**
|
|
111
|
+
* Rounds a number up to the nearest integer at the type level.
|
|
112
|
+
*/
|
|
113
|
+
export type Ceil<T extends number> = DecimalString<T> extends [infer I extends string, infer F extends string] ? F extends '0' ? ToNumber<I> : Add<ToNumber<I>, 1> : T;
|
|
114
|
+
/**
|
|
115
|
+
* Truncates the decimal part of a number at the type level.
|
|
116
|
+
*/
|
|
117
|
+
export type Trunc<T extends number> = Floor<T>;
|
|
118
|
+
/**
|
|
119
|
+
* Power operation at the type level (A^B).
|
|
120
|
+
*/
|
|
121
|
+
export type Power<Base extends number, Exponent extends number> = Exponent extends 0 ? 1 : Exponent extends 1 ? Base : PowerRec<Base, Exponent, 1>;
|
|
122
|
+
type PowerRec<B extends number, E extends number, Acc extends number> = E extends 0 ? Acc : PowerRec<B, Subtract<E, 1>, Multiply<Acc, B>>;
|
|
123
|
+
/**
|
|
124
|
+
* Factorial operation at the type level (n!).
|
|
125
|
+
* Works for n up to ~12 due to recursion limits.
|
|
126
|
+
*/
|
|
127
|
+
export type Factorial<N extends number> = N extends 0 ? 1 : N extends 1 ? 1 : Multiply<N, Factorial<Subtract<N, 1>>>;
|
|
128
|
+
/**
|
|
129
|
+
* Clamps a value between min and max at the type level.
|
|
130
|
+
*/
|
|
131
|
+
export type Clamp<T extends number, MinVal extends number, MaxVal extends number> = Min<Max<T, MinVal>, MaxVal>;
|
|
132
|
+
/**
|
|
133
|
+
* Creates a range of numbers from Start to End (inclusive) at the type level.
|
|
134
|
+
*/
|
|
135
|
+
export type Range<Start extends number, End extends number> = BuildRange<Start, End, []>;
|
|
136
|
+
type BuildRange<S extends number, E extends number, Acc extends number[]> = GreaterThan<S, E> extends true ? Acc : BuildRange<Add<S, 1>, E, [...Acc, S]>;
|
|
137
|
+
/**
|
|
138
|
+
* Increments a number by 1 at the type level.
|
|
139
|
+
*/
|
|
140
|
+
export type Increment<T extends number> = Add<T, 1>;
|
|
141
|
+
/**
|
|
142
|
+
* Decrements a number by 1 at the type level.
|
|
143
|
+
*/
|
|
144
|
+
export type Decrement<T extends number> = Subtract<T, 1>;
|
|
145
|
+
/**
|
|
146
|
+
* Checks if a number is even at the type level.
|
|
147
|
+
*/
|
|
148
|
+
export type IsEven<T extends number> = Mod<T, 2> extends 0 ? true : false;
|
|
149
|
+
/**
|
|
150
|
+
* Checks if a number is odd at the type level.
|
|
151
|
+
*/
|
|
152
|
+
export type IsOdd<T extends number> = Mod<T, 2> extends 1 ? true : false;
|
|
153
|
+
/**
|
|
154
|
+
* Checks if A is divisible by B at the type level.
|
|
155
|
+
*/
|
|
156
|
+
export type IsDivisible<A extends number, B extends number> = B extends 0 ? false : Mod<A, B> extends 0 ? true : false;
|
|
157
|
+
/**
|
|
158
|
+
* Asserts that a type condition is true.
|
|
159
|
+
* Useful for writing type tests.
|
|
160
|
+
*/
|
|
161
|
+
export type AssertTrue<T extends true> = T;
|
|
162
|
+
/**
|
|
163
|
+
* Asserts that two types are equal.
|
|
164
|
+
*/
|
|
165
|
+
export type AssertEqual<A, B> = (<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2) ? true : false;
|
|
166
|
+
export type { Tuple, NumberToTuple, TupleToNumber };
|
|
167
|
+
/**
|
|
168
|
+
* Represents an even integer.
|
|
169
|
+
*/
|
|
170
|
+
export type Even<T extends number> = T extends Integer ? `${T}` extends `${infer N extends number}` ? Mod<Absolute<N>, 2> extends 0 ? T : never : never : never;
|
|
171
|
+
/**
|
|
172
|
+
* Represents an odd integer.
|
|
173
|
+
*/
|
|
174
|
+
export type Odd<T extends number> = T extends Integer ? `${T}` extends `${infer N extends number}` ? Mod<Absolute<N>, 2> extends 1 ? T : never : never : never;
|
|
175
|
+
/**
|
|
176
|
+
* Extracts the sign of a number as a type.
|
|
177
|
+
* Returns -1, 0, or 1 as a numeric literal type.
|
|
178
|
+
*/
|
|
179
|
+
export type SignOf<T extends number> = T extends 0 ? 0 : `${T}` extends `-${string}` ? -1 : 1;
|
|
180
|
+
/**
|
|
181
|
+
* Type-level subtraction that always returns a negative or zero result.
|
|
182
|
+
*/
|
|
183
|
+
export type SubtractToNegative<A extends number, B extends number> = Compare<A, B> extends 1 | 0 ? MakeNegative<Subtract<A, B>> : Subtract<A, B>;
|
|
184
|
+
/**
|
|
185
|
+
* Returns the negative absolute value (always returns a negative number or zero).
|
|
186
|
+
*/
|
|
187
|
+
export type NegativeAbsolute<T extends number> = T extends 0 ? 0 : `-${Absolute<T>}` extends `${infer N extends number}` ? N : never;
|
|
188
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../../../src/lib/maths/types/operations.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var f=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var y=(e,t)=>{for(var r in t)f(e,r,{get:t[r],enumerable:!0})},d=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of l(t))!c.call(e,n)&&n!==r&&f(e,n,{get:()=>t[n],enumerable:!(s=u(t,n))||s.enumerable});return e};var g=e=>d(f({},"__esModule",{value:!0}),e);var b={};y(b,{deepClone:()=>i});module.exports=g(b);var a=e=>e==null||Array.isArray(e)||typeof e=="function"||e instanceof Date||e instanceof RegExp||e instanceof Map||e instanceof Set||e instanceof Error?!1:typeof e=="object";var i=(e,t)=>{if(e==null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){let r=new Map;return e.forEach((s,n)=>{(!t||!t.some(o=>o.toString()===n.toString()))&&r.set(n,i(s))}),r}if(e instanceof Set){let r=new Set;return e.forEach(s=>{r.add(i(s))}),r}if(Array.isArray(e))return Array.from(e).map(r=>i(r));if(a(e)){let r={};for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&(!t||!t.some(o=>o.toString()===n.toString()))&&(r[n]=i(e[n]));let s=Object.getOwnPropertySymbols(e);for(let n of s)(!t||!t.some(o=>o.toString()===n.toString()))&&(r[n]=i(e[n]));return r}return e};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a deep clone of a value (object, array, primitive, or built-in types)
|
|
3
|
+
*
|
|
4
|
+
* This function creates a complete copy of the input value, including all nested
|
|
5
|
+
* properties, without maintaining any references to the original object. It properly
|
|
6
|
+
* handles various JavaScript built-in types including:
|
|
7
|
+
*
|
|
8
|
+
* - Primitive values (strings, numbers, booleans)
|
|
9
|
+
* - Plain objects
|
|
10
|
+
* - Arrays
|
|
11
|
+
* - Dates
|
|
12
|
+
* - RegExp
|
|
13
|
+
* - Maps
|
|
14
|
+
* - Sets
|
|
15
|
+
* - Symbols as object keys
|
|
16
|
+
*
|
|
17
|
+
* @template T - The type of the value being cloned
|
|
18
|
+
* @param obj - The value to clone
|
|
19
|
+
* @returns A deep copy of the input value with the same type
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // Cloning a nested object
|
|
23
|
+
* const obj = { a: 1, b: { c: 2 } };
|
|
24
|
+
* const clone = deepClone(obj);
|
|
25
|
+
* obj.b.c = 3;
|
|
26
|
+
* console.log(clone.b.c); // 2 (remains unchanged)
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* // Cloning an array with objects
|
|
30
|
+
* const arr = [1, 2, { a: 3 }];
|
|
31
|
+
* const cloneArr = deepClone(arr);
|
|
32
|
+
* arr[2].a = 4;
|
|
33
|
+
* console.log(cloneArr[2].a); // 3 (remains unchanged)
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* // Cloning built-in types
|
|
37
|
+
* const date = new Date();
|
|
38
|
+
* const map = new Map([['key', 'value']]);
|
|
39
|
+
* const set = new Set([1, 2, 3]);
|
|
40
|
+
*
|
|
41
|
+
* const dateClone = deepClone(date); // independent Date instance
|
|
42
|
+
* const mapClone = deepClone(map); // independent Map instance
|
|
43
|
+
* const setClone = deepClone(set); // independent Set instance
|
|
44
|
+
*/
|
|
45
|
+
export declare const deepClone: <T>(obj: T, skipKeys?: (string | symbol)[]) => T;
|
|
46
|
+
//# sourceMappingURL=clone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../../src/lib/object/clone.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,KAAK,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,KAAG,CAwErE,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { isObject } from './utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a deep clone of a value (object, array, primitive, or built-in types)
|
|
4
|
+
*
|
|
5
|
+
* This function creates a complete copy of the input value, including all nested
|
|
6
|
+
* properties, without maintaining any references to the original object. It properly
|
|
7
|
+
* handles various JavaScript built-in types including:
|
|
8
|
+
*
|
|
9
|
+
* - Primitive values (strings, numbers, booleans)
|
|
10
|
+
* - Plain objects
|
|
11
|
+
* - Arrays
|
|
12
|
+
* - Dates
|
|
13
|
+
* - RegExp
|
|
14
|
+
* - Maps
|
|
15
|
+
* - Sets
|
|
16
|
+
* - Symbols as object keys
|
|
17
|
+
*
|
|
18
|
+
* @template T - The type of the value being cloned
|
|
19
|
+
* @param obj - The value to clone
|
|
20
|
+
* @returns A deep copy of the input value with the same type
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* // Cloning a nested object
|
|
24
|
+
* const obj = { a: 1, b: { c: 2 } };
|
|
25
|
+
* const clone = deepClone(obj);
|
|
26
|
+
* obj.b.c = 3;
|
|
27
|
+
* console.log(clone.b.c); // 2 (remains unchanged)
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // Cloning an array with objects
|
|
31
|
+
* const arr = [1, 2, { a: 3 }];
|
|
32
|
+
* const cloneArr = deepClone(arr);
|
|
33
|
+
* arr[2].a = 4;
|
|
34
|
+
* console.log(cloneArr[2].a); // 3 (remains unchanged)
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* // Cloning built-in types
|
|
38
|
+
* const date = new Date();
|
|
39
|
+
* const map = new Map([['key', 'value']]);
|
|
40
|
+
* const set = new Set([1, 2, 3]);
|
|
41
|
+
*
|
|
42
|
+
* const dateClone = deepClone(date); // independent Date instance
|
|
43
|
+
* const mapClone = deepClone(map); // independent Map instance
|
|
44
|
+
* const setClone = deepClone(set); // independent Set instance
|
|
45
|
+
*/
|
|
46
|
+
export const deepClone = (obj, skipKeys) => {
|
|
47
|
+
// Handle primitives
|
|
48
|
+
if (obj == null || typeof obj !== 'object') {
|
|
49
|
+
return obj;
|
|
50
|
+
}
|
|
51
|
+
// Handle Date
|
|
52
|
+
if (obj instanceof Date) {
|
|
53
|
+
return new Date(obj.getTime());
|
|
54
|
+
}
|
|
55
|
+
// Handle RegExp
|
|
56
|
+
if (obj instanceof RegExp) {
|
|
57
|
+
return new RegExp(obj.source, obj.flags);
|
|
58
|
+
}
|
|
59
|
+
// Handle Map
|
|
60
|
+
if (obj instanceof Map) {
|
|
61
|
+
const clone = new Map();
|
|
62
|
+
obj.forEach((value, key) => {
|
|
63
|
+
if (!skipKeys || !skipKeys.some((k) => k.toString() === key.toString())) {
|
|
64
|
+
clone.set(key, deepClone(value));
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return clone;
|
|
68
|
+
}
|
|
69
|
+
// Handle Set
|
|
70
|
+
if (obj instanceof Set) {
|
|
71
|
+
const clone = new Set();
|
|
72
|
+
obj.forEach((value) => {
|
|
73
|
+
clone.add(deepClone(value));
|
|
74
|
+
});
|
|
75
|
+
return clone;
|
|
76
|
+
}
|
|
77
|
+
// Handle Array
|
|
78
|
+
if (Array.isArray(obj)) {
|
|
79
|
+
return Array.from(obj).map((item) => deepClone(item));
|
|
80
|
+
}
|
|
81
|
+
// Handle plain object
|
|
82
|
+
if (isObject(obj)) {
|
|
83
|
+
const clone = {};
|
|
84
|
+
for (const key in obj) {
|
|
85
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
86
|
+
if (!skipKeys ||
|
|
87
|
+
!skipKeys.some((k) => k.toString() === key.toString())) {
|
|
88
|
+
clone[key] = deepClone(obj[key]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Handle symbols
|
|
93
|
+
const symbols = Object.getOwnPropertySymbols(obj);
|
|
94
|
+
for (const symbol of symbols) {
|
|
95
|
+
if (!skipKeys ||
|
|
96
|
+
!skipKeys.some((s) => s.toString() === symbol.toString())) {
|
|
97
|
+
clone[symbol] = deepClone(obj[symbol]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return clone;
|
|
101
|
+
}
|
|
102
|
+
// Fallback for other object types
|
|
103
|
+
return obj;
|
|
104
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var f=e=>e==null||Array.isArray(e)||typeof e=="function"||e instanceof Date||e instanceof RegExp||e instanceof Map||e instanceof Set||e instanceof Error?!1:typeof e=="object";var o=(e,r)=>{if(e==null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){let n=new Map;return e.forEach((s,t)=>{(!r||!r.some(i=>i.toString()===t.toString()))&&n.set(t,o(s))}),n}if(e instanceof Set){let n=new Set;return e.forEach(s=>{n.add(o(s))}),n}if(Array.isArray(e))return Array.from(e).map(n=>o(n));if(f(e)){let n={};for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(!r||!r.some(i=>i.toString()===t.toString()))&&(n[t]=o(e[t]));let s=Object.getOwnPropertySymbols(e);for(let t of s)(!r||!r.some(i=>i.toString()===t.toString()))&&(n[t]=o(e[t]));return n}return e};export{o as deepClone};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var b=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var N=(n,s)=>{for(var u in s)b(n,u,{get:s[u],enumerable:!0})},J=(n,s,u,h)=>{if(s&&typeof s=="object"||typeof s=="function")for(let d of K(s))!M.call(n,d)&&d!==u&&b(n,d,{get:()=>s[d],enumerable:!(h=q(s,d))||h.enumerable});return n};var L=n=>J(b({},"__esModule",{value:!0}),n);var z={};N(z,{applyDiff:()=>x,diffObject:()=>D,diffObjectDetailed:()=>E,getChangedPaths:()=>W,hasObjectChanges:()=>B});module.exports=L(z);var o=n=>n==null||Array.isArray(n)||typeof n=="function"||n instanceof Date||n instanceof RegExp||n instanceof Map||n instanceof Set||n instanceof Error?!1:typeof n=="object";var P=(n,s)=>n===s,C=(n,s)=>{if(n.length!==s.length)return!1;for(let u=0;u<n.length;u++)if(Array.isArray(n[u])&&Array.isArray(s[u])){if(!C(n[u],s[u]))return!1}else if(o(n[u])&&o(s[u])){if(!F(n[u],s[u]))return!1}else if(n[u]!==s[u])return!1;return!0},F=(n,s)=>{let u=Object.keys(n),h=Object.keys(s);if(u.length!==h.length)return!1;for(let d of u){if(!(d in s))return!1;let c=n[d],A=s[d];if(Array.isArray(c)&&Array.isArray(A)){if(!C(c,A))return!1}else if(o(c)&&o(A)){if(!F(c,A))return!1}else if(c!==A)return!1}return!0},D=(n,s,u={})=>{let{includeDeleted:h=!1,includeAdded:d=!0,deepArrayComparison:c=!0,equalityFn:A=P,preserveStructure:R=!1}=u;if(n==null&&s==null)return{};if(n==null)return d?{...s}:{};if(s==null){if(h){let i={};for(let g in n)i[g]=void 0;return i}return{}}if(!o(n)||!o(s))return A(n,s)?{}:s;let S={},T=new Set;for(let i in s){T.add(i);let g=n[i],m=s[i];if(!(i in n)){d&&(S[i]=m);continue}if(Array.isArray(g)&&Array.isArray(m)){c?C(g,m)?R&&(S[i]=void 0):S[i]=m:g!==m?S[i]=m:R&&(S[i]=void 0);continue}if(o(g)&&o(m)){let r=D(g,m,u);Object.keys(r).length>0?S[i]=r:R&&(S[i]=void 0);continue}A(g,m)?R&&(S[i]=void 0):S[i]=m}if(h)for(let i in n)T.has(i)||(S[i]=void 0);return S},E=(n,s,u={})=>{let h=[],d=[],c=[],A={},{includeDeleted:R=!1,includeAdded:S=!0,deepArrayComparison:T=!0,equalityFn:i=P}=u;if(Array.isArray(n)&&Array.isArray(s)){let r=Math.max(n.length,s.length),p=[],y=!1;for(let e=0;e<r;e++){let f=`[${e}]`;if(e>=n.length)h.push(f),p[e]=s[e],y=!0;else if(e>=s.length)d.push(f),y=!0;else{let a=n[e],t=s[e];o(a)&&o(t)||Array.isArray(a)&&Array.isArray(t)?E(a,t,u).hasChanges?(c.push(f),p[e]=t,y=!0):p[e]=a:i(a,t)?p[e]=a:(c.push(f),p[e]=t,y=!0)}}return{changes:y?p:{},added:h,deleted:d,modified:c,hasChanges:y||d.length>0}}let g=(r,p,y="")=>{let e={added:[],deleted:[],modified:[]};if(Array.isArray(r)&&Array.isArray(p)){let f=Math.max(r.length,p.length);for(let a=0;a<f;a++){let t=y?`${y}[${a}]`:`[${a}]`;if(a>=r.length)e.added.push(t);else if(a>=p.length)e.deleted.push(t);else{let l=r[a],k=p[a];if(o(l)&&o(k)){let $=g(l,k,t);e.added.push(...$.added),e.deleted.push(...$.deleted),e.modified.push(...$.modified)}else if(Array.isArray(l)&&Array.isArray(k)){let $=g(l,k,t);e.added.push(...$.added),e.deleted.push(...$.deleted),e.modified.push(...$.modified)}else l!==k&&e.modified.push(t)}}return e}if(o(r)&&o(p)){let f=new Set([...Object.keys(r||{}),...Object.keys(p||{})]);for(let a of f){let t=r?.[a],l=p?.[a],k=y?`${y}.${a}`:a;if(!(a in(r||{})))e.added.push(k);else if(!(a in(p||{})))e.deleted.push(k);else if(Array.isArray(t)&&Array.isArray(l)){if(!C(t,l)){let $=g(t,l,k);e.added.push(...$.added),e.deleted.push(...$.deleted),e.modified.push(...$.modified)}}else if(o(t)&&o(l)){let $=g(t,l,k);e.added.push(...$.added),e.deleted.push(...$.deleted),e.modified.push(...$.modified)}else t!==l&&e.modified.push(k)}}return e};if(n==null&&s==null)return{changes:{},added:h,deleted:d,modified:c,hasChanges:!1};if(n==null){if(S&&s)for(let r in s)h.push(r),A[r]=s[r];return{changes:A,added:h,deleted:d,modified:c,hasChanges:h.length>0}}if(s==null){if(R)for(let r in n)d.push(r),A[r]=void 0;return{changes:A,added:h,deleted:d,modified:c,hasChanges:d.length>0}}let m=new Set;for(let r in s){m.add(r);let p=n[r],y=s[r];if(!(r in n)){S&&(h.push(r),A[r]=y);continue}let e=!1;if(Array.isArray(p)&&Array.isArray(y)){if(e=T?!C(p,y):p!==y,e){let f=g(p,y,r);h.push(...f.added),d.push(...f.deleted),c.push(...f.modified),A[r]=y}}else if(o(p)&&o(y)){let f=D(p,y,u);if(e=Object.keys(f).length>0,e){let a=g(p,y,r);h.push(...a.added),d.push(...a.deleted),c.push(...a.modified),A[r]=f}}else e=!i(p,y),e&&(c.push(r),A[r]=y)}for(let r in n)m.has(r)||(d.push(r),A[r]=void 0);return{changes:A,added:h,deleted:d,modified:c,hasChanges:h.length>0||d.length>0||c.length>0}},B=(n,s,u={})=>{let h=D(n,s,u);return Object.keys(h).length>0};function I(n){return!!(n&&(n.diff||n.changes)&&(n.modified||n.deleted||n.hasChanges))}var x=(n,s,u)=>{if(!I(s)){let e=s,f=u||!1;if(Array.isArray(n)&&Array.isArray(e)){let t=f?n:[...n];e.length<t.length&&(t.length=e.length);for(let l=0;l<e.length;l++){let k=e[l];k!==void 0&&(o(t[l])&&o(k)||Array.isArray(t[l])&&Array.isArray(k)?t[l]=x(t[l],k,f):t[l]=k)}return t}if(!o(n))return e;if(!o(e))return n;let a=f?n:{...n};for(let t in e){let l=e[t];l===void 0?delete a[t]:Array.isArray(a[t])&&Array.isArray(l)||o(a[t])&&o(l)?a[t]=x(a[t],l,f):a[t]=l}return a}let{diff:h,added:d=[],deleted:c=[],modified:A=[],changes:R,keepRef:S}=s,T=u!==void 0?u:S,i=R||h;if(!i)return n;let g=new Set(d),m=new Set(c),r=new Set(A),p=e=>{if(d.length===0&&c.length===0&&A.length===0)return!0;let f=e.split(/[.\[\]]+/).filter(Boolean);for(let a=0;a<=f.length;a++){let t=f.slice(0,a).join("."),l=f.slice(0,a).map((k,$)=>/^\d+$/.test(k)?`[${k}]`:$>0?`.${k}`:k).join("");if(g.has(t)||g.has(l)||m.has(t)||m.has(l)||r.has(t)||r.has(l))return!0}return!1};if(Array.isArray(n)&&Array.isArray(i)){let e=T?n:[...n];e.length=i.length;for(let f=0;f<i.length;f++){let a=`[${f}]`,t=i[f];t!==void 0&&p(a)&&(o(e[f])&&o(t)||Array.isArray(e[f])&&Array.isArray(t)?e[f]=x(e[f],t,T):e[f]=t)}return e}if(!o(n))return i;if(!o(i))return n;let y=T?n:{...n};for(let e of c)e.includes(".")||e.includes("[")||p(e)&&delete y[e];for(let e in i){let f=i[e];p(e)&&(f===void 0?delete y[e]:Array.isArray(y[e])&&Array.isArray(f)||o(y[e])&&o(f)?y[e]=x(y[e],f,T):y[e]=f)}return y},W=(n,s,u={})=>{let h=[],d=(c,A,R="")=>{if(c===A)return;if(Array.isArray(c)&&Array.isArray(A)){let T=Math.max(c.length,A.length);for(let i=0;i<T;i++){let g=R?`${R}[${i}]`:`[${i}]`;if(i>=c.length)h.push(g);else if(i>=A.length)h.push(g);else{let m=c[i],r=A[i];o(m)&&o(r)||Array.isArray(m)&&Array.isArray(r)?d(m,r,g):m!==r&&h.push(g)}}return}if(!o(c)||!o(A)){R&&h.push(R);return}let S=new Set([...Object.keys(c||{}),...Object.keys(A||{})]);for(let T of S){let i=c?.[T],g=A?.[T],m=R?`${R}.${T}`:T;!(T in(c||{}))||!(T in(A||{}))?h.push(m):Array.isArray(i)&&Array.isArray(g)||o(i)&&o(g)?d(i,g,m):i!==g&&h.push(m)}};return d(n,s),h};
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Object diff utilities for comparing and tracking changes
|
|
3
|
+
* @description Provides utilities to diff objects and return structured changes
|
|
4
|
+
*/
|
|
5
|
+
import type { AnyObject } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Options for diffObject function
|
|
8
|
+
*/
|
|
9
|
+
export interface DiffOptions {
|
|
10
|
+
/**
|
|
11
|
+
* If true, includes properties that exist in oldObj but not in newObj
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
14
|
+
includeDeleted?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* If true, includes properties that exist in newObj but not in oldObj
|
|
17
|
+
* @default true
|
|
18
|
+
*/
|
|
19
|
+
includeAdded?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* If true, compares arrays by deep equality instead of reference
|
|
22
|
+
* @default true
|
|
23
|
+
*/
|
|
24
|
+
deepArrayComparison?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Custom equality function for comparing values
|
|
27
|
+
* @default strict equality (===)
|
|
28
|
+
*/
|
|
29
|
+
equalityFn?: (a: any, b: any) => boolean;
|
|
30
|
+
/**
|
|
31
|
+
* If true, preserves the full object structure with undefined for unchanged values
|
|
32
|
+
* @default false
|
|
33
|
+
*/
|
|
34
|
+
preserveStructure?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Diff result with metadata about changes
|
|
38
|
+
*/
|
|
39
|
+
export interface DiffResult<T = any> {
|
|
40
|
+
/**
|
|
41
|
+
* Object containing only changed values
|
|
42
|
+
*/
|
|
43
|
+
changes: Partial<T>;
|
|
44
|
+
/**
|
|
45
|
+
* Paths that were added (exist in new but not in old)
|
|
46
|
+
*/
|
|
47
|
+
added: string[];
|
|
48
|
+
/**
|
|
49
|
+
* Paths that were deleted (exist in old but not in new)
|
|
50
|
+
*/
|
|
51
|
+
deleted: string[];
|
|
52
|
+
/**
|
|
53
|
+
* Paths that were modified (exist in both but have different values)
|
|
54
|
+
*/
|
|
55
|
+
modified: string[];
|
|
56
|
+
/**
|
|
57
|
+
* Whether any changes were detected
|
|
58
|
+
*/
|
|
59
|
+
hasChanges: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Compares two objects and returns only the changed values while preserving the object structure
|
|
63
|
+
*
|
|
64
|
+
* @param oldObj - The original object
|
|
65
|
+
* @param newObj - The new object to compare against
|
|
66
|
+
* @param options - Configuration options for diff behavior
|
|
67
|
+
* @returns Object with the same structure containing only changed values
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* const old = { a: 1, b: { c: 2, d: 3 }, e: 5 };
|
|
72
|
+
* const new = { a: 1, b: { c: 4, d: 3 }, e: 5, f: 6 };
|
|
73
|
+
* const diff = diffObject(old, new);
|
|
74
|
+
* // Returns: { b: { c: 4 }, f: 6 }
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* // With arrays
|
|
80
|
+
* const old = { items: [1, 2, 3], meta: { count: 3 } };
|
|
81
|
+
* const new = { items: [1, 2, 4], meta: { count: 4 } };
|
|
82
|
+
* const diff = diffObject(old, new);
|
|
83
|
+
* // Returns: { items: [1, 2, 4], meta: { count: 4 } }
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* // Include deleted properties
|
|
89
|
+
* const old = { a: 1, b: 2, c: 3 };
|
|
90
|
+
* const new = { a: 1, c: 4 };
|
|
91
|
+
* const diff = diffObject(old, new, { includeDeleted: true });
|
|
92
|
+
* // Returns: { b: undefined, c: 4 }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare const diffObject: <T extends AnyObject>(oldObj: T, newObj: T, options?: DiffOptions) => Partial<T>;
|
|
96
|
+
/**
|
|
97
|
+
* Returns detailed diff with metadata about changes for objects and arrays
|
|
98
|
+
*
|
|
99
|
+
* @param oldObj - The original object or array
|
|
100
|
+
* @param newObj - The new object or array to compare against
|
|
101
|
+
* @param options - Configuration options for diff behavior
|
|
102
|
+
* @returns Detailed diff result with metadata including array indices in paths
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* // Object example
|
|
107
|
+
* const old = { a: 1, b: 2, c: 3 };
|
|
108
|
+
* const new = { a: 1, b: 4, d: 5 };
|
|
109
|
+
* const result = diffObjectDetailed(old, new);
|
|
110
|
+
* // {
|
|
111
|
+
* // changes: { b: 4, d: 5 },
|
|
112
|
+
* // added: ['d'],
|
|
113
|
+
* // deleted: ['c'],
|
|
114
|
+
* // modified: ['b'],
|
|
115
|
+
* // hasChanges: true
|
|
116
|
+
* // }
|
|
117
|
+
* ```
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```ts
|
|
121
|
+
* // Nested array example
|
|
122
|
+
* const old = { items: [{ id: 1, name: 'a' }, { id: 2, name: 'b' }] };
|
|
123
|
+
* const new = { items: [{ id: 1, name: 'x' }, { id: 2, name: 'b' }] };
|
|
124
|
+
* const result = diffObjectDetailed(old, new);
|
|
125
|
+
* // modified: ['items[0].name']
|
|
126
|
+
* ```
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```ts
|
|
130
|
+
* // Top-level array example
|
|
131
|
+
* const old = [1, 2, 3, 4];
|
|
132
|
+
* const new = [1, 5, 3];
|
|
133
|
+
* const result = diffObjectDetailed(old, new);
|
|
134
|
+
* // {
|
|
135
|
+
* // changes: [1, 5, 3], // Returns the new array with changes
|
|
136
|
+
* // added: [],
|
|
137
|
+
* // deleted: ['[3]'], // Index 3 was removed
|
|
138
|
+
* // modified: ['[1]'], // Index 1 changed from 2 to 5
|
|
139
|
+
* // hasChanges: true
|
|
140
|
+
* // }
|
|
141
|
+
* ```
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* // Array of objects example
|
|
146
|
+
* const old = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
|
|
147
|
+
* const new = [{ id: 1, name: 'Alicia' }, { id: 2, name: 'Bob' }];
|
|
148
|
+
* const result = diffObjectDetailed(old, new);
|
|
149
|
+
* // {
|
|
150
|
+
* // changes: [{ id: 1, name: 'Alicia' }, { id: 2, name: 'Bob' }],
|
|
151
|
+
* // modified: ['[0]'], // First element modified
|
|
152
|
+
* // hasChanges: true
|
|
153
|
+
* // }
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export declare const diffObjectDetailed: <T extends AnyObject>(oldObj: T, newObj: T, options?: DiffOptions) => DiffResult<T>;
|
|
157
|
+
/**
|
|
158
|
+
* Checks if two objects have any differences
|
|
159
|
+
*
|
|
160
|
+
* @param oldObj - The original object
|
|
161
|
+
* @param newObj - The new object to compare against
|
|
162
|
+
* @param options - Configuration options for diff behavior
|
|
163
|
+
* @returns True if objects are different
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```ts
|
|
167
|
+
* hasObjectChanges({ a: 1 }, { a: 1 }) // false
|
|
168
|
+
* hasObjectChanges({ a: 1 }, { a: 2 }) // true
|
|
169
|
+
* ```
|
|
170
|
+
*/
|
|
171
|
+
export declare const hasObjectChanges: <T extends AnyObject>(oldObj: T, newObj: T, options?: DiffOptions) => boolean;
|
|
172
|
+
interface ApplyDiff<T> extends Partial<DiffResult<T>> {
|
|
173
|
+
keepRef?: boolean;
|
|
174
|
+
diff?: T;
|
|
175
|
+
}
|
|
176
|
+
export declare const applyDiff: <T extends AnyObject>(baseObj: T, option: T | ApplyDiff<T>, keepRefParam?: boolean) => T;
|
|
177
|
+
/**
|
|
178
|
+
* Gets paths of all changed values with array index notation support
|
|
179
|
+
*
|
|
180
|
+
* @param oldObj - The original object
|
|
181
|
+
* @param newObj - The new object to compare against
|
|
182
|
+
* @param options - Configuration options for diff behavior
|
|
183
|
+
* @returns Array of paths to changed values (e.g., ['a.b[0].name', 'c[1].value'])
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```ts
|
|
187
|
+
* const old = { a: 1, b: { c: 2, d: 3 } };
|
|
188
|
+
* const new = { a: 1, b: { c: 4, d: 3 }, e: 5 };
|
|
189
|
+
* const paths = getChangedPaths(old, new);
|
|
190
|
+
* // Returns: ['b.c', 'e']
|
|
191
|
+
* ```
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```ts
|
|
195
|
+
* const old = { items: [{ id: 1, name: 'a' }, { id: 2, name: 'b' }] };
|
|
196
|
+
* const new = { items: [{ id: 1, name: 'x' }, { id: 2, name: 'b' }] };
|
|
197
|
+
* const paths = getChangedPaths(old, new);
|
|
198
|
+
* // Returns: ['items[0].name']
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
export declare const getChangedPaths: <T extends AnyObject>(oldObj: T, newObj: T, options?: DiffOptions) => string[];
|
|
202
|
+
export {};
|
|
203
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/lib/object/diff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC;IAEzC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,GAAG;IACjC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAEpB;;OAEG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB;AAqDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,SAAS,EAC5C,QAAQ,CAAC,EACT,QAAQ,CAAC,EACT,UAAS,WAAgB,KACxB,OAAO,CAAC,CAAC,CAsGX,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,SAAS,EACpD,QAAQ,CAAC,EACT,QAAQ,CAAC,EACT,UAAS,WAAgB,KACxB,UAAU,CAAC,CAAC,CA4Rd,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,SAAS,EAClD,QAAQ,CAAC,EACT,QAAQ,CAAC,EACT,UAAS,WAAgB,KACxB,OAGF,CAAC;AAmDF,UAAU,SAAS,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,CAAC;CACV;AACD,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,EAC3C,SAAS,CAAC,EACV,QAAQ,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EACxB,eAAe,OAAO,KACrB,CA2LF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,SAAS,EACjD,QAAQ,CAAC,EACT,QAAQ,CAAC,EACT,UAAS,WAAgB,KACxB,MAAM,EA0ER,CAAC"}
|