export const extractSchemaProps = (obj: O) => Object.entries(obj).reduce((prev, [key, val]) => { const typeOf = (arg: T) => arg instanceof Array ? 'array' : arg === null ? 'undefined' : typeof arg const value = typeOf(val) === 'object' && '$type' in val && '$value' in val ? val?.$value : val const type = typeOf(value) let schema: any = { title: key, type, default: value } if (typeOf(value) === 'array') { const item = value[0] // TODO merge other item schema's into one if (typeOf(item) !== 'object') { schema.items = { type: 'object', properties: extractSchemaProps(item), default: item } } // TODO support primitive-value arrays } if (typeOf(value) === 'object') { schema.properties = extractSchemaProps(value) } return { ...prev, [key]: schema } }, {} as any)