import * as _kilpi_client from '@kilpi/client';
import * as react from 'react';
import * as _kilpi_core from '@kilpi/core';
import { AnyKilpiCore } from '@kilpi/core';

/**
 * React server component plugin for automatically providing a Kilpi scope
 * in React Server Components and for creating the React Server Component bindings
 * to work with Kilpi.
 */
declare function ReactClientComponentPlugin<T extends AnyKilpiCore>(): _kilpi_client.KilpiClientPlugin<T, {
    ReactClient: {
        createComponents(): {
            useSubject: () => ({
                status: "idle";
                subject: null;
                error: null;
            } | {
                status: "loading";
                subject: null;
                error: null;
            } | {
                status: "error";
                subject: null;
                error: unknown;
            } | {
                status: "success";
                subject: T["$$infer"]["subject"];
                error: null;
            }) & {
                isLoading: boolean;
                isError: boolean;
                isSuccess: boolean;
                isIdle: boolean;
            };
            useIsAuthorized: <TKey extends T["$$infer"]["policies"] extends infer T_1 ? T_1 extends T["$$infer"]["policies"] ? T_1 extends object ? { [Key in keyof T_1]: Key extends string | number ? T_1[Key] extends (T["$$infer"]["policies"] extends infer T_2 ? T_2 extends T["$$infer"]["policies"] ? T_2 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key}` : `${Key}:${T_1[Key] extends infer T_3 ? T_3 extends T_1[Key] ? T_3 extends object ? { [Key_1 in keyof T_3]: Key_1 extends string | number ? T_3[Key_1] extends (T["$$infer"]["policies"] extends infer T_4 ? T_4 extends T["$$infer"]["policies"] ? T_4 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_1}` : `${Key_1}:${T_3[Key_1] extends infer T_5 ? T_5 extends T_3[Key_1] ? T_5 extends object ? { [Key_2 in keyof T_5]: Key_2 extends string | number ? T_5[Key_2] extends (T["$$infer"]["policies"] extends infer T_6 ? T_6 extends T["$$infer"]["policies"] ? T_6 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_2}` : `${Key_2}:${T_5[Key_2] extends infer T_7 ? T_7 extends T_5[Key_2] ? T_7 extends object ? { [Key_3 in keyof T_7]: Key_3 extends string | number ? T_7[Key_3] extends (T["$$infer"]["policies"] extends infer T_8 ? T_8 extends T["$$infer"]["policies"] ? T_8 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_3}` : `${Key_3}:${T_7[Key_3] extends infer T_9 ? T_9 extends T_7[Key_3] ? T_9 extends object ? { [Key_4 in keyof T_9]: Key_4 extends string | number ? T_9[Key_4] extends (T["$$infer"]["policies"] extends infer T_10 ? T_10 extends T["$$infer"]["policies"] ? T_10 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_4}` : `${Key_4}:${T_9[Key_4] extends infer T_11 ? T_11 extends T_9[Key_4] ? T_11 extends object ? { [Key_5 in keyof T_11]: Key_5 extends string | number ? T_11[Key_5] extends (T["$$infer"]["policies"] extends infer T_12 ? T_12 extends T["$$infer"]["policies"] ? T_12 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_5}` : `${Key_5}:${T_11[Key_5] extends infer T_13 ? T_13 extends T_11[Key_5] ? T_13 extends object ? { [Key_6 in keyof T_13]: Key_6 extends string | number ? T_13[Key_6] extends (T["$$infer"]["policies"] extends infer T_14 ? T_14 extends T["$$infer"]["policies"] ? T_14 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_6}` : `${Key_6}:${T_13[Key_6] extends infer T_15 ? T_15 extends T_13[Key_6] ? T_15 extends object ? { [Key_7 in keyof T_15]: Key_7 extends string | number ? T_15[Key_7] extends (T["$$infer"]["policies"] extends infer T_16 ? T_16 extends T["$$infer"]["policies"] ? T_16 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_7}` : `${Key_7}:${T_15[Key_7] extends infer T_17 ? T_17 extends T_15[Key_7] ? T_17 extends object ? { [Key_8 in keyof T_17]: Key_8 extends string | number ? T_17[Key_8] extends (T["$$infer"]["policies"] extends infer T_18 ? T_18 extends T["$$infer"]["policies"] ? T_18 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_8}` : `${Key_8}:${T_17[Key_8] extends infer T_19 ? T_19 extends T_17[Key_8] ? T_19 extends object ? { [Key_9 in keyof T_19]: Key_9 extends string | number ? T_19[Key_9] extends (T["$$infer"]["policies"] extends infer T_20 ? T_20 extends T["$$infer"]["policies"] ? T_20 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_9}` : `${Key_9}:${T_19[Key_9] extends infer T_21 ? T_21 extends T_19[Key_9] ? T_21 extends object ? { [Key_10 in keyof T_21]: Key_10 extends string | number ? T_21[Key_10] extends (T["$$infer"]["policies"] extends infer T_22 ? T_22 extends T["$$infer"]["policies"] ? T_22 extends _kilpi_core.Policyset<infer TSubject> ? _kilpi_core.Policy<any, TSubject, any> : never : never : never) ? `${Key_10}` : `${Key_10}:${/*elided*/ any}` : never; }[keyof T_21] : never : never : never}` : never; }[keyof T_19] : never : never : never}` : never; }[keyof T_17] : never : never : never}` : never; }[keyof T_15] : never : never : never}` : never; }[keyof T_13] : never : never : never}` : never; }[keyof T_11] : never : never : never}` : never; }[keyof T_9] : never : never : never}` : never; }[keyof T_7] : never : never : never}` : never; }[keyof T_5] : never : never : never}` : never; }[keyof T_3] : never : never : never}` : never; }[keyof T_1] : never : never : never>(key: TKey, ...inputs: _kilpi_core.InferPolicyInputs<(T["$$infer"]["policies"] extends infer T_23 ? T_23 extends T["$$infer"]["policies"] ? T_23 extends object ? TKey extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_23 ? T_23[FirstKey] extends infer T_24 ? T_24 extends T_23[FirstKey] ? T_24 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_24 ? T_24[FirstKey] extends infer T_25 ? T_25 extends T_24[FirstKey] ? T_25 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_25 ? T_25[FirstKey] extends infer T_26 ? T_26 extends T_25[FirstKey] ? T_26 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_26 ? T_26[FirstKey] extends infer T_27 ? T_27 extends T_26[FirstKey] ? T_27 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_27 ? T_27[FirstKey] extends infer T_28 ? T_28 extends T_27[FirstKey] ? T_28 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_28 ? T_28[FirstKey] extends infer T_29 ? T_29 extends T_28[FirstKey] ? T_29 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_29 ? T_29[FirstKey] extends infer T_30 ? T_30 extends T_29[FirstKey] ? T_30 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_30 ? T_30[FirstKey] extends infer T_31 ? T_31 extends T_30[FirstKey] ? T_31 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_31 ? T_31[FirstKey] extends infer T_32 ? T_32 extends T_31[FirstKey] ? T_32 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_32 ? T_32[FirstKey] extends infer T_33 ? T_33 extends T_32[FirstKey] ? T_33 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_33 ? /*elided*/ any : never : Rest extends keyof T_33 ? T_33[Rest] : never : never : never : never : never : Rest extends keyof T_32 ? T_32[Rest] : never : never : never : never : never : Rest extends keyof T_31 ? T_31[Rest] : never : never : never : never : never : Rest extends keyof T_30 ? T_30[Rest] : never : never : never : never : never : Rest extends keyof T_29 ? T_29[Rest] : never : never : never : never : never : Rest extends keyof T_28 ? T_28[Rest] : never : never : never : never : never : Rest extends keyof T_27 ? T_27[Rest] : never : never : never : never : never : Rest extends keyof T_26 ? T_26[Rest] : never : never : never : never : never : Rest extends keyof T_25 ? T_25[Rest] : never : never : never : never : never : Rest extends keyof T_24 ? T_24[Rest] : never : never : never : never : never : TKey extends keyof T_23 ? T_23[TKey] : never : never : never : never) extends infer T_34 ? T_34 extends (T["$$infer"]["policies"] extends infer T_35 ? T_35 extends T["$$infer"]["policies"] ? T_35 extends object ? TKey extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_35 ? T_35[FirstKey] extends infer T_36 ? T_36 extends T_35[FirstKey] ? T_36 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_36 ? T_36[FirstKey] extends infer T_37 ? T_37 extends T_36[FirstKey] ? T_37 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_37 ? T_37[FirstKey] extends infer T_38 ? T_38 extends T_37[FirstKey] ? T_38 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_38 ? T_38[FirstKey] extends infer T_39 ? T_39 extends T_38[FirstKey] ? T_39 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_39 ? T_39[FirstKey] extends infer T_40 ? T_40 extends T_39[FirstKey] ? T_40 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_40 ? T_40[FirstKey] extends infer T_41 ? T_41 extends T_40[FirstKey] ? T_41 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_41 ? T_41[FirstKey] extends infer T_42 ? T_42 extends T_41[FirstKey] ? T_42 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_42 ? T_42[FirstKey] extends infer T_43 ? T_43 extends T_42[FirstKey] ? T_43 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_43 ? T_43[FirstKey] extends infer T_44 ? T_44 extends T_43[FirstKey] ? T_44 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_44 ? T_44[FirstKey] extends infer T_45 ? T_45 extends T_44[FirstKey] ? T_45 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_45 ? /*elided*/ any : never : Rest extends keyof T_45 ? T_45[Rest] : never : never : never : never : never : Rest extends keyof T_44 ? T_44[Rest] : never : never : never : never : never : Rest extends keyof T_43 ? T_43[Rest] : never : never : never : never : never : Rest extends keyof T_42 ? T_42[Rest] : never : never : never : never : never : Rest extends keyof T_41 ? T_41[Rest] : never : never : never : never : never : Rest extends keyof T_40 ? T_40[Rest] : never : never : never : never : never : Rest extends keyof T_39 ? T_39[Rest] : never : never : never : never : never : Rest extends keyof T_38 ? T_38[Rest] : never : never : never : never : never : Rest extends keyof T_37 ? T_37[Rest] : never : never : never : never : never : Rest extends keyof T_36 ? T_36[Rest] : never : never : never : never : never : TKey extends keyof T_35 ? T_35[TKey] : never : never : never : never) ? T_34 extends _kilpi_core.Policy<any, any, any> ? T_34 : never : never : never>) => ({
                status: "idle";
                isAuthorized: null;
                error: null;
            } | {
                status: "loading";
                isAuthorized: null;
                error: null;
            } | {
                status: "error";
                isAuthorized: null;
                error: unknown;
            } | {
                status: "success";
                isAuthorized: boolean;
                error: null;
            }) & {
                isLoading: boolean;
                isError: boolean;
                isSuccess: boolean;
                isIdle: boolean;
            };
            ClientAccess: <TKey extends _kilpi_core.PolicySetKeysWithoutResource<T["policies"]> | _kilpi_core.PolicysetKeysWithResource<T["policies"]>>(props: {
                children?: React.ReactNode;
                Loading?: React.ReactNode;
                Unauthorized?: React.ReactNode;
                Error?: React.ReactNode;
            } & ({ [K in _kilpi_core.PolicySetKeysWithoutResource<T["policies"]>]: {
                to: K;
                on?: never;
            }; } & { [K_1 in _kilpi_core.PolicysetKeysWithResource<T["policies"]>]: {
                to: K_1;
                on: _kilpi_core.InferPolicyInputs<(T["policies"] extends infer T_1 ? T_1 extends T["policies"] ? T_1 extends object ? K_1 extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_1 ? T_1[FirstKey] extends infer T_2 ? T_2 extends T_1[FirstKey] ? T_2 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_2 ? T_2[FirstKey] extends infer T_3 ? T_3 extends T_2[FirstKey] ? T_3 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_3 ? T_3[FirstKey] extends infer T_4 ? T_4 extends T_3[FirstKey] ? T_4 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_4 ? T_4[FirstKey] extends infer T_5 ? T_5 extends T_4[FirstKey] ? T_5 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_5 ? T_5[FirstKey] extends infer T_6 ? T_6 extends T_5[FirstKey] ? T_6 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_6 ? T_6[FirstKey] extends infer T_7 ? T_7 extends T_6[FirstKey] ? T_7 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_7 ? T_7[FirstKey] extends infer T_8 ? T_8 extends T_7[FirstKey] ? T_8 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_8 ? T_8[FirstKey] extends infer T_9 ? T_9 extends T_8[FirstKey] ? T_9 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_9 ? T_9[FirstKey] extends infer T_10 ? T_10 extends T_9[FirstKey] ? T_10 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_10 ? T_10[FirstKey] extends infer T_11 ? T_11 extends T_10[FirstKey] ? T_11 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_11 ? /*elided*/ any : never : Rest extends keyof T_11 ? T_11[Rest] : never : never : never : never : never : Rest extends keyof T_10 ? T_10[Rest] : never : never : never : never : never : Rest extends keyof T_9 ? T_9[Rest] : never : never : never : never : never : Rest extends keyof T_8 ? T_8[Rest] : never : never : never : never : never : Rest extends keyof T_7 ? T_7[Rest] : never : never : never : never : never : Rest extends keyof T_6 ? T_6[Rest] : never : never : never : never : never : Rest extends keyof T_5 ? T_5[Rest] : never : never : never : never : never : Rest extends keyof T_4 ? T_4[Rest] : never : never : never : never : never : Rest extends keyof T_3 ? T_3[Rest] : never : never : never : never : never : Rest extends keyof T_2 ? T_2[Rest] : never : never : never : never : never : K_1 extends keyof T_1 ? T_1[K_1] : never : never : never : never) extends infer T_12 ? T_12 extends (T["policies"] extends infer T_13 ? T_13 extends T["policies"] ? T_13 extends object ? K_1 extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_13 ? T_13[FirstKey] extends infer T_14 ? T_14 extends T_13[FirstKey] ? T_14 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_14 ? T_14[FirstKey] extends infer T_15 ? T_15 extends T_14[FirstKey] ? T_15 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_15 ? T_15[FirstKey] extends infer T_16 ? T_16 extends T_15[FirstKey] ? T_16 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_16 ? T_16[FirstKey] extends infer T_17 ? T_17 extends T_16[FirstKey] ? T_17 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_17 ? T_17[FirstKey] extends infer T_18 ? T_18 extends T_17[FirstKey] ? T_18 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_18 ? T_18[FirstKey] extends infer T_19 ? T_19 extends T_18[FirstKey] ? T_19 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_19 ? T_19[FirstKey] extends infer T_20 ? T_20 extends T_19[FirstKey] ? T_20 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_20 ? T_20[FirstKey] extends infer T_21 ? T_21 extends T_20[FirstKey] ? T_21 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_21 ? T_21[FirstKey] extends infer T_22 ? T_22 extends T_21[FirstKey] ? T_22 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_22 ? T_22[FirstKey] extends infer T_23 ? T_23 extends T_22[FirstKey] ? T_23 extends object ? Rest extends `${infer FirstKey}:${infer Rest}` ? FirstKey extends keyof T_23 ? /*elided*/ any : never : Rest extends keyof T_23 ? T_23[Rest] : never : never : never : never : never : Rest extends keyof T_22 ? T_22[Rest] : never : never : never : never : never : Rest extends keyof T_21 ? T_21[Rest] : never : never : never : never : never : Rest extends keyof T_20 ? T_20[Rest] : never : never : never : never : never : Rest extends keyof T_19 ? T_19[Rest] : never : never : never : never : never : Rest extends keyof T_18 ? T_18[Rest] : never : never : never : never : never : Rest extends keyof T_17 ? T_17[Rest] : never : never : never : never : never : Rest extends keyof T_16 ? T_16[Rest] : never : never : never : never : never : Rest extends keyof T_15 ? T_15[Rest] : never : never : never : never : never : Rest extends keyof T_14 ? T_14[Rest] : never : never : never : never : never : K_1 extends keyof T_13 ? T_13[K_1] : never : never : never : never) ? T_12 extends _kilpi_core.Policy<any, any, any> ? T_12 : never : never : never>[0];
            }; })[TKey]) => react.ReactNode;
        };
    };
}>;

export { ReactClientComponentPlugin };
