sindresorhus / ow

Function argument validation for humans
https://sindresorhus.com/ow/
MIT License
3.8k stars 105 forks source link

ow.object.exactShape does not treat undefined values correctly #208

Open mnmkng opened 3 years ago

mnmkng commented 3 years ago

What happens:

const ow = require('ow').default;

ow({ foo: 'bar', bar: undefined }, ow.object.exactShape({
    foo: ow.string,
}));

Throws:

ArgumentError: Did not expect property `bar` to exist, got `undefined` in object
...
 validationErrors: Map(1) {
    'object' => Set(1) {
      'Did not expect property `bar` to exist, got `undefined` in object'
    }
  }

Expected behavior:

Even though I understand that there's a difference between those two objects:

const obj1 = {};
const obj2 = { bar: undefined };

I believe that for the purposes of argument validation they are the same and the error message "Did not expect property bar to exist, got undefined in object" does not make sense to me. I would expect the original code to not throw.

If accepted as a bug, I can do the PR to fix it. Thanks.

atomanyih commented 2 years ago

It does make a difference if you're spreading in your function:

const obj1 = { bar: 'foo', ...{} } // => { bar: 'foo' }
const obj2 = { bar: 'foo', ...{ bar: undefined } } // => { bar: undefined }