// Shared helpers used by every translations editor (CMS messages, Nitro JSON5 // configs, JSON badge files). Editors operate on a flat `key -> string` map // for ease of search/filter/render; the on-disk format is the nested object // produced by `unflattenObject`. export function flattenObject(obj: Record, prefix = ''): Record { const result: Record = {} for (const [key, value] of Object.entries(obj)) { const fullKey = prefix ? `${prefix}.${key}` : key if (typeof value === 'object' && value !== null && !Array.isArray(value)) { Object.assign(result, flattenObject(value as Record, fullKey)) } else { result[fullKey] = String(value ?? '') } } return result } export function unflattenObject(flat: Record): Record { const result: Record = {} for (const [key, value] of Object.entries(flat)) { const parts = key.split('.') let current: Record = result for (let i = 0; i < parts.length - 1; i++) { if (!current[parts[i]] || typeof current[parts[i]] !== 'object') { current[parts[i]] = {} } current = current[parts[i]] as Record } current[parts[parts.length - 1]] = value } return result }