{"_id":"@activescott/auth-adapter-react-router","_rev":"20-df950f5ba2373d9eeb035a354d69ba5c","name":"@activescott/auth-adapter-react-router","dist-tags":{"latest":"3.0.0"},"versions":{"0.1.1":{"name":"@activescott/auth-adapter-react-router","version":"0.1.1","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@0.1.1","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"7177fee9ef2a1873291cf0f85609a67ae6385cdb","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-0.1.1.tgz","fileCount":9,"integrity":"sha512-vc3XJb8tUO9uSIphuLVublioSoQto/S6tCNZtLdZvNC74JF1UFulfMbBjSOvXiBRxpUS5sSQMZjwGtqS5DYqdg==","signatures":[{"sig":"MEYCIQCQBsvewJ5z/P7bWakLpJXc2pj50s27ix93TSZ638HKfQIhAPF9Y6A+WdDP+zASeED5yeM81pPIBWr3Ph/KdOcki50n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21639},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"5a64c5f74cb44b53a723a3c507c43ee46ff256e5","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"activescott","email":"scott@willeke.com"},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"10.9.4","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.7.2","@types/node":"^22","react-router":"^7.13.0","@activescott/auth":"*"},"peerDependencies":{"react-router":"^7.0.0","@activescott/auth":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_0.1.1_1773687667063_0.295490420447158","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@activescott/auth-adapter-react-router","version":"0.1.3","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@0.1.3","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"f7a743cd31fb7474671acea6bbf4a3b96edaae92","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-0.1.3.tgz","fileCount":11,"integrity":"sha512-dHW9OyD8dYLkuy7s1y4DXVjCg9ETyUhD42dHn2o8DE1hf9jqGlQFkvYx+n924cRxHiIhmGyR5INvAVj1oHm5SQ==","signatures":[{"sig":"MEQCICPvfpkC6cnnCyk8wlt2gBVMdUd1RYbOe2T530LELNFuAiBmhpVWfcN0Uh4m4febnIv6RWUUVIxlwuMConbCvsAZkw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":26080},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"a6c9490bc1c9257189044f5bd9679791e3c91ee2","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.11.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.7.2","@types/node":"^22","react-router":"^7.13.0","@activescott/auth":"*"},"peerDependencies":{"react-router":"^7.0.0","@activescott/auth":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_0.1.3_1778342278342_0.04436175034741008","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@activescott/auth-adapter-react-router","version":"1.0.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@1.0.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"1f16c10c988689252094be6be68436565fd78735","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-1.0.0.tgz","fileCount":11,"integrity":"sha512-Ld2YhmJ11DxIGgJafN9akWe6WL7s9+k6zinGLBJdijzjOEeBYS0BQ9M2xYHWz6hAaGnfDc2vdqpIscbjtcvA7A==","signatures":[{"sig":"MEUCIQDnYuw4pY1sUnMVFadVoWPMVL1UjUy21Xi8cCaJ47WelwIgHgVvExJss3zI/H6yn7qmUb8d1sfd+QZtsO+wUEzFWuc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21177},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f36371d391dccd803c32ef2a75600e9b4a9e2111","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.16.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.7.2","@types/node":"^22","react-router":"^7.13.0","@activescott/auth":"*"},"peerDependencies":{"react-router":"^7.0.0","@activescott/auth":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_1.0.0_1785522237432_0.9822719219719676","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@activescott/auth-adapter-react-router","version":"1.0.1","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@1.0.1","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"9cabd3e1957961c3376b0d06b81cb73f7c286908","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-1.0.1.tgz","fileCount":11,"integrity":"sha512-IkK3Z3xP+dOJlmzx1ojIUhotbRiZbBntc3eThEY6wVK5R4t7/PDGv7OzMhat1fmYQmjZmSK7PRtNSVom4h/1gQ==","signatures":[{"sig":"MEUCIBdxItHKZKIHokiVyXNNP3z/6cvkWL9hMhgvCklAisDvAiEAs9V3UPDVb/Ad0LGJdEQr8r4x0ihlj8ehslGS/QYpu6c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21177},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"9405943132469bb2401e9ef502a324bc4906f4e4","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"activescott","email":"scott@willeke.com"},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"10.9.4","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.7.2","@types/node":"^22","react-router":"^7.13.0","@activescott/auth":"*"},"peerDependencies":{"react-router":"^7.0.0","@activescott/auth":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_1.0.1_1785610701071_0.01697816255468143","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@activescott/auth-adapter-react-router","version":"1.0.2","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@1.0.2","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"d14f3683cb674b2370ef3dd866f420217f086c53","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-1.0.2.tgz","fileCount":11,"integrity":"sha512-xRF5xxY0YSieGFCHVm+ts0i1IL85evr2fwpqpDi5roG/4safBM1jer7CO+i31fnrq65ENmQGBBedq+mnRkgatQ==","signatures":[{"sig":"MEUCIQCcXwH+KtvRvNzInaqNMEcejXplwMV7I9r44O6BYEKA9AIgRO7BaFt1LvM7SmJAPhIvoErcSq9zCkywtrcln8mg388=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21186},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"6a68731b0049689cc1610135731cbc228020c4f8","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.16.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.7.2","@types/node":"^22","react-router":"^8.3.0","@activescott/auth":"*"},"peerDependencies":{"react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_1.0.2_1785612284367_0.4559741977772904","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@activescott/auth-adapter-react-router","version":"1.0.3","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@1.0.3","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"083e47d3f880baf77b50b6e367bb81ea514de82b","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-1.0.3.tgz","fileCount":11,"integrity":"sha512-kZ2DTDOezxIWTkVHYgQMR6jcs9rOVmknuq3yobnd5uY2z4BxlFW0XR3dlrDAEXEXwbTpbhmsrFeoIUgPLM9erA==","signatures":[{"sig":"MEUCIHKE5XOz/9E6zvl7vOoEDHmDyWKhriD1nk6m+Dm/D87LAiEA42OcfadEcw6LfmAIH5OR87mJYBBSGaNA9RHuxIXddfw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21643},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"248dd93ce638d887a6732d0aca0c30a2aba866f8","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.16.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.7.2","@types/node":"^22","react-router":"^8.3.0","@activescott/auth":"*"},"peerDependencies":{"react-router":"^8.0.0","@activescott/auth":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_1.0.3_1785650596242_0.5034340018873507","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@activescott/auth-adapter-react-router","version":"1.0.4","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@1.0.4","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"50e8c73e2471b75693e2dc32241fe95eb6b80e10","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-1.0.4.tgz","fileCount":11,"integrity":"sha512-+du1Pl4wQqLlquQ7u92PsF34dCj1EE89gLoaA/0TSykT6/b7e9inCDtR6R1GWD/yZT1DJK2hIKPVfc4RjNzrhw==","signatures":[{"sig":"MEQCICfb1a+DofuYkIGU+QheZggqFKLv6RN2Ee8jaKV83JqLAiAvP8LLgAZEOyEHeX4w9bBkCfKbPcN/9B4dAtBuh7h0YQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21649},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"857dde22c82e6945acdb99e8677579fbc1484aee","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.16.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.7.2","@types/node":"^22","react-router":"^8.3.0","@activescott/auth":"*"},"peerDependencies":{"react-router":"^8.0.0","@activescott/auth":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_1.0.4_1785651665947_0.9122157181240145","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@activescott/auth-adapter-react-router","version":"1.0.5","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@1.0.5","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"538c8705309e8c8c1f241cddca283920b1057db1","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-1.0.5.tgz","fileCount":11,"integrity":"sha512-yMcdY4NPW27MfZsf5DggxVPTq74HKnQjIxde5af4Z6xZAS3ZARZ0ONrp7t1UwvZ0Wv532T/cvgWMTjpZoipoGg==","signatures":[{"sig":"MEQCIHWsF0e47v8rpqUSJZ1lAwnDMG00GcGlPhGUgn1Fbrj+AiAF2j3sDSFTa553YYUvsqMwuKuuo97ETlihOSOiiUYjRA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21809},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"41ef582ee55216fc694ad9ce837aa8c6b9cb0724","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.16.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.7.2","@types/node":"^22","react-router":"^8.3.0","@activescott/auth":"*"},"peerDependencies":{"react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_1.0.5_1786000841549_0.27284848377040527","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@activescott/auth-adapter-react-router","version":"1.1.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@1.1.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"827b1e066c0ec6b973a8667e53b52ab62868e39c","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-1.1.0.tgz","fileCount":11,"integrity":"sha512-IXspzdDPHoae7rQDwaU9BJF/ho/xlZr5pjhPTi3mgGuRKY7BGvznAHnrHaN7TkxfAXvRjR+M0WB92xk8zeZKhA==","signatures":[{"sig":"MEUCIGxXGAR7rRfYjGprzh0hNKsazH3743EhpHW2NIrRv4wjAiEA+JIOLfrUpQtnxxzvTMduzNNjVpssFujP/IJAkKvCwhg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22784},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"43c5ff808ce2638b7f477287d56cc591d157b510","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.16.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.7.2","@types/node":"^22","react-router":"^8.3.0","@activescott/auth":"*"},"peerDependencies":{"react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_1.1.0_1786087432665_0.3386250328175626","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@activescott/auth-adapter-react-router","version":"1.2.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@1.2.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"e4925d756a02bd80b445ae15d363c74add848818","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-1.2.0.tgz","fileCount":47,"integrity":"sha512-c9rBR4Ws0b2YMKX6zocJrT0o/dTZOJAc61cSA5lG6UKtBvJsCD8DBYoRUwnVD9D5nFMnadNABTVOq4ID38tjYA==","signatures":[{"sig":"MEYCIQCYhZo5bl5XWPimvINDQtFztqR0IwaO+30Vb0g8G35L1wIhAN5ZNWHUN1ueH4GWvFWZUoBdBIqDHj67G+VYi5ARBXf6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116329},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"}},"gitHead":"843a5ec640514b2cda1ca6de8c63eec0ef9a69ed","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.16.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.0.16","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^4.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_1.2.0_1786208138446_0.8847139558837067","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@activescott/auth-adapter-react-router","version":"1.3.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@1.3.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"d5e2f45e1b6ee6300862301f8ecdda17d8bfe70b","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-1.3.0.tgz","fileCount":47,"integrity":"sha512-KuPwgI+HVanNzDb+70LAr2Lij/oZtXnfNkuHTVxn1SB9D16bzAdYybu9P+6n0w9Hz9KcH2UehZOVlIfVw5akxg==","signatures":[{"sig":"MEUCIQCyfe2P6W0/TrO8Z/EDe/slEIP3WIk5JakLY0znIEaQgQIgFG79LrQpO6fXTQToqNz87fY8uR5o2IdTp+bIN9eQ0Ys=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":116894},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"}},"gitHead":"a1933ba2887884db3a1437db58c8fa323b6a32c2","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.16.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.0.16","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^4.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_1.3.0_1786467131684_0.28490400630252477","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@activescott/auth-adapter-react-router","version":"2.0.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@2.0.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"0ed4c73a516ab03ee4eb07be2b3cc0bbc5662a8c","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-2.0.0.tgz","fileCount":47,"integrity":"sha512-qyg/wZhKlyRj7AjcspE2OcH6gEmafVA3d5Yf173EqqcNuHkOtrnjZQxswQtW/zNsgpD59/RX2aOnfxkI03yUsQ==","signatures":[{"sig":"MEUCIC4wqg3+ErEUDbdmJQ6qr3Qpp+GUouQZg/x4v9Wcyl2iAiEAyRMA/3u0wyWXO3Je5vGqNnih1L89Y3bxETVqbnAuqEA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":114432},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"}},"gitHead":"f52acc55d81da8a0b3f8cbe8314f9b65ac02bc9c","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.16.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.0.16","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^5.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_2.0.0_1786467602265_0.3341507648893134","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@activescott/auth-adapter-react-router","version":"2.1.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@2.1.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"bed8a9da68c56cacfc1e9c8f45fa422ce033640a","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-2.1.0.tgz","fileCount":47,"integrity":"sha512-MARbh3vY7gmyn7QqTulaq7nOo4on89qEaVvsQGgDcGfoDRyHiS6R8aBMSyceL+MrZQhC2Nx+afl+VErOVVhYKQ==","signatures":[{"sig":"MEUCIC+2lO19VPJJSU/AoJudr5z8ew0/sRjIvvvMeHXu/WxXAiEA+gLckSb/Jh0RqeAyfTicZEqA3sS7hYHGKUW0OsKWjNg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBxtoW7SD5Xrg41Py9p17sltUAXw4X6LWL156F+y1B8ZAiEA727xjLeGMde9AhaGJIduP+tHV499bsgm4NRuyFKG7mM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":114965},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"}},"gitHead":"4a5a69387f1b9f5148cae5735c125ab0f23577f0","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.19.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.1.11","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^5.0.1"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_2.1.0_1789757203101_0.29526988633960327","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@activescott/auth-adapter-react-router","version":"2.2.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@2.2.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"a81a4f85ad00ecce569d0b46628fcc5f729d0739","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-2.2.0.tgz","fileCount":47,"integrity":"sha512-My4Mv6PwExwaMsYkLMN5xS3lw9guz0LBV9JMG1Xb+lzivZKMCL5i5zcj0NLtsvD85bYROCplsPq16UPweBvlYA==","signatures":[{"sig":"MEUCIDb+5Ig1MbRyy6TOoNc3P7E2pVoSCEv3+nKNu9K+TZeRAiEApeXJtvb8n3c4tlVakLQux1+Kj+10p0Sb+jVrXWsZw5Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDPWRxw/6q474LW9vX0hfOUJ1fDIsx+7xCMtjpt8ezpaQIgA6iY0sXHxMs6Rt5LBXeTYA+iiJ2bRng0v6BF03lXuUY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":120859},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"}},"gitHead":"36f43637df4db380565f1921b5854a248f9c9c4e","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.19.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.1.11","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^5.0.1"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_2.2.0_1789763494273_0.568386239701284","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@activescott/auth-adapter-react-router","version":"2.3.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@2.3.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"b31994f9aa6a5936162bc460d0e2d5e92d011de6","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-2.3.0.tgz","fileCount":47,"integrity":"sha512-Jb51VCl3bzoLlCyPR0oRLA2gi+yugsWLYUUJ7TdgHTzyMfuJknEI8hg8MEU5WlZpGp3e4poPJF+x/xHFOWoVjQ==","signatures":[{"sig":"MEYCIQDelHRxLtNfH5pY2UaE8wa4KqKFzuFbZ4hbtwrKGHNDIgIhAP+6QFREu8MuMWRn0aPEF3zA9lXSnOwZnD02s1tvAVbu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD0U/+hQREMTYlFKKWfacfEOKWPzA59ZWDPqyqZimYhjQIhAKvleLQsh5ARpdXymKFnpl+CQFRIxLLOywgIksFDJWQw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":125728},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"}},"gitHead":"51982dc07b7eae322c66dfaded18e7fa584330d0","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.19.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.1.11","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^5.0.1"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_2.3.0_1789768957273_0.6960440764019884","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@activescott/auth-adapter-react-router","version":"2.4.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@2.4.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"b6b2a02edc2494f8faec29bb085b16a475eb7d41","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-2.4.0.tgz","fileCount":51,"integrity":"sha512-gdaCLnce3K5+Abm+EXtMXZGnApYqQow0Wwq2jNtvPvpCrtlSLGtGMg0+h++hvWwC3lu0K99g2YDzRk61PLj+gw==","signatures":[{"sig":"MEUCIQDja+9esAldRIaUNVhlHZn76SCl/HiFdPjJjxIcdDqDpAIgbryPu1/P5W2MmnsXO3+2buIHXqz57iFnfuFuCJMOEPM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC1ZBW0qChWVFESOovEGozgpaW3DP1YzMrKYx+84jypiAiEA2INRISpfgl72cFr0fF9aREWlY7sLUEUkDoA3nfdISLg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@2.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":137533},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"gitHead":"fdbe3b695903042b26a5de9abd6f9b339552b003","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.19.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.1.11","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^5.0.1"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_2.4.0_1789802583156_0.5512626998943395","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@activescott/auth-adapter-react-router","version":"2.5.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@2.5.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"9a45958a3d377c66f10a6edf242fbbfb55264ef4","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-2.5.0.tgz","fileCount":79,"integrity":"sha512-ijnmMPG+URDzMd5rJu4hxzM8iHyKqZyYd1O7gQHciKdem6H8BPV+Z4ghc4JRnq7LpIu3WrX35cJTozj85ncB1Q==","signatures":[{"sig":"MEUCIQCJfUNfQKo2PIMB3xVPlP/aDevjdHEq6Udmw11pWuYymgIgRKrmaBZfwnVtzYMkJKKT+HB4VzD5jViDe1CqwlQybek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDTIuTXILfF1flmNjTtmPyvRXPIVrOq6GidPWFLqNGHmAIgTtJJiMdxs6gfwPwKyyOKB9EG1pcV27NJtJiR3VBy/Iw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@2.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":191802},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"gitHead":"52579085546b9e788ebe6b2a8c494870b5e5f1a6","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.19.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.1.11","happy-dom":"^20.14.5","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^5.2.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_2.5.0_1789869743819_0.04947937850293149","host":"s3://npm-registry-packages-npm-production"}},"2.5.1":{"name":"@activescott/auth-adapter-react-router","version":"2.5.1","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@2.5.1","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"7314e6b00b6565b9a1464bbc55fea0aa92843f90","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-2.5.1.tgz","fileCount":83,"integrity":"sha512-AniJHu4MuNY+y5u8A+zDNRdth9OybFbNijm85ZtwLewLOAFTGqJ51avVEfNLVo6oSrbTiPhYKoeDnu8nxc3R8A==","signatures":[{"sig":"MEYCIQDAyTfQf+oeKQGIxFdr8R2h3wzMemquiNxAZRd0vHUAbwIhANwG3ZZ8mDumcQgQbCsPUDOQldRnQ/ZTgZPHVwjbzNzK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCzChe9e2dLD5DHbqMfU3SyCIaMUH6Tkz2JSM0Obc4suQIgbu4HB4JvjByxgZ8qCVmV6TYkr1p+ULlvNevPGFxsPL0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@2.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":196905},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"gitHead":"0ac4fb6b15f7be472d6dc2837b4c42bc6892675a","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.19.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.1.11","happy-dom":"^20.14.5","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^5.2.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_2.5.1_1789870132358_0.39333228350416927","host":"s3://npm-registry-packages-npm-production"}},"2.6.0":{"name":"@activescott/auth-adapter-react-router","version":"2.6.0","keywords":["auth","authentication","react-router","remix"],"author":{"name":"Scott Willeke"},"license":"MIT","_id":"@activescott/auth-adapter-react-router@2.6.0","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"homepage":"https://github.com/activescott/auth#readme","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"b4e78778f51f7df72c8bded9ea250394efe18b82","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-2.6.0.tgz","fileCount":123,"integrity":"sha512-I1TrJIvb6r3HHMnHJUfoHveOQMDs3AC3JkKJ4lsFbBDq5dl5JU6CxxO35ohJtSzPkogjsAPIMXN3mDgwnsZQDw==","signatures":[{"sig":"MEUCIQDPO8NX6lMjXEtIBgfS1mmZg3vUa51AJZv3gTUbegghmAIgUOWb0n8zSoZxEm+gr+CvjjVm6VnsqjrqxtdOqHoItjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDqLCPZXqsdlhfH4d+h9oC1uFm1VtMlYU41ZN0PEXuDKwIhALSN650jva1bHwY/13uRMhW7F2RGt6FGePX30FSxowW+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@2.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":288912},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.js"},"./profile":{"types":"./dist/profile/index.d.ts","import":"./dist/profile/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"gitHead":"730875a88ea96295b807799b8abdf781e2d14dbb","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.19.0","description":"React Router adapter for @activescott/auth","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.1.11","happy-dom":"^20.14.5","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^5.2.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-adapter-react-router_2.6.0_1789888580471_0.7568424998037369","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"_id":"@activescott/auth-adapter-react-router@3.0.0","bugs":{"url":"https://github.com/activescott/auth/issues"},"dist":{"shasum":"905639b919182913fa585de25d35152e114456d0","tarball":"https://registry.npmjs.org/@activescott/auth-adapter-react-router/-/auth-adapter-react-router-3.0.0.tgz","fileCount":127,"integrity":"sha512-RAO6vZP+1x+U8PM2RbIFJK0mp6bH6hmy9TX66KKA1PVHGEceMCgH3AFArc/JQd0a8DgCXn0tBi2wKYu069vc1w==","signatures":[{"sig":"MEUCIQDzUp/r4kFerW/i2zQD4HkvZZWSVnSnzmAPNbwXw/JPVQIgVYz/3XUeCyG05PRF8XXfeF+2cQHEp+y0j1lFbVM+4EA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFO9vVUZ7468BCvS9UO3AQj/FagmYMFwwJxj3O9CvFMzAiEA/g4p+629VeyyRE53Dx54xC2PUVW1ffbtNYT6eYs2tSk="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@activescott%2fauth-adapter-react-router@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":295752},"main":"./dist/index.js","name":"@activescott/auth-adapter-react-router","type":"module","types":"./dist/index.d.ts","author":{"name":"Scott Willeke"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./admin":{"types":"./dist/admin/index.d.ts","import":"./dist/admin/index.js"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client/index.js"},"./profile":{"types":"./dist/profile/index.d.ts","import":"./dist/profile/index.js"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js"}},"gitHead":"97f10f8ff3bb8af03aadf6baafe4f7dd0a7ed7d4","license":"MIT","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"version":"3.0.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:acc1a3c0-da07-4028-b6f3-0f55da247e17"}},"homepage":"https://github.com/activescott/auth#readme","keywords":["auth","authentication","react-router","remix"],"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"_npmVersion":"11.19.0","description":"React Router adapter for @activescott/auth","directories":{},"maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.6","vitest":"^4.1.11","happy-dom":"^20.14.5","react-dom":"^19.2.6","typescript":"^5.7.2","@types/node":"^22","@types/react":"^19.2.0","react-router":"^8.3.0","@types/react-dom":"^19.2.0","@activescott/auth":"*"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@activescott/auth":"^5.2.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/auth-adapter-react-router_3.0.0_1789958020288_0.7656808535820618"}}},"time":{"created":"2026-03-16T19:01:06.967Z","modified":"2026-09-21T02:33:40.667Z","0.1.1":"2026-03-16T19:01:07.206Z","0.1.3":"2026-05-09T15:57:58.483Z","1.0.0":"2026-07-31T18:23:57.569Z","1.0.1":"2026-08-01T18:58:21.216Z","1.0.2":"2026-08-01T19:24:44.506Z","1.0.3":"2026-08-02T06:03:16.375Z","1.0.4":"2026-08-02T06:21:06.095Z","1.0.5":"2026-08-06T07:20:41.667Z","1.1.0":"2026-08-07T07:23:52.818Z","1.2.0":"2026-08-08T16:55:38.571Z","1.3.0":"2026-08-11T16:52:11.822Z","2.0.0":"2026-08-11T17:00:02.411Z","2.1.0":"2026-09-18T18:46:43.187Z","2.2.0":"2026-09-18T20:31:34.362Z","2.3.0":"2026-09-18T22:02:37.367Z","2.4.0":"2026-09-19T07:23:03.253Z","2.5.0":"2026-09-20T02:02:23.925Z","2.5.1":"2026-09-20T02:08:52.455Z","2.6.0":"2026-09-20T07:16:20.569Z","3.0.0":"2026-09-21T02:33:40.372Z"},"bugs":{"url":"https://github.com/activescott/auth/issues"},"author":{"name":"Scott Willeke"},"license":"MIT","homepage":"https://github.com/activescott/auth#readme","keywords":["auth","authentication","react-router","remix"],"repository":{"url":"git+https://github.com/activescott/auth.git","type":"git","directory":"packages/auth-adapter-react-router"},"description":"React Router adapter for @activescott/auth","maintainers":[{"name":"activescott","email":"scott@willeke.com"}],"readme":"# @activescott/auth-adapter-react-router\n\n[![npm version](https://img.shields.io/npm/v/@activescott/auth-adapter-react-router.svg)](https://www.npmjs.com/package/@activescott/auth-adapter-react-router)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nReact Router adapter (v7 and v8) for [`@activescott/auth`](https://www.npmjs.com/package/@activescott/auth). Wraps the framework-agnostic `Auth` class in handlers that read/write standard `Request` and `Response` objects — exactly what React Router loaders and actions return.\n\nThe adapter imports nothing from `react-router`; it only speaks Fetch `Request`/`Response`, so the same build works on both major versions. That holds for the admin pages too — they are React components that emit plain anchors unless you hand them your router's `Link`.\n\nUsed in production by [ramblefeed.com](https://ramblefeed.com) and [tinkerbellbot.com](https://tinkerbellbot.com).\n\n## Install\n\n```bash\nnpm install @activescott/auth @activescott/auth-provider-email @activescott/auth-adapter-react-router\n```\n\n## Usage\n\n```ts\n// app/lib/auth.server.ts\nimport { Auth } from \"@activescott/auth\"\nimport { EmailProvider } from \"@activescott/auth-provider-email\"\nimport { createAuthHandlers } from \"@activescott/auth-adapter-react-router\"\n\nexport const auth = new Auth({/* ...session, stores, providers... */})\n\nexport const { handleAuth, getSession, requireAuth, optionalAuth, logout } =\n  createAuthHandlers(auth, {\n    successRedirect: \"/\",\n    errorRedirect: \"/login\",\n    loginUrl: \"/login\",\n  })\n```\n\n`errorRedirect` as a string appends `?error=<code>` to that path, which discards whatever query the form was submitted from. If your login page keeps state in the query — a `?via=sms` tab selection, say — a failed code would be answered on the wrong tab. The function form receives the failing request, so core's `buildReturnUrl` can send the browser back to the exact page it posted from:\n\n```ts\nimport { buildReturnUrl } from \"@activescott/auth\"\n\nerrorRedirect: (error, request) =>\n  buildReturnUrl(request, { error: error.code })\n```\n\nThen add a single catch-all route at `app/routes/auth.$provider.$action.tsx` that handles every provider's HTTP endpoints:\n\n```tsx\nimport { handleAuth } from \"~/lib/auth.server\"\nimport type { Route } from \"./+types/auth.$provider.$action\"\n\nexport const loader = ({ request }: Route.LoaderArgs) => handleAuth({ request })\nexport const action = ({ request }: Route.ActionArgs) => handleAuth({ request })\n```\n\nThis one file covers `/auth/<provider>/<action>` for every registered provider — e.g. `POST /auth/email/initiate` (your login form posts here), `GET /auth/email/verify?...` (magic-link confirm page), `POST /auth/email/verify` (link redemption or code entry), `/auth/sms/...`, `/auth/passkey/...`, etc. `handleAuth` dispatches to the right provider, runs `verify` or `initiate`, sets/clears the session cookie, and returns a redirect — or passes through a page the provider renders (like the magic-link confirm page).\n\nThat route has no component, which makes it a resource route, and react-router runs its `Origin` check on document and single-fetch actions only. So `handleAuth` runs the check itself: a POST carrying an `Origin` that is not this app's is answered 400, a request with no `Origin` passes (as react-router does), and GET is untouched. A logout route is a resource route for the same reason, so `logout` takes the request and runs the same check:\n\n```tsx\nimport { logout } from \"~/lib/auth.server\"\nimport type { Route } from \"./+types/logout\"\n\nexport function action({ request }: Route.ActionArgs) {\n  return logout(request, \"/\")\n}\n```\n\nThe comparison is against `request.url`, so behind a proxy that terminates TLS the app still has to trust the proxy (`app.set(\"trust proxy\", 1)` in express), or every post from the browser looks cross-origin.\n\nProtect any loader with `requireAuth(request)`:\n\n```tsx\nexport async function loader({ request }: Route.LoaderArgs) {\n  const user = await requireAuth(request) // redirects to /login if no session\n  return { user }\n}\n```\n\n## Per-request checks\n\nApps usually have a rule about who may hold a session beyond \"the cookie verifies\": approved accounts only, not the ones you blocked this morning. `onSessionVerified` runs on every session `getSession`, `requireAuth` and `optionalAuth` verify, after `mapUser`. Return or throw a `Response` and the request is bounced with it; return nothing and the session goes on to your loader:\n\n```ts\nexport const { requireAuth, optionalAuth, clearSessionCookie, logout } =\n  createAuthHandlers<AppUser>(auth, {\n    mapUser,\n    onSessionVerified: ({ user }) => {\n      if (user.status === \"BLOCKED\") {\n        return redirect(\"/login\", {\n          headers: { \"Set-Cookie\": auth.destroySessionCookie() },\n        })\n      }\n      if (user.status === \"PENDING\") return redirect(\"/waitlist\")\n    },\n  })\n```\n\nThat replaces the wrapper apps write around `requireAuth` to re-read the user and act on what they find, and because it runs in `optionalAuth` and `getSession` too, a page that renders for signed-out visitors gets the same rule for free. Set `session: { cacheTtlMs: 0 }` on the `Auth` config with it: the hook's `user` is whatever `verifySession` returned, which by default may be up to two minutes old.\n\nIt does not run in `renewSessionCookie` or `refreshSessionCookie`, which re-issue a cookie for a session a loader already accepted.\n\n`clearSessionCookie()` returns the `Set-Cookie` value that expires the session cookie, for when you want the header rather than the redirect `logout` wraps it in.\n\n## Rolling sessions\n\nA session expires `maxAge` after it was issued, whether or not the visitor is still using the app. Set `session.renewAfter` and call `renewSessionCookie` from your root loader to re-issue the cookie once it passes that age, so people who keep visiting stay signed in and idle sessions still expire on schedule:\n\n```ts\nexport const { renewSessionCookie, ...handlers } = createAuthHandlers(auth, {\n  session: { renewAfter: \"7d\" }, // well inside the \"30d\" maxAge\n})\n\n// app/root.tsx\nexport async function loader({ request }: Route.LoaderArgs) {\n  const user = await optionalAuth(request)\n  const loaderData = { user }\n\n  const cookie = user && (await renewSessionCookie(request, user))\n  return cookie\n    ? data(loaderData, { headers: { \"Set-Cookie\": cookie } })\n    : loaderData\n}\n```\n\n`renewSessionCookie` returns null when the session is still fresh, so the common case sets no header. It throws if you call it without configuring `session.renewAfter`. To update the session because the user's own data changed (a new handle, say) rather than because it is old, use `refreshSessionCookie`, which re-issues unconditionally.\n\n## API\n\n| Export                                 | Purpose                                                                                                                                |\n| -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |\n| `createAuthHandlers`                   | Returns `{ handleAuth, getSession, requireAuth, optionalAuth, renewSessionCookie, refreshSessionCookie, clearSessionCookie, logout }`. |\n| `createAuthPageLoaders`                | Returns `{ signInLoader, profileAuthLoader, listSignInMethods }`. See [Sign-in and profile pages](#sign-in-and-profile-pages).         |\n| Hooks (from `./client`)                | `useTurnstile`, `usePasskeySignIn`, `useRegisterPasskey`, `useOtpAutoSubmit`, `usePreservedInput`.                                     |\n| `createAdminHandlers` (from `./admin`) | Returns `{ requireAdmin, adminUsersLoader, adminConfigLoader }`.                                                                       |\n| `AdminUsersPage`, `AdminConfigPage`    | The admin pages, from `./admin`.                                                                                                       |\n| `ProfilePage` (from `./profile`)       | The profile page, and `AccountSummary`, `SignInMethods`, `Passkeys` separately. See [Profile page](#profile-page).                     |\n\nLogin pages need no action of their own: post the email form directly to `/auth/email/initiate` (the provider redirects back with `?sent=1`) and the code form to `/auth/email/verify`.\n\n`createAuthHandlers<TUser>` is generic over your application's user type. Pass a `mapUser` to get a typed `requireAuth<TUser>` / `optionalAuth<TUser>` instead of the bare `AuthUser`.\n\n## Sign-in and profile pages\n\nThe adapter ships the logic of a sign-in page and a profile page's sign-in methods section, and leaves the markup to you. The loaders run on the server and read what the providers put in the query string on the way back; the hooks run in the browser. The profile page's markup ships too, as components: see [Profile page](#profile-page).\n\n```ts\n// app/lib/auth.server.ts\nimport { createAuthPageLoaders } from \"@activescott/auth-adapter-react-router\"\nimport { listPasskeys } from \"@activescott/auth-provider-passkey\" // only if you use passkeys\n\nexport const { signInLoader, profileAuthLoader } = createAuthPageLoaders(auth, {\n  turnstileSiteKey: process.env.TURNSTILE_SITE_KEY,\n  listPasskeys,\n  errorMessages: { blocked: \"Your account has been blocked.\" },\n})\n```\n\n`signInLoader(request)` returns `{ via, sent, error, errorCode, redirectTo, formToken, turnstileSiteKey }`: which provider's form to show, whether the message went out, the message for `?error=`, a same-origin `redirectTo` or null, and the signed form token the abuse checks expect under `FORM_TOKEN_FIELD`. `profileAuthLoader(userId, request)` returns `{ identities, passkeys, linkFlow }`, where `linkFlow` is the add-a-sign-in-method flow: the open form (`?add=`), `sent`, `linked`, `merged`, and `conflict`, the provider whose `link-merge` redeems the merge ticket after an `IDENTITY_CONFLICT`. It takes that provider from `?provider=`, else `?add=`, so put `?add=` in the verify step's `redirectTo`. `errorMessages` adds codes the library does not know, such as an initiate gate's, and rewords any it does; both loaders also take it per call.\n\nThe hooks are at the `./client` subpath and need React, not React Router:\n\n| Hook                                           | For                                                                                                                                                   |\n| ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `useTurnstile(siteKey)`                        | Renders the Turnstile widget into `containerRef` and reports `ready`; disable submit until then. Reports `\"failed\"` after 20 seconds without a token. |\n| `usePasskeySignIn({ client, redirectTo })`     | `signIn` for the passkey button; a full page load of `redirectTo` on success. `autofill: true` adds conditional UI.                                   |\n| `useRegisterPasskey({ client, onRegistered })` | `register` for \"Add a passkey\"; pass `useRevalidator().revalidate` as `onRegistered`.                                                                 |\n| `useOtpAutoSubmit(length)`                     | `inputProps` for the code field (autofill attributes included) that submit the form when the last digit lands.                                        |\n| `usePreservedInput(key)`                       | Keeps the typed address or number across the round trip through the auth routes, in sessionStorage.                                                   |\n\nThe passkey hooks take `createPasskeyClient()` from `@activescott/auth-provider-passkey/browser` as `client`, so apps without passkeys never install the WebAuthn library. A Turnstile token matters more than it looks: a form posted without one is blocked, and the block answers exactly like a successful send, so the user waits for an email that never comes.\n\n[`examples/react-router`](https://github.com/activescott/auth/tree/main/examples/react-router) uses all of them: `app/routes/login.tsx` and `app/routes/dashboard.tsx`.\n\n## Profile page\n\nA profile page is the same page in every app, so the adapter ships one at the `./profile` subpath. `ProfilePage` renders the account summary, the sign-in methods and the passkeys; it takes what `profileAuthLoader` returns.\n\n```tsx\n// app/routes/profile.tsx\nimport { Link, useRevalidator } from \"react-router\"\nimport { ProfilePage } from \"@activescott/auth-adapter-react-router/profile\"\nimport { profileAuthLoader, requireAuth } from \"~/lib/auth.server\"\nimport { passkeys } from \"~/lib/passkeys\"\n\nexport async function loader({ request }: Route.LoaderArgs) {\n  const user = await requireAuth(request)\n  return {\n    email: user.email,\n    memberSince: user.createdAt.toISOString(),\n    ...(await profileAuthLoader(user.id, request)),\n  }\n}\n\nexport default function Profile({ loaderData }: Route.ComponentProps) {\n  const revalidator = useRevalidator()\n  return (\n    <ProfilePage\n      {...loaderData}\n      addMethods={[\n        { provider: \"email\" },\n        { provider: \"sms\", callingCode: \"+1\" },\n      ]}\n      passkeyClient={passkeys}\n      onPasskeyRegistered={revalidator.revalidate}\n      linkComponent={Link}\n    />\n  )\n}\n```\n\n`addMethods` is what the page offers to add, in the order the links appear; it offers nothing by default, and drops a provider the account already signs in with unless the entry sets `allowMultiple`. `callingCode` makes the field take a national number and submit the full E.164 one. `allowMerge` turns an `IDENTITY_CONFLICT` into an offer to merge the two accounts rather than an error, so set it only where your `UserStore.onMerge` merges.\n\nAn application with sections of its own renders the blocks directly, in whatever order, with whatever between them:\n\n```tsx\n<AccountSummary email={user.email} entries={[{ label: \"Handle\", value: user.handle }]} />\n<HandleSection handle={user.handle} />\n<SignInMethods identities={identities} linkFlow={linkFlow} addMethods={addMethods} linkComponent={Link} />\n<Passkeys passkeys={passkeys} client={passkeyClient} onRegistered={revalidator.revalidate} />\n```\n\n### Styling\n\nEvery block takes `classNames`, one class per slot: `card`, `cardBody`, `cardTitle`, `table`, `th`, `td`, `field`, `label`, `input`, `submitButton`, `success` and the rest of `ProfileClassNames`. A slot you name gets your class and none of the built-in styling, because an inline style outranks any class it would otherwise compete with; slots you say nothing about keep the plain built-in look, and `includeDefaultStyles={false}` drops that everywhere.\n\nThat means a half-named map is a half-styled page, and there are 34 slots. On Bootstrap, pass the map the package ships instead:\n\n```tsx\nimport {\n  BOOTSTRAP_PROFILE_CLASS_NAMES,\n  ProfilePage,\n} from \"@activescott/auth-adapter-react-router/profile\"\n\n;<ProfilePage {...loaderData} classNames={BOOTSTRAP_PROFILE_CLASS_NAMES} />\n```\n\nSpread it to change a slot and keep the rest: `{ ...BOOTSTRAP_PROFILE_CLASS_NAMES, title: \"fw-bold text-primary mb-4\" }`. It is typed `Required<ProfileClassNames>`, so a slot added later has to be given a class before the package builds.\n\nFor another framework, write the map yourself. An empty string is a slot you own but want no class on, the way Bootstrap's `.table` reaches its own cells: it drops the built-in style without adding an attribute.\n\nAnnouncements are in the markup rather than in `classNames`, since a class cannot add one: a failure or a caution carries `role=\"alert\"`, a confirmation `role=\"status\"`, and a message about the address or the code you typed is tied to that field with `aria-invalid` and `aria-describedby`.\n\nThe blocks import React but nothing from `react-router`, so links go through the optional `linkComponent`; without it they are plain anchors, which navigate the whole document. The forms are plain `<form>` elements on purpose: each step of an add-a-sign-in-method flow is a document POST the auth routes answer with a redirect, which is what lets the flow's state live in the URL.\n\n## Admin dashboard\n\nA read-only users page and configuration page, at the `./admin` subpath so apps that do not use them never load React:\n\n```tsx\n// app/lib/auth.server.ts\nimport { createAdminHandlers } from \"@activescott/auth-adapter-react-router/admin\"\n\nexport const { adminUsersLoader, adminConfigLoader } = createAdminHandlers(\n  auth,\n  {\n    requireAuth,\n    admins: process.env.AUTH_ADMIN_IDENTIFIERS,\n  },\n)\n\n// app/routes/admin.users.tsx\nimport { Link } from \"react-router\"\nimport { AdminUsersPage } from \"@activescott/auth-adapter-react-router/admin\"\n\nexport const loader = ({ request }: Route.LoaderArgs) =>\n  adminUsersLoader({ request })\n\nexport default function AdminUsers({ loaderData }: Route.ComponentProps) {\n  return <AdminUsersPage data={loaderData} linkComponent={Link} />\n}\n```\n\nThe users page needs `UserStore.listUsers`, which is optional and which your application implements; put anything you want as an extra column into each user's `metadata` and describe it with `metadataColumns`. Access is an allowlist of email addresses and phone numbers (`AUTH_ADMIN_IDENTIFIERS` by default) that admits nobody when unset; non-admins get a 404.\n\nFull walkthrough: [Admin dashboard](https://github.com/activescott/auth#admin-dashboard).\n\n## E2e code readback\n\n`createCaptureReadbackLoader`, at the `./testing` subpath, is a resource-route loader that hands the last captured sign-in email or SMS to your e2e tests, so they can sign in without an inbox or a phone. Wrap your transports in `CaptureEmailTransport` / `CaptureSmsTransport` (from each provider's `/testing` subpath) under the same test-mode flag:\n\n```ts\n// app/routes/e2e.otp-code.tsx\nimport { createCaptureReadbackLoader } from \"@activescott/auth-adapter-react-router/testing\"\n\nexport const loader = createCaptureReadbackLoader({\n  transports: { email: captureEmailTransport, sms: captureSmsTransport },\n  enabled: process.env.E2E_TEST_MODE === \"true\",\n  secret: process.env.E2E_MAGIC_LINK_SECRET,\n})\n```\n\nTests call `GET /e2e/otp-code?email=...` or `?phone=...` with the secret in an `x-e2e-secret` header. The captured codes are live credentials: the route answers a bare 404 unless `enabled` is exactly `true` and the secret matches, and creating it with `enabled` but no secret throws. Never set the flag in production.\n\n## Documentation & example\n\nFull docs and a runnable React Router framework-mode example with Playwright tests live in the monorepo:\n\n→ **https://github.com/activescott/auth**\n\n## License\n\nMIT\n","readmeFilename":"README.md"}