@@ -5,12 +5,21 @@ import {
5
5
GenericProvableExtended ,
6
6
} from './generic.js' ;
7
7
8
- export { createProvable , createHashInput , ProvableConstructor } ;
8
+ export {
9
+ createProvable ,
10
+ createHashInput ,
11
+ ProvableConstructor ,
12
+ NonMethods ,
13
+ InferProvable ,
14
+ InferJson ,
15
+ InferredProvable ,
16
+ IsPure ,
17
+ } ;
9
18
10
19
type ProvableConstructor < Field > = < A > (
11
20
typeObj : A ,
12
21
options ?: { isPure ?: boolean }
13
- ) => GenericProvableExtended < InferProvable < A , Field > , InferJson < A > , Field > ;
22
+ ) => InferredProvable < A , Field > ;
14
23
15
24
function createProvable < Field > ( ) : ProvableConstructor < Field > {
16
25
type ProvableExtended < T , TJson = JSONValue > = GenericProvableExtended <
@@ -26,7 +35,7 @@ function createProvable<Field>(): ProvableConstructor<Field> {
26
35
function provable < A > (
27
36
typeObj : A ,
28
37
options ?: { isPure ?: boolean }
29
- ) : ProvableExtended < InferProvable < A , Field > , InferJson < A > > {
38
+ ) : InferredProvable < A , Field > {
30
39
type T = InferProvable < A , Field > ;
31
40
type J = InferJson < A > ;
32
41
let objectKeys =
@@ -182,8 +191,8 @@ function createProvable<Field>(): ProvableConstructor<Field> {
182
191
if ( Array . isArray ( typeObj ) )
183
192
return typeObj . forEach ( ( t , i ) => check ( t , obj [ i ] ) ) ;
184
193
if ( 'check' in typeObj ) return typeObj . check ( obj ) ;
185
- return ( isToplevel ? objectKeys : Object . keys ( typeObj ) ) . forEach (
186
- ( k ) => check ( typeObj [ k ] , obj [ k ] )
194
+ return ( isToplevel ? objectKeys : Object . keys ( typeObj ) ) . forEach ( ( k ) =>
195
+ check ( typeObj [ k ] , obj [ k ] )
187
196
) ;
188
197
}
189
198
if ( options ?. isPure === true ) {
@@ -197,7 +206,7 @@ function createProvable<Field>(): ProvableConstructor<Field> {
197
206
toJSON : ( obj : T ) => toJSON ( typeObj , obj , true ) as J ,
198
207
fromJSON : ( json : J ) => fromJSON ( typeObj , json , true ) ,
199
208
check : ( obj : T ) => check ( typeObj , obj , true ) ,
200
- } ;
209
+ } satisfies ProvableExtended < T , J > as InferredProvable < A , Field > ;
201
210
}
202
211
return {
203
212
sizeInFields : ( ) => sizeInFields ( typeObj ) ,
@@ -209,7 +218,7 @@ function createProvable<Field>(): ProvableConstructor<Field> {
209
218
toJSON : ( obj : T ) => toJSON ( typeObj , obj , true ) as J ,
210
219
fromJSON : ( json : J ) => fromJSON ( typeObj , json , true ) ,
211
220
check : ( obj : T ) => check ( typeObj , obj , true ) ,
212
- } ;
221
+ } satisfies ProvableExtended < T , J > as InferredProvable < A , Field > ;
213
222
}
214
223
215
224
return provable ;
@@ -240,6 +249,14 @@ type JSONValue =
240
249
| Array < JSONValue >
241
250
| { [ key : string ] : JSONValue } ;
242
251
252
+ type Struct < T , Field > = GenericProvableExtended < NonMethods < T > , any , Field > &
253
+ Constructor < T > & { _isStruct : true } ;
254
+
255
+ type NonMethodKeys < T > = {
256
+ [ K in keyof T ] : T [ K ] extends Function ? never : K ;
257
+ } [ keyof T ] ;
258
+ type NonMethods < T > = Pick < T , NonMethodKeys < T > > ;
259
+
243
260
type Constructor < T > = new ( ...args : any ) => T ;
244
261
245
262
type Tuple < T > = [ T , ...T [ ] ] | [ ] ;
@@ -280,6 +297,8 @@ type InferPrimitiveJson<P extends Primitive> = P extends typeof String
280
297
281
298
type InferProvable < A , Field > = A extends Constructor < infer U >
282
299
? A extends GenericProvable < U , Field >
300
+ ? U
301
+ : A extends Struct < U , Field >
283
302
? U
284
303
: InferProvableBase < A , Field >
285
304
: InferProvableBase < A , Field > ;
@@ -333,3 +352,13 @@ type IsPureBase<A, Field> = A extends GenericProvablePure<any, Field>
333
352
[ K in keyof A ] : IsPure < A [ K ] , Field > ;
334
353
} [ keyof A ]
335
354
: false ;
355
+
356
+ type GenericProvableExtendedPure < T , TJson , Field > = GenericProvablePure <
357
+ T ,
358
+ Field
359
+ > &
360
+ GenericProvableExtended < T , TJson , Field > ;
361
+
362
+ type InferredProvable < A , Field > = IsPure < A , Field > extends true
363
+ ? GenericProvableExtendedPure < InferProvable < A , Field > , InferJson < A > , Field >
364
+ : GenericProvableExtended < InferProvable < A , Field > , InferJson < A > , Field > ;
0 commit comments