in modules/core/src/lifecycle/props.js [79:130]
export function compareProps({
newProps,
oldProps,
ignoreProps = {},
propTypes = {},
triggerName = 'props'
} = {}) {
// shallow equality => deep equality
if (oldProps === newProps) {
return null;
}
// TODO - do we need these checks? Should never happen...
if (typeof newProps !== 'object' || newProps === null) {
return `${triggerName} changed shallowly`;
}
if (typeof oldProps !== 'object' || oldProps === null) {
return `${triggerName} changed shallowly`;
}
// Compare explicitly defined new props against old/default values
for (const key of Object.keys(newProps)) {
if (!(key in ignoreProps)) {
if (!(key in oldProps)) {
return `${triggerName}.${key} added`;
}
const changed = comparePropValues(newProps[key], oldProps[key], propTypes[key]);
if (changed) {
return `${triggerName}.${key} ${changed}`;
}
}
}
// Test if any old props have been dropped
for (const key of Object.keys(oldProps)) {
if (!(key in ignoreProps)) {
if (!(key in newProps)) {
return `${triggerName}.${key} dropped`;
}
if (!Object.hasOwnProperty.call(newProps, key)) {
// Compare dropped old prop against default value
const changed = comparePropValues(newProps[key], oldProps[key], propTypes[key]);
if (changed) {
return `${triggerName}.${key} ${changed}`;
}
}
}
}
return null;
}