From b0b76562b72fb385dd32f5fd169a559241b8c17b Mon Sep 17 00:00:00 2001 From: Luiz Silva Date: Sat, 30 May 2026 09:17:32 -0300 Subject: [PATCH] =?UTF-8?q?remo=C3=A7=C3=A3o=20do=20filtro=2026=20por=20fi?= =?UTF-8?q?ltro=20delta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 2 +- README.md | 10 +- dist-back/filtroDelta.js | 109 ++++++++++++++ dist-back/index.js | 6 +- dist-back/tipoFiltro.26.js | 72 ---------- dist-front/index.d.mts | 284 ++++++++----------------------------- dist-front/index.mjs | 2 +- package.json | 6 +- pacote.tgz | Bin 35988 -> 35393 bytes src/filtroDelta.ts | 162 +++++++++++++++++++++ src/index.ts | 4 +- src/tipoFiltro.26.ts | 233 ------------------------------ 12 files changed, 348 insertions(+), 542 deletions(-) create mode 100644 dist-back/filtroDelta.js delete mode 100644 dist-back/tipoFiltro.26.js create mode 100644 src/filtroDelta.ts delete mode 100644 src/tipoFiltro.26.ts diff --git a/AGENTS.md b/AGENTS.md index c221edf..a5aa66c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -40,7 +40,7 @@ src/ ├── constantes.ts # Constantes globais (enums, valores fixos) ├── situacoes.ts # Status/situações dos processos ├── tipagemRotas.ts # Tipagem forte de rotas da API -├── tipoFiltro.26.ts # Sistema de filtros tipados (operadores PG) +├── filtroDelta.ts # Sistema de filtros tipados (operadores PG) ├── uuid.ts # Geração e validação de UUIDs ├── dayjs26.ts # Wrapper do dayjs com locale e plugins ├── extensoes.ts # Extensões de tipos nativos diff --git a/README.md b/README.md index 2c5cc88..be02418 100755 --- a/README.md +++ b/README.md @@ -118,9 +118,9 @@ pnpm add --save-dev --save-exact @biomejs/biome@2.4.0 --- -## ✅ Sistema de Filtros (tipoFiltro26) +## ✅ Sistema de Filtros (filtroDelta) -O sistema `tipoFiltro26` foi projetado para gerar automaticamente a tipagem de filtros compatíveis com operadores padrão do PostgreSQL, a partir de um tipo base `T`. +O sistema `filtroDelta` foi projetado para gerar automaticamente a tipagem de filtros compatíveis com operadores padrão do PostgreSQL, a partir de um tipo base `T`. **Principais características:** - Tipagem forte e segura (TypeScript) @@ -178,7 +178,7 @@ O sistema `tipoFiltro26` foi projetado para gerar automaticamente a tipagem de f } ``` -### Operadores Suportados (`operadores26`) +### Operadores Suportados (`operadoresDelta`) - **Number**: `=`, `!=`, `>`, `>=`, `<`, `<=`, `in` - **String**: `=`, `!=`, `like`, `in` @@ -187,10 +187,10 @@ O sistema `tipoFiltro26` foi projetado para gerar automaticamente a tipagem de f ### Validação em Tempo de Execução (Zod) ```typescript -import { zFiltro26 } from "p-comuns" +import { zFiltroDelta } from "p-comuns" // Valida a estrutura (não checa existência de colunas no DB) -zFiltro26.parse(objetoFiltro) +zFiltroDelta.parse(objetoFiltro) ``` --- diff --git a/dist-back/filtroDelta.js b/dist-back/filtroDelta.js new file mode 100644 index 0000000..7628013 --- /dev/null +++ b/dist-back/filtroDelta.js @@ -0,0 +1,109 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var filtroDelta_exports = {}; +__export(filtroDelta_exports, { + zColunaFiltroDelta: () => zColunaFiltroDelta, + zCondicaoFiltroDelta: () => zCondicaoFiltroDelta, + zFiltroDelta: () => zFiltroDelta, + zOperadorFiltroDelta: () => zOperadorFiltroDelta +}); +module.exports = __toCommonJS(filtroDelta_exports); +var import_zod = __toESM(require("zod")); +const zOperadorFiltroDelta = import_zod.default.enum([">", "<", ">=", "<=", "=", "!=", "in", "like"]); +const regexIdCondicaoFiltroDelta = /^\{[\w:]+\}$/; +const regexColunaFiltroDelta = /^\w+(\.\w+)*$/; +const zColunaFiltroDelta = import_zod.default.string().regex(regexColunaFiltroDelta, "Coluna inv\xE1lida").describe("nome da coluna ou caminho aninhado do jsonb"); +const zCondicaoFiltroDelta = import_zod.default.object({ + /** + * Identificador único da condição. + * + * Exemplo: + * {1} + */ + id: import_zod.default.string().describe("id da condi\xE7\xE3o do filtro").regex(regexIdCondicaoFiltroDelta, "O id deve seguir o formato {identificador}"), + /** + * Nome da coluna ou caminho jsonb. + */ + coluna: zColunaFiltroDelta, + /** + * Operador da comparação. + */ + operador: zOperadorFiltroDelta, + /** + * Valor utilizado na comparação. + */ + valor: import_zod.default.any().describe("valor de compara\xE7\xE3o") +}); +const formulaFiltroDeltaValida = (formula) => { + const tokensPermitidos = formula.match(/\{[\w:]+\}|\bNAO\b|\bE\b|\bOU\b|\(|\)/g) || []; + const formulaReconstruida = tokensPermitidos.join(""); + const formulaOriginalSemEspacos = formula.replace(/\s+/g, ""); + const formulaReconstruidaSemEspacos = formulaReconstruida.replace(/\s+/g, ""); + if (formulaOriginalSemEspacos !== formulaReconstruidaSemEspacos) { + return false; + } + const expressaoLogica = formula.replace(/\{[\w:]+\}/g, "true").replace(/\bNAO\b/g, "!").replace(/\bE\b/g, "&&").replace(/\bOU\b/g, "||"); + try { + new Function(`return (${expressaoLogica})`)(); + return true; + } catch { + return false; + } +}; +const zFiltroDelta = import_zod.default.object({ + /** + * Lista de condições disponíveis. + */ + condicoes: import_zod.default.array(zCondicaoFiltroDelta), + /** + * Fórmula lógica que combina as condições. + */ + formula: import_zod.default.string().refine(formulaFiltroDeltaValida, { + 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((value, ctx) => { + const idsCondicoes = new Set(value.condicoes.map((condicao) => condicao.id)); + const referenciasFormula = value.formula.match(/\{[\w:]+\}/g) || []; + for (const referencia of referenciasFormula) { + if (!idsCondicoes.has(referencia)) { + ctx.addIssue({ + code: "custom", + path: ["formula"], + message: `A refer\xEAncia ${referencia} n\xE3o existe em condicoes.` + }); + } + } +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + zColunaFiltroDelta, + zCondicaoFiltroDelta, + zFiltroDelta, + zOperadorFiltroDelta +}); diff --git a/dist-back/index.js b/dist-back/index.js index f6204a6..0ee57a4 100644 --- a/dist-back/index.js +++ b/dist-back/index.js @@ -20,10 +20,10 @@ __reExport(index_exports, require("./auditoria"), module.exports); __reExport(index_exports, require("./cacheMemoria"), module.exports); __reExport(index_exports, require("./constantes"), module.exports); __reExport(index_exports, require("./consulta"), module.exports); -__reExport(index_exports, require("./dayjs26"), module.exports); __reExport(index_exports, require("./ecosistema"), module.exports); __reExport(index_exports, require("./extensoes"), module.exports); __reExport(index_exports, require("./extensoes"), module.exports); +__reExport(index_exports, require("./filtroDelta"), module.exports); __reExport(index_exports, require("./local"), module.exports); __reExport(index_exports, require("./postgres"), module.exports); __reExport(index_exports, require("./produtos"), module.exports); @@ -32,7 +32,6 @@ __reExport(index_exports, require("./testes-de-variaveis"), module.exports); __reExport(index_exports, require("./texto_busca"), module.exports); __reExport(index_exports, require("./tipagemRotas"), module.exports); __reExport(index_exports, require("./tipagemRotas"), module.exports); -__reExport(index_exports, require("./tipoFiltro.26"), module.exports); __reExport(index_exports, require("./unidades_medida"), module.exports); __reExport(index_exports, require("./uuid"), module.exports); __reExport(index_exports, require("./variaveisComuns"), module.exports); @@ -43,10 +42,10 @@ __reExport(index_exports, require("./variaveisComuns"), module.exports); ...require("./cacheMemoria"), ...require("./constantes"), ...require("./consulta"), - ...require("./dayjs26"), ...require("./ecosistema"), ...require("./extensoes"), ...require("./extensoes"), + ...require("./filtroDelta"), ...require("./local"), ...require("./postgres"), ...require("./produtos"), @@ -55,7 +54,6 @@ __reExport(index_exports, require("./variaveisComuns"), module.exports); ...require("./texto_busca"), ...require("./tipagemRotas"), ...require("./tipagemRotas"), - ...require("./tipoFiltro.26"), ...require("./unidades_medida"), ...require("./uuid"), ...require("./variaveisComuns") diff --git a/dist-back/tipoFiltro.26.js b/dist-back/tipoFiltro.26.js deleted file mode 100644 index fe14814..0000000 --- a/dist-back/tipoFiltro.26.js +++ /dev/null @@ -1,72 +0,0 @@ -"use strict"; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var tipoFiltro_26_exports = {}; -__export(tipoFiltro_26_exports, { - agrupadores26: () => agrupadores26, - criarFiltro26: () => criarFiltro26, - operadores26: () => operadores26, - zFiltro26: () => zFiltro26 -}); -module.exports = __toCommonJS(tipoFiltro_26_exports); -var import_zod = require("zod"); -var operadores26 = /* @__PURE__ */ ((operadores262) => { - operadores262["="] = "="; - operadores262["!="] = "!="; - operadores262[">"] = ">"; - operadores262[">="] = ">="; - operadores262["<"] = "<"; - operadores262["<="] = "<="; - operadores262["like"] = "like"; - operadores262["in"] = "in"; - return operadores262; -})(operadores26 || {}); -var agrupadores26 = /* @__PURE__ */ ((agrupadores262) => { - agrupadores262["E"] = "E"; - agrupadores262["OU"] = "OU"; - return agrupadores262; -})(agrupadores26 || {}); -const zOperadores = import_zod.z.nativeEnum(operadores26); -const zValor = import_zod.z.any(); -const zCondicao = import_zod.z.record(zOperadores, zValor); -const zFiltro26 = import_zod.z.lazy( - () => import_zod.z.object({ - E: import_zod.z.array(zFiltro26).optional(), - OU: import_zod.z.array(zFiltro26).optional() - }).catchall(import_zod.z.union([zCondicao, zFiltro26])) -); -const criarFiltro26 = (filtro) => filtro; -const _filtro = criarFiltro26({ - idade: { [">=" /* >= */]: 18 }, - ["OU" /* OU */]: [ - { nome: { ["like" /* like */]: "%pa%" } }, - { - ["E" /* E */]: [ - { carro: { ano: { ["=" /* = */]: 2020 } } }, - { carro: { modelo: { ["in" /* in */]: ["Civic", "Corolla"] } } } - ] - } - ] -}); -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - agrupadores26, - criarFiltro26, - operadores26, - zFiltro26 -}); diff --git a/dist-front/index.d.mts b/dist-front/index.d.mts index e7b3026..29477e5 100644 --- a/dist-front/index.d.mts +++ b/dist-front/index.d.mts @@ -1,14 +1,4 @@ -import z, { z as z$1 } 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 z from 'zod'; import { v4 } from 'uuid'; declare const aleatorio: (tamanho?: number) => string; @@ -124,70 +114,6 @@ declare const zFiltro: z.ZodObject<{ 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 { defineDayjsBr } from "p-comuns" - * import "dayjs/locale/pt-br" // Importante: importar o locale! - - * export const dayjsbr = defineDayjsBr({ - * dayjs, - * duration, - * isSameOrAfter, - * isSameOrBefore, - * minMax, - * relativeTime, - * timezone, - * utc, - * weekOfYear, - * }) - * ``` - */ -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"; type tiposArquivo = "imagem" | "documento" | "vídeo" | "outros"; @@ -203,6 +129,67 @@ declare const extensoes: { */ declare const tipoArquivo: (nomeArquivo: string | null | undefined) => tiposArquivo; +/** + * Operadores permitidos para comparação. + */ +declare const zOperadorFiltroDelta: z.ZodEnum<{ + "=": "="; + "!=": "!="; + ">": ">"; + ">=": ">="; + "<": "<"; + "<=": "<="; + like: "like"; + in: "in"; +}>; +/** + * 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"; + }>; + valor: z.ZodAny; +}, z.core.$strip>; +/** + * Estrutura principal do filtro delta. + */ +declare const zFiltroDelta: z.ZodObject<{ + condicoes: z.ZodArray": ">"; + ">=": ">="; + "<": "<"; + "<=": "<="; + like: "like"; + in: "in"; + }>; + 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; + /** * LocalStorage Tipado * Lê ou grava um valor no localStorage, mantendo o tipo genérico . @@ -347,151 +334,6 @@ declare class TipagemRotas; } -/** - * ============================================================================= - * tipoFiltro26 - * ============================================================================= - * - * OBJETIVO - * ----------------------------------------------------------------------------- - * Gerar automaticamente a tipagem de filtros compatíveis com operadores - * padrão do PostgreSQL, a partir de um tipo base T. - * - * Este tipo foi projetado para: - * - Construção de filtros dinâmicos - * - Geração posterior de WHERE (Knex / SQL) - * - Uso seguro por IA (evita filtros inválidos em nível de tipo) - * - * - * FORMATO DO FILTRO - * ----------------------------------------------------------------------------- - * 1) Campos simples: - * - * { - * idade: { ">=": 18 } - * } - * - * 2) Campos aninhados: - * - * { - * carro: { - * ano: { "=": 2020 } - * } - * } - * - * 3) Operador E (AND): - * - * { - * E: [ - * { idade: { ">=": 18 } }, - * { nome: { like: "%pa%" } } - * ] - * } - * - * 4) Operador OU (OR): - * - * { - * OU: [ - * { idade: { "<": 18 } }, - * { idade: { ">=": 60 } } - * ] - * } - * - * 5) Combinação complexa: - * - * { - * idade: { ">=": 18 }, - * OU: [ - * { nome: { like: "%pa%" } }, - * { - * E: [ - * { carro: { ano: { "=": 2020 } } }, - * { carro: { modelo: { in: ["Civic"] } } } - * ] - * } - * ] - * } - * - * - * REGRAS IMPORTANTES (PARA IA) - * ----------------------------------------------------------------------------- - * - Apenas campos existentes em T podem ser usados. - * - Operadores são restritos por tipo do campo. - * - Objetos são tratados recursivamente. - * - Arrays NÃO são tratados como objeto recursivo. - * - Funções NÃO são consideradas campos filtráveis. - * - * - * OPERADORES SUPORTADOS - * ----------------------------------------------------------------------------- - * number: - * =, !=, >, >=, <, <=, in - * - * string: - * =, !=, like, in - * - * boolean: - * =, !=, in - * - * Não há suporte automático a: - * - null - * - date - * - jsonb - * - arrays - * - * Essas extensões devem ser adicionadas explicitamente. - * - * ============================================================================= - */ -declare enum operadores26 { - "=" = "=", - "!=" = "!=", - ">" = ">", - ">=" = ">=", - "<" = "<", - "<=" = "<=", - like = "like", - in = "in" -} -declare enum agrupadores26 { - E = "E", - OU = "OU" -} -type PgOpsNumber = { - [K in Extract" | ">=" | "<" | "<=">]?: number; -} & { - [K in Extract]?: number[]; -}; -type PgOpsString = { - [K in Extract]?: string; -} & { - [K in Extract]?: string[]; -}; -type PgOpsBoolean = { - [K in Extract]?: boolean[]; -}; -type PgOpsFor = V extends number ? PgOpsNumber : V extends string ? PgOpsString : V extends boolean ? PgOpsBoolean : never; -type IsPlainObject = T extends object ? T extends Function ? false : T extends readonly any[] ? false : true : false; -type FiltroCampos = { - [K in keyof T]?: IsPlainObject extends true ? tipoFiltro26 : PgOpsFor; -}; -type tipoFiltro26 = FiltroCampos & { - /** - * E => AND lógico - * Todos os filtros dentro do array devem ser verdadeiros. - */ - E?: tipoFiltro26[]; - /** - * OU => OR lógico - * Pelo menos um filtro dentro do array deve ser verdadeiro. - */ - OU?: tipoFiltro26[]; -}; -declare const zFiltro26: z$1.ZodType; -declare const criarFiltro26: (filtro: tipoFiltro26) => tipoFiltro26; - /** * Essa variável se conecta a tabela_lidades * @@ -560,4 +402,4 @@ declare const nomeVariavel: (v: { [key: string]: any; }) => string; -export { Produtos, TipagemRotas, type TipoPayloadAuditoria, agrupadores26, aleatorio, cacheM, cacheMFixo, cacheMemoria, camposComuns, criarFiltro26, defineDayjsBr, erUuid, esperar, extensoes, type interfaceConsulta, link_paiol, localValor, nomeVariavel, objetoPg, operadores, operadores26, paraObjetoRegistroPg, pgObjeto, siglas_unidades_medida, texto_busca, tipoArquivo, type tipoFiltro, type tipoFiltro26, tipoUsuarioResiduos, tiposSituacoesElicencie, tx, umaFuncao, umaVariavel, unidades_medida, uuid, uuidV3, uuidV4, uuid_null, validarUuid, verCacheM, zFiltro, zFiltro26, zOperadores }; +export { Produtos, TipagemRotas, type TipoPayloadAuditoria, aleatorio, cacheM, cacheMFixo, cacheMemoria, camposComuns, erUuid, esperar, extensoes, type interfaceConsulta, link_paiol, localValor, nomeVariavel, objetoPg, operadores, paraObjetoRegistroPg, pgObjeto, siglas_unidades_medida, texto_busca, tipoArquivo, type tipoColunaFiltroDelta, type tipoCondicaoFiltroDelta, type tipoFiltro, type tipoFiltroDelta, type tipoOperadorFiltroDelta, tipoUsuarioResiduos, tiposSituacoesElicencie, tx, umaFuncao, umaVariavel, unidades_medida, uuid, uuidV3, uuidV4, uuid_null, validarUuid, verCacheM, zColunaFiltroDelta, zCondicaoFiltroDelta, zFiltro, zFiltroDelta, zOperadorFiltroDelta, zOperadores }; diff --git a/dist-front/index.mjs b/dist-front/index.mjs index e227f36..30d296e 100644 --- a/dist-front/index.mjs +++ b/dist-front/index.mjs @@ -1 +1 @@ -var u="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),V=o=>`eli-${Array.from({length:o||8}).map(()=>u[(999*Math.random()|0)%u.length]).join("")}`;var s={};globalThis.cacheMemoria_cache=s;var g=(o,r,a)=>{let n=typeof o=="string"?o:typeof o=="number"?String(o):encodeURIComponent(JSON.stringify(o)),t=a&&new Date().getTime()+a*1e3;r!==void 0&&(s[n]={valor:r,validade:t});let i=s[n];if(!(i?.validade&&i.validades,G=g,$=o=>r=>g(o,r);var R="00000000-0000-0000-0000-000000000000",v=(m=>(m.codigo="codigo",m.excluido="excluido",m.data_hora_criacao="data_hora_criacao",m.data_hora_atualizacao="data_hora_atualizacao",m.codigo_usuario_criacao="codigo_usuario_criacao",m.codigo_usuario_atualizacao="codigo_usuario_atualizacao",m.versao="versao",m))(v||{}),b=(r=>(r.token="token",r))(b||{}),h=(a=>(a.Usuario="usuario",a.Fornecedor="fornecedor",a))(h||{});import l from"zod";var O=(n=>(n["="]="=",n["!="]="!=",n[">"]=">",n[">="]=">=",n["<"]="<",n["<="]="<=",n.like="like",n.in="in",n.isNull="isNull",n))(O||{}),T=l.enum(["=","!=",">",">=","<","<=","like","in","isNull"]),Z=l.object({coluna:l.string(),valor:l.any(),operador:T,ou:l.boolean().optional()});var W=({dayjs:o,duration:r,isSameOrAfter:a,isSameOrBefore:n,minMax:t,relativeTime:i,timezone:d,utc:m,weekOfYear:y})=>(o.extend(m),o.extend(d),o.extend(y),o.extend(n),o.extend(a),o.extend(t),o.extend(i),o.extend(r),o.locale("pt-br"),o);var S="https://paiol.idz.one";var z=[{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"}],ao=o=>{let r=String(o||"").toLocaleLowerCase().split(".").pop();return z.find(n=>n.ext===r)?.tipo||"outros"};var to=(o,r)=>{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{r!==void 0&&a.setItem(n,JSON.stringify(r));let t=a.getItem(n);if(t===null)return null;try{return JSON.parse(t)}catch{return t}}catch{return null}};var x=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}`)}},io=x,mo=x;var w=(o=>(o["e-licencie"]="e-licencie",o["gov.e-licencie"]="gov.e-licencie",o))(w||{});var j=(e=>(e.modelo="000_modelo",e.vencida="100_vencida",e.expirado="200_expirado",e.alerta="300_alerta",e.protocoladafora="350_protocoladafora",e.protocolada="400_protocolada",e.protocoladaApenas="430_protocolada",e.protocolada_alteracao="450_protocolada",e.prazo="500_prazo",e.emitida="515_emitida",e.valida="518_valida",e.novo="520_novo",e.recebido="521_recebido",e.em_andamento="530_em_andamento",e.aguardando="530_aguardando",e.aguardandoresposta="540_aguardandoresposta",e.suspensaotemporaria="540_suspensaotemporaria",e.cancelada="550_cancelada",e.execucao="560_execucao",e.pendente="570_pendente",e.executadafora="600_executadafora",e.executada="700_executada",e.naoexecutada="701_naoexecutada",e.concluida="730_concluida",e.respondido_negado="740_respondido_negado",e.respondido_aceito="741_respondido_aceito",e.atendidoparcial="742_atendidoparcial",e.naoatendido="743_naoatendido",e.atendido="744_atendido",e.renovada="760_renovada",e.finalizada="800_finalizada",e.emitirnota="101_emitirnota",e.faturaatrasada="301_faturaatrasada",e.pagarfatura="302_pagarfatura",e.aguardandoconfirmacao="531_aguardandoconfirmacao",e.agendado="701_agendado",e.faturapaga="801_faturapaga",e.excluida="999_excluida",e.requerida="401_requerida",e.vigente="516_vigente",e.emrenovacao="402_emrenovacao",e.arquivada="801_arquivada",e.aguardando_sincronizacao="999_aguardando_sincronizacao",e.nao_conforme="710_nao_conforme",e.conforme="720_conforme",e.nao_aplicavel="730_nao_aplicavel",e.parcial="715_parcial",e))(j||{});var fo=()=>"Ol\xE1 Mundo! (fun\xE7\xE3o)";var go="Ol\xE1 Mundo! (vari\xE1vel)";var vo=(...o)=>o.map(r=>r==null?"":String(r).normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\s+/g," ").toLowerCase()).join(" ");var c=class{constructor({caminho:r,acaoIr:a,rotulo:n}){this._partesCaminho=[];this._acaoIr=a,this._partesCaminho=(Array.isArray(r)?r:[r]).filter(Boolean).map(t=>String(t)).flatMap(t=>t.split("/")).filter(Boolean),this.rotulo=n}get caminho(){return`/${this._partesCaminho.join("/")}`}set caminho(r){this._partesCaminho=r.split("/").filter(a=>a)}endereco(r,a){let n=typeof globalThis<"u"&&globalThis.window||void 0,t=new URL(n?n.location.href:"http://localhost");t.pathname=this.caminho,t.search="";let i=Object.entries(r);for(let[d,m]of i)t.searchParams.set(String(d),JSON.stringify(m));return t.hash="",a&&(t.hash=`#${t.search}`,t.search=""),t.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"),n=a.searchParams,t=Object.fromEntries(n.entries()),i=a.hash;if(i){let d=Object.fromEntries(new URLSearchParams(i.slice(1)).entries());t={...t,...d}}for(let d in t)try{t[d]=JSON.parse(t[d])}catch{console.log(`[${d}|${t[d]}] n\xE3o \xE9 um json v\xE1lido.`)}return t}};import{z as p}from"zod";var _=(a=>(a["="]="=",a["!="]="!=",a[">"]=">",a[">="]=">=",a["<"]="<",a["<="]="<=",a.like="like",a.in="in",a))(_||{}),k=(a=>(a.E="E",a.OU="OU",a))(k||{}),N=p.nativeEnum(_),F=p.any(),P=p.record(N,F),f=p.lazy(()=>p.object({E:p.array(f).optional(),OU:p.array(f).optional()}).catchall(p.union([P,f]))),M=o=>o,To=M({idade:{">=":18},OU:[{nome:{like:"%pa%"}},{E:[{carro:{ano:{"=":2020}}},{carro:{modelo:{in:["Civic","Corolla"]}}}]}]});var K=(i=>(i.UN="UN",i.KG="KG",i.TON="TON",i.g="g",i["M\xB3"]="M\xB3",i.Lt="Lt",i))(K||{}),wo=[{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 U,v3 as L,v4 as A}from"uuid";var q=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,No=o=>q.test(String(o||"")),C=(o,r)=>L(typeof o=="string"?o:typeof o=="number"?String(o):JSON.stringify(o),r?C(r):U),I=A,Fo=I;var Mo=o=>new Promise(r=>setTimeout(()=>r(!0),o)),Ko=o=>Object.keys(o).join("/");export{w as Produtos,c as TipagemRotas,k as agrupadores26,V as aleatorio,g as cacheM,$ as cacheMFixo,G as cacheMemoria,v as camposComuns,M as criarFiltro26,W as defineDayjsBr,q as erUuid,Mo as esperar,z as extensoes,S as link_paiol,to as localValor,Ko as nomeVariavel,mo as objetoPg,O as operadores,_ as operadores26,x as paraObjetoRegistroPg,io as pgObjeto,K as siglas_unidades_medida,vo as texto_busca,ao as tipoArquivo,h as tipoUsuarioResiduos,j as tiposSituacoesElicencie,b as tx,fo as umaFuncao,go as umaVariavel,wo as unidades_medida,Fo as uuid,C as uuidV3,I as uuidV4,R as uuid_null,No as validarUuid,J as verCacheM,Z as zFiltro,f as zFiltro26,T as zOperadores}; +var f="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),I=o=>`eli-${Array.from({length:o||8}).map(()=>f[(999*Math.random()|0)%f.length]).join("")}`;var s={};globalThis.cacheMemoria_cache=s;var u=(o,a,r)=>{let n=typeof o=="string"?o:typeof o=="number"?String(o):encodeURIComponent(JSON.stringify(o)),t=r&&new Date().getTime()+r*1e3;a!==void 0&&(s[n]={valor:a,validade:t});let i=s[n];if(!(i?.validade&&i.validades,J=u,R=o=>a=>u(o,a);var K="00000000-0000-0000-0000-000000000000",x=(m=>(m.codigo="codigo",m.excluido="excluido",m.data_hora_criacao="data_hora_criacao",m.data_hora_atualizacao="data_hora_atualizacao",m.codigo_usuario_criacao="codigo_usuario_criacao",m.codigo_usuario_atualizacao="codigo_usuario_atualizacao",m.versao="versao",m))(x||{}),_=(a=>(a.token="token",a))(_||{}),b=(r=>(r.Usuario="usuario",r.Fornecedor="fornecedor",r))(b||{});import p from"zod";var h=(n=>(n["="]="=",n["!="]="!=",n[">"]=">",n[">="]=">=",n["<"]="<",n["<="]="<=",n.like="like",n.in="in",n.isNull="isNull",n))(h||{}),v=p.enum(["=","!=",">",">=","<","<=","like","in","isNull"]),Q=p.object({coluna:p.string(),valor:p.any(),operador:v,ou:p.boolean().optional()});var W="https://paiol.idz.one";var y=[{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"}],S=o=>{let a=String(o||"").toLocaleLowerCase().split(".").pop();return y.find(n=>n.ext===a)?.tipo||"outros"};import l from"zod";var z=l.enum([">","<",">=","<=","=","!=","in","like"]),w=/^\{[\w:]+\}$/,O=/^\w+(\.\w+)*$/,T=l.string().regex(O,"Coluna inv\xE1lida").describe("nome da coluna ou caminho aninhado do jsonb"),j=l.object({id:l.string().describe("id da condi\xE7\xE3o do filtro").regex(w,"O id deve seguir o formato {identificador}"),coluna:T,operador:z,valor:l.any().describe("valor de compara\xE7\xE3o")}),F=o=>{let r=(o.match(/\{[\w:]+\}|\bNAO\b|\bE\b|\bOU\b|\(|\)/g)||[]).join(""),n=o.replace(/\s+/g,""),t=r.replace(/\s+/g,"");if(n!==t)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}},eo=l.object({condicoes:l.array(j),formula:l.string().refine(F,{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,a)=>{let r=new Set(o.condicoes.map(t=>t.id)),n=o.formula.match(/\{[\w:]+\}/g)||[];for(let t of n)r.has(t)||a.addIssue({code:"custom",path:["formula"],message:`A refer\xEAncia ${t} n\xE3o existe em condicoes.`})});var ro=(o,a)=>{let r="localStorage"in globalThis?globalThis.localStorage:void 0;if(typeof r>"u")return null;let n=typeof o=="string"?o:encodeURIComponent(JSON.stringify(o));try{a!==void 0&&r.setItem(n,JSON.stringify(a));let t=r.getItem(n);if(t===null)return null;try{return JSON.parse(t)}catch{return t}}catch{return null}};var g=o=>{try{return Object.fromEntries(Object.entries(o).map(([a,r])=>[a,r===void 0||r==null||typeof r=="string"||typeof r=="number"||typeof r=="boolean"?r:JSON.stringify(r,null,2)]))}catch(a){throw new Error(`Erro na fun\xE7\xE3o paraObjetoRegistroPg: ${a.message} ${a.stack}`)}},no=g,io=g;var N=(o=>(o["e-licencie"]="e-licencie",o["gov.e-licencie"]="gov.e-licencie",o))(N||{});var k=(e=>(e.modelo="000_modelo",e.vencida="100_vencida",e.expirado="200_expirado",e.alerta="300_alerta",e.protocoladafora="350_protocoladafora",e.protocolada="400_protocolada",e.protocoladaApenas="430_protocolada",e.protocolada_alteracao="450_protocolada",e.prazo="500_prazo",e.emitida="515_emitida",e.valida="518_valida",e.novo="520_novo",e.recebido="521_recebido",e.em_andamento="530_em_andamento",e.aguardando="530_aguardando",e.aguardandoresposta="540_aguardandoresposta",e.suspensaotemporaria="540_suspensaotemporaria",e.cancelada="550_cancelada",e.execucao="560_execucao",e.pendente="570_pendente",e.executadafora="600_executadafora",e.executada="700_executada",e.naoexecutada="701_naoexecutada",e.concluida="730_concluida",e.respondido_negado="740_respondido_negado",e.respondido_aceito="741_respondido_aceito",e.atendidoparcial="742_atendidoparcial",e.naoatendido="743_naoatendido",e.atendido="744_atendido",e.renovada="760_renovada",e.finalizada="800_finalizada",e.emitirnota="101_emitirnota",e.faturaatrasada="301_faturaatrasada",e.pagarfatura="302_pagarfatura",e.aguardandoconfirmacao="531_aguardandoconfirmacao",e.agendado="701_agendado",e.faturapaga="801_faturapaga",e.excluida="999_excluida",e.requerida="401_requerida",e.vigente="516_vigente",e.emrenovacao="402_emrenovacao",e.arquivada="801_arquivada",e.aguardando_sincronizacao="999_aguardando_sincronizacao",e.nao_conforme="710_nao_conforme",e.conforme="720_conforme",e.nao_aplicavel="730_nao_aplicavel",e.parcial="715_parcial",e))(k||{});var so=()=>"Ol\xE1 Mundo! (fun\xE7\xE3o)";var uo="Ol\xE1 Mundo! (vari\xE1vel)";var bo=(...o)=>o.map(a=>a==null?"":String(a).normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\s+/g," ").toLowerCase()).join(" ");var c=class{constructor({caminho:a,acaoIr:r,rotulo:n}){this._partesCaminho=[];this._acaoIr=r,this._partesCaminho=(Array.isArray(a)?a:[a]).filter(Boolean).map(t=>String(t)).flatMap(t=>t.split("/")).filter(Boolean),this.rotulo=n}get caminho(){return`/${this._partesCaminho.join("/")}`}set caminho(a){this._partesCaminho=a.split("/").filter(r=>r)}endereco(a,r){let n=typeof globalThis<"u"&&globalThis.window||void 0,t=new URL(n?n.location.href:"http://localhost");t.pathname=this.caminho,t.search="";let i=Object.entries(a);for(let[d,m]of i)t.searchParams.set(String(d),JSON.stringify(m));return t.hash="",r&&(t.hash=`#${t.search}`,t.search=""),t.href}ir(a){if(this._acaoIr)this._acaoIr(this.endereco({...a}));else{let r=typeof globalThis<"u"&&globalThis.window||void 0;r&&(r.location.href=this.endereco({...a}))}}parametros(a){let r=a?new URL(a):new URL(typeof globalThis<"u"&&globalThis.window?globalThis.window.location.href:"http://localhost"),n=r.searchParams,t=Object.fromEntries(n.entries()),i=r.hash;if(i){let d=Object.fromEntries(new URLSearchParams(i.slice(1)).entries());t={...t,...d}}for(let d in t)try{t[d]=JSON.parse(t[d])}catch{console.log(`[${d}|${t[d]}] n\xE3o \xE9 um json v\xE1lido.`)}return t}};var D=(i=>(i.UN="UN",i.KG="KG",i.TON="TON",i.g="g",i["M\xB3"]="M\xB3",i.Lt="Lt",i))(D||{}),yo=[{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 C,v3 as U,v4 as L}from"uuid";var A=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Oo=o=>A.test(String(o||"")),M=(o,a)=>U(typeof o=="string"?o:typeof o=="number"?String(o):JSON.stringify(o),a?M(a):C),q=L,To=q;var Fo=o=>new Promise(a=>setTimeout(()=>a(!0),o)),No=o=>Object.keys(o).join("/");export{N as Produtos,c as TipagemRotas,I as aleatorio,u as cacheM,R as cacheMFixo,J as cacheMemoria,x as camposComuns,A as erUuid,Fo as esperar,y as extensoes,W as link_paiol,ro as localValor,No as nomeVariavel,io as objetoPg,h as operadores,g as paraObjetoRegistroPg,no as pgObjeto,D as siglas_unidades_medida,bo as texto_busca,S as tipoArquivo,b as tipoUsuarioResiduos,k as tiposSituacoesElicencie,_ as tx,so as umaFuncao,uo as umaVariavel,yo as unidades_medida,To as uuid,M as uuidV3,q as uuidV4,K as uuid_null,Oo as validarUuid,P as verCacheM,T as zColunaFiltroDelta,j as zCondicaoFiltroDelta,Q as zFiltro,eo as zFiltroDelta,z as zOperadorFiltroDelta,v as zOperadores}; diff --git a/package.json b/package.json index da10e21..a4e57ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "p-comuns", - "version": "0.336.0", + "version": "0.339.0", "description": "", "main": "./dist-front/index.mjs", "module": "./dist-front/index.mjs", @@ -29,7 +29,7 @@ "dependencies": {}, "devDependencies": { "uuid": "^11.1.0", - "zod": "4.3.6", + "zod": "4.4.3", "dayjs": "^1.11.18", "@biomejs/biome": "2.4.12", "@types/node": "^22", @@ -41,6 +41,6 @@ "peerDependencies": { "dayjs": "^1.11.18", "uuid": "^11.1.0", - "zod": "4.3.6" + "zod": "4.4.3" } } diff --git a/pacote.tgz b/pacote.tgz index 226d8e9df1b4d9508e5454dfec0fd0d87b2773e3..e3b986793f73a6aa8cb9b1e849767417eb0888f5 100644 GIT binary patch literal 35393 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 diff --git a/src/filtroDelta.ts b/src/filtroDelta.ts new file mode 100644 index 0000000..1023c8d --- /dev/null +++ b/src/filtroDelta.ts @@ -0,0 +1,162 @@ +import z from "zod" + +/** + * Operadores permitidos para comparação. + */ +export const zOperadorFiltroDelta = z.enum([">", "<", ">=", "<=", "=", "!=", "in", "like"]) + +/** + * Valida o identificador da condição. + * + * Formato esperado: + * {identificador} ou {identificador:sufixo} + */ +const regexIdCondicaoFiltroDelta = /^\{[\w:]+\}$/ + +/** + * Valida nomes de colunas e caminhos jsonb. + */ +const regexColunaFiltroDelta = /^\w+(\.\w+)*$/ + +/** + * Coluna simples ou caminho aninhado de jsonb. + */ +export const zColunaFiltroDelta = z + .string() + .regex(regexColunaFiltroDelta, "Coluna inválida") + .describe("nome da coluna ou caminho aninhado do jsonb") + +/** + * Estrutura individual de uma condição do filtro. + */ +export const zCondicaoFiltroDelta = z.object({ + /** + * Identificador único da condição. + * + * Exemplo: + * {1} + */ + id: z + .string() + .describe("id da condição do filtro") + .regex(regexIdCondicaoFiltroDelta, "O id deve seguir o formato {identificador}"), + + /** + * Nome da coluna ou caminho jsonb. + */ + coluna: zColunaFiltroDelta, + + /** + * Operador da comparação. + */ + operador: zOperadorFiltroDelta, + + /** + * Valor utilizado na comparação. + */ + valor: z.any().describe("valor de comparação"), +}) + +/** + * Verifica se a fórmula possui uma estrutura lógica válida. + */ +const formulaFiltroDeltaValida = (formula: string) => { + /** + * Extrai apenas os tokens permitidos: + * - referências de condição: {id} ou {id:sufixo} + * - operadores lógicos: E, OU + * - negação: NAO(...) + * - parênteses + */ + const tokensPermitidos = formula.match(/\{[\w:]+\}|\bNAO\b|\bE\b|\bOU\b|\(|\)/g) || [] + + /** + * Reconstrói a fórmula usando apenas os tokens válidos. + */ + const formulaReconstruida = tokensPermitidos.join("") + + /** + * Remove espaços para comparar o texto original com o texto reconstruído. + */ + const formulaOriginalSemEspacos = formula.replace(/\s+/g, "") + const formulaReconstruidaSemEspacos = formulaReconstruida.replace(/\s+/g, "") + + /** + * Se forem diferentes, há conteúdo não permitido na fórmula. + */ + if (formulaOriginalSemEspacos !== formulaReconstruidaSemEspacos) { + return false + } + + /** + * Converte a fórmula para uma expressão JavaScript equivalente. + * + * NAO(x) → !x + * E → && + * OU → || + */ + const expressaoLogica = formula + .replace(/\{[\w:]+\}/g, "true") + .replace(/\bNAO\b/g, "!") + .replace(/\bE\b/g, "&&") + .replace(/\bOU\b/g, "||") + + try { + /** + * Valida a ordem dos operadores, parênteses e estrutura lógica geral. + */ + new Function(`return (${expressaoLogica})`)() + + return true + } catch { + return false + } +} + +/** + * Estrutura principal do filtro delta. + */ +export const zFiltroDelta = z + .object({ + /** + * Lista de condições disponíveis. + */ + condicoes: z.array(zCondicaoFiltroDelta), + + /** + * Fórmula lógica que combina as condições. + */ + formula: z.string().refine(formulaFiltroDeltaValida, { + message: + "Fórmula inválida. Use apenas referências de condições {id} ou {id:sufixo}, operadores E/OU/NAO e parênteses.", + }), + }) + .superRefine((value, ctx) => { + /** + * IDs das condições cadastradas. + */ + const idsCondicoes = new Set(value.condicoes.map((condicao) => condicao.id)) + + /** + * Referências usadas dentro da fórmula. + */ + const referenciasFormula = value.formula.match(/\{[\w:]+\}/g) || [] + + /** + * Verifica se toda referência da fórmula existe em condicoes. + */ + for (const referencia of referenciasFormula) { + if (!idsCondicoes.has(referencia)) { + ctx.addIssue({ + code: "custom", + path: ["formula"], + message: `A referência ${referencia} não existe em condicoes.`, + }) + } + } + }) + +export type tipoOperadorFiltroDelta = z.infer +export type tipoColunaFiltroDelta = z.infer +export type tipoCondicaoFiltroDelta = z.infer +export type tipoFiltroDelta = z.infer diff --git a/src/index.ts b/src/index.ts index 33d0c9c..f55b655 100755 --- a/src/index.ts +++ b/src/index.ts @@ -3,10 +3,10 @@ export * from "./auditoria" export * from "./cacheMemoria" export * from "./constantes" export * from "./consulta" -export * from "./dayjs26" export * from "./ecosistema" export * from "./extensoes" export * from "./extensoes" +export * from "./filtroDelta" export * from "./local" export * from "./postgres" export * from "./produtos" @@ -15,7 +15,7 @@ export * from "./testes-de-variaveis" export * from "./texto_busca" export * from "./tipagemRotas" export * from "./tipagemRotas" -export * from "./tipoFiltro.26" + export * from "./unidades_medida" export * from "./uuid" export * from "./variaveisComuns" diff --git a/src/tipoFiltro.26.ts b/src/tipoFiltro.26.ts deleted file mode 100644 index 839f59a..0000000 --- a/src/tipoFiltro.26.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { z } from "zod" - -/** - * ============================================================================= - * tipoFiltro26 - * ============================================================================= - * - * OBJETIVO - * ----------------------------------------------------------------------------- - * Gerar automaticamente a tipagem de filtros compatíveis com operadores - * padrão do PostgreSQL, a partir de um tipo base T. - * - * Este tipo foi projetado para: - * - Construção de filtros dinâmicos - * - Geração posterior de WHERE (Knex / SQL) - * - Uso seguro por IA (evita filtros inválidos em nível de tipo) - * - * - * FORMATO DO FILTRO - * ----------------------------------------------------------------------------- - * 1) Campos simples: - * - * { - * idade: { ">=": 18 } - * } - * - * 2) Campos aninhados: - * - * { - * carro: { - * ano: { "=": 2020 } - * } - * } - * - * 3) Operador E (AND): - * - * { - * E: [ - * { idade: { ">=": 18 } }, - * { nome: { like: "%pa%" } } - * ] - * } - * - * 4) Operador OU (OR): - * - * { - * OU: [ - * { idade: { "<": 18 } }, - * { idade: { ">=": 60 } } - * ] - * } - * - * 5) Combinação complexa: - * - * { - * idade: { ">=": 18 }, - * OU: [ - * { nome: { like: "%pa%" } }, - * { - * E: [ - * { carro: { ano: { "=": 2020 } } }, - * { carro: { modelo: { in: ["Civic"] } } } - * ] - * } - * ] - * } - * - * - * REGRAS IMPORTANTES (PARA IA) - * ----------------------------------------------------------------------------- - * - Apenas campos existentes em T podem ser usados. - * - Operadores são restritos por tipo do campo. - * - Objetos são tratados recursivamente. - * - Arrays NÃO são tratados como objeto recursivo. - * - Funções NÃO são consideradas campos filtráveis. - * - * - * OPERADORES SUPORTADOS - * ----------------------------------------------------------------------------- - * number: - * =, !=, >, >=, <, <=, in - * - * string: - * =, !=, like, in - * - * boolean: - * =, !=, in - * - * Não há suporte automático a: - * - null - * - date - * - jsonb - * - arrays - * - * Essas extensões devem ser adicionadas explicitamente. - * - * ============================================================================= - */ - -/* ============================================================================= - OPERADORES POSTGRESQL POR TIPO - ============================================================================= */ - -export enum operadores26 { - "=" = "=", - "!=" = "!=", - ">" = ">", - ">=" = ">=", - "<" = "<", - "<=" = "<=", - like = "like", - in = "in", -} - -export enum agrupadores26 { - E = "E", - OU = "OU", -} - -type PgOpsNumber = { - [K in Extract" | ">=" | "<" | "<=">]?: number -} & { - [K in Extract]?: number[] -} - -type PgOpsString = { - [K in Extract]?: string -} & { - [K in Extract]?: string[] -} - -type PgOpsBoolean = { - [K in Extract]?: boolean[] -} - -/* ============================================================================= - SELEÇÃO AUTOMÁTICA DE OPERADORES BASEADA NO TIPO DO CAMPO -============================================================================= */ - -type PgOpsFor = V extends number - ? PgOpsNumber - : V extends string - ? PgOpsString - : V extends boolean - ? PgOpsBoolean - : never - -/* ============================================================================= - UTILITÁRIO: DETECTAR OBJETO PLANO -============================================================================= */ - -type IsPlainObject = T extends object - ? T extends Function - ? false - : T extends readonly any[] - ? false - : true - : false - -/* ============================================================================= - FILTRO RECURSIVO POR CAMPOS -============================================================================= */ - -type FiltroCampos = { - [K in keyof T]?: IsPlainObject extends true ? tipoFiltro26 : PgOpsFor -} - -/* ============================================================================= - TIPO PRINCIPAL EXPORTADO -============================================================================= */ - -export type tipoFiltro26 = FiltroCampos & { - /** - * E => AND lógico - * Todos os filtros dentro do array devem ser verdadeiros. - */ - E?: tipoFiltro26[] - - /** - * OU => OR lógico - * Pelo menos um filtro dentro do array deve ser verdadeiro. - */ - OU?: tipoFiltro26[] -} - -/* ============================================================================= - VALIDAÇÃO ESTRUTURAL (ZOD) -============================================================================= */ - -const zOperadores = z.nativeEnum(operadores26) -const zValor = z.any() -const zCondicao = z.record(zOperadores, zValor) - -export const zFiltro26: z.ZodType = z.lazy(() => - z - .object({ - E: z.array(zFiltro26).optional(), - OU: z.array(zFiltro26).optional(), - }) - .catchall(z.union([zCondicao, zFiltro26])), -) - -/* ============================================================================= - EXEMPLO DE USO -============================================================================= */ - -type Pessoa = { - codigo: string - nome: string - idade: number - carro: { - modelo: string - ano: number - } -} - -export const criarFiltro26 = (filtro: tipoFiltro26) => filtro - -const _filtro = criarFiltro26({ - idade: { [operadores26[">="]]: 18 }, - - [agrupadores26.OU]: [ - { nome: { [operadores26.like]: "%pa%" } }, - { - [agrupadores26.E]: [ - { carro: { ano: { [operadores26["="]]: 2020 } } }, - { carro: { modelo: { [operadores26.in]: ["Civic", "Corolla"] } } }, - ], - }, - ], -})