{"_id":"@dudousxd/nestjs-authz-client","_rev":"4-5693cc519b1e0b3a29c789710f2b5ec5","name":"@dudousxd/nestjs-authz-client","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@dudousxd/nestjs-authz-client","version":"0.1.0","keywords":["nestjs","authorization","authz","abilities","can","client"],"author":{"name":"Davi Carvalho","email":"davi@goflip.ai"},"license":"MIT","_id":"@dudousxd/nestjs-authz-client@0.1.0","maintainers":[{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"}],"homepage":"https://github.com/DavideCarvalho/nestjs-authz#readme","bugs":{"url":"https://github.com/DavideCarvalho/nestjs-authz/issues"},"dist":{"shasum":"254f6d760976929c05c95db69d7f053e6f06f224","tarball":"https://registry.npmjs.org/@dudousxd/nestjs-authz-client/-/nestjs-authz-client-0.1.0.tgz","fileCount":12,"integrity":"sha512-fh1g/HjjqOMiIB0mU8BfGnv8lKBxwaTMG/V1gePzJlJo4IpyVwH7zNTAPvxe9RFcqmsJGz0bNJ6I3I+1HnHn+w==","signatures":[{"sig":"MEYCIQCVsYiT5CKQJwMkWTDIlptgm0YGSAmFoe6Pr9svYZKr6AIhAOiFXXltzQGvtzmnQbWUBHBJ31ZPk5m8vACbXdpcSHr6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dudousxd%2fnestjs-authz-client@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22234},"main":"./dist/index.js","type":"module","_from":"file:dudousxd-nestjs-authz-client-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"},"_resolved":"/tmp/2bb3683b47966f8e3628cd28f444af43/dudousxd-nestjs-authz-client-0.1.0.tgz","_integrity":"sha512-fh1g/HjjqOMiIB0mU8BfGnv8lKBxwaTMG/V1gePzJlJo4IpyVwH7zNTAPvxe9RFcqmsJGz0bNJ6I3I+1HnHn+w==","repository":{"url":"git+https://github.com/DavideCarvalho/nestjs-authz.git","type":"git","directory":"packages/client"},"_npmVersion":"10.8.2","description":"Framework-neutral, in-memory ability store + can() resolver for @dudousxd/nestjs-authz — hydrate decisions once and answer client checks with no network request.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-authz-client_0.1.0_1781704712620_0.2004574276770259","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dudousxd/nestjs-authz-client","version":"0.1.1","keywords":["nestjs","authorization","authz","abilities","can","client"],"author":{"name":"Davi Carvalho","email":"davi@goflip.ai"},"license":"MIT","_id":"@dudousxd/nestjs-authz-client@0.1.1","maintainers":[{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"}],"homepage":"https://github.com/DavideCarvalho/nestjs-authz#readme","bugs":{"url":"https://github.com/DavideCarvalho/nestjs-authz/issues"},"dist":{"shasum":"b6ca716b78fb95e929c8e7b008a3fb6cfd681d2b","tarball":"https://registry.npmjs.org/@dudousxd/nestjs-authz-client/-/nestjs-authz-client-0.1.1.tgz","fileCount":12,"integrity":"sha512-1DpjEuCH2vfUBoEiUPhu2hkxcPdueb0uS6BEZ1+b7SAPFQ+ig+cdVc3nDoQbV/snJ+SJoKI8enm+Cc91Uf54wg==","signatures":[{"sig":"MEYCIQD6KGsGTD/aQeUm9qk1R4dJ1uaN/INbWSfXN1XgJYJl7AIhANjZnc2+XnBTb0IU8D3CeoiY19bpbbuL460ay7VG45ny","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dudousxd%2fnestjs-authz-client@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":23314},"main":"./dist/index.js","type":"module","_from":"file:dudousxd-nestjs-authz-client-0.1.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"},"_resolved":"/tmp/f54d8acb66a36a09362386f60ca890ce/dudousxd-nestjs-authz-client-0.1.1.tgz","_integrity":"sha512-1DpjEuCH2vfUBoEiUPhu2hkxcPdueb0uS6BEZ1+b7SAPFQ+ig+cdVc3nDoQbV/snJ+SJoKI8enm+Cc91Uf54wg==","repository":{"url":"git+https://github.com/DavideCarvalho/nestjs-authz.git","type":"git","directory":"packages/client"},"_npmVersion":"10.8.2","description":"Framework-neutral, in-memory ability store + can() resolver for @dudousxd/nestjs-authz — hydrate decisions once and answer client checks with no network request.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-authz-client_0.1.1_1781707215234_0.10548536857466839","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@dudousxd/nestjs-authz-client","version":"0.2.0","keywords":["nestjs","authorization","authz","abilities","can","client"],"author":{"name":"Davi Carvalho","email":"davi@goflip.ai"},"license":"MIT","_id":"@dudousxd/nestjs-authz-client@0.2.0","maintainers":[{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"}],"homepage":"https://github.com/DavideCarvalho/nestjs-authz#readme","bugs":{"url":"https://github.com/DavideCarvalho/nestjs-authz/issues"},"dist":{"shasum":"28f8013e409d5266ea15001549ef1b318b19f8b2","tarball":"https://registry.npmjs.org/@dudousxd/nestjs-authz-client/-/nestjs-authz-client-0.2.0.tgz","fileCount":12,"integrity":"sha512-IeaaqlDDsLc2KepXSFn3mWcCUQYavtoZ1jP/1h7rvZDb4fT3+gaJ4oPPRdTFwrbGu2NcP4RqFq1L+VcWRJ4lUw==","signatures":[{"sig":"MEYCIQCk+8Eu2F36BmNLbSeRn/UnCMEERsL8AYKPUGccXRNbJQIhAKBr0he9j38J2veVCCHFQ6UmFznC3+9CuOk2bgPu5r2R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dudousxd%2fnestjs-authz-client@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":33764},"main":"./dist/index.js","type":"module","_from":"file:dudousxd-nestjs-authz-client-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"},"_resolved":"/tmp/3efe025bcdb037923c7b4193f7370f21/dudousxd-nestjs-authz-client-0.2.0.tgz","_integrity":"sha512-IeaaqlDDsLc2KepXSFn3mWcCUQYavtoZ1jP/1h7rvZDb4fT3+gaJ4oPPRdTFwrbGu2NcP4RqFq1L+VcWRJ4lUw==","repository":{"url":"git+https://github.com/DavideCarvalho/nestjs-authz.git","type":"git","directory":"packages/client"},"_npmVersion":"10.8.2","description":"Framework-neutral, in-memory ability store + can() resolver for @dudousxd/nestjs-authz — hydrate decisions once and answer client checks with no network request.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-authz-client_0.2.0_1781797246491_0.9753538357031533","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@dudousxd/nestjs-authz-client","version":"0.2.1","description":"Framework-neutral, in-memory ability store + can() resolver for @dudousxd/nestjs-authz — hydrate decisions once and answer client checks with no network request.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/DavideCarvalho/nestjs-authz.git","directory":"packages/client"},"author":{"name":"Davi Carvalho","email":"davi@goflip.ai"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"devDependencies":{"typescript":"^5.4.0","vitest":"^3.0.0"},"engines":{"node":">=20"},"keywords":["nestjs","authorization","authz","abilities","can","client"],"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run --passWithNoTests","test:watch":"vitest","typecheck":"tsc -p tsconfig.json --noEmit"},"_id":"@dudousxd/nestjs-authz-client@0.2.1","bugs":{"url":"https://github.com/DavideCarvalho/nestjs-authz/issues"},"homepage":"https://github.com/DavideCarvalho/nestjs-authz#readme","_integrity":"sha512-+zJ0we4xM5WGankz6r9nM9VDsB5nkLMIwC7uZdSf5IEKH6oxA3zo78hoD73jNaERqRbJ8wG2kCft6EaDy4om7w==","_resolved":"/tmp/4549841bf05a9bf95623a73b2105cfc3/dudousxd-nestjs-authz-client-0.2.1.tgz","_from":"file:dudousxd-nestjs-authz-client-0.2.1.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-+zJ0we4xM5WGankz6r9nM9VDsB5nkLMIwC7uZdSf5IEKH6oxA3zo78hoD73jNaERqRbJ8wG2kCft6EaDy4om7w==","shasum":"dcdd0297295abaac60ba959fce41acff8d3cb8a9","tarball":"https://registry.npmjs.org/@dudousxd/nestjs-authz-client/-/nestjs-authz-client-0.2.1.tgz","fileCount":12,"unpackedSize":34552,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dudousxd%2fnestjs-authz-client@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGWHEqtrMbnevuWZcW8gP9OXASwiI6bVWqsvxkLJvZVnAiEAqeVJx8nJD6yzm8Hwj+LJFGi6ITic+xb4Mxbbi1YiXWo="}]},"_npmUser":{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"},"directories":{},"maintainers":[{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-authz-client_0.2.1_1782475186889_0.14593168455837158"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-17T13:58:32.394Z","modified":"2026-06-26T11:59:47.278Z","0.1.0":"2026-06-17T13:58:32.755Z","0.1.1":"2026-06-17T14:40:15.384Z","0.2.0":"2026-06-18T15:40:46.619Z","0.2.1":"2026-06-26T11:59:47.025Z"},"bugs":{"url":"https://github.com/DavideCarvalho/nestjs-authz/issues"},"author":{"name":"Davi Carvalho","email":"davi@goflip.ai"},"license":"MIT","homepage":"https://github.com/DavideCarvalho/nestjs-authz#readme","keywords":["nestjs","authorization","authz","abilities","can","client"],"repository":{"type":"git","url":"git+https://github.com/DavideCarvalho/nestjs-authz.git","directory":"packages/client"},"description":"Framework-neutral, in-memory ability store + can() resolver for @dudousxd/nestjs-authz — hydrate decisions once and answer client checks with no network request.","maintainers":[{"name":"dudousxd","email":"davi_carvalho96@hotmail.com"}],"readme":"# @dudousxd/nestjs-authz-client\n\nFramework-neutral, in-memory ability store + `can()` resolver for\n[`@dudousxd/nestjs-authz`](../core). Hydrate a user's decisions once (from Inertia\nshared props, a JSON island, or any source) and answer client-side `can(...)` checks\n**synchronously, with no network request**.\n\nNo dependency on React/Vue/NestJS/Inertia — it is pure TypeScript plus an injectable\n`fetch`. The `-react` and `-inertia` packages, and the codegen client, all reuse it.\n\n```ts\nimport {\n  AbilityStore,\n  hydrateFromInertiaProps,\n  hydrateResource,\n  createCan,\n} from '@dudousxd/nestjs-authz-client';\n\nconst store = new AbilityStore();\nhydrateFromInertiaProps(store, pageProps); // reads props.auth.can\nhydrateResource(store, { type: 'Post', id: post.id }, post.can); // per-instance map\n\nconst can = createCan(store);\ncan('post.create'); // → boolean, synchronously, no fetch\ncan('update', { type: 'Post', id: post.id }); // → boolean\n```\n\n## Fallback on a cache miss\n\nWhen an ability/resource is not hydrated, `createCan` behaves per `fallback`:\n\n- `'deny'` (default) — returns `false` synchronously.\n- `'fetch'` — `POST { ability, resource }` to `endpoint` (default `'/authz/can'`)\n  and returns a `Promise<boolean>` from the server's `{ allowed }`.\n\n```ts\nconst can = createCan(store, { fallback: 'fetch', endpoint: '/authz/can' });\nconst allowed = can('rare.ability'); // boolean (hit) | Promise<boolean> (miss → fetch)\n```\n\n## API\n\n- `AbilityStore` — `setClassAbilities` / `mergeClassAbilities` / `setResourceAbilities` /\n  `has` / `peek` / `clear`.\n- `hydrateFromInertiaProps(store, props, propKey?)`\n- `hydrateResource(store, ref, can)`\n- `createCan(store, options?)` → `CanResolver`\n","readmeFilename":"README.md"}