mirror of
https://github.com/melgarafael/DeskcommCRM.git
synced 2026-10-02 01:28:34 +08:00
Sentry (modelo comunidade com guardrails): - DSN deixa de ser hardcoded; resolveSentryDsn() lê SENTRY_DSN em runtime (server/edge via process.env; browser via window.__PUBLIC_ENV__) - default = Sentry da comunidade; SENTRY_DSN=off desliga; <dsn> aponta pro próprio - opt-out vale no browser sem rebuild (via PublicEnvScript) - beforeSend sanitizado (CPF/telefone/e-mail) mantido Licença: adiciona LICENSE MIT (Copyright 2026 Rafael Melgaço). README: política de suporte 'as-is', responsabilidades self-host, disclaimer LGPD (quem hospeda é o controlador) e como ligar/desligar a telemetria. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UHfaYtmvsCjiKfdWDLsMdK
36 lines
1.3 KiB
TypeScript
36 lines
1.3 KiB
TypeScript
import { headers } from "next/headers";
|
|
import { env } from "@/lib/env";
|
|
|
|
/**
|
|
* Injeta a config pública do Supabase em runtime, antes do JS da app rodar.
|
|
*
|
|
* Por que existe: numa imagem Docker genérica (self-host), as NEXT_PUBLIC_* NÃO
|
|
* são queimadas no bundle — este componente lê os valores REAIS do projeto do
|
|
* usuário (via `env`, que parseia process.env inteiro em runtime no servidor) e
|
|
* os entrega ao browser em `window.__PUBLIC_ENV__`. `lib/supabase/browser.ts`
|
|
* lê dali.
|
|
*
|
|
* `await headers()` força render dinâmico: garante que o script use o env de
|
|
* runtime, nunca o placeholder embutido durante `next build`.
|
|
*/
|
|
export async function PublicEnvScript() {
|
|
await headers();
|
|
|
|
const payload = JSON.stringify({
|
|
NEXT_PUBLIC_SUPABASE_URL: env.NEXT_PUBLIC_SUPABASE_URL,
|
|
NEXT_PUBLIC_SUPABASE_ANON_KEY: env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
|
|
// Exposto pro Sentry do browser respeitar o opt-out (SENTRY_DSN=off) em runtime,
|
|
// sem rebuild. DSN não é segredo. Ver lib/sentry/dsn.ts.
|
|
SENTRY_DSN: env.SENTRY_DSN,
|
|
})
|
|
// Evita quebrar o </script> se algum valor contiver a sequência.
|
|
.replace(/</g, "\\u003c");
|
|
|
|
return (
|
|
<script
|
|
// Conteúdo derivado de env do servidor (não de input do usuário).
|
|
dangerouslySetInnerHTML={{ __html: `window.__PUBLIC_ENV__=${payload};` }}
|
|
/>
|
|
);
|
|
}
|