diff --git a/src/builders/ZodSchemaClassBuilder.ts b/src/builders/ZodSchemaClassBuilder.ts index fe12b66..52e6dbd 100644 --- a/src/builders/ZodSchemaClassBuilder.ts +++ b/src/builders/ZodSchemaClassBuilder.ts @@ -18,25 +18,32 @@ extends TraitExpressionBuilder { declare ["constructor"]: typeof ZodSchemaClassBuilder schema< - Super extends AbstractClass & { schema?: never, defaultValues?: never }, + Super extends AbstractClass & { schema?: never, schemaWithDefaultValues?: never }, - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, - Values extends object, - DefaultValues extends Partial, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + + Values extends object, + PartialValues extends Partial, >( this: ZodSchemaClassBuilder, - { schema, defaultValues }: { - schema: z.ZodObject - defaultValues: DefaultValues + props: { + schema: z.ZodObject + + schemaWithDefaultValues: ( + schema: z.ZodObject + ) => z.ZodObject }, ) { class Schemas extends (this.expressionSuperclass as AbstractClass) { - static readonly schema = schema - static readonly defaultValues = defaultValues + static readonly schema = props.schema + static readonly schemaWithDefaultValues = props.schemaWithDefaultValues(props.schema) constructor(values: Values) { super() @@ -63,29 +70,33 @@ extends TraitExpressionBuilder { } jsonifiable< - Super extends ZodSchemaAbstractClass + Super extends ZodSchemaAbstractClass & { jsonifySchema?: never, dejsonifySchema?: never }, - Instance extends Values, + Instance extends Values, - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, - Values extends object, - DefaultValues extends Partial, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - JsonifySchemaT extends z.ZodRawShape, - JsonifySchemaUnknownKeys extends z.UnknownKeysParam, - JsonifySchemaCatchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, - DejsonifySchemaT extends z.ZodRawShape, - DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, - DejsonifySchemaCatchall extends z.ZodTypeAny, + JsonifySchemaT extends z.ZodRawShape, + JsonifySchemaUnknownKeys extends z.UnknownKeysParam, + JsonifySchemaCatchall extends z.ZodTypeAny, - JsonifiedValues extends JsonifiableObject, + DejsonifySchemaT extends z.ZodRawShape, + DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + DejsonifySchemaCatchall extends z.ZodTypeAny, + + JsonifiedValues extends JsonifiableObject, >( this: ZodSchemaClassBuilder< - Super | ZodSchemaAbstractClass, + Super | ZodSchemaAbstractClass, Traits >, @@ -115,7 +126,7 @@ extends TraitExpressionBuilder { Instance & JsonifiableSchemas, // TODO: for some reason, ConstructorParameters does not work here. Maybe try to find a fix? - ConstructorParameters> + ConstructorParameters> > & StaticMembers & StaticMembers diff --git a/src/shapes/ZodSchemaClass.ts b/src/shapes/ZodSchemaClass.ts index 0b33a2d..680c59a 100644 --- a/src/shapes/ZodSchemaClass.ts +++ b/src/shapes/ZodSchemaClass.ts @@ -3,41 +3,53 @@ import { z } from "zod" export type ZodSchemaClass< - Instance extends Values, + Instance extends Values, - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, - Values extends object, - DefaultValues extends Partial, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + + Values extends object, + PartialValues extends Partial, > = ( Class & - ZodSchemas + ZodSchemas ) export type ZodSchemaAbstractClass< - Instance extends Values, + Instance extends Values, - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, - Values extends object, - DefaultValues extends Partial, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + + Values extends object, + PartialValues extends Partial, > = ( AbstractClass & - ZodSchemas + ZodSchemas ) export type ZodSchemas< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, - Values extends object, - DefaultValues extends Partial, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + + Values extends object, + PartialValues extends Partial, > = { - readonly schema: z.ZodObject - readonly defaultValues: DefaultValues + readonly schema: z.ZodObject + readonly schemaWithDefaultValues: z.ZodObject } diff --git a/src/tests.ts b/src/tests.ts index 3a392ad..ddcafe7 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -3,7 +3,6 @@ import { z } from "zod" import { zodSchemaClass } from "./builders/ZodSchemaClassBuilder" import { dejsonify, jsonify } from "./schema/jsonify" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" -import { StaticMembers } from "./util" const exp = zodSchemaClass @@ -16,7 +15,9 @@ const exp = zodSchemaClass name: z.string(), }), - defaultValues: { id: -1n }, + schemaWithDefaultValues: s => s.extend({ + id: s.shape.id.default(-1n) + }), }) .jsonifiable({ jsonifySchema: s => s.extend({ @@ -33,7 +34,12 @@ const exp = zodSchemaClass @exp.staticImplements class User extends exp.extends implements Implements {} -User.defaultValues +const test = User.schema.extend({ + prout: z.string() +}).merge( + User.schemaWithDefaultValues +) + const inst = User.create({ id: 1n, name: "" }) // console.log(inst) const jsonifiedUser = await inst.jsonifyPromise() diff --git a/src/traits/ExtendableZodSchemaObject.ts b/src/traits/ExtendableZodSchemaObject.ts index 243e1b4..2b232fb 100644 --- a/src/traits/ExtendableZodSchemaObject.ts +++ b/src/traits/ExtendableZodSchemaObject.ts @@ -6,7 +6,7 @@ import { ZodSchemaClass } from "../shapes/ZodSchemaClass" export const ExtendableZodSchemaObject = trait .implement(Super => class ExtendableZodSchemaObject extends Super { static extend< - Self extends ZodSchemaClass, + Self extends ZodSchemaClass, >( this: Self ) { diff --git a/src/traits/InstantiableZodSchemaObject.ts b/src/traits/InstantiableZodSchemaObject.ts index d567034..9b70483 100644 --- a/src/traits/InstantiableZodSchemaObject.ts +++ b/src/traits/InstantiableZodSchemaObject.ts @@ -1,5 +1,5 @@ import { trait } from "@thilawyn/traitify-ts" -import { Effect, pipe } from "effect" +import { Effect } from "effect" import { HasRequiredKeys } from "type-fest" import { z } from "zod" import { ZodSchemaClass } from "../shapes/ZodSchemaClass" @@ -29,70 +29,67 @@ type NewZodSchemaInstanceArgs = ( export const InstantiableZodSchemaObject = trait .implement(Super => class InstantiableZodSchemaObject extends Super { static create< - Instance extends Values, + Instance extends Values, - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, - Values extends object, - DefaultValues extends Partial, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + + Values extends object, + PartialValues extends Partial, >( - this: ZodSchemaClass, - - ...[values, params]: NewZodSchemaInstanceArgs< - NewZodSchemaInstanceInput - > + this: ZodSchemaClass, + ...[values, params]: NewZodSchemaInstanceArgs ) { return new this( - this.schema.parse({ ...this.defaultValues, ...values }, params) + this.schemaWithDefaultValues.parse(values, params) ) } static async createPromise< - Instance extends Values, + Instance extends Values, - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, - Values extends object, - DefaultValues extends Partial, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + + Values extends object, + PartialValues extends Partial, >( - this: ZodSchemaClass, - - ...[values, params]: NewZodSchemaInstanceArgs< - NewZodSchemaInstanceInput - > + this: ZodSchemaClass, + ...[values, params]: NewZodSchemaInstanceArgs ) { return new this( - await this.schema.parseAsync({ ...this.defaultValues, ...values }, params) + await this.schemaWithDefaultValues.parseAsync(values, params) ) } static createEffect< - Instance extends Values, + Instance extends Values, - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, - Values extends object, - DefaultValues extends Partial, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + + Values extends object, + PartialValues extends Partial, >( - this: ZodSchemaClass, - - ...[values, params]: NewZodSchemaInstanceArgs< - NewZodSchemaInstanceInput - > + this: ZodSchemaClass, + ...[values, params]: NewZodSchemaInstanceArgs ) { - return pipe( - parseZodTypeEffect( - this.schema, - { ...this.defaultValues, ...values }, - params, - ), - + return parseZodTypeEffect(this.schemaWithDefaultValues, values, params).pipe( Effect.map(values => new this(values)), ) }