Compare commits

...
Sign in to create a new pull request.

15 commits

Author SHA1 Message Date
0a6ce2e323 incorporação svg 2026-02-21 10:59:52 -03:00
4ed3d82bb2 . 2026-02-19 13:26:52 -03:00
21a1b27d35 . 2026-02-19 12:49:17 -03:00
8ad68103bc libis externas 2026-02-19 10:21:11 -03:00
0ca2e7dc5a . 2026-02-19 10:09:47 -03:00
b964e826d5 ajuste no dayjs 2026-02-19 10:01:05 -03:00
64ddd6ad8a agrupadores26 2026-02-17 11:18:39 -03:00
f2a223b015 README.md 2026-02-17 10:42:51 -03:00
edcc14d0ad . 2026-02-17 10:32:57 -03:00
fa8b8d6424 inciado filtro 26 2026-02-17 08:38:20 -03:00
92300c8e3b . 2026-02-17 07:13:01 -03:00
303832ba8c build 2026-02-15 15:16:02 -03:00
dfec5a4527 Merge branch 'compatibilidade' 2026-02-15 15:15:58 -03:00
336e3ffc48 Merge branch 'master-x' 2026-02-08 20:33:27 -03:00
dbe0f66daf buid 2026-02-08 20:30:35 -03:00
57 changed files with 881 additions and 442 deletions

0
.gitignore vendored Normal file → Executable file
View file

0
.npmignore Normal file → Executable file
View file

0
.npmrc Normal file → Executable file
View file

0
.vscode/settings.json vendored Normal file → Executable file
View file

0
Documentos/biome.json Normal file → Executable file
View file

91
README.md Normal file → Executable file
View file

@ -88,3 +88,94 @@ adicionar em .vscode/settings.json
"source.fixAll.biome": "always" "source.fixAll.biome": "always"
} }
} }
---
## ✅ Sistema de Filtros (tipoFiltro26)
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`.
**Principais características:**
- Tipagem forte e segura (Typescript)
- Suporte a aninhamento de objetos
- Operadores lógicos `E` (AND) e `OU` (OR)
- Validação de operadores permitidos por tipo de dado (string, number, boolean)
### Estrutura do Filtro
O filtro segue uma estrutura onde chaves representam campos (simples ou aninhados) e valores representam condições com operadores específicos.
#### 1. Campos Simples
```typescript
{
idade: { ">=": 18 }
}
```
#### 2. Campos Aninhados
```typescript
{
carro: {
ano: { "=": 2020 }
}
}
```
#### 3. Operadores Lógicos
**Operador E (AND):** Todos devem ser verdadeiros.
```typescript
{
E: [
{ idade: { ">=": 18 } },
{ nome: { like: "%pa%" } }
]
}
```
**Operador OU (OR):** Pelo menos um deve ser verdadeiro.
```typescript
{
OU: [
{ idade: { "<": 18 } },
{ idade: { ">=": 60 } }
]
}
```
#### 4. Exemplo Complexo Complet
```typescript
{
idade: { ">=": 18 },
OU: [
{ nome: { like: "%pa%" } },
{
E: [
{ carro: { ano: { "=": 2020 } } },
{ carro: { modelo: { in: ["Civic"] } } }
]
}
]
}
```
### Operadores Suportados (`operadores26`)
Os operadores são fornecidos pelo enum `operadores26` e são restritos pelo tipo do campo:
* **Number**: `=`, `!=`, `>`, `>=`, `<`, `<=`, `in`
* **String**: `=`, `!=`, `like`, `in`
* **Boolean**: `=`, `!=`, `in`
> **Nota:** Atualmente não há suporte automático para `null`, `date`, `jsonb` ou `arrays` como tipos de campo raiz (exceto arrays dentro do operador `in`).
### Validação em Tempo de Execução (Zod)
O sistema inclui um validador Zod `zFiltro26` para validação estrutural dos objetos de filtro recebidos (ex: via API).
```typescript
import { zFiltro26 } from './tipoFiltro.26';
// Valida a estrutura (não checa existência de colunas no DB)
zFiltro26.parse(objetoFiltro);
```

0
biome.json Normal file → Executable file
View file

0
build.config.ts Normal file → Executable file
View file

View file

@ -1,72 +0,0 @@
"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 dayjs_exports = {};
__export(dayjs_exports, {
dayjsbr: () => import_dayjs.default,
duration: () => import_duration.default,
isSameOrAfter: () => import_isSameOrAfter.default,
isSameOrBefore: () => import_isSameOrBefore.default,
minMax: () => import_minMax.default,
relativeTime: () => import_relativeTime.default,
timezone: () => import_timezone.default,
utc: () => import_utc.default,
weekOfYear: () => import_weekOfYear.default
});
module.exports = __toCommonJS(dayjs_exports);
var import_dayjs = __toESM(require("dayjs"));
var import_duration = __toESM(require("dayjs/plugin/duration"));
var import_isSameOrAfter = __toESM(require("dayjs/plugin/isSameOrAfter"));
var import_isSameOrBefore = __toESM(require("dayjs/plugin/isSameOrBefore"));
var import_minMax = __toESM(require("dayjs/plugin/minMax"));
var import_relativeTime = __toESM(require("dayjs/plugin/relativeTime"));
var import_timezone = __toESM(require("dayjs/plugin/timezone"));
var import_utc = __toESM(require("dayjs/plugin/utc"));
var import_weekOfYear = __toESM(require("dayjs/plugin/weekOfYear"));
var import_pt_br = require("dayjs/locale/pt-br");
import_dayjs.default.locale("pt-br");
import_dayjs.default.extend(import_utc.default);
import_dayjs.default.extend(import_timezone.default);
import_dayjs.default.extend(import_weekOfYear.default);
import_dayjs.default.extend(import_isSameOrBefore.default);
import_dayjs.default.extend(import_isSameOrAfter.default);
import_dayjs.default.extend(import_minMax.default);
import_dayjs.default.extend(import_relativeTime.default);
import_dayjs.default.extend(import_duration.default);
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
dayjsbr,
duration,
isSameOrAfter,
isSameOrBefore,
minMax,
relativeTime,
timezone,
utc,
weekOfYear
});

49
dist-back/dayjs26.js Normal file
View file

@ -0,0 +1,49 @@
"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 dayjs26_exports = {};
__export(dayjs26_exports, {
defineDayjsBr: () => defineDayjsBr
});
module.exports = __toCommonJS(dayjs26_exports);
const defineDayjsBr = ({
dayjs,
duration,
isSameOrAfter,
isSameOrBefore,
minMax,
relativeTime,
timezone,
utc,
weekOfYear
}) => {
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.extend(weekOfYear);
dayjs.extend(isSameOrBefore);
dayjs.extend(isSameOrAfter);
dayjs.extend(minMax);
dayjs.extend(relativeTime);
dayjs.extend(duration);
dayjs.locale("pt-br");
return dayjs;
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
defineDayjsBr
});

View file

@ -0,0 +1,37 @@
"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 graficosPilao_exports = {};
__export(graficosPilao_exports, {
graficos_pilao: () => graficos_pilao
});
module.exports = __toCommonJS(graficosPilao_exports);
const graficos_pilao = {
Condicionantes: {
grafico: "condicionantes-criadas",
titulo: "Condicionantes Criadas"
},
Licen\u00E7as: {
grafico: "licencas-criadas",
titulo: "Licen\xE7as Criadas"
}
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
graficos_pilao
});

View file

@ -19,13 +19,11 @@ __reExport(index_exports, require("./aleatorio"), module.exports);
__reExport(index_exports, require("./cacheMemoria"), module.exports); __reExport(index_exports, require("./cacheMemoria"), module.exports);
__reExport(index_exports, require("./constantes"), module.exports); __reExport(index_exports, require("./constantes"), module.exports);
__reExport(index_exports, require("./consulta"), module.exports); __reExport(index_exports, require("./consulta"), module.exports);
__reExport(index_exports, require("./dayjs"), module.exports); __reExport(index_exports, require("./dayjs26"), module.exports);
__reExport(index_exports, require("./ecosistema"), 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("./extensoes"), module.exports); __reExport(index_exports, require("./extensoes"), module.exports);
__reExport(index_exports, require("./local"), module.exports); __reExport(index_exports, require("./local"), module.exports);
__reExport(index_exports, require("./logger"), module.exports);
__reExport(index_exports, require("./logger"), module.exports);
__reExport(index_exports, require("./postgres"), module.exports); __reExport(index_exports, require("./postgres"), module.exports);
__reExport(index_exports, require("./produtos"), module.exports); __reExport(index_exports, require("./produtos"), module.exports);
__reExport(index_exports, require("./situacoes"), module.exports); __reExport(index_exports, require("./situacoes"), module.exports);
@ -33,6 +31,7 @@ __reExport(index_exports, require("./testes-de-variaveis"), module.exports);
__reExport(index_exports, require("./texto_busca"), 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("./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("./unidades_medida"), module.exports);
__reExport(index_exports, require("./uuid"), module.exports); __reExport(index_exports, require("./uuid"), module.exports);
__reExport(index_exports, require("./variaveisComuns"), module.exports); __reExport(index_exports, require("./variaveisComuns"), module.exports);
@ -42,13 +41,11 @@ __reExport(index_exports, require("./variaveisComuns"), module.exports);
...require("./cacheMemoria"), ...require("./cacheMemoria"),
...require("./constantes"), ...require("./constantes"),
...require("./consulta"), ...require("./consulta"),
...require("./dayjs"), ...require("./dayjs26"),
...require("./ecosistema"), ...require("./ecosistema"),
...require("./extensoes"), ...require("./extensoes"),
...require("./extensoes"), ...require("./extensoes"),
...require("./local"), ...require("./local"),
...require("./logger"),
...require("./logger"),
...require("./postgres"), ...require("./postgres"),
...require("./produtos"), ...require("./produtos"),
...require("./situacoes"), ...require("./situacoes"),
@ -56,6 +53,7 @@ __reExport(index_exports, require("./variaveisComuns"), module.exports);
...require("./texto_busca"), ...require("./texto_busca"),
...require("./tipagemRotas"), ...require("./tipagemRotas"),
...require("./tipagemRotas"), ...require("./tipagemRotas"),
...require("./tipoFiltro.26"),
...require("./unidades_medida"), ...require("./unidades_medida"),
...require("./uuid"), ...require("./uuid"),
...require("./variaveisComuns") ...require("./variaveisComuns")

View file

@ -22,7 +22,7 @@ __export(local_exports, {
}); });
module.exports = __toCommonJS(local_exports); module.exports = __toCommonJS(local_exports);
const localValor = (chave_, valor) => { const localValor = (chave_, valor) => {
const localStorage = globalThis.localStorage; const localStorage = "localStorage" in globalThis ? globalThis.localStorage : void 0;
if (typeof localStorage == "undefined") return null; if (typeof localStorage == "undefined") return null;
const chave = typeof chave_ === "string" ? chave_ : encodeURIComponent(JSON.stringify(chave_)); const chave = typeof chave_ === "string" ? chave_ : encodeURIComponent(JSON.stringify(chave_));
try { try {

View file

@ -1,106 +0,0 @@
"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 logger_exports = {};
__export(logger_exports, {
defineCwd: () => defineCwd,
logger: () => logger,
postLogger: () => postLogger
});
module.exports = __toCommonJS(logger_exports);
var import_cross_fetch = __toESM(require("cross-fetch"));
var import_variaveisComuns = require("./variaveisComuns");
const LOKI_BASE_URL = "https://log.idz.one";
const LOKI_ENDPOINT = "/loki/api/v1/push";
const postLogger = async ({
objeto
}) => {
const response = await (0, import_cross_fetch.default)(`${LOKI_BASE_URL}${LOKI_ENDPOINT}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(objeto)
}).catch((a) => a);
if (!response.ok) {
return [objeto, `Erro ${response.status}: ${await response?.text?.()}`];
}
return [objeto];
};
let cwd = "";
const defineCwd = (novoCwd) => {
cwd = novoCwd;
};
const logger = ({ app: app_e, eProducao, parametros: parametrosAmbiente }) => ({ inquilino, usuario, parametros: parametrosSessao }) => async (level, mensagem, op_tipoLog) => {
let {
__filename,
detalhes,
local,
parametros: parametrosLog
} = op_tipoLog || {};
const app = `${eProducao ? "" : "DEV-"}${app_e}`;
if (cwd && __filename) {
__filename = __filename.replace(cwd, "");
}
if (local) {
detalhes = [`${(0, import_variaveisComuns.nomeVariavel)({ local })}="${local}"`, ...detalhes || []];
}
if (__filename) {
detalhes = [
`${(0, import_variaveisComuns.nomeVariavel)({ __filename })}="${__filename}"`,
...detalhes || []
];
}
const timestamp = `${Date.now()}000000`;
const mainLog = detalhes?.length ? `${mensagem} | ${detalhes.map((d) => JSON.stringify(d)).join(" | ")}` : mensagem;
const payload = {
stream: {
app,
inquilino,
usuario,
level,
...parametrosAmbiente || {},
...parametrosSessao || {},
...parametrosLog || {}
},
values: [
[
timestamp,
mainLog
// Linha de log direta
]
]
};
const objeto = { streams: [payload] };
const response = await postLogger({ objeto });
return response;
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
defineCwd,
logger,
postLogger
});

View file

@ -56,9 +56,8 @@ class TipagemRotas {
** "http://localhost:3000/caminho?q=query" ** "http://localhost:3000/caminho?q=query"
*/ */
endereco(query, usarComoHash) { endereco(query, usarComoHash) {
const url = new URL( const win = typeof globalThis !== "undefined" && globalThis.window || void 0;
typeof window !== "undefined" ? window.location.href : "http://localhost" const url = new URL(win ? win.location.href : "http://localhost");
);
url.pathname = this.caminho; url.pathname = this.caminho;
url.search = ""; url.search = "";
const queryKeys = Object.entries(query); const queryKeys = Object.entries(query);
@ -80,8 +79,9 @@ class TipagemRotas {
if (this._acaoIr) { if (this._acaoIr) {
this._acaoIr(this.endereco({ ...query })); this._acaoIr(this.endereco({ ...query }));
} else { } else {
if (typeof window != "undefined") { const win = typeof globalThis !== "undefined" && globalThis.window || void 0;
window.location.href = this.endereco({ ...query }); if (win) {
win.location.href = this.endereco({ ...query });
} }
} }
} }
@ -91,7 +91,7 @@ class TipagemRotas {
*/ */
parametros(urlEntrada) { parametros(urlEntrada) {
const url = urlEntrada ? new URL(urlEntrada) : new URL( const url = urlEntrada ? new URL(urlEntrada) : new URL(
typeof window !== "undefined" ? window.location.href : "http://localhost" typeof globalThis !== "undefined" && globalThis.window ? globalThis.window.location.href : "http://localhost"
); );
const query = url.searchParams; const query = url.searchParams;
let queryObj = Object.fromEntries(query.entries()); let queryObj = Object.fromEntries(query.entries());

View file

@ -0,0 +1,72 @@
"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
});

View file

@ -1,13 +1,14 @@
import z from 'zod'; import z, { z as z$1 } from 'zod';
export { Dayjs, ManipulateType, default as dayjsbr } from 'dayjs'; import _dayjs from 'dayjs';
export { default as duration } from 'dayjs/plugin/duration'; export { Dayjs, ManipulateType } from 'dayjs';
export { default as isSameOrAfter } from 'dayjs/plugin/isSameOrAfter'; import _duration from 'dayjs/plugin/duration';
export { default as isSameOrBefore } from 'dayjs/plugin/isSameOrBefore'; import _isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
export { default as minMax } from 'dayjs/plugin/minMax'; import _isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
export { default as relativeTime } from 'dayjs/plugin/relativeTime'; import _minMax from 'dayjs/plugin/minMax';
export { default as timezone } from 'dayjs/plugin/timezone'; import _relativeTime from 'dayjs/plugin/relativeTime';
export { default as utc } from 'dayjs/plugin/utc'; import _timezone from 'dayjs/plugin/timezone';
export { default as weekOfYear } from 'dayjs/plugin/weekOfYear'; import _utc from 'dayjs/plugin/utc';
import _weekOfYear from 'dayjs/plugin/weekOfYear';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
declare const aleatorio: (tamanho?: number) => string; declare const aleatorio: (tamanho?: number) => string;
@ -100,6 +101,70 @@ declare const zFiltro: z.ZodObject<{
ou: z.ZodOptional<z.ZodBoolean>; ou: z.ZodOptional<z.ZodBoolean>;
}, z.core.$strip>; }, 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"; declare const link_paiol = "https://paiol.idz.one";
type tiposArquivo = "imagem" | "documento" | "vídeo" | "outros"; type tiposArquivo = "imagem" | "documento" | "vídeo" | "outros";
@ -121,46 +186,6 @@ declare const tipoArquivo: (nomeArquivo: string | null | undefined) => tiposArqu
*/ */
declare const localValor: <T>(chave_: string | any, valor?: T | null) => T | null; declare const localValor: <T>(chave_: string | any, valor?: T | null) => T | null;
type tipoLokiObjeto = {
streams: {
stream: {
[k: string]: string;
};
values: [string, string][];
}[];
};
declare const postLogger: ({ objeto, }: {
objeto: tipoLokiObjeto;
}) => Promise<[objeto: tipoLokiObjeto, erro?: string]>;
/** define a localização da pasta do projeto */
declare const defineCwd: (novoCwd: string) => void;
type tipoLevel = "info" | "warn" | "error";
type tipoOpSessao = {
inquilino: string;
usuario: string;
parametros?: {
[k: string]: string;
};
};
type tipoLog = {
detalhes?: unknown[];
__filename?: string;
local?: string;
parametros?: {
[k: string]: string;
};
};
type tipoLoggerLog = (level: tipoLevel, mensagem: string, op_tipoLog?: tipoLog) => Promise<[objeto: tipoLokiObjeto, erro?: string]>;
type TipoLoggerSessao = (sess: tipoOpSessao) => tipoLoggerLog;
type tipoLogger = (amb: {
app: string;
eProducao: boolean;
parametros?: {
[k: string]: string;
};
}) => TipoLoggerSessao;
declare const logger: tipoLogger;
/** /**
* Trata um objeto para ser imput para postgres * Trata um objeto para ser imput para postgres
* @param entrada * @param entrada
@ -299,6 +324,151 @@ declare class TipagemRotas<T extends {
parametros(urlEntrada?: string): Partial<T>; parametros(urlEntrada?: string): Partial<T>;
} }
/**
* =============================================================================
* tipoFiltro26<T>
* =============================================================================
*
* 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 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<operadores26, "=" | "!=" | ">" | ">=" | "<" | "<=">]?: number;
} & {
[K in Extract<operadores26, "in">]?: number[];
};
type PgOpsString = {
[K in Extract<operadores26, "=" | "!=" | "like">]?: string;
} & {
[K in Extract<operadores26, "in">]?: string[];
};
type PgOpsBoolean = {
[K in Extract<operadores26, "=" | "!=">]?: boolean;
} & {
[K in Extract<operadores26, "in">]?: boolean[];
};
type PgOpsFor<V> = V extends number ? PgOpsNumber : V extends string ? PgOpsString : V extends boolean ? PgOpsBoolean : never;
type IsPlainObject<T> = T extends object ? T extends Function ? false : T extends readonly any[] ? false : true : false;
type FiltroCampos<T> = {
[K in keyof T]?: IsPlainObject<T[K]> extends true ? tipoFiltro26<T[K]> : PgOpsFor<T[K]>;
};
type tipoFiltro26<T> = FiltroCampos<T> & {
/**
* E => AND lógico
* Todos os filtros dentro do array devem ser verdadeiros.
*/
E?: tipoFiltro26<T>[];
/**
* OU => OR lógico
* Pelo menos um filtro dentro do array deve ser verdadeiro.
*/
OU?: tipoFiltro26<T>[];
};
declare const zFiltro26: z$1.ZodType<any>;
declare const criarFiltro26: <T>(filtro: tipoFiltro26<T>) => tipoFiltro26<T>;
/** /**
* Essa variável se conecta a tabela_lidades * Essa variável se conecta a tabela_lidades
* *
@ -367,4 +537,4 @@ declare const nomeVariavel: (v: {
[key: string]: any; [key: string]: any;
}) => string; }) => string;
export { Produtos, TipagemRotas, type TipoLoggerSessao, aleatorio, cacheM, cacheMFixo, cacheMemoria, camposComuns, defineCwd, erUuid, esperar, extensoes, type interfaceConsulta, link_paiol, localValor, logger, nomeVariavel, objetoPg, operadores, paraObjetoRegistroPg, pgObjeto, postLogger, siglas_unidades_medida, texto_busca, tipoArquivo, type tipoFiltro, type tipoLogger, type tipoLoggerLog, type tipoLokiObjeto, tipoUsuarioResiduos, tiposSituacoesElicencie, tx, umaFuncao, umaVariavel, unidades_medida, uuid, uuidV3, uuidV4, uuid_null, validarUuid, verCacheM, zFiltro, zOperadores }; export { Produtos, TipagemRotas, 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 };

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,6 @@
{ {
"name": "p-comuns", "name": "p-comuns",
"version": "0.303.0", "version": "0.317.0",
"description": "", "description": "",
"main": "./dist-front/index.mjs", "main": "./dist-front/index.mjs",
"module": "./dist-front/index.mjs", "module": "./dist-front/index.mjs",
@ -25,13 +25,12 @@
"url": "https://e-licencie.com.br" "url": "https://e-licencie.com.br"
}, },
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {},
"cross-fetch": "4.1.0",
"dayjs": "^1.11.18",
"uuid": "^11.1.0",
"zod": "4.1.4"
},
"devDependencies": { "devDependencies": {
"cross-fetch": "4.1.0",
"uuid": "^11.1.0",
"zod": "4.1.4",
"dayjs": "^1.11.18",
"@biomejs/biome": "2.4.0", "@biomejs/biome": "2.4.0",
"@types/node": "^20.19.22", "@types/node": "^20.19.22",
"tsup": "8.5.0", "tsup": "8.5.0",

Binary file not shown.

31
pnpm-lock.yaml generated Normal file → Executable file
View file

@ -7,19 +7,6 @@ settings:
importers: importers:
.: .:
dependencies:
cross-fetch:
specifier: 4.1.0
version: 4.1.0
dayjs:
specifier: ^1.11.18
version: 1.11.18
uuid:
specifier: ^11.1.0
version: 11.1.0
zod:
specifier: 4.1.4
version: 4.1.4
devDependencies: devDependencies:
'@biomejs/biome': '@biomejs/biome':
specifier: 2.4.0 specifier: 2.4.0
@ -27,6 +14,12 @@ importers:
'@types/node': '@types/node':
specifier: ^20.19.22 specifier: ^20.19.22
version: 20.19.22 version: 20.19.22
cross-fetch:
specifier: 4.1.0
version: 4.1.0
dayjs:
specifier: ^1.11.18
version: 1.11.19
tsup: tsup:
specifier: 8.5.0 specifier: 8.5.0
version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3) version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)
@ -36,9 +29,15 @@ importers:
unbuild: unbuild:
specifier: ^3.6.1 specifier: ^3.6.1
version: 3.6.1(typescript@5.9.3) version: 3.6.1(typescript@5.9.3)
uuid:
specifier: ^11.1.0
version: 11.1.0
vitest: vitest:
specifier: ^3.2.4 specifier: ^3.2.4
version: 3.2.4(@types/node@20.19.22)(jiti@2.6.1) version: 3.2.4(@types/node@20.19.22)(jiti@2.6.1)
zod:
specifier: 4.1.4
version: 4.1.4
packages: packages:
@ -658,8 +657,8 @@ packages:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
dayjs@1.11.18: dayjs@1.11.19:
resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}
debug@4.4.3: debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
@ -1971,7 +1970,7 @@ snapshots:
dependencies: dependencies:
css-tree: 2.2.1 css-tree: 2.2.1
dayjs@1.11.18: {} dayjs@1.11.19: {}
debug@4.4.3: debug@4.4.3:
dependencies: dependencies:

0
requisicoes.rest Normal file → Executable file
View file

0
src/aleatorio.ts Normal file → Executable file
View file

0
src/cacheMemoria.ts Normal file → Executable file
View file

0
src/constantes.ts Normal file → Executable file
View file

0
src/consulta.ts Normal file → Executable file
View file

View file

@ -1,37 +0,0 @@
import dayjsbr, { type Dayjs } from "dayjs"
export type { 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 "dayjs/locale/pt-br"
dayjsbr.locale("pt-br")
dayjsbr.extend(utc)
dayjsbr.extend(timezone)
dayjsbr.extend(weekOfYear)
dayjsbr.extend(isSameOrBefore)
dayjsbr.extend(isSameOrAfter)
dayjsbr.extend(minMax)
dayjsbr.extend(relativeTime)
dayjsbr.extend(duration)
export {
dayjsbr,
duration,
isSameOrAfter,
isSameOrBefore,
minMax,
relativeTime,
timezone,
utc,
weekOfYear,
}
export type { Dayjs }

107
src/dayjs26.ts Executable file
View file

@ -0,0 +1,107 @@
/**
* 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.
*/
import type _dayjs from "dayjs"
import type { Dayjs } from "dayjs"
export type { ManipulateType } from "dayjs"
// Importação apenas de TIPOS para evitar bundling indesejado neste arquivo
import type _duration from "dayjs/plugin/duration"
import type _isSameOrAfter from "dayjs/plugin/isSameOrAfter"
import type _isSameOrBefore from "dayjs/plugin/isSameOrBefore"
import type _minMax from "dayjs/plugin/minMax"
import type _relativeTime from "dayjs/plugin/relativeTime"
import type _timezone from "dayjs/plugin/timezone"
import type _utc from "dayjs/plugin/utc"
import type _weekOfYear from "dayjs/plugin/weekOfYear"
/**
* 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,
* })
* ```
*/
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
}) => {
// Extensão da biblioteca com os plugins fornecidos
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(weekOfYear)
dayjs.extend(isSameOrBefore)
dayjs.extend(isSameOrAfter)
dayjs.extend(minMax)
dayjs.extend(relativeTime)
dayjs.extend(duration)
// Definição do locale global
dayjs.locale("pt-br")
return dayjs
}
export { defineDayjsBr }
export type { Dayjs }

0
src/ecosistema/index.ts Normal file → Executable file
View file

0
src/ecosistema/urls.ts Normal file → Executable file
View file

0
src/extensoes.ts Normal file → Executable file
View file

12
src/graficosPilao.ts Executable file
View file

@ -0,0 +1,12 @@
export const graficos_pilao: {
[k: string]: { grafico: string; titulo: string }
} = {
Condicionantes: {
grafico: "condicionantes-criadas",
titulo: "Condicionantes Criadas",
},
Licenças: {
grafico: "licencas-criadas",
titulo: "Licenças Criadas",
},
}

5
src/index.ts Normal file → Executable file
View file

@ -2,13 +2,11 @@ export * from "./aleatorio"
export * from "./cacheMemoria" export * from "./cacheMemoria"
export * from "./constantes" export * from "./constantes"
export * from "./consulta" export * from "./consulta"
export * from "./dayjs" export * from "./dayjs26"
export * from "./ecosistema" export * from "./ecosistema"
export * from "./extensoes" export * from "./extensoes"
export * from "./extensoes" export * from "./extensoes"
export * from "./local" export * from "./local"
export * from "./logger"
export * from "./logger"
export * from "./postgres" export * from "./postgres"
export * from "./produtos" export * from "./produtos"
export * from "./situacoes" export * from "./situacoes"
@ -16,6 +14,7 @@ export * from "./testes-de-variaveis"
export * from "./texto_busca" export * from "./texto_busca"
export * from "./tipagemRotas" export * from "./tipagemRotas"
export * from "./tipagemRotas" export * from "./tipagemRotas"
export * from "./tipoFiltro.26"
export * from "./unidades_medida" export * from "./unidades_medida"
export * from "./uuid" export * from "./uuid"
export * from "./variaveisComuns" export * from "./variaveisComuns"

0
src/instalarAmbiente.ts Normal file → Executable file
View file

4
src/local/index.ts Normal file → Executable file
View file

@ -6,8 +6,8 @@ export const localValor = <T>(
chave_: string | any, chave_: string | any,
valor?: T | null, valor?: T | null,
): T | null => { ): T | null => {
const localStorage = globalThis.localStorage const localStorage =
"localStorage" in globalThis ? (globalThis as any).localStorage : undefined
if (typeof localStorage == "undefined") return null if (typeof localStorage == "undefined") return null
const chave = const chave =

View file

@ -1,126 +0,0 @@
import crossFetch from "cross-fetch"
import { nomeVariavel } from "./variaveisComuns"
const LOKI_BASE_URL = "https://log.idz.one"
const LOKI_ENDPOINT = "/loki/api/v1/push"
export type tipoLokiObjeto = {
streams: {
stream: {
[k: string]: string
}
values: [string, string][]
}[]
}
export const postLogger = async ({
objeto,
}: {
objeto: tipoLokiObjeto
}): Promise<[objeto: tipoLokiObjeto, erro?: string]> => {
const response = await crossFetch(`${LOKI_BASE_URL}${LOKI_ENDPOINT}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(objeto),
}).catch((a) => a)
if (!response.ok) {
return [objeto, `Erro ${response.status}: ${await response?.text?.()}`]
}
return [objeto]
}
let cwd = ""
/** define a localização da pasta do projeto */
export const defineCwd = (novoCwd: string) => {
cwd = novoCwd
}
type tipoLevel = "info" | "warn" | "error"
type tipoOpSessao = {
inquilino: string
usuario: string
parametros?: { [k: string]: string }
}
type tipoLog = {
detalhes?: unknown[]
__filename?: string
local?: string
parametros?: { [k: string]: string }
}
export type tipoLoggerLog = (
level: tipoLevel,
mensagem: string,
op_tipoLog?: tipoLog,
) => Promise<[objeto: tipoLokiObjeto, erro?: string]>
export type TipoLoggerSessao = (sess: tipoOpSessao) => tipoLoggerLog
export type tipoLogger = (amb: {
app: string
eProducao: boolean
parametros?: {
[k: string]: string
}
}) => TipoLoggerSessao
export const logger: tipoLogger =
({ app: app_e, eProducao, parametros: parametrosAmbiente }) =>
({ inquilino, usuario, parametros: parametrosSessao }) =>
async (level, mensagem, op_tipoLog) => {
let {
__filename,
detalhes,
local,
parametros: parametrosLog,
} = op_tipoLog || {}
const app = `${eProducao ? "" : "DEV-"}${app_e}`
if (cwd && __filename) {
__filename = __filename.replace(cwd, "")
}
if (local) {
detalhes = [`${nomeVariavel({ local })}="${local}"`, ...(detalhes || [])]
}
if (__filename) {
detalhes = [
`${nomeVariavel({ __filename })}="${__filename}"`,
...(detalhes || []),
]
}
const timestamp = `${Date.now()}000000`
const mainLog = detalhes?.length
? `${mensagem} | ${detalhes.map((d) => JSON.stringify(d)).join(" | ")}`
: mensagem
const payload: tipoLokiObjeto["streams"][number] = {
stream: {
app,
inquilino,
usuario,
level,
...(parametrosAmbiente || {}),
...(parametrosSessao || {}),
...(parametrosLog || {}),
},
values: [
[
timestamp,
mainLog, // Linha de log direta
],
],
}
const objeto: tipoLokiObjeto = { streams: [payload] }
const response = await postLogger({ objeto })
return response
}

0
src/postgres.ts Normal file → Executable file
View file

0
src/teste.ts Normal file → Executable file
View file

0
src/testes-de-variaveis/index.ts Normal file → Executable file
View file

0
src/testes-de-variaveis/umaFuncao.ts Normal file → Executable file
View file

0
src/testes-de-variaveis/umaVariavel.ts Normal file → Executable file
View file

0
src/testes/TipagemRotas.test.ts Normal file → Executable file
View file

0
src/texto_busca.ts Normal file → Executable file
View file

18
src/tipagemRotas.ts Normal file → Executable file
View file

@ -63,9 +63,10 @@ export class TipagemRotas<T extends { [q: string]: any }> {
*/ */
endereco(query: T, usarComoHash?: boolean) { endereco(query: T, usarComoHash?: boolean) {
const url = new URL( const win =
typeof window !== "undefined" ? window.location.href : "http://localhost", (typeof globalThis !== "undefined" && (globalThis as any).window) ||
) undefined
const url = new URL(win ? win.location.href : "http://localhost")
url.pathname = this.caminho url.pathname = this.caminho
@ -95,8 +96,11 @@ export class TipagemRotas<T extends { [q: string]: any }> {
if (this._acaoIr) { if (this._acaoIr) {
this._acaoIr(this.endereco({ ...query })) this._acaoIr(this.endereco({ ...query }))
} else { } else {
if (typeof window != "undefined") { const win =
window.location.href = this.endereco({ ...query }) (typeof globalThis !== "undefined" && (globalThis as any).window) ||
undefined
if (win) {
win.location.href = this.endereco({ ...query })
} }
} }
} }
@ -110,8 +114,8 @@ export class TipagemRotas<T extends { [q: string]: any }> {
const url = urlEntrada const url = urlEntrada
? new URL(urlEntrada) ? new URL(urlEntrada)
: new URL( : new URL(
typeof window !== "undefined" typeof globalThis !== "undefined" && (globalThis as any).window
? window.location.href ? (globalThis as any).window.location.href
: "http://localhost", : "http://localhost",
) )
const query = url.searchParams const query = url.searchParams

235
src/tipoFiltro.26.ts Normal file
View file

@ -0,0 +1,235 @@
import { z } from "zod"
/**
* =============================================================================
* tipoFiltro26<T>
* =============================================================================
*
* 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 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<operadores26, "=" | "!=" | ">" | ">=" | "<" | "<=">]?: number
} & {
[K in Extract<operadores26, "in">]?: number[]
}
type PgOpsString = {
[K in Extract<operadores26, "=" | "!=" | "like">]?: string
} & {
[K in Extract<operadores26, "in">]?: string[]
}
type PgOpsBoolean = {
[K in Extract<operadores26, "=" | "!=">]?: boolean
} & {
[K in Extract<operadores26, "in">]?: boolean[]
}
/* =============================================================================
SELEÇÃO AUTOMÁTICA DE OPERADORES BASEADA NO TIPO DO CAMPO
============================================================================= */
type PgOpsFor<V> = V extends number
? PgOpsNumber
: V extends string
? PgOpsString
: V extends boolean
? PgOpsBoolean
: never
/* =============================================================================
UTILITÁRIO: DETECTAR OBJETO PLANO
============================================================================= */
type IsPlainObject<T> = T extends object
? T extends Function
? false
: T extends readonly any[]
? false
: true
: false
/* =============================================================================
FILTRO RECURSIVO POR CAMPOS
============================================================================= */
type FiltroCampos<T> = {
[K in keyof T]?: IsPlainObject<T[K]> extends true
? tipoFiltro26<T[K]>
: PgOpsFor<T[K]>
}
/* =============================================================================
TIPO PRINCIPAL EXPORTADO
============================================================================= */
export type tipoFiltro26<T> = FiltroCampos<T> & {
/**
* E => AND lógico
* Todos os filtros dentro do array devem ser verdadeiros.
*/
E?: tipoFiltro26<T>[]
/**
* OU => OR lógico
* Pelo menos um filtro dentro do array deve ser verdadeiro.
*/
OU?: tipoFiltro26<T>[]
}
/* =============================================================================
VALIDAÇÃO ESTRUTURAL (ZOD)
============================================================================= */
const zOperadores = z.nativeEnum(operadores26)
const zValor = z.any()
const zCondicao = z.record(zOperadores, zValor)
export const zFiltro26: z.ZodType<any> = 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 = <T>(filtro: tipoFiltro26<T>) => filtro
const _filtro = criarFiltro26<Pessoa>({
idade: { [operadores26[">="]]: 18 },
[agrupadores26.OU]: [
{ nome: { [operadores26.like]: "%pa%" } },
{
[agrupadores26.E]: [
{ carro: { ano: { [operadores26["="]]: 2020 } } },
{ carro: { modelo: { [operadores26.in]: ["Civic", "Corolla"] } } },
],
},
],
})

0
src/unidades_medida.ts Normal file → Executable file
View file

0
src/uuid.ts Normal file → Executable file
View file

0
src/variaveisComuns.ts Normal file → Executable file
View file

0
tsconfig-back.json Normal file → Executable file
View file

0
tsconfig-front.json Normal file → Executable file
View file

0
tsconfig.json Normal file → Executable file
View file

0
tsup/como usar.md Normal file → Executable file
View file

4
tsup/tsup.config.back.ts Normal file → Executable file
View file

@ -18,6 +18,10 @@ export const tsup_config_back: Options = {
minify: false, // Geralmente não minificamos o código do backend em produção, mas você pode mudar minify: false, // Geralmente não minificamos o código do backend em produção, mas você pode mudar
platform: "node", platform: "node",
outExtension: () => ({ js: ".js" }), outExtension: () => ({ js: ".js" }),
loader: {
".svg": "text",
".md": "text",
},
} }
// Exporta a configuração padrão usando defineConfig // Exporta a configuração padrão usando defineConfig

0
tsup/tsup.config.front.interno.ts Normal file → Executable file
View file

6
tsup/tsup.config.front.ts Normal file → Executable file
View file

@ -16,9 +16,13 @@ export const tsup_config_front: Options = {
sourcemap: false, sourcemap: false,
minify: true, // Recomendado para builds de produção minify: true, // Recomendado para builds de produção
platform: "browser", platform: "browser",
external: ['dayjs'], external: ['dayjs', 'cross-fetch', 'uuid', 'zod'],
outExtension: () => ({ js: ".mjs" }), outExtension: () => ({ js: ".mjs" }),
shims: false, shims: false,
loader: {
".svg": "text",
".md": "text",
},
} }
// Exporta a configuração padrão usando defineConfig // Exporta a configuração padrão usando defineConfig

0
tsup/tsup.config.interno.ts Normal file → Executable file
View file

0
tsup/tsup.config.ts Normal file → Executable file
View file