import { hooks, providerFactory } from '@strapi/utils'; interface Permission { action: string; subject?: string | object | null; properties?: object; conditions?: string[]; } type Provider = ReturnType; interface BaseAction { actionId: string; } interface BaseCondition { name: string; handler(...params: unknown[]): boolean | object; } interface ActionProvider extends Provider {} interface ConditionProvider extends Provider {} interface PermissionEngineHooks { 'before-format::validate.permission': ReturnType; 'format.permission': ReturnType; 'after-format::validate.permission': ReturnType; 'before-evaluate.permission': ReturnType; 'before-register.permission': ReturnType; } type PermissionEngineHookName = keyof PermissionEngineHooks; interface PermissionEngine { hooks: object; on(hook: PermissionEngineHookName, handler: Function): PermissionEngine; generateAbility(permissions: Permission[], options?: object): Ability; createRegisterFunction(can: Function, options: object): Function; } interface BaseAbility { can: Function; } interface AbilityBuilder { can(permission: Permission): void | Promise; build(): BaseAbility | Promise; } interface PermissionEngineParams { providers: { action: ActionProvider; condition: ConditionProvider }; abilityBuilderFactory(): AbilityBuilder; }