Co-authored-by: Alessio Gravili <alessio@gravili.de> Co-authored-by: ibr-hin95 <ibr.hin95@gmail.com> Co-authored-by: Seied Ali Mirkarimi <dasmergo@gmail.com> Co-authored-by: muathkhatib <mkhatib.dev@gmail.com> Co-authored-by: ibr-hin95 <40246707+ibr-hin95@users.noreply.github.com> fix: recursiveNestedPaths not merging existing fields when hoisting row/collapsible fields (#2769) fix: exclude monaco code editor from ltr due to microsoft/monaco-editor#2371 BREAKING CHANGE: - The admin hook for `useLocale` now returns a Locale object of the currently active locale. Previously this would only return the code as a string. Any custom components built which had `locale = useLocale()` should be replaced with `{ code: locale } = useLocale()` to maintain the same functionality. - The property `localization.locales` of `SanitizedConfig` type has changed. This was an array of strings and is now an array of Locale objects having: `label: string`, `code: string` and `rtl: boolean`. If you are using localization.locales from the config you will need to adjust your project or plugin accordingly.
37 lines
841 B
TypeScript
37 lines
841 B
TypeScript
/**
|
|
* Simple object check.
|
|
* @param item
|
|
* @returns {boolean}
|
|
*/
|
|
export function isObject(item: unknown): boolean {
|
|
return Boolean(item && typeof item === 'object' && !Array.isArray(item));
|
|
}
|
|
|
|
/**
|
|
* Deep merge two objects.
|
|
* @param target
|
|
* @param ...sources
|
|
*/
|
|
export default function deepMerge<T extends object, R extends object>(
|
|
target: T,
|
|
source: R,
|
|
): T {
|
|
const output = { ...target };
|
|
if (isObject(target) && isObject(source)) {
|
|
Object.keys(source).forEach((key) => {
|
|
if (isObject(source[key])) {
|
|
// @ts-ignore
|
|
if (!(key in target)) {
|
|
Object.assign(output, { [key]: source[key] });
|
|
} else {
|
|
output[key] = deepMerge(target[key], source[key]);
|
|
}
|
|
} else {
|
|
Object.assign(output, { [key]: source[key] });
|
|
}
|
|
});
|
|
}
|
|
|
|
return output;
|
|
}
|