{"_id":"@wk-xnotify/sdk","_rev":"29-f7a9dd805af3a7afe8c701187bc7b755","name":"@wk-xnotify/sdk","dist-tags":{"latest":"1.3.19"},"versions":{"1.0.0":{"name":"@wk-xnotify/sdk","version":"1.0.0","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.0.0","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"7a9a5721ea50b3b39811546cf89326d6f643d254","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.0.0.tgz","fileCount":9,"integrity":"sha512-WH3V6PW/XMxbkzAbb1S0m6Jle8CXJM6lKJ3AH8cE2h2orBnDxMcK0rV0qa0UCWkdOVpX1DP6Icofv1Z9ELQ05g==","signatures":[{"sig":"MEUCIQCtcMwiQN4xdPloDN5abX+YfmSoj7kk16rCmKLRYG+gQAIgVCkxKL1axP1Jq5u+CgJ9ljxmQ4X6i+f+7kk1VPZ0wDw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206825},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"0bbe6887099b394188af8c422590f672b05a681b","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.0_1777291385466_0.2973169243233096","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@wk-xnotify/sdk","version":"1.1.0","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.1.0","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"4f11605e41e86aeb798e4e57efdc8748f2beeb1b","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.1.0.tgz","fileCount":9,"integrity":"sha512-Hdex66fXROI9oCbvUt86J2MaDc14Ch431tyO7GcFY+NVOEo76HadMsVRDRWmGTK6R3+fSiK1njNlfTI+BRelZA==","signatures":[{"sig":"MEQCIBs1GHS8TguhciQhAnetZzcCpDcjp7NqfPb9z20xEBb5AiBQDlUNFO0q5Rb5eU0wgD0JwSVc3cSWCOajSciBn4UUgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219880},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"278b46a3a45c0822a9dbd03f5839de6e09936e85","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.0_1777551715152_0.9527999128821436","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@wk-xnotify/sdk","version":"1.1.1","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.1.1","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"5d96a0a3f89dd22a5fd79bd65c9fb94e881da053","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.1.1.tgz","fileCount":17,"integrity":"sha512-22XDeIganDOAl8OCAPhIvz/AkiCzv9X3cNrx/5tFbsw9XRR63EU6iFw3ZNbd861KDmBTzFxGVFxe5RfTsSKKIw==","signatures":[{"sig":"MEUCICv00ce//+ZwZIlVvYBNfLIxlMNNv/24nDX5WB26UyQ7AiEA+MgwvK1Kzh8bMNWtl/Gu1+G90mISE/63LZ4Vwf9nu84=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":372539},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"}},"gitHead":"278b46a3a45c0822a9dbd03f5839de6e09936e85","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.1_1777553413527_0.5698238120544179","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@wk-xnotify/sdk","version":"1.3.0","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.0","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"81f8920f87618033e046f85dc4561579d480a4bc","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.0.tgz","fileCount":23,"integrity":"sha512-CjIJQ2GxnDr8sfVRlHWhkLfY8IXX+92K36ptRgFloiz9xeE4TxB5Be1lpfwDeptX805dBp3ZU9g9k2Ppkmyafg==","signatures":[{"sig":"MEYCIQD2hhdnri4giguLBnmoXrYMM1xl9ktauS9lUo2Td+jklQIhAMhEwke1v8x4Rv6l4wFrjsv1PUoH1SfwbJGtoSpPQGJM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":445388},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"42f8f16ccd32bc1ef17e97948896fe32281c0f51","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.0_1777964460126_0.48662968868199297","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@wk-xnotify/sdk","version":"1.3.1","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.1","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"050e39cd5c0398f15d49588c81731c26247240dc","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.1.tgz","fileCount":23,"integrity":"sha512-M5k1goAo2n/bDzYO0WefykJa0R123WAzYOOpZT1rhnjrMzef5MNRp8rHiziOSCWWZi1uIT21hImw/vKDVlQfqQ==","signatures":[{"sig":"MEQCIHIhb5/2s+QQFTdZ/ih7+orbPdhPTvzZFfA38gV7o1OyAiBmzJQ1mTkqH1qCOdbG1XTmm0YWawCXk81SeSflF+ziNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444780},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"42f8f16ccd32bc1ef17e97948896fe32281c0f51","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.1_1777965721017_0.8420641893430212","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@wk-xnotify/sdk","version":"1.3.2","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.2","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"5911e21e46b3a5a69486ace25febdcdd399959ed","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.2.tgz","fileCount":23,"integrity":"sha512-pT+uFAOqNwTZvR/kxzwVSy9BCNjj1TvmujlgG77Ixd9glgUMSMlPYdxVx/4LoAZ9Vf5ITCGLvmzhhjT4RXyx1Q==","signatures":[{"sig":"MEUCIQDeXhqfqB+lWnQWfj2A0hmqNAAlY5TcRM5hQPfoVbhooQIgHkvpfbDJC+L7bgvoNMGD2UMNxSR1xvszF059BqXLBLk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":460641},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"42f8f16ccd32bc1ef17e97948896fe32281c0f51","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.2_1777979639414_0.21587604822006545","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@wk-xnotify/sdk","version":"1.3.3","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.3","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"1e717d223eec41413a565dba2de7be98cd83e504","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.3.tgz","fileCount":23,"integrity":"sha512-8AcIsOlkbzvdC5aCz1Ozub6AyZCK95I5yU0LSkfVYbEaxL+HelT0pfqqXBRvUd0sZG9tjLiWlE3D8h2PiO3kJA==","signatures":[{"sig":"MEUCIQDHd1m7WUOXnq+UnTONMSJOR8+sVaDddwtBB82gMkFSvgIgPHbiXZKjJRvt+ikR/0s/fp5J5E5kYtZC9czrCa6mueY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459988},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"42f8f16ccd32bc1ef17e97948896fe32281c0f51","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.3_1777980033172_0.9302618735326451","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@wk-xnotify/sdk","version":"1.3.4","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.4","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"8e0f4efdcf22c6143bf77c06994844b2bc9b0495","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.4.tgz","fileCount":23,"integrity":"sha512-vpT52gpcQtvtOMo0T8Gk9w6zWMxmnVw8hA76kVI/VuUU8poZT1ck6ChpkWIpomd2OUW35GB0pzOs0tc6i4wskQ==","signatures":[{"sig":"MEUCIFwQvY33vzGtwraP0Zv8CyxeEOW1DG5v1vDHzi9fafIqAiEA6goq22Hp7FWJ+cNZqwZeiY3Zhsz6+XBCwc+rpqltE8E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459987},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"42f8f16ccd32bc1ef17e97948896fe32281c0f51","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.4_1777980136893_0.6894022236272186","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"@wk-xnotify/sdk","version":"1.3.5","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.5","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"698390c81263ca9e6b184bfaf1dbb5932fb6ad39","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.5.tgz","fileCount":23,"integrity":"sha512-Y/+tfB5STSf21Zypyf9StyS7LOv+6LAwCavPkyEzCnRGLaNKrZawycIlLLT8eu3eyyBej3qA4GSUZcnnCoCp8A==","signatures":[{"sig":"MEQCIEEzJAicJ5xM+Q9/o+9QzD48V9KEN9sh5p6yLwdgx2TyAiAybNRh9FB7aNyDpghiZOl0sCoYzGOQlFC0PM38ESJztg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":508068},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"c09d4f2e6f1317d86b3608cc1daef28ba53a3542","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.5_1778144944107_0.7872208067813538","host":"s3://npm-registry-packages-npm-production"}},"1.3.6":{"name":"@wk-xnotify/sdk","version":"1.3.6","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.6","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"6cdac9039714b2d3537757c38b1219929f29aa39","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.6.tgz","fileCount":23,"integrity":"sha512-bYT3nVszLbDICwSbJ3NlMyGnzd4I5rkZUi1W4+c6i6Ci+KlY3p6aJt25qEcRumH66mt2gSuvCCYCb+fEsqn+kw==","signatures":[{"sig":"MEQCICIyq8Fnohuo4DJKeLh736e0J4LVMnda2Hw7ykgtdWX3AiBQjFF5YDktR/VSm43+llJrmj4eygj0MpwhfODY5ypdSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":636754},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"507967ef7c352dfd198409ea1638c7d22426c028","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.6_1779877109087_0.7176504663922034","host":"s3://npm-registry-packages-npm-production"}},"1.3.7":{"name":"@wk-xnotify/sdk","version":"1.3.7","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.7","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"4b42968cb9a5e17c10f3ba508e2fa347227c0f61","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.7.tgz","fileCount":23,"integrity":"sha512-m1ZjOAcQA12uhL2QzanFHt9IvYmEZ1ct7D4yREHJjdCiibHjtNP1lOIcSP5bsE4AeX4DXuHSqoH9k7w16y7uOw==","signatures":[{"sig":"MEYCIQDj37MtG5QlJy5MC6WPvvyA/SLoUXsJYznehlxd4IqGrgIhAIJ3ug1KGvvdhunskMukkPqLOdhx765EA8/CkHGZr+yB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":593572},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"2801c2244ea43088a734361e19d1824e66b6db10","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"10.9.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"23.6.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.7_1780991086823_0.9714759601355971","host":"s3://npm-registry-packages-npm-production"}},"1.3.8":{"name":"@wk-xnotify/sdk","version":"1.3.8","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.8","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"c5051f8adee0fe10220ebd55c8625d91f8d965d1","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.8.tgz","fileCount":23,"integrity":"sha512-vYVe41WzkmnWv2iOB1oHF6V5vd9k4S7DLhtVlAHszdTLwy5y9+o0fouO9tbl89RT2GFbv7dFEXpb09KN1IDXwg==","signatures":[{"sig":"MEUCIQCzGy803AoGpoJKc/f1s7+nwlLFlHEG6W7VivWXLiRXxAIgTgW3CrYj3CT2Iw92i41zKqfB60xIJAlsMJGrAoxn2vQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":596811},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"0a1659338799663ba995325eef2f54c29d53af09","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"10.9.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"23.6.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.8_1781776654219_0.46483722319111065","host":"s3://npm-registry-packages-npm-production"}},"1.3.9":{"name":"@wk-xnotify/sdk","version":"1.3.9","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.9","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"8a14d645eb8f20102511d55694b2192c73c26d09","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.9.tgz","fileCount":23,"integrity":"sha512-5HgI48M57MiMbdN7VPcIFLsQ9EgoAGNOLOxHqj8oZscGraQEq3VnsHRv8YP1yj/tRP602k+g254GUsZG8TRkGQ==","signatures":[{"sig":"MEUCIQDoIKI1WWWy08nmzJkyJFnSkFKtYG/Lrju143WRqcd16wIgeZwFgBh8KvQvdus0QTvKfJoAME+pln0Z1NUQjmde20s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":634428},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"769a73a14badd785006021678053e0ab9c36bc34","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"10.9.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"23.6.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.9_1781852015731_0.8958617689359811","host":"s3://npm-registry-packages-npm-production"}},"1.3.10":{"name":"@wk-xnotify/sdk","version":"1.3.10","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.10","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"c565de13ff48913ef6b9257d78579c3eda311c93","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.10.tgz","fileCount":28,"integrity":"sha512-WZ7hNWZLwKO7XxbDfyKbgHL8OzbXlnTH0FEZ3rwCzeDEaLVlPVCt9N8YKgxEOnzP6grw/YzXIasGyp0AO7Q4XA==","signatures":[{"sig":"MEUCIAXD/wV7dfvjl0nsqlw0PsmQ1h2w42CopCdvncxe/osYAiEA6rZ/08t/03CO9kEsj3t3XZZ7JTsLfCNwbDQBjyffqB0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":650334},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"6b3ae1d6a79f8385af9c02c2d3e08e47a0601130","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"10.9.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"23.6.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.10_1781857328637_0.961781412846797","host":"s3://npm-registry-packages-npm-production"}},"1.3.11":{"name":"@wk-xnotify/sdk","version":"1.3.11","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.11","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"538ba91d0535b5c29ca8e70537e3b4808ee3c823","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.11.tgz","fileCount":28,"integrity":"sha512-nyzPQ1gRDKGYKm0/RB41YIV4c35dYMEBCBR+H3qHBjk7vaaR7rLkVgd/88JCL5u9mp4yya/N6kvjDPF9TMLJEQ==","signatures":[{"sig":"MEUCIHeIuQbSxY9J79tofAPj42CRmrxBtF2SqLwtwZ20x4y3AiEAn55oC8NJZr2EyosoLUOs01DJ2OihpvSet5NXvhXh24A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":650579},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"10ea3198999bf4aaea3552dd9ccd580bc12015e2","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"10.9.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"23.6.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.11_1782812520809_0.7676475412533477","host":"s3://npm-registry-packages-npm-production"}},"1.3.12":{"name":"@wk-xnotify/sdk","version":"1.3.12","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.12","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"b65502593e3513ccc1e74d51a4e2a0b52390d7f6","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.12.tgz","fileCount":28,"integrity":"sha512-6ue8p0gi2uPgE/W49W39FasikIyUvTWvjZcbzPUw3tY2lLcjADeo2duP9IJn2HWbF+pPA0L3Z+vzUFvioBK2Pw==","signatures":[{"sig":"MEYCIQC4VrTu32i2wkcNxpnko0JRFfI3Lqr+fgJ8GuyfuP+8ewIhAM1q4mTgRjd5U0roykbKJATAqpo+Z3n2ulkTcGUk4oGQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":680788},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"e490b4084ef7e81dcd81671f36569a257b14730b","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.12_1782995536413_0.5995812696159897","host":"s3://npm-registry-packages-npm-production"}},"1.3.13":{"name":"@wk-xnotify/sdk","version":"1.3.13","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.13","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"1dcaa0a508fdd602a8bb9b005796df317314bc5c","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.13.tgz","fileCount":30,"integrity":"sha512-uAWB4Cm9Kdj4tWHis+BjeDjOCDJPq1Y20Ba4BNwtPHjCW8cGgVG2wMYrGe+5hq2daYLt16Dy05C4XRApEcMeMA==","signatures":[{"sig":"MEQCIEiact5P8JKTkfSGRWFYQ5n+uoJ1xv5YA01q/rHX7uNeAiAdwMf+Lo/7yhgtZVjOL+FIQKrImIw1Hn3eHiHvjc3hKg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":753900},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"7cbfa9ae03a5bbb34d528de879e24cac45550372","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.13_1785324041309_0.8772939526038976","host":"s3://npm-registry-packages-npm-production"}},"1.3.14":{"name":"@wk-xnotify/sdk","version":"1.3.14","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.14","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"48e829dc4b64adbc2953b6d380bbf047352ace17","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.14.tgz","fileCount":30,"integrity":"sha512-bW0N7BLnIuxS5U+/bhFehtp6tV9CZKH6wWJi/+CseXwyf458fmaMWrGeJex7Dw3qURBqIC7J7wdcJyRvoIx18A==","signatures":[{"sig":"MEUCIE7djlLbKsjXXxgwfUrK/pAn3EyWxR9Bdz01SrmHS374AiEA1LstW5GAb/zYbQhm43FGrcZQoXHhzFARWCci5xHspvA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":772356},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"346011e8e816692967e9abbed1446234509730a7","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.14_1785481547740_0.5172199271907996","host":"s3://npm-registry-packages-npm-production"}},"1.3.15":{"name":"@wk-xnotify/sdk","version":"1.3.15","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.15","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"9358d8846bb56acc6baaaeb79769cd5088e2c640","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.15.tgz","fileCount":30,"integrity":"sha512-ZSraQD8bKIMdhz3V6mTZBP1x6Qrfikv9QroFvHCJYUMcp8BRGJU5PInifi3Slh5vNB357dhuN734aaJix3hvGw==","signatures":[{"sig":"MEYCIQCtaiXVN0vRDPqLMEXiQDOpm0H6sAhdH1DpCaAC6KHB4QIhALggQEHlq7EVmW60wVUbNCGW9yEMzNDPnQXT3TxxSyS4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":784559},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"f79db314e5f32ab14d8b64b84ee4e1273710975b","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.15_1785735816509_0.18807075591641764","host":"s3://npm-registry-packages-npm-production"}},"1.3.16":{"name":"@wk-xnotify/sdk","version":"1.3.16","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.16","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"3fb2f496f365b71fdbc410e7bf732fc4c1239ef7","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.16.tgz","fileCount":34,"integrity":"sha512-aOt7fzqKycA4a0XtaJAAT44Tsbi88QbZih34R4+wXFV/s8/m89z8PCJg/LqJ9PVHzpWFKgB+P043O0AEW4qHLw==","signatures":[{"sig":"MEYCIQDFamQwZKPyZufLjeq/aIFMbpM0RGl7eAZBon/h4On23wIhANltKCRLNRZjO4n9swJstg3DU1TtJZugaNm8NZWBytH+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":795921},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"6f864a064c2159e645bb39ded15e448cb4346163","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.16_1788328446908_0.3490439348116652","host":"s3://npm-registry-packages-npm-production"}},"1.3.17":{"name":"@wk-xnotify/sdk","version":"1.3.17","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.17","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"mukul_wk","email":"mukul@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"9b4a2dd0f024301d984272ee2d082efd491528ec","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.17.tgz","fileCount":34,"integrity":"sha512-HRPbT9JxtxAUVZz/j2eBKK34IiFaT6Ps3o5TXeqtUDvD+LgsJZGb2xChRPK2VGYdbgHLAa8OSUxOFrLK2xBhxg==","signatures":[{"sig":"MEYCIQC5onad4a+xVwGbaO9gRQjoJJBYXeRi8bNLqnPUSbBaoAIhALMQv6iir1BUWfEhrR7uvikFqyTKxXVZ0bm/vsYEcUj1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":795921},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"897f4b0d94cb8ebea110bdc41c27b42d270369e0","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.17_1788505972646_0.5255261971509966","host":"s3://npm-registry-packages-npm-production"}},"1.3.18":{"name":"@wk-xnotify/sdk","version":"1.3.18","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"author":{"name":"XNotify Team"},"license":"MIT","_id":"@wk-xnotify/sdk@1.3.18","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"aman_prakash","email":"aman.prakash@webknot.in"}],"homepage":"https://xnotify.app","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"af65623c3eaf958af4c6fa850f739c7d50756d3a","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.18.tgz","fileCount":34,"integrity":"sha512-qiKAiHmo2RcLQpKkJYJKH9nm4QY49n+ZMOPfsk8foUa8EwrWA5MV0aqZTiuiqCygga0KuJJANjq9VxXyo6MDJw==","signatures":[{"sig":"MEYCIQCBGnU474L0Xt6b9mBgiTZhHC6XlySJdDzoar9xBa0z5AIhANzKdXeGg3HV3EON0hXQ1j28FoIVKu/y+IH2v2AovLo2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":780481},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"f967bda6ef56b50bbbef92ea4d08c73b3c09c500","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"_npmUser":{"name":"aman_prakash","email":"aman.prakash@webknot.in"},"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.19.0","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"_nodeVersion":"26.8.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.18_1789033742422_0.09628154735413075","host":"s3://npm-registry-packages-npm-production"}},"1.3.19":{"_id":"@wk-xnotify/sdk@1.3.19","bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"dist":{"shasum":"bada5a8aaf85bb6f960b982bcb9c6c2eab591975","tarball":"https://registry.npmjs.org/@wk-xnotify/sdk/-/sdk-1.3.19.tgz","fileCount":34,"integrity":"sha512-I0u00+UvZcltefWXgDAcGrb5z+CdiY1cxW0DO625JyWoPR+NZGeUe5ur2ypeQyQlCRRL0jFtm9KR+/shgyv9CQ==","signatures":[{"sig":"MEYCIQClh37GQOeXGgbK3v1vg0cVXZ+0yxkfV/IrNGYjNremZgIhAKuLNBwLcolhfFGNmFxhztt9cfoB/BUjRa7qhe83hu7s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICSFHBTE/JjHJIjCGiyG8yYhs2ELfDeNfOKkG5UsCvLCAiBNJ9CF/Y+sbBd0mn0u/7qZ3UcjAnfB8D92udklNxdUhw=="}],"unpackedSize":801817},"main":"dist/index.js","name":"@wk-xnotify/sdk","types":"dist/index.d.ts","author":{"name":"XNotify Team"},"module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react-entry.d.ts","import":"./dist/react-entry.mjs","require":"./dist/react-entry.js"},"./react-native":{"types":"./dist/react-native.d.ts","import":"./dist/react-native.mjs","require":"./dist/react-native.js"}},"gitHead":"2f6dc444cc6cc223fae91a9686fc44510d5c7f9f","license":"MIT","scripts":{"dev":"tsup --watch","build":"tsup","prepare":"npm run build","type-check":"tsc --noEmit","prepublishOnly":"npm run type-check && npm run build","test:react-native":"node ./scripts/test-react-native.js"},"version":"1.3.19","_npmUser":{"name":"ayush-wk","email":"ayush@webknot.in"},"homepage":"https://xnotify.app","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"_npmVersion":"11.6.2","description":"Official XNotify SDK — web push client + management API + React Native (FCM)","directories":{},"maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"aman_prakash","email":"aman.prakash@webknot.in"}],"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-native":"^0.72.8"},"peerDependencies":{"react":">=16.8.0","react-native":">=0.71.0","@react-native-firebase/messaging":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native":{"optional":true},"@react-native-firebase/messaging":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_1.3.19_1789472784186_0.5585343984182696"}}},"time":{"created":"2026-04-27T12:03:05.371Z","modified":"2026-09-15T11:46:24.508Z","1.0.0":"2026-04-27T12:03:05.618Z","1.1.0":"2026-04-30T12:21:55.297Z","1.1.1":"2026-04-30T12:50:13.679Z","1.3.0":"2026-05-05T07:01:00.261Z","1.3.1":"2026-05-05T07:22:01.238Z","1.3.2":"2026-05-05T11:13:59.585Z","1.3.3":"2026-05-05T11:20:33.356Z","1.3.4":"2026-05-05T11:22:17.038Z","1.3.5":"2026-05-07T09:09:04.247Z","1.3.6":"2026-05-27T10:18:29.270Z","1.4.0":"2026-06-05T11:46:30.543Z","1.3.7":"2026-06-09T07:44:46.943Z","1.3.8":"2026-06-18T09:57:34.385Z","1.3.9":"2026-06-19T06:53:35.959Z","1.3.10":"2026-06-19T08:22:08.815Z","1.3.11":"2026-06-30T09:42:00.963Z","1.3.12":"2026-07-02T12:32:16.589Z","1.3.13":"2026-07-29T11:20:41.444Z","1.3.14":"2026-07-31T07:05:47.882Z","1.3.15":"2026-08-03T05:43:36.680Z","1.3.16":"2026-09-02T05:54:07.089Z","1.3.17":"2026-09-04T07:12:52.855Z","1.3.18":"2026-09-10T09:49:02.578Z","1.3.19":"2026-09-15T11:46:24.270Z"},"bugs":{"url":"https://github.com/webknot-cenomi/xnotify/issues"},"author":{"name":"XNotify Team"},"license":"MIT","homepage":"https://xnotify.app","keywords":["xnotify","push-notifications","web-push","notifications","sdk","typescript","react","react-native"],"repository":{"url":"git+https://github.com/webknot-cenomi/xnotify.git","type":"git"},"description":"Official XNotify SDK — web push client + management API + React Native (FCM)","maintainers":[{"name":"ayush-wk","email":"ayush@webknot.in"},{"name":"aman_prakash","email":"aman.prakash@webknot.in"}],"readme":"# @wk-xnotify/sdk\r\n\r\n[![npm version](https://badge.fury.io/js/%40wk--xnotify%2Fsdk.svg)](https://www.npmjs.com/package/@wk-xnotify/sdk)\r\n[![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n\r\nOfficial JavaScript/TypeScript SDK for **XNotify** — an enterprise push notification platform.\r\n\r\nThis single package provides:\r\n- **`XNotifySDK`** — server-side management API (send messages, campaigns, contacts, analytics, …)\r\n- **`XNotifyWebPush`** — browser-side Web Push subscription client\r\n- **`XNotifyReactNative`** — native FCM device registration + listeners via `@wk-xnotify/sdk/react-native`\r\n- **React hooks** via the `@wk-xnotify/sdk/react` subpath\r\n\r\n---\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @wk-xnotify/sdk\r\n# or\r\nyarn add @wk-xnotify/sdk\r\n# or\r\npnpm add @wk-xnotify/sdk\r\n```\r\n\r\nReact hooks are optional — `react` is a peer dependency and can be omitted in Node.js-only environments.\r\n\r\nFor React Native, install peers in the app (optional metadata in this package): `react-native`, `@react-native-firebase/messaging`.\r\n\r\n---\r\n\r\n## Management SDK\r\n\r\n### Quickstart\r\n\r\n```typescript\r\nimport { XNotifySDK } from '@wk-xnotify/sdk';\r\n\r\nconst client = new XNotifySDK({\r\n  apiKey: process.env.XNOTIFY_API_KEY!,\r\n  // Optional: override host (defaults to the SDK built-in API URL)\r\n  // baseUrl: 'https://api.example.com/api/v1',\r\n});\r\n```\r\n\r\nOr using the factory function:\r\n\r\n```typescript\r\nimport { createXNotifyClient } from '@wk-xnotify/sdk';\r\nconst client = createXNotifyClient({ apiKey: 'xn_...' });\r\n```\r\n\r\n### Send a Message\r\n\r\n```typescript\r\nconst result = await client.sendMessage({\r\n  to: 'user@example.com',\r\n  channel: 'email',\r\n  subject: 'Welcome!',\r\n  content: 'Thanks for signing up.',\r\n});\r\n// result.data.messageId, result.data.totalSent, result.data.totalFailed\r\n```\r\n\r\nScheduled send (mapped to `/api/customer/messages` `schedule.date/time` in UTC):\r\n\r\n```typescript\r\nawait client.sendMessage({\r\n  to: 'user@example.com',\r\n  channel: 'email',\r\n  content: 'Send this later',\r\n  scheduledAt: '2026-05-14T09:30:00Z',\r\n});\r\n```\r\n\r\n### Send Bulk Messages\r\n\r\n```typescript\r\nconst result = await client.sendBulkMessages([\r\n  { to: 'alice@example.com', channel: 'email', content: 'Hi Alice!' },\r\n  { to: 'bob@example.com',   channel: 'email', content: 'Hi Bob!' },\r\n]);\r\n// result.data.messageIds — array of created message IDs\r\n```\r\n\r\nNote: `sendBulkMessages` currently uses the v1 bulk endpoint (`/api/v1/messages/bulk`). It creates message records but does not provide the same provider-send integration used by `sendMessage` on `/api/customer/messages`.\r\n\r\n### Create & Launch a Campaign\r\n\r\n```typescript\r\nconst campaign = await client.createCampaign({\r\n  name: 'Welcome Series',\r\n  type: 'immediate',\r\n  channels: ['email'],\r\n  audience: { segments: ['new-users'] },\r\n  content: { subject: 'Welcome to XNotify!', body: 'Hi {{firstName}}, welcome aboard.' },\r\n});\r\n\r\nawait client.startCampaign(campaign.data!.campaignId);\r\n```\r\n\r\n### Create a Segment (Criteria-Only)\r\n\r\n```typescript\r\nconst segment = await client.createSegment({\r\n  name: 'Android active users',\r\n  description: 'Users on Android who were recently active',\r\n  criteria: {\r\n    id: 'root',\r\n    logic: 'AND',\r\n    conditions: [\r\n      { id: 'c1', attribute: 'platform', operator: 'equals', value: 'android' },\r\n      { id: 'c2', attribute: 'last_active', operator: 'greater_than', value: '7' },\r\n    ],\r\n    groups: [],\r\n  },\r\n});\r\n\r\nawait client.createCampaign({\r\n  name: 'Android promo',\r\n  type: 'immediate',\r\n  channels: ['push'],\r\n  audience: { segments: [segment.data!.segmentId] },\r\n  content: { body: 'Special offer for Android users' },\r\n});\r\n```\r\n\r\n### Target a Single User\r\n\r\nSend a campaign to one user by matching a contact attribute (currently `email`). The server resolves the value to the matching contact and only their active device tokens receive the push.\r\n\r\n```typescript\r\nawait client.createCampaign({\r\n  name: 'Account update',\r\n  type: 'immediate',\r\n  channels: ['push'],\r\n  audience: {\r\n    targetUser: { type: 'email', value: 'john@example.com' },\r\n  },\r\n  content: { subject: 'Your account', body: 'A quick update for you.' },\r\n});\r\n```\r\n\r\nIf no contact with the given email exists in the organization, the API returns a `400` with `Target user not found for email <value>`.\r\n\r\n### Contact Management\r\n\r\n```typescript\r\n// Create\r\nconst { data } = await client.createContact({\r\n  email: 'john@example.com',\r\n  firstName: 'John',\r\n  tags: ['vip'],\r\n});\r\n\r\n// Bulk upsert (up to 1000)\r\nawait client.bulkCreateContacts([\r\n  { email: 'a@example.com', firstName: 'Alice' },\r\n  { email: 'b@example.com', firstName: 'Bob' },\r\n]);\r\n\r\n// List with search\r\nconst contacts = await client.listContacts({ search: 'john', limit: 50 });\r\n```\r\n\r\n### Bulk Profile Upload (Two Modes)\r\n\r\nThe SDK supports the customer bulk upload endpoint (`POST /api/customer/contacts/upload`) in two modes:\r\n\r\n1. **Identifier-only upload** (contact upsert + fallback identifier linking)\r\n2. **Device-token-linked upload** (explicit `deviceToken` to `device_tokens.contact_id` linkage)\r\n\r\n```typescript\r\n// 1) Identifier-only bulk upload\r\nawait client.bulkUploadProfilesByIdentifiers([\r\n  {\r\n    type: 'profile',\r\n    identity: 'user-123',\r\n    profileData: {\r\n      Name: 'Identifier User',\r\n      Email: 'identifier@example.com',\r\n    },\r\n  },\r\n], { dryRun: false });\r\n\r\n// 2) Device-token-linked bulk upload\r\nawait client.bulkUploadProfilesWithDeviceTokens([\r\n  {\r\n    type: 'profile',\r\n    identity: 'user-456',\r\n    deviceToken: 'fcm_or_apns_token_here',\r\n    profileData: {\r\n      Name: 'Token Linked User',\r\n      Email: 'token-linked@example.com',\r\n    },\r\n  },\r\n]);\r\n```\r\n\r\nBoth methods return counters:\r\n- `deviceTokenLinked`\r\n- `deviceTokenRelinked`\r\n- `deviceTokenNotFound`\r\n\r\nUse `bulkUploadContacts({ d: [...] }, { dryRun: true })` for full low-level control.\r\n\r\n### Analytics\r\n\r\n```typescript\r\nconst analytics = await client.getAnalytics({\r\n  period: '30d',\r\n  granularity: 'day',\r\n});\r\n// analytics.data.sent, .delivered, .opened, .clicked, .bounced, .timeline\r\n```\r\n\r\n---\r\n\r\n## Web Push SDK\r\n\r\nThe `XNotifyWebPush` client runs **in the browser only**. It registers a service worker, manages VAPID-based push subscriptions, and communicates with the XNotify API.\r\n\r\n### Service Worker Setup\r\n\r\nBefore using `XNotifyWebPush`, copy `sw.js` from the XNotify platform to your web app's **public root** so it is served at `https://app.example.com/sw.js`.\r\n\r\nIf using Next.js, copy it to `public/sw.js`. For Create React App, copy it to `public/sw.js`. For Vite, copy it to `public/sw.js`.\r\n\r\n```bash\r\n# Example: copy from the platform repo\r\ncp node_modules/xnotify-platform/public/sw.js public/sw.js\r\n```\r\n\r\n### Quickstart\r\n\r\n```typescript\r\nimport { XNotifyWebPush } from '@wk-xnotify/sdk';\r\n\r\nconst push = new XNotifyWebPush({\r\n  apiUrl: 'https://api.example.com',\r\n  applicationId: 'your-app-id',\r\n  apiKey: 'your-api-key',\r\n  vapidPublicKey: 'your-vapid-public-key',\r\n  userIdentifier: 'user-123', // optional — tie device to a user\r\n  debug: false,\r\n});\r\n\r\n// Initialize (registers the service worker)\r\nawait push.initialize();\r\n\r\n// Request browser permission and subscribe\r\nconst subscription = await push.requestPermission();\r\nconsole.log('Subscribed!', subscription);\r\n```\r\n\r\n### Topics\r\n\r\n```typescript\r\n// Subscribe to a topic\r\nawait push.subscribeToTopic('breaking-news');\r\n\r\n// Unsubscribe\r\nawait push.unsubscribeFromTopic('breaking-news');\r\n```\r\n\r\n### User Identity\r\n\r\n```typescript\r\n// Call after user logs in to associate the device with their account\r\nawait push.updateUserIdentifier('user-456');\r\n```\r\n\r\n### Check Status\r\n\r\n```typescript\r\nconst status = await push.getSubscriptionStatus();\r\n// { subscribed: true, permission: 'granted', subscription: PushSubscription }\r\n```\r\n\r\n### Unsubscribe\r\n\r\n```typescript\r\nawait push.unsubscribe();\r\n```\r\n\r\n---\r\n\r\n## React Native SDK (`@wk-xnotify/sdk/react-native`)\r\n\r\nNative mobile push uses **FCM (and APNs on iOS)** — not Web Push. This module **does not** replace Firebase setup in your app: keep `@react-native-firebase/messaging`, `google-services.json` / `GoogleService-Info.plist`, iOS capabilities, and Android notification channels as you have today.\r\n\r\nIt wires your FCM token to XNotify’s **`POST /api/customer/push-notifications/devices`** API and normalizes notification payloads for foreground, cold start, and tap flows.\r\n\r\n### Install\r\n\r\n```bash\r\nnpm install @wk-xnotify/sdk @react-native-firebase/messaging\r\n```\r\n\r\n### Quickstart (React Native Firebase)\r\n\r\n```typescript\r\nimport messaging from '@react-native-firebase/messaging';\r\nimport { Platform } from 'react-native';\r\nimport {\r\n  XNotifyReactNative,\r\n  createFirebaseMessagingAdapter,\r\n} from '@wk-xnotify/sdk/react-native';\r\n\r\nconst xnotify = new XNotifyReactNative({\r\n  apiUrl: 'https://api.example.com',\r\n  authToken: process.env.EXPO_PUBLIC_XNOTIFI_APP_API_KEY!, // org app API key or customer JWT\r\n  applicationId: 'uuid-of-customer_applications-row',\r\n  messaging: createFirebaseMessagingAdapter(messaging()),\r\n  debug: __DEV__,\r\n});\r\n\r\n// After login (or on app start)\r\nasync function registerPush(userId: string) {\r\n  const token = await xnotify.preparePush(); // iOS: register + permission + getToken\r\n  const platform = Platform.OS === 'ios' ? 'ios' : 'android';\r\n  const res = await xnotify.registerDevice({\r\n    platform,\r\n    userIdentifier: userId,\r\n  });\r\n  if (!res.success) console.error(res.error);\r\n}\r\n\r\n// Listeners\r\nconst unsubForeground = xnotify.onForegroundMessage((payload) => {\r\n  console.log(payload.title, payload.body, payload.data);\r\n});\r\nconst unsubOpen = xnotify.onNotificationOpenedApp((payload) => {\r\n  /* deep link: payload.deepLinkUrl */\r\n});\r\nxnotify.getInitialNotification().then((payload) => {\r\n  if (payload) { /* cold start */ }\r\n});\r\nconst unsubRefresh = xnotify.onTokenRefresh((newToken) => {\r\n  void xnotify.registerDevice({\r\n    platform: Platform.OS === 'ios' ? 'ios' : 'android',\r\n    deviceToken: newToken,\r\n    userIdentifier: userId,\r\n  });\r\n});\r\n```\r\n\r\n### iOS setup + in-app tray (`XNotifyProvider`)\r\n\r\niOS requires Firebase **iOS app registration** and APNs key upload in the tenant Firebase project (see [IOS_PUSH_VALIDATION.md](../docs/guides/IOS_PUSH_VALIDATION.md)).\r\n\r\n```tsx\r\nimport AsyncStorage from '@react-native-async-storage/async-storage';\r\nimport {\r\n  XNotifyProvider,\r\n  createAsyncStorageQueueStorage,\r\n  createBackgroundInAppMessageHandler,\r\n  setupIosPushIntegration,\r\n} from '@wk-xnotify/sdk/react-native';\r\n\r\nconst storage = createAsyncStorageQueueStorage(AsyncStorage);\r\n\r\n// index.js (before AppRegistry)\r\nmessaging().setBackgroundMessageHandler(\r\n  createBackgroundInAppMessageHandler({\r\n    storage,\r\n    applicationId: '<project-uuid>',\r\n  })\r\n);\r\n\r\n// After login\r\nawait setupIosPushIntegration(xnotify, { userIdentifier: userId });\r\n\r\nexport default function Root() {\r\n  return (\r\n    <XNotifyProvider sdk={xnotify}>\r\n      <App />\r\n    </XNotifyProvider>\r\n  );\r\n}\r\n```\r\n\r\n- **Regular push (iOS):** `preparePush()` enables foreground presentation options.\r\n- **In-app campaigns:** require `XNotifyProvider`; tray shows when app is foreground.\r\n- **Background in-app:** use `createBackgroundInAppMessageHandler`; queue drains when app opens.\r\n\r\n### First-run bootstrap flow (pending app)\r\n\r\nNew API keys can return a `customer_application_id` in `pending` state plus a one-time `bootstrap_token`.\r\n\r\n1. Initialize the SDK with `apiUrl`, `authToken`, and `applicationId`.\r\n2. Check app status:\r\n\r\n```typescript\r\nconst status = await xnotify.getApplicationStatus();\r\nif (status.data?.status === 'pending') {\r\n  // run bootstrap once\r\n}\r\n```\r\n\r\n3. Bootstrap provider credentials once:\r\n\r\n```typescript\r\nawait xnotify.bootstrapProviderCredentials({\r\n  bootstrapToken: '<one-time-token-from-dashboard>',\r\n  firebaseProjectId: 'my-firebase-project',\r\n  firebaseProjectName: 'My Firebase Project',\r\n  serviceAccount: serviceAccountJson,\r\n});\r\n```\r\n\r\n4. After status becomes `active`, call `registerDevice(...)`.\r\n\r\n`registerDevice` now returns an error when `applicationId` is not active (unless `allowPendingRegistration: true` is set for controlled testing).\r\n\r\n### Forced bootstrap (rotate/replace Firebase credentials)\r\n\r\nBy default, many client integrations skip bootstrap when status is already `active`.  \r\nIf you need to replace credentials for an active app, use an explicit force flag in your app flow:\r\n\r\n```typescript\r\nconst status = await xnotify.getApplicationStatus();\r\nconst forceBootstrap = true; // turn on only for credential rotation\r\nconst shouldBootstrap = forceBootstrap || status.data?.status === 'pending';\r\n\r\nif (shouldBootstrap) {\r\n  const result = await xnotify.bootstrapProviderCredentials({\r\n    bootstrapToken: '<fresh-one-time-bootstrap-token>',\r\n    firebaseProjectId: 'new-or-updated-project-id',\r\n    firebaseProjectName: 'New Firebase Project',\r\n    serviceAccount: serviceAccountJson,\r\n  });\r\n  if (!result.success) {\r\n    throw new Error(result.error || 'bootstrap failed');\r\n  }\r\n}\r\n```\r\n\r\nImportant:\r\n- `bootstrapToken` is one-time and short-lived.\r\n- For forced bootstrap on an already active app, request/generate a fresh bootstrap token first.\r\n- After credential replacement, reinstall/clear app data and re-register device tokens so they are minted by the expected Firebase project.\r\n\r\nImportant auth note:\r\n- Use the generated **`api_key`** value (typically starts with `xn_`) as `authToken` in SDK calls.\r\n- Do **not** use `api_secret` as bearer token for SDK/device endpoints.\r\n\r\n> Security: bootstrap token is single-use and short-lived. Do not persist raw provider credentials in local storage or logs.\r\n\r\n\r\n### Multi-app credential model\r\n\r\n`@wk-xnotify/sdk/react-native` is designed for **many customer apps**, each with its own push credentials.\r\n\r\n- Your app keeps its own Firebase/APNs setup and generates its own native push token.\r\n- XNotify stores that token against your `applicationId`.\r\n- XNotify backend sends using the credentials linked to that `applicationId` .\r\n- If your app token belongs to a different Firebase project than the server credentials, you will see sender mismatch errors.\r\n\r\n\r\n### Topic subscription\r\n\r\nFCM topic subscribe/unsubscribe via XNotify’s topic APIs currently expects dashboard permissions (`topics:manage`). **Do not** embed those calls in a mobile app with a broad API key — run topic changes from your **server** or admin tooling.\r\n\r\n### Analytics / opens\r\n\r\nWhen push `data` includes a UUID **`messageId`**, you can record opens:\r\n\r\n```typescript\r\nawait xnotify.trackNotificationEvent({\r\n  eventType: 'opened',\r\n  eventData: { messageId: payload.data.messageId },\r\n  userIdentifier: userId,\r\n});\r\n```\r\n\r\n### Troubleshooting\r\n\r\n| Issue | What to check |\r\n|--------|----------------|\r\n| SenderId mismatch | Client Firebase project must match the Firebase credentials mapped to your `applicationId` in XNotify. |\r\n| `400 Invalid … applicationId` | `applicationId` must be an active `customer_applications.id` under the same org as `authToken`. |\r\n| `403` on `unregisterDevice` | API key or user needs **`devices:manage`** permission. |\r\n| iOS no token | Call `registerDeviceForRemoteMessages()` before `getToken()` (handled by `preparePush()`). Rich images may need a **Notification Service Extension** in the host app. |\r\n\r\n\r\n\r\n---\r\n\r\n## React Hooks\r\n\r\n### `useXNotify` — Management API\r\n\r\n```tsx\r\nimport { useXNotify } from '@wk-xnotify/sdk/react';\r\n\r\nfunction NotificationButton() {\r\n  const { sendMessage, getRateLimitInfo } = useXNotify({\r\n    apiKey: process.env.NEXT_PUBLIC_XNOTIFY_API_KEY!,\r\n  });\r\n\r\n  const handleSend = async () => {\r\n    await sendMessage({\r\n      to: 'user@example.com',\r\n      channel: 'email',\r\n      content: 'Hello from React!',\r\n    });\r\n  };\r\n\r\n  const rateLimit = getRateLimitInfo();\r\n\r\n  return (\r\n    <div>\r\n      <button onClick={handleSend}>Send</button>\r\n      {rateLimit && <p>{rateLimit.remaining}/{rateLimit.limit} requests remaining</p>}\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### `useXNotifyWebPush` — Browser Push\r\n\r\n```tsx\r\nimport { useXNotifyWebPush } from '@wk-xnotify/sdk/react';\r\n\r\nfunction PushSubscribeButton() {\r\n  const { requestPermission, subscribeToTopic } = useXNotifyWebPush({\r\n    apiUrl: process.env.NEXT_PUBLIC_APP_URL!,\r\n    applicationId: process.env.NEXT_PUBLIC_APP_ID!,\r\n    apiKey: process.env.NEXT_PUBLIC_XNOTIFY_API_KEY!,\r\n    vapidPublicKey: process.env.NEXT_PUBLIC_VAPID_KEY!,\r\n  });\r\n\r\n  const handleSubscribe = async () => {\r\n    await requestPermission();\r\n    await subscribeToTopic('announcements');\r\n  };\r\n\r\n  return <button onClick={handleSubscribe}>Enable Push Notifications</button>;\r\n}\r\n```\r\n\r\n---\r\n\r\n## Error Handling\r\n\r\nThe SDK throws typed errors — catch them to handle specific failure scenarios:\r\n\r\n```typescript\r\nimport {\r\n  XNotifySDK,\r\n  AuthenticationError,\r\n  RateLimitError,\r\n  ValidationError,\r\n  NotFoundError,\r\n} from '@wk-xnotify/sdk';\r\n\r\nconst client = new XNotifySDK({ apiKey: 'xn_...' });\r\n\r\ntry {\r\n  await client.sendMessage({ to: 'user@example.com', channel: 'email', content: 'Hi' });\r\n} catch (error) {\r\n  if (error instanceof RateLimitError) {\r\n    console.log(`Rate limited. Retry after ${error.retryAfter}s`);\r\n    console.log(`Resets at: ${new Date(error.resetTime)}`);\r\n  } else if (error instanceof AuthenticationError) {\r\n    console.error('Invalid API key');\r\n  } else if (error instanceof ValidationError) {\r\n    console.error('Bad request:', error.message, error.field);\r\n  } else if (error instanceof NotFoundError) {\r\n    console.error('Resource not found');\r\n  } else {\r\n    throw error; // re-throw unexpected errors\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## API Reference\r\n\r\n### `XNotifySDK` methods\r\n\r\n| Method | Description |\r\n|--------|-------------|\r\n| `healthCheck()` | Check API health |\r\n| `validateApiKey()` | Validate current API key |\r\n| `getAccountInfo()` | Get account + organization info |\r\n| `getUsage(period?)` | Get message usage stats |\r\n| `sendMessage(msg)` | Send via `/api/customer/messages` using Bearer API key (provider-integrated path) |\r\n| `sendBulkMessages(msgs)` | Send up to 500 messages through v1 bulk endpoint (record-creation path) |\r\n| `getMessage(id)` | Get message by ID |\r\n| `getMessageStatus(id)` | Get message delivery status |\r\n| `getMessageHistory(params?)` | List messages with filters |\r\n| `createCampaign(campaign)` | Create a campaign |\r\n| `getCampaign(id)` | Get campaign by ID |\r\n| `updateCampaign(id, updates)` | Update campaign fields |\r\n| `deleteCampaign(id)` | Archive a campaign |\r\n| `listCampaigns(params?)` | List campaigns |\r\n| `startCampaign(id)` | Start a draft/paused campaign |\r\n| `pauseCampaign(id)` | Pause a running campaign |\r\n| `getCampaignAnalytics(id)` | Get campaign delivery stats |\r\n| `createContact(contact)` | Create a contact |\r\n| `getContact(id)` | Get contact by ID |\r\n| `updateContact(id, updates)` | Update contact fields |\r\n| `deleteContact(id)` | Soft-delete (unsubscribe) contact |\r\n| `listContacts(params?)` | List contacts with search/tag filter |\r\n| `bulkCreateContacts(contacts)` | Upsert up to 1000 contacts |\r\n| `bulkUploadContacts(payload, options?)` | Call customer bulk upload endpoint (`/api/customer/contacts/upload`) |\r\n| `bulkUploadProfilesByIdentifiers(records, options?)` | Identifier-based bulk profile upload |\r\n| `bulkUploadProfilesWithDeviceTokens(records, options?)` | Bulk upload with required `deviceToken` per record |\r\n| `createWebhook(webhook)` | Register a webhook endpoint |\r\n| `getWebhook(id)` | Get webhook by ID |\r\n| `updateWebhook(id, updates)` | Update webhook config |\r\n| `deleteWebhook(id)` | Delete a webhook |\r\n| `listWebhooks()` | List all webhooks |\r\n| `testWebhook(id)` | Send a test event to a webhook |\r\n| `getAnalytics(params?)` | Get delivery + engagement analytics |\r\n| `createSegment(segment)` | Create an audience segment |\r\n| `getSegment(id)` | Get segment by ID |\r\n| `updateSegment(id, updates)` | Update segment |\r\n| `deleteSegment(id)` | Deactivate a segment |\r\n| `listSegments()` | List active segments |\r\n| `getRateLimitInfo()` | Get current rate limit status |\r\n\r\n### `XNotifyWebPush` methods\r\n\r\n| Method | Description |\r\n|--------|-------------|\r\n| `initialize()` | Register service worker, store config |\r\n| `isPushSupported()` | Check browser support |\r\n| `requestPermission()` | Prompt for permission + subscribe |\r\n| `subscribeToPush()` | Subscribe (permission already granted) |\r\n| `unsubscribe()` | Unsubscribe + deregister device |\r\n| `subscribeToTopic(name)` | Subscribe device to a topic |\r\n| `unsubscribeFromTopic(name)` | Unsubscribe device from a topic |\r\n| `updateUserIdentifier(id)` | Associate device with a user |\r\n| `getSubscriptionStatus()` | Get current permission + subscription |\r\n\r\n### `XNotifyReactNative` (import from `@wk-xnotify/sdk/react-native`)\r\n\r\n| Method / export | Description |\r\n|--------|-------------|\r\n| `createFirebaseMessagingAdapter(messaging)` | Wraps `messaging()` from `@react-native-firebase/messaging` |\r\n| `normalizeRemoteMessage(msg)` | Maps FCM remote message → `XNotifyPushPayload` |\r\n| `preparePush()` | iOS remote registration + permission + FCM token |\r\n| `getDeviceToken()` | Returns normalized FCM token |\r\n| `registerDevice(opts)` | `POST …/push-notifications/devices` |\r\n| `unregisterDevice(token)` | `DELETE …/push-notifications/devices` (requires `devices:manage`) |\r\n| `onForegroundMessage(cb)` | Foreground FCM messages |\r\n| `onNotificationOpenedApp(cb)` | User opened app from notification |\r\n| `getInitialNotification()` | Cold-start notification |\r\n| `onTokenRefresh(cb)` | FCM token rotation |\r\n| `trackNotificationEvent({ eventType, eventData })` | `POST …/analytics/events` (needs `messageId` in `eventData`) |\r\n| `getApplicationStatus()` | `GET /api/v1/bootstrap/mobile-provider` status check |\r\n| `bootstrapProviderCredentials(input)` | `POST /api/v1/bootstrap/mobile-provider` one-time credential bootstrap |\r\n| `getNotifications(userIdentifier, filters?)` | `GET /api/v1/users/{userIdentifier}/notifications` (sectioned mobile history; in-app and push by default; same-campaign pairs return `channel: \"both\"`) |\r\n| `getNotificationSummary(userIdentifier, filters?)` | `GET /api/v1/users/{userIdentifier}/notifications/summary` |\r\n| `getUnreadCount(userIdentifier, filters?)` | `GET /api/v1/users/{userIdentifier}/notifications/unread-count` |\r\n| `markNotificationRead(userIdentifier, notificationId)` | `PATCH /api/v1/users/{userIdentifier}/notifications/{id}` |\r\n| `archiveNotification(userIdentifier, notificationId)` | `PATCH /api/v1/users/{userIdentifier}/notifications/{id}` |\r\n| `markNotificationsRead(userIdentifier, notificationIds)` | `POST /api/v1/users/{userIdentifier}/notifications/mark-read` |\r\n| `markAllNotificationsRead(userIdentifier, filters?)` | `POST /api/v1/users/{userIdentifier}/notifications/mark-all-read` |\r\n| `XNotifyProvider` | React component for in-app tray UI (required for in-app campaigns) |\r\n| `setupIosPushIntegration(sdk, input?)` | `preparePush` + `registerDevice` helper |\r\n| `createBackgroundInAppMessageHandler(...)` | Queue in-app payloads for display after background delivery |\r\n| `createAsyncStorageQueueStorage(asyncStorage)` | Persistent queue storage helper |\r\n\r\n### Inbox history (in-app + push)\r\n\r\nThe mobile inbox API returns **both** in-app and push history by default. When an in-app row and a push row share the same `campaignId` / `campaign_id` in `customData`, they appear as **one** item with `channel: \"both\"`. Different campaigns (or notifications without a campaign id) stay as separate rows.\r\n\r\n#### List history (SDK)\r\n\r\n```typescript\r\nimport { XNotifyReactNative, createFirebaseMessagingAdapter } from '@wk-xnotify/sdk/react-native';\r\nimport type { NotificationHistoryFilters, NotificationHistoryResponse } from '@wk-xnotify/sdk';\r\nimport messaging from '@react-native-firebase/messaging';\r\n\r\nconst client = new XNotifyReactNative({\r\n  apiKey: 'YOUR_ORG_API_KEY',\r\n  apiUrl: 'https://api.example.com',\r\n  applicationId: 'YOUR_APPLICATION_UUID',\r\n  messaging: createFirebaseMessagingAdapter(messaging()),\r\n});\r\n\r\nconst filters: NotificationHistoryFilters = {\r\n  page: params.page ?? 1,\r\n  limit: params.limit ?? 20,\r\n  timezone: params.timezone ?? 'Asia/Riyadh',\r\n  view: params.view ?? 'sectioned',\r\n  status: params.status ?? 'all',\r\n};\r\n\r\nconst response: NotificationHistoryResponse = await client.getNotifications(\r\n  userIdentifier,\r\n  filters,\r\n);\r\n\r\nfor (const section of response.data?.sections ?? []) {\r\n  for (const item of section.data) {\r\n    // item.channel is 'in_app' | 'push' | 'both'\r\n    console.log(item.channel, item.titleEn, item.isRead);\r\n  }\r\n}\r\n\r\n// Optional: filter by delivery channel\r\nawait client.getNotifications(userIdentifier, { ...filters, channel: 'push' });\r\nawait client.getNotifications(userIdentifier, { ...filters, channel: 'in_app' });\r\nawait client.getNotifications(userIdentifier, { ...filters, channel: 'both' });\r\n\r\nconst unread = await client.getUnreadCount(userIdentifier);\r\nconst badgeCount = unread.data?.unread ?? 0; // same-campaign pairs count as 1\r\n\r\nawait client.markNotificationRead(userIdentifier, 'NOTIFICATION_ID');\r\nawait client.markAllNotificationsRead(userIdentifier);\r\n```\r\n\r\nManagement SDK (`XNotifySDK`) uses the same filters via `getUserNotifications` / `getUnreadCount` / `markNotificationRead`.\r\n\r\n#### Create + send (HTTP API)\r\n\r\nStore one inbox row and optionally dispatch FCM. Default `channels` is `[\"in_app\",\"push\"]` (one row, one visible OS push when tokens exist).\r\n\r\n```bash\r\n# Both in-app history and visible push\r\ncurl -X POST -H \"x-api-key: YOUR_ORG_API_KEY\" -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"title\": \"Shopping voucher unlocked\",\r\n    \"message\": \"You unlocked a SAR 50 voucher.\",\r\n    \"channels\": [\"in_app\", \"push\"],\r\n    \"category\": \"transactional\",\r\n    \"actionUrl\": \"app://rewards\",\r\n    \"customData\": {\r\n      \"titleAr\": \"تم فتح قسيمة تسوق\",\r\n      \"messageAr\": \"لقد فتحت قسيمة بقيمة 50 ريال.\",\r\n      \"deepLink\": \"app://rewards\"\r\n    }\r\n  }' \\\r\n  \"https://api.example.com/api/v1/users/tenant-user-id/notifications\"\r\n\r\n# In-app only (data-only FCM when devices exist)\r\ncurl -X POST -H \"x-api-key: YOUR_ORG_API_KEY\" -H \"Content-Type: application/json\" \\\r\n  -d '{\"title\":\"In app\",\"message\":\"Silent tray update\",\"channels\":[\"in_app\"]}' \\\r\n  \"https://api.example.com/api/v1/users/tenant-user-id/notifications\"\r\n\r\n# Push only (visible OS notification + inbox row)\r\ncurl -X POST -H \"x-api-key: YOUR_ORG_API_KEY\" -H \"Content-Type: application/json\" \\\r\n  -d '{\"title\":\"Alert\",\"message\":\"Check your account\",\"channels\":[\"push\"]}' \\\r\n  \"https://api.example.com/api/v1/users/tenant-user-id/notifications\"\r\n```\r\n\r\nExample `201` response:\r\n\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"data\": {\r\n    \"notificationId\": \"…\",\r\n    \"channels\": [\"in_app\", \"push\"],\r\n    \"inboxStored\": true,\r\n    \"push\": { \"attempted\": true, \"sentCount\": 1, \"failedCount\": 0 }\r\n  }\r\n}\r\n```\r\n\r\nNo active device tokens still returns `201` with `inboxStored: true` and `push.sentCount: 0`.\r\n\r\n#### List history (HTTP)\r\n\r\n```bash\r\n# All channels, sectioned (mobile default)\r\ncurl -H \"x-api-key: YOUR_ORG_API_KEY\" \\\r\n  \"https://api.example.com/api/v1/users/tenant-user-id/notifications?page=1&limit=20&timezone=Asia/Riyadh\"\r\n\r\n# Filter by channel\r\ncurl -H \"x-api-key: YOUR_ORG_API_KEY\" \\\r\n  \"https://api.example.com/api/v1/users/tenant-user-id/notifications?channel=both\"\r\n\r\ncurl -H \"x-api-key: YOUR_ORG_API_KEY\" \\\r\n  \"https://api.example.com/api/v1/users/tenant-user-id/notifications/unread-count\"\r\n```\r\n\r\nApply DB migration before using `channel` / `content_fingerprint` in production:\r\n\r\n```bash\r\nnpm run db:migrate:notification-channel\r\n```\r\n\r\n---\r\n\r\n## Configuration\r\n\r\n### `XNotifySDK` options\r\n\r\n```typescript\r\ninterface XNotifyConfig {\r\n  apiKey: string;                                       // Required\r\n  baseUrl?: string;                                      // Override API base URL\r\n  timeout?: number;                                      // ms, default: 30000\r\n  retryAttempts?: number;                                // Default: 3\r\n  debug?: boolean;                                       // Default: false\r\n}\r\n```\r\n\r\nPoint the SDK at your XNotifi host with `baseUrl`:\r\n\r\n```typescript\r\nconst client = new XNotifySDK({\r\n  apiKey: process.env.XNOTIFY_API_KEY!,\r\n  baseUrl: 'https://api.example.com/api/v1',\r\n});\r\n```\r\n\r\n### Environment variables (recommended)\r\n\r\n```env\r\nXNOTIFY_API_KEY=xn_live_...\r\n\r\n# For web push (client-side, safe to expose)\r\nNEXT_PUBLIC_XNOTIFY_API_KEY=xn_pub_...\r\nNEXT_PUBLIC_APP_ID=app_...\r\nNEXT_PUBLIC_VAPID_KEY=BxxxxxxX...\r\nNEXT_PUBLIC_APP_URL=https://app.example.com\r\n```\r\n\r\n---\r\n\r\n## Backward Compatibility\r\n\r\nIf you were previously using `XNotifiSDK` or `XNotifiWebPush` (with an 'i'), all previous names continue to work:\r\n\r\n```typescript\r\nimport { XNotifiSDK, XNotifiWebPush } from '@wk-xnotify/sdk';\r\nimport { useXNotifi, useXNotifiWebPush } from '@wk-xnotify/sdk/react';\r\n// These are identical to XNotifySDK, XNotifyWebPush, useXNotify, useXNotifyWebPush\r\n```\r\n\r\n## Segment Criteria Migration\r\n\r\n`createSegment` and `updateSegment` are now `criteria`-only. Legacy `filters` payloads are no longer accepted by v1 segment APIs.\r\n\r\nCommon migration shape:\r\n\r\n```typescript\r\n// Before (removed)\r\n{ filters: { platform: 'android', last_active_days_gt: 7 } }\r\n\r\n// After\r\n{\r\n  criteria: {\r\n    id: 'root',\r\n    logic: 'AND',\r\n    conditions: [\r\n      { id: '1', attribute: 'platform', operator: 'equals', value: 'android' },\r\n      { id: '2', attribute: 'last_active', operator: 'greater_than', value: '7' },\r\n    ],\r\n    groups: [],\r\n  },\r\n}\r\n```\r\n\r\n---\r\n\r\n## License\r\n\r\nMIT © XNotify Team\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","readmeFilename":"README.md"}