Project Files
src / flatten.ts
/** Flatten nested JSON-like *obj* into {path, value} rows (Python exif-sniffer parity). */
export function flattenToMetadataList(obj: unknown, prefix = ""): Array<{ path: string; value: unknown }> {
const rows: Array<{ path: string; value: unknown }> = [];
if (obj && typeof obj === "object" && !Array.isArray(obj)) {
const o = obj as Record<string, unknown>;
const keys = Object.keys(o);
if (keys.length === 0) {
rows.push({ path: prefix || "/", value: {} });
return rows;
}
for (const k of keys) {
const p = prefix ? `${prefix}.${k}` : k;
rows.push(...flattenToMetadataList(o[k], p));
}
} else if (Array.isArray(obj)) {
if (obj.length === 0) {
rows.push({ path: prefix || "/", value: [] });
return rows;
}
for (let i = 0; i < obj.length; i++) {
const p = prefix ? `${prefix}[${i}]` : `[${i}]`;
rows.push(...flattenToMetadataList(obj[i], p));
}
} else {
rows.push({ path: prefix || "/", value: obj });
}
return rows;
}