{"_id":"@aiquants/auth-react-router","_rev":"23-71c270663d85ce67abcc526ceff34c18","name":"@aiquants/auth-react-router","dist-tags":{"latest":"0.15.1"},"versions":{"0.1.1":{"name":"@aiquants/auth-react-router","version":"0.1.1","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.1.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"55e49021e55126247203a5d66343e7a4ca205e74","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.1.1.tgz","fileCount":33,"integrity":"sha512-80pkaJwr32V/AIZnkvTjKxWwF0Xpp6Ipm3M+sqEZeWK5t0D2fPCSySXalQCO6DHcermewAXdoohF+febiDbdIg==","signatures":[{"sig":"MEYCIQCHERg2IzZahfyZl+KzB9b+xyrlSyE7VwHYUMlXpp+2QQIhAPFeqagrz1sZ+7reM2XjL0WfPuQiUOHdHESG8HKzSiOy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":283048},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","build:watch":"tsup --watch","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","@types/react":"^19.2.7","react-router":"^7.13.0","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.1.1"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.1.1_1784773414114_0.2758495578085769","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aiquants/auth-react-router","version":"0.2.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.2.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"62ba1e720fd0b841670d0c5a6a7d48ac3ac98e0d","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.2.0.tgz","fileCount":35,"integrity":"sha512-X2xeVSSo9vG4Uz0BaXZfnBnV31OMhnc+jGC5K4Mjwre0F7H0ZwsT44slXOIS5G78CP6k9H6gXGaZZlD/HzBSFQ==","signatures":[{"sig":"MEUCIQDmLEqLnLS+xPlVDv4pelVneXaVapQUyASQqHyULOiHugIgJUYBYbxI6JrADIU16/ycIpXH6HZp9Z+4txXReYGkEMw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292806},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^7.13.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.1.1"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.2.0_1784846710471_0.9519549738159261","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@aiquants/auth-react-router","version":"0.2.1","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.2.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"1a1e11a85424e855f2c79b909329f0e445151953","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.2.1.tgz","fileCount":35,"integrity":"sha512-apQmyBgKP1U4j/IcMu+uyFq6kxanOFW8i4hdJFLeRxwRETTZyTzEJfvRS4qGpJmNwng2WFmuI6kB4hbn2db59A==","signatures":[{"sig":"MEUCICmIjBdNO7+/ukZK3uiOXwP6os8Vx+xCbKW4zp83pE0LAiEArRQbmlKhniNFAgJ244BSAQGvVa853YZzmXIFKGnXzlU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292806},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^7.13.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.1.1"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.2.1_1784862800730_0.9534008913578178","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@aiquants/auth-react-router","version":"0.2.2","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.2.2","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"dc5d886a42978229b57b17265c33c076705b7b73","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.2.2.tgz","fileCount":35,"integrity":"sha512-1ZZIIQ8D2N87E6VDLlMu88G5rCScyeMj2rKIW6evXkvOsif6OuqZpK0WP/UTf6ZDxBQZ4kwNczQWW+5GODIgMA==","signatures":[{"sig":"MEQCIAkzX/LoY0bFR4/lZ1r3fZSUOMMOmyOQs1+JIkHBJrJLAiBlik1N+yjUHfihiego4kFUVehAudpu5rfC3B9lXJgq6w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292806},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^7.13.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.1.1"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.2.2_1784872762431_0.024207494418960307","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aiquants/auth-react-router","version":"0.3.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.3.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"464ffddd50f36a4bd817a6325b36bf68208b9897","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.3.0.tgz","fileCount":35,"integrity":"sha512-u6gARNFjmwXrh22zFBFBBTof0dzP0DLZBMls3TRJ4UoIGlRTeBAiGqufYijMd8gm/SG6FSAim29Pc3l4NNI7Zg==","signatures":[{"sig":"MEUCIE/bbwjxxFhPKEGALp10ZnuOzJBUIb4K34TqcM+40EQeAiEAmJnH3zZaoR41Naxvp/SFCw5bqR7l17Bxmi3xsAKvvX0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292738},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^7.13.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.1.1"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.3.0_1785021460484_0.1773369201974062","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aiquants/auth-react-router","version":"0.4.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.4.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"65e385f1c7089a4f157936f8b74402306bae3656","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.4.0.tgz","fileCount":35,"integrity":"sha512-rOJG6M9Q12MN5rw7VjTbidPteIOi+RKp2iKVcbplyrqUBi1Bl0F0I1IcwexU+AEtrAtNhOky0ABhNyB6zwbvbg==","signatures":[{"sig":"MEUCIEyx45TsjC0WWG/7yXCr+RmS7xk0S4k8Aq2k6ZL/+hplAiEA0FUBmpbtQzD+BaHF5HCrtR21gvLLmryWF/kx11g5EyE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":294920},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^7.13.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.1.1"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.4.0_1785712610148_0.8682199131099289","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@aiquants/auth-react-router","version":"0.4.1","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.4.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"4e95e8c2041e740cb2404b130e67e94d7032585f","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.4.1.tgz","fileCount":35,"integrity":"sha512-lEtgAjbIYXlpn0EhcGBqJ7D+xoVRmM+M8Hpb9i0Bw20OUYBRiiETJ2eYYbF3Pv0T8+FisVov+jDXDgp3aLqatw==","signatures":[{"sig":"MEQCIG13XLBl3p/UOcHql/fUy4IySHZz2wrH82rL4oqaSDt/AiAxeRXsoZ5SiruHEqwqsl1OZ1du0ePWCsN4GBNHLpxT3g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296742},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^7.13.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.1.1"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.4.1_1785922670956_0.8539420996360039","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@aiquants/auth-react-router","version":"0.5.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.5.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"1c96cf31e864ff5d9a9e6fb6642bcec087e563ce","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.5.0.tgz","fileCount":49,"integrity":"sha512-H4TPaSIwG+3u7ooUdM0RRDCFgbSJMoJq4Ix8Z8rJgEolJYAn1vgFbZWAY5k693fikRVVP60TWcB9jXvlK0dukA==","signatures":[{"sig":"MEUCICkWSFSSAxp/07OL6/FSi7ORLgu6z38RWpcvyscWOOu/AiEAm/MfDA+/q1xXKR4awPlkTdPRb/gm2we6z3nZ+CUSrFA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":722343},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^7.13.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.2.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.5.0_1785927666569_0.1325594965000374","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@aiquants/auth-react-router","version":"0.6.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.6.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"cae7f573c3e242f9fa1b5a6f427402975c141541","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.6.0.tgz","fileCount":49,"integrity":"sha512-4rQf+/DOwa7Baa8A5S/7oaPamDaMdqDGBYR6dmgpwK2HP1hXs1176yTR2CXaTXITjpLnXUI0UFnwPqBevTmYog==","signatures":[{"sig":"MEYCIQCTQ/TxNjvrH4MMh3cEzxlsQENwZrbzmRYJaXdrMveYBwIhAJwmzEmJvQH7rTJbdpig/U9KD1NECLqmPMSjzHTj31Ag","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":737651},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^7.13.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.2.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.6.0_1785995973479_0.6749893782804486","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@aiquants/auth-react-router","version":"0.7.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.7.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"e4c0de0c786a3a8b77279306b376009ce3fcaef3","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.7.0.tgz","fileCount":41,"integrity":"sha512-6W2iRJlLJW4oHenDgZo02fiy9vhCq9vAlaeitI5lDtKMi3emQv1kmLrmztDArDzTwqnjybESAzejo/JBxnHHkQ==","signatures":[{"sig":"MEYCIQDd5gKVTDS+YyEjmPi0SXvZrziicHQd4gheOzbyzrhbDwIhAKl3HsfeE3+VG1ycoa+DaxlxFpJj+KcZtUTyS30vMrz+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":675013},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login button","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^7.13.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.2.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.7.0_1786372689207_0.47398786002876947","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"name":"@aiquants/auth-react-router","version":"0.7.3","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.7.3","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"0acd0c27c56eab4452b3478afb4255cf49e29716","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.7.3.tgz","fileCount":41,"integrity":"sha512-2GJTab3hQI0YbGCd+7qPbUR5+L/2gf+GIgnOAVVeocLT4VC1IZOLuLLpzj864OhaLm6oAmf4NxhJa/2sP9Voqg==","signatures":[{"sig":"MEUCIQDw34i+mYU3HBY0k6ct0upRkLV4U8/pWPXflXt2OZuwVwIgQz/Ai+7lQA2yMF5qfDV7Tr+DYjjZRLFnN4YJIjM9A1o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":676631},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login b","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.2.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.7.3_1786537714627_0.5180512176283327","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@aiquants/auth-react-router","version":"0.8.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.8.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"5d8f8aa916960636a0917cf98ce3e8c07107e743","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.8.0.tgz","fileCount":41,"integrity":"sha512-EyiUWLo525TUWTPNKkgvI+Mq9ZS4GzEEjp+aj9boPXRKirobqnZ89bKWdLq/K/dFIB1mb6wcjDwwBYvRq8KFDg==","signatures":[{"sig":"MEYCIQDpIfG4KO0iiKeWOp+ZV+TbdmwfG1lUrm7X3fkvYHEtAwIhAO8Nq4CyNKtfH835O40Zc9EgvfNFYJ+AvjbjPKK7zrcc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":684555},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, per-request loader guard with token refresh + photo cache, auth route handlers, and a <GoogleForm> login b","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.2.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.8.0_1787727303148_0.1707371009575298","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@aiquants/auth-react-router","version":"0.9.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.9.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"132d6d8ef599dbbfc7317c75904c19af9e80d5a1","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.9.0.tgz","fileCount":41,"integrity":"sha512-/NFudXlLAnh6MlVAjRJZgC5jOXhMVI4ZEhvo6kN8uQxTefCbgr3bgihC1XI22pXAFxMskdk0YnJT3qR0LLaLDw==","signatures":[{"sig":"MEUCIQC62ZO7Ey5c2ZKEWrO6JxPFrdx71SHkbnNxtBXNyT+bowIgT2ezUALyaH1hTpiQXoghQDAtSO9DYGPjbDIj3BZonek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":709744},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run lint && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run typecheck && pnpm run --if-present test && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run typecheck && pnpm run --if-present test && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run typecheck && pnpm run --if-present test && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.2.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.9.0_1787776697931_0.9614443161098769","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@aiquants/auth-react-router","version":"0.9.1","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.9.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"a287384f0198e57b1d09c3a2fbb6f11947699243","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.9.1.tgz","fileCount":41,"integrity":"sha512-RtajL7q35b/90YhYRE6BA24tqJ02i+f2rfuufMat1h6bvaEheXw/nr0OybcTGT7Jrj6YWqggBAtaabvGjx7NIQ==","signatures":[{"sig":"MEUCIQDLovuEAi1hJQFNRNuO2PJbrOb5OQ/4/RZ1TrAUIjypugIgfwyDSh5EefsjRROORXiOshfHXYDBXwu9ap2mKVz5ivQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":709646},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.2.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.9.1_1787819263083_0.9763795016053558","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@aiquants/auth-react-router","version":"0.11.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.11.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"7ffd7c86f7892784f43f5214cd084db801762b21","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.11.0.tgz","fileCount":41,"integrity":"sha512-TWq8sEWwVo/wXru3fK3ZWpAltb1To0GCSdZG/pYaRcv4d9kf/CUA48U0zKLn2pHNRDDgOUDhXb8/1pTeOeGVzg==","signatures":[{"sig":"MEUCIE3YUeceCLFONw4qTt3Co87dMDRul4DeqTU0gFSAZPzZAiEA97IPnDMXkRmebIwhe2Dw/hApR1frqfOOQYy36XdJ1vQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCW6sV8bOqfZhOk6zEop4iF9hhWBMOl+8Y5lGzmYNYPhwIhAN9jJS6d6yPqaSPWywYSw9bHf5Op7ZprHZ8DEN156b10","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":798402},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.3.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.11.0_1788960705248_0.23763960207100499","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@aiquants/auth-react-router","version":"0.12.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.12.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"eddfb1b3fb4f97d119275e0904afaefdbd0401b1","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.12.0.tgz","fileCount":42,"integrity":"sha512-qGY9/m6pz2DDGP9KfglQJOQ+wLlSIJgYXVJGtr1xaeNCgQUMIbD1w8e2eJz0xNB1M/QXB65YN9Hgilz/pBR6Ww==","signatures":[{"sig":"MEUCIQC014FQxsr5pLPURbIWyS6m6ptVDuqIrXLTMjHzvhNefgIgb3lvDtFHhRqWfSgeZABhbon8ECJdB2UjgUhwT3ca0sw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGALPdXv1UcGwKOl3srZLJKZlVzaX91DsUePhnkElbTgAiEA8+xgK3hrLQ9hcHI8RhPY2MNK/0TveMeyPB5r5shQe2A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1021255},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.5.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.5.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.12.0_1788974824522_0.6595052806250434","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@aiquants/auth-react-router","version":"0.13.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.13.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"31a528fc38d80ccd78bc217aee8919eeeab97a51","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.13.0.tgz","fileCount":42,"integrity":"sha512-N7f7EjDIJmr/iRyRO6RKpLYQWJlzlM2VxLLbxVDzLkXBtpFIDxrkNj9e6vmR85uODs4EL8z1seV07VUVtcpJhA==","signatures":[{"sig":"MEUCIQCn4HdymJrvryWfvD5OzJ2m0nVNbSPedNDLqLHW8hf6gQIgQ5GRkeYDM4Kq/yAUEKrdZZ45zySdlLj4Cwfq7AXg2sA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCb1HXMRT8falxg8PGHYRLGI38AQ+ulvdmxsqZ8cqPtsQIgGukf7IY4Ma5XZK4nTQXNSFHsS/9jbgl1Gp6d9Xy9gRM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1054601},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.5.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.5.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.13.0_1788976889432_0.7164838628056653","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"@aiquants/auth-react-router","version":"0.13.1","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.13.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"49985b4a4bbf7f647da955143cbdd16df7d07e2d","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.13.1.tgz","fileCount":42,"integrity":"sha512-p0Y0hjucKebFzJkSxuRN4ayuIcD3m5LLu9cp7AOoQQA8wv/6gLOiWYZtwBK1xhailXhhbE8o+r9Wf2C+tHoPyA==","signatures":[{"sig":"MEYCIQDrRCyqSCtajWnOY04NyxfoczLA78qFccvPmiLOdqbr5wIhAMiMFOh1lF2FfQKDiiXAIOMvyOToSA0t3r0zmty+vDEV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC7AHYQ/qppUl1g6gwUPcu20YrPtE9+WPZEKmUkdUDj2AiEAl7BAG2ufCWkMVLSsrnK13SObqbS/w2w2a479u+JfKJo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1058764},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.5.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.5.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.13.1_1788988504753_0.1118388546455773","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@aiquants/auth-react-router","version":"0.14.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.14.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"75df326824b8e2318ea36f3f570905da47997284","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.14.0.tgz","fileCount":42,"integrity":"sha512-G0W4UWcxj0cIg8meOwF4ElY3s4K11pYLXusab6HKzvgA5wEYd8sYr9clywuT1ZexkN6IQyQOEab5cKN6Npcuyg==","signatures":[{"sig":"MEYCIQDqKb6dFPp9VTsltZhOO8uIwrT3XYPB7JZ23nRDAjCOAQIhAMElCtCAkJBbSjV+t8l5OGMSstc673jrZufftQPcb/C3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDrnLP+6XaEjRdJJfBhSP08JR2o48+6AoSNUVJDCJlcCAiBqxEMdoNQs0cm7bqQr+pWAFY9cW5ed8ejOiBezXBOT7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1572622},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.6.0","@aiquants/select-box":"0.9.0","@aiquants/fuzzy-search":"2.2.0","@testing-library/react":"^16.3.2","@aiquants/virtualscroll":"3.4.0"},"peerDependencies":{"react":">=18","react-dom":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.6.0","@aiquants/select-box":"^0.9.0","@aiquants/fuzzy-search":"^2.2.0","@aiquants/virtualscroll":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.14.0_1789031279175_0.07875930985610013","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"@aiquants/auth-react-router","version":"0.14.1","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.14.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"89372af904d501289dad4e0780c7f0e392cc895b","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.14.1.tgz","fileCount":42,"integrity":"sha512-uoGpihz1c0EI5Gig+6i37E5WMbwlAYnC5Hdhnsayr6zDG6DF6GGPudjtJ6Rc6Bz8ra7CGRGfyruCZ7/JSFnm8A==","signatures":[{"sig":"MEUCIQCjp1tjrS8Ul+F6T/yviTlhPMczzbyrbPNJ80Yi7bgI/AIgWxmPoQTyZ/EC9gYTnMw4UGlhNkCF5uKrgRrq9l23h9g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICU8V2VRwl906g4kczsIJu4mhOl2W/I3B3/XfQ+LZML7AiAZ+Fz4ZzjragvEksyNCxIFyDnlL9PTgltSsLcdB1C3dA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1574439},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.6.0","@aiquants/select-box":"0.9.0","@aiquants/fuzzy-search":"2.2.0","@testing-library/react":"^16.3.2","@aiquants/virtualscroll":"3.4.0"},"peerDependencies":{"react":">=18","react-dom":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.6.0","@aiquants/select-box":"^0.9.0","@aiquants/fuzzy-search":"^2.2.0","@aiquants/virtualscroll":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.14.1_1789175440593_0.22096353391770207","host":"s3://npm-registry-packages-npm-production"}},"0.14.2":{"name":"@aiquants/auth-react-router","version":"0.14.2","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.14.2","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"0dcf2144c9552e11acee79ac1ac007d62fa43cdf","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.14.2.tgz","fileCount":42,"integrity":"sha512-LNJKwLVIWECZE+BYuW5LK2g8DSPUvp/RwmqDmulwkP2E/Xipacc+g9DX/XfHqBAiJ/+GGRkuJ9n0JoBViaPxMA==","signatures":[{"sig":"MEQCIHkHoGfDaIBISRYDTpr1ZGHLDMhPq5lDSaphHfe6JKIPAiA9+l3qXO1L7dnlnCiLROXh4jcBfvisJ50BmeF6gWrrzg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFGDIbPGiTVf2lo2vcig48z6JZN/jP2aX2VT2RzcPwjyAiEA2WLJKv65Np3C1Z5scDap7qv+OiAoDjeI05/FohUAwZE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1577665},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.6.0","@aiquants/select-box":"0.9.0","@aiquants/fuzzy-search":"2.2.0","@testing-library/react":"^16.3.2","@aiquants/virtualscroll":"3.4.0"},"peerDependencies":{"react":">=18","react-dom":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.6.0","@aiquants/select-box":"^0.9.0","@aiquants/fuzzy-search":"^2.2.0","@aiquants/virtualscroll":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.14.2_1789365653279_0.6296656145648811","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@aiquants/auth-react-router","version":"0.15.0","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/auth-react-router@0.15.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"048563b083905973a4b96f93440416a28c53f4d8","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.15.0.tgz","fileCount":42,"integrity":"sha512-4ikqg/OLtDbSKTNItjw2CaGGBZS4kcnlGyh48CWpQxaKBuEwLYm0fci6POPNOLjIN6HP5M1LKdKF4hQfkOIpbg==","signatures":[{"sig":"MEQCIFc3zZ7YGsaRPIOa/1hvrKnHMRSkM9Z+KWQqi/1c6UNNAiA98B/6gsOJHp/aRlBCGiVfiJVzLeOwdFxu8vjUppsqiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEnMOmQscp6u/qj8gjwnEcSRt6S6mPmuIhS7Z8tLYuNhAiAPL6z5o3W0XOBrFkpZFkXe8b1vlw2unRdcZ03n+nXFOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1615414},"main":"dist/server.js","types":"dist/server.d.ts","module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.0.0","dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.6.0","@aiquants/select-box":"0.9.0","@aiquants/fuzzy-search":"2.2.0","@testing-library/react":"^16.3.2","@aiquants/virtualscroll":"3.4.0"},"peerDependencies":{"react":">=18","react-dom":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.6.0","@aiquants/select-box":"^0.9.0","@aiquants/fuzzy-search":"^2.2.0","@aiquants/virtualscroll":"^3.4.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-react-router_0.15.0_1789372189251_0.15989996221760983","host":"s3://npm-registry-packages-npm-production"}},"0.15.1":{"_id":"@aiquants/auth-react-router@0.15.1","dist":{"shasum":"b7463cc7445ffdc75d5ef84e3db2eccef94b3421","tarball":"https://registry.npmjs.org/@aiquants/auth-react-router/-/auth-react-router-0.15.1.tgz","fileCount":16,"integrity":"sha512-ka9+N60V9EemULrIyPtZSn3B2AbULR45bg/cyySrJGqsxT8aCifwkObm3k3nk9dxuIiJlEULM2Smki1bGhZWzg==","signatures":[{"sig":"MEYCIQCh0LTCcE96ULNVwRC++IvqJG6qa+IvcZrazlxEeplIBQIhAPcpvym/GiADwB7p8sATxJT7WP/Qt7iyQYsUaHbdve2T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDUmMFOfljWmeOQxg1iHLtmq56E7GmZmPzJ8EZN15YZQwIgWWR+xgodVMvkOmYuJtl5Zl+E2MGcGlYMFfisa65uyP0="}],"unpackedSize":308795},"main":"dist/server.js","name":"@aiquants/auth-react-router","types":"dist/server.d.ts","author":{"url":"https://x.com/fehdek","name":"fehde-k"},"module":"dist/server.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{"./admin":{"types":"./dist/admin.d.ts","import":"./dist/admin.mjs","require":"./dist/admin.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./styles/auth-react-router.standalone.css":"./dist/styles/auth-react-router.standalone.css"},"license":"MIT","scripts":{"dev":"tsup --watch --onSuccess \"pnpm build:css\"","lint":"biome lint src/","test":"vitest run","build":"tsup && pnpm build:css && node ../../.config/scripts/strip-dts-comments.mjs dist","check":"biome check src/","clean":"rimraf dist","verify":"pnpm run typecheck && pnpm run check && pnpm run test","build:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","watch:css":"tailwindcss -i src/styles/standalone.entry.css -o dist/styles/auth-react-router.standalone.css --minify --watch","build:watch":"tsup --watch --onSuccess \"pnpm build:css\"","publish:major":"pnpm run verify && pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm run verify && pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm run verify && pnpm version patch --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"version":"0.15.1","_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","directories":{},"maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"sideEffects":["**/*.css"],"dependencies":{"tailwind-variants":"^3.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^30.0.1","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","remix-auth":"^4.2.0","typescript":"^5.9.3","@types/node":"^25.9.1","react-icons":"^5.5.0","tailwindcss":"^4.1.18","@types/react":"^19.2.7","react-router":"^8.3.0","@tailwindcss/cli":"^4.1.18","remix-auth-oauth2":"^3.4.1","@aiquants/auth-core":"0.6.0","@aiquants/select-box":"0.9.1","@aiquants/fuzzy-search":"2.2.0","@testing-library/react":"^16.3.2","@aiquants/virtualscroll":"3.5.0"},"peerDependencies":{"react":">=18","react-dom":">=18","remix-auth":"^4.0.0","react-icons":">=5","react-router":"^7.0.0 || ^8.0.0","remix-auth-oauth2":"^3.0.0","@aiquants/auth-core":"^0.6.0","@aiquants/select-box":"^0.9.1","@aiquants/fuzzy-search":"^2.2.0","@aiquants/virtualscroll":"^3.5.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/auth-react-router_0.15.1_1789684040970_0.5605578505495397"}}},"time":{"created":"2026-07-23T02:23:34.021Z","modified":"2026-09-17T22:27:21.307Z","0.1.1":"2026-07-23T02:23:34.284Z","0.2.0":"2026-07-23T22:45:10.667Z","0.2.1":"2026-07-24T03:13:20.879Z","0.2.2":"2026-07-24T05:59:22.624Z","0.3.0":"2026-07-25T23:17:40.647Z","0.4.0":"2026-08-02T23:16:50.284Z","0.4.1":"2026-08-05T09:37:51.113Z","0.5.0":"2026-08-05T11:01:06.745Z","0.6.0":"2026-08-06T05:59:33.645Z","0.7.0":"2026-08-10T14:38:09.364Z","0.7.3":"2026-08-12T12:28:34.785Z","0.8.0":"2026-08-26T06:55:03.295Z","0.9.0":"2026-08-26T20:38:18.121Z","0.9.1":"2026-08-27T08:27:43.268Z","0.11.0":"2026-09-09T13:31:45.399Z","0.12.0":"2026-09-09T17:27:04.634Z","0.13.0":"2026-09-09T18:01:29.608Z","0.13.1":"2026-09-09T21:15:04.841Z","0.14.0":"2026-09-10T09:07:59.304Z","0.14.1":"2026-09-12T01:10:40.743Z","0.14.2":"2026-09-14T06:00:53.396Z","0.15.0":"2026-09-14T07:49:49.344Z","0.15.1":"2026-09-17T22:27:21.090Z"},"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","keywords":["auth","authentication","react-router","remix-auth","google-oauth","session","typescript"],"description":"React Router v7 / v8 auth adapter for @aiquants/auth-core: Google OAuth strategy factory (remix-auth), cookie session storage with DI test backdoor, a loader guard that authenticates at most once per request (token refresh + photo cache), auth route handl","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"readme":"# @aiquants/auth-react-router\n\nReact Router v7 auth adapter for [`@aiquants/auth-core`](../auth-core/): Google OAuth (remix-auth v4 + a vendored `GoogleStrategy` over `remix-auth-oauth2`) authenticator factory, cookie session storage, per-request loader guard with token refresh + photo cache, auth route handlers, and a `<GoogleForm>` login button. All app couplings (env, backend HTTP, DB photo lookup, warmup, test backdoor) are **DI ports**. The Google strategy (formerly `@coji/remix-auth-google`, 68 lines) is vendored in `src/server/google-strategy-impl.ts`, so the package has no `@coji/*` dependency.\n\n## Install\n\n```bash\npnpm add @aiquants/auth-core @aiquants/auth-react-router\n```\n\nPeers: `react`, `react-router@^7`, `remix-auth@^4`, `remix-auth-oauth2@^3`, `react-icons`.\n\n## User admin shell: the self-permission badge\n\nThe admin shell (`createUserAdminApp`) renders a \"your permissions\" badge in its header. Two optional ports feed it,\nand both are **fail-closed by design**:\n\n```ts\ncreateUserAdminApp({\n  store, guards,\n  // resolves to a map of { canRead, canWrite, canDelete } per resource key.\n  // Any authz view carrying those three booleans satisfies it structurally — no import from an authz package.\n  getMyPermissions: (request) => myAuthz.getMyPermissions(request, { resourceKeys: [\"authz_admin\"] }),\n  // display names for those keys; unlisted keys render as the raw key\n  resourceLabels: { authz_admin: \"ユーザー管理 UI\" },\n})\n```\n\n- Query **the resource your guards actually check**. Asking about a different key makes the badge disagree with the\n  guard — the user is admitted but told they have no permission.\n- If the port is absent, rejects, or returns no entries, the badge renders an explicit \"unknown\" state\n  (`data-testid=\"user-admin-permission-unavailable\"`) and the failure is logged. It never renders a permissive value:\n  a badge that claims \"editable\" when the answer is unknown is worse than no badge at all.\n\n## Wiring (single composition point — `app/services/auth/config.server.ts`)\n\n```ts\nimport { emailDomainAllowlist, parseAllowlistCsv } from \"@aiquants/auth-core\"\nimport { createAuthServer } from \"@aiquants/auth-react-router/server\"\n\nexport const authServer = createAuthServer({\n    google: { clientId: env.GOOGLE_CLIENT_ID, clientSecret: env.GOOGLE_CLIENT_SECRET, redirectURI: env.GOOGLE_OAUTH_REDIRECT_URL },\n    session: { secrets: [env.REMIX_SESSION_SECRET] },\n    isEmailAllowed: emailDomainAllowlist(parseAllowlistCsv(env.ALLOWED_EMAILS), parseAllowlistCsv(env.ALLOWED_DOMAINS)),\n    isUserActive: async (profile) => isAccountEnabled(profile),   // optional: deactivation revokes live sessions\n    backendAuth: { verify: verifyBackend, signup: (p, t) => signupBackend(p, t) },      // FastAPI verify/signup\n    getUserPhoto: async (openid) => (await getOpenids({ openid }))[0]?.picture ?? \"\",   // your identity store\n    warmup: async () => { await Promise.all([ensurePrimaryConnection(), ensureSecondaryConnection()]) },\n    mockUser: mockUserPort,   // test backdoor (E2E) — omit in production-only apps\n})\nexport const { authenticator, sessionStorage, getSession, getSessionUser, saveSession, requireUser, requireAdminUser, commitSession, destroySession, authenticate, refreshedAccessToken, authenticateInLoader, loginLoader, loginAction, logoutLoader, logout, logoutAndRedirect, googleCallbackLoader } = authServer\n```\n\nClient:\n\n```tsx\nimport { GoogleForm } from \"@aiquants/auth-react-router/client\"\n<GoogleForm />   // <Form method=\"POST\"> + _action=\"Sign In with Google\"\n```\n\n## User administration surface (`/admin`)\n\nA splat-mounted admin UI for users, groups, group members, and the sign-in allowlist — the identity-side counterpart to `@aiquants/authz-react-router`.\n\n```ts\nimport { createUserAdminApp, jaUserAdminLabels } from \"@aiquants/auth-react-router/admin\"\n\nexport const userAdminApp = createUserAdminApp({\n    store: myUserAdminStore,          // you implement UserAdminStore against your DB\n    labels: jaUserAdminLabels,        // optional; package default is English\n    guards: {                         // REQUIRED — see below\n        requireAccess: async (request, { action }) => {\n            await requireUser(request)\n            await requirePermission(request, { resourceKey: \"user_admin\", action })\n        },\n    },\n})\n```\n\n```tsx\nimport { AuthUserAdminAppView } from \"@aiquants/auth-react-router/admin\"\nexport const loader = userAdminApp.loader\nexport const action = userAdminApp.action\nexport default () => <AuthUserAdminAppView />\n```\n\n- **`guards` is mandatory** — this surface lists every user and mutates group membership, so an unguarded mount is an account-enumeration and privilege-escalation path. Allow by returning, deny by throwing (`Response` / `redirect` / `Error`); the return value is `void` by contract, so a predicate-style guard that returns `false` cannot silently fail open.\n- **Per-operation authorization**: the guard receives the CRUD verb each intent actually performs (`read` / `create` / `update` / `delete`), so a principal holding only `update` cannot delete. Membership add/remove map to `create`/`delete` because they add and remove rows.\n- Unknown intents reach neither the guard nor the store (the intent table is a `Map`, so prototype keys such as `constructor` do not resolve).\n- Store errors (e.g. \"cannot remove the last administrator\") are returned as `{ ok: false, error }` and rendered by the views; guard rejections propagate untouched.\n- Labels default to **English** (`defaultUserAdminLabels`); inject `jaUserAdminLabels` or a partial override via `resolveUserAdminLabels`.\n\n### Upstream group catalog (optional port)\n\nThe groups and directory tabs let the operator **pick** an upstream group instead of spelling its address. Wire the optional\n`directoryCatalog` port to enable it; omit it and both surfaces fall back to typing the address by hand.\n\n```ts\ncreateUserAdminApp({\n    store: myUserAdminStore,\n    guards: { ... },\n    // `observedAt` is required. It is `null` only when the upstream has NEVER been observed —\n    // which is not the same as \"observed, and the answer was empty\".\n    directoryCatalog: {\n        listGroups: async (request) => {\n            const { groups, observedAt } = await myCatalogReader.read(request)\n            return { groups, observedAt }\n        },\n    },\n})\n```\n\nThe list is usually a **copy** written by a separate process that holds the upstream credential, not a live read.\nThat is why the port must report when the upstream was observed: a list with no timestamp reads as \"the directory right\nnow\", and the operator picks a group that no longer exists. `observedAt: null` is rendered as `unavailable /\nneverObserved` rather than as an empty list, so a deployment whose synchronization has never run is never mistaken for a\ndomain with no groups.\n\n- **The catalog is a convenience read, never a gate.** A failure is reported to the view as\n  `{ kind: \"unavailable\", reason }` — the tab still opens, and manual entry stays available. It is fetched only for the two\n  segments that render a picker, and only for the intents that create a link.\n- **`reason` is a classification, not the upstream's text** (`denied` / `rateLimited` / `upstreamError` /\n  `neverObserved` / `unknown`; the first three are derived from a numeric `status` when the thrown value carries one,\n  `neverObserved` from a `null` observation time). The original error goes to `console.error` only: an upstream message\n  can carry the service-account address, the impersonated subject, internal URLs, or a credential fragment, and holding\n  read access to this page is not a reason to be shown any of them.\n- **The same rule governs store errors.** An exception's own text reaches the operator only when the store declares it\n  operator-facing — by throwing `UserAdminOperatorError`, or by setting `operatorFacing: true` on the error (for hosts\n  that cannot extend this package's class). Everything else is reported as a generic sentence and logged: a driver\n  exception carries the schema, table, constraint and the offending values.\n- **The provider is taken from `getDirectoryStatus()`, never from the form**, and the link intents are refused outright\n  when the directory is not enabled. The absence of a control in the UI is not a constraint.\n- **`observedAt` and `isStale` are decided on the server.** Judging staleness in the browser lets a client whose clock\n  runs behind suppress the warning, and desynchronizes server and client rendering.\n- **A host that overrides `labels` wholesale must supply `groupsView.catalogFailures`** (five keys) alongside the rest;\n  `resolveUserAdminLabels` fills anything omitted from a partial override.\n- **Listing the catalog requires the same verbs as creating a link** (`update` + `create` + `delete`), not `read`. It\n  enumerates another organization's department structure and headcounts; a principal who cannot link has no use for it.\n  A denial is turned into \"no picker\", never into a failed page.\n- **The action re-checks what the picker offered.** A key the catalog does not list is refused server-side (case and\n  surrounding whitespace are treated as equal), because the picker's `disabled` rows are a UI promise, not a constraint.\n  When no catalog is wired — or the upstream is unreachable — the check is skipped rather than turned into a refusal:\n  refusing there would make linking impossible in exactly the deployments that must type the address by hand.\n- **An upstream group already linked to another local group is refused**, so its membership cannot be projected onto two\n  groups (double-counted members, both sets of roles granted).\n- `createLinkedGroup` creates the group and links it in **one** intent, and therefore requires the union of the verbs both\n  halves need (`create` + `update` + `delete`). Splitting it in two would leave a state where only one half succeeded.\n\n### Sync requests: queued on link, followed through on screen\n\nThe console never reaches the upstream itself. \"Sync now\" — and, since 0.15.0, **every link creation** — queues a request\nfor the synchronization job (`store.requestDirectorySync(groupId, actor)`), and the job writes the result back to the\ndatabase a few seconds later.\n\n- Both link intents return `{ ok: true, syncRequest }` with `\"queued\"`, `\"already-pending\"`, or `\"not-queued\"`. The last\n  one means **the link succeeded but the request could not be queued**; it is reported as such (and logged) rather than\n  thrown, because throwing would report a failure for a link that now exists. The request is scoped to the group, not the\n  tenant, so linking one group does not re-sweep every link.\n- While `directoryStatus.pendingRequestCount > 0`, the shell re-validates the route data every `intervalMs` and stops\n  after `maxMs` if the count never changes (a deployment with no job consuming the queue must not be polled forever from\n  every open tab). Configure it with the optional `pendingSyncPolling` prop of `AuthUserAdminAppView` / `UserAdminShell`;\n  the default is `DEFAULT_PENDING_SYNC_POLLING` (3 s, up to 5 min). Nothing here adds an upstream call: the\n  re-validation reads the rows the job wrote.\n\nStyling: this package has **no hand-written component CSS** (the `GoogleForm` classes are plain Tailwind utilities), so it ships **no components-only artifact** — only a standalone build. Two consumption modes, never mixed:\n\n- **Tailwind v4 host** — add `@source \"../node_modules/@aiquants/auth-react-router/src/**/*.{ts,tsx}\";` (monorepo: `../../../../packages/auth-react-router/src/**/*.{ts,tsx}`) so the `GoogleForm` classes are generated in the host's own canonical build; `src` ships in the published package.\n- **Non-Tailwind host** — import the single self-contained standalone build (`pnpm run build:css` → `dist/styles/auth-react-router.standalone.css`):\n\n  ```css\n  @import \"@aiquants/auth-react-router/styles/auth-react-router.standalone.css\";\n  ```\n\nNever mix the two: importing the standalone utility CSS next to a host Tailwind build duplicates same-named utilities, and base/variant cascade winners flip versus the single-build canonical order.\n\nThe admin surface renders `@aiquants/select-box`, whose own stylesheet is **not** part of either artifact above. Import it in\nthe host, or the group picker's dropdown renders unstyled:\n\n```css\n@import \"@aiquants/select-box/styles/select-box.css\";\n```\n\nIts transitive peers (`@aiquants/fuzzy-search`, `@aiquants/virtualscroll`) are declared here as well, so a host that\ninstalls this package is told what the picker needs rather than discovering it as a runtime resolution failure.\n\nAll three are **required** peers, not optional. `src/admin/views.tsx` imports `@aiquants/select-box` at the top level and\n`./admin` re-exports it, so the specifier survives into `dist/admin.mjs`: a host without it does not get a degraded\npicker, it gets `ERR_MODULE_NOT_FOUND` for the whole admin surface — including the groups and allowlist tabs, which have\nnothing to do with the picker. Marking them optional would suppress the install warning that is the only thing standing\nbetween a consumer and that failure. Note also that `@aiquants/select-box` pins React 19, which is stricter than this\npackage's own `react: \">=18\"`; a host that mounts `/admin` must satisfy the stricter one.\n\n## Behavior Contract\n\n- **Session cookie byte compatibility**: `__session` (httpOnly/lax/30d), key `\"user\"`, value = `{ id, displayName, name, emails, accessToken, refreshToken?, expirationDateMs?, provider, role? }` — never `photo`/`_json`/`photos`. Changing this invalidates all live 30-day sessions.\n- **Verify order**: Google profile check → `backendAuth.verify` → allowlist → `backendAuth.signup` (every login). Failures redirect to `<loginPath>?error=<encoded error message>` (messages overridable via `messages`).\n- **Token refresh**: expiry check → Google `oauth2/v4/token` rotate → session update; `invalid_grant` destroys the session and redirects to login with `Set-Cookie`.\n- **Loader guard**: `authenticateInLoader(request, { failureRedirect })` returns `{ user, cookie? }` with `user` **required** when `failureRedirect` is a string (any authentication failure throws a redirect), and `{ user?, cookie? }` when it is `null` (no-redirect mode). Passing `\"\"` throws a `TypeError` before any work — it is a mistake, not a request for the default.\n- **One authentication per request**: the guard performs its work at most once per `Request` instance and shares a mode-neutral result, so a root loader (`null`) and a leaf loader (`\"/auth/login\"`) in the same React Router data pass share a single pass — one warmup, one token refresh, one `Set-Cookie`. The failure policy is applied per caller on top of the shared result, so it must never be part of the cache key.\n- **Infrastructure failures are never laundered into logouts**: anything that is not an authentication failure (an unexpected error inside the auth step, a `getUserPhoto` port outage, a `saveSession` failure) propagates unchanged in **both** modes. The session is not destroyed and no redirect is produced.\n- Photo lookups are cached with in-flight dedup per factory instance.\n\n## DI Ports Absorbing Per-App Differences\n\n| Port | App A | App B |\n| --- | --- | --- |\n| `google.scopes` | default | + `directory.readonly` etc. |\n| `mockUser` | cookie parse + name map | fixed id |\n| `warmup` | 2 pools | 1 pool |\n| `backendAuth` | primary-api | secondary-api |\n| `isUserActive` | DB lookup + allowlist re-check | omitted (always active) |\n\n`isUserActive` is evaluated at login **and on every session resolution**, so disabling an account revokes already-issued session cookies. Return `false` only for a *known-disabled* account — returning `false` for an unknown identity would block first-time sign-up.\n\n> ⚠️ `isEmailAllowed` may return a `Promise` (to consult a database as well as env vars). Callers **must** `await` it: a `Promise` is always truthy, so a missing `await` makes the allowlist fail **open**, and the type checker cannot catch it.\n\n## Intentional Changes vs Original (§8, approved)\n\n1. No import-time env reads/throws — all validation happens in `createAuthServer`.\n2. Allowlist matching is trim+lowercase (unified with the Python side via `@aiquants/auth-core`).\n3. Dead exports (`refreshBackend`, `authenticateBackend`) are not ported — the backend port only needs `verify`/`signup`.\n\nMIT\n","readmeFilename":""}