import type { SafeAny } from '@ngify/core';
interface Schema {
    [k: string]: SafeAny;
    schemas?: Schema[];
}
declare const COMPOSE_KEY = "schemas";
export declare function applyRoot(schema: Schema): void;
declare const BUILD_KEY = "build";
export declare function composeBuilder<T>(): Builder<T>;
/**
 * Determines whether the value is a builder.
 */
export declare function isBuilder<T = unknown>(value: SafeAny): value is StableBuilder<T>;
type ComposeKey = typeof COMPOSE_KEY;
type BuildKey = typeof BUILD_KEY;
type Buildable = Record<BuildKey, unknown>;
/** Get the non-nullable and required keys of an interface. */
type NonNullableKey<T> = {
    [K in keyof T]-?: Record<K, T[K]> extends {
        [_ in K]-?: T[K];
    } ? K : never;
}[keyof T];
/**
 * @template T 原型
 * @template C 候选
 * @template N 必填字段
 * @template S 已选字段
 * @template B 可以构建
 */
type _Builder<T extends Buildable, C extends keyof T, N extends keyof T, S extends keyof T = never, B extends BuildKey = never> = {
    [K in keyof Pick<T, Exclude<C, S> | B>]-?: (K extends BuildKey ? () => Pick<T, S> : (val: K extends ComposeKey ? () => SafeAny : T[K]) => _Builder<T, C, N, S | K, [
        N
    ] extends [S | K] ? BuildKey : never>);
};
/**
 * @template T 原型
 */
export type Builder<T> = _Builder<T & Buildable, keyof T, NonNullableKey<T>>;
export type StableBuilder<T> = Record<BuildKey, () => T>;
/**
 * @template T 原型
 * @template S 已选字段
 * @template N 必填字段
 */
export type UnstableBuilder<T, S extends keyof T, N extends keyof T = NonNullableKey<T>> = _Builder<T & Buildable, keyof T, N, S, [
    N
] extends [S] ? BuildKey : never>;
export {};
