import { type Bool, type From, type InferProvable, type InferValue, type ProvableHashable, UInt64 } from 'o1js'; import { type ProvableHashableType, type ProvableHashableWide } from '../o1js-missing.ts'; import { NestedProvable } from '../nested.ts'; import type { DynamicString } from './dynamic-string.ts'; import type { DynamicArrayClass } from './dynamic-array.ts'; import type { DynamicRecordClass } from './dynamic-record.ts'; export { Schema }; type SchemaType = ProvableHashableType | SchemaString | SchemaNumber | SchemaBoolean | { type: 'array'; inner: SchemaType; } | { [key in string]: SchemaType; }; type SchemaString = { type: 'string'; }; type SchemaNumber = { type: 'number'; }; type SchemaBoolean = { type: 'boolean'; }; type SchemaArray = { type: 'array'; inner: T; }; declare function Schema>(schema: T): { schema: T; from(value: SchemaInput): SchemaOutput; nestedType(value: SchemaOutput): { [key in keyof T]: ProvableTypeOf; }; type(value: SchemaOutput): ProvableHashableWide<{ [key in keyof T]: InferProvable>; }, { [key in keyof T]: InferValue>; }, { [key in keyof T]: From>; }>; }; declare namespace Schema { var String: { type: "string"; }; var Number: { type: "number"; }; var Boolean: { type: "boolean"; }; var Array: (inner: T) => SchemaArray; var nestedType: (value: S) => unknown extends S ? NestedProvable : { [key in keyof S]: ProvableHashableType; }; var type: (value: S) => ProvableHashable; } type SchemaInput = T extends ProvableHashableType ? From : T extends SchemaString ? string : T extends SchemaNumber ? number : T extends SchemaBoolean ? boolean : T extends SchemaArray ? SchemaInput[] : T extends { [key in string]: SchemaType; } ? { [key in keyof T]: SchemaInput; } : never; type SchemaOutput = T extends ProvableHashableType ? InferProvable : T extends SchemaString ? string : T extends SchemaNumber ? UInt64 : T extends SchemaBoolean ? boolean : T extends SchemaArray ? SchemaOutput[] : { [key in keyof T]: SchemaOutput; }; /** * Type version of `provableTypeOf()`. */ type ProvableTypeOf = T extends ProvableHashableType ? T : T extends SchemaString ? ReturnType : T extends SchemaNumber ? typeof UInt64 : T extends SchemaBoolean ? typeof Bool : T extends SchemaArray ? DynamicArrayClass>, InferValue>> : T extends { [key in string]: SchemaType; } ? DynamicRecordClass<{ [key in keyof T]: ProvableTypeOf; }> : never;