react-lgpd-consent 0.3.0 → 0.3.2
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 +468 -0
- package/README.md +92 -117
- package/dist/{PreferencesModal-XCTM6WJN.js → PreferencesModal-7RSEEVUK.js} +1 -1
- package/dist/chunk-JUZQJHQW.js +1406 -0
- package/dist/index.cjs +678 -311
- package/dist/index.d.cts +1683 -268
- package/dist/index.d.ts +1683 -268
- package/dist/index.js +29 -11
- package/package.json +17 -12
- package/COMPLIANCE.md +0 -107
- package/dist/chunk-R3IKVZBC.js +0 -1070
package/dist/index.js
CHANGED
|
@@ -1,15 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ConsentProvider,
|
|
3
|
+
CookieBanner,
|
|
3
4
|
DEFAULT_PROJECT_CATEGORIES,
|
|
5
|
+
FloatingPreferencesButton,
|
|
6
|
+
LogLevel,
|
|
4
7
|
PreferencesModal,
|
|
5
8
|
analyzeDeveloperConfiguration,
|
|
9
|
+
createProjectPreferences,
|
|
6
10
|
defaultConsentTheme,
|
|
11
|
+
defaultTexts,
|
|
12
|
+
getAllProjectCategories,
|
|
13
|
+
logger,
|
|
14
|
+
openPreferencesModal,
|
|
15
|
+
setDebugLogging,
|
|
7
16
|
useCategories,
|
|
8
17
|
useCategoryStatus,
|
|
9
18
|
useConsent,
|
|
10
19
|
useConsentHydration,
|
|
11
|
-
useConsentTexts
|
|
12
|
-
|
|
20
|
+
useConsentTexts,
|
|
21
|
+
useOpenPreferencesModal,
|
|
22
|
+
validateProjectPreferences
|
|
23
|
+
} from "./chunk-JUZQJHQW.js";
|
|
13
24
|
|
|
14
25
|
// src/utils/ConsentGate.tsx
|
|
15
26
|
import { Fragment, jsx } from "react/jsx-runtime";
|
|
@@ -83,7 +94,7 @@ function ConsentScriptLoader({
|
|
|
83
94
|
}
|
|
84
95
|
loadedScripts.current.add(integration.id);
|
|
85
96
|
} catch (error) {
|
|
86
|
-
|
|
97
|
+
logger.error(`\u274C Failed to load script: ${integration.id}`, error);
|
|
87
98
|
}
|
|
88
99
|
}
|
|
89
100
|
});
|
|
@@ -95,14 +106,12 @@ function useConsentScriptLoader() {
|
|
|
95
106
|
return React.useCallback(
|
|
96
107
|
async (integration) => {
|
|
97
108
|
if (!consented) {
|
|
98
|
-
|
|
99
|
-
`\u26A0\uFE0F Cannot load script ${integration.id}: No consent given`
|
|
100
|
-
);
|
|
109
|
+
logger.warn(`\u26A0\uFE0F Cannot load script ${integration.id}: No consent given`);
|
|
101
110
|
return false;
|
|
102
111
|
}
|
|
103
112
|
const shouldLoad = preferences[integration.category];
|
|
104
113
|
if (!shouldLoad) {
|
|
105
|
-
|
|
114
|
+
logger.warn(
|
|
106
115
|
`\u26A0\uFE0F Cannot load script ${integration.id}: Category '${integration.category}' not consented`
|
|
107
116
|
);
|
|
108
117
|
return false;
|
|
@@ -120,7 +129,7 @@ function useConsentScriptLoader() {
|
|
|
120
129
|
}
|
|
121
130
|
return true;
|
|
122
131
|
} catch (error) {
|
|
123
|
-
|
|
132
|
+
logger.error(`\u274C Failed to load script: ${integration.id}`, error);
|
|
124
133
|
return false;
|
|
125
134
|
}
|
|
126
135
|
},
|
|
@@ -170,8 +179,7 @@ function createUserWayIntegration(config) {
|
|
|
170
179
|
return {
|
|
171
180
|
id: "userway",
|
|
172
181
|
category: "functional",
|
|
173
|
-
|
|
174
|
-
src: `https://cdn.userway.org/widget.js`,
|
|
182
|
+
src: "https://cdn.userway.org/widget.js",
|
|
175
183
|
init: () => {
|
|
176
184
|
if (typeof window !== "undefined") {
|
|
177
185
|
window.UserWayWidgetApp = window.UserWayWidgetApp || {};
|
|
@@ -191,18 +199,28 @@ export {
|
|
|
191
199
|
ConsentGate,
|
|
192
200
|
ConsentProvider,
|
|
193
201
|
ConsentScriptLoader,
|
|
202
|
+
CookieBanner,
|
|
194
203
|
DEFAULT_PROJECT_CATEGORIES,
|
|
204
|
+
FloatingPreferencesButton,
|
|
205
|
+
LogLevel,
|
|
195
206
|
PreferencesModal,
|
|
196
207
|
analyzeDeveloperConfiguration,
|
|
197
208
|
createGoogleAnalyticsIntegration,
|
|
198
209
|
createGoogleTagManagerIntegration,
|
|
210
|
+
createProjectPreferences,
|
|
199
211
|
createUserWayIntegration,
|
|
200
212
|
defaultConsentTheme,
|
|
213
|
+
defaultTexts,
|
|
214
|
+
getAllProjectCategories,
|
|
201
215
|
loadScript,
|
|
216
|
+
openPreferencesModal,
|
|
217
|
+
setDebugLogging,
|
|
202
218
|
useCategories,
|
|
203
219
|
useCategoryStatus,
|
|
204
220
|
useConsent,
|
|
205
221
|
useConsentHydration,
|
|
206
222
|
useConsentScriptLoader,
|
|
207
|
-
useConsentTexts
|
|
223
|
+
useConsentTexts,
|
|
224
|
+
useOpenPreferencesModal,
|
|
225
|
+
validateProjectPreferences
|
|
208
226
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-lgpd-consent",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Biblioteca completa de consentimento LGPD com 6 categorias ANPD, integrações nativas e sistema extensível para React.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lgpd",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"type": "module",
|
|
35
35
|
"main": "dist/index.cjs",
|
|
36
|
-
"module": "dist/index.
|
|
36
|
+
"module": "dist/index.js",
|
|
37
37
|
"types": "dist/index.d.ts",
|
|
38
38
|
"exports": {
|
|
39
39
|
".": {
|
|
@@ -48,21 +48,22 @@
|
|
|
48
48
|
"dist",
|
|
49
49
|
"README.md",
|
|
50
50
|
"LICENSE",
|
|
51
|
-
"
|
|
51
|
+
"CHANGELOG.md"
|
|
52
52
|
],
|
|
53
53
|
"engines": {
|
|
54
54
|
"node": ">=18.18"
|
|
55
55
|
},
|
|
56
|
-
"packageManager": "
|
|
56
|
+
"packageManager": "npm@10.0.0",
|
|
57
57
|
"scripts": {
|
|
58
|
-
"clean": "rimraf dist",
|
|
58
|
+
"clean": "rimraf node_modules package-lock.json dist",
|
|
59
59
|
"build": "cross-env NODE_ENV=production tsup src/index.ts --format esm,cjs --dts --clean",
|
|
60
60
|
"dev": "cross-env NODE_ENV=development tsup src/index.ts --format esm,cjs --dts --watch",
|
|
61
61
|
"lint": "eslint . --ext .ts,.tsx",
|
|
62
62
|
"format": "prettier --write \"src/**/*.{ts,tsx,json,md}\" \"eslint.config.js\"",
|
|
63
63
|
"type-check": "tsc --noEmit",
|
|
64
|
-
"test": "jest",
|
|
65
|
-
"prepublishOnly": "npm run build"
|
|
64
|
+
"test": "jest --config jest.config.ts",
|
|
65
|
+
"prepublishOnly": "npm run build",
|
|
66
|
+
"docs:generate": "typedoc --out docs"
|
|
66
67
|
},
|
|
67
68
|
"repository": {
|
|
68
69
|
"type": "git",
|
|
@@ -92,12 +93,14 @@
|
|
|
92
93
|
"@eslint/compat": "^1.3.2",
|
|
93
94
|
"@mui/icons-material": "^7.3.1",
|
|
94
95
|
"@mui/material": "^7.3.1",
|
|
95
|
-
"@testing-library/
|
|
96
|
+
"@testing-library/dom": "^10.4.1",
|
|
97
|
+
"@testing-library/jest-dom": "^6.7.0",
|
|
96
98
|
"@testing-library/react": "^16.3.0",
|
|
97
99
|
"@testing-library/user-event": "^14.6.1",
|
|
98
|
-
"@types/jest": "^
|
|
100
|
+
"@types/jest": "^29.5.14",
|
|
99
101
|
"@types/js-cookie": "^3.0.6",
|
|
100
|
-
"@types/
|
|
102
|
+
"@types/node": "^24.2.1",
|
|
103
|
+
"@types/react": "^19.1.10",
|
|
101
104
|
"@types/react-dom": "^19.1.7",
|
|
102
105
|
"@typescript-eslint/eslint-plugin": "^8.39.1",
|
|
103
106
|
"@typescript-eslint/parser": "^8.39.1",
|
|
@@ -106,14 +109,16 @@
|
|
|
106
109
|
"eslint-config-prettier": "^10.1.8",
|
|
107
110
|
"eslint-plugin-jest": "^29.0.1",
|
|
108
111
|
"eslint-plugin-react-hooks": "^5.2.0",
|
|
109
|
-
"jest": "^
|
|
110
|
-
"jest-environment-jsdom": "^
|
|
112
|
+
"jest": "^29.7.0",
|
|
113
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
111
114
|
"prettier": "^3.6.2",
|
|
112
115
|
"react": "^19.1.1",
|
|
113
116
|
"react-dom": "^19.1.1",
|
|
114
117
|
"rimraf": "^6.0.1",
|
|
115
118
|
"ts-jest": "^29.4.1",
|
|
119
|
+
"ts-node": "^10.9.2",
|
|
116
120
|
"tsup": "^8.5.0",
|
|
121
|
+
"typedoc": "^0.28.10",
|
|
117
122
|
"typescript": "^5.9.2",
|
|
118
123
|
"typescript-eslint": "^8.39.1"
|
|
119
124
|
}
|
package/COMPLIANCE.md
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
# Guia de Conformidade e Funcionalidades - react-lgpd-consent v0.3.0
|
|
2
|
-
|
|
3
|
-
## 📜 Objetivo
|
|
4
|
-
|
|
5
|
-
Este documento descreve as medidas de conformidade da biblioteca **react-lgpd-consent** com a Lei Geral de Proteção de Dados (LGPD) e o Guia Orientativo da ANPD, além de detalhar as ferramentas que auxiliam os desenvolvedores a manter essa conformidade.
|
|
6
|
-
|
|
7
|
-
## ✅ Conformidade com a LGPD
|
|
8
|
-
|
|
9
|
-
A biblioteca implementa os seguintes princípios e requisitos da LGPD:
|
|
10
|
-
|
|
11
|
-
- **Consentimento Granular**: O usuário tem controle sobre cada categoria de cookie não essencial.
|
|
12
|
-
- **Minimização de Dados**: Apenas as categorias de cookies ativas no projeto são armazenadas no cookie de consentimento.
|
|
13
|
-
- **Transparência**: O cookie de consentimento armazena metadados de auditoria, como data, versão e origem da decisão.
|
|
14
|
-
- **Facilidade de Revogação**: O usuário pode alterar suas preferências a qualquer momento através do modal.
|
|
15
|
-
- **Segurança**: O cookie é configurado com `SameSite=Lax` e `secure=true` (em HTTPS) por padrão.
|
|
16
|
-
|
|
17
|
-
## 🧠 Sistema de Orientações para Desenvolvedores
|
|
18
|
-
|
|
19
|
-
A biblioteca inclui um sistema inteligente que **orienta os desenvolvedores sobre a configuração adequada**, garantindo que a implementação final esteja em conformidade com a LGPD.
|
|
20
|
-
|
|
21
|
-
### Console de Desenvolvimento
|
|
22
|
-
|
|
23
|
-
Em ambiente de desenvolvimento, a biblioteca exibe automaticamente no console:
|
|
24
|
-
|
|
25
|
-
- **⚠️ Avisos**: Sobre configurações ausentes ou inconsistentes.
|
|
26
|
-
- **💡 Sugestões**: Recomendações para melhorar a conformidade e a experiência do usuário.
|
|
27
|
-
- **🔧 Tabela de Categorias Ativas**: Uma lista clara de quais categorias estão em uso, para auxiliar na construção de UIs customizadas.
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
[🍪 LGPD-CONSENT] ⚠️ Avisos de Configuração
|
|
31
|
-
[🍪 LGPD-CONSENT] Nenhuma configuração de categorias especificada. Usando padrão: necessary + analytics.
|
|
32
|
-
|
|
33
|
-
[🍪 LGPD-CONSENT] 🔧 Categorias Ativas (para UI customizada)
|
|
34
|
-
┌─────────────┬──────────────────────┬─────────────┬─────────────┐
|
|
35
|
-
│ ID │ Nome │ Toggle UI? │ Essencial? │
|
|
36
|
-
├─────────────┼──────────────────────┼─────────────┼─────────────┤
|
|
37
|
-
│ necessary │ Cookies Necessários │ ❌ NÃO │ 🔒 SIM │
|
|
38
|
-
│ analytics │ Cookies Analíticos │ ✅ SIM │ ⚙️ NÃO │
|
|
39
|
-
└─────────────┴──────────────────────┴─────────────┴─────────────┘
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
**Para desabilitar estas mensagens**, use a prop `disableDeveloperGuidance={true}` no `ConsentProvider`.
|
|
43
|
-
|
|
44
|
-
### Configuração Consciente
|
|
45
|
-
|
|
46
|
-
Para evitar avisos e garantir a conformidade, especifique explicitamente as categorias de cookies que seu projeto utiliza através da prop `categories`:
|
|
47
|
-
|
|
48
|
-
```tsx
|
|
49
|
-
<ConsentProvider
|
|
50
|
-
categories={{
|
|
51
|
-
// Habilita apenas as categorias padrão que você realmente usa
|
|
52
|
-
enabledCategories: ['analytics'],
|
|
53
|
-
}}
|
|
54
|
-
>
|
|
55
|
-
<App />
|
|
56
|
-
</ConsentProvider>
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Hooks de Validação
|
|
60
|
-
|
|
61
|
-
Para construir componentes de UI customizados que reagem à configuração, utilize os hooks:
|
|
62
|
-
|
|
63
|
-
- `useCategories()`: Fornece uma lista completa das categorias ativas no projeto.
|
|
64
|
-
- `useCategoryStatus('id')`: Verifica o status de uma categoria específica (se está ativa, se é essencial, etc.).
|
|
65
|
-
|
|
66
|
-
```tsx
|
|
67
|
-
import { useCategoryStatus } from 'react-lgpd-consent'
|
|
68
|
-
|
|
69
|
-
function AnalyticsFeature() {
|
|
70
|
-
const analytics = useCategoryStatus('analytics')
|
|
71
|
-
|
|
72
|
-
// Não renderiza o componente se a categoria 'analytics' não estiver configurada no ConsentProvider
|
|
73
|
-
if (!analytics.isActive) {
|
|
74
|
-
return null
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return <AnalyticsDashboard />
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## 🚀 Roadmap de Funcionalidades
|
|
82
|
-
|
|
83
|
-
O foco da biblioteca é estabilidade e conformidade.
|
|
84
|
-
|
|
85
|
-
### v0.3.0 (Atual)
|
|
86
|
-
|
|
87
|
-
- **Foco**: Refatoração da arquitetura, melhoria da experiência do desenvolvedor (DX) e quebra de compatibilidade para simplificação.
|
|
88
|
-
- **Status**: Implementado.
|
|
89
|
-
|
|
90
|
-
### Próximas Versões (Pseudo-Versioning)
|
|
91
|
-
|
|
92
|
-
- **v0.+1.0 (Multi-Regulamentação e Conformidade Avançada)**:
|
|
93
|
-
- **Geolocalização-based Consent**: Detecção automática da região do usuário para aplicar a regulamentação relevante (LGPD, GDPR, CCPA).
|
|
94
|
-
- **Configurable Regulation Profiles**: Definição de perfis de regulamentação com requisitos específicos.
|
|
95
|
-
- **Dynamic Text Adaptation**: Textos adaptáveis com base na regulamentação ativa.
|
|
96
|
-
- **Modal Detalhado de Cookies**: Exibição de informações técnicas sobre cada cookie (nome, duração, provedor).
|
|
97
|
-
- **Logs de Auditoria**: Sistema de log client-side para registrar todas as interações de consentimento do usuário.
|
|
98
|
-
- **Templates Setoriais**: Configurações e textos pré-definidos para setores específicos (governo, saúde, e-commerce).
|
|
99
|
-
- **Plugin System**: Sistema de plugins para extensibilidade de integrações e lógica customizada.
|
|
100
|
-
- **Improved `ConsentGate`**: Controle mais granular (e.g., `analytics AND functional`).
|
|
101
|
-
- **Enhanced Developer Guidance**: Mais avisos e sugestões detalhadas.
|
|
102
|
-
|
|
103
|
-
## 🔒 Segurança e Privacidade
|
|
104
|
-
|
|
105
|
-
- **Armazenamento**: O consentimento é armazenado exclusivamente no cliente (`localStorage` ou `cookie`).
|
|
106
|
-
- **Minimização**: O cookie de consentimento contém apenas as preferências para as categorias ativas no projeto, a versão da configuração e os timestamps necessários para auditoria.
|
|
107
|
-
- **Sem Coleta de Dados Pessoais**: A biblioteca em si não coleta ou transmite dados pessoais.
|