import { ActivatedRouteSnapshot, Route, RouterStateSnapshot } from '@angular/router'; import { List } from '../utils'; import { AllowFn, IqserPermissionsData, IqserPermissionsRouterData, IqserRedirectToNavigationParameters } from './types'; export function isFunction(value: unknown): value is T { return typeof value === 'function'; } export function isPlainObject(value: unknown): boolean { if (Object.prototype.toString.call(value) !== '[object Object]') { return false; } const prototype = Object.getPrototypeOf(value); return prototype === null || prototype === Object.prototype; } export function isString(value: unknown): value is string { return typeof value === 'string'; } export function isBoolean(value: unknown): value is boolean { return typeof value === 'boolean'; } export function isArray(value: unknown): value is List; export function isArray(value: unknown): value is T[] { return Array.isArray(value); } export function toArray(value?: string | List): List { return isString(value) ? [value] : (value ?? []); } export function isRedirectWithParameters(object: any | IqserRedirectToNavigationParameters): object is IqserRedirectToNavigationParameters { return isPlainObject(object) && (!!object.navigationCommands || !!object.navigationExtras); } export function transformPermission( permissions: IqserPermissionsRouterData, route: ActivatedRouteSnapshot | Route, state?: RouterStateSnapshot, ): IqserPermissionsData { const allow = isFunction(permissions.allow) ? permissions.allow(route, state) : toArray(permissions.allow); const redirectTo = permissions.redirectTo; return { allow, redirectTo, }; }