Files
DeskcommCRM/app/public-env-script.tsx
T
Rafael MelgaçoandClaude Opus 4.8 07eb106303 chore(oss): Sentry opt-in configurável + licença MIT + política de suporte/LGPD
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
2026-07-06 21:10:55 -03:00

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};` }}
/>
);
}