@react-lgpd-consent/core 0.6.3 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,335 @@
1
1
  # Changelog - @react-lgpd-consent/core
2
2
 
3
+ ## 0.7.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#133](https://github.com/lucianoedipo/react-lgpd-consent/pull/133) [`33bc0eb`](https://github.com/lucianoedipo/react-lgpd-consent/commit/33bc0ebcb40ce65c70b02668d3c0a97efb1854f1) Thanks [@lucianoedipo](https://github.com/lucianoedipo)! - # 🧩 Fundamento Crítico de Consentimento — SUPER TASK v0.7.1
8
+
9
+ **Persistência + Loader + Consent Mode v2**
10
+
11
+ Esta release estabelece o **núcleo legal, técnico e funcional** da biblioteca react-lgpd-consent, garantindo um contrato sólido, seguro e auditável para uso institucional e governamental.
12
+
13
+ ***
14
+
15
+ ## 🔹 Bloco A — Persistência de Consentimento por Cookie
16
+
17
+ ### ✨ API Consolidada de Persistência
18
+
19
+ Nova API completa no `ConsentProvider`:
20
+
21
+ ```typescript
22
+ <ConsentProvider
23
+ cookie={{
24
+ name: 'lgpd-consent',
25
+ domain: '.example.com', // Compartilha entre subdomínios
26
+ path: '/',
27
+ sameSite: 'Lax', // Default seguro
28
+ secure: true, // Auto em HTTPS
29
+ maxAge: 31536000, // Segundos (substitui maxAgeDays)
30
+ }}
31
+ >
32
+ ```
33
+
34
+ **Regras Implementadas:**
35
+ - ✅ Defaults seguros: `SameSite=Lax`, `Secure=true` em HTTPS
36
+ - ✅ Categoria `necessary` **sempre forçada como true**
37
+ - ✅ Nenhuma gravação de cookie durante SSR
38
+ - ✅ Suporte completo a subdomínios via `domain`
39
+ - ✅ Nova opção `maxAge` (segundos, padrão moderno)
40
+ - ✅ Opção `maxAgeDays` deprecated mas mantida para compatibilidade
41
+
42
+ **Ambientes Suportados:**
43
+ - ✅ `localhost` (desenvolvimento)
44
+ - ✅ `dev` / `staging` (domínios customizados)
45
+ - ✅ `production` (HTTPS obrigatório)
46
+ - ✅ Comportamento **independente de NODE_ENV**
47
+
48
+ ***
49
+
50
+ ## 🔹 Bloco B — ConsentScriptLoader com Bloqueio Real
51
+
52
+ ### 🚫 Contrato de Bloqueio Garantido
53
+
54
+ > **Nenhum script não necessário executa antes do consentimento correspondente.**
55
+
56
+ ### ✨ Sistema de Fila e Priorização
57
+
58
+ Implementado `ConsentScriptLoader` com:
59
+
60
+ ```typescript
61
+ registerScript({
62
+ id: 'google-analytics',
63
+ category: 'analytics',
64
+ priority: 1, // Ordem de execução
65
+ execute: () => {
66
+ // Seu script aqui
67
+ },
68
+ onConsentUpdate: (granted) => {
69
+ // Reagir a mudanças de consentimento
70
+ },
71
+ })
72
+ ```
73
+
74
+ **Recursos Implementados:**
75
+ - ✅ **Fila interna de execução** com ordenação por:
76
+ - 1. Categoria (`necessary` → `analytics` → `marketing`, etc.)
77
+ - 2. Prioridade (numérica)
78
+ - 3. Timestamp (ordem de registro)
79
+ - ✅ Scripts `necessary` executam **imediatamente**
80
+ - ✅ Scripts de outras categorias aguardam **consentimento explícito**
81
+ - ✅ Suporte a `onConsentUpdate` para reconfiguração dinâmica
82
+ - ✅ Snapshot de consentimento para scripts que precisam do estado atual
83
+ - ✅ **Otimização anti-duplicação**: integrações não são reexecutadas a cada render quando criadas inline (ex.: `integrations={[createGoogleAnalyticsIntegration(...)]}`). Sistema mantém hash estrutural para detectar mudanças reais e prevenir múltiplas inicializações do mesmo script.
84
+
85
+ **Observabilidade em DEV:**
86
+ - ✅ Logs detalhados de ordem de execução
87
+ - ✅ Indicação clara de categoria liberada
88
+ - ✅ Rastreamento de status de cada script
89
+ - ⚠️ **Silencioso em produção** (performance otimizada)
90
+
91
+ ***
92
+
93
+ ## 🔹 Bloco C — Integração Nativa Google Consent Mode v2
94
+
95
+ ### 🎯 Implementação Automática
96
+
97
+ **Zero configuração manual necessária!**
98
+
99
+ ```typescript
100
+ import { createGoogleAnalyticsIntegration } from '@react-lgpd-consent/core'
101
+
102
+ const ga4 = createGoogleAnalyticsIntegration({
103
+ measurementId: 'G-XXXXXXXXXX'
104
+ })
105
+
106
+ <ConsentScriptLoader integrations={[ga4]} />
107
+ ```
108
+
109
+ **O que a biblioteca faz automaticamente:**
110
+ 1. ✅ Inicializa `dataLayer` se não existir
111
+ 2. ✅ Define `gtag('consent', 'default', denied)` **antes** de qualquer tag
112
+ 3. ✅ Mapeia categorias corretamente:
113
+ - `analytics` → `analytics_storage`
114
+ - `marketing` → `ad_storage`, `ad_user_data`, `ad_personalization`
115
+ 4. ✅ Envia `gtag('consent', 'update')` quando usuário escolhe preferências
116
+ 5. ✅ Dispara eventos de ciclo de vida:
117
+ ```javascript
118
+ { event: 'consent_initialized' }
119
+ { event: 'consent_updated', preferences: {...} }
120
+ ```
121
+
122
+ **Factories Implementadas:**
123
+ - ✅ `createGoogleAnalyticsIntegration` (GA4)
124
+ - ✅ `createGoogleTagManagerIntegration` (GTM)
125
+ - ✅ Suporte a `bootstrap()` para inicialização pré-consentimento
126
+ - ✅ Suporte a `onConsentUpdate()` para reconfiguração dinâmica
127
+
128
+ ### 🔒 Ordem de Inicialização Segura
129
+
130
+ Fluxo garantido pela implementação:
131
+
132
+ ```
133
+ 1. dataLayer criado
134
+ 2. gtag('consent', 'default', denied)
135
+ 3. Loader bloqueia tags
136
+ 4. Usuário consente
137
+ 5. gtag('consent', 'update', granted/denied)
138
+ 6. Tags disparam conforme consentimento
139
+ ```
140
+
141
+ ### ⚡ Compatibilidade Next.js (SSR)
142
+ - ✅ Nenhum acesso a `window` fora de `useEffect`
143
+ - ✅ App Router (Next.js 13+)
144
+ - ✅ Pages Router (Next.js 12+)
145
+ - ✅ **Zero hydration mismatch**
146
+ - ✅ Estratégia de renderização: `client-only` quando necessário
147
+
148
+ ***
149
+
150
+ ## 🆕 Novas APIs Públicas
151
+
152
+ ### Core Package (`@react-lgpd-consent/core`):
153
+
154
+ ```typescript
155
+ // Registro de scripts
156
+ registerScript(config: RegisteredScript): void
157
+
158
+ // Factories de integrações
159
+ createGoogleAnalyticsIntegration(config): ScriptIntegration
160
+ createGoogleTagManagerIntegration(config): ScriptIntegration
161
+
162
+ // Utilitários de cookie
163
+ readConsentCookie(name?: string): ConsentState | null
164
+ writeConsentCookie(state: ConsentState, options?: CookieOptions): void
165
+
166
+ // Novos tipos
167
+ type RegisteredScript = { ... }
168
+ type ScriptIntegration = { ... }
169
+ interface LoadScriptOptions = { ... }
170
+ ```
171
+
172
+ ***
173
+
174
+ ## 📚 Documentação Atualizada
175
+ - ✅ **API.md** - Novas APIs de `registerScript` e Consent Mode v2
176
+ - ✅ **INTEGRACOES.md** - Guias completos de GA4, GTM, Facebook Pixel
177
+ - ✅ **MIGRATION.md** - Guia de migração v0.7.0 → v0.7.1
178
+ - ✅ **SUPER_TASK_VALIDATION.md** - Relatório técnico de validação completo
179
+
180
+ ***
181
+
182
+ ## 🔄 Breaking Changes
183
+
184
+ **Nenhum!** Esta release é 100% backward-compatible:
185
+ - ✅ Opção `maxAgeDays` deprecated mas funcional
186
+ - ✅ Comportamento padrão preservado
187
+ - ✅ APIs antigas continuam funcionando
188
+ - ✅ Migração gradual suportada
189
+
190
+ ***
191
+
192
+ ## 🎯 Melhorias Complementares
193
+
194
+ ### Sistema de i18n para Diagnósticos
195
+
196
+ Sistema básico de internacionalização para mensagens de peer dependencies:
197
+ - ✅ Suporte a pt-BR (padrão) e en
198
+ - ✅ API para customização: `setPeerDepsLocale()`, `setPeerDepsMessages()`
199
+ - ✅ Mensagens extraídas para constantes (melhor manutenibilidade)
200
+
201
+ ### Refatorações e Otimizações
202
+ - ✅ Strings de mensagens extraídas para constantes
203
+ - ✅ Separação de concerns (lógica vs conteúdo)
204
+ - ✅ Type safety aprimorado em toda API
205
+ - ✅ Performance otimizada (sem logs em produção)
206
+ - ✅ **Fix crítico**: Prevenção de reexecução de integrações a cada render quando `integrations` prop muda referência (inline array). Sistema agora usa hash estrutural para detectar mudanças reais e manter scripts já registrados estáveis.
207
+
208
+ ## 0.7.0
209
+
210
+ ### Minor Changes
211
+
212
+ - [#124](https://github.com/lucianoedipo/react-lgpd-consent/pull/124) [`7669c4f`](https://github.com/lucianoedipo/react-lgpd-consent/commit/7669c4fba84b5cfea8f7da8ab65468110d3e77f7) Thanks [@lucianoedipo](https://github.com/lucianoedipo)! - # v0.7.0 - Código Limpo, Testes Aprimorados e Qualidade de Código
213
+
214
+ Esta release é parte do trabalho nas issues: [#60](https://github.com/lucianoedipo/react-lgpd-consent/issues/60), [#63](https://github.com/lucianoedipo/react-lgpd-consent/issues/63), [#64](https://github.com/lucianoedipo/react-lgpd-consent/issues/64), [#65](https://github.com/lucianoedipo/react-lgpd-consent/issues/65), [#68](https://github.com/lucianoedipo/react-lgpd-consent/issues/68), [#70](https://github.com/lucianoedipo/react-lgpd-consent/issues/70), [#71](https://github.com/lucianoedipo/react-lgpd-consent/issues/71), [#72](https://github.com/lucianoedipo/react-lgpd-consent/issues/72)
215
+
216
+ ## 🧹 Correções de Lint e Code Quality
217
+
218
+ ### Migração para APIs Modernas
219
+ - **globalThis**: Convertidos ~50+ usos de `window` e `global` para `globalThis.window` e `globalThis` (compatibilidade SSR/universal)
220
+ - **String.replaceAll()**: Migrado de `replace()` com regex global para `replaceAll()` (ES2021)
221
+ - **Object.hasOwn()**: Migrado de `Object.prototype.hasOwnProperty.call()` para `Object.hasOwn()` (ES2022)
222
+ - **Number.parseInt()**: Padronizado uso de `Number.parseInt()` em vez de `parseInt()` global
223
+
224
+ ### TypeScript Configuration
225
+ - Adicionado `ES2021.String` ao lib do tsconfig para suportar `String.replaceAll()`
226
+ - Adicionado `ES2022.Object` ao lib do tsconfig para suportar `Object.hasOwn()`
227
+ - Mantida compatibilidade com target `ES2020`
228
+
229
+ > **ℹ️ Atenção à Compatibilidade com Browsers**
230
+ >
231
+ > Esta versão faz uso de recursos ES2021/ES2022 (`String.replaceAll()`, `Object.hasOwn()`, etc.), que não estão disponíveis em todos os navegadores (especialmente versões antigas do Safari, Edge ou Firefox). Se você utiliza este pacote em aplicações web que precisam suportar navegadores legados, é recomendado configurar um transpiler (como Babel) e/ou polyfills apropriados para garantir compatibilidade.
232
+
233
+ ### Melhorias de Código
234
+ - **cookieDiscovery.ts**: Função `matchPattern` movida para outer scope (evita recriação)
235
+ - **validation.ts**: Adicionado warning quando prop `categories` não é fornecida
236
+ - **Condições**: Invertidas condições negadas para melhor legibilidade
237
+ - **Type Safety**: Correções de type assertions em testes
238
+
239
+ ## 🧪 Aumento Significativo de Cobertura de Testes
240
+
241
+ ### Cobertura Geral: 94.82% → 95.46% (+0.64%)
242
+
243
+ | Arquivo | Antes | Depois | Melhoria |
244
+ | ---------------------- | ------ | ----------- | -------- |
245
+ | **theme.ts** | 83.33% | **100%** ✅ | +16.67% |
246
+ | **cookieDiscovery.ts** | 88.13% | **96.61%** | +8.48% |
247
+ | **peerDepsCheck.ts** | 74.19% | **80.64%** | +6.45% |
248
+ | **validation.ts** | 96.87% | **98.24%** | +1.37% |
249
+
250
+ ### Novos Testes Adicionados (+33 testes: 318 → 351)
251
+
252
+ #### peerDepsCheck.ts
253
+ - Testes para detecção de múltiplas instâncias React via DevTools hook
254
+ - Testes para verificação de versões React no limite inferior/superior do range
255
+ - Testes para logging de erros e warnings quando `logWarnings=true`
256
+ - Cobertura de edge cases de versão semver complexa
257
+
258
+ #### dataLayerEvents.ts
259
+ - Testes para `ensureDataLayer` criar dataLayer quando undefined
260
+ - Testes para preservação de eventos existentes no dataLayer
261
+ - Testes para origins programmatic/reset
262
+ - Testes para previousCategories vazias/undefined
263
+ - Testes de SSR safety (window parcialmente definido)
264
+ - Testes para falha silenciosa de dataLayer.push
265
+
266
+ #### cookieDiscovery.ts
267
+ - Testes para uso de cookies descobertos globalmente (`__LGPD_DISCOVERED_COOKIES__`)
268
+ - Testes para `registerOverrides=true` chamando `setCookieCatalogOverrides`
269
+ - Testes para cookies sem nome ou duplicados
270
+ - Testes para match de padrões wildcard
271
+
272
+ #### cookieUtils.ts
273
+ - Testes para JSON malformado e objetos vazios
274
+ - Testes para `buildConsentStorageKey` com caracteres especiais
275
+ - Testes para `createConsentAuditEntry` com estado mínimo
276
+ - Testes para uso de nomes customizados em `removeConsentCookie`
277
+
278
+ #### theme.ts (100% coverage)
279
+ - Testes completos para palette, typography e component overrides
280
+ - Testes para button contained hover shadows
281
+ - Testes para Paper e Dialog border radius
282
+ - Testes para função deprecada `defaultConsentTheme()`
283
+ - Verificação de novas instâncias a cada chamada
284
+
285
+ ## 📚 Documentação
286
+
287
+ ### DEVELOPMENT.md
288
+ - Adicionada seção **"Cobertura de Testes"** com tabela de métricas por módulo
289
+ - Comando para rodar testes com cobertura: `pnpm test:coverage`
290
+ - Tabela detalhada mostrando Statements/Branches/Functions/Lines por pacote
291
+
292
+ ### TypeDoc
293
+ - Documentação regenerada com todas as APIs atualizadas
294
+ - 15 warnings aceitáveis sobre links relativos para pacotes do monorepo
295
+
296
+ ## ✅ Validação
297
+ - ✅ **type-check**: Todos os tipos válidos (ES2021/ES2022 APIs suportadas)
298
+ - ✅ **lint**: Código limpo sem erros
299
+ - ✅ **test**: 351/351 testes passando (100%)
300
+ - ✅ **build**: Build limpo de todos os pacotes
301
+ - ✅ **docs**: TypeDoc gerado com sucesso
302
+
303
+ ## 🔧 Arquivos Modificados
304
+
305
+ ### Core Package
306
+ - `src/utils/scriptIntegrations.ts`: globalThis, Date.now()
307
+ - `src/utils/peerDepsCheck.ts`: globalThis, Number.parseInt()
308
+ - `src/utils/dataLayerEvents.ts`: globalThis, ??= operator
309
+ - `src/utils/cookieUtils.ts`: replaceAll(), globalThis, condição invertida
310
+ - `src/utils/cookieDiscovery.ts`: matchPattern outer scope
311
+ - `src/utils/validation.ts`: warning categories undefined
312
+ - `src/context/ConsentContext.tsx`: Object.hasOwn(), state deps
313
+ - `src/context/__tests__/CategoriesContext.test.tsx`: globalThis
314
+ - `__tests__/*`: +25 novos testes
315
+
316
+ ### MUI Package
317
+ - `src/utils/theme.ts`: 100% coverage
318
+ - `src/utils/__tests__/theme.test.ts`: +8 novos testes
319
+
320
+ ### Configuration
321
+ - `tsconfig.base.json`: ES2021.String, ES2022.Object no lib
322
+
323
+ ### Documentation
324
+ - `DEVELOPMENT.md`: seção de cobertura de testes
325
+
326
+ ***
327
+
328
+ **Breaking Changes:** Nenhuma
329
+ **Migration Required:** Não
330
+
331
+ Esta release foca em qualidade de código, testes robustos e aderência a padrões modernos do JavaScript/TypeScript.
332
+
3
333
  ## 0.6.3
4
334
 
5
335
  ### Patch Changes
@@ -42,5 +372,19 @@
42
372
  - 🚀 Configuração de Turborepo para builds otimizados
43
373
  - 📦 Configuração de Changesets para versionamento automatizado
44
374
 
45
- As notas de versão completas são mantidas no arquivo `CHANGELOG.md` da raiz do repositório.
46
- Este pacote segue a numeração conjunta da biblioteca `react-lgpd-consent`.
375
+ ---
376
+
377
+ ## Versões Anteriores (< 0.6.0)
378
+
379
+ Para histórico completo de versões 0.5.x e anteriores, consulte:
380
+
381
+ - [CHANGELOG.md do pacote principal](../react-lgpd-consent/CHANGELOG.md)
382
+ - [Releases no GitHub](https://github.com/lucianoedipo/react-lgpd-consent/releases)
383
+
384
+ **Resumo de marcos importantes:**
385
+
386
+ - **v0.5.0** (25/10/2025): Arquitetura modular - criação dos pacotes `@react-lgpd-consent/core` e `@react-lgpd-consent/mui`
387
+ - **v0.4.5** (25/10/2025): DataLayer events para Google Tag Manager
388
+ - **v0.4.1** (21/09/2025): Expansão de integrações nativas (Hotjar, Mixpanel, Clarity, Intercom, Zendesk)
389
+ - **v0.3.0-v0.4.0**: Sistema de design tokens, categorias customizadas, testes de acessibilidade
390
+ - **v0.1.0-v0.2.x**: Implementação inicial com ConsentProvider, CookieBanner, PreferencesModal
package/README.md CHANGED
@@ -62,6 +62,68 @@ function MyCustomBanner() {
62
62
  - **Integrações:** Google Analytics, GTM, UserWay, Facebook Pixel, Hotjar, etc.
63
63
  - **Tipos TypeScript:** Tipagem completa para toda a API
64
64
 
65
+ ## 🧩 Scripts, Fila e Consent Mode v2
66
+
67
+ - **ConsentScriptLoader** agora mantém uma fila interna por categoria e prioridade. Scripts `necessary` rodam imediatamente; os demais só executam após consentimento explícito.
68
+ - **API programática `registerScript`**: registre callbacks inline ou integrações que não usam `<script src>` e deixe a fila disparar no momento correto. Estados da fila: `pending` → `running` → `executed` (recarrega apenas se `allowReload=true`).
69
+ ```ts
70
+ const cleanup = registerScript({
71
+ id: 'ga-consent-mode',
72
+ category: 'analytics',
73
+ priority: 10, // maior roda antes dentro da categoria
74
+ execute: bootstrapConsentMode,
75
+ onConsentUpdate: ({ preferences }) => pushConsentSignals(preferences),
76
+ })
77
+ ```
78
+ - **Consent Mode v2 nativo**: `createGoogleAnalyticsIntegration` e `createGoogleTagManagerIntegration` inicializam `consent=default` (denied) e enviam `consent=update` conforme as preferências do usuário, sem snippet manual.
79
+ - **Observabilidade dev-only**: logs ordenados de execução para depurar a fila (silenciados em produção).
80
+
81
+ ## 🆕 Novidades v0.7.0
82
+
83
+ ### Callbacks de Lifecycle
84
+
85
+ ```tsx
86
+ import { ConsentProvider } from '@react-lgpd-consent/core'
87
+
88
+ <ConsentProvider
89
+ onConsentInit={(state) => console.log('Init:', state)}
90
+ onConsentChange={(current, previous) => {
91
+ console.log('Mudou:', { current, previous })
92
+ }}
93
+ onAuditLog={(entry) => {
94
+ // Enviar para backend
95
+ fetch('/api/audit', { method: 'POST', body: JSON.stringify(entry) })
96
+ }}
97
+ >
98
+ ```
99
+
100
+ ### Presets ANPD
101
+
102
+ ```tsx
103
+ import { createAnpdCategories, ANPD_CATEGORY_PRESETS } from '@react-lgpd-consent/core'
104
+
105
+ // Preset BÁSICO
106
+ const basic = createAnpdCategories({ include: ['analytics'] })
107
+
108
+ // Preset COMPLETO
109
+ const full = createAnpdCategories({
110
+ include: ['analytics', 'marketing', 'functional', 'social', 'personalization']
111
+ })
112
+ ```
113
+
114
+ ### Auditoria de Consentimento
115
+
116
+ ```tsx
117
+ import { createConsentAuditEntry } from '@react-lgpd-consent/core'
118
+
119
+ const audit = createConsentAuditEntry(
120
+ { consented: true, preferences: { analytics: true } },
121
+ { action: 'update', storageKey: 'lgpd-consent__v1' }
122
+ )
123
+ ```
124
+
125
+ 📖 **Saiba mais:** [TROUBLESHOOTING.md](../../TROUBLESHOOTING.md)
126
+
65
127
  ## 📚 Documentação
66
128
 
67
129
  Para documentação completa, exemplos e API reference:
@@ -77,4 +139,3 @@ Para documentação completa, exemplos e API reference:
77
139
  ## 📄 Licença
78
140
 
79
141
  MIT © [Luciano Édipo](https://github.com/lucianoedipo)
80
-