import { SchemaProperty } from '../types';
/**
* @since 4.10.0
*/
export function prepareDefaultValuesFromSchema(
record: Record<string, any>,
schemaProperties: Record<string, SchemaProperty>
): Record<string, any> {
const isReadOnly = (schema: SchemaProperty): boolean => {
return schema?.readOnly || schema?.readonly;
};
const isObject = (value: any, schema: SchemaProperty): boolean => {
return schema?.properties &&typeof value === "object" && value !== null && !Array.isArray(value);
};
const isArray = (value: any, schema: SchemaProperty): boolean => {
return schema?.type === "array" && schema?.items && Array.isArray(value);
};
const processValue = (value: any, schema: SchemaProperty): any => {
if (isObject(value, schema)) {
return prepareDefaultValuesFromSchema(value, schema.properties as Record<string, SchemaProperty>);
}
if (isArray(value, schema)) {
return value.map(item =>
isObject(item, schema.items as SchemaProperty)
? prepareDefaultValuesFromSchema(item, (schema.items as any).properties ?? {})
: item
);
}
return value;
};
return Object.fromEntries(
Object.entries(record)
.filter(([key]) => !isReadOnly(schemaProperties[key]))
.map(([key, value]) => [
key,
schemaProperties[key]
? processValue(value, schemaProperties[key])
: value
])
);
}