/* eslint-disable @typescript-eslint/no-unsafe-member-access */ import { Link } from '../common/Link'; function isLinkString(value: string | undefined) { if (!value) return false; return /^[a-zA-Z]+:[^:]+$/.test(value); } export function parseTxtRow(row: string): any { if (typeof row !== 'string') { throw new Error('parseTxtRow: row is not string: ' + JSON.stringify(row)); } const parts = row.split(';'); const obj: any = {}; for (const part of parts) { const [key, rawValue] = part.split('='); const value = rawValue?.trim(); if (!key) continue; if (value?.startsWith('[') && value.includes(':')) { const arr = JSON.parse(value) as string[]; obj[key] = arr.map((s: string) => isLinkString(s) ? Link.fromString(s) : s, ); continue; } if (isLinkString(value)) { obj[key] = Link.fromString(value); continue; } if (value === '[]') { obj[key] = []; continue; } if (value && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(value)) { obj[key] = new Date(value); continue; } if (value?.startsWith('[') || value?.startsWith('{')) { try { obj[key] = JSON.parse(value) as unknown; continue; } catch { obj[key] = value; } } obj[key] = value; } return obj; } export function serializeTxtRow(obj: any): string { return Object.entries(obj) .map(([key, value]) => { if (value instanceof Link) { return `${key}=${value.toString()}`; } if (Array.isArray(value) && value.every((v) => v instanceof Link)) { return `${key}=${JSON.stringify(value.map((v) => v.toString()))}`; } if (Array.isArray(value) && value.length === 0) { return `${key}=[]`; } if (value instanceof Date) { return `${key}=${value.toISOString()}`; } if (typeof value === 'object') { return `${key}=${JSON.stringify(value)}`; } return `${key}=${value as string}`; }) .join(';'); }