@oscarpalmer/atoms 0.180.0 → 0.181.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/array/find.d.mts +42 -1
- package/dist/array/find.mjs +5 -1
- package/dist/array/get.mjs +2 -2
- package/dist/array/index.d.mts +3 -3
- package/dist/array/index.mjs +3 -3
- package/dist/index.d.mts +126 -25
- package/dist/index.mjs +50 -13
- package/dist/internal/array/find.d.mts +4 -3
- package/dist/internal/array/find.mjs +5 -2
- package/dist/internal/array/index-of.d.mts +42 -1
- package/dist/internal/array/index-of.mjs +5 -1
- package/dist/internal/math/aggregate.mjs +2 -2
- package/dist/internal/result.mjs +2 -2
- package/dist/internal/string.d.mts +5 -3
- package/dist/internal/string.mjs +14 -5
- package/dist/internal/value/equal.mjs +2 -2
- package/dist/internal/value/handlers.mjs +2 -2
- package/dist/value/index.d.mts +2 -1
- package/dist/value/index.mjs +2 -1
- package/dist/value/merge.d.mts +13 -0
- package/dist/value/merge.mjs +3 -1
- package/dist/value/shake.d.mts +7 -0
- package/dist/value/shake.mjs +16 -0
- package/package.json +1 -1
- package/src/array/exists.ts +1 -1
- package/src/array/find.ts +58 -0
- package/src/array/get.ts +2 -2
- package/src/internal/array/find.ts +24 -4
- package/src/internal/array/index-of.ts +59 -1
- package/src/internal/math/aggregate.ts +2 -2
- package/src/internal/result.ts +6 -3
- package/src/internal/string.ts +26 -8
- package/src/internal/value/equal.ts +2 -2
- package/src/internal/value/handlers.ts +2 -2
- package/src/value/index.ts +1 -0
- package/src/value/merge.ts +17 -1
- package/src/value/shake.ts +36 -0
package/src/value/merge.ts
CHANGED
|
@@ -8,16 +8,29 @@ import type {ArrayOrPlainObject, NestedPartial, PlainObject} from '../models';
|
|
|
8
8
|
* Options for merging values
|
|
9
9
|
*/
|
|
10
10
|
export type MergeOptions = {
|
|
11
|
+
/**
|
|
12
|
+
* Assign values to the first array or object instead of creating a new one?
|
|
13
|
+
*/
|
|
14
|
+
assignValues?: boolean;
|
|
11
15
|
/**
|
|
12
16
|
* Key _(or key epxressions)_ for values that should be replaced
|
|
17
|
+
*
|
|
13
18
|
* ```ts
|
|
14
19
|
* merge([{items: [1, 2, 3]}, {items: [99]}]); // {items: [99]}
|
|
15
20
|
* ```
|
|
16
21
|
*/
|
|
17
22
|
replaceableObjects?: string | RegExp | Array<string | RegExp>;
|
|
23
|
+
/**
|
|
24
|
+
* Skip nullable values when merging objects?
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* merge({a: 1, b: 2}, {b: null, c: 3}, {d: null}); // {a: 1, b: 2, c: 3}
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
18
30
|
skipNullableAny?: boolean;
|
|
19
31
|
/**
|
|
20
32
|
* Skip nullable values when merging arrays?
|
|
33
|
+
*
|
|
21
34
|
* ```ts
|
|
22
35
|
* merge([1, 2, 3], [null, null, 99]); // [1, 2, 99]
|
|
23
36
|
* ```
|
|
@@ -35,6 +48,7 @@ export type Merger<Model extends ArrayOrPlainObject = ArrayOrPlainObject> = (
|
|
|
35
48
|
) => Model;
|
|
36
49
|
|
|
37
50
|
type Options = {
|
|
51
|
+
assignValues: boolean;
|
|
38
52
|
replaceableObjects: ReplaceableObjectsCallback | undefined;
|
|
39
53
|
skipNullableAny: boolean;
|
|
40
54
|
skipNullableInArrays: boolean;
|
|
@@ -48,6 +62,7 @@ type ReplaceableObjectsCallback = (name: string) => boolean;
|
|
|
48
62
|
|
|
49
63
|
function getMergeOptions(options?: MergeOptions): Options {
|
|
50
64
|
const actual: Options = {
|
|
65
|
+
assignValues: false,
|
|
51
66
|
replaceableObjects: undefined,
|
|
52
67
|
skipNullableAny: false,
|
|
53
68
|
skipNullableInArrays: false,
|
|
@@ -59,6 +74,7 @@ function getMergeOptions(options?: MergeOptions): Options {
|
|
|
59
74
|
|
|
60
75
|
actual.replaceableObjects = getReplaceableObjects(options.replaceableObjects);
|
|
61
76
|
|
|
77
|
+
actual.assignValues = options.assignValues === true;
|
|
62
78
|
actual.skipNullableAny = options.skipNullableAny === true;
|
|
63
79
|
actual.skipNullableInArrays = options.skipNullableInArrays === true;
|
|
64
80
|
|
|
@@ -132,7 +148,7 @@ function mergeObjects(
|
|
|
132
148
|
): ArrayOrPlainObject {
|
|
133
149
|
const {length} = values;
|
|
134
150
|
const isArray = values.every(Array.isArray);
|
|
135
|
-
const merged = (isArray ? [] : {}) as PlainObject;
|
|
151
|
+
const merged = (options.assignValues ? values[0] : isArray ? [] : {}) as PlainObject;
|
|
136
152
|
|
|
137
153
|
for (let outerIndex = 0; outerIndex < length; outerIndex += 1) {
|
|
138
154
|
const item = values[outerIndex] as PlainObject;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import {isNonPlainObject} from '../is';
|
|
2
|
+
import type {PlainObject} from '../models';
|
|
3
|
+
|
|
4
|
+
// #region Types
|
|
5
|
+
|
|
6
|
+
export type Shaken<Value extends PlainObject> = {
|
|
7
|
+
[Key in keyof Value]: Value[Key] extends undefined ? never : Value[Key];
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
// #endregion
|
|
11
|
+
|
|
12
|
+
// #region Functions
|
|
13
|
+
|
|
14
|
+
export function shake<Value extends PlainObject>(value: Value): Shaken<Value> {
|
|
15
|
+
const shaken: PlainObject = {};
|
|
16
|
+
|
|
17
|
+
if (isNonPlainObject(value)) {
|
|
18
|
+
return shaken as Shaken<Value>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const keys = Object.keys(value) as (keyof Value)[];
|
|
22
|
+
const {length} = keys;
|
|
23
|
+
|
|
24
|
+
for (let index = 0; index < length; index += 1) {
|
|
25
|
+
const key = keys[index];
|
|
26
|
+
const val = value[key];
|
|
27
|
+
|
|
28
|
+
if (val !== undefined) {
|
|
29
|
+
shaken[key] = val;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return shaken as Shaken<Value>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// #endregion
|