{"_id":"@aiquants/authz-react-router","_rev":"21-afac3e5a3ef60744d6987695583f0c78","name":"@aiquants/authz-react-router","dist-tags":{"latest":"0.8.3"},"versions":{"0.1.0":{"name":"@aiquants/authz-react-router","version":"0.1.0","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.1.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"90e51281f448920b92f8beb3955d237869ba9818","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.1.0.tgz","fileCount":9,"integrity":"sha512-282A2/mBiWtP3+wZtFjEyfZ3+m1i5d6YlPjF8YF99aAmqmik4bONBC9GcVkSc47DtuPVXxk/oyh2o7C+ysePMw==","signatures":[{"sig":"MEUCIQDBHZMnxUqCY1ZyVl3K0V1F3Cqo28h8HFl6VSfgZ+yMcwIgZDz8tJSGXJhlcSjG1Gdz5UOn7lzmfB7iOFRmJNr7ssU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278894},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.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","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","publish:major":"npm version major && pnpm publish --no-git-checks","publish:minor":"npm version minor && pnpm publish --no-git-checks","publish:patch":"npm version patch && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"@aiquants/authz-core":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.1.0_1782370765334_0.08801493390872306","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aiquants/authz-react-router","version":"0.1.1","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.1.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"730cbd5fd41b489ef0bb8cbcd364aadb277f99b9","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.1.1.tgz","fileCount":9,"integrity":"sha512-gEAjyTMa50Rsq8DmqGf2TaqrhOUlkTkkV2K0ax9xiGHZFxXhOgEk5FdEdLWL45WNf+MFlR0up9hH0S57RnohAw==","signatures":[{"sig":"MEQCIEzHhkZVIBuhwRrSTkZn50zgeRQkQrqCnTsSJ7mOicF6AiBj57yO9Eg7Bj9kGBUqGZCn8G67Zd6nfVC4HV/jl0fk2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":280993},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","publish:major":"npm version major && pnpm publish --no-git-checks","publish:minor":"npm version minor && pnpm publish --no-git-checks","publish:patch":"npm version patch && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"@aiquants/authz-core":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.1.1_1782722311954_0.6770386113120974","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aiquants/authz-react-router","version":"0.2.0","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.2.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"2fe0b5a6d17495ee0603f79a74dbc35bf9de7aa3","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.2.0.tgz","fileCount":9,"integrity":"sha512-JhxinnWmwzQkDkzNqXPgYCU3XTd3V4rayFeJdU5URZFBSpaixTuqLYaWcjPhgdJD0CAR8OV1qxk6bHAMEkInEQ==","signatures":[{"sig":"MEQCIErVVmKPi/i6Owzm+oEXLOphX4xCsdbvYp4YssrkbAWKAiBY3r4YlSCwO2fMTwPBfYyT5CU1cbkjB/lcKWGzVjinNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281476},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","publish:major":"npm version major && pnpm publish --no-git-checks","publish:minor":"npm version minor && pnpm publish --no-git-checks","publish:patch":"npm version patch && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"@aiquants/authz-core":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.2.0_1782877194888_0.18426987075241685","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@aiquants/authz-react-router","version":"0.2.1","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.2.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"f721165925962662f8bc1eecabed10623459d3ad","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.2.1.tgz","fileCount":9,"integrity":"sha512-AkziKDvljfGoMPiOS66kxMcp6aZFm3QFZ33kbXMjxBJpKOP78tJ+ehPr0N6w7EsT8/DknZAQkXK/IVX/7tH1Vw==","signatures":[{"sig":"MEUCIBXV+KOwdIEuhKUM82715Ev5m38Nu0Hq7uYxm4N9O/QFAiEA+ovo4g0D/jTXvzkPGsRQy57iuHEYzONnXZeC3KXzQTU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":284877},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","publish:major":"npm version major && pnpm publish --no-git-checks","publish:minor":"npm version minor && pnpm publish --no-git-checks","publish:patch":"npm version patch && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"@aiquants/authz-core":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.2.1_1782898469657_0.9198093019787879","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@aiquants/authz-react-router","version":"0.2.2","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.2.2","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"d4acdba50d49b1192ff19ecca3e155ffd837cc99","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.2.2.tgz","fileCount":9,"integrity":"sha512-QZeIXK604wxa0xueGkUUajg51ZvHpq8UUloA8TwVbqYR7ZEhpaij2XghwMNwzueIfdxSmuWlqdykEl3WDhqkHA==","signatures":[{"sig":"MEUCIER3xNHlFiMX+sVYI4o6/TDMcxT3N3sE4Ouz6pqeJY5pAiEA4E6n8ioabEISFadfQgf901tswlWGPKCGxBuCQyg0rf4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":286166},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","publish:major":"pnpm version major --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm version minor --no-git-checks && pnpm publish --no-git-checks","publish:patch":"pnpm version patch --no-git-checks && pnpm publish --no-git-checks","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.2.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.2.2_1784168557988_0.7638821516329042","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@aiquants/authz-react-router","version":"0.2.3","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.2.3","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"2e4d428d2a2cd1cc1989d331c29476dd7e172a35","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.2.3.tgz","fileCount":9,"integrity":"sha512-Ktke1V2/BUPK1jYf75IDfAH7d0MhiLtdYvgSCdMtm8Nllq8LqRowvYWZrTp0TT/EeqnqrpYdiGUDrDQHyyOAyQ==","signatures":[{"sig":"MEYCIQDd1R2c3fcgscI0wCKnPOeAzKXAziZwRUh5q18AyDaAdwIhAIgEhzp8MFHFkrvBuxf4kS5MSkQpsY+wYp+cocpb9RD4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":286228},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","publish:major":"pnpm version major --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:minor":"pnpm version minor --no-git-tag-version --no-git-checks && pnpm publish --no-git-checks","publish:patch":"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) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.2.3","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.2.3"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.2.3_1784769677524_0.10445405078120884","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@aiquants/authz-react-router","version":"0.2.4","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.2.4","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"c482c0f5098724884ee507228d0fe9045dc28c34","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.2.4.tgz","fileCount":9,"integrity":"sha512-zI1MCVN4VSlrf+kzB+dSDFRL2eoA1DMtbJqhLR7fWxJUwszLipfT6+WWoWCwS5myoU7SV8EewsQ/smWTb6Z3iA==","signatures":[{"sig":"MEQCIEUjUA+1WAULyR8tD3AO6n7pw4vZJH32Le7pzwtCuRU/AiAbXK1HILRrWpLjCSRPgTeaGtiSO0gToC9vrCwwIeIp9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":286384},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.2.5","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.2.5"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.2.4_1784773432061_0.839584742809526","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@aiquants/authz-react-router","version":"0.2.5","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.2.5","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"eb3c82c7cc029554d3505fc989b357fb6c813824","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.2.5.tgz","fileCount":9,"integrity":"sha512-BegpzsPh0ddcYlYUOsIvRoHWts7cdKIz2eSdLrrHZxyVh3Hf93XjOd/0H2F8zEl0qLkJTN7h789X5Vzw2Feb/w==","signatures":[{"sig":"MEYCIQC+49CjCa0PEohCsBDBrZbZpekQ/UPfq4mrD9zQn4MlpwIhALl7EUKSkMO6FsXDYv1Etu+NeCzeaYFJkAKUkP7ex45P","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311157},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.2.5","@aiquants/select-box":"0.3.1","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.2.5","@aiquants/select-box":"0.3.1"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.2.5_1784875157672_0.6231628232495741","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@aiquants/authz-react-router","version":"0.2.6","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.2.6","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"66fa46d8b004f72f9512a2df01e4a3027c5baa96","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.2.6.tgz","fileCount":9,"integrity":"sha512-vm0rzrabyI88tCRVW6+6sXaxiTQFAjEe01l1KrcxMLI7asKdmBqlfjORO/+ADn4YHmtI1bXbT8SLTT00pU5Jfw==","signatures":[{"sig":"MEUCIQDPU9jJd+5ZjlHW+4YaybfEXU62eIsIW1bugKpsULzitQIgGvGQUJS7BIxfZlnMy6VOpt3TYmD/SRWVeL94T0vo5aY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311941},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.2.5","@aiquants/select-box":"0.3.1","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.2.5","@aiquants/select-box":"0.3.1"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.2.6_1784883874294_0.030314857491617442","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aiquants/authz-react-router","version":"0.3.0","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.3.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"b969fa061b7a732c6b1264c047ba8f6d5c6db1be","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.3.0.tgz","fileCount":9,"integrity":"sha512-5nWQaJhhZkPPm1bqw7lp43tZJRAcaiRXiM2cCq6sx+TSdbzSdKNG5vylmZMknAJXiNDc630nV6GpkF89Ugjatg==","signatures":[{"sig":"MEUCIQChgYGjVaV0HwEz0NqwVNrpzjF3ytG8mMw2WCwVcqgcxQIgbs6OWZ4O0xR2al8J8zHk+0yIY0og3xBaFCPCgLn+XGQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339872},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.2.5","@aiquants/select-box":"0.4.0","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.2.5","@aiquants/select-box":"0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.3.0_1784961356066_0.0744516765828036","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aiquants/authz-react-router","version":"0.4.0","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.4.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"9577a960c47df641c065120b745cfd5db73e4b1e","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.4.0.tgz","fileCount":9,"integrity":"sha512-19LKfibhuYTSSoFwI2Lj/rfVAqAkpizn638b6XaDI0fgGjqsPoRvdyXdd9+3cCTrdI8gykBVfUBFszkv3sD7wA==","signatures":[{"sig":"MEUCIQCaDU/Yyd/LU//d+9XHD8HJS/Ouih6PSXezU6Z+fvu3HQIgRLViQtvaGc9nbO9xFs0JwRIqjRVx+srjqyJ/Da53lI0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":420550},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.2.5","@aiquants/select-box":"0.4.0","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.2.5","@aiquants/select-box":"0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.4.0_1785023687468_0.09734137785167851","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@aiquants/authz-react-router","version":"0.4.1","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.4.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"a47112cfea026195b3d4641e3726df5e527b70f9","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.4.1.tgz","fileCount":9,"integrity":"sha512-YNL+ZKbByoZJb3Bd95mZULdHWwDttQRaxEkeLqUnoelXe6goGQIIjrDcXk/Cjkazv4AQNhSHAUgM0cSAB77D3Q==","signatures":[{"sig":"MEYCIQCtny55ZNCnm4DOPRWjxFpGS1Av1gzNNmLTevCbnde0IAIhAMIDy73L415o8JS8igAF96oXv7jLxKvOKF9WFDuXppf2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":420550},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.2.5","@aiquants/select-box":"0.4.1","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.2.5","@aiquants/select-box":"0.4.1"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.4.1_1785110089491_0.6674133174540691","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@aiquants/authz-react-router","version":"0.5.0","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.5.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"e7d590ef35e80366c6eee46fa0d0592783695943","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.5.0.tgz","fileCount":9,"integrity":"sha512-K00KnbV2VYT+BWSuilXjfSCHRnHHAya9v+qHINjTeVAhXQr3N6nHycOGdLg2768GRmB60ebIjzi3AxUK/4W2GQ==","signatures":[{"sig":"MEUCIQD+BW8QaMG/nWNdT6teQKOBDZcPh5Ezmrw99t8s6f4RggIgD36VcUYXOYaSz/suZc483ck43NFrlF3P69xkJ4PKFUk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":690575},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.3.0","@aiquants/select-box":"0.4.1","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.3.0","@aiquants/select-box":"0.4.1"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.5.0_1785927903170_0.959690734884814","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@aiquants/authz-react-router","version":"0.6.0","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.6.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"c4020e5cb1913104013fa26d5a2223c412e32f0c","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.6.0.tgz","fileCount":9,"integrity":"sha512-IjIKsUqzVIr+ASlkW/oaoYS4qC9kmvZY9KzVm7vOLVt5xUkIJ4LYKeoDsddSXt85wMFMlTDxEPi6fMkGU3raQA==","signatures":[{"sig":"MEUCIB0CgkHB5huiCFyMIAW1IlVHphZHXK5F+VUmd5BGFd8NAiEA4nXH10OtWu8fV+MYK92hSMriXVCMtakIha1+cWPBT10=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":705226},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.3.0","@aiquants/select-box":"0.6.3","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.3.0","@aiquants/select-box":"0.6.3"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.6.0_1786073258121_0.18126327435914913","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@aiquants/authz-react-router","version":"0.7.0","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.7.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"2a7cd6765c71ee7536285aea07d8b72f96c60342","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.7.0.tgz","fileCount":9,"integrity":"sha512-Kkfp7/sXOzl1nOLjh69v3/AEP10UQVAeaPl3y109mSCm7sUBbLjAcvMGL5QXE8JCGOBM1WFp3ts5scLeZsLWVQ==","signatures":[{"sig":"MEQCIFbC0ig/aecyZek0gBAO1twSmGcX7y2ZFRAcoSMHXkRSAiA0kXLSPPsFpe/BWj0FwkXNrrfVrdQ7wn3a4aeYgW5nkw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":784286},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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","typecheck:demo":"cd demo && pnpm run typecheck"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.8","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.4.0","@aiquants/select-box":"0.7.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.4.0","@aiquants/select-box":"0.7.2"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.7.0_1786372657417_0.5802994488286388","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@aiquants/authz-react-router","version":"0.7.1","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.7.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"425118fb8fdf8a6c13501ec2cd08d2967c47c89f","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.7.1.tgz","fileCount":9,"integrity":"sha512-aD4jlds8vQrSEcW7ttfcFvnygAQ+jDGc3NGnxoBSSyzFJWWK/VY6mmVGQJZ2U4QvIXCQn/YV1u4oiZ+o7TVdGg==","signatures":[{"sig":"MEQCIGrwjOi1UGHkpN087eylc97tve2g6nVz8ChX9RVp+pieAiAPwzpMqBMhUD+kDyR0/31HVheQve57UDQqiRcD4AJTTw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":784288},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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","typecheck:demo":"cd demo && pnpm run typecheck"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.10","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^7.13.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.4.0","@aiquants/select-box":"0.7.3","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0","@aiquants/authz-core":"^0.4.0","@aiquants/select-box":"^0.7.3"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.7.1_1786457801803_0.31131508141245523","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@aiquants/authz-react-router","version":"0.7.2","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.7.2","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"74a281642a2cd736b28a39b8932b4d231f536654","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.7.2.tgz","fileCount":9,"integrity":"sha512-Tn76k2OXCY2LxIZ7W0LsbRQ09up+nmL2ToXotvtpjFiwAKl0+Ll6vBw2a3RivtnGus+0DE5HaNBs62a2nYkQDg==","signatures":[{"sig":"MEYCIQDWpDksBmU3H/BfKURc0mcDy7Yj/tYZW12sx2L57iFrWQIhAJvGO9GZoxnWBOT3eEQ6/6Pyl6VFyVX0KkOUd1tR1/ES","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":784302},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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","typecheck:demo":"cd demo && pnpm run typecheck"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7 / v8) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.10","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^8.3.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.4.0","@aiquants/select-box":"0.7.4","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@aiquants/authz-core":"^0.4.0","@aiquants/select-box":"^0.7.4"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.7.2_1786538665932_0.9438346719745336","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@aiquants/authz-react-router","version":"0.8.0","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.8.0","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"5909e7074c9697e6026b9a1bf449a6b35ba12af0","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.8.0.tgz","fileCount":9,"integrity":"sha512-cht+py9O+3yud3z+fId0Lpac+BI4tCGrxXZP29AIWaIFXvqe+B2PQSW5Nu86cMrEasJWScs9flw4dUTCEPMKmQ==","signatures":[{"sig":"MEQCIEeuFYxh+M01yhThnhtbWp2H+aVv6nG/uE2lcjpVEBndAiBXkA7tmGD7YrnDJ5nRdvqPupHnrQN0aOZZPkxW9+yhtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1012208},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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","typecheck:demo":"cd demo && pnpm run typecheck"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7 / v8) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.10","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^8.3.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.5.0","@aiquants/select-box":"0.9.0","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@aiquants/authz-core":"^0.5.0","@aiquants/select-box":"^0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.8.0_1788170399901_0.7508863235353891","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@aiquants/authz-react-router","version":"0.8.1","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.8.1","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"5c1132469bcc9b8bfbfe7a5451adccbe527049f4","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.8.1.tgz","fileCount":9,"integrity":"sha512-TfwxQGdz5KhcgTAssHZgiq75YIpvT2uzAf4bXDaMvdIGX1PcsOOGTFtxv6nJz7pEe56pX6F+gXhRVUOSJnmeKg==","signatures":[{"sig":"MEQCIBdvyu7xLe9YqfiPfW57Do2+A/Z16bvkZFdpAsbqRtjxAiBvgpJXaNcZMXDnZ8YZEN5hxSprNnRiorEKhUmSw2TTDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1013254},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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","typecheck:demo":"cd demo && pnpm run typecheck"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7 / v8) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.10","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^8.3.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.6.0","@aiquants/select-box":"0.9.0","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@aiquants/authz-core":"^0.6.0","@aiquants/select-box":"^0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.8.1_1788972545889_0.5631082443256863","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@aiquants/authz-react-router","version":"0.8.2","keywords":["rbac","authorization","react-router","react","typescript"],"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","_id":"@aiquants/authz-react-router@0.8.2","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"dist":{"shasum":"0a7dcdd3cc9820587d529fe7b3b31aff1137dc94","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.8.2.tgz","fileCount":9,"integrity":"sha512-v38rnR5qi8wJSE1wHxFtdytiEF1/UT3qSMrpYJuIJZnLPbEnsU4epBXlR03KNmP1IMq3UYkS6tNlGisgqDP0+g==","signatures":[{"sig":"MEUCIDP6l/Sx+r5GR3HgmwP5zuhQlqSXzup6Rx7L8MKuSg1sAiEAuu+7LLdwbptHuno8TovLKve1lNk4uDvbFSiV2s7W698=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1018592},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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","typecheck:demo":"cd demo && pnpm run typecheck"},"_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"description":"React Router (v7 / v8) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.10","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^8.3.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.6.0","@aiquants/select-box":"0.9.0","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@aiquants/authz-core":"^0.6.0","@aiquants/select-box":"^0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/authz-react-router_0.8.2_1788977204213_0.22851554149214226","host":"s3://npm-registry-packages-npm-production"}},"0.8.3":{"_id":"@aiquants/authz-react-router@0.8.3","dist":{"shasum":"e4a22b082d4602171a16917c6764273c348de9eb","tarball":"https://registry.npmjs.org/@aiquants/authz-react-router/-/authz-react-router-0.8.3.tgz","fileCount":7,"integrity":"sha512-uPrR7WcC2TlIfaRL9IOkAGO58NPKo+bc3USLq/mPCd3PZyWvIQpwL0dL/yXSC8G6IKEAKN8U9x98D0G4lO77dw==","signatures":[{"sig":"MEUCIQCjJd2+U/2unxgi2pz8s7Ez+R49j9dlZjF04qvW6DncpgIgLbWaVEJabwQxI0/y9frfqFK+2wBdLgZsFW+8eKsHS6Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDXQe2rlukO7iM5Li+85ZTVOgK+/SM5udShl/ly8oVZugIhAMj03l5HodQqmnHPPivFpcZdwp5BrsenI80CuLPVyWlg"}],"unpackedSize":237141},"main":"dist/index.js","name":"@aiquants/authz-react-router","types":"dist/index.d.ts","author":{"url":"https://x.com/fehdek","name":"fehde-k"},"module":"dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"license":"MIT","scripts":{"dev":"tsup --watch","lint":"biome lint src/","test":"vitest run","build":"tsup && node ../../.config/scripts/strip-dts-comments.mjs dist","check":"biome check src/","clean":"rimraf dist","demo:dev":"cd demo && pnpm run dev","check:fix":"biome check --write src/","typecheck":"tsc --noEmit","demo:build":"cd demo && pnpm run build","demo:start":"cd demo && pnpm run start","build:watch":"tsup --watch","license-check":"pnpm dlx license-checker --production --onlyAllow \"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;Unlicense\"","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","typecheck:demo":"cd demo && pnpm run typecheck"},"version":"0.8.3","_npmUser":{"name":"fehde","email":"genbu0498@gmail.com"},"keywords":["rbac","authorization","react-router","react","typescript"],"description":"React Router (v7 / v8) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","directories":{},"maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"sideEffects":false,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^27.4.0","react":"^19.2.7","rimraf":"^6.1.2","vitest":"^4.1.10","react-dom":"^19.2.7","typescript":"^5.9.3","@types/react":"^19.2.7","react-router":"^8.3.0","@vitest/coverage-v8":"^4.1.8","@aiquants/authz-core":"0.6.1","@aiquants/select-box":"0.9.2","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18","react-router":"^7.0.0 || ^8.0.0","@aiquants/authz-core":"^0.6.1","@aiquants/select-box":"^0.9.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/authz-react-router_0.8.3_1789699508814_0.16436540492510532"}}},"time":{"created":"2026-06-25T06:59:25.207Z","modified":"2026-09-18T02:45:09.081Z","0.1.0":"2026-06-25T06:59:25.471Z","0.1.1":"2026-06-29T08:38:32.076Z","0.2.0":"2026-07-01T03:39:55.023Z","0.2.1":"2026-07-01T09:34:29.799Z","0.2.2":"2026-07-16T02:22:38.135Z","0.2.3":"2026-07-23T01:21:17.678Z","0.2.4":"2026-07-23T02:23:52.197Z","0.2.5":"2026-07-24T06:39:17.826Z","0.2.6":"2026-07-24T09:04:34.480Z","0.3.0":"2026-07-25T06:35:56.213Z","0.4.0":"2026-07-25T23:54:47.677Z","0.4.1":"2026-07-26T23:54:49.660Z","0.5.0":"2026-08-05T11:05:03.320Z","0.6.0":"2026-08-07T03:27:38.313Z","0.7.0":"2026-08-10T14:37:37.830Z","0.7.1":"2026-08-11T14:16:41.966Z","0.7.2":"2026-08-12T12:44:26.087Z","0.8.0":"2026-08-31T10:00:00.035Z","0.8.1":"2026-09-09T16:49:06.042Z","0.8.2":"2026-09-09T18:06:44.413Z","0.8.3":"2026-09-18T02:45:08.895Z"},"author":{"url":"https://x.com/fehdek","name":"fehde-k"},"license":"MIT","keywords":["rbac","authorization","react-router","react","typescript"],"description":"React Router (v7 / v8) adapter for @aiquants/authz-core: requirePermission/getMyPermissions guards, usePermission hook, and MyPermissionIndicator component.","maintainers":[{"name":"fehde-k","email":"owner@aiquants.co.jp"},{"name":"fehde","email":"genbu0498@gmail.com"}],"readme":"# @aiquants/authz-react-router\n\nReact Router (v7) adapter for [`@aiquants/authz-core`](https://www.npmjs.com/package/@aiquants/authz-core). Binds `appKey` + DI deps and provides loader/action guards, a hook, and a self-permission indicator component.\n\n## Install\n\nMonorepo (already a pnpm workspace package):\n\n```jsonc\n// consumer package.json\n\"dependencies\": {\n  \"@aiquants/authz-core\": \"workspace:*\",\n  \"@aiquants/authz-drizzle\": \"workspace:*\",\n  \"@aiquants/authz-react-router\": \"workspace:*\"\n}\n```\n\nExternal projects:\n\n```bash\npnpm add @aiquants/authz-react-router react react-router   # peers: react >=18, react-router ^7\n```\n\n`react` / `react-router` are **peer dependencies**; `@aiquants/authz-core` is transitive. Pair with `@aiquants/authz-drizzle` (or another adapter) for `getEffectivePermissions`. Build / test: `pnpm run build` / `pnpm run test`.\n\n## Full integration (zero → guarded endpoint)\n\nThis walkthrough takes a React Router v7 app from nothing to a permission-guarded loader. It uses all three TS packages.\n\n**Step 0 — install & create tables.** Install the three packages (above) plus your DB stack. Run the **DDL** and **bootstrap seed** from the `@aiquants/authz-drizzle` README once (this creates `dbo_authz` and an initial admin). You also need a **user table** with a numeric id and a way to resolve the current request to that id (your existing auth/session).\n\n**Step 1 — wire it once.** Bind your `appKey`, how to resolve a user id, and how to load grants (delegated to the drizzle adapter).\n\n```ts\n// app/services/authz/config.ts\nimport { defineAuthzSchema, getEffectivePermissionsMany, listResourceKeys } from \"@aiquants/authz-drizzle\"\nimport { createAuthz } from \"@aiquants/authz-react-router\"\nimport { db } from \"~/db.server\"            // your drizzle handle\nimport { Users } from \"~/models/Users\"      // your user table (has numeric id)\nimport { getSessionUser } from \"~/auth.server\"\n\nexport const authzTables = defineAuthzSchema(\"dbo_authz\", { userTable: Users })\n\nconst authz = createAuthz({\n  appKey: \"myapp\",\n  // request → your user id (or null → checked against \"@anonymous\" permissions)\n  resolveUserId: async (request) => (await getSessionUser(request))?.id ?? null,\n  // request → the tenant this request acts within (subdomain / header / session). REQUIRED.\n  // Fail fast: `?? \"default\"` would authorize a session-less request inside the default tenant.\n  resolveTenantId: async (request) => {\n    const user = await getSessionUser(request)\n    if (!user?.tenantId) throw new Response(\"tenant unresolved\", { status: 400 })\n    return user.tenantId\n  },\n  // request + tenant → may this caller act AS that tenant? REQUIRED, and never `() => true`:\n  // resolveTenantId only says WHICH tenant was named, which on every transport the client can influence.\n  assertTenantMembership: async (request, tenantId) => (await getSessionUser(request))?.tenantId === tenantId,\n  // load + merge this user's grants for MANY resources in one round-trip\n  getEffectivePermissions: (args) => getEffectivePermissionsMany(db, authzTables, args),\n  // optional: lets `getMyPermissions(request)` report on every registered resource of that tenant\n  listResourceKeys: (_request, tenantId) => listResourceKeys(db, authzTables, \"myapp\", tenantId),\n})\n\nexport const { requirePermission, getMyPermissions } = authz\n```\n\n> If your DB pool can be cold at the first request (serverless / lazy connect), have `resolveUserId` and `getEffectivePermissions` await a connection-ready guard first — otherwise a cold-start DB error can surface as a misleading 403 instead of a 500.\n\n> **Tenancy is not optional.** Every check happens inside exactly one tenant, so `resolveTenantId` is a required port and\n> its result must be a non-empty string. Returning `\"\"` / `null` raises `AuthzTenantError` **before** the permission port\n> is consulted — it never degrades into \"no filter\", which would hand the caller every tenant's grants. The guard also\n> verifies that the permission it received was issued for the requested tenant and denies (`reason: \"tenant-mismatch\"`)\n> when it was not, so a store that forgets its predicate cannot turn into cross-tenant access.\n>\n> **Naming a tenant is not the same as belonging to it.** `resolveTenantId` answers *which* tenant the request named, and\n> on every transport that name is ultimately client-influenced (a header, a sub-domain, a cookie). `assertTenantMembership`\n> is therefore also required, with no permissive default: without it a user of tenant A is authorized inside tenant B by\n> simply naming tenant B — B's `@authenticated` grants apply, and every tenant check still passes because the permission\n> genuinely belongs to B. It is consulted **before** any permission is loaded and denies with `reason:\n> \"not-a-tenant-member\"`. `userId` is `null` for an anonymous caller; a tenant's `@anonymous` grants are public by\n> construction, so returning `true` there is the usual answer.\n>\n> Do **not** substitute a fallback tenant (`?? \"default\"`). A request that cannot name its tenant is a request that must\n> not be authorized — substituting one silently moves the missing-tenant-means-all-tenants inversion out of the library\n> and into every consumer.\n\n**Step 2 — guard a loader/action, apply scope, and render the badge.** On allow you get `{ userId, scope, permission }` from a **single** evaluation, so you can authorize, narrow the data, *and* tell the user what they may do — without asking the database a second time.\n\n```ts\n// app/routes/report.tsx\nimport { buildRowScopeWhere, maskColumns } from \"@aiquants/authz-drizzle\"\nimport { requirePermission } from \"~/services/authz/config\"\nimport { db } from \"~/db.server\"\nimport { Report } from \"~/models/Report\"\n\nexport async function loader({ request }: { request: Request }) {\n  const { scope, permission } = await requirePermission(request, { resourceKey: \"report\", action: \"read\" })\n  // map the scope's logical field names → real columns (per endpoint; the core layer doesn't know your table)\n  const columnMap = { dept: Report.dept, amount: Report.amount }\n  const where = buildRowScopeWhere(scope.rowScope, columnMap)   // undefined = all rows; 1=0 = no rows\n  const rows = await (where ? db.select().from(Report).where(where) : db.select().from(Report))\n  return { rows: maskColumns(rows, scope.columnScope), permission }   // deny disallowed columns before returning\n}\n// denied → AuthzDeniedError (throw a 403 Response in your error boundary, or pass options.failureRedirect)\n```\n\n> **Guarding a sub-resource endpoint? Use `requirePermission`, not a hand-rolled check.** Reading a boolean off a\n> permission map and throwing your own 403 duplicates the decision — and a typo in the field name reads as `undefined`,\n> i.e. a silent denial. `requirePermission` is the only thing that decides access; `getMyPermissions` exists to *display*\n> permissions, not to enforce them.\n\n**Step 3 — register the resource + grant.** Insert a `TMResource('myapp','report')` and a `TDRolePermission` for the role(s) that should see it. Either run SQL, or build a tiny admin screen with the CRUD helpers (see the host app's admin guide). Example grant: \"role `viewer` may `read` report, rows where dept ∈ {A}, hiding the amount column\":\n\n```sql\n-- row_scope / column_scope are the scope-contract JSON from @aiquants/authz-core\nINSERT INTO dbo_authz.TDRolePermission (role_id, resource_id, action, row_scope, column_scope)\nSELECT r.id, res.id, 'read',\n       N'{\"filters\":[{\"field\":\"dept\",\"op\":\"in\",\"values\":[\"A\"]}]}',\n       N'{\"mode\":\"deny\",\"columns\":[\"amount\"]}'\nFROM dbo_authz.TMRole r JOIN dbo_authz.TMResource res ON res.app_key='myapp' AND res.resource_key='report'\nWHERE r.role_key='viewer';\n```\n\n**Step 4 — show the user their permissions.** For the page's own resource, the badge data already came back from\n`requirePermission` (Step 2). `getMyPermissions` is for the *other* resources a screen wants to describe:\n\n```ts\n// several named resources — one round-trip, and the returned keys are typed from the argument,\n// so `myPermissions.reprot` is a compile error rather than an `undefined` at runtime\nconst myPermissions = await getMyPermissions(request, { resourceKeys: [\"report\", \"report_comment\"] })\n\n// from a defineResources registry, keeping the keys literal-typed\nconst fromRegistry = await getMyPermissions(request, { resourceKeys: resourceKeysOf(REPORT_RESOURCES) })\n\n// or every resource registered for the app (needs the `listResourceKeys` port)\nconst all = await getMyPermissions(request)\n```\n\n```tsx\nimport { MyPermissionIndicator, MyPermissionStatus } from \"@aiquants/authz-react-router\"\n\n// 1. Single indicator badge group\n<MyPermissionIndicator permission={myPermissions.report} resourceName=\"Monthly Report\" />\n\n// 2. Full \"your permissions\" status bar component for any page header/toolbar\n<MyPermissionStatus permission={myPermissions.report} resourceName=\"Monthly Report\" />\n// → \"あなたの権限: [閲覧 ○][編集 △][削除 ×]\" with the tooltip \"対象リソース: Monthly Report (report)\"\n```\n\n> ⚠️ Unlike the admin shell's `labels`, these two components ship **Japanese** defaults (`\"あなたの権限\"`, `\"閲覧\"` /\n> `\"編集\"` / `\"削除\"`, `\"部分制限\"`, and the `対象リソース: …` tooltip). Pass `prefixLabel` and `labels` to localize them.\n\n## Scope cheat-sheet (row / column scope contract)\n\nThe JSON you put in `row_scope` / `column_scope` (full contract in `@aiquants/authz-core`):\n\n```jsonc\n// row_scope — which rows. NULL/empty = all rows. filters are AND'd. op ∈ in|notIn|eq|ne. null in values → IS (NOT) NULL.\n{ \"filters\": [ { \"field\": \"dept\", \"op\": \"in\", \"values\": [\"A\",\"B\"] } ] }\n// column_scope — which columns. NULL/empty = all columns.\n{ \"mode\": \"deny\",  \"columns\": [\"amount\"] }   // deny = hide these; allow = show only these\n```\n\nMultiple roles **union** (wider wins): rows OR'd (any `NULL` ⇒ all rows); columns merged to the wider set. Anything unparseable fails **closed** (0 rows / 0 columns).\n\n## API\n\n- `createAuthz({ appKey, resolveUserId, resolveTenantId, assertTenantMembership, resolveGroupIds?, getEffectivePermissions, listResourceKeys?, onDeny? })` → `{ requirePermission, getMyPermissions }`.\n- `resolveTenantId(request)` → the tenant id this request acts within. **Required, non-empty**; forwarded to every `getEffectivePermissions` call and returned by `requirePermission`. A blank result throws `AuthzTenantError`.\n- `assertTenantMembership(request, tenantId, userId)` → may this caller act **as** that tenant? **Required**, no permissive default; consulted before any permission is loaded, and `false` denies with `reason: \"not-a-tenant-member\"` (and reports no permissions at all from `getMyPermissions`).\n- `getEffectivePermissions({ userId, tenantId, groupIds?, appKey, resourceKeys })` → `Record<resourceKey, EffectivePermission | null>`. **One call, many resources** — pair it with `getEffectivePermissionsMany` from `@aiquants/authz-drizzle` and N resources cost one round-trip. Keys the port omits are treated as \"no permission\" (fail-close).\n- `listResourceKeys(request, tenantId)` → every resource key registered for the app **within that tenant**. Optional; configuring it is what makes the no-argument `getMyPermissions(request)` legal. Without it that call throws `AuthzUsageError` naming both remedies instead of guessing. The tenant arrives already resolved and validated, so a host never derives it a second time.\n- `resolveGroupIds(request, tenantId)` → the acting user's group ids within that tenant. Forwarded automatically to `getEffectivePermissions` by both `requirePermission` and `getMyPermissions`, so group-granted roles count toward effective permissions. Returning `null`/`undefined` (or omitting the port) sends no `groupIds` at all.\n  ⚠️ Without this port, roles assigned to groups in the admin UI have **no runtime effect** — the store writes succeed and the UI looks correct, so the failure is silent. Cover the wiring with a test.\n- `requirePermission(request, {resourceKey, action}, options?)` → `{ userId, tenantId, scope, permission }` on allow: the scope for row WHERE / column mask, **and** the `PermissionView` derived from the very same evaluation (no second lookup, so the guard and the badge can never disagree). Denies throw `AuthzDeniedError` (403), or `throw redirect(options.failureRedirect)` when set. A malformed query (blank `resourceKey`, unknown `action`, or the derived `\"write\"`) throws `AuthzUsageError` before anything is loaded — a mistake surfaces as a 500 you can read, never as a mysterious 403.\n- `getMyPermissions(request, {resourceKeys})` → `Record<K, PermissionView>` where `K` is the literal union of the keys you passed, so an unrequested key is a **compile error** rather than a runtime `undefined`. `getMyPermissions(request)` reports on every registered resource (requires `listResourceKeys`). Duplicate keys collapse; an empty list asks the database nothing.\n  ⚠️ The no-argument form's result **keys are your app's resource inventory**. Every value is still evaluated fail-closed (an unauthenticated caller gets all-false views), but do not hand the whole map to an unauthenticated client if the resource names themselves are sensitive — name the resources you actually render instead.\n- `AuthzUsageError` — thrown for API misuse (missing/ill-typed arguments, missing port). Deliberately distinct from `AuthzDeniedError`: misuse must not masquerade as a denial.\n- `defineResources({ ... })` → Type-safe centralized resource registry helper for resource keys and display names. Keys stay **literal-typed**.\n- `resourceKeysOf(registry)` → the registry's resource keys as a literal union array. Use it instead of `Object.keys(registry)`, which both widens to `string[]` (losing the key check on the permission map) and returns *property names* — wrong for entries that set an explicit `key`.\n- `toPermissionView(resourceKey, perm)` → serializable view (loader → client).\n- `usePermission(view)` → the same `can*` booleans plus ○△× display states (`readState`/`writeState`/`deleteState`); pure, safe in render.\n- `<MyPermissionIndicator permission={view} resourceName=\"Documents\" expectedResourceKey=\"documents\" />` → read / write(create∪update) / delete as ○△×. `read` is △ when row/column-restricted; `write` is ○ only when both create & update are held, △ when one. Hover shows resource name & key tooltip. Automatically flags mismatches if `permission.resourceKey !== expectedResourceKey`.\n- `<MyPermissionStatus permission={view} resourceName=\"Documents\" expectedResourceKey=\"documents\" prefixLabel=\"Your Permissions\" />` → Reusable status component combining prefix label and permission indicator badges for any application page.\n- `<MyPermissionGroupStatus items={[{ resourceName: \"Primary Resource\", permission: primaryView }, { resourceName: \"Sub Resource\", permission: subView, level: 1 }]} variant=\"pills\" | \"popover\" size=\"xs\" labels={{ fullWrite: \"Writable\", readOnly: \"Read-only\" }} />` → Multi-resource permission widget for pages with multiple distinct resource scopes. Supports inline status tags (`variant=\"pills\"`), single-button popover cards (`variant=\"popover\"`), hierarchical tree indentation via `level` / `children`, and fully customizable status label mappings (`labels`).\n\n## One vocabulary, one decision\n\nTwo rules make the whole surface predictable, and both exist because their absence produced real production bugs:\n\n1. **Every permission boolean is `can*`, everywhere.** `PermissionView` and `usePermission()` expose the *same*\n   `canRead` / `canCreate` / `canUpdate` / `canDelete` / `canWrite` names. Previously the view said `read` while the hook\n   said `canRead`, so reading `view.canRead` yielded `undefined` — falsy, therefore a **silent denial** that looked like\n   an authorization bug. A verb-shaped field is also undestructurable (`const { delete } = view` is a syntax error).\n2. **The guard decides once.** `requirePermission` returns the UI view built from the permission it just evaluated, so\n   there is no second query that could return a different answer. (The old `requireAndGetPermission` claimed to be\n   atomic but issued two independent lookups; it is gone — `requirePermission` always returns `permission`.)\n\n### Migrating from 0.6.x\n\n| Before | Now |\n| --- | --- |\n| `permissionView.read` / `.create` / `.update` / `.delete` / `.write` | `.canRead` / `.canCreate` / `.canUpdate` / `.canDelete` / `.canWrite` |\n| `requireAndGetPermission(request, query)` | `requirePermission(request, query)` — it already returns `permission` |\n| `getEffectivePermissions: (args) => …(args.resourceKey)` (one resource) | `getEffectivePermissions: (args) => …(args.resourceKeys)` returning a record (many resources) |\n| `createAuthzAdminApp({ …, getMyPermissions })` | port removed — the admin shell reads its badge off the guard |\n| `createAuthzAdminApp({ requirePermission })` resolving to `{ userId }` | must now resolve to `{ userId, tenantId, permission }` — pass `createAuthz`'s `requirePermission` directly, or add both fields to a hand-rolled guard |\n| `createAuthz({ … })` without `resolveTenantId` | the port is **required**; omitting it throws `AuthzUsageError` at factory time |\n| `createAuthz({ … })` without `assertTenantMembership` | also **required**; naming a tenant never proves membership in it, so omitting it throws `AuthzUsageError` at factory time |\n| `getEffectivePermissions({ userId, appKey, resourceKeys })` | `tenantId` is now always present and non-empty — scope your query by it (never treat its absence as \"all tenants\") |\n| `AuthzAdminStore` methods called without a tenant (`listRoles()`, `deleteRole(id)`, …) | every method takes a required `tenantId` first (`listRoles(tenantId)`, `deleteRole(tenantId, id)`); `RoleInput` / `RoleUpdate` / `ResourceInput` / `GrantInput` also name their target tenant |\n| `usePermission(view)` → `{ canRead, canWrite, canDelete, …States }` | adds `canCreate` / `canUpdate`, so it is a superset of the view's booleans |\n| `expectedResourceKey?: string` on the indicator components | now `NoInfer<K>` — bound to the permission's own key, so a mismatch is a compile error (0.6.x code that deliberately passed a different key stops compiling) |\n| `createAuthzAdminServer(...).loadMyPermissions` | removed — `layoutGuard` returns `{ userId, myPermissions }` from the guard it already runs |\n| `getMyPermissions(request, { resourceKeys: someStringArray })` → total map | values are now `PermissionView \\| undefined` whenever the keys are not literals (a runtime-built list cannot promise which keys exist). Pass literals or `resourceKeysOf(registry)` to keep the total map, or add the presence check |\n| `getMyPermissions(request)` → `TypeError` | configure `listResourceKeys`, or pass `{ resourceKeys }` — otherwise a named `AuthzUsageError` |\n\n**Requirements.** TypeScript ≥ 5.4 to consume the emitted `.d.ts` (the indicator props use the built-in `NoInfer`), and\nan ES2022 runtime for `Object.hasOwn` (Node ≥ 16.9 — the package already declares `engines.node >= 18` — and any\nbrowser from 2022 on).\n\n> `AuthzUsageError` is a **programmer** error, so it travels like any other thrown error: React Router hands the\n> boundary a sanitized error outside development, and the actionable message lands in your **server log**. Read it\n> there — the browser will only show the generic 500 body.\n\n`readPartial` and `actions` keep their names (they are not booleans about an action).\n\n## Admin UI tabs\n\nThe splat-mounted admin app (`createAuthzAdminApp`) serves `roles`, `resources`, `role_permissions`, `user_roles`, plus:\n\n- **`group_roles`** — assign/revoke roles for a group. Group names are read from the group table; they are never synthesized from ids.\n- **`graph`** — a read-only topology map of *resource → role → group → user*. Nodes with no connections are hidden, and selecting a node highlights only the paths that actually reach it. Node dimming and edge highlighting are driven by the **same** predicate, so an edge never glows while both of its endpoints are dimmed; edges carry `data-testid` and `data-active` so this stays testable.\n\nReads require `read` on the admin resource; writes require the verb matching their effect (`create` / `update` / `delete`).\n\n### Tenancy in the admin UI\n\nThe whole screen is scoped to the tenant `resolveTenantId` returned for the request — the shell shows it\n(`data-testid=\"authz-tenant-badge\"`), every table has a tenant column, and the create-role / create-resource /\ncreate-grant forms carry a `tenantId` field prefilled with it.\n\nTwo rules make that more than decoration:\n\n- **The form's tenant never widens the request's.** A submitted `tenantId` states which tenant the payload targets; it is\n  compared with the guard's tenant and a mismatch is refused with 403. Neither side is preferred.\n- **Every mutation re-checks ownership server-side.** Ids arrive from a form, so before writing, the target row is loaded\n  within the tenant and its **own** `tenantId` compared. A filtered list is not an authorization check: if the store ever\n  dropped its predicate, every id in the database would look owned. A row that is absent *or* foreign is refused\n  identically (403), so the screen cannot be used to probe which ids exist in another tenant.\n\n## Demo App\n\nThis package contains an interactive React Router 7 SPA demo in the `demo/` subdirectory. The demo app runs completely in the browser, using `localStorage` to mock database storage.\n\n### Features\n\n- **Role-Based Access Control**: Demonstrates role switching (Admin, Manager, Operator, Reader) and how it affects UI elements.\n- **Route Guards**: Uses `authz.requirePermission` to protect routes and handle unauthorized access.\n- **Scope Verification**: Demonstrates `rowScope` (row filters) and `columnScope` (masked values) dynamically applied based on the active role's permissions.\n- **In-Browser Database Reset**: Includes a **\"Reset Demo Data\"** button in the header of key views (Dashboard, Protected Documents, and Sales pages) to wipe customized roles, assignments, permissions, and CRUD data from `localStorage`, instantly restoring default test states.\n\n### Running the Demo\n\nFrom the project root:\n\n```bash\npnpm --filter authz-react-router-demo dev\n```\n\nOpen `http://localhost:5178/` in your browser.\n\n## Testing\n\nPlaywright tests are included in the `demo/` package to verify the RBAC features, CRUD interactions, and the data reset functionality.\n\n### Running Integration Tests\n\nEnsure the dev server is running, then run Playwright tests from the workspace root:\n\n```bash\n# Run all tests in the demo package\npnpm exec playwright test packages/authz-react-router/demo/\n\n# Run specific tests\npnpm exec playwright test packages/authz-react-router/demo/integration-tests.spec.ts\npnpm exec playwright test packages/authz-react-router/demo/check.spec.ts\n```\n\n- **`integration-tests.spec.ts`**: Runs a comprehensive workflow verifying permission guards, dynamic role granting/revocation in the Admin Panel, row/column scoping on sales data, CRUD validation, and the final state reset.\n- **`check.spec.ts`**: Verifies basic CRUD operations (list, create, update, delete) on protected document files.\n\n## License\n\nMIT\n","readmeFilename":""}