Skip to content

@fc/utils ​

Pacote base do monorepo com classes e funções de propósito geral. Não tem dependências internas — é a raiz do grafo de dependências da Fábrica de Cálculos.

Módulos ​

Não há barrel: cada função é um arquivo, e o consumidor importa o arquivo que declara o símbolo pelo subpath @fc/utils/<módulo>/<arquivo> (ex.: @fc/utils/datas/antesDe). O exports do package.json publica cada módulo por wildcard (./datas/* → src/datas/*.ts); importar @fc/utils pela raiz não resolve e é barrado pelo linter.

MóduloConteúdo principal
datasAritmética de datas: adicionarDias360, diferencaEntreDatas, ultimoDiaDoMes, entreCompetencias, mesmaCompetencia, e mais de 40 funções para manipulação de datas no contexto previdenciário
numerosArredondamento, truncamento e formatação numérica
stringsNormalização, limpeza e comparação de strings
predicadosFunções de verificação de tipo e pertencimento: tipoNumero, tipoString, tipoData, tipoObjeto, ehValorDeDicionario, etc.
validacaoValidação de CPF, datas, competências e outros dados de entrada
objetosUtilitários para manipulação de objetos e clonagem profunda
vetoresOperações sobre arrays: agrupamento, ordenação, deduplcação
enumsUtilitários de enumeração
urlManipulação agnóstica de URLs e caminhos: juntarUrl, normalizarCaminhoUrl, extrairHostname, ehHostLocal
httpRequisições JSON resilientes e interpretação do tempo de espera informado por serviços HTTP
etcFunções auxiliares diversas

Antes de criar uma função nova ​

Verifique primeiro se já existe uma função equivalente neste pacote ou em @fc/comum.

Use @fc/utils para funções compartilháveis que sejam agnósticas em relação ao domínio da Fábrica de Cálculos: datas, números, strings, predicados, objetos, URLs, serialização, validação genérica e infraestrutura técnica. Se a função souber de calculadoras, apps, contratos de API, mensagens do produto ou vocabulário de negócio, o destino provável é @fc/comum, não @fc/utils.

Web Workers — criarWorkerScope ​

Todas as apps da Fábrica de Cálculos executam cálculos pesados fora da thread principal usando a infraestrutura de criarWorkerScope deste pacote.

ts
// No arquivo worker (ex: composables/worker/calcular.worker.ts)
import { criarWorkerScope } from '@fc/utils/etc/worker/criarWorkerScope'

criarWorkerScope(async (mensagem) => {
  // executa na thread do worker
  const resultado = await calcular(mensagem.dados)
  return resultado
})

O composable de UI obtém o worker via new Worker(new URL('./calcular.worker.ts', import.meta.url), { type: 'module' }) e usa postMessage/onmessage para comunicação assíncrona.

Uso ​

ts
import { converterStringEmData } from '@fc/utils/datas/converterStringEmData'
import { mesmaCompetencia } from '@fc/utils/datas/mesmaCompetencia'
import { ehValorDeDicionario } from '@fc/utils/predicados/ehValorDeDicionario'
import { tipoNumero } from '@fc/utils/predicados/tipoNumero'

converterStringEmData('01/2024')       // Date
mesmaCompetencia(new Date(), outra)    // boolean
ehValorDeDicionario(valor, dicionario) // preserva o tipo dos valores
tipoNumero(1)                           // true

Clientes HTTP podem declarar sua própria política de confiabilidade e reutilizar o transporte agnóstico:

ts
import { requisitarJson } from '@fc/utils/http/requisitarJson'

const { resposta, dados } = await requisitarJson(url, {
  nomeServico: 'Serviço externo',
  politica: {
    maximoTentativas: 3,
    timeoutTentativaMs: 10_000,
    orcamentoTotalMs: 30_000,
    atrasoBaseMs: 250,
    limiteCorpoBytes: 2 * 1024 * 1024,
  },
})

Para coordenar uma nova tentativa sem adotar o transporte completo, obterEsperaRetryAfter interpreta o cabeçalho Retry-After em segundos ou data HTTP e devolve o intervalo em milissegundos:

ts
import { obterEsperaRetryAfter } from '@fc/utils/http/obterEsperaRetryAfter'

const esperaMs = obterEsperaRetryAfter(resposta.headers)

Instalação (monorepo) ​

jsonc
// package.json
{ "dependencies": { "@fc/utils": "workspace:*" } }

Os packages/ exportam TypeScript puro: o exports do package.json aponta direto para os .ts de src/ — sem step de compilação.