{"_id":"@12-apps/notifications","_rev":"23-d2eecf33b9eb26538304c86fe91dd96c","name":"@12-apps/notifications","dist-tags":{"latest":"4.12.0"},"versions":{"1.0.0":{"name":"@12-apps/notifications","version":"1.0.0","license":"MIT","_id":"@12-apps/notifications@1.0.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"6d95c511d44de4ca57c6924f88f4104896e576cc","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-1.0.0.tgz","fileCount":47,"integrity":"sha512-mAxH8+ii9bNRiiQtH2zfTfxZlp6RfKH/F8AOFaYOrwpd5C1ezBwumwzxUMgXf/2F9FNZ2fzE9D8eybDxxjFpTQ==","signatures":[{"sig":"MEQCIAKIdwQpdDbuIwJDSu20R3poZkdHa4lU+y2+11eJluY0AiAMCgybmEXIR6EVc2Dlt+MvlHHVTHuSDpxpa7nfDanJRw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":253333},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./hono":"./src/hono/index.ts","./react":"./src/react/index.ts","./server":"./src/server/index.ts","./web-push":"./src/web-push/index.ts","./package.json":"./package.json"},"gitHead":"a577581535a3851d22dda9d3eb1b863c62094294","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"tigredonorte","email":"tigredonorte3@gmail.com"},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@12-apps/ui":"^4.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.20.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_1.0.0_1786605355344_0.6589889180308048","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@12-apps/notifications","version":"2.0.0","license":"MIT","_id":"@12-apps/notifications@2.0.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"24f28473862987d74e5e189d200a6d32a6dba782","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-2.0.0.tgz","fileCount":47,"integrity":"sha512-JXY/Rv/7F0CA5bO7H9k6E1xYhqn03brxYUn4or7VezFmT74oXPnkwCTXBlXI3lPoB7YEGYIuEUNRoCgk0lhbDg==","signatures":[{"sig":"MEQCIBqv7gja9/A2Z7lxhX0IpgUK0NOlYED/7ZuIAAT6VGGXAiBKte6U+GHT7wrpWkHy97avXnWxkUxs39GLcHHmlC6E+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":254780},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./hono":"./src/hono/index.ts","./react":"./src/react/index.ts","./server":"./src/server/index.ts","./web-push":"./src/web-push/index.ts","./package.json":"./package.json"},"gitHead":"904c9a753fe79c48a50575a3831e5ac7d6831d8c","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:106be30e-9af7-4851-9e86-e499d05ebd8f"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^4.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.20.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_2.0.0_1786748768676_0.886876099386608","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@12-apps/notifications","version":"2.1.0","license":"MIT","_id":"@12-apps/notifications@2.1.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"e62a259a8f7b231476b99d863de464be99b69e12","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-2.1.0.tgz","fileCount":47,"integrity":"sha512-yxHcRiEgX/AlegJeWqajIshJ4t4ZFdhWe4K+m9QRTecTvi/lNtMkCoOkVuekyIJQWPchqUuvoLLyAAYLsidB4w==","signatures":[{"sig":"MEUCIDhYlMwX+5XFn8x4zHX910aBxVv+pAkL1BrGm7TtqB7PAiEA3x7u3pnmaM8lo8i4bNpFftMSvUaI3cWZfxP7pvvKpsI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":256613},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./hono":"./src/hono/index.ts","./react":"./src/react/index.ts","./server":"./src/server/index.ts","./web-push":"./src/web-push/index.ts","./package.json":"./package.json"},"gitHead":"62fd31ae77fc99a6799a6dc9eb5e74374796886f","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:106be30e-9af7-4851-9e86-e499d05ebd8f"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^4.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.20.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_2.1.0_1786759683365_0.890321770025756","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@12-apps/notifications","version":"3.0.0","license":"MIT","_id":"@12-apps/notifications@3.0.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"ee6e8fa4cb50aeade14c78515422e37645f44c7f","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-3.0.0.tgz","fileCount":47,"integrity":"sha512-qD/0+VFzTU+jTyDq7VhNgsIaD47bLbwE6XJPH5AfOF41G49wsnVxgoqNeT2Oqb5N/xPn1aBZPNhMarTGHdwBoQ==","signatures":[{"sig":"MEUCIQD7XUQVyxK4K3wDpu/6jIjnMJxizdam7lGuKQatPqJMJgIgVA81Ob0JJ+WiFKHRp9/ZlSEPMcKAO8FsqTlpnPQBacw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":255290},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./hono":"./src/hono/index.ts","./react":"./src/react/index.ts","./server":"./src/server/index.ts","./web-push":"./src/web-push/index.ts","./package.json":"./package.json"},"gitHead":"2ea3bd8457671131da0637345976707d4b3187fd","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:106be30e-9af7-4851-9e86-e499d05ebd8f"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^4.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.20.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_3.0.0_1786760471774_0.7476861489451632","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@12-apps/notifications","version":"4.0.0","license":"MIT","_id":"@12-apps/notifications@4.0.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"d317c28558b833410c1a0ae54e1eb3975b75ac17","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.0.0.tgz","fileCount":47,"integrity":"sha512-7ECoggKYLFJCEoK9JmjpR1ADAv37aFLekuI7ZuAxt21gARkdngTrDcZ3Jw7PG+CBTkor86mFUzyr1THpryXA7w==","signatures":[{"sig":"MEUCIQDTHTQj6FtWS/2I0Wvmoxxf4ZYV6EMHvOejn+7AR1Fz0wIgLrHwnDa3V5jI7e3agUgHEn6uRcoNVbjEIl080sFT89E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":255322},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./hono":"./src/hono/index.ts","./react":"./src/react/index.ts","./server":"./src/server/index.ts","./web-push":"./src/web-push/index.ts","./package.json":"./package.json"},"gitHead":"f837d4958a5b21e02d2f02a1c008ff1d1a23937a","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:106be30e-9af7-4851-9e86-e499d05ebd8f"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^5.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.20.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.0.0_1786800400840_0.2867980602827842","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@12-apps/notifications","version":"4.1.0","license":"MIT","_id":"@12-apps/notifications@4.1.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"ed703a02ea73780446d37afe9958c228a98074bd","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.1.0.tgz","fileCount":47,"integrity":"sha512-vqek0QNBbsVzZIZ1t9321yeLAKCmzYF44/u8hbTtL0H5FJFcclR0dEBaTs6lUAIyPbKIy47fBU8zJOwloLDMhA==","signatures":[{"sig":"MEUCIQD26D57Tet/c5cLhYNNPDxB+2pi3KfM3xebb72Mw5F0ywIgDhs1OMS5s+NK2XGUFvGF1Bk5SPAPIYE+s6rlRKmuHKo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":255322},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":"./src/index.ts","./hono":"./src/hono/index.ts","./react":"./src/react/index.ts","./server":"./src/server/index.ts","./web-push":"./src/web-push/index.ts","./package.json":"./package.json"},"gitHead":"96eb4c415df62ceb17308a914c912abed5c35f64","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:106be30e-9af7-4851-9e86-e499d05ebd8f"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^5.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.20.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.1.0_1786805489676_0.04677229354922363","host":"s3://npm-registry-packages-npm-production"}},"4.1.1":{"name":"@12-apps/notifications","version":"4.1.1","license":"MIT","_id":"@12-apps/notifications@4.1.1","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"331ea0f59bbf0cd04595b443eac6ceec7677a64d","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.1.1.tgz","fileCount":74,"integrity":"sha512-uvX0/lyj5lJqy5K7xMmjRS2KMozrv7qnxOTlTuLJ86oDAiUDI3FP4s7/OwWD14E5wmv716jbU5p4Zwa85mGdCg==","signatures":[{"sig":"MEYCIQDXydxFbhidx5Fq+dmOu+/JmhrbkKYYCNKtLZM2jhLs2QIhALPWOUydLYox/DNKQAnpAOUYKO5ZipEU/OcA6x+XEa2d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":683143},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./package.json":"./package.json"},"gitHead":"5a17fce7aad1374fed047dba175aab7e20d53a29","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:106be30e-9af7-4851-9e86-e499d05ebd8f"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^5.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.20.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.1.1_1786983936440_0.44828882830844186","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"@12-apps/notifications","version":"4.2.0","license":"MIT","_id":"@12-apps/notifications@4.2.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"89f2ba7c47b326a0c415e2746c858f9e1c19030c","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.2.0.tgz","fileCount":74,"integrity":"sha512-ScYpn5TVFO0TN0uBN9I6BId0p2+kheN8h+AdmdQSg8VoIz9gGNO+Xg65Aol66F1a/evZoBUVQgOUc3gNq7GEVw==","signatures":[{"sig":"MEQCIB2Tg8lzBhLolVfI3Xg4SG7ed8qhKZD2xbDBbFLg3ULyAiA749FnKgzvxHQ582o4UGAM0mCdbkpScZcPLwLR8UU95Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":684169},"type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./package.json":"./package.json"},"gitHead":"3c4711049bf8351685612372531c3cae1370bbbb","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:106be30e-9af7-4851-9e86-e499d05ebd8f"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.21.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.2.0_1787327375741_0.035530832624816266","host":"s3://npm-registry-packages-npm-production"}},"4.3.0":{"name":"@12-apps/notifications","version":"4.3.0","license":"MIT","_id":"@12-apps/notifications@4.3.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"fcdc11e7815fa71d35b25322b87f5c5f5807df89","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.3.0.tgz","fileCount":76,"integrity":"sha512-tzE9WJQCVm4SlXelnTvBKlETuvij7giUz813IpPziN//3YOJYyCzl0aV84C1RuT5GX45eEU+PCAiZOPkc0DgCw==","signatures":[{"sig":"MEQCICbOD9b8XS6yddtRFvczpnmbU1wQyfbOYOQ7DDlCpbElAiBvT9hRd8lkM1rMi1khwNJJdTW+wOr9YFM8iHf8hi7FyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":690187},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":"./src/manifest/index.ts","./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./package.json":"./package.json","./manifest/server":"./src/manifest/server.ts"},"gitHead":"75f7035ac04cd2d62b424aa8119ce8ed91f0aa19","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.10.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.21.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.3.0_1787412045249_0.6594254103245598","host":"s3://npm-registry-packages-npm-production"}},"4.3.1":{"name":"@12-apps/notifications","version":"4.3.1","license":"MIT","_id":"@12-apps/notifications@4.3.1","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"6925057a00df219d6a2addb47cb29eaadf9f3e8e","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.3.1.tgz","fileCount":84,"integrity":"sha512-66DEvop+gukUcyfopAmvmy5SW/K63EVw06nfdv63RGF7KlCWQhWb/WxZ15+GP+piAL5yiEn7fA0b2q/CkoQHjw==","signatures":[{"sig":"MEUCIQDmiuRkE6/5tdDuUJv9m6FTRqBMYZjP5lO5LYnsScbBUgIgcBJVTIdZmQYIIP1hSTgc8znPMGITNOK1XB/VaoKyyoU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":704323},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./package.json":"./package.json","./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"}},"gitHead":"32f0a72af7b186bfe9e323c3d1384d3d54c9c2cb","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.10.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.21.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.3.1_1787420783275_0.7382984991098704","host":"s3://npm-registry-packages-npm-production"}},"4.4.0":{"name":"@12-apps/notifications","version":"4.4.0","license":"MIT","_id":"@12-apps/notifications@4.4.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"f5bf7581038c088e6ba0b0f7df080333d0c5f253","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.4.0.tgz","fileCount":84,"integrity":"sha512-xWirP6JhU2SuvkX32eSI261S2mDMxPQTSPGi8pp8wBk/ubjcOKgVr5fQophq5lgU/8My9YAIRZxG6QVWz5dS3w==","signatures":[{"sig":"MEYCIQC9MArQgSSuOzPOBBQMiYC7vt224HU6Z6gx+Gfgaqj3TgIhAO2yM7KmjazGoiAb0c/FcEDGRHTRZybBXcbBbNVTMWq+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":704921},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./package.json":"./package.json","./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"}},"gitHead":"0de25dd141536e8a17e42bfce2c5aaa5e9608f49","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.5.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.10.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.21.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.4.0_1787480031305_0.2765494615088444","host":"s3://npm-registry-packages-npm-production"}},"4.5.0":{"name":"@12-apps/notifications","version":"4.5.0","license":"MIT","_id":"@12-apps/notifications@4.5.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"7a0a287568624661364fe432b8c5882963df1619","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.5.0.tgz","fileCount":95,"integrity":"sha512-2UmdTrSmnEnKQjEpcZD+kbyGcWWNUGZqJdihidbL9udnlESq5EHVxIN/iZhlEjkcqIfVtpLlUXS9wTc4KnWFVg==","signatures":[{"sig":"MEUCIQCtYsLCdiiDHvjQOA5MePBSBUfuSemCfJMFz8NIka6mnAIgYRuG+2Xg3ZQ/9M0eqGBsaJYGKmZFiJdm4TJQ+1ulKmk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":756095},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"}},"gitHead":"142fe64617cadbd2f852a257eafd0aaf95b73fbc","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.9.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.13.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.21.1","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.20.1","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.5.0_1787597526103_0.02327259688189831","host":"s3://npm-registry-packages-npm-production"}},"4.6.0":{"name":"@12-apps/notifications","version":"4.6.0","license":"MIT","_id":"@12-apps/notifications@4.6.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"a36c286ba252e39fecea4f54598e8e89abeb9e3a","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.6.0.tgz","fileCount":95,"integrity":"sha512-/BQ35bgxoFvz8kmVwBfF4xEIRLLwycFJDsI6VWWUkCTdeZNWC76oA3OTzRba8+M5z07QlZO3PTuOH7v4wQKKYg==","signatures":[{"sig":"MEUCIQD1fzJQwnmo4YiSkk0yNETBkerKphEmH7rLT3YNXswObQIgB+/9SyunUkr4bXrdAMZ1UBKSsCYZK3OJijizapxOER0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":756120},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"}},"gitHead":"4714bd10c901bcc51544843d5d6091cc1509e649","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.10.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.14.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.6.0_1787617965561_0.8451762850902194","host":"s3://npm-registry-packages-npm-production"}},"4.7.0":{"name":"@12-apps/notifications","version":"4.7.0","license":"MIT","_id":"@12-apps/notifications@4.7.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"44d7a5912ca55248d9561ebb70ca29c5aec731d3","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.7.0.tgz","fileCount":95,"integrity":"sha512-I7+eE+unskleCx1yyUIGNqROsl+jYQcMhBWBzuQEGD/lgPnJ4tlSH69v3SvbO5TnDmLWzdZX8qcCrOrO4xyhcA==","signatures":[{"sig":"MEUCIQCE5i2qwLum/yxkmaS2iDpwfeAjTUTOmaJz4E8iODeCPAIgJ6nDdHauf6kQrY1ZyZk9xH89ze8pQi5bnvX39LnXFh0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":766255},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"}},"gitHead":"b97239d89e9153cfed25754fadf80f6e83ebfa37","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.11.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.14.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.7.0_1787680691926_0.440971691114018","host":"s3://npm-registry-packages-npm-production"}},"4.7.1":{"name":"@12-apps/notifications","version":"4.7.1","license":"MIT","_id":"@12-apps/notifications@4.7.1","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"64a182a59f1172b0644215b7ec3b2a8b8dab9d16","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.7.1.tgz","fileCount":109,"integrity":"sha512-D7NZHpzTEsqD4KpnvbZ92WCcrGUoI1xBZxbQVezI3tfiuyiLBiKCVSP3SJa6OO5GCC+jJuFW7SFBJ+X7Dk3KjA==","signatures":[{"sig":"MEUCIEpHs59bgn3D+gmlB5w2Tx2QCm9P0S/ZSsfvWKxSrpu5AiEA37RIqOXaQrPF9uN5UdkZu95l2OymqvhhlQLL2/AFnWQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":782629},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"}},"gitHead":"d3f513e6fa2c83a8332759255767ba283d0acc36","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.11.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.14.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.7.1_1787685829882_0.48655759584626423","host":"s3://npm-registry-packages-npm-production"}},"4.8.0":{"name":"@12-apps/notifications","version":"4.8.0","license":"MIT","_id":"@12-apps/notifications@4.8.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"8fed29456f63133af6a7ae96b2729ff373721dcc","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.8.0.tgz","fileCount":109,"integrity":"sha512-qPT8FLGWIVUGIj8VHEXxROJX1HYc/Aoj+btH4CcWEXCXyDZpBohGBnlx7U7ezN6g+g1gCnyRRaKUqOtJXTeNjg==","signatures":[{"sig":"MEYCIQC2Z5yBR6kmryPqTspZsy0B3PDHKFS1JNG4tUIsOGJ7BgIhAPWX7ANBxjPGzMWHl7J88sfhfoLINpJRsZB3Sne1c1eS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":793548},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"}},"gitHead":"f20bcf2ed49c404ade9f624c06f57333bcca4beb","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.11.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.16.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.8.0_1787746939783_0.2842786095274621","host":"s3://npm-registry-packages-npm-production"}},"4.9.0":{"name":"@12-apps/notifications","version":"4.9.0","license":"MIT","_id":"@12-apps/notifications@4.9.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"772df0ef731822f8e79469d4ee77fffe360f6492","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.9.0.tgz","fileCount":153,"integrity":"sha512-IQqm0wS40/NvY+rz4RgB42Z8pYdmBJ9xkgdvQJNUI1xXDd/YZKzfgUY80AjAO1x3htkoe1z79LIwaOO9v0Y9Jg==","signatures":[{"sig":"MEYCIQDVL4fTWAYyOD7FnqQ2myBXOesSItdC5bXk4ShF0DskkwIhAO+UU0L3iON+E17ZwyMMRyTo2cU1hiprDlbR5zCtvHsS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1050377},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./email/locales":{"types":"./dist/email/locales.d.ts","default":"./dist/email/locales.js"},"./email/previews":{"types":"./dist/email/previews/index.d.ts","default":"./dist/email/previews/index.js"},"./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"},"./email/previews/hono":{"types":"./dist/email/previews/hono.d.ts","default":"./dist/email/previews/hono.js"},"./email/previews/react":{"types":"./dist/email/previews/react/index.d.ts","default":"./dist/email/previews/react/index.js"}},"gitHead":"85338d2d4683d82d2306e87636c9a61d6952900a","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@12-apps/ui":"^6.14.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.16.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.9.0_1787854606681_0.07214236104408567","host":"s3://npm-registry-packages-npm-production"}},"4.10.0":{"name":"@12-apps/notifications","version":"4.10.0","license":"MIT","_id":"@12-apps/notifications@4.10.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"ec89ff867ea2f07a5300f11d6cc7175808b42681","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.10.0.tgz","fileCount":160,"integrity":"sha512-hdMVXRnL7erht7P9/qIcuRbZOjWBRMwt/yGtSyk1CG2t4V72LFkr4Udg7jNYsPa/LQZeuyueaIchARTNBJKdlQ==","signatures":[{"sig":"MEUCIQDhFSZFs8hPwXZsXPaIovVNjQ4gfBgfWmE3Gpn+rrNu8AIgdkcgleAirRnkOMyKoFzano9pjJWXsH602WVZ9ztpU7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1148537},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./email/locales":{"types":"./dist/email/locales.d.ts","default":"./dist/email/locales.js"},"./email/previews":{"types":"./dist/email/previews/index.d.ts","default":"./dist/email/previews/index.js"},"./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"},"./email/previews/hono":{"types":"./dist/email/previews/hono.d.ts","default":"./dist/email/previews/hono.js"},"./email/previews/react":{"types":"./dist/email/previews/react/index.d.ts","default":"./dist/email/previews/react/index.js"}},"gitHead":"17dd067fe8bc49fad2682e1e75a62a5274e6bcc4","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@12-apps/ui":"^6.17.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.16.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.10.0_1788576099715_0.8501174095778772","host":"s3://npm-registry-packages-npm-production"}},"4.10.1":{"name":"@12-apps/notifications","version":"4.10.1","license":"MIT","_id":"@12-apps/notifications@4.10.1","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"7a82d57f984957054fcd39ccdd7d070970d06d34","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.10.1.tgz","fileCount":161,"integrity":"sha512-xWfbpZ0tTMG2D48nOCsMM4spVbammjonuScN8VVwBEYWETvaEHqkXK0dgKBZgWwf7WaJpndHivipbAiRxxs61w==","signatures":[{"sig":"MEUCIQDXrA5WlXzT7tZ1d1sEf9/YXL/5sOtLsfM9Pg5GchOXMQIgRqBEMZbmbgZbUrhjoxp/CSzGudozC1pum697QmLqIxE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1186879},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./email/locales":{"types":"./dist/email/locales.d.ts","default":"./dist/email/locales.js"},"./email/previews":{"types":"./dist/email/previews/index.d.ts","default":"./dist/email/previews/index.js"},"./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"},"./email/previews/hono":{"types":"./dist/email/previews/hono.d.ts","default":"./dist/email/previews/hono.js"},"./email/previews/react":{"types":"./dist/email/previews/react/index.d.ts","default":"./dist/email/previews/react/index.js"}},"gitHead":"b557270a71669ea9348159de1174a6a9b58c1588","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@12-apps/ui":"^6.18.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.16.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.10.1_1788644828298_0.839550112925801","host":"s3://npm-registry-packages-npm-production"}},"4.10.2":{"name":"@12-apps/notifications","version":"4.10.2","license":"MIT","_id":"@12-apps/notifications@4.10.2","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"9a2e008716ec02dd99112df2e61a6a2345aedf6a","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.10.2.tgz","fileCount":161,"integrity":"sha512-i49n8SQANwADZ1eV4iSUemSnoxb+UEh00n4h4WFD4ZcK0hwvHvRD7h3X2NzwX3K9x1Prg7xuc+9TfgLecR60QQ==","signatures":[{"sig":"MEYCIQDOd0F/KxLTEte1rpeQryD2u9PDZCF/ZDyr7/2ZZ36mqgIhAN3rDLZZ3LKGVmJIPsw7atqce4RPfo1ywPrmFIUsZJjX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.10.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1186879},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./email/locales":{"types":"./dist/email/locales.d.ts","default":"./dist/email/locales.js"},"./email/previews":{"types":"./dist/email/previews/index.d.ts","default":"./dist/email/previews/index.js"},"./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"},"./email/previews/hono":{"types":"./dist/email/previews/hono.d.ts","default":"./dist/email/previews/hono.js"},"./email/previews/react":{"types":"./dist/email/previews/react/index.d.ts","default":"./dist/email/previews/react/index.js"}},"gitHead":"2bb534c030df256560ecf8dc150b53f9000ba49f","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@12-apps/ui":"^6.19.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.16.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.10.2_1788648280195_0.2523628979905881","host":"s3://npm-registry-packages-npm-production"}},"4.10.3":{"name":"@12-apps/notifications","version":"4.10.3","license":"MIT","_id":"@12-apps/notifications@4.10.3","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"5a42a629ac06c39164f361709eabc33056d33b1c","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.10.3.tgz","fileCount":161,"integrity":"sha512-QgAsrEsfvBrI64Yo/hSDTN10vaaDc359Jeg0iTpFWbrsaYBjD4VldpfUtRLmA3+f/bZ6YmLaFd4UnHM1W70Qpg==","signatures":[{"sig":"MEQCIEiYh/dfSQxJlejj3RimKUulIvO+s0ajKrywPKmN5mE5AiAy992iKKUx7T91fAMBB8OqQWRS7sREpNfktI1HCG1Xlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.10.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1191483},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./email/locales":{"types":"./dist/email/locales.d.ts","default":"./dist/email/locales.js"},"./email/previews":{"types":"./dist/email/previews/index.d.ts","default":"./dist/email/previews/index.js"},"./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"},"./email/previews/hono":{"types":"./dist/email/previews/hono.d.ts","default":"./dist/email/previews/hono.js"},"./email/previews/react":{"types":"./dist/email/previews/react/index.d.ts","default":"./dist/email/previews/react/index.js"}},"gitHead":"7caa1efc0b9087a2b47d4af3e56cb173051fa5af","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@12-apps/ui":"^6.19.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.16.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.10.3_1788654883406_0.7375201791415751","host":"s3://npm-registry-packages-npm-production"}},"4.11.0":{"name":"@12-apps/notifications","version":"4.11.0","license":"MIT","_id":"@12-apps/notifications@4.11.0","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"homepage":"https://github.com/12-apps/shared-packages#readme","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"8e685ec5b6b2a6cf2797a47ee4727b9518ae7a03","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.11.0.tgz","fileCount":162,"integrity":"sha512-ncNwkVEWExjNxMwIIhsG7P/EXqZd76IZm8yCBtj5lQThMEuRy/dIftBeBgQq3wf0EC4rlUETMHEUPQFm9eaNbQ==","signatures":[{"sig":"MEUCIQCBgP3MpoeCvg+2hloa+l3G7EDU/5Ko/VI2u6IBkH+xvwIgPgnJBCjuXsoEQdCsUL3nC9PlFThrHPaiOpBqqp6aBC4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1220790},"type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./email/locales":{"types":"./dist/email/locales.d.ts","default":"./dist/email/locales.js"},"./email/previews":{"types":"./dist/email/previews/index.d.ts","default":"./dist/email/previews/index.js"},"./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"},"./email/previews/hono":{"types":"./dist/email/previews/hono.d.ts","default":"./dist/email/previews/hono.js"},"./email/previews/react":{"types":"./dist/email/previews/react/index.d.ts","default":"./dist/email/previews/react/index.js"}},"gitHead":"afaec50c7cc4ad3dfc546301f54171a907fd0902","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@12-apps/ui":"^6.22.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.16.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/notifications_4.11.0_1788673297492_0.35185773980670465","host":"s3://npm-registry-packages-npm-production"}},"4.12.0":{"_id":"@12-apps/notifications@4.12.0","bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"dist":{"shasum":"4b007defa430b25538fe8326a4a01b10a43fde0a","tarball":"https://registry.npmjs.org/@12-apps/notifications/-/notifications-4.12.0.tgz","fileCount":162,"integrity":"sha512-ue7/1EAFB0yY8G6h8FUQTYCPfbw4Vd2KbE5P5hDKYMpJr9ogH0225Faz0toU/lXgaZ08L+PAcPeG576ZeyWgkg==","signatures":[{"sig":"MEYCIQDKujhvKW30FxHFb9/nBZLbrr7TxAche1qmHTaWLF89LwIhAIkiH+A1GscYlp4d7a9vgevne7syCKHMTRpJV3FNXC8H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAnCx129AGlEpsFj4m68Pqyhsfp/LjRVv4F25UA+nMUwAiEA4QFMOetyhhGgguiLnc3W0yN5ylbyBRH26Hp+pQCDENM="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@12-apps%2fnotifications@4.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1247943},"name":"@12-apps/notifications","type":"module","wiring":{"db":{"partial":"prisma/notifications.prisma","migrations":"prisma/migrations"}},"engines":{"node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./hono":{"types":"./dist/hono/index.d.ts","default":"./dist/hono/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./server":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.js"},"./manifest":{"types":"./dist/manifest/index.d.ts","default":"./dist/manifest/index.js"},"./web-push":{"types":"./dist/web-push/index.d.ts","default":"./dist/web-push/index.js"},"./manifest/web":{"types":"./dist/manifest/web.d.ts","default":"./dist/manifest/web.js"},"./package.json":"./package.json","./email/locales":{"types":"./dist/email/locales.d.ts","default":"./dist/email/locales.js"},"./email/previews":{"types":"./dist/email/previews/index.d.ts","default":"./dist/email/previews/index.js"},"./manifest/server":{"types":"./dist/manifest/server.d.ts","default":"./dist/manifest/server.js"},"./email/previews/hono":{"types":"./dist/email/previews/hono.d.ts","default":"./dist/email/previews/hono.js"},"./email/previews/react":{"types":"./dist/email/previews/react/index.d.ts","default":"./dist/email/previews/react/index.js"}},"gitHead":"95210cee38dbcd9aeb622fe9955b53d23595e935","license":"MIT","scripts":{"lint":"eslint src --max-warnings 0","test":"node ../../scripts/vitest-with-teardown.mjs run","build":"rm -rf dist && tsup","clean":"rm -rf node_modules coverage","typecheck":"tsc --noEmit","test:watch":"vitest watch","check-types":"tsc --noEmit","prisma:sync":"node scripts/sync-notifications-schema.mjs","prisma:sync:check":"node scripts/sync-notifications-schema.mjs --check"},"version":"4.12.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8b142e71-2696-4c7d-bc45-b18b9b0a807e"}},"homepage":"https://github.com/12-apps/shared-packages#readme","repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"_npmVersion":"12.0.2","description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","directories":{},"maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@12-apps/ui":"^6.25.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"hono":"^4.6.0","tsup":"^8.0.0","jsdom":"^25.0.1","react":"^19.2.0","eslint":"^9.39.1","vitest":"^3.2.4","web-push":"^3.6.7","react-dom":"^19.2.0","typescript":"^5.9.2","@types/react":"19.2.2","@12-apps/wiring":"^1.16.0","@types/web-push":"^3.6.4","@types/react-dom":"19.2.2","@12-apps/eslint-config":"^1.22.0","@testing-library/react":"^16.1.0","@12-apps/typescript-config":"^1.21.0","eslint-plugin-test-flakiness":"^1.4.0"},"peerDependencies":{"hono":">=4.0.0","react":">=19.0.0","web-push":">=3.6.0","react-dom":">=19.0.0","@12-apps/wiring":">=1.3.0"},"peerDependenciesMeta":{"hono":{"optional":true},"react":{"optional":true},"web-push":{"optional":true},"react-dom":{"optional":true},"@12-apps/wiring":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/notifications_4.12.0_1789244071270_0.8086385632697102"}}},"time":{"created":"2026-08-13T07:15:55.151Z","modified":"2026-09-12T20:14:31.701Z","1.0.0":"2026-08-13T07:15:55.565Z","2.0.0":"2026-08-14T23:06:08.842Z","2.1.0":"2026-08-15T02:08:03.506Z","3.0.0":"2026-08-15T02:21:11.920Z","4.0.0":"2026-08-15T13:26:41.032Z","4.1.0":"2026-08-15T14:51:29.822Z","4.1.1":"2026-08-17T16:25:36.666Z","4.2.0":"2026-08-21T15:49:35.928Z","4.3.0":"2026-08-22T15:20:45.394Z","4.3.1":"2026-08-22T17:46:23.421Z","4.4.0":"2026-08-23T10:13:51.460Z","4.5.0":"2026-08-24T18:52:06.287Z","4.6.0":"2026-08-25T00:32:45.708Z","4.7.0":"2026-08-25T17:58:12.174Z","4.7.1":"2026-08-25T19:23:50.026Z","4.8.0":"2026-08-26T12:22:19.934Z","4.9.0":"2026-08-27T18:16:46.837Z","4.10.0":"2026-09-05T02:41:39.850Z","4.10.1":"2026-09-05T21:47:08.484Z","4.10.2":"2026-09-05T22:44:40.374Z","4.10.3":"2026-09-06T00:34:43.562Z","4.11.0":"2026-09-06T05:41:37.666Z","4.12.0":"2026-09-12T20:14:31.356Z"},"bugs":{"url":"https://github.com/12-apps/shared-packages/issues"},"license":"MIT","homepage":"https://github.com/12-apps/shared-packages#readme","repository":{"url":"git+https://github.com/12-apps/shared-packages.git","type":"git","directory":"packages/notifications"},"description":"Plug-and-play notification system (12-15): an always-on in-app inbox, per-user × per-category channel preferences, and email / SMS / WhatsApp / web-push transports behind vendor DRIVERS so a second provider is a config entry. Framework-free core (.), host","maintainers":[{"name":"tigredonorte","email":"tigredonorte3@gmail.com"}],"readme":"# @12-apps/notifications\n\nThe channel-agnostic notification system: an always-on in-app inbox, per-user ×\nper-category channel preferences, and email / SMS / WhatsApp / web-push\ntransports behind vendor drivers — both halves, one factory each.\n\n```ts\nconst notifications = createApiNotifications({ db, contacts, transports });  // backend\nconst notifications = createWebNotifications({ apiBase });                   // frontend\n```\n\nAdoption contract, wiring rules and the seams: **[ADOPTING.md](./ADOPTING.md)**.\n\n## Three layers, each open without touching the others\n\n```\nGENERATORS          domain event  →  agnostic content   { title, body, link, data }\n      ↓\nCHANNEL ROUTER      always writes the inbox record, then fans out one QUEUED\n                    delivery per channel that is (a) enabled by the recipient's\n                    preferences for the generator's category and (b) supported by\n                    its transport for this recipient\n      ↓\nTRANSPORTS          format the agnostic content for one channel and send it,\n                    through a vendor DRIVER\n```\n\nAdding an event type is a generator. Adding a channel is a transport. Adding a\n**vendor** is a config entry. None of the three touches the other two.\n\n## What one emit does\n\n```ts\nawait notifications.notify({\n  type: 'order.paid',\n  recipient: { userId, clientId },\n  payload: { code: 'A-1024' },\n});\n```\n\n1. Resolves the registered generator for `type` → agnostic content.\n2. **Always** writes the inbox record — the always-on channel — atomically with…\n3. …one QUEUED delivery per channel that survives the preference gate, the\n   transport's `supports()` gate and the host's plan policy.\n4. Hands the deliveries to the transports asynchronously, so an emit site never\n   blocks on provider I/O.\n\n`notify` opens its **own** transaction and a host cannot join it, so call it\n**after** your own transaction commits — from inside one it commits an inbox row\nand dispatches an e-mail for a payment that then rolls back.\n\nFailure is isolated per channel: one provider failing marks only its row FAILED\n(with the provider's error) and never blocks the inbox record or the other\nchannels.\n\n## The delivery lifecycle\n\n```\nQUEUED ──claim──▶ SENDING ──▶ SENT\n                     │\n                     ├──▶ FAILED ──sweep──▶ QUEUED   (attempts < max)\n                     └──▶ DEAD                        (attempts = max, terminal)\n```\n\nEvery send is **claimed** first: one conditional `UPDATE` moves the row out of\n`QUEUED`, and the sender proceeds only if it moved exactly one row. So two\ndispatchers racing one delivery — two cron runners, a sweep overlapping itself,\nthe two app containers a zero-downtime rollout briefly runs — produce exactly one\nprovider call. Delivery is still at-least-once, but the remaining window is the\nunavoidable one: a crash between the provider call and the `SENT` flip. Transports\nmust tolerate that.\n\n`drainPending(olderThanMs, take)` is the retry sweep a host puts on a cron. It\nselects on `updated_at` (so a row it just re-queued is not stale again on the next\ntick), takes at most `take` rows (default 200), and re-queues each with the same\nconditional shape — so it can never drag a committed `SENT` row back. Each claim\nspends one of `maxDeliveryAttempts` (default 5); the last failure writes `DEAD`,\nwhich no sweep selects again.\n\n## The endpoints\n\nMounted under whatever prefix the host chooses (the origin host: `/api/account`):\n\n| | |\n|---|---|\n| `GET /notifications` | the owner's inbox — newest first, cursor-paginated, `filter=unread` |\n| `GET /notifications/unread-count` | the inbox half of the badge number, a single indexed COUNT |\n| `POST /notifications/mark-read` | `{ ids }` or `{ all: true }`; idempotent, reports what moved |\n| `POST /notifications/delete` | soft delete, 1..100 ids; the delivery trail survives |\n| `GET` / `PUT /notification-preferences` | the category × channel matrix, plus per-channel AVAILABILITY (destination on file + channel declared) so dead toggles render disabled with a hint |\n| `GET` / `POST` / `DELETE /push-subscriptions` | the VAPID public key + device count; register / drop this browser. `GET ?endpoint=…` also answers whether the server still has THAT endpoint under the caller |\n\nSuccess is `{ data }`; a denial is `{ error }`, unwrapped. Every endpoint takes its\nsubject from the actor and never from the request — and eight of the nine are\ncookie-authenticated writes, so the host owes them a CSRF story (ADOPTING rule 13).\n\n## The channels\n\n| Channel | Built-in drivers | Destination |\n|---|---|---|\n| `EMAIL` | `resend`, `log` | the contact directory's `email` |\n| `SMS` | `twilio`, `log` | `phone`, normalized to E.164 (`defaultCountryCode` required) |\n| `WHATSAPP` | `meta`, `log` | `phone`, free-form or a pre-approved template |\n| `WEB_PUSH` | `vapid`, `log` | the user's `push_subscriptions` rows, all of them |\n\n`log` is the dev/e2e driver: it logs instead of sending, and deliberately logs\n**no destination** — an address and a phone number are PII, and a push endpoint\nis a bearer capability for that browser.\n\n`defaultCountryCode` is required on both phone channels rather than defaulting to\nBrazil: a US adopter that forgot it turned `4155552671` into `+554155552671` — a\nplausible Brazilian mobile — and texted a stranger the customer's order.\n\nWeb Push prunes a subscription the push service reports GONE (404/410) and\nsucceeds when at least one browser accepted the payload, so the table self-heals\nas browsers expire subscriptions. A transient failure (503) prunes nothing:\npruning there would destroy a live destination. A push endpoint belongs to a\nbrowser PROFILE, not to a user, so registering the same browser as a second user\nre-owns the row (the safe choice — the alternative leaks A's notifications to B in\na form B's keys decrypt) and the preferences screen derives \"this browser is\nreceiving alerts\" from the SERVER's answer, not from the browser's own\nsubscription object.\n\n## One mail layout, and a console that previews it\n\n`EMAIL` used to render a mail as three bare `<p>` tags. That is a **layout**\nproblem rather than a wording one — a paragraph with no document around it\ninherits whatever the client decides: 13px Arial in Gmail, Times New Roman in\nOutlook, no centring anywhere — so the layout ships here, beside the transport\nthat needed it.\n\n```ts\nimport { renderEmail } from '@12-apps/notifications/email';\nimport { PT_BR_EMAIL_CHROME } from '@12-apps/notifications/email/locales';\n```\n\n`renderEmail(document)` takes STRUCTURE — a heading, paragraphs, an optional\nfacts table, at most one call to action — and never markup. Three things follow,\nand each was a real defect in the renderers it replaces:\n\n1. **Escaping cannot be forgotten.** It happens in one place.\n2. **The plain-text twin cannot drift.** Both halves render from the same\n   object. A `text/html` part with no `text/plain` twin is scored by every major\n   spam filter.\n3. **A preview is honest**, because the console renders exactly this.\n\nThe client constraints are encoded once so no caller has to know them: tables\nrather than divs (Outlook lays HTML out with Word), inline styles only (Gmail\nstrips `<style>`), no web fonts or `color-mix()` or CSS variables, a hidden\npreheader, a `bgcolor` attribute **and** a background style on the CTA.\n\n**The EMAIL transport opts in.** Declare `layout` on the driver declaration and\n`formatEmail` renders the shared document; omit it and you keep the previous\nrendering byte for byte. Opt-in rather than automatic because `brand` and\n`chrome` are required with no default — a package that defaulted them would sign\nanother company's mail, in a language nobody chose — so making them mandatory\nwould break every host already declaring EMAIL, at runtime, on the first send.\n\n```ts\n{ channel: 'EMAIL', driver: 'resend', apiKey, from, linkLabel: 'Ver detalhes',\n  layout: { brand: 'Loja Exemplo', chrome: PT_BR_EMAIL_CHROME, locale: 'pt-BR' } }\n```\n\n### The preview console\n\nThere is normally no way to *see* a transactional mail without triggering the\nevent that sends it — signing up with a throwaway address for the verification\nmail, settling an order for the receipt. So nobody looks, and a product\nrendering three ways does not find out. A layout nobody can see is one release\nfrom being three again, which is why the console ships in the same package.\n\nIt is the package's **second wiring manifest**\n(`@12-apps/notifications-email-previews`), because the first has already spent\n`http` on the account inbox and `surface` on the bell. That split is deliberate:\nthe inbox ships to every signed-in user, and this console publishes the whole\nmail inventory and the exact wording and link shape of the verification and\nreset mails. **You gate the mount** — the routes declare `kind: 'authenticated'`\nand name no permission id, because the ids are the host's.\n\nWHICH messages exist is yours too, declared as `sources` that are asked **per\nrequest** (a source backed by a registry that fills at import time would\notherwise answer with whatever was imported first). A source reports its own\n`coverage` — what it cannot show — and the screen renders that as a warning\nstrip rather than pretending to be complete. Nothing can be sent from it: it\nholds no driver, no transport and no address.\n\nSee **[ADOPTING.md](./ADOPTING.md)** for the mount, the gate and the sources.\n\n## Live activities — the centre's second kind of entry\n\nAn inbox notification is an EVENT: it happened, it is stamped, it is read or\nunread, and tomorrow it still says the same thing. A **live activity** is\nONGOING STATE — pinned above the list, no read/unread, nothing to delete, it\nupdates itself, and it is gone the moment the thing it tracks finishes.\n\nThe distinction is not cosmetic. \"Your order is on its way\", read an hour later,\nis a claim about the past presented as news; the more reliable the inbox is, the\nmore of those a person accumulates, and somewhere in the pile is the question\nthey actually have — *where is it now*.\n\nOpt-in, and absent means absent: a host that passes nothing renders the panel it\nhad, with no section, no heading and no reserved space.\n\n```ts\ncreateWebNotifications({\n  apiBase: '/api/account',\n  messages,\n  liveActivities: {\n    // A HOOK, so it may read context — the tenant, the session, a query client.\n    useActivities: ({ active }) => useMyLiveThings({ enabled: active }),\n    messages: { sectionTitle, openActivity, updated },\n    renderIcon: (activity) => ICONS[activity.kind],\n  },\n});\n```\n\n`active` is whether anyone is looking — `false` while the panel is shut. Pass it\nto your query's `enabled`. It is a hint about NEED, never about correctness.\n\nIt is NOT a promise that a shut panel costs nothing: the bell calls the same\nhook, and the bell is always mounted. `active` earns its keep on the closing\ntransition, where a query told to stand down does not fire one last time on the\nway out.\n\nOne activity is `{ id, kind, title, body, link, steps, activeStepId, updatedAt }`\n— `LiveActivity`, importable from either entry (`@12-apps/notifications` or\n`@12-apps/notifications/react`, so a host wiring the surface needs one import\nline, not two). It is defined in `src/live.ts`. `steps` + `activeStepId` draw a lane, because \"how far along is\nthis\" is the shape almost every ongoing subject has; both are optional in effect\n— an activity with no lane is a heading, a sentence and a timestamp that keeps\nmoving. An `activeStepId` naming no step draws NO lane rather than a lane with\nnothing lit, which would read as a process that has stopped.\n\n### On a phone: one tray entry, one buzz\n\nThe other half is the OS notification, and it is one field. A generator whose\nevent is about something also tracked live puts the activity's id in `data`:\n\n```ts\nimport { LIVE_SUBJECT_KEY } from '@12-apps/notifications';   // the root entry\n\ndata: { [LIVE_SUBJECT_KEY]: `order:${orderId}` }\n```\n\n`formatWebPush` turns that into a `tag` on the push payload, and a tag makes the\nnext push about the same subject **replace** the one already in the tray —\nsilently — instead of stacking under it. Four stages then cost one entry and one\nbuzz, and the entry that remains is the current one. Without it a phone\naccumulates one alert per stage, each still asserting a stage the subject has\nsince left.\n\n`tag` is `null` for an ordinary event rather than absent, so a service worker\nreads one payload shape. A worker that ignores it keeps today's behaviour\nexactly — which is what makes the field safe to ship ahead of the workers:\n\n```js\nself.registration.showNotification(payload.title, {\n  body: payload.body,\n  data: { link: payload.link },\n  ...(payload.tag ? { tag: payload.tag, renotify: false } : {}),\n});\n```\n\n## The models\n\n`prisma/notifications.prisma` — `Notification`, `NotificationDelivery`,\n`NotificationPreference`, `PushSubscription` — plus this package's own\nmigrations, COPIED into a host's schema folder (never symlinked). See ADOPTING.\n\n`notification_preferences.channels` is a JSON map rather than a boolean column\nper channel: the channel set is open-ended, and a stored row missing a key falls\nback to that channel's default, which is what makes the ARRIVAL of a channel a\nno-op for every existing row.\n\n## Testing\n\n```bash\npnpm --filter @12-apps/notifications test         # 159 unit tests\n```\n\nThe unit suites pin the logic against an in-memory db seam. The same contracts\nare then re-run against a **real Postgres**, out of the **published tarball**, in\n`harness/backend` — and the frontend surface is driven by Playwright against that\nsame server in `harness/frontend` (page `notifications-center`). An in-memory\ndouble can agree with a wrong SQL translation; the harness is what makes the port\nreal.\n\nThe **concurrency** contracts are the clearest case for that, and they are pinned\nin both places on purpose. A single-threaded fake agrees quite happily with a\nread-validate-write dispatcher — the send resolves before any second caller can\nreach the row — so \"two dispatchers, one delivery\" is asserted over real SQL with\nthe sends held open, where the predicate is evaluated by Postgres against the row\nversion the other dispatcher committed.\n","readmeFilename":"README.md"}