Skip to content

Commit

Permalink
fix: improved AbilityTuple (#616)
Browse files Browse the repository at this point in the history
* fix: add 'all' to AbilityTuple

Fixes issue #584

* fix: improved AbilityTuple

adds ExtendedAbilityTuple that adds 'all' to the subject of AbilityTuple
without requiring the user to manually add the type
  • Loading branch information
scriptcoded committed Jun 14, 2022
1 parent 29b9512 commit 270446f
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
7 changes: 6 additions & 1 deletion packages/casl-prisma/spec/PrismaAbility.spec.ts
Expand Up @@ -14,6 +14,7 @@ describe('PrismaAbility', () => {
})
const ability = build()

expect(ability.can('read', 'all')).toBe(false)
expect(ability.can('read', subject('Post', { authorId: 1 } as Post))).toBe(false)
expect(ability.can('read', subject('Post', { authorId: 2 } as Post))).toBe(false)
expect(ability.can('read', subject('Post', { authorId: 3 } as Post))).toBe(true)
Expand Down Expand Up @@ -43,8 +44,11 @@ describe('PrismaAbility', () => {
conditions: {
// @ts-expect-error unknown model field in conditions
unknown: 1,

}
},
{
action: 'read',
subject: 'all'
}
])).toBeInstanceOf(AppAbility)
})
Expand Down Expand Up @@ -73,6 +77,7 @@ describe('PrismaAbility', () => {
}
}
})
can('delete', 'all')
})

it('uses Prisma types when building `PrismaQuery<TModel>` type', () => {
Expand Down
11 changes: 8 additions & 3 deletions packages/casl-prisma/src/PrismaAbility.ts
Expand Up @@ -2,11 +2,16 @@ import { Prisma } from '@prisma/client';
import { AbilityOptions, AbilityTuple, fieldPatternMatcher, PureAbility, RawRuleFrom } from '@casl/ability';
import { PrismaQuery, prismaQuery } from './prisma/PrismaQuery';

type ExtendedAbilityTuple<T extends AbilityTuple> = [T[0], 'all' | T[1]];

export class PrismaAbility<
A extends AbilityTuple = [string, 'all' | Prisma.ModelName],
A extends AbilityTuple = [string, Prisma.ModelName],
C extends PrismaQuery = PrismaQuery
> extends PureAbility<A, C> {
constructor(rules?: RawRuleFrom<A, C>[], options?: AbilityOptions<A, C>) {
> extends PureAbility<ExtendedAbilityTuple<A>, C> {
constructor(
rules?: RawRuleFrom<ExtendedAbilityTuple<A>, C>[],
options?: AbilityOptions<ExtendedAbilityTuple<A>, C>
) {
super(rules, {
conditionsMatcher: prismaQuery,
fieldMatcher: fieldPatternMatcher,
Expand Down

0 comments on commit 270446f

Please sign in to comment.