export interface ParsedAuthorIds { duplicates: string[]; invalidTokens: string[]; ids: string[]; } const AUTHOR_ID_PATTERN = /^\d{16,20}$/; export function parseAuthorIds(input: string): ParsedAuthorIds { const ids: string[] = []; const duplicates: string[] = []; const invalidTokens: string[] = []; const seen = new Set(); input .split(/[\s,,;;]+/) .map((token) => token.trim()) .filter(Boolean) .forEach((token) => { if (!/^\d+$/.test(token) || !AUTHOR_ID_PATTERN.test(token)) { invalidTokens.push(token); return; } if (seen.has(token)) { duplicates.push(token); return; } seen.add(token); ids.push(token); }); return { duplicates, ids, invalidTokens }; }