Skip to content

Commit 076f10a

Browse files
authoredMay 12, 2021
feat!: skip nullish values from source (#29)
BREAKING CHANGE: `undefined` values will be bypassed and not consistent behavior with defaults-deep anymore.
1 parent cc0a643 commit 076f10a

File tree

3 files changed

+12
-10
lines changed

3 files changed

+12
-10
lines changed
 

‎README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ defu.arrayFn({
120120
### Remarks
121121

122122
- `object` and `defaults` are not modified
123-
- `null` values are skipped same as [defaults-deep](https://www.npmjs.com/package/defaults-deep). Please use either [omit-deep](http://npmjs.com/package/omit-deep) or [lodash.defaultsdeep](https://www.npmjs.com/package/lodash.defaultsdeep) if you need to preserve.
123+
- Nullish values ([`null`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null) and [`undefined`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined)) are skipped. Please use [defaults-deep](https://www.npmjs.com/package/defaults-deep) or [omit-deep](http://npmjs.com/package/omit-deep) or [lodash.defaultsdeep](https://www.npmjs.com/package/lodash.defaultsdeep) if you need to preserve or different behavior.
124124
- Assignment of `__proto__` and `constructor` keys will be skipped to prevent security issues with object pollution.
125125
- Will concat `array` values (if default property is defined)
126126
```js

‎src/defu.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ function _defu<T> (baseObj: T, defaults: any, namespace: string = '.', merger?:
1919

2020
const val = baseObj[key]
2121

22-
if (val === null) {
22+
if (val === null || val === undefined) {
2323
continue
2424
}
2525

‎src/types.ts

+10-8
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,19 @@ export type Merger = <T extends Input, K extends keyof T>(
77
namespace: string
88
) => any;
99

10+
type nullish = null | undefined | void
11+
1012
type MergeObjects<
1113
Destination extends Input,
1214
Defaults extends Input
1315
> = Destination extends Defaults ? Destination : Omit<Destination, keyof Destination & keyof Defaults> & Omit<Defaults, keyof Destination & keyof Defaults> &
1416
{
1517
-readonly [Key in keyof Destination & keyof Defaults]:
16-
Destination[Key] extends null
17-
? Defaults[Key] extends null
18-
? null
18+
Destination[Key] extends nullish
19+
? Defaults[Key] extends nullish
20+
? nullish
1921
: Defaults[Key]
20-
: Defaults[Key] extends null
22+
: Defaults[Key] extends nullish
2123
? Destination[Key]
2224
: Merge<Destination[Key], Defaults[Key]> // eslint-disable-line no-use-before-define
2325
}
@@ -48,11 +50,11 @@ export type Merge<
4850
Defaults extends Input
4951
> =
5052
// Remove explicitly null types
51-
Destination extends null
52-
? Defaults extends null
53-
? null
53+
Destination extends nullish
54+
? Defaults extends nullish
55+
? nullish
5456
: Defaults
55-
: Defaults extends null
57+
: Defaults extends nullish
5658
? Destination
5759
// Handle arrays
5860
: Destination extends Array<any>

0 commit comments

Comments
 (0)
Please sign in to comment.