import { SubjectType, AbilityTypes, AbilityTupleType, Abilities, ToAbilityTypes } from './types'; interface BaseRawRule { fields?: string | string[]; conditions?: Conditions; /** indicates that rule forbids something (i.e., has inverted logic) */ inverted?: boolean; /** explains the reason of why rule does not allow to do something */ reason?: string; } export interface ClaimRawRule extends BaseRawRule { action: A | A[]; subject?: undefined; } export interface SubjectRawRule extends BaseRawRule { action: A | A[]; subject: S | S[]; } type DefineRule>> = T extends AbilityTupleType ? SubjectRawRule : Else; export type RawRule = DefineRule; export type RawRuleFrom = RawRule, C>; export {};