import type { Condition } from '@ucast/mongo2js'; import { Container, GenericFactory } from './hkt'; type Fn = (...args: any[]) => any; export type AnyClass = new (...args: any[]) => ReturnType; type AnyRecord = Record; export type AnyObject = Record; export type SubjectClass = AnyClass & { modelName?: N; }; export type SubjectType = string | SubjectClass; export type Subject = AnyRecord | SubjectType; export type AbilityTuple = [X, Y]; export type Abilities = AbilityTuple | string; export type ToAbilityTypes = T extends AbilityTuple ? AbilityTupleType> : Extract; export type AbilityTupleType = [T, U]; export type AbilityTypes = string | AbilityTupleType; export type Normalize = T extends AbilityTuple ? T : [T, string]; export type IfString = T extends string ? U : never; export type AbilityParameters 0, Else = IfString>> = T extends AbilityTuple ? Parameters : Else; export type CanParameters = AbilityParameters 0 : (action: T[0], subject: T[1]) => 0 : never, (action: Extract) => 0>; export type ExtractSubjectType = Extract | TagName; type SubjectClassWithCustomName = AnyClass & { modelName: T; }; export type InferSubjects = T | (T extends AnyClass ? I | (IncludeTagName extends true ? T extends SubjectClassWithCustomName ? Name : TagName : never) : TagName); export interface ForcedSubject { readonly __caslSubjectType__: T; } export type TaggedInterface = ForcedSubject | { readonly kind: T; } | { readonly __typename: T; }; type TagName = T extends TaggedInterface ? U : never; interface MatchConditionsFactory extends GenericFactory<{}> { produce: MatchConditions; } export type MatchConditions = Container & { (object: T): boolean; ast?: Condition; }; export type ConditionsMatcher = (conditions: T) => MatchConditions; export type MatchField = (field: T) => boolean; export type FieldMatcher = (fields: T[]) => MatchField; export type AliasesMap = Record; export {};