import type { FormSchema } from '../types/form-builder' import { isRecord } from './records' export function recordValuesEqualForKeys( left: Record, right: Record, keys: readonly string[], ): boolean { for (const key of keys) { if (!valuesEqual(left[key], right[key])) return false } return true } export function pickRecordKeys( source: Record, keys: readonly string[], ): Record { return Object.fromEntries(keys.map(key => [key, source[key]])) } export function pickExistingRecordKeys( source: Record, keys: readonly string[], ): Record { return Object.fromEntries( keys .filter(key => Object.prototype.hasOwnProperty.call(source, key)) .map(key => [key, source[key]]), ) } export function formSchemaFieldNames(schema: FormSchema): string[] { const sections = schema.steps ? schema.steps.flatMap(step => step.sections) : schema.sections return sections.flatMap(section => section.fields.map(field => field.name)) } export function valuesEqual(left: unknown, right: unknown): boolean { if (Object.is(left, right)) return true if (Array.isArray(left) && Array.isArray(right)) { return left.length === right.length && left.every((item, index) => valuesEqual(item, right[index])) } if (isRecord(left) && isRecord(right)) { return recordValuesEqualForKeys(left, right, [...new Set([...Object.keys(left), ...Object.keys(right)])]) } return false }