{"_id":"@elghaied/payload-plugin-sms","_rev":"5-336619ea7088b6a0560b6b4e50c18be5","name":"@elghaied/payload-plugin-sms","dist-tags":{"latest":"0.5.0"},"versions":{"0.3.0":{"name":"@elghaied/payload-plugin-sms","version":"0.3.0","keywords":["payload","payload-plugin","payloadcms","sms","mms","twilio","telnyx","plivo","vonage","aws-sns","messaging"],"license":"MIT","_id":"@elghaied/payload-plugin-sms@0.3.0","maintainers":[{"name":"elghaied","email":"elghaied.eslam@gmail.com"}],"homepage":"https://github.com/elghaied/payload-plugin-sms#readme","bugs":{"url":"https://github.com/elghaied/payload-plugin-sms/issues"},"dist":{"shasum":"1de9bb323b55e516e1a8d1140a3380c62d2a5635","tarball":"https://registry.npmjs.org/@elghaied/payload-plugin-sms/-/payload-plugin-sms-0.3.0.tgz","fileCount":166,"integrity":"sha512-Km9RCjnayofN5Nu8j/MPg+wAA+NKac6VkslAXzDi1b+taeDwoOJBbmoLhQY4cY82Q49qbcUaAGgUQ13SX/puXA==","signatures":[{"sig":"MEYCIQCtguXkDX1Cij5YqjC2ihrh0jS0+gVJCm7FIRJk8cTSlAIhAPBk1PbMOjbx3koVr2WWx0JECZHDHdC7hC+UwaNe7KWN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@elghaied%2fpayload-plugin-sms@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":503918},"main":"./dist/index.js","type":"module","_from":"file:elghaied-payload-plugin-sms-0.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./mock":{"types":"./dist/adapters/mock/index.d.ts","import":"./dist/adapters/mock/index.js","default":"./dist/adapters/mock/index.js"},"./plivo":{"types":"./dist/adapters/plivo/index.d.ts","import":"./dist/adapters/plivo/index.js","default":"./dist/adapters/plivo/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./telnyx":{"types":"./dist/adapters/telnyx/index.d.ts","import":"./dist/adapters/telnyx/index.js","default":"./dist/adapters/telnyx/index.js"},"./twilio":{"types":"./dist/adapters/twilio/index.d.ts","import":"./dist/adapters/twilio/index.js","default":"./dist/adapters/twilio/index.js"},"./vonage":{"types":"./dist/adapters/vonage/index.d.ts","import":"./dist/adapters/vonage/index.js","default":"./dist/adapters/vonage/index.js"},"./aws-sns":{"types":"./dist/adapters/aws-sns/index.d.ts","import":"./dist/adapters/aws-sns/index.js","default":"./dist/adapters/aws-sns/index.js"}},"scripts":{"dev":"next dev dev --turbo","lint":"eslint","test":"pnpm test:int","build":"pnpm copyfiles && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","lint:fix":"eslint --fix","test:int":"vitest run","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","build:types":"tsc --outDir dist --rootDir ./src","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","generate:types":"pnpm dev:generate-types","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"elghaied","email":"elghaied.eslam@gmail.com"},"_resolved":"/tmp/6f774edc5b3430bd4daa8fc1b4470f5d/elghaied-payload-plugin-sms-0.3.0.tgz","_integrity":"sha512-Km9RCjnayofN5Nu8j/MPg+wAA+NKac6VkslAXzDi1b+taeDwoOJBbmoLhQY4cY82Q49qbcUaAGgUQ13SX/puXA==","repository":{"url":"git+https://github.com/elghaied/payload-plugin-sms.git","type":"git"},"_npmVersion":"11.15.0","description":"Multi-provider SMS plugin for Payload CMS 3.x with Twilio, Telnyx, Plivo, Vonage, and AWS SNS adapters.","directories":{},"_nodeVersion":"20.20.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.6","open":"^10.1.0","plivo":"^4.65.0","react":"19.2.6","sharp":"0.34.2","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","telnyx":"^6.68.0","twilio":"^5.3.0","vitest":"4.0.18","graphql":"^16.8.1","payload":"3.84.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.6","typescript":"5.7.3","@types/node":"22.19.9","@types/react":"19.2.14","@payloadcms/ui":"3.84.1","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.84.1","@types/react-dom":"19.2.3","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","@vonage/server-sdk":"^3.20.0","eslint-config-next":"16.2.6","@aws-sdk/client-sns":"^3.658.0","vite-tsconfig-paths":"6.0.5","@payloadcms/db-sqlite":"3.84.1","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.84.1","@payloadcms/db-postgres":"3.84.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/richtext-lexical":"3.84.1"},"peerDependencies":{"plivo":"^4.0.0","react":"^19.0.0","telnyx":"^6.0.0","twilio":"^5.0.0","payload":"^3.0.0","react-dom":"^19.0.0","@vonage/server-sdk":"^3.0.0","@aws-sdk/client-sns":"^3.0.0"},"peerDependenciesMeta":{"plivo":{"optional":true},"react":{"optional":true},"telnyx":{"optional":true},"twilio":{"optional":true},"react-dom":{"optional":true},"@vonage/server-sdk":{"optional":true},"@aws-sdk/client-sns":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-sms_0.3.0_1779842510338_0.719095363082199","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@elghaied/payload-plugin-sms","version":"0.4.0","keywords":["payload","payload-plugin","payloadcms","sms","mms","twilio","telnyx","plivo","vonage","aws-sns","messaging"],"license":"MIT","_id":"@elghaied/payload-plugin-sms@0.4.0","maintainers":[{"name":"elghaied","email":"elghaied.eslam@gmail.com"}],"homepage":"https://github.com/elghaied/payload-plugin-sms#readme","bugs":{"url":"https://github.com/elghaied/payload-plugin-sms/issues"},"dist":{"shasum":"3504427cc41efacd099d22fc29db2861fef5c185","tarball":"https://registry.npmjs.org/@elghaied/payload-plugin-sms/-/payload-plugin-sms-0.4.0.tgz","fileCount":184,"integrity":"sha512-Cvdjbxb1T0EHIQMuExDgVn6rzmUQyHIV171BfZYlYoiysnRDH5DatlqgmMD/R5LkL2qlE3hQ4M8oG0Szj8j/pQ==","signatures":[{"sig":"MEQCIEp6/sUhBhNuzbFQGZi8hJ2DDmwWoyh74qsUMDU+oJdTAiAJnubS9rqRz55x13+OEirG/kyxbLm3AuAUFqJmmzibXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@elghaied%2fpayload-plugin-sms@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":550261},"main":"./src/index.ts","pnpm":{"onlyBuiltDependencies":["sharp","esbuild","unrs-resolver"]},"type":"module","types":"./src/index.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./src/index.ts","import":"./src/index.ts","default":"./src/index.ts"},"./rsc":{"types":"./src/exports/rsc.ts","import":"./src/exports/rsc.ts","default":"./src/exports/rsc.ts"},"./mock":{"types":"./src/adapters/mock/index.ts","import":"./src/adapters/mock/index.ts","default":"./src/adapters/mock/index.ts"},"./plivo":{"types":"./src/adapters/plivo/index.ts","import":"./src/adapters/plivo/index.ts","default":"./src/adapters/plivo/index.ts"},"./router":{"types":"./src/router/index.ts","import":"./src/router/index.ts","default":"./src/router/index.ts"},"./telnyx":{"types":"./src/adapters/telnyx/index.ts","import":"./src/adapters/telnyx/index.ts","default":"./src/adapters/telnyx/index.ts"},"./twilio":{"types":"./src/adapters/twilio/index.ts","import":"./src/adapters/twilio/index.ts","default":"./src/adapters/twilio/index.ts"},"./vonage":{"types":"./src/adapters/vonage/index.ts","import":"./src/adapters/vonage/index.ts","default":"./src/adapters/vonage/index.ts"},"./aws-sns":{"types":"./src/adapters/aws-sns/index.ts","import":"./src/adapters/aws-sns/index.ts","default":"./src/adapters/aws-sns/index.ts"},"./translations":{"types":"./src/translations/index.ts","import":"./src/translations/index.ts","default":"./src/translations/index.ts"}},"gitHead":"a44fed1b6062a5ec353dbc155eb7f197adafdbe9","scripts":{"dev":"next dev dev --turbo","lint":"eslint","test":"pnpm test:int","build":"pnpm copyfiles && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","lint:fix":"eslint --fix","test:int":"vitest run","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","build:types":"tsc --outDir dist --rootDir ./src","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","generate:types":"pnpm dev:generate-types","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d1ccb40-c7b0-469e-9553-83d63818fecf"}},"repository":{"url":"git+https://github.com/elghaied/payload-plugin-sms.git","type":"git"},"_npmVersion":"11.16.0","description":"Multi-provider SMS plugin for Payload CMS 3.x with Twilio, Telnyx, Plivo, Vonage, and AWS SNS adapters.","directories":{},"_nodeVersion":"20.20.2","dependencies":{},"publishConfig":{"main":"./dist/index.js","types":"./dist/index.d.ts","access":"public","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./mock":{"types":"./dist/adapters/mock/index.d.ts","import":"./dist/adapters/mock/index.js","default":"./dist/adapters/mock/index.js"},"./plivo":{"types":"./dist/adapters/plivo/index.d.ts","import":"./dist/adapters/plivo/index.js","default":"./dist/adapters/plivo/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./telnyx":{"types":"./dist/adapters/telnyx/index.d.ts","import":"./dist/adapters/telnyx/index.js","default":"./dist/adapters/telnyx/index.js"},"./twilio":{"types":"./dist/adapters/twilio/index.d.ts","import":"./dist/adapters/twilio/index.js","default":"./dist/adapters/twilio/index.js"},"./vonage":{"types":"./dist/adapters/vonage/index.d.ts","import":"./dist/adapters/vonage/index.js","default":"./dist/adapters/vonage/index.js"},"./aws-sns":{"types":"./dist/adapters/aws-sns/index.d.ts","import":"./dist/adapters/aws-sns/index.js","default":"./dist/adapters/aws-sns/index.js"},"./translations":{"types":"./dist/translations/index.d.ts","import":"./dist/translations/index.js","default":"./dist/translations/index.js"}}},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.6","open":"^10.1.0","plivo":"^4.65.0","react":"19.2.6","sharp":"0.34.2","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","telnyx":"^6.68.0","twilio":"^5.3.0","vitest":"4.0.18","graphql":"^16.8.1","payload":"3.84.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.6","typescript":"5.7.3","@types/node":"22.19.9","@types/react":"19.2.14","@payloadcms/ui":"3.84.1","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.84.1","@types/react-dom":"19.2.3","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","@vonage/server-sdk":"^3.20.0","eslint-config-next":"16.2.6","@aws-sdk/client-sns":"^3.658.0","vite-tsconfig-paths":"6.0.5","@payloadcms/db-sqlite":"3.84.1","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.84.1","@payloadcms/db-postgres":"3.84.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/richtext-lexical":"3.84.1"},"peerDependencies":{"plivo":"^4.0.0","react":"^19.0.0","telnyx":"^6.0.0","twilio":"^5.0.0","payload":"^3.0.0","react-dom":"^19.0.0","@vonage/server-sdk":"^3.0.0","@aws-sdk/client-sns":"^3.0.0"},"peerDependenciesMeta":{"plivo":{"optional":true},"react":{"optional":true},"telnyx":{"optional":true},"twilio":{"optional":true},"react-dom":{"optional":true},"@vonage/server-sdk":{"optional":true},"@aws-sdk/client-sns":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-sms_0.4.0_1780458907609_0.7663611875229912","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@elghaied/payload-plugin-sms","version":"0.4.1","keywords":["payload","payload-plugin","payloadcms","sms","mms","twilio","telnyx","plivo","vonage","aws-sns","messaging"],"license":"MIT","_id":"@elghaied/payload-plugin-sms@0.4.1","maintainers":[{"name":"elghaied","email":"elghaied.eslam@gmail.com"}],"homepage":"https://github.com/elghaied/payload-plugin-sms#readme","bugs":{"url":"https://github.com/elghaied/payload-plugin-sms/issues"},"dist":{"shasum":"d28735a15819ecf89bdf7bd6042649455e43bf9b","tarball":"https://registry.npmjs.org/@elghaied/payload-plugin-sms/-/payload-plugin-sms-0.4.1.tgz","fileCount":184,"integrity":"sha512-Ec1pU3LeAZk9lC7fJ/W0mtKkI4DCRSGkEOo0QlDGxeHX8JJBkpL0BBkhBVaiYqjUozhuKRaMbmA8EikJcL6Lfg==","signatures":[{"sig":"MEUCIQDpmUbBUsl6SlN5h2Rv/0w9/ng71Czb0qxBpC6UyMfYtAIgZ7b5vczbhwffpnFFaeMeSRRt5EaMDU1lWOfcjeijYUA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@elghaied%2fpayload-plugin-sms@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":550473},"main":"./src/index.ts","pnpm":{"onlyBuiltDependencies":["sharp","esbuild","unrs-resolver"]},"type":"module","types":"./src/index.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./src/index.ts","import":"./src/index.ts","default":"./src/index.ts"},"./rsc":{"types":"./src/exports/rsc.ts","import":"./src/exports/rsc.ts","default":"./src/exports/rsc.ts"},"./mock":{"types":"./src/adapters/mock/index.ts","import":"./src/adapters/mock/index.ts","default":"./src/adapters/mock/index.ts"},"./plivo":{"types":"./src/adapters/plivo/index.ts","import":"./src/adapters/plivo/index.ts","default":"./src/adapters/plivo/index.ts"},"./router":{"types":"./src/router/index.ts","import":"./src/router/index.ts","default":"./src/router/index.ts"},"./telnyx":{"types":"./src/adapters/telnyx/index.ts","import":"./src/adapters/telnyx/index.ts","default":"./src/adapters/telnyx/index.ts"},"./twilio":{"types":"./src/adapters/twilio/index.ts","import":"./src/adapters/twilio/index.ts","default":"./src/adapters/twilio/index.ts"},"./vonage":{"types":"./src/adapters/vonage/index.ts","import":"./src/adapters/vonage/index.ts","default":"./src/adapters/vonage/index.ts"},"./aws-sns":{"types":"./src/adapters/aws-sns/index.ts","import":"./src/adapters/aws-sns/index.ts","default":"./src/adapters/aws-sns/index.ts"},"./translations":{"types":"./src/translations/index.ts","import":"./src/translations/index.ts","default":"./src/translations/index.ts"}},"gitHead":"183186a253ec98a9e17253b438092db278b57325","scripts":{"dev":"next dev dev --turbo","lint":"eslint","test":"pnpm test:int","build":"pnpm copyfiles && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","prepack":"node scripts/prepack.mjs","lint:fix":"eslint --fix","postpack":"node scripts/postpack.mjs","test:int":"vitest run","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","build:types":"tsc --outDir dist --rootDir ./src","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","generate:types":"pnpm dev:generate-types","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d1ccb40-c7b0-469e-9553-83d63818fecf"}},"repository":{"url":"git+https://github.com/elghaied/payload-plugin-sms.git","type":"git"},"_npmVersion":"11.16.0","description":"Multi-provider SMS plugin for Payload CMS 3.x with Twilio, Telnyx, Plivo, Vonage, and AWS SNS adapters.","directories":{},"_nodeVersion":"20.20.2","dependencies":{},"publishConfig":{"main":"./dist/index.js","types":"./dist/index.d.ts","access":"public","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./mock":{"types":"./dist/adapters/mock/index.d.ts","import":"./dist/adapters/mock/index.js","default":"./dist/adapters/mock/index.js"},"./plivo":{"types":"./dist/adapters/plivo/index.d.ts","import":"./dist/adapters/plivo/index.js","default":"./dist/adapters/plivo/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./telnyx":{"types":"./dist/adapters/telnyx/index.d.ts","import":"./dist/adapters/telnyx/index.js","default":"./dist/adapters/telnyx/index.js"},"./twilio":{"types":"./dist/adapters/twilio/index.d.ts","import":"./dist/adapters/twilio/index.js","default":"./dist/adapters/twilio/index.js"},"./vonage":{"types":"./dist/adapters/vonage/index.d.ts","import":"./dist/adapters/vonage/index.js","default":"./dist/adapters/vonage/index.js"},"./aws-sns":{"types":"./dist/adapters/aws-sns/index.d.ts","import":"./dist/adapters/aws-sns/index.js","default":"./dist/adapters/aws-sns/index.js"},"./translations":{"types":"./dist/translations/index.d.ts","import":"./dist/translations/index.js","default":"./dist/translations/index.js"}}},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.6","open":"^10.1.0","plivo":"^4.65.0","react":"19.2.6","sharp":"0.34.2","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","telnyx":"^6.68.0","twilio":"^5.3.0","vitest":"4.0.18","graphql":"^16.8.1","payload":"3.84.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.6","typescript":"5.7.3","@types/node":"22.19.9","@types/react":"19.2.14","@payloadcms/ui":"3.84.1","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.84.1","@types/react-dom":"19.2.3","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","@vonage/server-sdk":"^3.20.0","eslint-config-next":"16.2.6","@aws-sdk/client-sns":"^3.658.0","vite-tsconfig-paths":"6.0.5","@payloadcms/db-sqlite":"3.84.1","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.84.1","@payloadcms/db-postgres":"3.84.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/richtext-lexical":"3.84.1"},"peerDependencies":{"plivo":"^4.0.0","react":"^19.0.0","telnyx":"^6.0.0","twilio":"^5.0.0","payload":"^3.0.0","react-dom":"^19.0.0","@vonage/server-sdk":"^3.0.0","@aws-sdk/client-sns":"^3.0.0"},"peerDependenciesMeta":{"plivo":{"optional":true},"react":{"optional":true},"telnyx":{"optional":true},"twilio":{"optional":true},"react-dom":{"optional":true},"@vonage/server-sdk":{"optional":true},"@aws-sdk/client-sns":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-sms_0.4.1_1780460006775_0.23536772935750339","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@elghaied/payload-plugin-sms","version":"0.4.2","keywords":["payload","payload-plugin","payloadcms","sms","mms","twilio","telnyx","plivo","vonage","aws-sns","messaging"],"license":"MIT","_id":"@elghaied/payload-plugin-sms@0.4.2","maintainers":[{"name":"elghaied","email":"elghaied.eslam@gmail.com"}],"homepage":"https://github.com/elghaied/payload-plugin-sms#readme","bugs":{"url":"https://github.com/elghaied/payload-plugin-sms/issues"},"dist":{"shasum":"24413f306d1b6a32bc9f9aebf77548a04b220c4e","tarball":"https://registry.npmjs.org/@elghaied/payload-plugin-sms/-/payload-plugin-sms-0.4.2.tgz","fileCount":184,"integrity":"sha512-xHhFP1/BRHRE743cNEd1v/JIw9xxra6aYRpkTe+ci1RcRtBqA/VLniJ2CwGVOd/ZRM2VImMabUhhgmcnbaf3bA==","signatures":[{"sig":"MEUCIGNZrxGsN45PFoz2HPvPVtRLETXMYGdvTlb1V8lLyB7yAiEA/QfuVVKqu+Brx6QZM0XkiS7+ERhLRFDpS53CD7fRZfw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@elghaied%2fpayload-plugin-sms@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":548424},"main":"./dist/index.js","type":"module","_from":"file:elghaied-payload-plugin-sms-0.4.2.tgz","types":"./dist/index.d.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./mock":{"types":"./dist/adapters/mock/index.d.ts","import":"./dist/adapters/mock/index.js","default":"./dist/adapters/mock/index.js"},"./plivo":{"types":"./dist/adapters/plivo/index.d.ts","import":"./dist/adapters/plivo/index.js","default":"./dist/adapters/plivo/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js","default":"./dist/router/index.js"},"./telnyx":{"types":"./dist/adapters/telnyx/index.d.ts","import":"./dist/adapters/telnyx/index.js","default":"./dist/adapters/telnyx/index.js"},"./twilio":{"types":"./dist/adapters/twilio/index.d.ts","import":"./dist/adapters/twilio/index.js","default":"./dist/adapters/twilio/index.js"},"./vonage":{"types":"./dist/adapters/vonage/index.d.ts","import":"./dist/adapters/vonage/index.js","default":"./dist/adapters/vonage/index.js"},"./aws-sns":{"types":"./dist/adapters/aws-sns/index.d.ts","import":"./dist/adapters/aws-sns/index.js","default":"./dist/adapters/aws-sns/index.js"},"./translations":{"types":"./dist/translations/index.d.ts","import":"./dist/translations/index.js","default":"./dist/translations/index.js"}},"scripts":{"dev":"next dev dev --turbo","lint":"eslint","test":"pnpm test:int","build":"pnpm copyfiles && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","lint:fix":"eslint --fix","test:int":"vitest run","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","build:types":"tsc --outDir dist --rootDir ./src","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","generate:types":"pnpm dev:generate-types","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d1ccb40-c7b0-469e-9553-83d63818fecf"}},"_resolved":"/tmp/e7b7961fa42e9c008adee8edab06f7f8/elghaied-payload-plugin-sms-0.4.2.tgz","_integrity":"sha512-xHhFP1/BRHRE743cNEd1v/JIw9xxra6aYRpkTe+ci1RcRtBqA/VLniJ2CwGVOd/ZRM2VImMabUhhgmcnbaf3bA==","repository":{"url":"git+https://github.com/elghaied/payload-plugin-sms.git","type":"git"},"_npmVersion":"11.16.0","description":"Multi-provider SMS plugin for Payload CMS 3.x with Twilio, Telnyx, Plivo, Vonage, and AWS SNS adapters.","directories":{},"_nodeVersion":"20.20.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.6","open":"^10.1.0","plivo":"^4.65.0","react":"19.2.6","sharp":"0.34.2","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","telnyx":"^6.68.0","twilio":"^5.3.0","vitest":"4.0.18","graphql":"^16.8.1","payload":"3.84.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.6","typescript":"5.7.3","@types/node":"22.19.9","@types/react":"19.2.14","@payloadcms/ui":"3.84.1","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.84.1","@types/react-dom":"19.2.3","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","@vonage/server-sdk":"^3.20.0","eslint-config-next":"16.2.6","@aws-sdk/client-sns":"^3.658.0","vite-tsconfig-paths":"6.0.5","@payloadcms/db-sqlite":"3.84.1","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.84.1","@payloadcms/db-postgres":"3.84.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/richtext-lexical":"3.84.1"},"peerDependencies":{"plivo":"^4.0.0","react":"^19.0.0","telnyx":"^6.0.0","twilio":"^5.0.0","payload":"^3.0.0","react-dom":"^19.0.0","@vonage/server-sdk":"^3.0.0","@aws-sdk/client-sns":"^3.0.0"},"peerDependenciesMeta":{"plivo":{"optional":true},"react":{"optional":true},"telnyx":{"optional":true},"twilio":{"optional":true},"react-dom":{"optional":true},"@vonage/server-sdk":{"optional":true},"@aws-sdk/client-sns":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-sms_0.4.2_1780460621322_0.8254023573740179","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@elghaied/payload-plugin-sms","version":"0.5.0","description":"Multi-provider SMS plugin for Payload CMS 3.x with Twilio, Telnyx, Plivo, Vonage, and AWS SNS adapters.","license":"MIT","type":"module","keywords":["payload","payload-plugin","payloadcms","sms","mms","twilio","telnyx","plivo","vonage","aws-sns","messaging"],"repository":{"type":"git","url":"git+https://github.com/elghaied/payload-plugin-sms.git"},"bugs":{"url":"https://github.com/elghaied/payload-plugin-sms/issues"},"homepage":"https://github.com/elghaied/payload-plugin-sms#readme","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts","default":"./dist/index.js"},"./rsc":{"import":"./dist/exports/rsc.js","types":"./dist/exports/rsc.d.ts","default":"./dist/exports/rsc.js"},"./router":{"import":"./dist/router/index.js","types":"./dist/router/index.d.ts","default":"./dist/router/index.js"},"./translations":{"import":"./dist/translations/index.js","types":"./dist/translations/index.d.ts","default":"./dist/translations/index.js"},"./twilio":{"import":"./dist/adapters/twilio/index.js","types":"./dist/adapters/twilio/index.d.ts","default":"./dist/adapters/twilio/index.js"},"./telnyx":{"import":"./dist/adapters/telnyx/index.js","types":"./dist/adapters/telnyx/index.d.ts","default":"./dist/adapters/telnyx/index.js"},"./plivo":{"import":"./dist/adapters/plivo/index.js","types":"./dist/adapters/plivo/index.d.ts","default":"./dist/adapters/plivo/index.js"},"./vonage":{"import":"./dist/adapters/vonage/index.js","types":"./dist/adapters/vonage/index.d.ts","default":"./dist/adapters/vonage/index.js"},"./aws-sns":{"import":"./dist/adapters/aws-sns/index.js","types":"./dist/adapters/aws-sns/index.d.ts","default":"./dist/adapters/aws-sns/index.js"},"./mock":{"import":"./dist/adapters/mock/index.js","types":"./dist/adapters/mock/index.d.ts","default":"./dist/adapters/mock/index.js"}},"main":"./dist/index.js","types":"./dist/index.d.ts","devDependencies":{"@aws-sdk/client-sns":"^3.658.0","@eslint/eslintrc":"^3.2.0","@payloadcms/db-mongodb":"3.84.1","@payloadcms/db-postgres":"3.84.1","@payloadcms/db-sqlite":"3.84.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/next":"3.84.1","@payloadcms/richtext-lexical":"3.84.1","@payloadcms/ui":"3.84.1","@swc-node/register":"1.10.9","@swc/cli":"0.6.0","@types/node":"22.19.9","@types/react":"19.2.14","@types/react-dom":"19.2.3","@vonage/server-sdk":"^3.20.0","copyfiles":"2.4.1","cross-env":"^7.0.3","eslint":"^9.23.0","eslint-config-next":"16.2.6","graphql":"^16.8.1","mongodb-memory-server":"10.1.4","next":"16.2.6","open":"^10.1.0","payload":"3.84.1","plivo":"^4.65.0","prettier":"^3.4.2","qs-esm":"8.0.1","react":"19.2.6","react-dom":"19.2.6","rimraf":"3.0.2","sharp":"0.34.2","sort-package-json":"^2.10.0","telnyx":"^6.68.0","twilio":"^5.3.0","typescript":"5.7.3","vite-tsconfig-paths":"6.0.5","vitest":"4.0.18"},"peerDependencies":{"@aws-sdk/client-sns":"^3.0.0","@vonage/server-sdk":"^3.0.0","payload":"^3.0.0","plivo":"^4.0.0","react":"^19.0.0","react-dom":"^19.0.0","telnyx":"^6.0.0","twilio":"^5.0.0"},"peerDependenciesMeta":{"@aws-sdk/client-sns":{"optional":true},"@vonage/server-sdk":{"optional":true},"plivo":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"telnyx":{"optional":true},"twilio":{"optional":true}},"engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"publishConfig":{"access":"public"},"dependencies":{},"scripts":{"build":"pnpm copyfiles && pnpm build:types && pnpm build:swc","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","build:types":"tsc --outDir dist --rootDir ./src","clean":"rimraf {dist,*.tsbuildinfo}","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","dev":"next dev dev --turbo","dev:generate-importmap":"pnpm dev:payload generate:importmap","dev:generate-types":"pnpm dev:payload generate:types","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","generate:importmap":"pnpm dev:generate-importmap","generate:types":"pnpm dev:generate-types","lint":"eslint","lint:fix":"eslint --fix","test":"pnpm test:int","test:int":"vitest run"},"_id":"@elghaied/payload-plugin-sms@0.5.0","_integrity":"sha512-w4YNSFtwjcn29kBSvAiHfZHGQLo6vvY9tyFGwJ70zldZNK7wcYk93IEnBvJ8n0p2dxXz3QBTCbRElTVdo9A6wQ==","_resolved":"/tmp/8f831d7345e420bfbac2feeeee24b750/elghaied-payload-plugin-sms-0.5.0.tgz","_from":"file:elghaied-payload-plugin-sms-0.5.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.16.0","dist":{"integrity":"sha512-w4YNSFtwjcn29kBSvAiHfZHGQLo6vvY9tyFGwJ70zldZNK7wcYk93IEnBvJ8n0p2dxXz3QBTCbRElTVdo9A6wQ==","shasum":"60356fc0b8289676993224963f4d5fda5fb3accf","tarball":"https://registry.npmjs.org/@elghaied/payload-plugin-sms/-/payload-plugin-sms-0.5.0.tgz","fileCount":187,"unpackedSize":571877,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@elghaied%2fpayload-plugin-sms@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDUdojr56eDv0J97Z0dbjYzRjA68lGR6uKJYkQK7qXnEgIgaSAYj7xNV7qxnlH5JvKw4rODTWveGdYuAuIOyWi/WiM="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d1ccb40-c7b0-469e-9553-83d63818fecf"}},"directories":{},"maintainers":[{"name":"elghaied","email":"elghaied.eslam@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/payload-plugin-sms_0.5.0_1781002130006_0.07745692119521785"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-27T00:41:50.189Z","modified":"2026-06-09T10:48:50.441Z","0.3.0":"2026-05-27T00:41:50.493Z","0.4.0":"2026-06-03T03:55:07.791Z","0.4.1":"2026-06-03T04:13:26.935Z","0.4.2":"2026-06-03T04:23:41.466Z","0.5.0":"2026-06-09T10:48:50.149Z"},"bugs":{"url":"https://github.com/elghaied/payload-plugin-sms/issues"},"license":"MIT","homepage":"https://github.com/elghaied/payload-plugin-sms#readme","keywords":["payload","payload-plugin","payloadcms","sms","mms","twilio","telnyx","plivo","vonage","aws-sns","messaging"],"repository":{"type":"git","url":"git+https://github.com/elghaied/payload-plugin-sms.git"},"description":"Multi-provider SMS plugin for Payload CMS 3.x with Twilio, Telnyx, Plivo, Vonage, and AWS SNS adapters.","maintainers":[{"name":"elghaied","email":"elghaied.eslam@gmail.com"}],"readme":"# @elghaied/payload-plugin-sms\n\n[![npm version](https://img.shields.io/npm/v/@elghaied/payload-plugin-sms.svg)](https://www.npmjs.com/package/@elghaied/payload-plugin-sms)\n[![npm downloads](https://img.shields.io/npm/dm/@elghaied/payload-plugin-sms.svg)](https://www.npmjs.com/package/@elghaied/payload-plugin-sms)\n[![license](https://img.shields.io/npm/l/@elghaied/payload-plugin-sms.svg)](https://github.com/elghaied/payload-plugin-sms/blob/main/LICENSE)\n\nMulti-provider SMS plugin for [Payload CMS](https://payloadcms.com) 3.x. Send SMS through Twilio, Telnyx, Plivo, Vonage, or AWS SNS — and call `payload.sendSMS(...)` from anywhere.\n\nArchitecture mirrors `@payloadcms/email-nodemailer`: a thin core defines an adapter interface, and each provider ships as a separate subpath export with the SDK declared as an optional peer dependency.\n\n## Install\n\n```bash\npnpm add @elghaied/payload-plugin-sms\n```\n\nThen install the SDK for your chosen provider:\n\n```bash\npnpm add twilio                  # Twilio\npnpm add telnyx                  # Telnyx\npnpm add plivo                   # Plivo\npnpm add @vonage/server-sdk      # Vonage\npnpm add @aws-sdk/client-sns     # AWS SNS\n```\n\n## Quick start (Twilio)\n\n```ts\nimport { buildConfig } from 'payload'\nimport { smsPlugin } from '@elghaied/payload-plugin-sms'\nimport { twilioAdapter } from '@elghaied/payload-plugin-sms/twilio'\n\nexport default buildConfig({\n  plugins: [\n    smsPlugin({\n      adapter: twilioAdapter({\n        accountSid: process.env.TWILIO_ACCOUNT_SID!,\n        authToken: process.env.TWILIO_AUTH_TOKEN!,\n        defaultFrom: process.env.TWILIO_FROM!,\n      }),\n      collections: { logs: true },\n      widgets: true,\n    }),\n  ],\n})\n```\n\n## Sending SMS\n\n```ts\nimport type { CollectionConfig } from 'payload'\n\nexport const Users: CollectionConfig = {\n  slug: 'users',\n  auth: true,\n  fields: [{ name: 'phone', type: 'text' }],\n  hooks: {\n    afterChange: [\n      async ({ doc, req, operation }) => {\n        if (operation === 'create' && doc.phone) {\n          await req.payload.sendSMS({\n            to: doc.phone,\n            body: `Welcome ${doc.email}!`,\n          })\n        }\n      },\n    ],\n  },\n}\n```\n\n`to` must be E.164 (`+` then 1–15 digits). `from` falls back to plugin `defaultFrom`, then adapter `defaultFrom`.\n\n## Adapters\n\n### Twilio\n\n```ts\nimport { twilioAdapter } from '@elghaied/payload-plugin-sms/twilio'\n\ntwilioAdapter({\n  accountSid: '...',\n  authToken: '...',\n  defaultFrom: '+15551234567',\n  messagingServiceSid: 'MG...', // optional; supersedes `from`\n})\n```\n\n### Telnyx\n\n```ts\nimport { telnyxAdapter } from '@elghaied/payload-plugin-sms/telnyx'\n\ntelnyxAdapter({\n  apiKey: '...',\n  defaultFrom: '+15551234567',\n  messagingProfileId: '...', // optional\n})\n```\n\n### Plivo\n\n```ts\nimport { plivoAdapter } from '@elghaied/payload-plugin-sms/plivo'\n\nplivoAdapter({\n  authId: '...',\n  authToken: '...',\n  defaultFrom: '+15551234567',\n})\n```\n\n### Vonage\n\nUses the legacy SMS API (key + secret). The Messages API (JWT-authenticated) is on the roadmap.\n\n```ts\nimport { vonageAdapter } from '@elghaied/payload-plugin-sms/vonage'\n\nvonageAdapter({\n  apiKey: '...',\n  apiSecret: '...',\n  defaultFrom: '+15551234567',\n})\n```\n\n### AWS SNS\n\nSNS has no per-message `from`. `defaultFrom` is sent as the `AWS.SNS.SMS.SenderID` attribute (region-dependent support).\n\n```ts\nimport { awsSnsAdapter } from '@elghaied/payload-plugin-sms/aws-sns'\n\nawsSnsAdapter({\n  region: 'us-east-1',\n  credentials: {                    // optional; falls back to default AWS credential chain\n    accessKeyId: '...',\n    secretAccessKey: '...',\n  },\n  defaultFrom: 'MYBRAND',           // sender ID\n  smsType: 'Transactional',         // or 'Promotional'\n})\n```\n\n### Mock (tests)\n\n```ts\nimport { mockAdapter } from '@elghaied/payload-plugin-sms/mock'\n\nconst adapter = mockAdapter({ defaultFrom: '+15550000000' })\nadapter.messages  // array of sent messages\nadapter.reset()   // clears it\n```\n\n## Plugin options\n\n| Option              | Type                                                       | Default       | Notes                                                     |\n| ------------------- | ---------------------------------------------------------- | ------------- | --------------------------------------------------------- |\n| `adapter`           | `SMSAdapter`                                               | —             | Required at runtime. Missing adapter → `sendSMS` throws.  |\n| `defaultFrom`       | `string`                                                   | —             | Falls back to adapter's `defaultFrom`.                    |\n| `disabled`          | `boolean`                                                  | `false`       | Skips registration; logs a warning.                       |\n| `collections.logs`  | `boolean \\| { slug?; admin?; includeContext?; statusHistory? }` | `false`  | Creates an `sms-logs` collection. `includeContext` adds a JSON `context` field; `statusHistory` adds an append-only status-event array. |\n| `widgets`           | `boolean`                                                  | `true`        | Registers the dashboard widget when logs enabled.         |\n| `tenantScoping`     | `{ field?: string; cookie?: string }`                      | — (off)       | Opt-in. Scopes the dashboard widget to the host's selected tenant. See [Dashboard widget](#dashboard-widget). |\n| `webhooks`          | `{ enabled; basePath?; statusCallbackUrl?; trustProxy?; verifySignature? }` | — | Enables the delivery-status receiver + auto-derived callback. See [Delivery-status webhooks](#delivery-status-webhooks). |\n| `onSend`            | `(args) => void \\| Promise<void>`                          | —             | Called after every successful send.                       |\n| `onError`           | `(args) => void \\| Promise<void>`                          | —             | Called when send fails. Original error is re-thrown.      |\n| `onStatus`          | `(args) => void \\| Promise<void>`                          | —             | Called on every delivery-status webhook event (requires `webhooks.enabled`). |\n\n## Logs collection\n\nEnable with `collections: { logs: true }`. Schema:\n\n| Field               | Type     | Notes                                          |\n| ------------------- | -------- | ---------------------------------------------- |\n| `to`                | text     | Recipient                                      |\n| `from`              | text     | Sender                                         |\n| `body`              | textarea | Message body                                   |\n| `provider`          | text     | Adapter name                                   |\n| `status`            | select   | `queued`/`sent`/`delivered`/`failed`/`unknown` |\n| `providerMessageId` | text     | Provider's message id                          |\n| `cost`              | group    | `{ amount, currency }` when reported           |\n| `error`             | textarea | Adapter error message (if any)                 |\n| `errorCode`         | text     | Provider error code (from a failed-status webhook) |\n| `sentAt`            | date     | Server timestamp                               |\n| `deliveredAt`       | date     | Set when a webhook reports `delivered`         |\n| `failedAt`          | date     | Set when a webhook reports `failed`            |\n| `context`           | json     | Per-send metadata — only with `includeContext: true` |\n| `statusHistory`     | array    | Append-only `{ status, occurredAt, errorCode }` — only with `statusHistory: true` |\n\n`deliveredAt` / `failedAt` / `errorCode` / `statusHistory` are populated by [delivery-status webhooks](#delivery-status-webhooks).\n\nRead access requires a logged-in admin user. Create/update/delete from the admin panel are blocked — the plugin is the only writer.\n\nOverride the slug:\n\n```ts\ncollections: { logs: { slug: 'audit-sms', admin: { group: 'Audit' } } }\n```\n\nNote: if you override the slug, set `widgets: false` — the bundled widget reads from `sms-logs` only.\n\n## Dashboard widget\n\nWhen `widgets: true` and logs are enabled, the plugin registers an `admin.dashboard.widgets` entry that shows a 24h send count, the last 5 entries, and a link to the logs collection.\n\nDisable with `widgets: false`.\n\n### Multi-tenant scoping\n\nThe plugin is single-tenant by design, so by default the widget queries `sms-logs` with the Local API's implicit `overrideAccess: true` and no tenant filter — it shows **every** row. In a multi-tenant host (e.g. `@payloadcms/plugin-multi-tenant` injecting a `tenant` field into `sms-logs`) that leaks other tenants' logs into the dashboard.\n\nOpt in with `tenantScoping` to make the widget honor the host's tenant selector:\n\n```ts\nsmsPlugin({\n  adapter,\n  collections: { logs: true },\n  tenantScoping: { field: 'tenant', cookie: 'payload-tenant' }, // both optional; these are the defaults\n})\n```\n\nWhen enabled **and** the logs collection actually has the configured `field`, the widget:\n\n- reads the selected tenant id from the `cookie` and adds `where[field][equals]=<id>` to both the 24h count and the recent-5 list, and\n- runs the queries with `overrideAccess: false` and the real request/user, so any read access control the host added to `sms-logs` is respected.\n\nWith no tenant selected (\"all tenants\"), it drops the tenant filter but still runs with `overrideAccess: false`, so the dashboard shows everything the current user is allowed to read. Omit `tenantScoping`, or leave the field off the collection, and the widget behaves exactly as before.\n\n## Router adapter (multi-provider)\n\nFor multi-tenant SaaS or geo-routing, wrap multiple adapters in a `routerAdapter` and decide per-send which one handles the message.\n\n```ts\nimport { smsPlugin } from '@elghaied/payload-plugin-sms'\nimport { twilioAdapter } from '@elghaied/payload-plugin-sms/twilio'\nimport { telnyxAdapter } from '@elghaied/payload-plugin-sms/telnyx'\nimport { routerAdapter, byTenantLookup } from '@elghaied/payload-plugin-sms/router'\n\nsmsPlugin({\n  adapter: routerAdapter({\n    providers: {\n      twilio: twilioAdapter({ accountSid, authToken }),\n      telnyx: telnyxAdapter({ apiKey }),\n    },\n    route: byTenantLookup({\n      collection: 'tenants',\n      providerField: 'smsProvider',\n      cacheMs: 60_000,\n    }),\n  }),\n  collections: { logs: { includeContext: true } },\n})\n```\n\nAt the call site, attach the tenant id (and any per-tenant `from`):\n\n```ts\nawait req.payload.sendSMS({\n  to: customer.phone,\n  from: tenant.smsFromNumber,\n  body: '...',\n  context: { tenantId: tenant.id },\n})\n```\n\nThe router is just another `SMSAdapter`. Single-provider users (`smsPlugin({ adapter: twilioAdapter(...) })`) are unaffected.\n\n### Route helpers\n\n| Helper | Use |\n|---|---|\n| `byTenantLookup({ collection, providerField, contextKey?, cacheMs?, fallback? })` | SaaS: read tenant id from `message.context`, fetch the doc, return its provider field |\n| `byCountryPrefix({ '+1': 'twilio', '+33': 'telnyx' }, { fallback? })` | Geo route by E.164 prefix; longest-prefix wins |\n| `byRoundRobin(['twilio-a', 'twilio-b'])` | Cycle across duplicate accounts |\n| `byRandom(['twilio-a', 'twilio-b'])` | Uniform random pick |\n| `withFailover(inner, ['fallback-a', 'fallback-b'])` | Wrap any route; on `SMSProviderError`, try the next provider in order |\n\nYou can also write a `route` callback directly — it's just `(args) => string \\| string[]` (or async).\n\n### `context`\n\n`SMSMessage.context` is an opaque per-send map. It flows to the route function, the `onSend`/`onError` hooks (via `args.message`), and — when `collections.logs.includeContext: true` — into a `context` (JSON) field on the `sms-logs` collection.\n\n### Failover semantics\n\nA route returning a single provider name calls that provider once. Returning an array `['a', 'b']` tries each in order on `SMSProviderError`; if all fail the router throws a single `SMSProviderError` whose `.cause` is an array of the individual errors. `SMSValidationError` is never retried.\n\n## Hooks (onSend, onError)\n\n```ts\nsmsPlugin({\n  adapter: twilioAdapter({ ... }),\n  onSend: async ({ result, req }) => {\n    console.log(`Sent ${result.id} via ${result.provider} to ${result.to}`)\n  },\n  onError: async ({ error, message, req }) => {\n    console.error(`Failed to send to ${message.to}:`, error)\n  },\n})\n```\n\nHook failures are logged but do not affect the SMS send result. `req` is `undefined` when called via `payload.sendSMS` (Payload's local API does not thread `req` through dynamic methods).\n\n## Errors\n\n```ts\nimport { SMSValidationError, SMSProviderError } from '@elghaied/payload-plugin-sms'\n\ntry {\n  await payload.sendSMS({ to: 'not-e164', body: 'hi' })\n} catch (err) {\n  if (err instanceof SMSValidationError) {\n    // Bad input (E.164 fail, missing from, missing adapter)\n  } else if (err instanceof SMSProviderError) {\n    // Adapter call failed; `err.cause` has the original SDK error\n  }\n}\n```\n\n## Delivery-status webhooks\n\nEnable provider webhooks to keep `sms-logs` rows in sync with real delivery state. With `webhooks: { enabled: true }`, the Twilio/Telnyx/Plivo adapters are also handed a per-message delivery-status callback URL automatically — derived from `config.serverURL` + the webhook base path (e.g. `https://app.com/api/sms/webhooks/twilio`). No Messaging-Service or provider-portal step is required for a plain sender. (Vonage and AWS SNS have no per-message callback and are unaffected.)\n\n```ts\nimport { smsPlugin } from '@elghaied/payload-plugin-sms'\nimport { twilioAdapter } from '@elghaied/payload-plugin-sms/twilio'\n\nexport default buildConfig({\n  // ...\n  plugins: [\n    smsPlugin({\n      adapter: twilioAdapter({\n        accountSid: process.env.TWILIO_ACCOUNT_SID!,\n        authToken: process.env.TWILIO_AUTH_TOKEN!,\n        defaultFrom: process.env.TWILIO_FROM,\n        webhook: { trustProxy: true }, // optional, if behind a proxy\n      }),\n      collections: { logs: { statusHistory: true } },\n      webhooks: { enabled: true },\n      onStatus: ({ event, log }) => {\n        // optional: notify your app on every status transition\n      },\n    }),\n  ],\n})\n```\n\nWebhook URLs (Payload prepends `/api`):\n\n| Provider | URL                              | Required adapter `webhook` opts                                                         |\n| -------- | -------------------------------- | --------------------------------------------------------------------------------------- |\n| Twilio   | `/api/sms/webhooks/twilio`       | (none — uses `authToken`)                                                               |\n| Telnyx   | `/api/sms/webhooks/telnyx`       | `publicKey` (Ed25519 PEM, from Telnyx portal)                                           |\n| Plivo    | `/api/sms/webhooks/plivo`        | (none — uses `authToken`)                                                               |\n| Vonage   | `/api/sms/webhooks/vonage`       | `signatureSecret`, `signatureMethod: 'sha256hash' \\| 'sha512hash'`                      |\n| AWS SNS  | `/api/sms/webhooks/aws-sns`      | (none — verified via `SigningCertURL`; auto-confirms `SubscriptionConfirmation`)        |\n\nNotes:\n\n- The auto-derived callback URL is skipped when `serverURL` is missing or points at `localhost`/`127.0.0.1` (dev). Override it with `webhooks.statusCallbackUrl` (applies to Twilio/Telnyx/Plivo).\n- The callback URL handed to the provider **must match** the URL the receiver reconstructs for signature verification. Behind a reverse proxy, set the adapter's `webhook: { trustProxy: true }` so the host/protocol are read from forwarded headers — or use the `webhooks.statusCallbackUrl` override to pin both ends explicitly.\n- Signature verification is **on by default**. Set `webhooks.verifySignature: false` only for local testing.\n- Status updates are gated by rank (`queued → sent → delivered`, with `failed` terminal), so out-of-order or duplicate webhooks are dropped silently.\n- Set `collections.logs.statusHistory: true` to keep an append-only history of every event.\n- Vonage plain MD5 signing is **not supported** (insecure). Use `sha256hash` or `sha512hash`.\n- Twilio and Plivo do not sign timestamps — those providers cannot prevent replay attacks at the signature layer.\n\n## Internationalization\n\nThe `sms-logs` collection (labels, field labels, status options) and the dashboard widget ship with bundled `en` and `fr` translations, deep-merged into `config.i18n.translations` under an `sms` namespace. Your existing translations always win on conflict.\n\nOverride any string — or add a language — via `i18n.translations.{lang}.sms`:\n\n```ts\nbuildConfig({\n  i18n: {\n    translations: {\n      fr: { sms: { fieldTo: 'Destinataire' } },\n      // add a new language by supplying its sms.* keys\n    },\n  },\n  // ...\n})\n```\n\nThe raw translation tables are also available directly via the `@elghaied/payload-plugin-sms/translations` export.\n\n## Roadmap\n\n- Bulk / batch send\n- Templating (variable substitution, localization)\n- Per-recipient rate limiting\n- Inbound SMS handling\n- Vonage Messages API (JWT, MMS, WhatsApp)\n- MessageBird/Bird, Sinch, Infobip adapters\n\nPRs welcome.\n\n## Compatibility\n\n- Payload `^3.0.0` (tested against `3.84.1`)\n- Next.js `^16.0.0`\n- Node `^18.20.2 || >=20.9.0`\n- React 19 is an optional peer dependency — required only if you use the dashboard widget (`@elghaied/payload-plugin-sms/rsc`).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}