import { GenericHashInput, GenericProvable, GenericProvablePure, GenericProvableExtended, GenericProvableExtendedPure, GenericSignable } from './generic.js'; export { createDerivers, createHashInput, ProvableConstructor, SignableConstructor, NonMethods, InferProvable, InferJson, InferValue, InferredProvable, IsPure, From, Constructor, NestedProvable, InferProvableNested, InferJsonNested, InferValueNested, }; type ProvableConstructor = (typeObj: A, /** * @deprecated */ options?: { isPure?: boolean; }) => InferredProvable; type SignableConstructor = (typeObj: A) => InferredSignable; declare function createDerivers(): { provable: ProvableConstructor; signable: SignableConstructor; }; declare function createHashInput(): { readonly empty: {}; append(input1: GenericHashInput, input2: GenericHashInput): GenericHashInput; }; type JSONValue = number | string | boolean | null | Array | { [key: string]: JSONValue; }; type Struct = GenericProvableExtended, any, any, Field> & Constructor & { _isStruct: true; }; type NonMethodKeys = { [K in keyof T]: T[K] extends Function ? never : K; }[keyof T]; type NonMethods = Pick>; type Constructor = new (...args: any) => T; type Tuple = [T, ...T[]] | []; type Primitive = typeof String | typeof Number | typeof Boolean | typeof BigInt | null | undefined; type InferPrimitive

= P extends typeof String ? string : P extends typeof Number ? number : P extends typeof Boolean ? boolean : P extends typeof BigInt ? bigint : P extends null ? null : P extends undefined ? undefined : any; type InferPrimitiveValue

= P extends typeof String ? string : P extends typeof Number ? number : P extends typeof Boolean ? boolean : P extends typeof BigInt ? bigint : P extends null ? null : P extends undefined ? undefined : any; type InferPrimitiveJson

= P extends typeof String ? string : P extends typeof Number ? number : P extends typeof Boolean ? boolean : P extends typeof BigInt ? string : P extends null ? null : P extends undefined ? null : any; type NestedProvable = Primitive | { provable: GenericProvable; } | GenericProvable | [NestedProvable, ...NestedProvable[]] | NestedProvable[] | { [key: string]: NestedProvable; }; type InferProvable = A extends { provable: Constructor; } ? A extends { provable: GenericProvable; } ? U : A extends { provable: Struct; } ? U : InferProvableBase : A extends Constructor ? A extends GenericProvable ? U : A extends Struct ? U : InferProvableBase : InferProvableBase; type InferProvableBase = A extends { provable: GenericProvable; } ? U : A extends GenericProvable ? U : A extends Primitive ? InferPrimitive : A extends Tuple ? { [I in keyof A]: InferProvable; } : A extends (infer U)[] ? InferProvable[] : A extends Record ? { [K in keyof A]: InferProvable; } : never; type InferValue = A extends { provable: GenericProvable; } ? U : A extends GenericProvable ? U : A extends Primitive ? InferPrimitiveValue : A extends Tuple ? { [I in keyof A]: InferValue; } : A extends (infer U)[] ? InferValue[] : A extends Record ? { [K in keyof A]: InferValue; } : never; type WithJson = { toJSON: (x: any) => J; }; type InferJson = A extends { provable: WithJson; } ? J : A extends WithJson ? J : A extends Primitive ? InferPrimitiveJson : A extends Tuple ? { [I in keyof A]: InferJson; } : A extends (infer U)[] ? InferJson[] : A extends Record ? { [K in keyof A]: InferJson; } : JSONValue; type IsPure = IsPureBase extends true ? true : false; type IsPureBase = A extends { provable: GenericProvablePure; } ? true : A extends GenericProvablePure ? true : A extends { provable: GenericProvable; } ? false : A extends GenericProvable ? false : A extends Primitive ? false : A extends (infer U)[] ? IsPure : A extends Record ? { [K in keyof A]: IsPure; }[keyof A] : false; type InferredProvable = IsPure extends true ? GenericProvableExtendedPure, InferValue, InferJson, Field> : GenericProvableExtended, InferValue, InferJson, Field>; type InferSignable = A extends { provable: GenericSignable; } ? U : A extends GenericSignable ? U : A extends Primitive ? InferPrimitive : A extends Tuple ? { [I in keyof A]: InferSignable; } : A extends (infer U)[] ? InferSignable[] : A extends Record ? { [K in keyof A]: InferSignable; } : never; type InferredSignable = GenericSignable, InferJson, Field>; type From = A extends { provable: { fromValue: (x: infer U) => any; } & GenericProvable; } ? U | InferProvable : A extends { fromValue: (x: infer U) => any; } & GenericProvable ? U | InferProvable : A extends GenericProvable ? InferProvable | InferValue : A extends Primitive ? InferPrimitiveValue : A extends Tuple ? { [I in keyof A]: From; } : A extends (infer U)[] ? From[] : A extends Record ? { [K in keyof A]: From; } : never; type InferProvableNested> = A extends Primitive ? InferPrimitive : A extends { provable: GenericProvable; } ? P : A extends GenericProvable ? P : A extends [NestedProvable, ...NestedProvable[]] ? { [I in keyof A & number]: InferProvableNested; } : A extends (infer U extends NestedProvable)[] ? InferProvableNested[] : A extends Record> ? { [K in keyof A]: InferProvableNested; } : never; type InferValueNested> = A extends Primitive ? InferPrimitiveValue : A extends { provable: GenericProvable; } ? U : A extends GenericProvable ? U : A extends [NestedProvable, ...NestedProvable[]] ? { [I in keyof A & number]: InferValueNested; } : A extends (infer U extends NestedProvable)[] ? InferValueNested[] : A extends Record> ? { [K in keyof A]: InferValueNested; } : never; type InferJsonNested> = A extends Primitive ? InferPrimitiveJson : A extends { provable: GenericProvable; } ? A['provable'] extends WithJson ? J : never : A extends GenericProvable ? A extends WithJson ? J : never : A extends [NestedProvable, ...NestedProvable[]] ? { [I in keyof A & number]: InferJsonNested; } : A extends (infer U extends NestedProvable)[] ? InferJsonNested[] : A extends Record> ? { [K in keyof A]: InferJsonNested; } : never;