0.1.3 #4

Merged
Thilawyn merged 74 commits from next into master 2024-03-24 22:24:25 +01:00
5 changed files with 69 additions and 8 deletions
Showing only changes of commit 2ce0935f9a - Show all commits

View File

@@ -0,0 +1,56 @@
import { TraitInstance, TraitStaticMembers, expression } from "@thilawyn/traitify-ts"
import { AbstractClass } from "type-fest"
import { z } from "zod"
import { ZodSchemaObject, ZodSchemaObjectTrait } from "./lib"
import { Extend, StaticMembers } from "./util"
export function ExtendZodSchemaClass<
Self extends (
AbstractClass<
TraitInstance<ZodSchemaObjectTrait<T, Catchall, Values, PartialValues>> & Values,
[values: Values]
> &
TraitStaticMembers<ZodSchemaObjectTrait<T, Catchall, Values, PartialValues>>
),
T extends z.ZodRawShape,
Catchall extends z.ZodTypeAny,
Values extends object,
PartialValues extends Partial<Values>,
ExtendedT extends z.ZodRawShape,
ExtendedCatchall extends z.ZodTypeAny,
ExtendedValues extends Values,
ExtendedPartialValues extends Partial<ExtendedValues>,
>(
class_: Self | (
AbstractClass<
TraitInstance<ZodSchemaObjectTrait<T, Catchall, Values, PartialValues>> & Values,
[values: Values]
> &
TraitStaticMembers<ZodSchemaObjectTrait<T, Catchall, Values, PartialValues>>
),
schemaWithDefaults: (
schemaWithDefaults: z.ZodObject<T, "strip", Catchall, Values, PartialValues>
) => z.ZodObject<ExtendedT, "strip", ExtendedCatchall, ExtendedValues, ExtendedPartialValues>,
) {
return expression
.extends(
class_ as unknown as (
AbstractClass<
Omit<
Extend<[InstanceType<Self>, ExtendedValues]>,
keyof TraitInstance<ZodSchemaObjectTrait<T, Catchall, Values, PartialValues>>
>,
[values: ExtendedValues]
> &
Omit<
StaticMembers<Self>,
keyof TraitStaticMembers<ZodSchemaObjectTrait<T, Catchall, Values, PartialValues>>
>
)
)
.expresses(ZodSchemaObject(schemaWithDefaults((class_ as Self).schemaWithDefaults)))
}

View File

@@ -1,7 +1,7 @@
import { expression } from "@thilawyn/traitify-ts" import { expression } from "@thilawyn/traitify-ts"
import { Class } from "type-fest" import { Class } from "type-fest"
import { z } from "zod" import { z } from "zod"
import { ExtendableZodSchemaObject } from "./traits/ExtendableZodSchemaObject" import { ZodSchemaObject } from "./traits/ZodSchemaObject"
export function ZodSchemaClass< export function ZodSchemaClass<
@@ -20,5 +20,5 @@ export function ZodSchemaClass<
} }
} as Class<Values, [values: Values]> } as Class<Values, [values: Values]>
) )
.expresses(ExtendableZodSchemaObject(schemaWithDefaults)) .expresses(ZodSchemaObject(schemaWithDefaults))
} }

View File

@@ -1,6 +1,6 @@
export { ExtendZodSchemaClass } from "./ExtendZodSchemaClass"
export { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" export { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass"
export { ZodSchemaClass } from "./ZodSchemaClass" export { ZodSchemaClass } from "./ZodSchemaClass"
export { ExtendableZodSchemaObject } from "./traits/ExtendableZodSchemaObject"
export { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject" export { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject"
export { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" export { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject"
export { ZodSchemaObject, ZodSchemaObjectTrait } from "./traits/ZodSchemaObject" export { ZodSchemaObject, ZodSchemaObjectTrait } from "./traits/ZodSchemaObject"

View File

@@ -1,6 +1,7 @@
import { Implements } from "@thilawyn/traitify-ts" import { Implements } from "@thilawyn/traitify-ts"
import { Option } from "effect" import { Option } from "effect"
import { z } from "zod" import { z } from "zod"
import { ExtendZodSchemaClass } from "./ExtendZodSchemaClass"
import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass"
import { ZodSchemaClass } from "./ZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass"
import { s } from "./schema/lib" import { s } from "./schema/lib"
@@ -47,9 +48,11 @@ console.log(JSON.stringify(jsonifiedUserInst))
// jsonifiedUserInst.dejsonify() // jsonifiedUserInst.dejsonify()
const adminUserExp = User.extend(s => s.extend({ const adminUserExp = ExtendZodSchemaClass(User,
role: z.literal("Admin").default("Admin") schema => schema.extend({
})).build() role: z.literal("Admin").default("Admin")
})
).build()
@adminUserExp.staticImplements @adminUserExp.staticImplements
class AdminUser extends adminUserExp.extends implements Implements<typeof adminUserExp> {} class AdminUser extends adminUserExp.extends implements Implements<typeof adminUserExp> {}

View File

@@ -8,13 +8,15 @@ export const MobXObservableZodSchemaObject = trait
.staticAbstract(Super => class extends Super { .staticAbstract(Super => class extends Super {
declare readonly schema: z.ZodObject<z.ZodRawShape, z.UnknownKeysParam, z.ZodTypeAny, object, object> declare readonly schema: z.ZodObject<z.ZodRawShape, z.UnknownKeysParam, z.ZodTypeAny, object, object>
}) })
.implement(Super => class ObservableZodSchemaObject extends Super { .implement(Super => class MobXObservableZodSchemaObjectImpl extends Super {
declare ["constructor"]: typeof MobXObservableZodSchemaObjectImpl
constructor(...args: any[]) { constructor(...args: any[]) {
super(...args) super(...args)
makeObservable(this, makeObservable(this,
mapValues( mapValues(
(this.constructor as typeof ObservableZodSchemaObject).schema.shape, this.constructor.schema.shape,
() => observable, () => observable,
) )
) )