{"_id":"@chrono-os/consent-lgpd","_rev":"6-de2f0d81f69601f2541e8c8a100fabad","name":"@chrono-os/consent-lgpd","dist-tags":{"latest":"1.0.0"},"versions":{"0.4.0":{"name":"@chrono-os/consent-lgpd","version":"0.4.0","license":"UNLICENSED","_id":"@chrono-os/consent-lgpd@0.4.0","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"dist":{"shasum":"4940f522ca471df72b0be19916005b7b8deb7b33","tarball":"https://registry.npmjs.org/@chrono-os/consent-lgpd/-/consent-lgpd-0.4.0.tgz","fileCount":35,"integrity":"sha512-4G/Zs9WPMiqFV60XKFOdFJkW7oAQHeW1BT8Krtfvt4EVXq35V+DwsezZ2zSdik7ZkFVFrmYgX28I8rel6uK/Qw==","signatures":[{"sig":"MEUCIH2WVgzEqi7eg/0lPREeMdrp7YH/dMQ7DeLWOyEY3jrlAiEA09mgE78CxOAEkRWSNcTki51RTlEWDzX8CtO7nzzw8p8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242750},"main":"./dist/react/index.cjs","type":"module","types":"./dist/react/index.d.ts","module":"./dist/react/index.js","engines":{"node":">=20"},"exports":{"./pages":{"types":"./dist/pages/index.d.ts","import":"./dist/pages/index.js","require":"./dist/pages/index.cjs"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","require":"./dist/react/index.cjs"},"./schema":{"types":"./dist/schema/index.d.ts","import":"./dist/schema/index.js","require":"./dist/schema/index.cjs"},"./fastify":{"types":"./dist/fastify/index.d.ts","import":"./dist/fastify/index.js","require":"./dist/fastify/index.cjs"}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"},"repository":{"url":"https://github.com/SugarHoneyIceTea/consent-lgpd.git","type":"git"},"description":"LGPD compliance reutilizável (CookieBanner 3-cat, ConditionalScript, ConsentLog backend, DPO inbox, páginas legais) para projetos Chrono/Naírio","directories":{},"sideEffects":false,"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.8","tsup":"^8.3.0","jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3","fastify":"^5","react-dom":"^18.3.1","typescript":"^5.6.0","@types/node":"^25.9.1","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@testing-library/dom":"^10","@testing-library/react":"^16.0.1","@testing-library/jest-dom":"^6.5.0"},"peerDependencies":{"zod":">=3","react":">=18","fastify":">=5","react-dom":">=18"},"peerDependenciesMeta":{"react":{"optional":true},"fastify":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/consent-lgpd_0.4.0_1779671352747_0.4405629210557307","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@chrono-os/consent-lgpd","version":"0.5.0","license":"UNLICENSED","_id":"@chrono-os/consent-lgpd@0.5.0","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"homepage":"https://github.com/SugarHoneyIceTea/consent-lgpd#readme","bugs":{"url":"https://github.com/SugarHoneyIceTea/consent-lgpd/issues"},"dist":{"shasum":"e16ca36bc306f2487ad7f995af7e1d79655b4e0c","tarball":"https://registry.npmjs.org/@chrono-os/consent-lgpd/-/consent-lgpd-0.5.0.tgz","fileCount":28,"integrity":"sha512-tgjfToBDVsRW7y8Dj3KR2umQSe7PoNVNMY9eYOp+n7uVs05ahiMSzchCIK+hg937ZRy1FPE6Gk+oca6hFcO9UA==","signatures":[{"sig":"MEQCIGVNOedTk61KItXByp9XGVHAHXflZSP1MhymoVPSm27UAiAuQQQe1kQQ3cNTlvAxhwPN3t2Iicwus+vseQiVXPxFow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248168},"main":"./dist/react/index.cjs","type":"module","types":"./dist/react/index.d.ts","module":"./dist/react/index.js","engines":{"node":">=20"},"exports":{"./pages":{"types":"./dist/pages/index.d.ts","import":"./dist/pages/index.js","require":"./dist/pages/index.cjs"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","require":"./dist/react/index.cjs"},"./schema":{"types":"./dist/schema/index.d.ts","import":"./dist/schema/index.js","require":"./dist/schema/index.cjs"},"./fastify":{"types":"./dist/fastify/index.d.ts","import":"./dist/fastify/index.js","require":"./dist/fastify/index.cjs"}},"gitHead":"fd21fe8f8c4fbcd6a0b769730aa1d0bbbd1f592c","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"},"repository":{"url":"git+https://github.com/SugarHoneyIceTea/consent-lgpd.git","type":"git"},"_npmVersion":"10.8.2","description":"LGPD compliance reutilizável (CookieBanner 3-cat, ConditionalScript, ConsentLog backend, DPO inbox, páginas legais) para projetos Chrono/Naírio","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.8","tsup":"^8.3.0","jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3","fastify":"^5","react-dom":"^18.3.1","typescript":"^5.6.0","@types/node":"^25.9.1","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@testing-library/dom":"^10","@testing-library/react":"^16.0.1","@testing-library/jest-dom":"^6.5.0"},"peerDependencies":{"zod":">=3","react":">=18","fastify":">=5","react-dom":">=18"},"peerDependenciesMeta":{"react":{"optional":true},"fastify":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/consent-lgpd_0.5.0_1779714407730_0.9204337516291663","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@chrono-os/consent-lgpd","version":"0.6.0","license":"UNLICENSED","_id":"@chrono-os/consent-lgpd@0.6.0","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"homepage":"https://github.com/SugarHoneyIceTea/consent-lgpd#readme","bugs":{"url":"https://github.com/SugarHoneyIceTea/consent-lgpd/issues"},"dist":{"shasum":"acf4c7e80bfdab0fcf7d01275d9bd76ecf622a63","tarball":"https://registry.npmjs.org/@chrono-os/consent-lgpd/-/consent-lgpd-0.6.0.tgz","fileCount":34,"integrity":"sha512-urrpykaO30A7uqdL+BbfBYo1wCD8fStR4ZrRvICZfpJqyAzcMFClJdXoLl693DpCaIutRLxkf7Eju5OYVzR5dw==","signatures":[{"sig":"MEUCIDkJd308MfNA2m5zw7N9secRXxozUHI5Wes5Zi2vCZ+qAiEA8gqBlY/IkRQmW6oEgLaNdE6Pty5sH2VkGgj272LPGQ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":260799},"main":"./dist/react/index.cjs","type":"module","types":"./dist/react/index.d.ts","module":"./dist/react/index.js","engines":{"node":">=20"},"exports":{"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js","require":"./dist/core/index.cjs"},"./pages":{"types":"./dist/pages/index.d.ts","import":"./dist/pages/index.js","require":"./dist/pages/index.cjs"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","require":"./dist/react/index.cjs"},"./schema":{"types":"./dist/schema/index.d.ts","import":"./dist/schema/index.js","require":"./dist/schema/index.cjs"},"./fastify":{"types":"./dist/fastify/index.d.ts","import":"./dist/fastify/index.js","require":"./dist/fastify/index.cjs"}},"gitHead":"38d4a5d75f0555d21c9926d9e6d81b3257995842","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"},"repository":{"url":"git+https://github.com/SugarHoneyIceTea/consent-lgpd.git","type":"git"},"_npmVersion":"11.9.0","description":"LGPD compliance reutilizável (CookieBanner 3-cat, ConditionalScript, ConsentLog backend, DPO inbox, páginas legais) para projetos Chrono/Naírio","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.8","tsup":"^8.3.0","jsdom":"^25.0.0","react":"^18.3.1","vitest":"^3","fastify":"^5","react-dom":"^18.3.1","typescript":"^5.6.0","@types/node":"^25.9.1","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@testing-library/dom":"^10","@testing-library/react":"^16.0.1","@testing-library/jest-dom":"^6.5.0"},"peerDependencies":{"zod":">=3","react":">=18","fastify":">=5","react-dom":">=18"},"peerDependenciesMeta":{"react":{"optional":true},"fastify":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/consent-lgpd_0.6.0_1788371187418_0.520948195646372","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@chrono-os/consent-lgpd","version":"0.6.1","license":"UNLICENSED","_id":"@chrono-os/consent-lgpd@0.6.1","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"homepage":"https://github.com/SugarHoneyIceTea/consent-lgpd#readme","bugs":{"url":"https://github.com/SugarHoneyIceTea/consent-lgpd/issues"},"dist":{"shasum":"02c703dfadaf3a78efc7a1691c41872db8980fc1","tarball":"https://registry.npmjs.org/@chrono-os/consent-lgpd/-/consent-lgpd-0.6.1.tgz","fileCount":34,"integrity":"sha512-w7528VlFURnaDIbFzNXVb+f8tIipkJvGbLWFqAWmH23Cox9WliHn8fb2x+Q/U1Gvra+p20amLMfZq7B6ooeVIw==","signatures":[{"sig":"MEQCIFZ3oyjyJFT85Vmh7gNukT8r4YVlCwjJV2m56cTvndcYAiAZfAudOyr4A4lVX/6jmjkI9P+0usP2Hvzp3AsZe9oU3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDtg7hDOpfbBhOdrXjTgB7AJZ4dMOAL80eWCaadWT0puAiA1EkA7dKP9VxHXWyGuaG1Y+yBvJOnzmVJsG3fQPBXz9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":264883},"main":"./dist/react/index.cjs","type":"module","types":"./dist/react/index.d.ts","module":"./dist/react/index.js","engines":{"node":">=20"},"exports":{"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js","require":"./dist/core/index.cjs"},"./pages":{"types":"./dist/pages/index.d.ts","import":"./dist/pages/index.js","require":"./dist/pages/index.cjs"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","require":"./dist/react/index.cjs"},"./schema":{"types":"./dist/schema/index.d.ts","import":"./dist/schema/index.js","require":"./dist/schema/index.cjs"},"./fastify":{"types":"./dist/fastify/index.d.ts","import":"./dist/fastify/index.js","require":"./dist/fastify/index.cjs"}},"gitHead":"8b63d642dff510114b4ef06efe47f8402cc9da1d","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"},"repository":{"url":"git+https://github.com/SugarHoneyIceTea/consent-lgpd.git","type":"git"},"_npmVersion":"11.9.0","description":"LGPD compliance reutilizável (CookieBanner 3-cat, ConditionalScript, ConsentLog backend, DPO inbox, páginas legais) para projetos Chrono/Naírio","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.8","tsup":"^8.3.0","jsdom":"^25.0.0","react":"19.2.8","vitest":"^3","fastify":"^5","react-dom":"19.2.8","typescript":"5.9.3","@types/node":"^25.9.1","@types/react":"19.2.18","@types/react-dom":"19.2.7","@testing-library/dom":"^10","@testing-library/react":"^16.0.1","@testing-library/jest-dom":"^6.5.0"},"peerDependencies":{"zod":">=3","react":">=18","fastify":">=5","react-dom":">=18"},"peerDependenciesMeta":{"react":{"optional":true},"fastify":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/consent-lgpd_0.6.1_1788720870420_0.6769378442970739","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@chrono-os/consent-lgpd","version":"0.7.0","license":"UNLICENSED","_id":"@chrono-os/consent-lgpd@0.7.0","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"homepage":"https://github.com/SugarHoneyIceTea/consent-lgpd#readme","bugs":{"url":"https://github.com/SugarHoneyIceTea/consent-lgpd/issues"},"dist":{"shasum":"7e62a87eac6cd81639c13db8e8472990d12d0ef8","tarball":"https://registry.npmjs.org/@chrono-os/consent-lgpd/-/consent-lgpd-0.7.0.tgz","fileCount":34,"integrity":"sha512-LMf6DY1lYvZGkXssM//GdQuoc7APzrTuYYQIouKVZXAeYuKwQxoFSjycC3DbLjFFxQRDibg+P58lBBEVXUgUOw==","signatures":[{"sig":"MEYCIQDOYPA4+4yJoe3J4xnqY7CuB+P3dZhdBM30oy49sNMUjAIhANWwd7MReE/Szphs0L0f+51PcxqFmRoLBVLZOppkWL+/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCzPxJDo20LGPr+UaOxuaDIDXaBzdjZkbXgv/dRvqk3vgIhAIy3lFgL/H/6S4cseSWWCt8Xpg3zqVGj6DhA2V5w6kYQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":282818},"main":"./dist/react/index.cjs","type":"module","types":"./dist/react/index.d.ts","module":"./dist/react/index.js","engines":{"node":">=20"},"exports":{"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js","require":"./dist/core/index.cjs"},"./pages":{"types":"./dist/pages/index.d.ts","import":"./dist/pages/index.js","require":"./dist/pages/index.cjs"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","require":"./dist/react/index.cjs"},"./schema":{"types":"./dist/schema/index.d.ts","import":"./dist/schema/index.js","require":"./dist/schema/index.cjs"},"./fastify":{"types":"./dist/fastify/index.d.ts","import":"./dist/fastify/index.js","require":"./dist/fastify/index.cjs"}},"gitHead":"3b8c91503842a02fc5cdd52a31369f60636f50d0","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"},"repository":{"url":"git+https://github.com/SugarHoneyIceTea/consent-lgpd.git","type":"git"},"_npmVersion":"11.9.0","description":"LGPD compliance reutilizável (CookieBanner 3-cat, ConditionalScript, ConsentLog backend, DPO inbox, páginas legais) para projetos Chrono/Naírio","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.8","tsup":"^8.3.0","jsdom":"^25.0.0","react":"19.2.8","vitest":"^3","fastify":"^5","react-dom":"19.2.8","typescript":"5.9.3","@types/node":"^25.9.1","@types/react":"19.2.18","@types/react-dom":"19.2.7","@testing-library/dom":"^10","@testing-library/react":"^16.0.1","@testing-library/jest-dom":"^6.5.0"},"peerDependencies":{"zod":">=3","react":">=18","fastify":">=5","react-dom":">=18"},"peerDependenciesMeta":{"react":{"optional":true},"fastify":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/consent-lgpd_0.7.0_1789069593526_0.984456808429143","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"_id":"@chrono-os/consent-lgpd@1.0.0","bugs":{"url":"https://github.com/SugarHoneyIceTea/consent-lgpd/issues"},"dist":{"shasum":"4ff73fdc2bf24d2e741dad38d3a4bb80bed42f62","tarball":"https://registry.npmjs.org/@chrono-os/consent-lgpd/-/consent-lgpd-1.0.0.tgz","fileCount":44,"integrity":"sha512-23FKJoI4OqGRwaat2PNj5mI7fhijc6Y0GkGu442zyqxJXYpOvxzouqbgPWPc9Ysixxtj6YXKgBTEVjeKdh0O3w==","signatures":[{"sig":"MEQCIBk1WNu20jllotE1vs5gd0k350d8vFsiK1VcmWhIujj6AiBMJD+XFLbIJsbwpQK28Jk3eqCpSqecRagdqsao4cgVLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAe0MM4qt4SdWWk4GkxX2oKktrJvmvbJTZ7VmyIkLZtaAiEAut8xizW9MpkUKF7EPCTPyfYzDInoIilKfv3mdLmun3Q="}],"unpackedSize":706845},"main":"./dist/react/index.cjs","name":"@chrono-os/consent-lgpd","type":"module","types":"./dist/react/index.d.ts","module":"./dist/react/index.js","engines":{"node":">=20"},"exports":{"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js","require":"./dist/core/index.cjs"},"./pages":{"types":"./dist/pages/index.d.ts","import":"./dist/pages/index.js","require":"./dist/pages/index.cjs"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js","require":"./dist/react/index.cjs"},"./nestjs":{"types":"./dist/nestjs/index.d.ts","import":"./dist/nestjs/index.js","require":"./dist/nestjs/index.cjs"},"./schema":{"types":"./dist/schema/index.d.ts","import":"./dist/schema/index.js","require":"./dist/schema/index.cjs"},"./fastify":{"types":"./dist/fastify/index.d.ts","import":"./dist/fastify/index.js","require":"./dist/fastify/index.cjs"}},"gitHead":"79a5b237489e08e938afd5a1c12b1343713dfd1f","license":"UNLICENSED","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"version":"1.0.0","_npmUser":{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"},"homepage":"https://github.com/SugarHoneyIceTea/consent-lgpd#readme","repository":{"url":"git+https://github.com/SugarHoneyIceTea/consent-lgpd.git","type":"git"},"_npmVersion":"11.9.0","description":"LGPD reutilizável: consentimento (CookieBanner 3-cat, ConditionalScript, ConsentLog), ciclo de vida de direitos do titular (export com link assinado, exclusão com carência, varredura, caixa do DPO) por portas, adaptadores Fastify e NestJS, páginas legais","directories":{},"maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.8","rxjs":"7.8.2","tsup":"^8.3.0","jsdom":"^25.0.0","react":"19.2.8","vitest":"^3","fastify":"^5","react-dom":"19.2.8","typescript":"5.9.3","@types/node":"^25.9.1","@nestjs/core":"11.2.3","@types/react":"19.2.18","@nestjs/common":"11.2.3","@nestjs/testing":"11.2.3","@types/react-dom":"19.2.7","reflect-metadata":"0.2.2","@testing-library/dom":"^10","@testing-library/react":"^16.0.1","@testing-library/jest-dom":"^6.5.0"},"peerDependencies":{"zod":">=3","react":">=18","fastify":">=5","react-dom":">=18","@nestjs/common":">=10"},"peerDependenciesMeta":{"react":{"optional":true},"fastify":{"optional":true},"react-dom":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/consent-lgpd_1.0.0_1789075276880_0.3043845261629674"}}},"time":{"created":"2026-05-25T01:09:12.294Z","modified":"2026-09-10T21:21:17.186Z","0.4.0":"2026-05-25T01:09:13.051Z","0.5.0":"2026-05-25T13:06:47.871Z","0.6.0":"2026-09-02T17:46:27.571Z","0.6.1":"2026-09-06T18:54:30.508Z","0.7.0":"2026-09-10T19:46:33.621Z","1.0.0":"2026-09-10T21:21:16.989Z"},"bugs":{"url":"https://github.com/SugarHoneyIceTea/consent-lgpd/issues"},"license":"UNLICENSED","homepage":"https://github.com/SugarHoneyIceTea/consent-lgpd#readme","repository":{"url":"git+https://github.com/SugarHoneyIceTea/consent-lgpd.git","type":"git"},"description":"LGPD reutilizável: consentimento (CookieBanner 3-cat, ConditionalScript, ConsentLog), ciclo de vida de direitos do titular (export com link assinado, exclusão com carência, varredura, caixa do DPO) por portas, adaptadores Fastify e NestJS, páginas legais","maintainers":[{"name":"sugarhoneyicetea","email":"aquilaferraz@gmail.com"}],"readme":"# @chrono-os/consent-lgpd\r\n\r\nLGPD reutilizável, em duas metades:\r\n\r\n- **Consentimento** — CookieBanner 3-cat (necessarios/analiticos/marketing), ConditionalScript gated por consent, ConsentLog com hash de IP, formulário simples de DPO e páginas legais (Privacidade, Cookies, Termos, DPO).\r\n- **Direitos do titular** (desde 1.0, vindo do SobreVivendo Adulto) — export com link de validade, exclusão com carência, varredura de pendências, caixa do DPO com marcos de prazo. Sem framework: fala com o banco do app por **portas**; adaptador NestJS opcional.\r\n\r\n> **Status:** `1.0.0`. Consumidores: Naírio (institucional, calculadoras) na metade de consentimento; SobreVivendo Adulto no ciclo de direitos do titular. Plano original em [Naírio/Plan/03-modulos/2026-05-24_modulo-consent-lgpd.md](../Naírio/Plan/03-modulos/2026-05-24_modulo-consent-lgpd.md).\r\n\r\n## Install\r\n\r\nPacote público no [npmjs.org](https://www.npmjs.com/package/@chrono-os/consent-lgpd) — sem necessidade de `.npmrc` ou token.\r\n\r\n```bash\r\nyarn add @chrono-os/consent-lgpd\r\n```\r\n\r\nAplicar migration template (só a metade de consentimento — `ConsentLog` e `DpoRequest` simples):\r\n\r\n```bash\r\ncat node_modules/@chrono-os/consent-lgpd/prisma/schema.template.prisma >> prisma/schema.prisma\r\nyarn prisma migrate dev --name add_consent_lgpd\r\n```\r\n\r\nO template é conferido por teste contra os campos que `recordConsent`, `createDpoRequest` e `purgeOldConsents` gravam (`src/core/template-prisma.test.ts`).\r\n\r\n### Tailwind — passo obrigatório no consumer\r\n\r\nO banner e o botão de revogar são estilizados com classes Tailwind que vivem\r\n**dentro do bundle do pacote**. O purge do Tailwind só varre o que está no\r\n`content`, então sem a linha abaixo essas classes somem do CSS final:\r\n\r\n```ts\r\n// tailwind.config.ts do app consumer\r\ncontent: [\r\n  './app/**/*.{ts,tsx}',\r\n  // ...\r\n  './node_modules/@chrono-os/consent-lgpd/dist/**/*.{js,mjs,cjs}',\r\n]\r\n```\r\n\r\n**Como o defeito se manifesta** (é enganoso, vale reconhecer de longe): o banner\r\nrenderiza, mas largura cheia e colado ao fim do conteúdo em vez de flutuar num\r\ncard no canto. Parte das classes continua funcionando — `bg-slate-900`, `p-6`,\r\n`rounded-lg` sobrevivem se outra página do app as usar — o que passa impressão\r\nde CSS meio quebrado, não de purge. A confirmação está no *computed style*: com\r\n`bottom-4` purgada, um `position: fixed` sem `bottom` cai na posição estática do\r\nfluxo e `getComputedStyle` devolve algo como `bottom: -3304px`; `md:max-w-xl`\r\npurgada aparece como `max-width: none`.\r\n\r\nConferir em produção sem abrir o navegador:\r\n\r\n```bash\r\ncurl -s \"$SEU_SITE/_next/static/chunks/<hash>.css\" | grep -c '\\.bottom-4{'\r\n# 0 = purgada\r\n```\r\n\r\n## Uso\r\n\r\n### Frontend — banner + script condicional\r\n\r\n```tsx\r\n// app/layout.tsx\r\nimport { CookieBanner, ConditionalScript } from \"@chrono-os/consent-lgpd/react\";\r\n\r\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\r\n  return (\r\n    <html>\r\n      <body>\r\n        {children}\r\n\r\n        <CookieBanner\r\n          cookiePolicyHref=\"/politica-de-cookies\"\r\n          onConsentChange={async ({ state, action, sessionId }) => {\r\n            await fetch(\"/api/consent\", {\r\n              method: \"POST\",\r\n              headers: { \"content-type\": \"application/json\" },\r\n              body: JSON.stringify({\r\n                sessionId,\r\n                categories: {\r\n                  necessarios: state.necessarios,\r\n                  analiticos: state.analiticos,\r\n                  marketing: state.marketing,\r\n                  version: state.version,\r\n                },\r\n                action,\r\n              }),\r\n            });\r\n          }}\r\n        />\r\n\r\n        {/* Google Analytics 4 — só carrega após consent \"analiticos\" */}\r\n        <ConditionalScript\r\n          category=\"analiticos\"\r\n          src=\"https://www.googletagmanager.com/gtag/js?id=G-XXXX\"\r\n          async\r\n        />\r\n      </body>\r\n    </html>\r\n  );\r\n}\r\n```\r\n\r\n### Frontend — botão revogar consent\r\n\r\n```tsx\r\n// app/politica-de-cookies/page.tsx\r\nimport { RevokeButton } from \"@chrono-os/consent-lgpd/react\";\r\n\r\nexport default function PoliticaCookiesPage() {\r\n  return (\r\n    <main>\r\n      <h1>Política de Cookies</h1>\r\n      <RevokeButton\r\n        onConsentChange={async ({ state, action, sessionId }) => {\r\n          await fetch(\"/api/consent\", {\r\n            method: \"POST\",\r\n            headers: { \"content-type\": \"application/json\" },\r\n            body: JSON.stringify({ sessionId, categories: state, action }),\r\n          });\r\n        }}\r\n      />\r\n    </main>\r\n  );\r\n}\r\n```\r\n\r\n### Backend (Fastify)\r\n\r\n```ts\r\nimport Fastify from \"fastify\";\r\nimport { PrismaClient } from \"@prisma/client\";\r\nimport { consentPlugin } from \"@chrono-os/consent-lgpd/fastify\";\r\n\r\nconst app = Fastify();\r\nconst prisma = new PrismaClient();\r\n\r\nawait app.register(consentPlugin, {\r\n  prisma,\r\n  ipHashSalt: process.env.CONSENT_IP_HASH_SALT!, // 32+ chars\r\n  // prefix: \"/api\",                              // opcional\r\n  // routes: { consent: true, dpo: true },        // opcional\r\n  // dpoRateLimit: { max: 5, timeWindow: \"1 minute\" },\r\n});\r\n```\r\n\r\nExpõe:\r\n- `POST /consent` — grava `ConsentLog` (IP hashed server-side, body validado com Zod)\r\n- `POST /webhooks/dpo` — recebe solicitação LGPD art. 18, rate-limited\r\n\r\n### Páginas legais\r\n\r\n```ts\r\nimport { POLITICA_PRIVACIDADE_MD, renderTemplate } from \"@chrono-os/consent-lgpd/pages\";\r\n\r\nconst html = renderTemplate(POLITICA_PRIVACIDADE_MD, {\r\n  razaoSocial: \"Naírio Augusto Advogados\",\r\n  cnpj: \"28.373.650/0001-00\",\r\n  dpoNome: \"Dr. Naírio Augusto\",\r\n  contatoHref: \"/contato\",\r\n  dpoHref: \"/dpo\",\r\n  privacidadeHref: \"/politica-de-privacidade\",\r\n  cookiesHref: \"/politica-de-cookies\",\r\n  termosHref: \"/termos-de-uso\",\r\n  ultimaAtualizacao: \"2026-05-24\",\r\n  versao: \"1.0\",\r\n  foroComarca: \"Porto Alegre/RS\",\r\n  operadoresMd: \"- Coolify (hospedagem)\\n- ClickUp (CRM)\\n- Z-API (validação WhatsApp)\",\r\n  analyticsScriptsMd: \"Google Analytics 4 com IP anonimizado\",\r\n  marketingScriptsMd: \"Meta Pixel + Google Ads Conversions\",\r\n});\r\n// Renderize `html` (markdown) via MDX, react-markdown, etc.\r\n```\r\n\r\n## Direitos do titular (1.0)\r\n\r\nO núcleo guarda as regras que precisam ser iguais em todo app; o que depende do schema, da fila, do e-mail e do storage o app entrega como portas.\r\n\r\n| Caso de uso | Regra que o núcleo garante |\r\n|---|---|\r\n| `solicitarExport` | 1 export por titular a cada 24 h (configurável); fila fora do ar não perde o pedido |\r\n| `processar(id)` — EXPORT | coleta → grava no storage → URL com validade (7 d, nunca além do pedido) → `READY`; storage sem URL cai no modo inline (JSON na solicitação) |\r\n| `resolverDownload` | só o dono (ou token assinado); alheio/inexistente/adulterado dão o mesmo `NAO_ENCONTRADA`; expirado ou **sem prazo** → `EXPIRADA`; `FULFILLED` só no 1º download |\r\n| `solicitarExclusao` | exige a palavra `EXCLUIR`; agenda para agora + carência (30 d); o app corta o acesso na mesma transação |\r\n| `processar(id)` — DELETE | antes da carência lança `DELETE_NOT_DUE_YET` (a fila re-tenta); sem data agendada recusa e alerta; `READY` numa exclusão **não** conta como feita |\r\n| `varrer()` | re-enfileira export parado (+1 h) e exclusão vencida com o **mesmo** jobId; idempotente; nunca lança |\r\n| `criarCaixaDpo().receber` | honeypot (`website`) → sucesso aparente sem gravar; aviso de recebimento pela fila, com envio direto de reserva; alerta sem nome/e-mail por padrão |\r\n| `criarCaixaDpo().atualizar` | `confirmadoEm`/`resolvidoEm` gravados uma vez só; devolve antes/depois para o log de auditoria |\r\n\r\n```ts\r\nimport { criarDireitosTitular, criarCaixaDpo, type PortasDireitosTitular } from \"@chrono-os/consent-lgpd/core\";\r\n\r\nconst portas: PortasDireitosTitular = {\r\n  solicitacoes: { buscar, buscarExportRecente, criarExport, criarExclusao, atualizar, listarPresas },\r\n  dadosTitular: { coletar, apagar },        // o que o app guarda do titular\r\n  armazenamento: { gravar, assinarUrl },    // opcional — sem ele, modo inline\r\n  fila: { enfileirar },                     // { enfileirado: false } = sem fila\r\n  notificacao: { exportPronto },            // opcional, best-effort\r\n  alertar, eventos, log,                    // opcionais\r\n};\r\nconst direitos = criarDireitosTitular(portas, { carenciaExclusaoDias: 30 });\r\n```\r\n\r\nContrato das portas que o núcleo não consegue checar sozinho (está nos JSDoc de `tipos.ts`):\r\n\r\n- `criarExclusao` é **uma transação**: solicitação + soft-delete + revogar sessões.\r\n- `apagar` é **idempotente** e **não apaga a solicitação** — ela fica com `titularId = null` (FK `SetNull`) como prova da exclusão.\r\n- `atualizar` não lança se a linha sumiu (`updateMany`).\r\n\r\n**Link assinado próprio (opcional).** Com `linkAssinado: { segredo, urlDownload }`, o e-mail de \"export pronto\" leva um link para o app (token HMAC com validade) em vez da URL do storage, e `resolverDownload({ solicitacaoId, token })` aceita esse token sem sessão. Assinatura válida não basta: o banco ainda precisa confirmar solicitação, dono e prazo — então apagar o titular revoga o link. Primitivas avulsas: `assinarLinkExport` / `verificarLinkExport`.\r\n\r\n**Erros.** Casos esperados voltam como `{ ok: false, erro }`; os que precisam derrubar o job lançam (`ExclusaoNaoVencidaError`, `ExclusaoSemAgendamentoError`). Confira pelo `.code`, não por `instanceof`: `/core` e `/nestjs` são bundles separados, cada um com a sua cópia da classe.\r\n\r\n### NestJS\r\n\r\n```ts\r\nimport { ConsentLgpdModule, InjectDireitosTitular, ouLancar, type DireitosTitular } from \"@chrono-os/consent-lgpd/nestjs\";\r\n\r\n@Module({\r\n  imports: [\r\n    ConsentLgpdModule.forRootAsync({\r\n      imports: [PortasModule],\r\n      inject: [MinhasPortas],\r\n      useFactory: (p: MinhasPortas) => ({\r\n        direitos: { portas: p.direitos(), opcoes: { carenciaExclusaoDias: 30 } },\r\n        caixaDpo: { portas: p.caixaDpo() },\r\n      }),\r\n    }),\r\n  ],\r\n})\r\n\r\n// no controller — rota, guard e auditoria continuam do app\r\nconst { solicitacao } = ouLancar(await this.direitos.solicitarExport({ titularId, ipHash }));\r\n```\r\n\r\n`ouLancar`/`excecaoHttpLgpd` traduzem os erros para `HttpException` com `{ error, message, details }` (429 `RATE_LIMITED`, 404 `NOT_FOUND`, 425 `NOT_READY`, 410 `EXPIRED`, 500 `PERSIST_FAILED`...). Implementação de referência: `sobrevivendo-backend/apps/api/src/modules/lgpd/lgpd-portas.ts`.\r\n\r\n## API\r\n\r\n| Entrypoint | Exporta |\r\n|---|---|\r\n| `/react` | `CookieBanner`, `ConditionalScript`, `RevokeButton`, `useConsent`, `readConsent`/`writeConsent`/`clearConsent`/`hasConsented`/`getSessionId`, constantes |\r\n| `/core` | consentimento: `hashIp`, `hashIpHmacDiario`, `verificarIpHash`, `recordConsent`, `createDpoRequest`, `purgeOldConsents` · direitos do titular: `criarDireitosTitular`, `criarCaixaDpo`, `assinarLinkExport`, `verificarLinkExport`, tipos das portas |\r\n| `/nestjs` | `ConsentLgpdModule`, `InjectDireitosTitular`, `InjectCaixaDpo`, `DIREITOS_TITULAR`, `CAIXA_DPO`, `ouLancar`, `excecaoHttpLgpd` (peer opcional `@nestjs/common`) |\r\n| `/fastify` | `consentPlugin` + as funções de consentimento do `/core` |\r\n| `/schema` | `consentStateSchema`, `consentLogPayloadSchema`, `dpoRequestPayloadSchema`, `assuntoDpoSchema`, `statusPedidoDpoSchema`, `pedidoDpoSchema`, `CONFIRMACAO_EXCLUSAO`, types Zod, constantes |\r\n| `/pages` | `POLITICA_PRIVACIDADE_MD`, `POLITICA_COOKIES_MD`, `TERMOS_USO_MD`, `PAGINA_DPO_MD`, `renderTemplate`, `LegalPageVars` |\r\n\r\n## Roadmap\r\n\r\n| Fase | Conteúdo | ETA |\r\n|---|---|---|\r\n| 0 | Estrutura + CI + 0.1.0 stub + schema Zod | 2026-05-31 ✅ |\r\n| 1 | Banner + ConditionalScript + ConsentLog + DPO + páginas legais (0.2.0) | 2026-06-28 ✅ |\r\n| 2 | Calculadora Naírio adota o pacote (deadline legal) | 2026-07-12 ✅ |\r\n| 3 | 1.0 — fusão do ciclo de direitos do titular do SVA + adaptador NestJS | 2026-09-10 ✅ |\r\n\r\n## Versionamento\r\n\r\nSemVer. Releases via tag `vX.Y.Z` no `main`. Ver [CHANGELOG.md](CHANGELOG.md).\r\n","readmeFilename":"README.md"}