import * as react_jsx_runtime from 'react/jsx-runtime';
import * as permission_js_core from 'permission-js-core';
import { BaseActions, BaseConditions, factoryPermission, CheckPermissions } from 'permission-js-core';
import { PropsWithChildren } from 'react';

type ReturnFactoryPermission<S extends string, A extends BaseActions<S>, C extends BaseConditions<S>> = ReturnType<typeof factoryPermission<S, A, C>>;
interface PermissionProviderProps<S extends string, A extends BaseActions<S>, C extends BaseConditions<S>> {
    children: React.ReactNode | ((update: ReturnFactoryPermission<S, A, C>['update']) => React.ReactNode);
}

declare function factoryReactPermission<S extends string, A extends BaseActions<S>, C extends BaseConditions<S>>(): {
    usePermission: () => {
        can: <Subjects extends S, Action extends A[Subjects]>(args: CheckPermissions<Subjects, Action, C>) => boolean;
        update: <Subject extends S>(subject: Subject, action: A[Subject][number], value: permission_js_core.Rules<S, A, C>[Subject][A[Subject][number]]) => void;
    };
    Can: <Subjects extends S, Action extends A[Subjects]>({ children, element, ...args }: PropsWithChildren<CheckPermissions<Subjects, Action, C> & {
        element?: React.ReactNode;
    }>) => React.ReactNode;
    PermissionProvider: ({ children }: PermissionProviderProps<S, A, C>) => react_jsx_runtime.JSX.Element;
};

export { type PermissionProviderProps, type ReturnFactoryPermission, factoryReactPermission };
