diff --git a/packages/casl-prisma/spec/PrismaAbility.spec.ts b/packages/casl-prisma/spec/PrismaAbility.spec.ts index 6bfa6be19..77d7ec031 100644 --- a/packages/casl-prisma/spec/PrismaAbility.spec.ts +++ b/packages/casl-prisma/spec/PrismaAbility.spec.ts @@ -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) @@ -43,8 +44,11 @@ describe('PrismaAbility', () => { conditions: { // @ts-expect-error unknown model field in conditions unknown: 1, - } + }, + { + action: 'read', + subject: 'all' } ])).toBeInstanceOf(AppAbility) }) @@ -73,6 +77,7 @@ describe('PrismaAbility', () => { } } }) + can('delete', 'all') }) it('uses Prisma types when building `PrismaQuery` type', () => { diff --git a/packages/casl-prisma/src/PrismaAbility.ts b/packages/casl-prisma/src/PrismaAbility.ts index d4fe95b53..b55cf2281 100644 --- a/packages/casl-prisma/src/PrismaAbility.ts +++ b/packages/casl-prisma/src/PrismaAbility.ts @@ -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[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 { - constructor(rules?: RawRuleFrom[], options?: AbilityOptions) { +> extends PureAbility, C> { + constructor( + rules?: RawRuleFrom, C>[], + options?: AbilityOptions, C> + ) { super(rules, { conditionsMatcher: prismaQuery, fieldMatcher: fieldPatternMatcher,