UNPKG

mina-attestations

Version:
63 lines (62 loc) 2.88 kB
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<T extends SchemaType = SchemaType> = { type: 'array'; inner: T; }; declare function Schema<T extends Record<string, SchemaType>>(schema: T): { schema: T; from(value: SchemaInput<T>): SchemaOutput<T>; nestedType(value: SchemaOutput<T>): { [key in keyof T]: ProvableTypeOf<T[key]>; }; type(value: SchemaOutput<T>): ProvableHashableWide<{ [key in keyof T]: InferProvable<ProvableTypeOf<T[key]>>; }, { [key in keyof T]: InferValue<ProvableTypeOf<T[key]>>; }, { [key in keyof T]: From<ProvableTypeOf<T[key]>>; }>; }; declare namespace Schema { var String: { type: "string"; }; var Number: { type: "number"; }; var Boolean: { type: "boolean"; }; var Array: <T extends SchemaType>(inner: T) => SchemaArray<T>; var nestedType: <S>(value: S) => unknown extends S ? NestedProvable : { [key in keyof S]: ProvableHashableType<S[key], S[key]>; }; var type: <S>(value: S) => ProvableHashable<S, S>; } type SchemaInput<T = SchemaType> = T extends ProvableHashableType ? From<T> : T extends SchemaString ? string : T extends SchemaNumber ? number : T extends SchemaBoolean ? boolean : T extends SchemaArray<infer U> ? SchemaInput<U>[] : T extends { [key in string]: SchemaType; } ? { [key in keyof T]: SchemaInput<T[key]>; } : never; type SchemaOutput<T = SchemaType> = T extends ProvableHashableType ? InferProvable<T> : T extends SchemaString ? string : T extends SchemaNumber ? UInt64 : T extends SchemaBoolean ? boolean : T extends SchemaArray<infer U> ? SchemaOutput<U>[] : { [key in keyof T]: SchemaOutput<T[key]>; }; /** * Type version of `provableTypeOf()`. */ type ProvableTypeOf<T> = T extends ProvableHashableType ? T : T extends SchemaString ? ReturnType<typeof DynamicString> : T extends SchemaNumber ? typeof UInt64 : T extends SchemaBoolean ? typeof Bool : T extends SchemaArray<infer U> ? DynamicArrayClass<InferProvable<ProvableTypeOf<U>>, InferValue<ProvableTypeOf<U>>> : T extends { [key in string]: SchemaType; } ? DynamicRecordClass<{ [key in keyof T]: ProvableTypeOf<T[key]>; }> : never;