Skip to content

Commit

Permalink
Switch lodash.isEqualWith to fast-equals (#4446)
Browse files Browse the repository at this point in the history
  • Loading branch information
igorbrasileiro authored Jan 17, 2025
1 parent 63f5612 commit 2b5c907
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 13 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ it according to semantic versioning. For example, if your PR adds a breaking cha
should change the heading of the (upcoming) version to include a major version bump.
-->
# 5.24.2

## @rjsf/utils

- switch `lodash.isEqualWith` to `fast-equals.createCustomEqual` providing `areFunctionsEqual` assuming any functions are equal.

# 5.24.1

Expand Down
10 changes: 10 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions packages/utils/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
"react": "^16.14.0 || >=17"
},
"dependencies": {
"fast-equals": "^5.2.2",
"json-schema-merge-allof": "^0.8.1",
"jsonpointer": "^5.0.1",
"lodash": "^4.17.21",
Expand Down
29 changes: 16 additions & 13 deletions packages/utils/src/deepEquals.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
import isEqualWith from 'lodash/isEqualWith';
import { createCustomEqual } from 'fast-equals';

/** Implements a deep equals using the `lodash.isEqualWith` function, that provides a customized comparator that
* assumes all functions are equivalent.
/** Implements a deep equals using the `fast-equals.createCustomEqual` function, providing a customized comparator that assumes all functions are equivalent.
*
* @param a - The first element to compare
* @param b - The second element to compare
* @returns - True if the `a` and `b` are deeply equal, false otherwise
*/
export default function deepEquals(a: any, b: any): boolean {
return isEqualWith(a, b, (obj: any, other: any) => {
if (typeof obj === 'function' && typeof other === 'function') {
// Assume all functions are equivalent
// see https://github.com/rjsf-team/react-jsonschema-form/issues/255
return true;
}
return undefined; // fallback to default isEquals behavior
});
}
const deepEquals = createCustomEqual({
createCustomConfig: () => ({
// Assume all functions are equivalent
// see https://github.com/rjsf-team/react-jsonschema-form/issues/255
//
// Performance improvement: knowing that typeof a === function, so, only needs to check if typeof b === function.
// https://github.com/planttheidea/fast-equals/blob/c633c4e653cacf8fd5cbb309b6841df62322d74c/src/comparator.ts#L99
areFunctionsEqual(_a, b) {
return typeof b === 'function';
},
}),
});

export default deepEquals;

0 comments on commit 2b5c907

Please sign in to comment.