Skip to content

Commit 7726942

Browse files
committed
util,assert: expose util.isPartialDeepStrictEqual()
Signed-off-by: Thomas Hunter II <tlhunter@datadog.com>
1 parent dd5dfb5 commit 7726942

3 files changed

Lines changed: 83 additions & 0 deletions

File tree

‎doc/api/util.md‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,6 +1898,25 @@ console.log(util.isDeepStrictEqual(foo, bar, true));
18981898
See [`assert.deepStrictEqual()`][] for more information about deep strict
18991899
equality.
19001900

1901+
## `util.isPartialDeepStrictEqual(val1, val2)`
1902+
1903+
<!-- YAML
1904+
added: REPLACEME
1905+
-->
1906+
1907+
* `val1` {any}
1908+
* `val2` {any}
1909+
* Returns: {boolean}
1910+
1911+
Returns `true` if there is partial deep strict equality between `val1` and
1912+
`val2`. Otherwise, returns `false`.
1913+
1914+
"Partial" equality means that only properties that exist on `val2` are going
1915+
to be compared.
1916+
1917+
See [`assert.partialDeepStrictEqual()`][] for more information about partial
1918+
deep strict equality.
1919+
19011920
## `util.markPromiseAsHandled(promise)`
19021921

19031922
<!-- YAML
@@ -4145,6 +4164,7 @@ npx codemod@latest @nodejs/util-is
41454164
[`Object.freeze()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
41464165
[`Runtime.ScriptId`]: https://chromedevtools.github.io/devtools-protocol/1-3/Runtime/#type-ScriptId
41474166
[`assert.deepStrictEqual()`]: assert.md#assertdeepstrictequalactual-expected-message
4167+
[`assert.partialDeepStrictEqual()`]: assert.md#assertpartialdeepstrictequalactual-expected-message
41484168
[`console.error()`]: console.md#consoleerrordata-args
41494169
[`mime.toString()`]: #mimetostring
41504170
[`mimeParams.entries()`]: #mimeparamsentries

‎lib/util.js‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ function lazyAbortController() {
107107
}
108108

109109
let internalDeepEqual;
110+
let internalPartialDeepEqual;
110111

111112
// Pre-computed ANSI escape code constants
112113
const kEscape = '\u001b[';
@@ -625,6 +626,12 @@ module.exports = {
625626
}
626627
return internalDeepEqual(a, b, skipPrototype);
627628
},
629+
isPartialDeepStrictEqual(a, b) {
630+
if (internalPartialDeepEqual === undefined) {
631+
internalPartialDeepEqual = require('internal/util/comparisons').isPartialStrictEqual;
632+
}
633+
return internalPartialDeepEqual(a, b);
634+
},
628635
markPromiseAsHandled,
629636
promisify,
630637
stripVTControlCharacters,
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
'use strict';
2+
3+
// Confirm functionality of `util.isPartialDeepStrictEqual()`.
4+
5+
require('../common');
6+
7+
const assert = require('assert');
8+
const util = require('util');
9+
const { test } = require('node:test');
10+
11+
test('util.isPartialDeepStrictEqual returns true with expected properties', () => {
12+
assert.strictEqual(
13+
util.isPartialDeepStrictEqual({ a: 1, b: 2, c: 3 }, { b: 2 }),
14+
true,
15+
);
16+
17+
assert.strictEqual(
18+
util.isPartialDeepStrictEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } }),
19+
true,
20+
);
21+
22+
assert.strictEqual(
23+
util.isPartialDeepStrictEqual([1, 2, 3, 4, 5, 6, 7, 8, 9], [4, 5, 8]),
24+
true,
25+
);
26+
27+
{
28+
const obj = { a: 1 };
29+
assert.strictEqual(
30+
util.isPartialDeepStrictEqual(obj, obj),
31+
true,
32+
);
33+
}
34+
35+
assert.strictEqual(
36+
util.isPartialDeepStrictEqual({ a: 1, b: 2 }, { b: 2, a: 1 }),
37+
true,
38+
);
39+
});
40+
41+
test('util.isPartialDeepStrictEqual returns false with unexpected properties', () => {
42+
assert.strictEqual(
43+
util.isPartialDeepStrictEqual({ a: 1 }, { a: 2 }),
44+
false,
45+
);
46+
47+
assert.strictEqual(
48+
util.isPartialDeepStrictEqual({ a: 1 }, { b: 1 }),
49+
false,
50+
);
51+
52+
assert.strictEqual(
53+
util.isPartialDeepStrictEqual([1, 'two'], [1, 'two', true]),
54+
false,
55+
);
56+
});

0 commit comments

Comments
 (0)