From c19d8bc40feacc8514fe729faca70c881acf948d Mon Sep 17 00:00:00 2001 From: Luiz Silva Date: Sun, 3 Aug 2025 11:44:39 -0300 Subject: [PATCH] adicionado uuid --- dist-back/uuid.js | 30 +++++++++++++++------- dist-front/index.mjs | 2 +- package.json | 3 ++- pnpm-lock.yaml | 9 +++++++ src/uuid.ts | 60 +++++++++++++++++++++++++++++++++++--------- 5 files changed, 81 insertions(+), 23 deletions(-) diff --git a/dist-back/uuid.js b/dist-back/uuid.js index 7870410..4ca6c35 100644 --- a/dist-back/uuid.js +++ b/dist-back/uuid.js @@ -18,19 +18,31 @@ var __copyProps = (to, from, except, desc) => { var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var uuid_exports = {}; __export(uuid_exports, { - uuid: () => uuid + erUuid: () => erUuid, + uuidV3: () => uuidV3, + uuidV4: () => uuidV4, + validarUuid: () => validarUuid }); module.exports = __toCommonJS(uuid_exports); -const letras = "0123456789abcdef".split(""); -const uuid = () => { - letras.sort(() => Math.random() - 0.5); - const modelo = "xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx".split(""); - const retorno = modelo.map( - (letra) => letra === "x" ? letras[(1e3 * Math.random() | 0) % letras.length] : letra - ).join(""); +var import_uuid = require("uuid"); +const erUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; +const validarUuid = (uuid) => { + const retorno = erUuid.test(String(uuid || "")); return retorno; }; +const uuidV3 = (chave, grupo) => { + return (0, import_uuid.v3)( + // Converte a chave para string (de forma segura) + typeof chave === "string" ? chave : typeof chave === "number" ? String(chave) : JSON.stringify(chave), + // Se um grupo foi fornecido, gera um UUID v3 recursivamente com base nele, senão usa NIL + grupo ? typeof grupo == "string" && validarUuid(grupo) ? grupo : uuidV3(grupo) : import_uuid.NIL + ); +}; +const uuidV4 = import_uuid.v4; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { - uuid + erUuid, + uuidV3, + uuidV4, + validarUuid }); diff --git a/dist-front/index.mjs b/dist-front/index.mjs index cbe4beb..9d577ed 100644 --- a/dist-front/index.mjs +++ b/dist-front/index.mjs @@ -1 +1 @@ -var f="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),J=e=>`eli-${Array.from({length:e||8}).map(()=>f[(999*Math.random()|0)%f.length]).join("")}`;var l={},v=(e,o,t)=>{let i=typeof e=="string"?e:typeof e=="number"?String(e):encodeURIComponent(JSON.stringify(e)),m=t&&new Date().getTime()+t*1e3;o!==void 0&&(l[i]={valor:o,validade:m});let r=l[i];if(!(r?.validade&&r.validadel,Y=v,H=e=>o=>v(e,o);var X="00000000-0000-0000-0000-000000000000",j=(n=>(n.codigo="codigo",n.excluido="excluido",n.data_hora_criacao="data_hora_criacao",n.data_hora_atualizacao="data_hora_atualizacao",n.codigo_usuario_criacao="codigo_usuario_criacao",n.codigo_usuario_atualizacao="codigo_usuario_atualizacao",n.versao="versao",n))(j||{}),T=(o=>(o.token="token",o))(T||{}),z=(t=>(t.Usuario="usuario",t.Fornecedor="fornecedor",t))(z||{});var M=(t=>(t["="]="=",t["!="]="!=",t[">"]=">",t[">="]=">=",t["<"]="<",t["<="]="<=",t.like="like",t.in="in",t))(M||{});import a from"dayjs";import"dayjs/locale/pt-br";import S from"dayjs/plugin/duration";import $ from"dayjs/plugin/isSameOrAfter";import N from"dayjs/plugin/isSameOrBefore";import P from"dayjs/plugin/minMax";import A from"dayjs/plugin/relativeTime";import q from"dayjs/plugin/timezone";import I from"dayjs/plugin/utc";import K from"dayjs/plugin/weekOfYear";a.extend(I);a.extend(q);a.extend(K);a.extend(N);a.extend($);a.extend(P);a.extend(A);a.extend(S);a.locale("pt-br");var le="https://carro-de-boi-idz-one.b-cdn.net";var U=[{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"}],fe=e=>{let o=String(e||"").toLocaleLowerCase().split(".").pop();return U.find(i=>i.ext===o)?.tipo||"outros"};import C from"cross-fetch";var he=e=>new Promise(o=>setTimeout(()=>o(!0),e)),x=e=>Object.keys(e).join("/");var F="https://log.idz.one",G="/loki/api/v1/push",D=async({objeto:e})=>{let o=await C(`${F}${G}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}).catch(t=>t);return o.ok?[e]:[e,`Erro ${o.status}: ${await o?.text?.()}`]},u="",we=e=>{u=e},Le=({app:e,eProducao:o,parametros:t})=>({inquilino:i,usuario:m,parametros:r})=>async(c,n,b)=>{let{__filename:p,detalhes:s,local:d,parametros:y}=b||{},_=`${o?"":"DEV-"}${e}`;u&&p&&(p=p.replace(u,"")),d&&(s=[`${x({local:d})}="${d}"`,...s||[]]),p&&(s=[`${x({__filename:p})}="${p}"`,...s||[]]);let w=`${Date.now()}000000`,L=s?.length?`${n} | ${s.map(k=>JSON.stringify(k)).join(" | ")}`:n,O={streams:[{stream:{app:_,inquilino:i,usuario:m,level:c,...t||{},...r||{},...y||{}},values:[[w,L]]}]};return await D({objeto:O})};var ke=()=>"Ol\xE1 Mundo! (fun\xE7\xE3o)";var Te="Ol\xE1 Mundo! (vari\xE1vel)";var Ne=(...e)=>e.map(o=>o==null?"":String(o).normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\s+/g," ").toLowerCase()).join(" ");var h=class{constructor({caminho:o,acaoIr:t}){this._partesCaminho=[];this._acaoIr=t,this._partesCaminho=(Array.isArray(o)?o:[o]).flatMap(i=>i.split("/")).filter(Boolean)}get caminho(){return`/${this._partesCaminho.join("/")}`}set caminho(o){this._partesCaminho=o.split("/").filter(t=>t)}endereco(o,t){let i=new URL(typeof window<"u"?window.location.href:"http://localhost");i.pathname=this.caminho,i.search="";let m=Object.entries(o);for(let[r,c]of m)i.searchParams.set(String(r),c??"");return i.hash="",t&&(i.hash=`#${i.search}`,i.search=""),i.href}ir(o){this._acaoIr?this._acaoIr(this.endereco(o)):typeof window<"u"&&(window.location.href=this.endereco(o))}get parametros(){let o=new URL(typeof window<"u"?window.location.href:"http://localhost"),t=o.searchParams,i=Object.fromEntries(t.entries()),m=o.hash;if(m){let r=Object.fromEntries(new URLSearchParams(m.slice(1)).entries());return{...i,...r}}return i}};var E=(r=>(r.UN="UN",r.KG="KG",r.TON="TON",r.g="g",r["M\xB3"]="M\xB3",r.Lt="Lt",r))(E||{}),qe=[{sigla_unidade:"KG",nome:"Quilograma",sigla_normalizada:"KG",normalizar:e=>e,tipo:"massa"},{sigla_unidade:"g",nome:"Grama",sigla_normalizada:"KG",normalizar:e=>e/1e3,tipo:"massa"},{sigla_unidade:"TON",nome:"Tonelada",sigla_normalizada:"KG",normalizar:e=>e*1e3,tipo:"massa"},{sigla_unidade:"Lt",nome:"Litro",sigla_normalizada:"Lt",normalizar:e=>e,tipo:"volume"},{sigla_unidade:"M\xB3",nome:"Metro C\xFAbico",sigla_normalizada:"Lt",normalizar:e=>e*1e3,tipo:"volume"},{sigla_unidade:"UN",nome:"Unidade",sigla_normalizada:"UN",normalizar:e=>e,tipo:"unidade"}];var g="0123456789abcdef".split(""),Ke=()=>(g.sort(()=>Math.random()-.5),"xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx".split("").map(t=>t==="x"?g[(1e3*Math.random()|0)%g.length]:t).join(""));export{h as TipagemRotas,J as aleatorio,v as cacheM,H as cacheMFixo,Y as cacheMemoria,j as camposComuns,le as cdn_carro_de_boi,a as dayjsbr,we as defineCwd,he as esperar,U as extensoes,Le as logger,x as nomeVariavel,M as operadores,D as postLogger,E as siglas_unidades_medida,Ne as texto_busca,fe as tipoArquivo,z as tipoUsuarioResiduos,T as tx,ke as umaFuncao,Te as umaVariavel,qe as unidades_medida,Ke as uuid,X as uuid_null,Q as verCacheM}; +var f="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),W=e=>`eli-${Array.from({length:e||8}).map(()=>f[(999*Math.random()|0)%f.length]).join("")}`;var l={},x=(e,o,t)=>{let i=typeof e=="string"?e:typeof e=="number"?String(e):encodeURIComponent(JSON.stringify(e)),m=t&&new Date().getTime()+t*1e3;o!==void 0&&(l[i]={valor:o,validade:m});let r=l[i];if(!(r?.validade&&r.validadel,ee=x,oe=e=>o=>x(e,o);var ie="00000000-0000-0000-0000-000000000000",k=(n=>(n.codigo="codigo",n.excluido="excluido",n.data_hora_criacao="data_hora_criacao",n.data_hora_atualizacao="data_hora_atualizacao",n.codigo_usuario_criacao="codigo_usuario_criacao",n.codigo_usuario_atualizacao="codigo_usuario_atualizacao",n.versao="versao",n))(k||{}),j=(o=>(o.token="token",o))(j||{}),T=(t=>(t.Usuario="usuario",t.Fornecedor="fornecedor",t))(T||{});var z=(t=>(t["="]="=",t["!="]="!=",t[">"]=">",t[">="]=">=",t["<"]="<",t["<="]="<=",t.like="like",t.in="in",t))(z||{});import a from"dayjs";import"dayjs/locale/pt-br";import S from"dayjs/plugin/duration";import $ from"dayjs/plugin/isSameOrAfter";import N from"dayjs/plugin/isSameOrBefore";import M from"dayjs/plugin/minMax";import P from"dayjs/plugin/relativeTime";import U from"dayjs/plugin/timezone";import A from"dayjs/plugin/utc";import I from"dayjs/plugin/weekOfYear";a.extend(A);a.extend(U);a.extend(I);a.extend(N);a.extend($);a.extend(M);a.extend(P);a.extend(S);a.locale("pt-br");var ve="https://carro-de-boi-idz-one.b-cdn.net";var q=[{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"}],_e=e=>{let o=String(e||"").toLocaleLowerCase().split(".").pop();return q.find(i=>i.ext===o)?.tipo||"outros"};import K from"cross-fetch";var we=e=>new Promise(o=>setTimeout(()=>o(!0),e)),u=e=>Object.keys(e).join("/");var C="https://log.idz.one",F="/loki/api/v1/push",G=async({objeto:e})=>{let o=await K(`${C}${F}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}).catch(t=>t);return o.ok?[e]:[e,`Erro ${o.status}: ${await o?.text?.()}`]},g="",Te=e=>{g=e},ze=({app:e,eProducao:o,parametros:t})=>({inquilino:i,usuario:m,parametros:r})=>async(d,n,h)=>{let{__filename:s,detalhes:p,local:c,parametros:b}=h||{},y=`${o?"":"DEV-"}${e}`;g&&s&&(s=s.replace(g,"")),c&&(p=[`${u({local:c})}="${c}"`,...p||[]]),s&&(p=[`${u({__filename:s})}="${s}"`,...p||[]]);let _=`${Date.now()}000000`,L=p?.length?`${n} | ${p.map(O=>JSON.stringify(O)).join(" | ")}`:n,w={streams:[{stream:{app:y,inquilino:i,usuario:m,level:d,...t||{},...r||{},...b||{}},values:[[_,L]]}]};return await G({objeto:w})};var $e=()=>"Ol\xE1 Mundo! (fun\xE7\xE3o)";var Me="Ol\xE1 Mundo! (vari\xE1vel)";var qe=(...e)=>e.map(o=>o==null?"":String(o).normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\s+/g," ").toLowerCase()).join(" ");var v=class{constructor({caminho:o,acaoIr:t}){this._partesCaminho=[];this._acaoIr=t,this._partesCaminho=(Array.isArray(o)?o:[o]).flatMap(i=>i.split("/")).filter(Boolean)}get caminho(){return`/${this._partesCaminho.join("/")}`}set caminho(o){this._partesCaminho=o.split("/").filter(t=>t)}endereco(o,t){let i=new URL(typeof window<"u"?window.location.href:"http://localhost");i.pathname=this.caminho,i.search="";let m=Object.entries(o);for(let[r,d]of m)i.searchParams.set(String(r),d??"");return i.hash="",t&&(i.hash=`#${i.search}`,i.search=""),i.href}ir(o){this._acaoIr?this._acaoIr(this.endereco(o)):typeof window<"u"&&(window.location.href=this.endereco(o))}get parametros(){let o=new URL(typeof window<"u"?window.location.href:"http://localhost"),t=o.searchParams,i=Object.fromEntries(t.entries()),m=o.hash;if(m){let r=Object.fromEntries(new URLSearchParams(m.slice(1)).entries());return{...i,...r}}return i}};var D=(r=>(r.UN="UN",r.KG="KG",r.TON="TON",r.g="g",r["M\xB3"]="M\xB3",r.Lt="Lt",r))(D||{}),Fe=[{sigla_unidade:"KG",nome:"Quilograma",sigla_normalizada:"KG",normalizar:e=>e,tipo:"massa"},{sigla_unidade:"g",nome:"Grama",sigla_normalizada:"KG",normalizar:e=>e/1e3,tipo:"massa"},{sigla_unidade:"TON",nome:"Tonelada",sigla_normalizada:"KG",normalizar:e=>e*1e3,tipo:"massa"},{sigla_unidade:"Lt",nome:"Litro",sigla_normalizada:"Lt",normalizar:e=>e,tipo:"volume"},{sigla_unidade:"M\xB3",nome:"Metro C\xFAbico",sigla_normalizada:"Lt",normalizar:e=>e*1e3,tipo:"volume"},{sigla_unidade:"UN",nome:"Unidade",sigla_normalizada:"UN",normalizar:e=>e,tipo:"unidade"}];import{NIL as E,v3 as V,v4 as J}from"uuid";var B=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,R=e=>B.test(String(e||"")),Q=(e,o)=>V(typeof e=="string"?e:typeof e=="number"?String(e):JSON.stringify(e),o?typeof o=="string"&&R(o)?o:Q(o):E),Ee=J;export{v as TipagemRotas,W as aleatorio,x as cacheM,oe as cacheMFixo,ee as cacheMemoria,k as camposComuns,ve as cdn_carro_de_boi,a as dayjsbr,Te as defineCwd,B as erUuid,we as esperar,q as extensoes,ze as logger,u as nomeVariavel,z as operadores,G as postLogger,D as siglas_unidades_medida,qe as texto_busca,_e as tipoArquivo,T as tipoUsuarioResiduos,j as tx,$e as umaFuncao,Me as umaVariavel,Fe as unidades_medida,Q as uuidV3,Ee as uuidV4,ie as uuid_null,R as validarUuid,Z as verCacheM}; diff --git a/package.json b/package.json index eff4805..5ee3d17 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "p-comuns", - "version": "0.207.0", + "version": "0.208.0", "description": "", "main": "./dist-back/index.js", "module": "./dist-front/index.mjs", @@ -26,6 +26,7 @@ "dependencies": { "cross-fetch": "4.1.0", "dayjs": "^1.11.13", + "uuid": "^11.1.0", "zod": "3.24.1" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0493a18..1011406 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: dayjs: specifier: ^1.11.13 version: 1.11.13 + uuid: + specifier: ^11.1.0 + version: 11.1.0 zod: specifier: 3.24.1 version: 3.24.1 @@ -709,6 +712,10 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -1279,6 +1286,8 @@ snapshots: undici-types@6.21.0: {} + uuid@11.1.0: {} + webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} diff --git a/src/uuid.ts b/src/uuid.ts index fc636c2..d950f6e 100644 --- a/src/uuid.ts +++ b/src/uuid.ts @@ -1,15 +1,51 @@ -//Gerar uma uuid V4 -const letras = "0123456789abcdef".split("") -export const uuid = () => { - letras.sort(() => Math.random() - 0.5) - const modelo = "xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx".split("") - const retorno = modelo - .map((letra) => - letra === "x" - ? letras[((1000 * Math.random()) | 0) % letras.length] - : letra, - ) - .join("") +import { NIL, v3, v4 } from "uuid" +/** + * Valida se uma string é um UUID válido (qualquer versão). + * + * @param valor - A string que será validada. + * @returns booleano indicando se é um UUID válido. + */ +export const erUuid = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i + +export const validarUuid = (uuid: string | number | undefined | null) => { + const retorno = erUuid.test(String(uuid || "")) return retorno } + +/** + * Gera um UUID determinístico (versão 3) com base em uma chave e um grupo (namespace). + * + * - Usa o algoritmo MD5 (RFC 4122). + * - Sempre retorna o mesmo UUID para a mesma combinação chave + grupo. + * - Caso o grupo não seja informado, usa o UUID "nil" como namespace. + * + * @param chave - Qualquer valor que será convertido em string para gerar o UUID (ex: número, string ou objeto). + * @param grupo - Opcional. Namespace para separar domínios diferentes de UUIDs. + * @returns UUID v3 (determinístico) + */ +export const uuidV3 = (chave: any, grupo?: string | number): string => { + return v3( + // Converte a chave para string (de forma segura) + typeof chave === "string" + ? chave + : typeof chave === "number" + ? String(chave) + : JSON.stringify(chave), + + // Se um grupo foi fornecido, gera um UUID v3 recursivamente com base nele, senão usa NIL + grupo + ? typeof grupo == "string" && validarUuid(grupo) + ? grupo + : uuidV3(grupo) + : NIL, + ) +} + +/** + * Gera um UUID v4 (aleatório, não determinístico). + * + * - Usado quando unicidade é necessária, mas não se exige que seja previsível. + */ +export const uuidV4 = v4