diff --git a/dist-back/uuid.js b/dist-back/uuid.js index 4668534..d87f43c 100644 --- a/dist-back/uuid.js +++ b/dist-back/uuid.js @@ -25,33 +25,143 @@ __export(uuid_exports, { validarUuid: () => validarUuid }); module.exports = __toCommonJS(uuid_exports); -var import_node_crypto = require("node:crypto"); const erUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; const validarUuid = (uuid2) => { - const retorno = erUuid.test(String(uuid2 || "")); - return retorno; + return erUuid.test(String(uuid2 || "")); }; +const uuidV4 = () => globalThis.crypto.randomUUID(); +const uuid = uuidV4; const NIL_UUID = "00000000-0000-0000-0000-000000000000"; +const rotL = (x, n) => x << n | x >>> 32 - n; +const md5 = (str) => { + const msg = new TextEncoder().encode(str); + const len = msg.length; + const bits = len * 8; + const padLen = len % 64 < 56 ? 56 - len % 64 : 120 - len % 64; + const padded = new Uint8Array(len + padLen + 8); + padded.set(msg); + padded[len] = 128; + const dv = new DataView(padded.buffer); + dv.setUint32(len + padLen, bits >>> 0, true); + dv.setUint32(len + padLen + 4, Math.floor(bits / 2 ** 32), true); + const T = Array.from( + { length: 64 }, + (_, i) => Math.abs(Math.sin(i + 1)) * 2 ** 32 >>> 0 + ); + const S = [ + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21 + ]; + let a0 = 1732584193, b0 = 4023233417, c0 = 2562383102, d0 = 271733878; + for (let off = 0; off < padded.length; off += 64) { + const M = []; + for (let j = 0; j < 16; j++) M[j] = dv.getUint32(off + j * 4, true); + let [A, B, C, D] = [a0, b0, c0, d0]; + for (let i = 0; i < 64; i++) { + let F, g; + if (i < 16) { + F = B & C | ~B & D; + g = i; + } else if (i < 32) { + F = D & B | ~D & C; + g = (5 * i + 1) % 16; + } else if (i < 48) { + F = B ^ C ^ D; + g = (3 * i + 5) % 16; + } else { + F = C ^ (B | ~D); + g = 7 * i % 16; + } + F = F + A + T[i] + M[g] >>> 0; + A = D; + D = C; + C = B; + B = B + rotL(F, S[i]) >>> 0; + } + a0 = a0 + A >>> 0; + b0 = b0 + B >>> 0; + c0 = c0 + C >>> 0; + d0 = d0 + D >>> 0; + } + const toHexLE = (n) => { + let s = ""; + for (let i = 0; i < 4; i++) s += (n >>> i * 8 & 255).toString(16).padStart(2, "0"); + return s; + }; + return toHexLE(a0) + toHexLE(b0) + toHexLE(c0) + toHexLE(d0); +}; const formatarUuidV3 = (hash) => { - const chars = hash.slice(0, 32); - return [ - chars.slice(0, 8), - chars.slice(8, 12), - `3${chars.slice(13, 16)}`, - // version 3 - `${(Number.parseInt(chars[16], 16) & 3 | 8).toString(16)}${chars.slice(17, 20)}`, - // variant - chars.slice(20, 32) - ].join("-"); + const c = hash.slice(0, 32); + const v = (Number.parseInt(c[16], 16) & 3 | 8).toString(16); + return `${c.slice(0, 8)}-${c.slice(8, 12)}-3${c.slice(13, 16)}-${v}${c.slice(17, 20)}-${c.slice(20, 32)}`; }; const uuidV3 = (chave, grupo) => { const namespace = grupo ? uuidV3(grupo) : NIL_UUID; const input = typeof chave === "string" ? chave : typeof chave === "number" ? String(chave) : JSON.stringify(chave); - const hash = (0, import_node_crypto.createHash)("md5").update(namespace + input).digest("hex"); - return formatarUuidV3(hash); + return formatarUuidV3(md5(namespace + input)); }; -const uuidV4 = () => (0, import_node_crypto.randomUUID)(); -const uuid = uuidV4; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { erUuid, diff --git a/dist-front/index.d.mts b/dist-front/index.d.mts new file mode 100644 index 0000000..7850065 --- /dev/null +++ b/dist-front/index.d.mts @@ -0,0 +1,688 @@ +import z from 'zod'; +import _dayjs from 'dayjs'; +export { Dayjs, ManipulateType } from 'dayjs'; +import _duration from 'dayjs/plugin/duration'; +import _isSameOrAfter from 'dayjs/plugin/isSameOrAfter'; +import _isSameOrBefore from 'dayjs/plugin/isSameOrBefore'; +import _minMax from 'dayjs/plugin/minMax'; +import _relativeTime from 'dayjs/plugin/relativeTime'; +import _timezone from 'dayjs/plugin/timezone'; +import _utc from 'dayjs/plugin/utc'; +import _weekOfYear from 'dayjs/plugin/weekOfYear'; + +declare const aleatorio: (tamanho?: number) => string; + +type TipoPayloadAuditoria = { + /** UUID do registro de auditoria */ + codigo?: string | null; + /** UUID do usuario da acao (pode ser null se for processo do sistema que não registrou) */ + usuario_criacao: string | null; + /** Timestamp ou data de criacao / execucao */ + data_criacao: string | Date; + /** Nome exato da tabela no banco que originou o registro */ + tabela_origem: string; + /** Código único (UUID) do registro na tabela original */ + codigo_origem: string; + /** JSON contendo o snapshot das colunas novas / editadas */ + novo: Record; + /** JSON contendo o snapshot das colunas antes da edição */ + anterior: Record; + /** Hash ou controle de versao do item, usualmente preenchido por new.ver_seg */ + __versao: string; + /** Tipo de operação que gerou a auditoria */ + acao: "criar" | "atualizar" | "deletar" | string; + /** Versão do sistema no momento em que a ação ocorreu */ + versao_sistema: string; +}; + +/** gerar uma função de cache para uso em memoria */ +declare const cacheM: (chave: any, valor?: T, validadeSeg?: number) => T | undefined; +declare const verCacheM: () => { + [k: string]: { + /** new Date().getTime() */ + validade?: number | undefined; + valor: any; + } | undefined; +}; +declare const cacheMemoria: (chave: any, valor?: T, validadeSeg?: number) => T | undefined; +/** para uso fixo dentro de uma função, trava a chave */ +declare const cacheMFixo: (chave: any) => (valor?: T) => T | undefined; + +declare const uuid_null = "00000000-0000-0000-0000-000000000000"; +/** Colunas Presentes n maioria das tabelas */ +declare enum camposComuns { + codigo = "codigo", + excluido = "excluido", + data_hora_criacao = "data_hora_criacao", + data_hora_atualizacao = "data_hora_atualizacao", + codigo_usuario_criacao = "codigo_usuario_criacao", + codigo_usuario_atualizacao = "codigo_usuario_atualizacao", + versao = "versao" +} +/** Palavras comumente usadas */ +declare enum tx { + token = "token" +} +declare enum tipoUsuarioResiduos { + Usuario = "usuario", + Fornecedor = "fornecedor" +} + +declare enum operadores { + "=" = "=", + "!=" = "!=", + ">" = ">", + ">=" = ">=", + "<" = "<", + "<=" = "<=", + like = "like", + in = "in", + isNull = "isNull", + notIn = "notIn" +} +type tipoFiltro = { + coluna: string; + valor: any; + operador: keyof typeof operadores | operadores; + ou?: boolean; +}; +type interfaceConsulta = { + offset?: number; + limit?: number; + filtros?: tipoFiltro[]; + ordem?: string; + ordemTipo?: "asc" | "desc"; + colunas?: string[]; + apenasConsulta?: boolean; + apenasContagem?: boolean; +}; +declare const zOperadores: z.ZodEnum<{ + "=": "="; + "!=": "!="; + ">": ">"; + ">=": ">="; + "<": "<"; + "<=": "<="; + like: "like"; + in: "in"; + isNull: "isNull"; + notIn: "notIn"; +}>; +declare const zFiltro: z.ZodObject<{ + coluna: z.ZodString; + valor: z.ZodAny; + operador: z.ZodEnum<{ + "=": "="; + "!=": "!="; + ">": ">"; + ">=": ">="; + "<": "<"; + "<=": "<="; + like: "like"; + in: "in"; + isNull: "isNull"; + notIn: "notIn"; + }>; + ou: z.ZodOptional; +}, z.core.$strip>; + +/** + * Utilitário de configuração do Dayjs focado em compatibilidade com SSR. + * + * PROBLEMA: + * A importação direta do `dayjs` e seus plugins frequentemente causa conflitos em ambientes + * de Renderização do Lado do Servidor (SSR), como Nuxt ou Next.js, devido a discrepâncias + * na resolução de módulos (ESM vs CJS) e instabilidades de importação. + * + * SOLUÇÃO: + * Este módulo utiliza o padrão de Injeção de Dependência. Ele expõe apenas tipagens e + * uma função de configuração (`defineDayjsBr`). A responsabilidade de importar as + * bibliotecas "vivas" é delegada à aplicação consumidora (o cliente da função). + * + * Isso permite que o bundler da aplicação principal (Vite, Webpack, etc.) gerencie as + * instâncias, garantindo consistência e evitando erros de "module not found" ou + * instâncias duplicadas/não inicializadas adequadamente. + */ + +/** + * Inicializa e configura o Dayjs com o locale 'pt-br' e plugins essenciais. + * + * MODO DE USO: + * Importe os pacotes reais na sua aplicação e passe-os para esta função. + * + * @example + * ```ts + * // Em seu arquivo de configuração (ex: plugins/dayjs.ts): + * import dayjs from "dayjs" + * import duration from "dayjs/plugin/duration" + * import isSameOrAfter from "dayjs/plugin/isSameOrAfter" + * import isSameOrBefore from "dayjs/plugin/isSameOrBefore" + * import minMax from "dayjs/plugin/minMax" + * import relativeTime from "dayjs/plugin/relativeTime" + * import timezone from "dayjs/plugin/timezone" + * import utc from "dayjs/plugin/utc" + * import weekOfYear from "dayjs/plugin/weekOfYear" + * import { iniciarDayjsBr } from "p-comuns" + * import "dayjs/locale/pt-br" // Importante: importar o locale! + + * export const dayjsbr = iniciarDayjsBr({ + * dayjs, + * duration, + * isSameOrAfter, + * isSameOrBefore, + * minMax, + * relativeTime, + * timezone, + * utc, + * weekOfYear, + * }) + * ``` + */ +declare const iniciarDayjsBr: ({ dayjs, duration, isSameOrAfter, isSameOrBefore, minMax, relativeTime, timezone, utc, weekOfYear, }: { + dayjs: typeof _dayjs; + duration: typeof _duration; + isSameOrAfter: typeof _isSameOrAfter; + isSameOrBefore: typeof _isSameOrBefore; + minMax: typeof _minMax; + relativeTime: typeof _relativeTime; + timezone: typeof _timezone; + utc: typeof _utc; + weekOfYear: typeof _weekOfYear; +}) => typeof _dayjs; +/** + * @deprecated Use iniciarDayjsBr em vez de definirDayjsBr. O método defineDayjsBr está obsoleto e será removido em futuras versões. + */ +declare const defineDayjsBr: ({ dayjs, duration, isSameOrAfter, isSameOrBefore, minMax, relativeTime, timezone, utc, weekOfYear, }: { + dayjs: typeof _dayjs; + duration: typeof _duration; + isSameOrAfter: typeof _isSameOrAfter; + isSameOrBefore: typeof _isSameOrBefore; + minMax: typeof _minMax; + relativeTime: typeof _relativeTime; + timezone: typeof _timezone; + utc: typeof _utc; + weekOfYear: typeof _weekOfYear; +}) => typeof _dayjs; + +declare const link_paiol = "https://paiol.idz.one"; + +/** Níveis de severidade para o sistema de log estruturado. */ +declare enum NivelLog { + /** O mais baixo nível, ideal para rastreamento detalhado de fluxo e execução. */ + RASTREAMENTO = "RASTREAMENTO", + /** Usado para informações que ajudam a entender o estado do sistema durante a execução. */ + DEPURACAO = "DEPURACAO", + /** Informações gerais e eventos do sistema. */ + INFORMACAO = "INFORMACAO", + /** Eventos inesperados, mas que não impedem o funcionamento do sistema. */ + AVISO = "AVISO", + /** Erros que impactam o funcionamento do sistema, mas que podem ser recuperados. */ + ERRO = "ERRO", + /** O nível mais alto de severidade, indicando falhas que requerem atenção imediata. */ + CRITICO = "CRITICO" +} +type DetalheNivel = { + peso: number; + rotulo: string; + emoji: string; + metodo: "debug" | "info" | "warn" | "error"; +}; +/** Detalhes de cada nível de log — peso para filtragem, emoji e método do console. */ +declare const NivelLogDetalhes: Record; +/** Estrutura de uma entrada de log emitida pelo sistema. */ +type EntradaLog = { + timestamp: string; + nivel: keyof typeof NivelLog; + /** Identificador da aplicação/instância (ex: "front:e-licencie:12345"). */ + app: string; + /** Local no código de onde o log foi emitido (ex: "criarUsuario()"). */ + origem: string; + mensagem: string; + dados?: unknown; +}; +/** Interface pública do logger retornado por `iniciarELog`. */ +type ELogger = { + rastreamento: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + depuracao: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + info: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + aviso: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + erro: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + critico: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; +}; +/** Opções de configuração do logger, disponíveis no callback de arquivamento. */ +type OpoesELogger = { + app: string; + nivelMinimo: keyof typeof NivelLog; +}; +/** Tipo do callback de arquivamento de logs. */ +type ArquivamentoLog = (entrada: EntradaLog, opcoes: OpoesELogger) => void; +/** + * Inicializa o sistema de log estruturado. + * + * @param opcoes.app - Identificador da aplicação/instância (ex: `"front:e-licencie:12345"`) + * @param opcoes.nivelMinimo - Nível mínimo para exibição no console (padrão: INFORMACAO) + * @param opcoes.arquivamento - Callback opcional para persistir/enviar as entradas de log + * + * @example + * ```ts + * const log = iniciarELog({ app: "front:e-licencie:12345" }) + * + * log.info({ origem: "criarUsuario()", mensagem: "Usuário criado", dados: { id: "abc-123" } }) + * // → ℹ️ [Informação] [front:e-licencie:12345] [criarUsuario()] Usuário criado + * ``` + */ +declare const iniciarELog: (opcoes: { + app: string; + nivelMinimo?: keyof typeof NivelLog; + arquivamento?: ArquivamentoLog; +}) => ELogger; + +type tiposArquivo = "imagem" | "documento" | "vídeo" | "outros"; +declare const extensoes: { + ext: string; + tipo: tiposArquivo; + mime: string; +}[]; +/** + * Função que retorna o tipo do arquivo + * @param nomeArquivo + * @returns + */ +declare const tipoArquivo: (nomeArquivo: string | null | undefined) => tiposArquivo; + +/** + * ============================================================================= + * FILTRO DELTA (zFiltroDelta) + * ============================================================================= + * + * OBJETIVO + * ----------------------------------------------------------------------------- + * Novo sistema de filtros projetado para maior flexibilidade e geração segura + * de instruções SQL dinâmicas (WHERE). + * + * REGRAS IMPORTANTES (PARA IA) + * ----------------------------------------------------------------------------- + * - O filtro é composto de duas partes obrigatórias: `condicoes` e `formula`. + * - Apenas referências aos `id`s das `condicoes` podem ser usadas na `formula`. + * - Não use sintaxe baseada em objetos aninhados para agrupamento (ex: { E: [], OU: [] }). Use fórmulas em string. + * + * 1) CONDIÇÕES (`condicoes`): + * Array de objetos contendo as definições isoladas de cada comparação. + * Exemplo: + * [ + * { id: "{1}", coluna: "idade", operador: ">=", valor: 18 }, + * { id: "{2}", coluna: "nome", operador: "like", valor: "%pa%" } + * ] + * - `id`: Deve SEMPRE seguir o formato {identificador}. Ex: `{c1}`, `{idade_min}`. + * - `coluna`: O nome da coluna ou um path JSONB válido (ex: `veiculo.ano`). + * - `operador`: Um dos valores do tipo `tipoOperadorFiltroDelta` (veja a constante). + * + * 2) FÓRMULA (`formula`): + * String que define a expressão lógica relacionando as condições através de seus `id`s. + * Operadores Lógicos Suportados (EM MAIÚSCULO): + * - `E` (AND) + * - `OU` (OR) + * - `NAO` (NOT) + * Suporta o agrupamento lógico usando parênteses `()` + * Exemplo válido: "({1} E NAO({2})) OU {3}" + * + * ============================================================================= + */ +/** + * Operadores permitidos para comparação. + */ +declare const zOperadorFiltroDelta: z.ZodEnum<{ + "=": "="; + "!=": "!="; + ">": ">"; + ">=": ">="; + "<": "<"; + "<=": "<="; + like: "like"; + in: "in"; + "\u2229": "∩"; +}>; +declare const operadorFiltroDeltaDetalhes: Record, { + rotulo: string; + descricao: string; +}>; +/** + * Coluna simples ou caminho aninhado de jsonb. + */ +declare const zColunaFiltroDelta: z.ZodString; +/** + * Estrutura individual de uma condição do filtro. + */ +declare const zCondicaoFiltroDelta: z.ZodObject<{ + id: z.ZodString; + coluna: z.ZodString; + operador: z.ZodEnum<{ + "=": "="; + "!=": "!="; + ">": ">"; + ">=": ">="; + "<": "<"; + "<=": "<="; + like: "like"; + in: "in"; + "\u2229": "∩"; + }>; + valor: z.ZodAny; +}, z.core.$strip>; +/** + * Estrutura principal do filtro delta. + */ +declare const zFiltroDelta: z.ZodObject<{ + condicoes: z.ZodArray": ">"; + ">=": ">="; + "<": "<"; + "<=": "<="; + like: "like"; + in: "in"; + "\u2229": "∩"; + }>; + valor: z.ZodAny; + }, z.core.$strip>>; + formula: z.ZodString; +}, z.core.$strip>; +type tipoOperadorFiltroDelta = z.infer; +type tipoColunaFiltroDelta = z.infer; +type tipoCondicaoFiltroDelta = z.infer; +type tipoFiltroDelta = z.infer; +type tipoCondicaoFiltroDeltaTipado = tipoCondicaoFiltroDelta & { + coluna: T; +}; +type tipoFiltroDeltaColunaTipada = { + condicoes: tipoCondicaoFiltroDeltaTipado[]; + formula: string; +}; +declare const criarFiltroDelta: (filtro: tipoFiltroDeltaColunaTipada) => tipoFiltroDeltaColunaTipada; +/** + * Fábrica para criar filtros com colunas estritamente tipadas. + * Útil para autocompletar os nomes das colunas e garantir a estrutura no TypeScript. + * + * @example + * ```ts + * const { criarFiltroDelta } = iniciarFiltroDelta<"nome" | "idade" | "jsonb.propriedade">() + * + * const filtro = criarFiltroDelta({ + * condicoes: [ + * { id: "{c1}", coluna: "idade", operador: ">", valor: 18 }, + * { id: "{c2}", coluna: "nome", operador: "=", valor: "luiz" }, + * { id: "{c3}", coluna: "jsonb.propriedade", operador: "=", valor: "valor" }, + * ], + * formula: "({c1} E {c2}) OU {c3}", + * }) + * ``` + */ +declare const iniciarFiltroDelta: () => { + criarFiltroDelta: (filtro: tipoFiltroDeltaColunaTipada) => tipoFiltroDeltaColunaTipada; +}; + +/** + * LocalStorage Tipado + * Lê ou grava um valor no localStorage, mantendo o tipo genérico . + */ +declare const localValor: (chave_: string | any, valor?: T | null) => T | null; + +/** + * Trata um objeto para ser imput para postgres + * @param entrada + * @returns + */ +declare const paraObjetoRegistroPg: (entrada: { + [k: string]: any; +}) => { + [k: string]: string | boolean | null | undefined | number; +}; +declare const pgObjeto: (entrada: { + [k: string]: any; +}) => { + [k: string]: string | boolean | null | undefined | number; +}; +declare const objetoPg: (entrada: { + [k: string]: any; +}) => { + [k: string]: string | boolean | null | undefined | number; +}; + +declare enum Produtos { + "e-licencie" = "e-licencie", + "gov.e-licencie" = "gov.e-licencie" +} + +declare enum tiposSituacoesElicencie { + modelo = "000_modelo", + vencida = "100_vencida", + expirado = "200_expirado", + alerta = "300_alerta", + protocoladafora = "350_protocoladafora", + protocolada = "400_protocolada", + protocoladaApenas = "430_protocolada", + protocolada_alteracao = "450_protocolada", + prazo = "500_prazo", + emitida = "515_emitida", + valida = "518_valida", + novo = "520_novo", + recebido = "521_recebido", + em_andamento = "530_em_andamento", + aguardando = "530_aguardando", + aguardandoresposta = "540_aguardandoresposta", + suspensaotemporaria = "540_suspensaotemporaria", + cancelada = "550_cancelada", + execucao = "560_execucao", + pendente = "570_pendente", + executadafora = "600_executadafora", + executada = "700_executada", + naoexecutada = "701_naoexecutada", + concluida = "730_concluida", + respondido_negado = "740_respondido_negado", + respondido_aceito = "741_respondido_aceito", + atendidoparcial = "742_atendidoparcial", + naoatendido = "743_naoatendido", + atendido = "744_atendido", + renovada = "760_renovada", + finalizada = "800_finalizada", + emitirnota = "101_emitirnota", + faturaatrasada = "301_faturaatrasada", + pagarfatura = "302_pagarfatura", + aguardandoconfirmacao = "531_aguardandoconfirmacao", + agendado = "701_agendado", + faturapaga = "801_faturapaga", + excluida = "999_excluida", + requerida = "401_requerida", + vigente = "516_vigente", + emrenovacao = "402_emrenovacao", + arquivada = "801_arquivada", + aguardando_sincronizacao = "999_aguardando_sincronizacao", + nao_conforme = "710_nao_conforme", + conforme = "720_conforme", + nao_aplicavel = "730_nao_aplicavel", + parcial = "715_parcial" +} + +declare const umaFuncao: () => string; + +declare const umaVariavel = "Ol\u00E1 Mundo! (vari\u00E1vel)"; + +/** gerar o texto de busca removendo caracteres especies e caixa alta */ +declare const texto_busca: (...texto: any[]) => string; + +/** Gerar uma classe que facilita a gestão de rotas com a tipagem das querys + * + * Definições: + * + * caminho = "/aplicacao/funcionalidade" + * + * endereco = "http://localhost:3000/aplicacao/funcionalidade" + * + * parametros = {nome:"José"} + */ +declare class TipagemRotas { + _partesCaminho: string[]; + _acaoIr?: (endereco: string) => undefined; + rotulo: string | undefined; + /** Ao criar novo obijeto de tipagem de rota é necessário passar o caminho parcial + ** export const mCaminho = new TipagemRotas<{q:string}>("aplicacao","funcionalidade") + */ + constructor({ caminho, acaoIr, rotulo, }: { + caminho: (string | null | undefined)[] | string; + acaoIr?: undefined | ((endereco: string) => undefined); + /** Rotulo da página + * Inicio | Controle + */ + rotulo?: string; + }); + /** Retorna o caminho completo da rota + ** console.log(mCaminho.caminho) + ** "/caminho" + */ + get caminho(): string; + /** Define o caminho completo da rota + ** mCaminho.caminho = "/novoCaminho" + ** console.log(mCaminho.caminho) + ** "/novoCaminho" + ** */ + set caminho(caminhoParcial: string); + /** Retorna o caminho completo da rota com a query + ** console.log(mCaminho.resolve({q:"query"})) + ** "http://localhost:3000/caminho?q=query" + */ + endereco(query: T, usarComoHash?: boolean): string; + /** Vai para a url + ** mCaminho.ir({q:"query"}) + ** window.location.href = "http://localhost:3000/caminho?q=query" + */ + ir(query: T): void; + /** Retorna os parametros da url + ** console.log(mCaminho.parametros()) + ** {q:"query"} + */ + parametros(urlEntrada?: string): Partial; +} + +/** + * Essa variável se conecta a tabela_lidades + * + * onde sigla se conecta com sigla + * + * Usuário terá mais opções de unidades, quando fazer o envio para o mtr, usar a opção fornecida pelo usuarios, caso não tenha + * usar a normalizada + */ +declare enum siglas_unidades_medida { + UN = "UN", + KG = "KG", + TON = "TON", + g = "g", + "M³" = "M\u00B3", + Lt = "Lt" +} +declare const unidades_medida: { + sigla_unidade: keyof typeof siglas_unidades_medida; + nome: string; + sigla_normalizada: keyof typeof siglas_unidades_medida; + normalizar: (valor: number) => number; + tipo: "massa" | "volume" | "comprimento" | "unidade"; +}[]; + +/** + * Valida se uma string é um UUID válido (qualquer versão). + */ +declare const erUuid: RegExp; +declare const validarUuid: (uuid: string | number | undefined | null) => boolean; +/** + * Gera um UUID v4 (aleatório, não determinístico). + * Usa `globalThis.crypto.randomUUID()` — disponível em Node 19+, Bun e browsers modernos. + */ +declare const uuidV4: () => string; +/** + * @deprecated Use uuidV4() diretamente. + */ +declare const uuid: () => string; +/** + * Gera um UUID determinístico (versão 3) com base em uma chave e um grupo (namespace). + * Implementação pura JS (MD5), sem dependência de Node.js — funciona em browser e server. + * + * @param chave - Valor a serializar (string, number ou objeto). + * @param grupo - Namespace opcional; se omitido, usa UUID nil. + */ +declare const uuidV3: (chave: unknown, grupo?: unknown) => string; + +declare const esperar: (ms: number) => Promise; +/** + * Usado para retronat o no de uma variável, deve ser usado dentro de um objeto + * const nomex = {a: 1, b: 2} + * nomeVariavel({nomex}) // retorna "nomex" + * @param v + * @returns + */ +declare const nomeVariavel: (v: { + [key: string]: any; +}) => string; + +/** + * No futuro podemos melhorar este Zod para incluir mais formatos de coordenadas. + * + */ + +declare const zCoordenadas: z.ZodObject<{ + formato: z.ZodDefault>; + datum: z.ZodDefault>; + latitude: z.ZodNumber; + longitude: z.ZodNumber; +}, z.core.$strip>; + +declare const zDocCnpj: z.ZodString; +declare const zDocCpf: z.ZodString; +declare const zDocumento: z.ZodUnion<[z.ZodString, z.ZodString]>; + +/** + * Schema numérico que aceita strings legadas e normaliza para `number`. + * + * O campo **é** um número. O `preprocess` resolve compatibilidade com dados + * antigos onde o frontend enviava strings formatadas (BR ou monetária). + * + * Formatos de entrada aceitos: + * - `10` → number direto + * - `10.1` → ponto decimal + * - `10,1` → vírgula decimal (BR) + * - `1.000,1` → milhar com ponto + vírgula decimal (BR) + * - `R$ 10,01` → prefixo monetário legado + */ +declare const zNumero: z.ZodPreprocess; +declare const zNumeroPositivo: z.ZodPreprocess; +declare const zNumeroInteiro: z.ZodPreprocess; + +export { type ArquivamentoLog, type ELogger, type EntradaLog, NivelLog, NivelLogDetalhes, type OpoesELogger, Produtos, TipagemRotas, type TipoPayloadAuditoria, aleatorio, cacheM, cacheMFixo, cacheMemoria, camposComuns, criarFiltroDelta, defineDayjsBr, erUuid, esperar, extensoes, iniciarDayjsBr, iniciarELog, iniciarFiltroDelta, type interfaceConsulta, link_paiol, localValor, nomeVariavel, objetoPg, operadorFiltroDeltaDetalhes, operadores, paraObjetoRegistroPg, pgObjeto, siglas_unidades_medida, texto_busca, tipoArquivo, type tipoColunaFiltroDelta, type tipoCondicaoFiltroDelta, type tipoCondicaoFiltroDeltaTipado, type tipoFiltro, type tipoFiltroDelta, type tipoFiltroDeltaColunaTipada, type tipoOperadorFiltroDelta, tipoUsuarioResiduos, tiposSituacoesElicencie, tx, umaFuncao, umaVariavel, unidades_medida, uuid, uuidV3, uuidV4, uuid_null, validarUuid, verCacheM, zColunaFiltroDelta, zCondicaoFiltroDelta, zCoordenadas, zDocCnpj, zDocCpf, zDocumento, zFiltro, zFiltroDelta, zNumero, zNumeroInteiro, zNumeroPositivo, zOperadorFiltroDelta, zOperadores }; diff --git a/dist-front/index.mjs b/dist-front/index.mjs index 3100a3d..cc762c2 100644 --- a/dist-front/index.mjs +++ b/dist-front/index.mjs @@ -1 +1 @@ -var f="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),oo=o=>`eli-${Array.from({length:o||8}).map(()=>f[(999*Math.random()|0)%f.length]).join("")}`;var g={};globalThis.cacheMemoria_cache=g;var x=(o,e,a)=>{let n=typeof o=="string"?o:typeof o=="number"?String(o):encodeURIComponent(JSON.stringify(o)),r=a&&new Date().getTime()+a*1e3;e!==void 0&&(g[n]={valor:e,validade:r});let i=g[n];if(!(i?.validade&&i.validadeg,to=x,ao=o=>e=>x(o,e);var io="00000000-0000-0000-0000-000000000000",h=(d=>(d.codigo="codigo",d.excluido="excluido",d.data_hora_criacao="data_hora_criacao",d.data_hora_atualizacao="data_hora_atualizacao",d.codigo_usuario_criacao="codigo_usuario_criacao",d.codigo_usuario_atualizacao="codigo_usuario_atualizacao",d.versao="versao",d))(h||{}),A=(e=>(e.token="token",e))(A||{}),T=(a=>(a.Usuario="usuario",a.Fornecedor="fornecedor",a))(T||{});import p from"zod";var N=(r=>(r["="]="=",r["!="]="!=",r[">"]=">",r[">="]=">=",r["<"]="<",r["<="]="<=",r.like="like",r.in="in",r.isNull="isNull",r.notIn="notIn",r))(N||{}),z=p.enum(["=","!=",">",">=","<","<=","like","in","isNull","notIn"]),lo=p.object({coluna:p.string(),valor:p.any(),operador:z,ou:p.boolean().optional()});var w=({dayjs:o,duration:e,isSameOrAfter:a,isSameOrBefore:n,minMax:r,relativeTime:i,timezone:m,utc:d,weekOfYear:O})=>(o.extend(d),o.extend(m),o.extend(O),o.extend(n),o.extend(a),o.extend(r),o.extend(i),o.extend(e),o.locale("pt-br"),o),uo=w;var co="https://paiol.idz.one";var C=(m=>(m.RASTREAMENTO="RASTREAMENTO",m.DEPURACAO="DEPURACAO",m.INFORMACAO="INFORMACAO",m.AVISO="AVISO",m.ERRO="ERRO",m.CRITICO="CRITICO",m))(C||{}),v={RASTREAMENTO:{peso:1,rotulo:"Rastreamento",emoji:"\u{1F50D}",metodo:"debug"},DEPURACAO:{peso:2,rotulo:"Depura\xE7\xE3o",emoji:"\u{1F41B}",metodo:"debug"},INFORMACAO:{peso:3,rotulo:"Informa\xE7\xE3o",emoji:"\u2139\uFE0F",metodo:"info"},AVISO:{peso:4,rotulo:"Aviso",emoji:"\u26A0\uFE0F",metodo:"warn"},ERRO:{peso:5,rotulo:"Erro",emoji:"\u274C",metodo:"error"},CRITICO:{peso:6,rotulo:"Cr\xEDtico",emoji:"\u{1F525}",metodo:"error"}},D=o=>{let e=o.nivelMinimo??"INFORMACAO",a=v[e].peso,n=(r,i)=>{let m=v[r];if(m.peson("RASTREAMENTO",r),depuracao:r=>n("DEPURACAO",r),info:r=>n("INFORMACAO",r),aviso:r=>n("AVISO",r),erro:r=>n("ERRO",r),critico:r=>n("CRITICO",r)}},yo=D({app:"testando",nivelMinimo:"INFORMACAO",arquivamento:()=>{}});var j=[{ext:"gif",tipo:"imagem",mime:"image/gif"},{ext:"jpg",tipo:"imagem",mime:"image/jpeg"},{ext:"jpeg",tipo:"imagem",mime:"image/jpeg"},{ext:"png",tipo:"imagem",mime:"image/png"},{ext:"bmp",tipo:"imagem",mime:"image/bmp"},{ext:"webp",tipo:"imagem",mime:"image/webp"},{ext:"tiff",tipo:"imagem",mime:"image/tiff"},{ext:"svg",tipo:"imagem",mime:"image/svg+xml"},{ext:"ico",tipo:"imagem",mime:"image/x-icon"},{ext:"pdf",tipo:"documento",mime:"application/pdf"},{ext:"doc",tipo:"documento",mime:"application/msword"},{ext:"docx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"},{ext:"xls",tipo:"documento",mime:"application/vnd.ms-excel"},{ext:"xlsx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},{ext:"ppt",tipo:"documento",mime:"application/vnd.ms-powerpoint"},{ext:"pptx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.presentationml.presentation"},{ext:"txt",tipo:"documento",mime:"text/plain"},{ext:"odt",tipo:"documento",mime:"application/vnd.oasis.opendocument.text"},{ext:"ods",tipo:"documento",mime:"application/vnd.oasis.opendocument.spreadsheet"},{ext:"rtf",tipo:"documento",mime:"application/rtf"},{ext:"csv",tipo:"documento",mime:"text/csv"},{ext:"mp4",tipo:"v\xEDdeo",mime:"video/mp4"},{ext:"avi",tipo:"v\xEDdeo",mime:"video/x-msvideo"},{ext:"mkv",tipo:"v\xEDdeo",mime:"video/x-matroska"},{ext:"mov",tipo:"v\xEDdeo",mime:"video/quicktime"},{ext:"wmv",tipo:"v\xEDdeo",mime:"video/x-ms-wmv"},{ext:"flv",tipo:"v\xEDdeo",mime:"video/x-flv"},{ext:"webm",tipo:"v\xEDdeo",mime:"video/webm"},{ext:"3gp",tipo:"v\xEDdeo",mime:"video/3gpp"},{ext:"mpeg",tipo:"v\xEDdeo",mime:"video/mpeg"}],bo=o=>{let e=String(o||"").toLocaleLowerCase().split(".").pop();return j.find(n=>n.ext===e)?.tipo||"outros"};import s from"zod";var F=s.enum([">","<",">=","<=","=","!=","in","like","\u2229"]),Ao={">":{rotulo:"Maior que",descricao:"O valor de A deve ser maior que o valor de B"},"<":{rotulo:"Menor que",descricao:"O valor de A deve ser menor que o valor de B"},">=":{rotulo:"Maior ou igual a",descricao:"O valor de A deve ser maior ou igual ao valor de B"},"<=":{rotulo:"Menor ou igual a",descricao:"O valor de A deve ser menor ou igual ao valor de B"},"=":{rotulo:"Igual a",descricao:"O valor de A deve ser igual ao valor de B"},"!=":{rotulo:"Diferente de",descricao:"O valor de A deve ser diferente do valor de B"},in:{rotulo:"Est\xE1 em",descricao:"O valor de A deve estar presente na cole\xE7\xE3o ou lista definida em B"},like:{rotulo:"Cont\xE9m",descricao:"O valor de A deve conter o texto informado em B"},"\u2229":{rotulo:"Interse\xE7\xE3o",descricao:"A e B devem possuir pelo menos um elemento em comum"}},k=/^\{[\w:]+\}$/,I=/^\w+(\.\w+)*$/,R=s.string().regex(I,"Coluna inv\xE1lida").describe("nome da coluna ou caminho aninhado do jsonb"),L=s.object({id:s.string().describe("id da condi\xE7\xE3o do filtro").regex(k,"O id deve seguir o formato {identificador}"),coluna:R,operador:F,valor:s.any().describe("valor de compara\xE7\xE3o")}),M=o=>{let a=(o.match(/\{[\w:]+\}|\bNAO\b|\bE\b|\bOU\b|\(|\)/g)||[]).join(""),n=o.replace(/\s+/g,""),r=a.replace(/\s+/g,"");if(n!==r)return!1;let i=o.replace(/\{[\w:]+\}/g,"true").replace(/\bNAO\b/g,"!").replace(/\bE\b/g,"&&").replace(/\bOU\b/g,"||");try{return new Function(`return (${i})`)(),!0}catch{return!1}},U=s.object({condicoes:s.array(L),formula:s.string().refine(M,{message:"F\xF3rmula inv\xE1lida. Use apenas refer\xEAncias de condi\xE7\xF5es {id} ou {id:sufixo}, operadores E/OU/NAO e par\xEAnteses."})}).superRefine((o,e)=>{let a=new Set(o.condicoes.map(r=>r.id)),n=o.formula.match(/\{[\w:]+\}/g)||[];for(let r of n)a.has(r)||e.addIssue({code:"custom",path:["formula"],message:`A refer\xEAncia ${r} n\xE3o existe em condicoes.`})}),X=o=>U.parse(o),To=()=>({criarFiltroDelta:X});var zo=(o,e)=>{let a="localStorage"in globalThis?globalThis.localStorage:void 0;if(typeof a>"u")return null;let n=typeof o=="string"?o:encodeURIComponent(JSON.stringify(o));try{e!==void 0&&a.setItem(n,JSON.stringify(e));let r=a.getItem(n);if(r===null)return null;try{return JSON.parse(r)}catch{return r}}catch{return null}};var y=o=>{try{return Object.fromEntries(Object.entries(o).map(([e,a])=>[e,a===void 0||a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean"?a:JSON.stringify(a,null,2)]))}catch(e){throw new Error(`Erro na fun\xE7\xE3o paraObjetoRegistroPg: ${e.message} ${e.stack}`)}},Co=y,Do=y;var q=(o=>(o["e-licencie"]="e-licencie",o["gov.e-licencie"]="gov.e-licencie",o))(q||{});var $=(t=>(t.modelo="000_modelo",t.vencida="100_vencida",t.expirado="200_expirado",t.alerta="300_alerta",t.protocoladafora="350_protocoladafora",t.protocolada="400_protocolada",t.protocoladaApenas="430_protocolada",t.protocolada_alteracao="450_protocolada",t.prazo="500_prazo",t.emitida="515_emitida",t.valida="518_valida",t.novo="520_novo",t.recebido="521_recebido",t.em_andamento="530_em_andamento",t.aguardando="530_aguardando",t.aguardandoresposta="540_aguardandoresposta",t.suspensaotemporaria="540_suspensaotemporaria",t.cancelada="550_cancelada",t.execucao="560_execucao",t.pendente="570_pendente",t.executadafora="600_executadafora",t.executada="700_executada",t.naoexecutada="701_naoexecutada",t.concluida="730_concluida",t.respondido_negado="740_respondido_negado",t.respondido_aceito="741_respondido_aceito",t.atendidoparcial="742_atendidoparcial",t.naoatendido="743_naoatendido",t.atendido="744_atendido",t.renovada="760_renovada",t.finalizada="800_finalizada",t.emitirnota="101_emitirnota",t.faturaatrasada="301_faturaatrasada",t.pagarfatura="302_pagarfatura",t.aguardandoconfirmacao="531_aguardandoconfirmacao",t.agendado="701_agendado",t.faturapaga="801_faturapaga",t.excluida="999_excluida",t.requerida="401_requerida",t.vigente="516_vigente",t.emrenovacao="402_emrenovacao",t.arquivada="801_arquivada",t.aguardando_sincronizacao="999_aguardando_sincronizacao",t.nao_conforme="710_nao_conforme",t.conforme="720_conforme",t.nao_aplicavel="730_nao_aplicavel",t.parcial="715_parcial",t))($||{});var Io=()=>"Ol\xE1 Mundo! (fun\xE7\xE3o)";var Lo="Ol\xE1 Mundo! (vari\xE1vel)";var $o=(...o)=>o.map(e=>e==null?"":String(e).normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\s+/g," ").toLowerCase()).join(" ");var _=class{constructor({caminho:e,acaoIr:a,rotulo:n}){this._partesCaminho=[];this._acaoIr=a,this._partesCaminho=(Array.isArray(e)?e:[e]).filter(Boolean).map(r=>String(r)).flatMap(r=>r.split("/")).filter(Boolean),this.rotulo=n}get caminho(){return`/${this._partesCaminho.join("/")}`}set caminho(e){this._partesCaminho=e.split("/").filter(a=>a)}endereco(e,a){let n=typeof globalThis<"u"&&globalThis.window||void 0,r=new URL(n?n.location.href:"http://localhost");r.pathname=this.caminho,r.search="";let i=Object.entries(e);for(let[m,d]of i)r.searchParams.set(String(m),JSON.stringify(d));return r.hash="",a&&(r.hash=`#${r.search}`,r.search=""),r.href}ir(e){if(this._acaoIr)this._acaoIr(this.endereco({...e}));else{let a=typeof globalThis<"u"&&globalThis.window||void 0;a&&(a.location.href=this.endereco({...e}))}}parametros(e){let a=e?new URL(e):new URL(typeof globalThis<"u"&&globalThis.window?globalThis.window.location.href:"http://localhost"),n=a.searchParams,r=Object.fromEntries(n.entries()),i=a.hash;if(i){let m=Object.fromEntries(new URLSearchParams(i.slice(1)).entries());r={...r,...m}}for(let m in r)try{r[m]=JSON.parse(r[m])}catch{console.log(`[${m}|${r[m]}] n\xE3o \xE9 um json v\xE1lido.`)}return r}};var P=(i=>(i.UN="UN",i.KG="KG",i.TON="TON",i.g="g",i["M\xB3"]="M\xB3",i.Lt="Lt",i))(P||{}),Vo=[{sigla_unidade:"KG",nome:"Quilograma",sigla_normalizada:"KG",normalizar:o=>o,tipo:"massa"},{sigla_unidade:"g",nome:"Grama",sigla_normalizada:"KG",normalizar:o=>o/1e3,tipo:"massa"},{sigla_unidade:"TON",nome:"Tonelada",sigla_normalizada:"KG",normalizar:o=>o*1e3,tipo:"massa"},{sigla_unidade:"Lt",nome:"Litro",sigla_normalizada:"Lt",normalizar:o=>o,tipo:"volume"},{sigla_unidade:"M\xB3",nome:"Metro C\xFAbico",sigla_normalizada:"Lt",normalizar:o=>o*1e3,tipo:"volume"},{sigla_unidade:"UN",nome:"Unidade",sigla_normalizada:"UN",normalizar:o=>o,tipo:"unidade"}];import{createHash as B,randomUUID as V}from"crypto";var J=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ko=o=>J.test(String(o||"")),G="00000000-0000-0000-0000-000000000000",K=o=>{let e=o.slice(0,32);return[e.slice(0,8),e.slice(8,12),`3${e.slice(13,16)}`,`${(Number.parseInt(e[16],16)&3|8).toString(16)}${e.slice(17,20)}`,e.slice(20,32)].join("-")},Y=(o,e)=>{let a=e?Y(e):G,n=typeof o=="string"?o:typeof o=="number"?String(o):JSON.stringify(o),r=B("md5").update(a+n).digest("hex");return K(r)},Z=()=>V(),Yo=Z;var Ho=o=>new Promise(e=>setTimeout(()=>e(!0),o)),Qo=o=>Object.keys(o).join("/");import u from"zod";var Eo=u.object({formato:u.literal("decimal").default("decimal"),datum:u.literal("EPSG:4326").default("EPSG:4326"),latitude:u.number(),longitude:u.number()});import b from"zod";var H=/^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/,Q=/^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}\/[A-Z0-9]{4}-\d{2}$/i,W=Number(new Date().toISOString().slice(0,7).replace("-","")),S=b.string().regex(W<202407?H:Q).describe("Documento (CNPJ) no formato XX.XXX.XXX/XXXX-XX"),E=b.string().regex(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/).describe("Documento (CPF) no formato XXX.XXX.XXX-XX"),re=E.or(S).describe("CPF ou CNPJ");import l from"zod";var c=o=>{if(typeof o=="number"||typeof o!="string")return o;let e=o;return e.includes(",")&&(e=e.replace(/\./g,"").replace(",",".")),e=e.replace(/[^0-9.]/g,""),e==""?null:Number(e)},ne=l.preprocess(c,l.number()),ie=l.preprocess(c,l.number().positive()),me=l.preprocess(c,l.number().int());export{C as NivelLog,v as NivelLogDetalhes,q as Produtos,_ as TipagemRotas,oo as aleatorio,x as cacheM,ao as cacheMFixo,to as cacheMemoria,h as camposComuns,X as criarFiltroDelta,uo as defineDayjsBr,J as erUuid,Ho as esperar,j as extensoes,w as iniciarDayjsBr,D as iniciarELog,To as iniciarFiltroDelta,co as link_paiol,zo as localValor,Qo as nomeVariavel,Do as objetoPg,Ao as operadorFiltroDeltaDetalhes,N as operadores,y as paraObjetoRegistroPg,Co as pgObjeto,P as siglas_unidades_medida,$o as texto_busca,bo as tipoArquivo,T as tipoUsuarioResiduos,$ as tiposSituacoesElicencie,A as tx,Io as umaFuncao,Lo as umaVariavel,Vo as unidades_medida,Yo as uuid,Y as uuidV3,Z as uuidV4,io as uuid_null,Ko as validarUuid,ro as verCacheM,R as zColunaFiltroDelta,L as zCondicaoFiltroDelta,Eo as zCoordenadas,S as zDocCnpj,E as zDocCpf,re as zDocumento,lo as zFiltro,U as zFiltroDelta,ne as zNumero,me as zNumeroInteiro,ie as zNumeroPositivo,F as zOperadorFiltroDelta,z as zOperadores}; +var j="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),ce=e=>`eli-${Array.from({length:e||8}).map(()=>j[(999*Math.random()|0)%j.length]).join("")}`;var z={};globalThis.cacheMemoria_cache=z;var F=(e,o,t)=>{let i=typeof e=="string"?e:typeof e=="number"?String(e):encodeURIComponent(JSON.stringify(e)),r=t&&new Date().getTime()+t*1e3;o!==void 0&&(z[i]={valor:o,validade:r});let n=z[i];if(!(n?.validade&&n.validadez,ve=F,ye=e=>o=>F(e,o);var be="00000000-0000-0000-0000-000000000000",R=(s=>(s.codigo="codigo",s.excluido="excluido",s.data_hora_criacao="data_hora_criacao",s.data_hora_atualizacao="data_hora_atualizacao",s.codigo_usuario_criacao="codigo_usuario_criacao",s.codigo_usuario_atualizacao="codigo_usuario_atualizacao",s.versao="versao",s))(R||{}),U=(o=>(o.token="token",o))(U||{}),X=(t=>(t.Usuario="usuario",t.Fornecedor="fornecedor",t))(X||{});import b from"zod";var $=(r=>(r["="]="=",r["!="]="!=",r[">"]=">",r[">="]=">=",r["<"]="<",r["<="]="<=",r.like="like",r.in="in",r.isNull="isNull",r.notIn="notIn",r))($||{}),q=b.enum(["=","!=",">",">=","<","<=","like","in","isNull","notIn"]),Ae=b.object({coluna:b.string(),valor:b.any(),operador:q,ou:b.boolean().optional()});var P=({dayjs:e,duration:o,isSameOrAfter:t,isSameOrBefore:i,minMax:r,relativeTime:n,timezone:m,utc:s,weekOfYear:C})=>(e.extend(s),e.extend(m),e.extend(C),e.extend(i),e.extend(t),e.extend(r),e.extend(n),e.extend(o),e.locale("pt-br"),e),we=P;var ze="https://paiol.idz.one";var B=(m=>(m.RASTREAMENTO="RASTREAMENTO",m.DEPURACAO="DEPURACAO",m.INFORMACAO="INFORMACAO",m.AVISO="AVISO",m.ERRO="ERRO",m.CRITICO="CRITICO",m))(B||{}),k={RASTREAMENTO:{peso:1,rotulo:"Rastreamento",emoji:"\u{1F50D}",metodo:"debug"},DEPURACAO:{peso:2,rotulo:"Depura\xE7\xE3o",emoji:"\u{1F41B}",metodo:"debug"},INFORMACAO:{peso:3,rotulo:"Informa\xE7\xE3o",emoji:"\u2139\uFE0F",metodo:"info"},AVISO:{peso:4,rotulo:"Aviso",emoji:"\u26A0\uFE0F",metodo:"warn"},ERRO:{peso:5,rotulo:"Erro",emoji:"\u274C",metodo:"error"},CRITICO:{peso:6,rotulo:"Cr\xEDtico",emoji:"\u{1F525}",metodo:"error"}},V=e=>{let o=e.nivelMinimo??"INFORMACAO",t=k[o].peso,i=(r,n)=>{let m=k[r];if(m.pesoi("RASTREAMENTO",r),depuracao:r=>i("DEPURACAO",r),info:r=>i("INFORMACAO",r),aviso:r=>i("AVISO",r),erro:r=>i("ERRO",r),critico:r=>i("CRITICO",r)}},Fe=V({app:"testando",nivelMinimo:"INFORMACAO",arquivamento:()=>{}});var J=[{ext:"gif",tipo:"imagem",mime:"image/gif"},{ext:"jpg",tipo:"imagem",mime:"image/jpeg"},{ext:"jpeg",tipo:"imagem",mime:"image/jpeg"},{ext:"png",tipo:"imagem",mime:"image/png"},{ext:"bmp",tipo:"imagem",mime:"image/bmp"},{ext:"webp",tipo:"imagem",mime:"image/webp"},{ext:"tiff",tipo:"imagem",mime:"image/tiff"},{ext:"svg",tipo:"imagem",mime:"image/svg+xml"},{ext:"ico",tipo:"imagem",mime:"image/x-icon"},{ext:"pdf",tipo:"documento",mime:"application/pdf"},{ext:"doc",tipo:"documento",mime:"application/msword"},{ext:"docx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"},{ext:"xls",tipo:"documento",mime:"application/vnd.ms-excel"},{ext:"xlsx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},{ext:"ppt",tipo:"documento",mime:"application/vnd.ms-powerpoint"},{ext:"pptx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.presentationml.presentation"},{ext:"txt",tipo:"documento",mime:"text/plain"},{ext:"odt",tipo:"documento",mime:"application/vnd.oasis.opendocument.text"},{ext:"ods",tipo:"documento",mime:"application/vnd.oasis.opendocument.spreadsheet"},{ext:"rtf",tipo:"documento",mime:"application/rtf"},{ext:"csv",tipo:"documento",mime:"text/csv"},{ext:"mp4",tipo:"v\xEDdeo",mime:"video/mp4"},{ext:"avi",tipo:"v\xEDdeo",mime:"video/x-msvideo"},{ext:"mkv",tipo:"v\xEDdeo",mime:"video/x-matroska"},{ext:"mov",tipo:"v\xEDdeo",mime:"video/quicktime"},{ext:"wmv",tipo:"v\xEDdeo",mime:"video/x-ms-wmv"},{ext:"flv",tipo:"v\xEDdeo",mime:"video/x-flv"},{ext:"webm",tipo:"v\xEDdeo",mime:"video/webm"},{ext:"3gp",tipo:"v\xEDdeo",mime:"video/3gpp"},{ext:"mpeg",tipo:"v\xEDdeo",mime:"video/mpeg"}],Ie=e=>{let o=String(e||"").toLocaleLowerCase().split(".").pop();return J.find(i=>i.ext===o)?.tipo||"outros"};import u from"zod";var G=u.enum([">","<",">=","<=","=","!=","in","like","\u2229"]),Re={">":{rotulo:"Maior que",descricao:"O valor de A deve ser maior que o valor de B"},"<":{rotulo:"Menor que",descricao:"O valor de A deve ser menor que o valor de B"},">=":{rotulo:"Maior ou igual a",descricao:"O valor de A deve ser maior ou igual ao valor de B"},"<=":{rotulo:"Menor ou igual a",descricao:"O valor de A deve ser menor ou igual ao valor de B"},"=":{rotulo:"Igual a",descricao:"O valor de A deve ser igual ao valor de B"},"!=":{rotulo:"Diferente de",descricao:"O valor de A deve ser diferente do valor de B"},in:{rotulo:"Est\xE1 em",descricao:"O valor de A deve estar presente na cole\xE7\xE3o ou lista definida em B"},like:{rotulo:"Cont\xE9m",descricao:"O valor de A deve conter o texto informado em B"},"\u2229":{rotulo:"Interse\xE7\xE3o",descricao:"A e B devem possuir pelo menos um elemento em comum"}},K=/^\{[\w:]+\}$/,Y=/^\w+(\.\w+)*$/,Z=u.string().regex(Y,"Coluna inv\xE1lida").describe("nome da coluna ou caminho aninhado do jsonb"),H=u.object({id:u.string().describe("id da condi\xE7\xE3o do filtro").regex(K,"O id deve seguir o formato {identificador}"),coluna:Z,operador:G,valor:u.any().describe("valor de compara\xE7\xE3o")}),Q=e=>{let t=(e.match(/\{[\w:]+\}|\bNAO\b|\bE\b|\bOU\b|\(|\)/g)||[]).join(""),i=e.replace(/\s+/g,""),r=t.replace(/\s+/g,"");if(i!==r)return!1;let n=e.replace(/\{[\w:]+\}/g,"true").replace(/\bNAO\b/g,"!").replace(/\bE\b/g,"&&").replace(/\bOU\b/g,"||");try{return new Function(`return (${n})`)(),!0}catch{return!1}},S=u.object({condicoes:u.array(H),formula:u.string().refine(Q,{message:"F\xF3rmula inv\xE1lida. Use apenas refer\xEAncias de condi\xE7\xF5es {id} ou {id:sufixo}, operadores E/OU/NAO e par\xEAnteses."})}).superRefine((e,o)=>{let t=new Set(e.condicoes.map(r=>r.id)),i=e.formula.match(/\{[\w:]+\}/g)||[];for(let r of i)t.has(r)||o.addIssue({code:"custom",path:["formula"],message:`A refer\xEAncia ${r} n\xE3o existe em condicoes.`})}),W=e=>S.parse(e),Ue=()=>({criarFiltroDelta:W});var $e=(e,o)=>{let t="localStorage"in globalThis?globalThis.localStorage:void 0;if(typeof t>"u")return null;let i=typeof e=="string"?e:encodeURIComponent(JSON.stringify(e));try{o!==void 0&&t.setItem(i,JSON.stringify(o));let r=t.getItem(i);if(r===null)return null;try{return JSON.parse(r)}catch{return r}}catch{return null}};var I=e=>{try{return Object.fromEntries(Object.entries(e).map(([o,t])=>[o,t===void 0||t==null||typeof t=="string"||typeof t=="number"||typeof t=="boolean"?t:JSON.stringify(t,null,2)]))}catch(o){throw new Error(`Erro na fun\xE7\xE3o paraObjetoRegistroPg: ${o.message} ${o.stack}`)}},Pe=I,Be=I;var E=(e=>(e["e-licencie"]="e-licencie",e["gov.e-licencie"]="gov.e-licencie",e))(E||{});var ee=(a=>(a.modelo="000_modelo",a.vencida="100_vencida",a.expirado="200_expirado",a.alerta="300_alerta",a.protocoladafora="350_protocoladafora",a.protocolada="400_protocolada",a.protocoladaApenas="430_protocolada",a.protocolada_alteracao="450_protocolada",a.prazo="500_prazo",a.emitida="515_emitida",a.valida="518_valida",a.novo="520_novo",a.recebido="521_recebido",a.em_andamento="530_em_andamento",a.aguardando="530_aguardando",a.aguardandoresposta="540_aguardandoresposta",a.suspensaotemporaria="540_suspensaotemporaria",a.cancelada="550_cancelada",a.execucao="560_execucao",a.pendente="570_pendente",a.executadafora="600_executadafora",a.executada="700_executada",a.naoexecutada="701_naoexecutada",a.concluida="730_concluida",a.respondido_negado="740_respondido_negado",a.respondido_aceito="741_respondido_aceito",a.atendidoparcial="742_atendidoparcial",a.naoatendido="743_naoatendido",a.atendido="744_atendido",a.renovada="760_renovada",a.finalizada="800_finalizada",a.emitirnota="101_emitirnota",a.faturaatrasada="301_faturaatrasada",a.pagarfatura="302_pagarfatura",a.aguardandoconfirmacao="531_aguardandoconfirmacao",a.agendado="701_agendado",a.faturapaga="801_faturapaga",a.excluida="999_excluida",a.requerida="401_requerida",a.vigente="516_vigente",a.emrenovacao="402_emrenovacao",a.arquivada="801_arquivada",a.aguardando_sincronizacao="999_aguardando_sincronizacao",a.nao_conforme="710_nao_conforme",a.conforme="720_conforme",a.nao_aplicavel="730_nao_aplicavel",a.parcial="715_parcial",a))(ee||{});var Ke=()=>"Ol\xE1 Mundo! (fun\xE7\xE3o)";var Ze="Ol\xE1 Mundo! (vari\xE1vel)";var Ee=(...e)=>e.map(o=>o==null?"":String(o).normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\s+/g," ").toLowerCase()).join(" ");var L=class{constructor({caminho:o,acaoIr:t,rotulo:i}){this._partesCaminho=[];this._acaoIr=t,this._partesCaminho=(Array.isArray(o)?o:[o]).filter(Boolean).map(r=>String(r)).flatMap(r=>r.split("/")).filter(Boolean),this.rotulo=i}get caminho(){return`/${this._partesCaminho.join("/")}`}set caminho(o){this._partesCaminho=o.split("/").filter(t=>t)}endereco(o,t){let i=typeof globalThis<"u"&&globalThis.window||void 0,r=new URL(i?i.location.href:"http://localhost");r.pathname=this.caminho,r.search="";let n=Object.entries(o);for(let[m,s]of n)r.searchParams.set(String(m),JSON.stringify(s));return r.hash="",t&&(r.hash=`#${r.search}`,r.search=""),r.href}ir(o){if(this._acaoIr)this._acaoIr(this.endereco({...o}));else{let t=typeof globalThis<"u"&&globalThis.window||void 0;t&&(t.location.href=this.endereco({...o}))}}parametros(o){let t=o?new URL(o):new URL(typeof globalThis<"u"&&globalThis.window?globalThis.window.location.href:"http://localhost"),i=t.searchParams,r=Object.fromEntries(i.entries()),n=t.hash;if(n){let m=Object.fromEntries(new URLSearchParams(n.slice(1)).entries());r={...r,...m}}for(let m in r)try{r[m]=JSON.parse(r[m])}catch{console.log(`[${m}|${r[m]}] n\xE3o \xE9 um json v\xE1lido.`)}return r}};var oe=(n=>(n.UN="UN",n.KG="KG",n.TON="TON",n.g="g",n["M\xB3"]="M\xB3",n.Lt="Lt",n))(oe||{}),ro=[{sigla_unidade:"KG",nome:"Quilograma",sigla_normalizada:"KG",normalizar:e=>e,tipo:"massa"},{sigla_unidade:"g",nome:"Grama",sigla_normalizada:"KG",normalizar:e=>e/1e3,tipo:"massa"},{sigla_unidade:"TON",nome:"Tonelada",sigla_normalizada:"KG",normalizar:e=>e*1e3,tipo:"massa"},{sigla_unidade:"Lt",nome:"Litro",sigla_normalizada:"Lt",normalizar:e=>e,tipo:"volume"},{sigla_unidade:"M\xB3",nome:"Metro C\xFAbico",sigla_normalizada:"Lt",normalizar:e=>e*1e3,tipo:"volume"},{sigla_unidade:"UN",nome:"Unidade",sigla_normalizada:"UN",normalizar:e=>e,tipo:"unidade"}];var re=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,ao=e=>re.test(String(e||"")),te=()=>globalThis.crypto.randomUUID(),no=te,ae="00000000-0000-0000-0000-000000000000",ne=(e,o)=>e<>>32-o,ie=e=>{let o=new TextEncoder().encode(e),t=o.length,i=t*8,r=t%64<56?56-t%64:120-t%64,n=new Uint8Array(t+r+8);n.set(o),n[t]=128;let m=new DataView(n.buffer);m.setUint32(t+r,i>>>0,!0),m.setUint32(t+r+4,Math.floor(i/2**32),!0);let s=Array.from({length:64},(v,g)=>Math.abs(Math.sin(g+1))*2**32>>>0),C=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21],h=1732584193,A=4023233417,T=2562383102,w=271733878;for(let v=0;v>>0,c=p,p=f,f=l,l=l+ne(x,C[d])>>>0}h=h+c>>>0,A=A+l>>>0,T=T+f>>>0,w=w+p>>>0}let N=v=>{let g="";for(let c=0;c<4;c++)g+=(v>>>c*8&255).toString(16).padStart(2,"0");return g};return N(h)+N(A)+N(T)+N(w)},me=e=>{let o=e.slice(0,32),t=(Number.parseInt(o[16],16)&3|8).toString(16);return`${o.slice(0,8)}-${o.slice(8,12)}-3${o.slice(13,16)}-${t}${o.slice(17,20)}-${o.slice(20,32)}`},de=(e,o)=>{let t=o?de(o):ae,i=typeof e=="string"?e:typeof e=="number"?String(e):JSON.stringify(e);return me(ie(t+i))};var mo=e=>new Promise(o=>setTimeout(()=>o(!0),e)),so=e=>Object.keys(e).join("/");import O from"zod";var uo=O.object({formato:O.literal("decimal").default("decimal"),datum:O.literal("EPSG:4326").default("EPSG:4326"),latitude:O.number(),longitude:O.number()});import M from"zod";var se=/^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/,le=/^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}\/[A-Z0-9]{4}-\d{2}$/i,pe=Number(new Date().toISOString().slice(0,7).replace("-","")),ue=M.string().regex(pe<202407?se:le).describe("Documento (CNPJ) no formato XX.XXX.XXX/XXXX-XX"),ge=M.string().regex(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/).describe("Documento (CPF) no formato XXX.XXX.XXX-XX"),fo=ge.or(ue).describe("CPF ou CNPJ");import y from"zod";var D=e=>{if(typeof e=="number"||typeof e!="string")return e;let o=e;return o.includes(",")&&(o=o.replace(/\./g,"").replace(",",".")),o=o.replace(/[^0-9.]/g,""),o==""?null:Number(o)},yo=y.preprocess(D,y.number()),_o=y.preprocess(D,y.number().positive()),bo=y.preprocess(D,y.number().int());export{B as NivelLog,k as NivelLogDetalhes,E as Produtos,L as TipagemRotas,ce as aleatorio,F as cacheM,ye as cacheMFixo,ve as cacheMemoria,R as camposComuns,W as criarFiltroDelta,we as defineDayjsBr,re as erUuid,mo as esperar,J as extensoes,P as iniciarDayjsBr,V as iniciarELog,Ue as iniciarFiltroDelta,ze as link_paiol,$e as localValor,so as nomeVariavel,Be as objetoPg,Re as operadorFiltroDeltaDetalhes,$ as operadores,I as paraObjetoRegistroPg,Pe as pgObjeto,oe as siglas_unidades_medida,Ee as texto_busca,Ie as tipoArquivo,X as tipoUsuarioResiduos,ee as tiposSituacoesElicencie,U as tx,Ke as umaFuncao,Ze as umaVariavel,ro as unidades_medida,no as uuid,de as uuidV3,te as uuidV4,be as uuid_null,ao as validarUuid,xe as verCacheM,Z as zColunaFiltroDelta,H as zCondicaoFiltroDelta,uo as zCoordenadas,ue as zDocCnpj,ge as zDocCpf,fo as zDocumento,Ae as zFiltro,S as zFiltroDelta,yo as zNumero,bo as zNumeroInteiro,_o as zNumeroPositivo,G as zOperadorFiltroDelta,q as zOperadores}; diff --git a/package.json b/package.json index 5c84011..b691e01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "p-comuns", - "version": "0.354.0", + "version": "0.355.0", "description": "", "main": "./dist-front/index.mjs", "module": "./dist-front/index.mjs", diff --git a/src/uuid.ts b/src/uuid.ts index 64b1f53..d65b503 100755 --- a/src/uuid.ts +++ b/src/uuid.ts @@ -1,45 +1,122 @@ -import { createHash, randomUUID } from "node:crypto" - /** * Valida se uma string é um UUID válido (qualquer versão). - * - * @param valor - A string que será validada. - * @returns booleano indicando se é um UUID válido. */ export const erUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i export const validarUuid = (uuid: string | number | undefined | null) => { - const retorno = erUuid.test(String(uuid || "")) - return retorno + return erUuid.test(String(uuid || "")) } +// ── UUID v4 ────────────────────────────────────────────────────────────────── +// Usa Web Crypto API (globalThis.crypto), disponível em Node 19+, Bun e browsers. + +/** + * Gera um UUID v4 (aleatório, não determinístico). + * Usa `globalThis.crypto.randomUUID()` — disponível em Node 19+, Bun e browsers modernos. + */ +export const uuidV4 = (): string => globalThis.crypto.randomUUID() + +/** + * @deprecated Use uuidV4() diretamente. + */ +export const uuid = uuidV4 + +// ── UUID v3 (MD5 determinístico) ────────────────────────────────────────────── +// Implementação pura sem dependência de Node.js para compatibilidade front+back. + const NIL_UUID = "00000000-0000-0000-0000-000000000000" -/** - * Formata um hash MD5 (32 hex chars) no formato UUID v3. - */ +// Rotação de 32 bits à esquerda +const rotL = (x: number, n: number) => (x << n) | (x >>> (32 - n)) + +// MD5 — implementação pura JS compatível com browser e Node +const md5 = (str: string): string => { + const msg = new TextEncoder().encode(str) + const len = msg.length + const bits = len * 8 + + // Padding + const padLen = len % 64 < 56 ? 56 - (len % 64) : 120 - (len % 64) + const padded = new Uint8Array(len + padLen + 8) + padded.set(msg) + padded[len] = 0x80 + const dv = new DataView(padded.buffer) + dv.setUint32(len + padLen, bits >>> 0, true) + dv.setUint32(len + padLen + 4, Math.floor(bits / 2 ** 32), true) + + // Tabela de senos + const T: number[] = Array.from( + { length: 64 }, + (_, i) => (Math.abs(Math.sin(i + 1)) * 2 ** 32) >>> 0, + ) + + const S = [ + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, + 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, + 10, 15, 21, + ] + + let a0 = 0x67452301, + b0 = 0xefcdab89, + c0 = 0x98badcfe, + d0 = 0x10325476 + + for (let off = 0; off < padded.length; off += 64) { + const M: number[] = [] + for (let j = 0; j < 16; j++) M[j] = dv.getUint32(off + j * 4, true) + + let [A, B, C, D] = [a0, b0, c0, d0] + + for (let i = 0; i < 64; i++) { + let F: number, g: number + if (i < 16) { + F = (B & C) | (~B & D) + g = i + } else if (i < 32) { + F = (D & B) | (~D & C) + g = (5 * i + 1) % 16 + } else if (i < 48) { + F = B ^ C ^ D + g = (3 * i + 5) % 16 + } else { + F = C ^ (B | ~D) + g = (7 * i) % 16 + } + F = (F + A + T[i] + M[g]) >>> 0 + A = D + D = C + C = B + B = (B + rotL(F, S[i])) >>> 0 + } + + a0 = (a0 + A) >>> 0 + b0 = (b0 + B) >>> 0 + c0 = (c0 + C) >>> 0 + d0 = (d0 + D) >>> 0 + } + + const toHexLE = (n: number) => { + let s = "" + for (let i = 0; i < 4; i++) s += ((n >>> (i * 8)) & 0xff).toString(16).padStart(2, "0") + return s + } + + return toHexLE(a0) + toHexLE(b0) + toHexLE(c0) + toHexLE(d0) +} + const formatarUuidV3 = (hash: string): string => { - // UUID v3: versão = 3, variante = 0b10xx (RFC 4122) - const chars = hash.slice(0, 32) - return [ - chars.slice(0, 8), - chars.slice(8, 12), - `3${chars.slice(13, 16)}`, // version 3 - `${((Number.parseInt(chars[16], 16) & 0x3) | 0x8).toString(16)}${chars.slice(17, 20)}`, // variant - chars.slice(20, 32), - ].join("-") + const c = hash.slice(0, 32) + const v = ((Number.parseInt(c[16], 16) & 0x3) | 0x8).toString(16) + return `${c.slice(0, 8)}-${c.slice(8, 12)}-3${c.slice(13, 16)}-${v}${c.slice(17, 20)}-${c.slice(20, 32)}` } /** * Gera um UUID determinístico (versão 3) com base em uma chave e um grupo (namespace). + * Implementação pura JS (MD5), sem dependência de Node.js — funciona em browser e server. * - * - Usa o algoritmo MD5 (RFC 4122). - * - Sempre retorna o mesmo UUID para a mesma combinação chave + grupo. - * - Caso o grupo não seja informado, usa o UUID "nil" como namespace. - * - * @param chave - Qualquer valor que será convertido em string para gerar o UUID (ex: número, string ou objeto). - * @param grupo - Opcional. Namespace para separar domínios diferentes de UUIDs. - * @returns UUID v3 (determinístico) + * @param chave - Valor a serializar (string, number ou objeto). + * @param grupo - Namespace opcional; se omitido, usa UUID nil. */ export const uuidV3 = (chave: unknown, grupo?: unknown): string => { const namespace = grupo ? uuidV3(grupo) : NIL_UUID @@ -49,22 +126,5 @@ export const uuidV3 = (chave: unknown, grupo?: unknown): string => { : typeof chave === "number" ? String(chave) : JSON.stringify(chave) - const hash = createHash("md5") - .update(namespace + input) - .digest("hex") - return formatarUuidV3(hash) + return formatarUuidV3(md5(namespace + input)) } - -/** - * Gera um UUID v4 (aleatório, não determinístico). - * - * - Usa `crypto.randomUUID()` nativo do Node.js 20+. - * - Usado quando unicidade é necessária, mas não se exige que seja previsível. - */ -export const uuidV4 = (): string => randomUUID() - -/** - * @deprecated Esta variável será descontinuada em versões futuras. - * Use a função `uuidV4()` diretamente. - */ -export const uuid = uuidV4