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/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](./MIGRATION.md) documentando todos os cenários
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](./MIGRATION.md) seção "Breaking Changes"
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 | ESM | CJS | DTS | Dependências |
74
- |--------|-----|-----|-----|--------------|
75
- | `@react-lgpd-consent/core` | 86.04 KB | 89.12 KB | 125.82 KB | React, js-cookie, zod |
76
- | `@react-lgpd-consent/mui` | 17.69 KB | 20.95 KB | 11.78 KB | core + @mui/material (peer) |
77
- | `react-lgpd-consent` | 104 KB* | 110 KB* | 138 KB* | mui (workspace) |
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](./MIGRATION.md) com:
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
- ````tsx
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 | Tipo | Obrigatória | Padrão | Descrição |
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 consentimento |
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
- ;<ConsentProvider
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
- ### "ConsentProvider must be used within ConsentProvider"
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
- - 🏗️ [Guia de Conformidade LGPD](./CONFORMIDADE.md)
1325
+ - 🔧 [Guia de Troubleshooting](../../TROUBLESHOOTING.md)
1326
+ - 🏗️ [Guia de Conformidade LGPD](../../CONFORMIDADE.md)
1223
1327
  - 🔌 [Integrações Nativas](./INTEGRACOES.md)
1224
- - 🧪 [Executar o Exemplo](./example/)
1328
+ - 🧪 [Executar o Exemplo](../../example/)
1225
1329
 
1226
1330
  ---
1227
1331