3 Commits

Author SHA1 Message Date
Felipe Coutinho
5b03824a72 fix(security): remover header CSP de respostas de API
CSP não tem efeito em respostas JSON e expunha domínios
internos (Umami, Supabase, logo.dev) em endpoints públicos.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 14:44:18 +00:00
Felipe Coutinho
74dda549f5 style(format): corrigir ordenação de imports em 3 arquivos
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:57:05 +00:00
Felipe Coutinho
137b63f256 style(format): corrigir formatação Biome em 5 arquivos
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 19:54:56 +00:00
9 changed files with 16 additions and 14 deletions

View File

@@ -51,9 +51,7 @@ type UniqueCategory = {
icon: string | null; icon: string | null;
}; };
async function fetchAllCategories( async function fetchAllCategories(userId: string): Promise<CategoryOption[]> {
userId: string,
): Promise<CategoryOption[]> {
const result = await db const result = await db
.select({ .select({
id: categories.id, id: categories.id,

View File

@@ -1,4 +1,7 @@
import { formatCurrentDate, getGreeting } from "@/features/dashboard/widget-registry/welcome-widget"; import {
formatCurrentDate,
getGreeting,
} from "@/features/dashboard/widget-registry/welcome-widget";
type DashboardWelcomeProps = { type DashboardWelcomeProps = {
name?: string | null; name?: string | null;

View File

@@ -1,6 +1,6 @@
import Image from "next/image"; import Image from "next/image";
import type { InstallmentExpense } from "@/features/dashboard/expenses/installment-expenses-queries";
import { buildInstallmentExpenseDisplay } from "@/features/dashboard/expenses/installment-expenses-helpers"; import { buildInstallmentExpenseDisplay } from "@/features/dashboard/expenses/installment-expenses-helpers";
import type { InstallmentExpense } from "@/features/dashboard/expenses/installment-expenses-queries";
import { EstablishmentLogo } from "@/shared/components/entity-avatar"; import { EstablishmentLogo } from "@/shared/components/entity-avatar";
import MoneyValues from "@/shared/components/money-values"; import MoneyValues from "@/shared/components/money-values";
import { Progress } from "@/shared/components/ui/progress"; import { Progress } from "@/shared/components/ui/progress";

View File

@@ -1,7 +1,7 @@
import { RiMoneyDollarCircleLine, RiSlideshowLine } from "@remixicon/react"; import { RiMoneyDollarCircleLine, RiSlideshowLine } from "@remixicon/react";
import type { PaymentOverviewTab } from "@/features/dashboard/payments/payment-overview-tabs";
import type { PaymentConditionsData } from "@/features/dashboard/payments/payment-conditions-queries"; import type { PaymentConditionsData } from "@/features/dashboard/payments/payment-conditions-queries";
import type { PaymentMethodsData } from "@/features/dashboard/payments/payment-methods-queries"; import type { PaymentMethodsData } from "@/features/dashboard/payments/payment-methods-queries";
import type { PaymentOverviewTab } from "@/features/dashboard/payments/payment-overview-tabs";
import { import {
Tabs, Tabs,
TabsContent, TabsContent,

View File

@@ -6,6 +6,7 @@ import {
transactions, transactions,
} from "@/db/schema"; } from "@/db/schema";
import type { DashboardBillsSnapshot } from "@/features/dashboard/bills/bills-queries"; import type { DashboardBillsSnapshot } from "@/features/dashboard/bills/bills-queries";
import type { PurchasesByCategoryData } from "@/features/dashboard/categories/purchases-by-category-queries";
import type { InstallmentExpensesData } from "@/features/dashboard/expenses/installment-expenses-queries"; import type { InstallmentExpensesData } from "@/features/dashboard/expenses/installment-expenses-queries";
import type { RecurringExpensesData } from "@/features/dashboard/expenses/recurring-expenses-queries"; import type { RecurringExpensesData } from "@/features/dashboard/expenses/recurring-expenses-queries";
import type { import type {
@@ -15,7 +16,6 @@ import type {
import type { PaymentConditionsData } from "@/features/dashboard/payments/payment-conditions-queries"; import type { PaymentConditionsData } from "@/features/dashboard/payments/payment-conditions-queries";
import type { PaymentMethodsData } from "@/features/dashboard/payments/payment-methods-queries"; import type { PaymentMethodsData } from "@/features/dashboard/payments/payment-methods-queries";
import type { PaymentStatusData } from "@/features/dashboard/payments/payment-status-queries"; import type { PaymentStatusData } from "@/features/dashboard/payments/payment-status-queries";
import type { PurchasesByCategoryData } from "@/features/dashboard/categories/purchases-by-category-queries";
import type { TopEstablishmentsData } from "@/features/dashboard/top-establishments-queries"; import type { TopEstablishmentsData } from "@/features/dashboard/top-establishments-queries";
import { excludeTransactionsFromExcludedAccounts } from "@/features/dashboard/transaction-filters"; import { excludeTransactionsFromExcludedAccounts } from "@/features/dashboard/transaction-filters";
import { import {

View File

@@ -151,7 +151,9 @@ export const InboxCard = memo(function InboxCard({
<CardContent className="min-h-0 flex-1 overflow-hidden py-2"> <CardContent className="min-h-0 flex-1 overflow-hidden py-2">
{item.originalTitle && ( {item.originalTitle && (
<p className="mb-1 line-clamp-2 text-sm font-medium">{item.originalTitle}</p> <p className="mb-1 line-clamp-2 text-sm font-medium">
{item.originalTitle}
</p>
)} )}
<p className="line-clamp-4 whitespace-pre-wrap text-sm text-muted-foreground"> <p className="line-clamp-4 whitespace-pre-wrap text-sm text-muted-foreground">
{item.originalText} {item.originalText}

View File

@@ -99,8 +99,7 @@ export function DeleteAccountForm() {
Preferências do app, insights salvos e tokens do Companion Preferências do app, insights salvos e tokens do Companion
</li> </li>
<li className="font-medium text-foreground"> <li className="font-medium text-foreground">
Categorias padrão e pessoa admin serão recriadas Categorias padrão e pessoa admin serão recriadas automaticamente
automaticamente
</li> </li>
</ul> </ul>

View File

@@ -228,9 +228,7 @@ function buildColumns({
className="text-muted-foreground" className="text-muted-foreground"
aria-hidden aria-hidden
/> />
<span className="sr-only"> <span className="sr-only">Dividido entre pessoas</span>
Dividido entre pessoas
</span>
</span> </span>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top"> <TooltipContent side="top">

View File

@@ -101,7 +101,9 @@ export default async function proxy(request: NextRequest) {
} }
const response = NextResponse.next(); const response = NextResponse.next();
response.headers.set("Content-Security-Policy", buildCsp()); if (!pathname.startsWith("/api/")) {
response.headers.set("Content-Security-Policy", buildCsp());
}
return response; return response;
} }