import type { NRoleDef } from '@neon.id/types'; import type { TAbilityInstance } from '../ability'; import type { TGuardInstance } from '../guard'; import type { TPermitResult, TPermitUser } from '../types'; export type TGateAction = 'manage' | 'view' | 'create' | 'update' | 'delete'; export type TGateActionAndOther = TGateAction | Omit; export interface TGateCheckOptions { model?: string; isDebug?: boolean; } export type TGateGuardFunction = (context: { ability?: TAbilityInstance; user?: TPermitUser; roles: NRoleDef[]; data?: Record; options?: TGateCheckOptions; }) => TPermitResult; export type TGateGuardFunctionOrInstance = TGateGuardFunction | TGuardInstance; export type TGateActions = { [TKey in TGateActionAndOther as TKey extends string ? TKey : never]?: TGuard; }; export type TGateGuardDefinition = NRoleDef[] | TGateGuardFunction | TGateActions; export interface TGateDefinition { guard?: TGateGuardDefinition; } export interface TGateInstance { roles?: NRoleDef[]; guard?: TGateGuardFunction; actions: TGateActions; ability?: TAbilityInstance; isHydrated: boolean; clone(): TGateInstance; hydrate(ability: TAbilityInstance): void; check(action: TGateAction, data?: Record, options?: TGateCheckOptions): TPermitResult; }