UNPKG

@bemedev/permissions

Version:

A library for managing permissions

51 lines 2.5 kB
import type { DeepPartial, Fn, Keys, NOmit, ReduceArray, TrueObject, ValuesOf } from '@bemedev/core/lib/globals/types'; import { KeysMatching } from '@bemedev/decompose'; import type { DELIMITER, STRATEGIES } from './constants'; export type Strategy = (typeof STRATEGIES)[number]; export type Ressource<T = any> = { actions: string[]; dataType: T; __strategy?: Strategy; }; export type Ressources = Record<string, Ressource>; export type Priority = number; export type Roles = Record<string, Priority>; export type User<R extends Keys = never> = { __id: string; roles: R[]; }; export type CheckReturnType<PD extends TrueObject = TrueObject, Keys = KeysMatching<PD>[]> = boolean | Keys; export type PermissionCheck<U extends User, PD extends TrueObject> = CheckReturnType<PD> | ((args: { performer: U; data?: DeepPartial<PD>; owner: U; }) => CheckReturnType<PD>); export type ExtraPermissionsKey<R extends string = string> = `user:${string}` | `role:${R}`; export type Config = { ressources: Ressources; roles: Roles; user: object; }; export type UserFrom<C extends Config> = User<keyof C['roles']>; export type RolesFrom<C extends Config> = Record<keyof C, number>; export type ActionsFrom<C extends Config> = ReduceArray<ValuesOf<ValuesOf<C>>>; export type Delimiter = typeof DELIMITER; export type ImplKeys<C extends Config> = { [Key1 in keyof C['roles'] & string]: { [Key2 in keyof C['ressources'] & string]: ReduceArray<C['ressources'][Key2]['actions']> extends infer Key3 extends string ? `${Key1}${Delimiter}${Key2}${Delimiter}${Key3}` : never; }[keyof C['ressources'] & string]; }[keyof C['roles'] & string]; export type StringL = `${string}${string}`; export type ExtractRessourceKey<S extends string> = S extends `${StringL}${Delimiter}${infer P}${Delimiter}${StringL}` ? P : never; export type UserArg<Co extends Config> = UserFrom<Co> & DeepPartial<Co['user']>; export type CheckFn<Co extends Config, K3 extends TrueObject> = Fn<[ { owner: UserArg<Co>; performer: NOmit<UserArg<Co>, 'roles'>; data?: K3; } ], CheckReturnType<K3>> | CheckReturnType<K3>; export type Implementation<C extends Config, Res extends Ressources = C['ressources'], Keys extends string = ImplKeys<C>> = { [Key in Keys]?: ExtractRessourceKey<Key> extends infer K2 extends keyof Res ? DeepPartial<Res[K2]['dataType']> extends infer K3 extends TrueObject ? CheckFn<C, K3> : never : never; }; //# sourceMappingURL=types.d.ts.map