{"_id":"@amadeni/better-auth-kit","_rev":"8-800b3c648f620de8479e11bdcb7e8c53","name":"@amadeni/better-auth-kit","dist-tags":{"latest":"0.4.2"},"versions":{"0.2.0":{"name":"@amadeni/better-auth-kit","version":"0.2.0","keywords":["better-auth","convex","nextjs","magic-link","typescript","library"],"author":{"name":"Amadeni","email":"nicolai.hallberg@amadeni.ai"},"license":"MIT","_id":"@amadeni/better-auth-kit@0.2.0","maintainers":[{"name":"amadeni_ai","email":"admin@amadeni.ai"}],"dist":{"shasum":"851b9ac6fc84a99afc8c2bab61d97e83b726b8b8","tarball":"https://registry.npmjs.org/@amadeni/better-auth-kit/-/better-auth-kit-0.2.0.tgz","fileCount":35,"integrity":"sha512-BZsYFmjRr3Jdkvnvi58iXkMb5A+ExvnwEunqm65WEabrrpRyGD+Ttlo53TAIcTpJ4HP4bxxvKCtLRQVsrUWUEA==","signatures":[{"sig":"MEYCIQCmtdfKZkbaOU9sZ7oWP5wg70lQrBEQOmEXKhMUV6PqgAIhAM6IfdJGBVu6OBri6UNPHoHLZ/IR/CProgC7f2ljMaTX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77609},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./next":{"types":"./dist/next/index.d.ts","default":"./dist/next/index.js"},"./client":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"}},"gitHead":"a3546a192257063e7a12485302b77b714cb15eb9","scripts":{"ci":"pnpm run prettier:check && pnpm run lint && pnpm run ts && pnpm run check-spelling && pnpm run test","ts":"tsc --noEmit --incremental false","lint":"eslint src/","test":"vitest run","build":"tsc","prepare":"tsc","release":"pnpm version patch && git push && git push --tags","re-release":"git tag -d v$(node -p \"require('./package.json').version\") && git push origin :refs/tags/v$(node -p \"require('./package.json').version\") && git tag v$(node -p \"require('./package.json').version\") && git push --tags","release:major":"pnpm version major && git push && git push --tags","release:minor":"pnpm version minor && git push && git push --tags","check-spelling":"cspell '**/*.*' --no-progress","prepublishOnly":"pnpm run build","prettier:check":"prettier --check .","prettier:write":"prettier --write ."},"_npmUser":{"name":"amadeni_ai","email":"admin@amadeni.ai"},"_npmVersion":"10.9.8","description":"Shared Better Auth base for Amadeni Convex + Next.js apps: hardened options factory, magic link email, eligibility hooks, and Next.js glue","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6","devDependencies":{"zod":"^4.4.3","next":"^16.1.5","react":"^19.2.4","convex":"^1.34.1","cspell":"^9.7.0","eslint":"^10.0.2","vitest":"^4.0.18","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.9.0","@types/node":"^25.3.3","better-auth":"1.6.23","@types/react":"^19","convex-helpers":"^0.1.100","typescript-eslint":"^8.56.1","@convex-dev/better-auth":"0.12.5"},"peerDependencies":{"next":">=15","react":">=18","convex":">=1.34.0","better-auth":"1.6.23","@convex-dev/better-auth":"0.12.5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/better-auth-kit_0.2.0_1786546804987_0.5449639030545506","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Not maintained here anymore"},"0.2.2":{"name":"@amadeni/better-auth-kit","version":"0.2.2","keywords":["better-auth","convex","nextjs","magic-link","typescript","library"],"author":{"name":"Amadeni","email":"nicolai.hallberg@amadeni.ai"},"license":"MIT","_id":"@amadeni/better-auth-kit@0.2.2","maintainers":[{"name":"amadeni_ai","email":"admin@amadeni.ai"}],"homepage":"https://github.com/amadeni/better-auth-kit#readme","bugs":{"url":"https://github.com/amadeni/better-auth-kit/issues"},"dist":{"shasum":"85a15876b745e90434e108c3719a30953a2860a1","tarball":"https://registry.npmjs.org/@amadeni/better-auth-kit/-/better-auth-kit-0.2.2.tgz","fileCount":35,"integrity":"sha512-4W0hIB9oxYQBb8/jjruTRqRgJf4kEAmIFszcibVp8X4MBTUkWJLy/TdXi6o1sUJ7syE8SWPA2PHEbj8sMQp4qA==","signatures":[{"sig":"MEUCIG0l8Y4h6ueZKWeukSj98l/m67NKRZPr1JheQuzxj1VSAiEA8qnts8tfv6+yP9+ds+dN/04GlxAHqELSZCe1CWJd920=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amadeni%2fbetter-auth-kit@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":77862},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./next":{"types":"./dist/next/index.d.ts","default":"./dist/next/index.js"},"./client":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"}},"gitHead":"6373c4e7508c480b6cdbe82588d38d4fd3196bd2","scripts":{"ci":"pnpm run prettier:check && pnpm run lint && pnpm run ts && pnpm run check-spelling && pnpm run test","ts":"tsc --noEmit --incremental false","lint":"eslint src/","test":"vitest run","build":"tsc","prepare":"tsc","release":"pnpm version patch && git push && git push --tags","re-release":"git tag -d v$(node -p \"require('./package.json').version\") && git push origin :refs/tags/v$(node -p \"require('./package.json').version\") && git tag v$(node -p \"require('./package.json').version\") && git push --tags","release:major":"pnpm version major && git push && git push --tags","release:minor":"pnpm version minor && git push && git push --tags","check-spelling":"cspell '**/*.*' --no-progress","prepublishOnly":"pnpm run build","prettier:check":"prettier --check .","prettier:write":"prettier --write ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceb8aabc-8fe9-46d0-bd6f-7c39bbd1b3e8"}},"repository":{"url":"git+https://github.com/amadeni/better-auth-kit.git","type":"git"},"_npmVersion":"12.0.2","description":"Shared Better Auth base for Amadeni Convex + Next.js apps: hardened options factory, magic link email, eligibility hooks, and Next.js glue","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6","devDependencies":{"zod":"^4.4.3","next":"^16.1.5","react":"^19.2.4","convex":"^1.34.1","cspell":"^9.7.0","eslint":"^10.0.2","vitest":"^4.0.18","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.9.0","@types/node":"^25.3.3","better-auth":"1.6.23","@types/react":"^19","convex-helpers":"^0.1.100","typescript-eslint":"^8.56.1","@convex-dev/better-auth":"0.12.5"},"peerDependencies":{"next":">=15","react":">=18","convex":">=1.34.0","better-auth":"1.6.23","@convex-dev/better-auth":"0.12.5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/better-auth-kit_0.2.2_1786547484649_0.6999081370936759","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Not maintained here anymore"},"0.2.3":{"name":"@amadeni/better-auth-kit","version":"0.2.3","keywords":["better-auth","convex","nextjs","magic-link","typescript","library"],"author":{"name":"Amadeni","email":"nicolai.hallberg@amadeni.ai"},"license":"MIT","_id":"@amadeni/better-auth-kit@0.2.3","maintainers":[{"name":"amadeni_ai","email":"admin@amadeni.ai"}],"homepage":"https://github.com/amadeni/better-auth-kit#readme","bugs":{"url":"https://github.com/amadeni/better-auth-kit/issues"},"dist":{"shasum":"3fb654456311d591112a59415184c63efde8d813","tarball":"https://registry.npmjs.org/@amadeni/better-auth-kit/-/better-auth-kit-0.2.3.tgz","fileCount":35,"integrity":"sha512-STUjvF7CwZ+ke1MmODhswcjdvje+/xaT6cfq2p8Pal/RKhk/gZk25ZBWQGNmauW+FgqwAfsu0qLs9EwowSDtLA==","signatures":[{"sig":"MEYCIQCpV9x7QTrXfagqUBcyY+vU2tlP8KYhUJcvvdSGXpdkcwIhALn/UkNrsiEnVaD8bU+TevkFjqcfZK67hvp3rXwgCoLb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amadeni%2fbetter-auth-kit@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":77920},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./next":{"types":"./dist/next/index.d.ts","default":"./dist/next/index.js"},"./client":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"}},"gitHead":"ec34958ba4d9cd26b369ab6766c71c08b94f28ca","scripts":{"ci":"pnpm run prettier:check && pnpm run lint && pnpm run ts && pnpm run check-spelling && pnpm run test","ts":"tsc --noEmit --incremental false","lint":"eslint src/","test":"vitest run","build":"tsc","prepare":"tsc","release":"pnpm version patch && git push && git push --tags","re-release":"git tag -d v$(node -p \"require('./package.json').version\") && git push origin :refs/tags/v$(node -p \"require('./package.json').version\") && git tag v$(node -p \"require('./package.json').version\") && git push --tags","release:major":"pnpm version major && git push && git push --tags","release:minor":"pnpm version minor && git push && git push --tags","check-spelling":"cspell '**/*.*' --no-progress","prepublishOnly":"pnpm run build","prettier:check":"prettier --check .","prettier:write":"prettier --write ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceb8aabc-8fe9-46d0-bd6f-7c39bbd1b3e8"}},"repository":{"url":"git+https://github.com/amadeni/better-auth-kit.git","type":"git"},"_npmVersion":"12.0.2","description":"Shared Better Auth base for Amadeni Convex + Next.js apps: hardened options factory, magic link email, eligibility hooks, and Next.js glue","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6","devDependencies":{"zod":"^4.4.3","next":"^16.1.5","react":"^19.2.4","convex":"^1.34.1","cspell":"^9.7.0","eslint":"^10.0.2","vitest":"^4.0.18","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.9.0","@types/node":"^25.3.3","better-auth":"1.6.23","@types/react":"^19","convex-helpers":"^0.1.100","typescript-eslint":"^8.56.1","@convex-dev/better-auth":"0.12.5"},"peerDependencies":{"next":">=15","react":">=18","convex":">=1.34.0","better-auth":"1.6.23","@convex-dev/better-auth":"0.12.5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/better-auth-kit_0.2.3_1786550173781_0.29437636633636277","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Not maintained here anymore"},"0.3.0":{"name":"@amadeni/better-auth-kit","version":"0.3.0","keywords":["better-auth","convex","nextjs","magic-link","typescript","library"],"author":{"name":"Amadeni","email":"nicolai.hallberg@amadeni.ai"},"license":"MIT","_id":"@amadeni/better-auth-kit@0.3.0","maintainers":[{"name":"amadeni_ai","email":"admin@amadeni.ai"}],"homepage":"https://github.com/amadeni/better-auth-kit#readme","bugs":{"url":"https://github.com/amadeni/better-auth-kit/issues"},"dist":{"shasum":"e22ea3e638bb577a69f3fe05b21cde2657d4c384","tarball":"https://registry.npmjs.org/@amadeni/better-auth-kit/-/better-auth-kit-0.3.0.tgz","fileCount":37,"integrity":"sha512-xwERna8PhqSSsu5HaPhuKXADHeNJiZbrnboOLruDyk4ptwG9KWzXdJpsDZhoGzLZReu7nE4Vw7Rm80AgTQdAmw==","signatures":[{"sig":"MEUCIGcRWmGRqvYqyXLTPCaLjwOEuyK40nlQOgqAJoNZgTlfAiEA71yTY14v6i/vwu81R4RTjXFIV6DpgJUSb3t3nKGCNk8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amadeni%2fbetter-auth-kit@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":91478},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./next":{"types":"./dist/next/index.d.ts","default":"./dist/next/index.js"},"./client":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"}},"gitHead":"5b3e05e277959ab01c645e546678f896c6031954","scripts":{"ci":"pnpm run prettier:check && pnpm run lint && pnpm run ts && pnpm run check-spelling && pnpm run test","ts":"tsc --noEmit --incremental false","lint":"eslint src/","test":"vitest run","build":"tsc","prepare":"tsc","release":"pnpm version patch && git push && git push --tags","re-release":"git tag -d v$(node -p \"require('./package.json').version\") && git push origin :refs/tags/v$(node -p \"require('./package.json').version\") && git tag v$(node -p \"require('./package.json').version\") && git push --tags","release:major":"pnpm version major && git push && git push --tags","release:minor":"pnpm version minor && git push && git push --tags","check-spelling":"cspell '**/*.*' --no-progress","prepublishOnly":"pnpm run build","prettier:check":"prettier --check .","prettier:write":"prettier --write ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceb8aabc-8fe9-46d0-bd6f-7c39bbd1b3e8"}},"repository":{"url":"git+https://github.com/amadeni/better-auth-kit.git","type":"git"},"_npmVersion":"12.0.2","description":"Shared Better Auth base for Amadeni Convex + Next.js apps: hardened options factory, magic link email, eligibility hooks, and Next.js glue","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6","devDependencies":{"zod":"^4.4.3","next":"^16.1.5","react":"^19.2.4","convex":"^1.34.1","cspell":"^9.7.0","eslint":"^10.0.2","vitest":"^4.0.18","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.9.0","@types/node":"^25.3.3","better-auth":"1.6.23","@types/react":"^19","convex-helpers":"^0.1.100","typescript-eslint":"^8.56.1","@convex-dev/better-auth":"0.12.5"},"peerDependencies":{"next":">=15","react":">=18","convex":">=1.34.0","better-auth":"1.6.23","@convex-dev/better-auth":"0.12.5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/better-auth-kit_0.3.0_1786551161517_0.2690157358999774","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Not maintained here anymore"},"0.4.0":{"name":"@amadeni/better-auth-kit","version":"0.4.0","keywords":["better-auth","convex","nextjs","magic-link","typescript","library"],"author":{"name":"Amadeni","email":"nicolai.hallberg@amadeni.ai"},"license":"MIT","_id":"@amadeni/better-auth-kit@0.4.0","maintainers":[{"name":"amadeni_ai","email":"admin@amadeni.ai"}],"homepage":"https://github.com/amadeni/better-auth-kit#readme","bugs":{"url":"https://github.com/amadeni/better-auth-kit/issues"},"dist":{"shasum":"8d44efdfcfe4e92c848c474409cb0271b3207697","tarball":"https://registry.npmjs.org/@amadeni/better-auth-kit/-/better-auth-kit-0.4.0.tgz","fileCount":41,"integrity":"sha512-bpLOJwHCPjCKKcZu5PUUTq6cnyxS/yT20Seh8pqP7GNFBRUK+EIdzinG47HavQ2GPDeh+8Ex6Y4toqUqkBrfIw==","signatures":[{"sig":"MEQCIH+HiHxXJizggWYhuVmrJDfots/3aRP6GVZk1BZChX8CAiBMxRB9dIyhbNv+/bI3cMvL/6OvlrUgWd0iiKFEeRvIcQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amadeni%2fbetter-auth-kit@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116705},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./next":{"types":"./dist/next/index.d.ts","default":"./dist/next/index.js"},"./client":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"}},"gitHead":"2710904a9ee84546ba922970ee16ed368766767a","scripts":{"ci":"pnpm run prettier:check && pnpm run lint && pnpm run ts && pnpm run check-spelling && pnpm run test","ts":"tsc --noEmit --incremental false","lint":"eslint src/","test":"vitest run","build":"tsc","prepare":"tsc","release":"pnpm version patch && git push && git push --tags","re-release":"git tag -d v$(node -p \"require('./package.json').version\") && git push origin :refs/tags/v$(node -p \"require('./package.json').version\") && git tag v$(node -p \"require('./package.json').version\") && git push --tags","release:major":"pnpm version major && git push && git push --tags","release:minor":"pnpm version minor && git push && git push --tags","check-spelling":"cspell '**/*.*' --no-progress","prepublishOnly":"pnpm run build","prettier:check":"prettier --check .","prettier:write":"prettier --write ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceb8aabc-8fe9-46d0-bd6f-7c39bbd1b3e8"}},"repository":{"url":"git+https://github.com/amadeni/better-auth-kit.git","type":"git"},"_npmVersion":"12.0.2","description":"Shared Better Auth base for Amadeni Convex + Next.js apps: hardened options factory, magic link email, eligibility hooks, and Next.js glue","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6","devDependencies":{"zod":"^4.4.3","next":"^16.1.5","jsdom":"^30.0.1","react":"^19.2.4","convex":"^1.34.1","cspell":"^9.7.0","eslint":"^10.0.2","vitest":"^4.0.18","prettier":"^3.8.1","react-dom":"^19.2.8","@eslint/js":"^10.0.1","typescript":"^5.9.0","@types/node":"^25.3.3","better-auth":"1.6.23","@types/react":"^19","convex-helpers":"^0.1.100","typescript-eslint":"^8.56.1","@testing-library/react":"^16.3.2","@convex-dev/better-auth":"0.12.5"},"peerDependencies":{"next":">=15","react":">=18","convex":">=1.34.0","better-auth":"1.6.23","@convex-dev/better-auth":"0.12.5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/better-auth-kit_0.4.0_1786572990888_0.2211352891495646","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Not maintained here anymore"},"0.4.1":{"name":"@amadeni/better-auth-kit","version":"0.4.1","keywords":["better-auth","convex","nextjs","magic-link","typescript","library"],"author":{"name":"Amadeni","email":"nicolai.hallberg@amadeni.ai"},"license":"MIT","_id":"@amadeni/better-auth-kit@0.4.1","maintainers":[{"name":"amadeni_ai","email":"admin@amadeni.ai"}],"homepage":"https://github.com/amadeni/better-auth-kit#readme","bugs":{"url":"https://github.com/amadeni/better-auth-kit/issues"},"dist":{"shasum":"bd23b2c58900e99c92548bfadb03519fb8e5d9cb","tarball":"https://registry.npmjs.org/@amadeni/better-auth-kit/-/better-auth-kit-0.4.1.tgz","fileCount":41,"integrity":"sha512-MyLQGc6J2Mx0dWnYZNdkerjS/f1o//6alRZGxfuM6cLWm2RlU191FLxZ/AunVEFV4+oGht+NBJ0XHPOW0CXi7Q==","signatures":[{"sig":"MEUCIQD44sEMboXxHO5Qx7gWj2C4laJ//pwcWy34VAMcMpPXEQIgIFZ1CIWF6Ax77DPDqiRG7Z0VvCAzktHN7D//5YO2xQE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amadeni%2fbetter-auth-kit@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":117638},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./next":{"types":"./dist/next/index.d.ts","default":"./dist/next/index.js"},"./client":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"}},"gitHead":"b06d8ab56368ba3948016216f0ef887b29496528","scripts":{"ci":"pnpm run prettier:check && pnpm run lint && pnpm run ts && pnpm run check-spelling && pnpm run test","ts":"tsc --noEmit --incremental false","lint":"eslint src/","test":"vitest run","build":"tsc","prepare":"tsc","release":"pnpm version patch && git push && git push --tags","re-release":"git tag -d v$(node -p \"require('./package.json').version\") && git push origin :refs/tags/v$(node -p \"require('./package.json').version\") && git tag v$(node -p \"require('./package.json').version\") && git push --tags","release:major":"pnpm version major && git push && git push --tags","release:minor":"pnpm version minor && git push && git push --tags","check-spelling":"cspell '**/*.*' --no-progress","prepublishOnly":"pnpm run build","prettier:check":"prettier --check .","prettier:write":"prettier --write ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceb8aabc-8fe9-46d0-bd6f-7c39bbd1b3e8"}},"repository":{"url":"git+https://github.com/amadeni/better-auth-kit.git","type":"git"},"_npmVersion":"12.0.2","description":"Shared Better Auth base for Amadeni Convex + Next.js apps: hardened options factory, magic link email, eligibility hooks, and Next.js glue","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6","devDependencies":{"zod":"^4.4.3","next":"^16.1.5","jsdom":"^30.0.1","react":"^19.2.4","convex":"^1.34.1","cspell":"^9.7.0","eslint":"^10.0.2","vitest":"^4.0.18","prettier":"^3.8.1","react-dom":"^19.2.8","@eslint/js":"^10.0.1","typescript":"^5.9.0","@types/node":"^25.3.3","better-auth":"1.6.23","@types/react":"^19","convex-helpers":"^0.1.100","typescript-eslint":"^8.56.1","@testing-library/react":"^16.3.2","@convex-dev/better-auth":"0.12.5"},"peerDependencies":{"next":">=15","react":">=18","convex":">=1.34.0","better-auth":"1.6.23","@convex-dev/better-auth":"0.12.5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/better-auth-kit_0.4.1_1786573867886_0.13415801237362812","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Not maintained here anymore"},"0.4.2":{"name":"@amadeni/better-auth-kit","version":"0.4.2","keywords":["better-auth","convex","nextjs","magic-link","typescript","library"],"author":{"name":"Amadeni","email":"nicolai.hallberg@amadeni.ai"},"license":"MIT","_id":"@amadeni/better-auth-kit@0.4.2","maintainers":[{"name":"amadeni_ai","email":"admin@amadeni.ai"}],"homepage":"https://github.com/amadeni/better-auth-kit#readme","bugs":{"url":"https://github.com/amadeni/better-auth-kit/issues"},"dist":{"shasum":"259fc74c0f3811c62d4b4146afd44f846da33bc5","tarball":"https://registry.npmjs.org/@amadeni/better-auth-kit/-/better-auth-kit-0.4.2.tgz","fileCount":41,"integrity":"sha512-C0pLXQtvQYtFMb4HDpbAFgHUKQYVoXg/a7qvwkdrB7Lp2B+voyrrpWLbAU1ybw2s0xeZ6cRShkbhVfvGVu/M9A==","signatures":[{"sig":"MEUCIC/iLTuvA1G4NcN12niyXbbbbAJBkSvwHraNkRtuYAQwAiEApfLe3gEqmFV4swHy8Kj6/PiTVlbWFKKXLrY1KlQzxkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@amadeni%2fbetter-auth-kit@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":118155},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./next":{"types":"./dist/next/index.d.ts","default":"./dist/next/index.js"},"./client":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"}},"gitHead":"305389602f4dec3b5d236f3be76ee90f876a17f2","scripts":{"ci":"pnpm run prettier:check && pnpm run lint && pnpm run ts && pnpm run check-spelling && pnpm run test","ts":"tsc --noEmit --incremental false","lint":"eslint src/","test":"vitest run","build":"tsc","prepare":"tsc","release":"pnpm version patch && git push && git push --tags","re-release":"git tag -d v$(node -p \"require('./package.json').version\") && git push origin :refs/tags/v$(node -p \"require('./package.json').version\") && git tag v$(node -p \"require('./package.json').version\") && git push --tags","release:major":"pnpm version major && git push && git push --tags","release:minor":"pnpm version minor && git push && git push --tags","check-spelling":"cspell '**/*.*' --no-progress","prepublishOnly":"pnpm run build","prettier:check":"prettier --check .","prettier:write":"prettier --write ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceb8aabc-8fe9-46d0-bd6f-7c39bbd1b3e8"}},"repository":{"url":"git+https://github.com/amadeni/better-auth-kit.git","type":"git"},"_npmVersion":"12.0.2","description":"Shared Better Auth base for Amadeni Convex + Next.js apps: hardened options factory, magic link email, eligibility hooks, and Next.js glue","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6","devDependencies":{"zod":"^4.4.3","next":"^16.1.5","jsdom":"^30.0.1","react":"^19.2.4","convex":"^1.34.1","cspell":"^9.7.0","eslint":"^10.0.2","vitest":"^4.0.18","prettier":"^3.8.1","react-dom":"^19.2.8","@eslint/js":"^10.0.1","typescript":"^5.9.0","@types/node":"^25.3.3","better-auth":"1.6.23","@types/react":"^19","convex-helpers":"^0.1.100","typescript-eslint":"^8.56.1","@testing-library/react":"^16.3.2","@convex-dev/better-auth":"0.12.5"},"peerDependencies":{"next":">=15","react":">=18","convex":">=1.34.0","better-auth":"1.6.23","@convex-dev/better-auth":"0.12.5"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/better-auth-kit_0.4.2_1786696704906_0.7712502324245862","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Not maintained here anymore"}},"time":{"created":"2026-08-12T15:00:04.814Z","modified":"2026-09-18T12:22:20.741Z","0.2.0":"2026-08-12T15:00:05.154Z","0.2.2":"2026-08-12T15:11:24.762Z","0.2.3":"2026-08-12T15:56:13.945Z","0.3.0":"2026-08-12T16:12:41.680Z","0.4.0":"2026-08-12T22:16:31.030Z","0.4.1":"2026-08-12T22:31:08.034Z","0.4.2":"2026-08-14T08:38:25.037Z"},"bugs":{"url":"https://github.com/amadeni/better-auth-kit/issues"},"author":{"name":"Amadeni","email":"nicolai.hallberg@amadeni.ai"},"license":"MIT","homepage":"https://github.com/amadeni/better-auth-kit#readme","keywords":["better-auth","convex","nextjs","magic-link","typescript","library"],"repository":{"url":"git+https://github.com/amadeni/better-auth-kit.git","type":"git"},"description":"Shared Better Auth base for Amadeni Convex + Next.js apps: hardened options factory, magic link email, eligibility hooks, and Next.js glue","maintainers":[{"name":"amadeni_ai","email":"admin@amadeni.ai"}],"readme":"# @amadeni/better-auth-kit\n\nShared Better Auth base for Amadeni apps: Convex + Next.js, passwordless\nmagic link sign-in via Resend, closed registration with initial-admin\nbootstrap.\n\nThe kit extracts the hardened reference implementation into reusable\nbuilding blocks:\n\n- a hardened Better Auth options factory (`storeToken: 'hashed'`,\n  database-backed rate limiting — not overridable)\n- the branded German magic link email with the interstitial\n  `/login?token=…` flow (mail scanners cannot consume tokens)\n- eligibility hooks for `/sign-in/magic-link` **and** `/magic-link/verify`\n- the lazy-linking `user.onCreate` trigger (app users table stays the\n  source of truth)\n- Next.js middleware, catch-all route handlers, and server helpers\n- the fleet-wide email canonicalization and error codes with German\n  client-side messages\n\n## Install\n\n```bash\npnpm add @amadeni/better-auth-kit better-auth@1.6.23 @convex-dev/better-auth@0.12.5 convex\n```\n\n`react` and `next` are optional peers — only needed for the `./client` and\n`./next` entry points.\n\n## Entry points\n\n| Import                            | Runs in          | Contents                                                                      |\n| --------------------------------- | ---------------- | ----------------------------------------------------------------------------- |\n| `@amadeni/better-auth-kit`        | Convex functions | options factory, Resend sender, eligibility, lazy-link trigger, hashing, URLs |\n| `@amadeni/better-auth-kit/client` | Browser/React    | auth client factory, sign-in error parsing + German messages                  |\n| `@amadeni/better-auth-kit/next`   | Next.js server   | middleware, route decision, route handlers, auth server wrapper               |\n\nThe root entry never imports from `react` or `next`, so it is safe inside\nthe Convex component directory.\n\n## Recommended Setup\n\nThe Better Auth component is installed locally in the app repo — this\nscaffold stays in the app (generated code and app-specific wiring cannot\nlive in a package):\n\n```\nconvex/\n  auth.config.ts                 # getAuthConfigProvider()\n  auth.ts                        # runtime instance (see below)\n  betterAuth/\n    convex.config.ts             # defineComponent('betterAuth')\n    schema.ts                    # generated: npx auth generate --output ./schema.ts\n    adapter.ts                   # createApi(schema, () => options)\n    auth.ts                      # CLI-only betterAuth(options) for schema generation\n    _generated/                  # convex codegen\nsrc/\n  middleware.ts\n  app/api/auth/[...all]/route.ts\n```\n\n### `convex/betterAuth/authOptions.ts`\n\n```ts\nimport { createAmadeniAuthOptions } from '@amadeni/better-auth-kit';\nimport type { BetterAuthOptions } from 'better-auth/minimal';\n\nexport const createAuthOptions = createAmadeniAuthOptions;\n\n// Static options for schema generation and the component adapter only.\nexport const options = createAmadeniAuthOptions() as BetterAuthOptions;\n```\n\n### `convex/auth.ts`\n\n```ts\nimport {\n  AUTH_ERROR_CODES,\n  canonicalizeAuthEmail,\n  createAmadeniAuthOptions,\n  createEligibilityHook,\n  createLazyLinkTrigger,\n  createResendMagicLinkSender,\n  evaluateLoginEligibility,\n} from '@amadeni/better-auth-kit';\nimport { createClient, type GenericCtx } from '@convex-dev/better-auth';\nimport { getAuthConfigProvider } from '@convex-dev/better-auth/auth-config';\nimport { betterAuth } from 'better-auth/minimal';\nimport { components, internal } from './_generated/api';\nimport authSchema from './betterAuth/schema';\n\nconst linkUser = createLazyLinkTrigger({\n  findAppUserByEmail: async (ctx, email) =>\n    ctx.db\n      .query('users')\n      .withIndex('by_email', q => q.eq('email', email))\n      .unique(),\n  hasAnyAppUser: async ctx => (await ctx.db.query('users').first()) !== null,\n  linkComponentUser: async (ctx, { authUserId, appUserId }) => {\n    await ctx.runMutation(components.betterAuth.adapter.updateOne, {\n      input: {\n        model: 'user',\n        where: [{ field: '_id', value: authUserId }],\n        update: { userId: appUserId },\n      },\n    });\n  },\n  bootstrapInitialAdmin: async (ctx, { email }) =>\n    ctx.db.insert('users', { email, role: 'admin' }),\n});\n\nexport const authComponent = createClient(components.betterAuth, {\n  local: { schema: authSchema },\n  triggers: {\n    user: {\n      onCreate: async (ctx, authUser) => {\n        await linkUser(ctx, authUser);\n      },\n    },\n  },\n  authFunctions: internal.auth,\n});\n\nexport const createAuth = (ctx: GenericCtx<DataModel>) =>\n  betterAuth({\n    ...createAmadeniAuthOptions({\n      baseURL: process.env.SITE_URL,\n      authConfig: { providers: [getAuthConfigProvider()] },\n      sendMagicLink: createResendMagicLinkSender({\n        brand: {\n          productName: 'Example App',\n          from: 'Example App <noreply@mail.example.com>',\n        },\n      }),\n    }),\n    database: authComponent.adapter(ctx),\n    hooks: {\n      before: createEligibilityHook({\n        isEligible: async email =>\n          'runQuery' in ctx\n            ? ctx.runQuery(internal.auth.checkLoginEligibility, { email })\n            : // Fail closed: a context that cannot run the check must not\n              // let the request through.\n              { ok: false, error: AUTH_ERROR_CODES.SIGN_IN_LINK_UNAVAILABLE },\n      }),\n    },\n  });\n```\n\nImplement `checkLoginEligibility` as an `internalQuery` with\n`evaluateLoginEligibility` — same closed-registration rules as the trigger,\nchecked _before_ the email is sent.\n\n### `convex/auth.config.ts`\n\n```ts\nimport { getAuthConfigProvider } from '@convex-dev/better-auth/auth-config';\nimport type { AuthConfig } from 'convex/server';\n\nconst authConfig = {\n  providers: [getAuthConfigProvider()],\n} satisfies AuthConfig;\n\nexport default authConfig;\n```\n\n### `src/middleware.ts`\n\n```ts\nimport { createAuthNextMiddleware } from '@amadeni/better-auth-kit/next';\n\nexport default createAuthNextMiddleware();\n\n// Next.js statically parses `config` at build time — the matcher MUST be an\n// inline literal here; importing AUTH_MIDDLEWARE_MATCHER breaks `next build`.\nexport const config = {\n  matcher: ['/((?!.*\\\\..*|_next).*)', '/', '/(api|trpc)(.*)'],\n};\n```\n\nKeep the literal in sync with the kit via a drift-guard test:\n\n```ts\n// src/middleware.test.ts\nimport { AUTH_MIDDLEWARE_MATCHER } from '@amadeni/better-auth-kit/next';\nimport { config } from './middleware';\n\ntest('middleware matcher matches the kit constant', () => {\n  expect(config.matcher).toEqual(AUTH_MIDDLEWARE_MATCHER);\n});\n```\n\n### `src/app/api/auth/[...all]/route.ts`\n\n```ts\nimport { createAuthRouteHandlers } from '@amadeni/better-auth-kit/next';\nimport { authServer } from '@/lib/auth-server';\n\nexport const { GET, POST } = createAuthRouteHandlers(authServer.handler);\n```\n\n### `src/lib/auth-server.ts` and `src/lib/auth-client.ts`\n\n```ts\n// auth-server.ts\nimport { createAuthServer } from '@amadeni/better-auth-kit/next';\n\nexport const authServer = createAuthServer({\n  convexUrl: process.env.NEXT_PUBLIC_CONVEX_URL!,\n  convexSiteUrl: process.env.NEXT_PUBLIC_CONVEX_SITE_URL!,\n});\n\n// auth-client.ts\nimport { createAmadeniAuthClient } from '@amadeni/better-auth-kit/client';\n\nexport const authClient = createAmadeniAuthClient();\n```\n\n### Environment variables\n\n| Variable                      | Where             | Purpose                                                             |\n| ----------------------------- | ----------------- | ------------------------------------------------------------------- |\n| `SITE_URL`                    | Convex deployment | Public app URL; base for magic link URLs                            |\n| `BETTER_AUTH_SECRET`          | Convex deployment | Better Auth signing secret                                          |\n| `AUTH_RESEND_KEY`             | Convex deployment | Resend API key (fallbacks: `AUTH_RESEND_API_KEY`, `RESEND_API_KEY`) |\n| `INITIAL_ADMIN_EMAIL`         | Convex deployment | Bootstrap admin while the users table is empty                      |\n| `NEXT_PUBLIC_CONVEX_URL`      | Next.js           | Convex deployment URL (`*.convex.cloud`)                            |\n| `NEXT_PUBLIC_CONVEX_SITE_URL` | Next.js           | Convex HTTP actions URL (`*.convex.site`)                           |\n| `AMADENI_DEV_AUTH_ENABLED`    | Convex deployment | **Dev deployments only** — enables deterministic dev logins         |\n\n## Deterministic dev logins (`createDevAuth`)\n\n> **WARNING:** `AMADENI_DEV_AUTH_ENABLED=true` turns deployment env access\n> into login ability. It must NEVER be set on a production deployment.\n> `assertDevAuthEnabled` additionally refuses production-shaped\n> `CONVEX_DEPLOYMENT` values (`prod`, `prod:*`, `production:*`) even when\n> the flag leaks — but the flag simply has no business existing on prod.\n\nAutomated pipelines (visual review, e2e, `@amadeni/dev-contract`) need a\nlogin without an email round-trip. `createDevAuth` mints a single-use magic\nlink token and writes its **hashed** verification row directly into the\nBetter Auth component — the regular `/api/auth/magic-link/verify` endpoint\nthen completes the sign-in with real sessions and real cookies. No\nauth-config deviation, nothing to clean up.\n\n```ts\n// convex/dev/auth.ts — app wiring (generic factory, injected persistence)\nimport { v } from 'convex/values';\nimport {\n  createDevAuth,\n  requireDevAuthCliIdentity,\n} from '@amadeni/better-auth-kit';\nimport { action, internalMutation } from '../_generated/server';\nimport { components, internal } from '../_generated/api';\n\nconst devAuth = createDevAuth({\n  createVerification: (ctx, input) =>\n    ctx.runMutation(components.betterAuth.adapter.create, { input }),\n  // Ensure the app user exists and is eligible BEFORE the token is minted,\n  // otherwise the verify-time eligibility hook denies the login.\n  ensureUser: (ctx, { email, name }) =>\n    ctx.runMutation(internal.dev.auth.ensureDevUserInternal, { email, name }),\n  defaultEmail: 'dev@amadeni.local',\n});\n\nexport const createDevToken = action({\n  args: { email: v.optional(v.string()) },\n  handler: async (ctx, args) => {\n    // CLI-only surface: `convex run --identity '{\"issuer\": ..., \"subject\": ...}'`\n    await requireDevAuthCliIdentity(ctx, {\n      issuer: 'my-app-dev-auth',\n      subject: 'dev-auth-cli',\n    });\n    return await devAuth.issueToken(ctx, args); // gate + user + token\n  },\n});\n```\n\nConsume the token via `devAuth.buildVerifyUrl({ token, origin })` — a\n`fetch(url, { redirect: 'manual' })` returns the session cookies\n(`better-auth.session_token`, `better-auth.convex_jwt`) in `Set-Cookie`.\n`@amadeni/dev-contract` packages exactly this flow as a CLI with a\nverified-login readiness gate.\n\n## Resilient Convex token refresh (`createConvexTokenManager`)\n\nAfter laptop standby or a background tab the Convex JWT expires; on wake\nthe Convex reconnect races the token refresh, `getSession`-style requests\ncan hang on a half-dead network, and the Convex client never retries once\na token fetch returned `null` — users see error pages or a stuck\n\"renewing sign-in\" screen until they reload. The `/client` token manager\nfixes this fleet-wide:\n\n- **Proactive refresh** on `visibilitychange` → visible and `online`\n  events plus a background interval — the token is fresh again before\n  Convex reconnects.\n- **Stale-while-revalidate + backoff**: a not-yet-expired token keeps\n  being served while refreshes retry (1s/2s/5s/15s, each attempt capped\n  by a timeout). Unauthenticated is reported only once the token expired\n  AND retries are exhausted — or the backend answers 401/403.\n- **Automatic recovery**: after Convex gave up (saw `null`), the next\n  successful refresh bumps an auth epoch, which rotates the\n  `fetchAccessToken` identity and makes `ConvexProviderWithAuth` call\n  `client.setAuth` again — the automated version of \"reload fixes it\".\n\n```tsx\n// src/lib/convex-token.ts\nimport {\n  createBetterAuthTokenFetcher,\n  createConvexAuthHooks,\n  createConvexTokenManager,\n} from '@amadeni/better-auth-kit/client';\nimport { authClient } from './auth-client';\n\nexport const tokenManager = createConvexTokenManager({\n  fetchToken: createBetterAuthTokenFetcher(authClient),\n});\nexport const { useAuth, useAuthToken } = createConvexAuthHooks(tokenManager);\n\n// src/app/ConvexClientProvider.tsx\n<ConvexProviderWithAuth client={convex} useAuth={useAuth}>\n\n// Imperative consumers (HTTP uploads etc.):\nconst token = await tokenManager.getToken({ forceRefresh: gotA401 });\n\n// Intermediate states become visible only after a few seconds:\nconst showPending = useDelayedAuthPending(authLost, 3_000);\n```\n\nSeed the SSR token with `tokenManager.prime(initialToken)`; call\n`tokenManager.clear()` on explicit sign-out.\n\n## Security\n\nThis package is the auth base of the whole fleet, which makes it a\nsupply-chain target. Deliberate posture:\n\n- **Zero runtime dependencies.** Everything is a peer dependency the app\n  already ships. No postinstall scripts, no telemetry, and no network calls\n  except the single explicit `fetch` to `https://api.resend.com/emails` in\n  `createResendMagicLinkSender`.\n- **Exact peer pins for the auth stack.** `better-auth@1.6.23` and\n  `@convex-dev/better-auth@0.12.5` are pinned exactly: the kit mirrors\n  internals of these versions (token hashing, verification storage,\n  internal adapter lookups), and silent minor upgrades of an auth library\n  are a risk, not a feature. Upgrades happen as deliberate kit releases.\n- **Consumers cannot weaken the core.** `createAmadeniAuthOptions` always\n  sets `storeToken: 'hashed'` (a database leak must not leak live sign-in\n  tokens) and `rateLimit: { storage: 'database' }` (in-memory rate limiting\n  never fires on the stateless Convex runtime). The magic link and convex\n  plugins are always wired and cannot be replaced through `extraPlugins`:\n  Better Auth merges plugin endpoints last-wins (and only logs endpoint\n  conflicts), so the kit orders its plugins last and additionally throws if\n  an extra plugin carries the reserved id `magic-link` or `convex`.\n- **No open redirect through the envelope unwrap.** `unwrapRedirectEnvelope`\n  only issues redirects to the request's own origin (or origins explicitly\n  allow-listed via `allowedRedirectOrigins`); cross-origin envelopes pass\n  through unchanged.\n- **Scanner-proof links.** Emails link to the `/login?token=…` interstitial;\n  only an explicit user click consumes the token at the verify endpoint.\n- **Fail-closed verify re-check.** `createEligibilityHook` re-validates\n  eligibility on `/magic-link/verify` via the hashed-token lookup, so a user\n  deleted after the email was sent cannot complete the sign-in.\n\n## Development\n\n```bash\npnpm install\npnpm run ci    # prettier + eslint + tsc + cspell + vitest\n```\n\nReleases: `pnpm run release` (patch), `release:minor`, `release:major`.\n","readmeFilename":"README.md"}