diff --git a/src/extendSchemableClass.ts b/src/extendSchemableClass.ts index 9074869..4c92aac 100644 --- a/src/extendSchemableClass.ts +++ b/src/extendSchemableClass.ts @@ -35,7 +35,7 @@ export function extendSchemableClass< >, props: { - schema: ( + schema: (props: { schema: z.ZodObject< ExtendSchemaT, ExtendSchemaUnknownKeys, @@ -43,7 +43,9 @@ export function extendSchemableClass< ExtendSchemaValues, ExtendSchemaValues > - ) => z.ZodObject< + + shape: ExtendSchemaT + }) => z.ZodObject< SchemaT, SchemaUnknownKeys, SchemaCatchall, @@ -60,7 +62,10 @@ export function extendSchemableClass< : AbstractClass ) - const schema = props.schema(extend.schema) + const schema = props.schema({ + schema: extend.schema, + shape: extend.schema.shape, + }) const defaultValues = props.defaultValues(extend.defaultValues) return class extends extend { diff --git a/src/jsonifiable/dejsonifySchemable.ts b/src/jsonifiable/dejsonifySchemable.ts new file mode 100644 index 0000000..b8e7f80 --- /dev/null +++ b/src/jsonifiable/dejsonifySchemable.ts @@ -0,0 +1,213 @@ +import { Effect, pipe } from "effect" +import { JsonifiableObject } from "type-fest/source/jsonifiable" +import { z } from "zod" +import { JsonifiableSchemableClass } from "." +import { parseZodTypeEffect } from "../util" + + +export function dejsonifySchemable< + C extends JsonifiableSchemableClass< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + + Values, + DefaultValues, + + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + + JsonifiedValues, + + "Class" + >, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, + + JsonifySchemaT extends z.ZodRawShape, + JsonifySchemaUnknownKeys extends z.UnknownKeysParam, + JsonifySchemaCatchall extends z.ZodTypeAny, + + DejsonifySchemaT extends z.ZodRawShape, + DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + DejsonifySchemaCatchall extends z.ZodTypeAny, + + JsonifiedValues extends JsonifiableObject, +>( + class_: C | JsonifiableSchemableClass< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + + Values, + DefaultValues, + + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + + JsonifiedValues, + + "Class" + >, + + values: JsonifiedValues, + params?: Partial, +) { + return new class_( + class_.dejsonifySchema.parse(values, params) + ) as InstanceType +} + + +export async function dejsonifySchemablePromise< + C extends JsonifiableSchemableClass< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + + Values, + DefaultValues, + + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + + JsonifiedValues, + + "Class" + >, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, + + JsonifySchemaT extends z.ZodRawShape, + JsonifySchemaUnknownKeys extends z.UnknownKeysParam, + JsonifySchemaCatchall extends z.ZodTypeAny, + + DejsonifySchemaT extends z.ZodRawShape, + DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + DejsonifySchemaCatchall extends z.ZodTypeAny, + + JsonifiedValues extends JsonifiableObject, +>( + class_: C | JsonifiableSchemableClass< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + + Values, + DefaultValues, + + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + + JsonifiedValues, + + "Class" + >, + + values: JsonifiedValues, + params?: Partial, +) { + return new class_( + await class_.dejsonifySchema.parseAsync(values, params) + ) as InstanceType +} + + +export function dejsonifySchemableEffect< + C extends JsonifiableSchemableClass< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + + Values, + DefaultValues, + + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + + JsonifiedValues, + + "Class" + >, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + DefaultValues extends Partial, + + JsonifySchemaT extends z.ZodRawShape, + JsonifySchemaUnknownKeys extends z.UnknownKeysParam, + JsonifySchemaCatchall extends z.ZodTypeAny, + + DejsonifySchemaT extends z.ZodRawShape, + DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + DejsonifySchemaCatchall extends z.ZodTypeAny, + + JsonifiedValues extends JsonifiableObject, +>( + class_: C | JsonifiableSchemableClass< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + + Values, + DefaultValues, + + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + + JsonifiedValues, + + "Class" + >, + + values: JsonifiedValues, + params?: Partial, +) { + return pipe( + parseZodTypeEffect(class_.dejsonifySchema, values, params), + Effect.map(values => new class_(values) as InstanceType), + ) +} diff --git a/src/jsonifiable/index.ts b/src/jsonifiable/index.ts index 3f08be2..26a26be 100644 --- a/src/jsonifiable/index.ts +++ b/src/jsonifiable/index.ts @@ -1,2 +1,3 @@ export * from "./JsonifiableSchemableClass" +export * from "./dejsonifySchemable" export * from "./makeJsonifiableSchemableClass" diff --git a/src/tests.ts b/src/tests.ts index b76de19..00be534 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,7 +1,7 @@ import { pipeInto } from "ts-functional-pipe" import { z } from "zod" import { extendSchemableClass, makeSchemableClass, newSchemable } from "." -import { makeJsonifiableSchemableClass } from "./jsonifiable" +import { dejsonifySchemable, makeJsonifiableSchemableClass } from "./jsonifiable" import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./legacy/jsonifiable" @@ -49,11 +49,13 @@ class User extends pipeInto( const user1 = newSchemable(User, { id: 1n, name: "User" }) -console.log(user1.jsonify()) +const jsonifiedUser1 = user1.jsonify() +console.log(jsonifiedUser1) +console.log(dejsonifySchemable(User, jsonifiedUser1)) const UserWithPhone = extendSchemableClass(User, { - schema: schema => schema.extend({ + schema: ({ schema }) => schema.extend({ phone: z.string() }), @@ -66,5 +68,5 @@ const UserWithPhone = extendSchemableClass(User, { UserWithPhone.schema -const user2 = newSchemable(UserWithPhone, { id: 1n, name: "User" }) -console.log(user2.jsonify()) +// const user2 = newSchemable(UserWithPhone, { id: 1n, name: "User" }) +// console.log(user2.jsonify())