// Evita `target.push(...source)`: com arrays de dezenas/centenas de milhares de itens // (bases CNPJ completas, varias cidades) o spread operator em argumentos de funcao // estoura a pilha de chamadas do V8 (RangeError: Maximum call stack size exceeded). export function pushAll(target, source) { for (const item of source) target.push(item); return target; } export function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } // Quebra o vinculo do V8 entre uma substring (fatia) e o buffer da string original. // Sem isso, qualquer campo guardado a longo prazo mantem a linha CSV/JSON inteira // viva na memoria (SlicedString), o que com centenas de milhares de linhas retidas // simultaneamente estoura o heap. export function copyStr(value) { return Buffer.from(String(value ?? ''), 'utf8').toString('utf8'); } export function chunk(array, size) { const chunks = []; for (let i = 0; i < array.length; i += size) { chunks.push(array.slice(i, i + size)); } return chunks; }