react-lgpd-consent 0.5.3 → 0.6.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/API.md +576 -0
- package/CHANGELOG.md +44 -11
- package/QUICKSTART.md +118 -14
- package/README.en.md +67 -396
- package/README.md +73 -1131
- package/package.json +7 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.6.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#105](https://github.com/lucianoedipo/react-lgpd-consent/pull/105) [`1deb3bb`](https://github.com/lucianoedipo/react-lgpd-consent/commit/1deb3bb56853165f7ec231e73d7b1d271e51b8f1) Thanks [@lucianoedipo](https://github.com/lucianoedipo)! - chore: sincronizar pnpm-lock.yaml com versões bumpeadas
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`1deb3bb`](https://github.com/lucianoedipo/react-lgpd-consent/commit/1deb3bb56853165f7ec231e73d7b1d271e51b8f1)]:
|
|
10
|
+
- @react-lgpd-consent/core@0.6.1
|
|
11
|
+
- @react-lgpd-consent/mui@0.6.1
|
|
12
|
+
|
|
13
|
+
## 0.6.0
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- [#103](https://github.com/lucianoedipo/react-lgpd-consent/pull/103) [`4c9ebf2`](https://github.com/lucianoedipo/react-lgpd-consent/commit/4c9ebf231ff58168294f2fde405298b7087016ca) Thanks [@lucianoedipo](https://github.com/lucianoedipo)! - feat: adicionar diagnósticos de peer dependencies e sistema de troubleshooting
|
|
18
|
+
- ✨ Novo sistema de diagnóstico automático para peer deps
|
|
19
|
+
- 🔍 Detecta múltiplas instâncias de React (causa "Invalid hook call")
|
|
20
|
+
- 📋 Verifica versões de React (18-19) e MUI (5-7)
|
|
21
|
+
- 📖 Nova página TROUBLESHOOTING.md com soluções detalhadas
|
|
22
|
+
- 🔧 Mensagens acionáveis no console em modo desenvolvimento
|
|
23
|
+
- 🚀 Configuração de Turborepo para builds otimizados
|
|
24
|
+
- 📦 Configuração de Changesets para versionamento automatizado
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [[`4c9ebf2`](https://github.com/lucianoedipo/react-lgpd-consent/commit/4c9ebf231ff58168294f2fde405298b7087016ca)]:
|
|
29
|
+
- @react-lgpd-consent/core@0.6.0
|
|
30
|
+
- @react-lgpd-consent/mui@0.6.0
|
|
31
|
+
|
|
3
32
|
Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.
|
|
4
33
|
|
|
5
34
|
# Changelog
|
|
@@ -25,9 +54,8 @@ Esta versão introduz uma **arquitetura modular** que separa a lógica de consen
|
|
|
25
54
|
- **Tree-shaking eficiente**: Instale apenas o que você precisa
|
|
26
55
|
- Core isolado permite uso com qualquer biblioteca de UI
|
|
27
56
|
- MUI opcional como peer dependency
|
|
28
|
-
|
|
29
57
|
- **Workspace PNPM**: Monorepo organizado com builds independentes
|
|
30
|
-
- **Guia de migração completo**: [MIGRATION.md](
|
|
58
|
+
- **Guia de migração completo**: [MIGRATION.md](../../MIGRATION.md) documentando todos os cenários
|
|
31
59
|
- **Scripts de publicação**: Suporte para publicar pacotes independentemente
|
|
32
60
|
|
|
33
61
|
### ⚠️ Breaking Changes
|
|
@@ -36,7 +64,7 @@ Esta versão introduz uma **arquitetura modular** que separa a lógica de consen
|
|
|
36
64
|
- **Antes**: `<ConsentProvider theme={createTheme({...})} />`
|
|
37
65
|
- **Depois**: Use `<ThemeProvider>` do Material-UI diretamente
|
|
38
66
|
- **Razão**: Separação de responsabilidades - tema do MUI gerenciado pelo MUI
|
|
39
|
-
- **Migração**: Ver [MIGRATION.md](
|
|
67
|
+
- **Migração**: Ver [MIGRATION.md](../../MIGRATION.md) seção "Breaking Changes"
|
|
40
68
|
|
|
41
69
|
### 🔄 Changed
|
|
42
70
|
|
|
@@ -70,26 +98,28 @@ packages/
|
|
|
70
98
|
|
|
71
99
|
### 📊 Bundle Sizes
|
|
72
100
|
|
|
73
|
-
| Pacote
|
|
74
|
-
|
|
75
|
-
| `@react-lgpd-consent/core` | 86.04 KB | 89.12 KB | 125.82 KB | React, js-cookie, zod
|
|
76
|
-
| `@react-lgpd-consent/mui`
|
|
77
|
-
| `react-lgpd-consent`
|
|
101
|
+
| Pacote | ESM | CJS | DTS | Dependências |
|
|
102
|
+
| -------------------------- | -------- | -------- | --------- | --------------------------- |
|
|
103
|
+
| `@react-lgpd-consent/core` | 86.04 KB | 89.12 KB | 125.82 KB | React, js-cookie, zod |
|
|
104
|
+
| `@react-lgpd-consent/mui` | 17.69 KB | 20.95 KB | 11.78 KB | core + @mui/material (peer) |
|
|
105
|
+
| `react-lgpd-consent` | 104 KB\* | 110 KB\* | 138 KB\* | mui (workspace) |
|
|
78
106
|
|
|
79
107
|
\* Bundle final = core + mui (~104 KB total)
|
|
80
108
|
|
|
81
109
|
### 🎯 Migration Paths
|
|
82
110
|
|
|
83
111
|
1. **Uso de componentes UI** (maioria dos usuários):
|
|
112
|
+
|
|
84
113
|
```bash
|
|
85
114
|
# Opção A: Pacote agregador (zero mudanças)
|
|
86
115
|
npm install react-lgpd-consent@0.5.0
|
|
87
|
-
|
|
116
|
+
|
|
88
117
|
# Opção B: Pacote MUI direto (recomendado)
|
|
89
118
|
npm install @react-lgpd-consent/mui
|
|
90
119
|
```
|
|
91
120
|
|
|
92
121
|
2. **Headless/UI customizada**:
|
|
122
|
+
|
|
93
123
|
```bash
|
|
94
124
|
npm uninstall react-lgpd-consent @mui/material
|
|
95
125
|
npm install @react-lgpd-consent/core
|
|
@@ -122,7 +152,7 @@ packages/
|
|
|
122
152
|
|
|
123
153
|
### 📚 Documentation
|
|
124
154
|
|
|
125
|
-
- Novo [MIGRATION.md](
|
|
155
|
+
- Novo [MIGRATION.md](../../MIGRATION.md) com:
|
|
126
156
|
- 3 cenários de migração detalhados
|
|
127
157
|
- Comparativo de bundles
|
|
128
158
|
- Troubleshooting completo
|
|
@@ -152,7 +182,6 @@ packages/
|
|
|
152
182
|
- `consent_initialized`: Disparado após hidratação inicial do `ConsentProvider`
|
|
153
183
|
- `consent_updated`: Disparado quando usuário altera preferências via banner, modal ou API
|
|
154
184
|
- Payload inclui: `event`, `consent_version`, `timestamp` (ISO 8601), `categories`, `origin`, `changed_categories`
|
|
155
|
-
|
|
156
185
|
- **Rastreamento de Origem**: Campo `origin` identifica fonte da mudança de consentimento
|
|
157
186
|
- `'banner'`: Decisão feita no CookieBanner
|
|
158
187
|
- `'modal'`: Ajuste feito no PreferencesModal
|
|
@@ -1015,17 +1044,21 @@ A v0.2.1 introduz um **sistema inteligente de orientações** que guia desenvolv
|
|
|
1015
1044
|
### 🧩 Sem breaking changes
|
|
1016
1045
|
|
|
1017
1046
|
- Alterações são compatíveis; padrões seguros preservados.
|
|
1047
|
+
|
|
1018
1048
|
## [0.5.0] - 25/10/2025 — Modularização inicial do workspace
|
|
1019
1049
|
|
|
1020
1050
|
### 🧱 Estrutura modular
|
|
1051
|
+
|
|
1021
1052
|
- Repositório convertido em workspace PNPM com três pacotes: `@react-lgpd-consent/core`, `@react-lgpd-consent/mui` e `react-lgpd-consent`.
|
|
1022
1053
|
- Pacote agregador passa a construir entradas adicionais (`core` e `mui`) expondo subpath exports oficiais.
|
|
1023
1054
|
|
|
1024
1055
|
### 🎨 Camada MUI dedicada
|
|
1056
|
+
|
|
1025
1057
|
- Publicação inicial de `@react-lgpd-consent/mui` como _proxy_ dos componentes padrão.
|
|
1026
1058
|
- Metadados de peer dependencies ajustados para reforçar que Material-UI é opcional (requerido apenas para a camada visual).
|
|
1027
1059
|
|
|
1028
1060
|
### 🧰 Ferramentas & DX
|
|
1061
|
+
|
|
1029
1062
|
- Scripts de lint/test/build convertidos para `pnpm --filter react-lgpd-consent <comando>`.
|
|
1030
1063
|
- Jest e TypeDoc atualizados para apontar para `packages/core` e `packages/react-lgpd-consent`.
|
|
1031
1064
|
- Documentação (README, QUICKSTART, DEVELOPMENT) revisada para explicar a nova arquitetura e o processo de migração gradual.
|
package/QUICKSTART.md
CHANGED
|
@@ -25,7 +25,7 @@ npm install @mui/material @mui/icons-material @emotion/react @emotion/styled
|
|
|
25
25
|
|
|
26
26
|
## 🎯 Uso Básico (30 segundos)
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
```tsx
|
|
29
29
|
import React from 'react'
|
|
30
30
|
import { ConsentProvider } from 'react-lgpd-consent'
|
|
31
31
|
|
|
@@ -42,6 +42,7 @@ function App() {
|
|
|
42
42
|
</main>
|
|
43
43
|
</ConsentProvider>
|
|
44
44
|
)
|
|
45
|
+
```
|
|
45
46
|
|
|
46
47
|
## 🧭 Storybook — quick note
|
|
47
48
|
|
|
@@ -51,7 +52,7 @@ This repository ships an interactive Storybook playground used for manual testin
|
|
|
51
52
|
|
|
52
53
|
```bash
|
|
53
54
|
npm run storybook
|
|
54
|
-
|
|
55
|
+
```
|
|
55
56
|
|
|
56
57
|
- Build static Storybook (for publishing to GitHub Pages):
|
|
57
58
|
|
|
@@ -63,11 +64,6 @@ Notes:
|
|
|
63
64
|
|
|
64
65
|
- The Storybook preview (`.storybook/preview.tsx`) applies a clean environment between stories (removes consent cookie and performs defensive DOM cleanup). Check that file when creating stories that rely on a clean initial state.
|
|
65
66
|
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export default App
|
|
69
|
-
|
|
70
|
-
````
|
|
71
67
|
|
|
72
68
|
## ⚡ Quickstarts: Next.js (App Router) e Vite
|
|
73
69
|
|
|
@@ -402,8 +398,8 @@ function MyComponent() {
|
|
|
402
398
|
|
|
403
399
|
## 📋 Tabela Completa de Props do ConsentProvider
|
|
404
400
|
|
|
405
|
-
| Prop
|
|
406
|
-
|
|
|
401
|
+
| Prop | Tipo | Obrigatória | Padrão | Descrição |
|
|
402
|
+
| ----------------- | ------------------------------------------------ | ----------- | -------------- | --------------------------------------- |
|
|
407
403
|
| `categories` | `ProjectCategoriesConfig` | ✅ **Sim** | - | Define as categorias de cookies do projeto |
|
|
408
404
|
| `texts` | `Partial<ConsentTexts>` | ❌ Não | Textos padrão PT-BR | Customiza textos da interface |
|
|
409
405
|
| `theme` | `any` | ❌ Não | Tema padrão | Tema Material-UI para os componentes |
|
|
@@ -422,7 +418,89 @@ function MyComponent() {
|
|
|
422
418
|
| `preferencesModalProps` | `object` | ❌ Não | `{}` | Props adicionais para o modal |
|
|
423
419
|
| `floatingPreferencesButtonProps` | `object` | ❌ Não | `{}` | Props adicionais para o botão flutuante |
|
|
424
420
|
| `initialState` | `ConsentState` | ❌ Não | - | Estado inicial para hidratação SSR |
|
|
425
|
-
| `cookie` | `Partial<ConsentCookieOptions>` | ❌ Não | Opções padrão | Configurações do cookie de
|
|
421
|
+
| `cookie` | `Partial<ConsentCookieOptions>` | ❌ Não | Opções padrão | Configurações do cookie (override fino de `name`, `domain`, `sameSite` etc.) |
|
|
422
|
+
| `storage` | `ConsentStorageConfig` | ❌ Não | `{ namespace: 'lgpd-consent', version: '1' }` | Namespace, versão e domínio compartilhado da chave de consentimento |
|
|
423
|
+
| `onConsentVersionChange` | `(context: ConsentVersionChangeContext) => void` | ❌ Não | Reset automático | Hook disparado após bump da chave; use para limpar caches adicionais |
|
|
424
|
+
|
|
425
|
+
## 🔄 Versionamento de Consentimento (0.5.x)
|
|
426
|
+
|
|
427
|
+
- **Resumo da solicitação**: namespace + versão para a chave de consentimento e estratégia de migração entre releases, garantindo compartilhamento entre subdomínios.
|
|
428
|
+
- **Caso de uso — problema que resolve**: quando o escopo de dados muda (novas categorias, integrações etc.), usuários precisam reafirmar consentimento. Sem um identificador de versão, o estado antigo permanece ativo e quebra conformidade.
|
|
429
|
+
|
|
430
|
+
### Solução proposta
|
|
431
|
+
- `storage.namespace` e `storage.version` geram automaticamente o nome do cookie via `buildConsentStorageKey`, mantendo o schema `namespace__v<versão>` (`lgpd-consent__v1` por padrão).
|
|
432
|
+
- `storage.domain` centraliza o domínio compartilhado (ex.: `.gov.br`) para que um único banner sirva múltiplos subdomínios.
|
|
433
|
+
- `onConsentVersionChange` é chamado sempre que a chave muda. O reset do estado é automático, mas o hook permite limpar caches customizados (ex.: localStorage, indexedDB) antes de liberar a nova experiência.
|
|
434
|
+
- Guia de migração: documente no seu changelog interno quando e por que o valor de `storage.version` mudou. O bump NÃO é breaking change porque a API pública permanece compatível—apenas força o fluxo de re-consent.
|
|
435
|
+
- Breaking change? **Não** — quem não configurar `storage` continua usando `lgpd-consent__v1`; ao aumentar a versão apenas ocorre re-consentimento.
|
|
436
|
+
|
|
437
|
+
### Critérios de aceitação
|
|
438
|
+
- Trocar `storage.version` força o fluxo completo: cookie antigo removido, `ConsentProvider` volta ao estado sem consentimento e o usuário vê o banner novamente.
|
|
439
|
+
- Subdomínios compartilham o mesmo consentimento quando `storage.domain` usa um domínio com ponto (`.example.com`).
|
|
440
|
+
- `onConsentVersionChange` entrega `previousKey`, `nextKey` e `resetConsent` para coordenar invalidação de caches externos.
|
|
441
|
+
|
|
442
|
+
## 🔒 Cookies necessários sempre ativos
|
|
443
|
+
|
|
444
|
+
- **Resumo da solicitação**: implementar a política de “necessários sempre ativos” tanto na UI quanto na persistência.
|
|
445
|
+
- **Caso de uso — problema resolvido**: atende ao requisito LGPD/ANPD de que cookies estritamente necessários não podem ser desativados; evita confusão na interface e garante consistência nos hooks.
|
|
446
|
+
|
|
447
|
+
### Como a biblioteca reforça a regra
|
|
448
|
+
- A categoria `necessary` é adicionada automaticamente pelo `ConsentProvider` e sempre persistida como `true`.
|
|
449
|
+
- `setPreference('necessary', false)` e `setPreferences({ necessary: false, ... })` são ignorados com logs de aviso — o estado permanece com `necessary=true`.
|
|
450
|
+
- O `PreferencesModal` padrão exibe a categoria com switch desabilitado e o texto `Cookies necessários (sempre ativos)`.
|
|
451
|
+
- `writeConsentCookie` garante `necessary=true` mesmo que o estado enviado esteja corrompido.
|
|
452
|
+
- Hooks (`useConsent`, `useCategoryStatus`) e integrações (`ConsentScriptLoader`, dataLayer) sempre recebem `necessary=true`.
|
|
453
|
+
|
|
454
|
+
### Exemplo (apenas cookies necessários)
|
|
455
|
+
|
|
456
|
+
```tsx
|
|
457
|
+
import { ConsentProvider } from '@react-lgpd-consent/core'
|
|
458
|
+
|
|
459
|
+
export function MinimalBoundary({ children }: { children: React.ReactNode }) {
|
|
460
|
+
return <ConsentProvider categories={{ enabledCategories: [] }}>{children}</ConsentProvider>
|
|
461
|
+
}
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### Critérios de aceitação
|
|
465
|
+
- UI, hooks, persistência e dataLayer mantêm `necessary=true` em todos os caminhos.
|
|
466
|
+
- Testes automatizados cobrem tentativas de toggle/programmatic override e serialização.
|
|
467
|
+
- Breaking change? **Não** — o comportamento já era esperado; agora é reforçado pelo runtime com avisos para cenários indevidos.
|
|
468
|
+
|
|
469
|
+
### Exemplo completo (namespace + versão + subdomínio)
|
|
470
|
+
|
|
471
|
+
```tsx
|
|
472
|
+
import { buildConsentStorageKey, ConsentProvider } from 'react-lgpd-consent'
|
|
473
|
+
|
|
474
|
+
function ComplianceWrapper({ children }: { children: React.ReactNode }) {
|
|
475
|
+
return (
|
|
476
|
+
<ConsentProvider
|
|
477
|
+
categories={{ enabledCategories: ['analytics', 'marketing'] }}
|
|
478
|
+
storage={{
|
|
479
|
+
namespace: 'portal.gov.br',
|
|
480
|
+
version: '2025-Q4',
|
|
481
|
+
domain: '.gov.br',
|
|
482
|
+
}}
|
|
483
|
+
cookie={{
|
|
484
|
+
// Opcional: sobrescreva o nome explicitamente (útil para auditoria legada)
|
|
485
|
+
name: buildConsentStorageKey({ namespace: 'portal.gov.br', version: '2025-Q4' }),
|
|
486
|
+
}}
|
|
487
|
+
onConsentVersionChange={({ previousKey, nextKey, resetConsent }) => {
|
|
488
|
+
console.info('[consent] versão atualizada', { previousKey, nextKey })
|
|
489
|
+
window.dataLayer?.push({ event: 'consent_version_bumped', previousKey, nextKey })
|
|
490
|
+
localStorage.removeItem('marketing-optins')
|
|
491
|
+
resetConsent()
|
|
492
|
+
}}
|
|
493
|
+
>
|
|
494
|
+
{children}
|
|
495
|
+
</ConsentProvider>
|
|
496
|
+
)
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### Alternativas consideradas
|
|
501
|
+
- **Invalidar sempre** (reset em toda visita) prejudica a UX e reduz taxas de aceitação.
|
|
502
|
+
- **Nunca invalidar** mantém consentimentos fora de escopo e compromete a conformidade.
|
|
503
|
+
- A solução de namespace + versão expõe explicitamente quando o reconsentimento é necessário.
|
|
426
504
|
|
|
427
505
|
## 🎨 Componentes Customizados com TypeScript
|
|
428
506
|
|
|
@@ -488,7 +566,7 @@ A biblioteca `react-lgpd-consent` não injeta um `ThemeProvider` global por cont
|
|
|
488
566
|
|
|
489
567
|
```tsx
|
|
490
568
|
import { ConsentProvider, createDefaultConsentTheme } from 'react-lgpd-consent'
|
|
491
|
-
|
|
569
|
+
<ConsentProvider
|
|
492
570
|
theme={createDefaultConsentTheme()}
|
|
493
571
|
categories={{ enabledCategories: ['analytics'] }}
|
|
494
572
|
>
|
|
@@ -496,6 +574,7 @@ import { ConsentProvider, createDefaultConsentTheme } from 'react-lgpd-consent'
|
|
|
496
574
|
</ConsentProvider>
|
|
497
575
|
```
|
|
498
576
|
|
|
577
|
+
|
|
499
578
|
Isso evita alterações indesejadas no contexto do MUI do seu app e problemas de SSR.
|
|
500
579
|
|
|
501
580
|
```tsx
|
|
@@ -1159,7 +1238,31 @@ function App() {
|
|
|
1159
1238
|
|
|
1160
1239
|
## 🆘 Solução de Problemas Comuns
|
|
1161
1240
|
|
|
1162
|
-
|
|
1241
|
+
> 💡 **Diagnósticos automáticos**: A partir da v0.5.4, o react-lgpd-consent detecta automaticamente problemas comuns (múltiplas instâncias de React, versões incompatíveis) e exibe mensagens detalhadas no console em modo desenvolvimento.
|
|
1242
|
+
|
|
1243
|
+
Para problemas mais complexos, consulte o **[Guia Completo de Troubleshooting](../../TROUBLESHOOTING.md)**.
|
|
1244
|
+
|
|
1245
|
+
### Erros mais comuns
|
|
1246
|
+
|
|
1247
|
+
#### "Invalid hook call" / Múltiplas instâncias de React
|
|
1248
|
+
|
|
1249
|
+
Se você vê este erro, provavelmente tem múltiplas versões de React carregadas. O diagnóstico automático exibirá instruções específicas para o seu gerenciador de pacotes.
|
|
1250
|
+
|
|
1251
|
+
**Solução rápida (pnpm)**:
|
|
1252
|
+
```json
|
|
1253
|
+
{
|
|
1254
|
+
"pnpm": {
|
|
1255
|
+
"overrides": {
|
|
1256
|
+
"react": "$react",
|
|
1257
|
+
"react-dom": "$react-dom"
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
}
|
|
1261
|
+
```
|
|
1262
|
+
|
|
1263
|
+
**Mais detalhes**: [TROUBLESHOOTING.md - Invalid hook call](../../TROUBLESHOOTING.md#erro-invalid-hook-call)
|
|
1264
|
+
|
|
1265
|
+
#### "ConsentProvider must be used within ConsentProvider"
|
|
1163
1266
|
|
|
1164
1267
|
```tsx
|
|
1165
1268
|
// ❌ Errado - hook usado fora do provider
|
|
@@ -1219,9 +1322,10 @@ document.cookie = 'cookieConsent=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/
|
|
|
1219
1322
|
## 📚 Próximos Passos
|
|
1220
1323
|
|
|
1221
1324
|
- 📖 [Documentação Completa da API](./API.md)
|
|
1222
|
-
-
|
|
1325
|
+
- 🔧 [Guia de Troubleshooting](../../TROUBLESHOOTING.md)
|
|
1326
|
+
- 🏗️ [Guia de Conformidade LGPD](../../CONFORMIDADE.md)
|
|
1223
1327
|
- 🔌 [Integrações Nativas](./INTEGRACOES.md)
|
|
1224
|
-
- 🧪 [Executar o Exemplo](
|
|
1328
|
+
- 🧪 [Executar o Exemplo](../../example/)
|
|
1225
1329
|
|
|
1226
1330
|
---
|
|
1227
1331
|
|