From fdfe409088e915d2bcb7a8e331bd64552ee7f890 Mon Sep 17 00:00:00 2001 From: marcio Date: Thu, 13 Aug 2026 16:26:32 -0300 Subject: [PATCH] feat: uuid nativo node:crypto, remove dep uuid npm, bump v0.354.0 --- dist-back/uuid.js | 29 +- dist-front/index.d.mts | 698 --------------------------------------- dist-front/index.mjs | 2 +- package.json | 2 +- src/uuid.ts | 38 ++- tsup/tsup.config.back.ts | 1 + 6 files changed, 51 insertions(+), 719 deletions(-) delete mode 100644 dist-front/index.d.mts diff --git a/dist-back/uuid.js b/dist-back/uuid.js index 6d8dfc0..4668534 100644 --- a/dist-back/uuid.js +++ b/dist-back/uuid.js @@ -25,21 +25,32 @@ __export(uuid_exports, { validarUuid: () => validarUuid }); module.exports = __toCommonJS(uuid_exports); -var import_uuid = require("uuid"); +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; }; -const uuidV3 = (chave, grupo) => { - return (0, import_uuid.v3)( - // Converte a chave para string (de forma segura) - typeof chave === "string" ? chave : typeof chave === "number" ? String(chave) : JSON.stringify(chave), - // Se um grupo foi fornecido, gera um UUID v3 recursivamente com base nele, senão usa NIL - grupo ? uuidV3(grupo) : import_uuid.NIL - ); +const NIL_UUID = "00000000-0000-0000-0000-000000000000"; +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 uuidV4 = import_uuid.v4; +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); +}; +const uuidV4 = () => (0, import_node_crypto.randomUUID)(); const uuid = uuidV4; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { diff --git a/dist-front/index.d.mts b/dist-front/index.d.mts deleted file mode 100644 index 33dc188..0000000 --- a/dist-front/index.d.mts +++ /dev/null @@ -1,698 +0,0 @@ -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'; -import { v4 } from 'uuid'; - -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). - * - * @param valor - A string que será validada. - * @returns booleano indicando se é um UUID válido. - */ -declare const erUuid: RegExp; -declare const validarUuid: (uuid: string | number | undefined | null) => boolean; -/** - * Gera um UUID determinístico (versão 3) com base em uma chave e um grupo (namespace). - * - * - 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) - */ -declare const uuidV3: (chave: any, grupo?: any) => string; -/** - * Gera um UUID v4 (aleatório, não determinístico). - * - * - Usado quando unicidade é necessária, mas não se exige que seja previsível. - */ -declare const uuidV4: typeof v4; -/** - * @deprecated Esta variável será descontinuada em versões futuras. - * Use a função `uuidV4()` diretamente. - */ -declare const uuid: typeof v4; - -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 3b46c4c..3100a3d 100644 --- a/dist-front/index.mjs +++ b/dist-front/index.mjs @@ -1 +1 @@ -var c="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),E=o=>`eli-${Array.from({length:o||8}).map(()=>c[(999*Math.random()|0)%c.length]).join("")}`;var g={};globalThis.cacheMemoria_cache=g;var x=(o,r,a)=>{let i=typeof o=="string"?o:typeof o=="number"?String(o):encodeURIComponent(JSON.stringify(o)),e=a&&new Date().getTime()+a*1e3;r!==void 0&&(g[i]={valor:r,validade:e});let n=g[i];if(!(n?.validade&&n.validadeg,ro=x,to=o=>r=>x(o,r);var no="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=(r=>(r.token="token",r))(A||{}),T=(a=>(a.Usuario="usuario",a.Fornecedor="fornecedor",a))(T||{});import s from"zod";var N=(e=>(e["="]="=",e["!="]="!=",e[">"]=">",e[">="]=">=",e["<"]="<",e["<="]="<=",e.like="like",e.in="in",e.isNull="isNull",e.notIn="notIn",e))(N||{}),z=s.enum(["=","!=",">",">=","<","<=","like","in","isNull","notIn"]),lo=s.object({coluna:s.string(),valor:s.any(),operador:z,ou:s.boolean().optional()});var w=({dayjs:o,duration:r,isSameOrAfter:a,isSameOrBefore:i,minMax:e,relativeTime:n,timezone:m,utc:d,weekOfYear:O})=>(o.extend(d),o.extend(m),o.extend(O),o.extend(i),o.extend(a),o.extend(e),o.extend(n),o.extend(r),o.locale("pt-br"),o),so=w;var go="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 r=o.nivelMinimo??"INFORMACAO",a=v[r].peso,i=(e,n)=>{let m=v[e];if(m.pesoi("RASTREAMENTO",e),depuracao:e=>i("DEPURACAO",e),info:e=>i("INFORMACAO",e),aviso:e=>i("AVISO",e),erro:e=>i("ERRO",e),critico:e=>i("CRITICO",e)}},vo=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"}],_o=o=>{let r=String(o||"").toLocaleLowerCase().split(".").pop();return j.find(i=>i.ext===r)?.tipo||"outros"};import l from"zod";var F=l.enum([">","<",">=","<=","=","!=","in","like","\u2229"]),ho={">":{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:]+\}$/,R=/^\w+(\.\w+)*$/,I=l.string().regex(R,"Coluna inv\xE1lida").describe("nome da coluna ou caminho aninhado do jsonb"),L=l.object({id:l.string().describe("id da condi\xE7\xE3o do filtro").regex(k,"O id deve seguir o formato {identificador}"),coluna:I,operador:F,valor:l.any().describe("valor de compara\xE7\xE3o")}),M=o=>{let a=(o.match(/\{[\w:]+\}|\bNAO\b|\bE\b|\bOU\b|\(|\)/g)||[]).join(""),i=o.replace(/\s+/g,""),e=a.replace(/\s+/g,"");if(i!==e)return!1;let n=o.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}},X=l.object({condicoes:l.array(L),formula:l.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,r)=>{let a=new Set(o.condicoes.map(e=>e.id)),i=o.formula.match(/\{[\w:]+\}/g)||[];for(let e of i)a.has(e)||r.addIssue({code:"custom",path:["formula"],message:`A refer\xEAncia ${e} n\xE3o existe em condicoes.`})}),q=o=>X.parse(o),Ao=()=>({criarFiltroDelta:q});var No=(o,r)=>{let a="localStorage"in globalThis?globalThis.localStorage:void 0;if(typeof a>"u")return null;let i=typeof o=="string"?o:encodeURIComponent(JSON.stringify(o));try{r!==void 0&&a.setItem(i,JSON.stringify(r));let e=a.getItem(i);if(e===null)return null;try{return JSON.parse(e)}catch{return e}}catch{return null}};var y=o=>{try{return Object.fromEntries(Object.entries(o).map(([r,a])=>[r,a===void 0||a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean"?a:JSON.stringify(a,null,2)]))}catch(r){throw new Error(`Erro na fun\xE7\xE3o paraObjetoRegistroPg: ${r.message} ${r.stack}`)}},wo=y,Co=y;var P=(o=>(o["e-licencie"]="e-licencie",o["gov.e-licencie"]="gov.e-licencie",o))(P||{});var U=(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))(U||{});var ko=()=>"Ol\xE1 Mundo! (fun\xE7\xE3o)";var Io="Ol\xE1 Mundo! (vari\xE1vel)";var Po=(...o)=>o.map(r=>r==null?"":String(r).normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\s+/g," ").toLowerCase()).join(" ");var _=class{constructor({caminho:r,acaoIr:a,rotulo:i}){this._partesCaminho=[];this._acaoIr=a,this._partesCaminho=(Array.isArray(r)?r:[r]).filter(Boolean).map(e=>String(e)).flatMap(e=>e.split("/")).filter(Boolean),this.rotulo=i}get caminho(){return`/${this._partesCaminho.join("/")}`}set caminho(r){this._partesCaminho=r.split("/").filter(a=>a)}endereco(r,a){let i=typeof globalThis<"u"&&globalThis.window||void 0,e=new URL(i?i.location.href:"http://localhost");e.pathname=this.caminho,e.search="";let n=Object.entries(r);for(let[m,d]of n)e.searchParams.set(String(m),JSON.stringify(d));return e.hash="",a&&(e.hash=`#${e.search}`,e.search=""),e.href}ir(r){if(this._acaoIr)this._acaoIr(this.endereco({...r}));else{let a=typeof globalThis<"u"&&globalThis.window||void 0;a&&(a.location.href=this.endereco({...r}))}}parametros(r){let a=r?new URL(r):new URL(typeof globalThis<"u"&&globalThis.window?globalThis.window.location.href:"http://localhost"),i=a.searchParams,e=Object.fromEntries(i.entries()),n=a.hash;if(n){let m=Object.fromEntries(new URLSearchParams(n.slice(1)).entries());e={...e,...m}}for(let m in e)try{e[m]=JSON.parse(e[m])}catch{console.log(`[${m}|${e[m]}] n\xE3o \xE9 um json v\xE1lido.`)}return e}};var $=(n=>(n.UN="UN",n.KG="KG",n.TON="TON",n.g="g",n["M\xB3"]="M\xB3",n.Lt="Lt",n))($||{}),Bo=[{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{NIL as B,v3 as J,v4 as V}from"uuid";var G=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Go=o=>G.test(String(o||"")),K=(o,r)=>J(typeof o=="string"?o:typeof o=="number"?String(o):JSON.stringify(o),r?K(r):B),Y=V,Ko=Y;var Zo=o=>new Promise(r=>setTimeout(()=>r(!0),o)),Qo=o=>Object.keys(o).join("/");import u from"zod";var So=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 Z=/^\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,H=Number(new Date().toISOString().slice(0,7).replace("-","")),W=b.string().regex(H<202407?Z:Q).describe("Documento (CNPJ) no formato XX.XXX.XXX/XXXX-XX"),S=b.string().regex(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/).describe("Documento (CPF) no formato XXX.XXX.XXX-XX"),ee=S.or(W).describe("CPF ou CNPJ");import p from"zod";var f=o=>{if(typeof o=="number"||typeof o!="string")return o;let r=o;return r.includes(",")&&(r=r.replace(/\./g,"").replace(",",".")),r=r.replace(/[^0-9.]/g,""),r==""?null:Number(r)},ae=p.preprocess(f,p.number()),ne=p.preprocess(f,p.number().positive()),ie=p.preprocess(f,p.number().int());export{C as NivelLog,v as NivelLogDetalhes,P as Produtos,_ as TipagemRotas,E as aleatorio,x as cacheM,to as cacheMFixo,ro as cacheMemoria,h as camposComuns,q as criarFiltroDelta,so as defineDayjsBr,G as erUuid,Zo as esperar,j as extensoes,w as iniciarDayjsBr,D as iniciarELog,Ao as iniciarFiltroDelta,go as link_paiol,No as localValor,Qo as nomeVariavel,Co as objetoPg,ho as operadorFiltroDeltaDetalhes,N as operadores,y as paraObjetoRegistroPg,wo as pgObjeto,$ as siglas_unidades_medida,Po as texto_busca,_o as tipoArquivo,T as tipoUsuarioResiduos,U as tiposSituacoesElicencie,A as tx,ko as umaFuncao,Io as umaVariavel,Bo as unidades_medida,Ko as uuid,K as uuidV3,Y as uuidV4,no as uuid_null,Go as validarUuid,eo as verCacheM,I as zColunaFiltroDelta,L as zCondicaoFiltroDelta,So as zCoordenadas,W as zDocCnpj,S as zDocCpf,ee as zDocumento,lo as zFiltro,X as zFiltroDelta,ae as zNumero,ie as zNumeroInteiro,ne as zNumeroPositivo,F as zOperadorFiltroDelta,z as zOperadores}; +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}; diff --git a/package.json b/package.json index 03e72eb..5c84011 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "p-comuns", - "version": "0.353.0", + "version": "0.354.0", "description": "", "main": "./dist-front/index.mjs", "module": "./dist-front/index.mjs", diff --git a/src/uuid.ts b/src/uuid.ts index 18c47d4..64b1f53 100755 --- a/src/uuid.ts +++ b/src/uuid.ts @@ -1,4 +1,4 @@ -import { NIL, v3, v4 } from "uuid" +import { createHash, randomUUID } from "node:crypto" /** * Valida se uma string é um UUID válido (qualquer versão). @@ -13,6 +13,23 @@ export const validarUuid = (uuid: string | number | undefined | null) => { return retorno } +const NIL_UUID = "00000000-0000-0000-0000-000000000000" + +/** + * Formata um hash MD5 (32 hex chars) no formato UUID v3. + */ +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("-") +} + /** * Gera um UUID determinístico (versão 3) com base em uma chave e um grupo (namespace). * @@ -24,26 +41,27 @@ export const validarUuid = (uuid: string | number | undefined | null) => { * @param grupo - Opcional. Namespace para separar domínios diferentes de UUIDs. * @returns UUID v3 (determinístico) */ -export const uuidV3 = (chave: any, grupo?: any): string => { - return v3( - // Converte a chave para string (de forma segura) +export const uuidV3 = (chave: unknown, grupo?: unknown): string => { + const namespace = grupo ? uuidV3(grupo) : NIL_UUID + const input = typeof chave === "string" ? chave : typeof chave === "number" ? String(chave) - : JSON.stringify(chave), - - // Se um grupo foi fornecido, gera um UUID v3 recursivamente com base nele, senão usa NIL - grupo ? uuidV3(grupo) : NIL, - ) + : JSON.stringify(chave) + const hash = createHash("md5") + .update(namespace + input) + .digest("hex") + return formatarUuidV3(hash) } /** * 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 = v4 +export const uuidV4 = (): string => randomUUID() /** * @deprecated Esta variável será descontinuada em versões futuras. diff --git a/tsup/tsup.config.back.ts b/tsup/tsup.config.back.ts index 912c657..3593233 100755 --- a/tsup/tsup.config.back.ts +++ b/tsup/tsup.config.back.ts @@ -24,5 +24,6 @@ export const tsup_config_back: Options = { }, } + // Exporta a configuração padrão usando defineConfig export default defineConfig(tsup_config_back)