vika-server / src /utils /file.utils.ts
Viktoria435
Refactor file handling and date parsing in utility functions
c426414
/* 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(';');
}