feat: adição de novos ícones SVG e configuração do ambiente

- Adicionados ícones SVG para ChatGPT, Claude, Gemini e OpenRouter
- Implementados ícones para modos claro e escuro do ChatGPT
- Criado script de inicialização para PostgreSQL com extensão pgcrypto
- Adicionado script de configuração de ambiente que faz backup do .env
- Configurado tsconfig.json para TypeScript com opções de compilação
This commit is contained in:
Felipe Coutinho
2025-11-15 15:49:36 -03:00
commit ea0b8618e0
441 changed files with 53569 additions and 0 deletions

40
lib/logo/index.ts Normal file
View File

@@ -0,0 +1,40 @@
/**
* Logo utilities
*
* Consolidated from:
* - /lib/logo.ts (utility functions)
*/
/**
* Normalizes logo path to get just the filename
* @param logo - Logo path or URL
* @returns Filename only
*/
export const normalizeLogo = (logo?: string | null) =>
logo?.split("/").filter(Boolean).pop() ?? "";
/**
* Derives a display name from a logo filename
* @param logo - Logo path or filename
* @returns Formatted display name
* @example
* deriveNameFromLogo("my-company-logo.png") // "My Company Logo"
*/
export const deriveNameFromLogo = (logo?: string | null) => {
if (!logo) {
return "";
}
const fileName = normalizeLogo(logo);
if (!fileName) {
return "";
}
const withoutExtension = fileName.replace(/\.[^/.]+$/, "");
return withoutExtension
.split(/[-_.\s]+/)
.filter(Boolean)
.map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())
.join(" ");
};

30
lib/logo/options.ts Normal file
View File

@@ -0,0 +1,30 @@
/**
* Logo options loader
*
* Consolidated from:
* - /lib/logo-options.ts (async logo loading)
*/
import { readdir } from "node:fs/promises";
import path from "node:path";
const LOGOS_DIRECTORY = path.join(process.cwd(), "public", "logos");
const LOGO_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".svg", ".webp"]);
/**
* Loads available logo files from the public/logos directory
* @returns Array of logo filenames sorted alphabetically
*/
export async function loadLogoOptions() {
try {
const files = await readdir(LOGOS_DIRECTORY, { withFileTypes: true });
return files
.filter((file) => file.isFile())
.map((file) => file.name)
.filter((file) => LOGO_EXTENSIONS.has(path.extname(file).toLowerCase()))
.sort((a, b) => a.localeCompare(b, "pt-BR", { sensitivity: "base" }));
} catch {
return [];
}
}