From c3c7c0aba58d5ac34592d01c0d81ecf3091ed075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 15 Mar 2024 03:14:55 +0100 Subject: [PATCH 01/74] ZodSchemaObject work --- src/traits/ZodSchemaObject.ts | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index e866fdf..10fc6ad 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -13,18 +13,15 @@ type CreateArgs = ( export const ZodSchemaObject = < SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, SchemaCatchall extends z.ZodTypeAny, - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, Values extends object, PartialValues extends Partial, >( - schema: z.ZodObject, - schemaWithDefaultValues: z.ZodObject, + schema: z.ZodObject, + schemaWithDefaultValues: z.ZodObject, ) => trait .implement(Super => class ZodSchemaObject extends Super { static readonly schema = schema @@ -95,11 +92,8 @@ export const ZodSchemaObject = < export type ZodSchemaObjectTrait< SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, SchemaCatchall extends z.ZodTypeAny, - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, Values extends object, @@ -108,11 +102,8 @@ export type ZodSchemaObjectTrait< ReturnType< typeof ZodSchemaObject< SchemaT, - SchemaUnknownKeys, SchemaCatchall, - SchemaWithDefaultValuesT, - SchemaWithDefaultValuesUnknownKeys, SchemaWithDefaultValuesCatchall, Values, -- 2.49.1 From fe13efa1a333cb91d8910383a82c504704431034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 15 Mar 2024 03:24:05 +0100 Subject: [PATCH 02/74] ZodSchemaClass --- src/ZodSchemaClass.ts | 36 +++++++++++++++++++++++++++++++++++ src/traits/ZodSchemaObject.ts | 12 ++++++------ 2 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/ZodSchemaClass.ts diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts new file mode 100644 index 0000000..320b695 --- /dev/null +++ b/src/ZodSchemaClass.ts @@ -0,0 +1,36 @@ +import { z } from "zod" +import { ZodSchemaObject } from "./lib" +import { expression } from "@thilawyn/traitify-ts" +import { AbstractClass } from "type-fest" + + +export function ZodSchemaClass< + SchemaT extends z.ZodRawShape, + SchemaCatchall extends z.ZodTypeAny, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + + Values extends object, + PartialValues extends Partial, +>( + props: { + schema: z.ZodObject + + schemaWithDefaultValues: ( + schema: z.ZodObject + ) => z.ZodObject + } +) { + const schema = props.schema + const schemaWithDefaultValues = props.schemaWithDefaultValues(props.schema) + + abstract class ZodSchemaObjectConstructor { + constructor(values: Values) { + Object.assign(this, values) + } + } + + return expression + .extends(ZodSchemaObjectConstructor as AbstractClass) + .expresses(ZodSchemaObject(schema, schemaWithDefaultValues)) +} diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 10fc6ad..d6efdf6 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -12,13 +12,13 @@ type CreateArgs = ( export const ZodSchemaObject = < - SchemaT extends z.ZodRawShape, - SchemaCatchall extends z.ZodTypeAny, - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, + SchemaT extends z.ZodRawShape, + SchemaCatchall extends z.ZodTypeAny, + SchemaWithDefaultValuesT extends z.ZodRawShape, + SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - Values extends object, - PartialValues extends Partial, + Values extends object, + PartialValues extends Partial, >( schema: z.ZodObject, schemaWithDefaultValues: z.ZodObject, -- 2.49.1 From 272a382887884a809cc32b2dbd2b6f9ffc98db64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 15 Mar 2024 03:28:01 +0100 Subject: [PATCH 03/74] Tests --- src/tests.ts | 65 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index dff7e44..2caa7d2 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,34 +1,49 @@ import { Implements } from "@thilawyn/traitify-ts" import { z } from "zod" -import { zodSchemaClass } from "./builders/ZodSchemaClassBuilder" -import { dejsonify, jsonify } from "./schema/jsonifiable" +import { ZodSchemaClass } from "./ZodSchemaClass" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" -const exp = zodSchemaClass - .schema({ - schema: z.object({ - /** User ID */ - id: z.bigint(), +// const exp = zodSchemaClass +// .schema({ +// schema: z.object({ +// /** User ID */ +// id: z.bigint(), - /** Username */ - name: z.string(), - }), +// /** Username */ +// name: z.string(), +// }), - schemaWithDefaultValues: s => s.extend({ - id: s.shape.id.default(-1n), - }), - }) - .jsonifiable({ - jsonifySchema: s => s.extend({ - id: jsonify.bigint(s.shape.id) - }), +// schemaWithDefaultValues: s => s.extend({ +// id: s.shape.id.default(-1n), +// }), +// }) +// .jsonifiable({ +// jsonifySchema: s => s.extend({ +// id: jsonify.bigint(s.shape.id) +// }), - dejsonifySchema: s => s.extend({ - id: dejsonify.bigint(s.shape.id) - }), - }) - .toExpression() +// dejsonifySchema: s => s.extend({ +// id: dejsonify.bigint(s.shape.id) +// }), +// }) +// .toExpression() +// .expresses(MobXObservableZodSchemaObject) +// .build() + +const exp = ZodSchemaClass({ + schema: z.object({ + /** User ID */ + id: z.bigint(), + + /** Username */ + name: z.string(), + }), + + schemaWithDefaultValues: s => s.extend({ + id: s.shape.id.default(-1n), + }), +}) .expresses(MobXObservableZodSchemaObject) .build() @@ -40,8 +55,8 @@ const inst = User.create({ id: 1n, name: "User" }) // console.log(inst.name) const instEffect = User.createEffect({ id: 1n, name: "User" }) -const jsonifiedUser = await inst.jsonifyPromise() -const dejsonifiedInst = await User.dejsonifyPromise(jsonifiedUser) +// const jsonifiedUser = await inst.jsonifyPromise() +// const dejsonifiedInst = await User.dejsonifyPromise(jsonifiedUser) // const AdminUserProto = User.extend() -- 2.49.1 From d0c380d19eafad24d58ff0b17699a3919a2e8fd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 15 Mar 2024 03:36:14 +0100 Subject: [PATCH 04/74] ZodSchemaObject work --- src/ZodSchemaClass.ts | 2 +- src/traits/ZodSchemaObject.ts | 124 ++++++++++++++++++---------------- 2 files changed, 65 insertions(+), 61 deletions(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 320b695..0893682 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -31,6 +31,6 @@ export function ZodSchemaClass< } return expression - .extends(ZodSchemaObjectConstructor as AbstractClass) + .extends(ZodSchemaObjectConstructor) .expresses(ZodSchemaObject(schema, schemaWithDefaultValues)) } diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index d6efdf6..4ccb7d7 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -1,7 +1,7 @@ import { ImplStatic, trait } from "@thilawyn/traitify-ts" import { Class, HasRequiredKeys } from "type-fest" import { z } from "zod" -import { parseZodSchemaEffect } from "../util" +import { StaticMembers, parseZodSchemaEffect } from "../util" type CreateArgs = ( @@ -23,69 +23,73 @@ export const ZodSchemaObject = < schema: z.ZodObject, schemaWithDefaultValues: z.ZodObject, ) => trait - .implement(Super => class ZodSchemaObject extends Super { - static readonly schema = schema - static readonly schemaWithDefaultValues = schemaWithDefaultValues + .implement(Super => { + class ZodSchemaObject extends Super { + static readonly schema = schema + static readonly schemaWithDefaultValues = schemaWithDefaultValues - static transform< - Instance extends Values, + static transform< + Instance extends Values, - T extends z.ZodRawShape, - UnknownKeys extends z.UnknownKeysParam, - Catchall extends z.ZodTypeAny, - Output extends Values, - Input, - >( - this: Class, - schema: z.ZodObject, - ) { - return schema.transform(values => new this(values)) + T extends z.ZodRawShape, + UnknownKeys extends z.UnknownKeysParam, + Catchall extends z.ZodTypeAny, + Output extends Values, + Input, + >( + this: Class, + schema: z.ZodObject, + ) { + return schema.transform(values => new this(values)) + } + + + static create< + Instance extends Values + >( + this: ( + Class & + ImplStatic + ), + ...[values, params]: CreateArgs + ) { + return this + .transform(this.schemaWithDefaultValues) + .parse(values, params) + } + + static createPromise< + Instance extends Values + >( + this: ( + Class & + ImplStatic + ), + ...[values, params]: CreateArgs + ) { + return this + .transform(this.schemaWithDefaultValues) + .parseAsync(values, params) + } + + static createEffect< + Instance extends Values + >( + this: ( + Class & + ImplStatic + ), + ...[values, params]: CreateArgs + ) { + return parseZodSchemaEffect( + this.transform(this.schemaWithDefaultValues), + values, + params, + ) + } } - - static create< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return this - .transform(this.schemaWithDefaultValues) - .parse(values, params) - } - - static createPromise< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return this - .transform(this.schemaWithDefaultValues) - .parseAsync(values, params) - } - - static createEffect< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return parseZodSchemaEffect( - this.transform(this.schemaWithDefaultValues), - values, - params, - ) - } + return ZodSchemaObject as Class & StaticMembers }) .build() -- 2.49.1 From 83b5af1719974c6bd0de6771cdf38e8e7afc055b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 15 Mar 2024 03:37:12 +0100 Subject: [PATCH 05/74] Cleanup --- src/ZodSchemaClass.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 0893682..5b37763 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -1,7 +1,6 @@ +import { expression } from "@thilawyn/traitify-ts" import { z } from "zod" import { ZodSchemaObject } from "./lib" -import { expression } from "@thilawyn/traitify-ts" -import { AbstractClass } from "type-fest" export function ZodSchemaClass< -- 2.49.1 From 07fb50d21dadc48499febe932f131409ee6fb627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 15 Mar 2024 03:40:48 +0100 Subject: [PATCH 06/74] ZodSchemaClass work --- src/ZodSchemaClass.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 5b37763..2791794 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -3,6 +3,13 @@ import { z } from "zod" import { ZodSchemaObject } from "./lib" +class ZodSchemaObjectConstructor { + constructor(values: Values) { + Object.assign(this, values) + } +} + + export function ZodSchemaClass< SchemaT extends z.ZodRawShape, SchemaCatchall extends z.ZodTypeAny, @@ -20,16 +27,7 @@ export function ZodSchemaClass< ) => z.ZodObject } ) { - const schema = props.schema - const schemaWithDefaultValues = props.schemaWithDefaultValues(props.schema) - - abstract class ZodSchemaObjectConstructor { - constructor(values: Values) { - Object.assign(this, values) - } - } - return expression - .extends(ZodSchemaObjectConstructor) - .expresses(ZodSchemaObject(schema, schemaWithDefaultValues)) + .extends(ZodSchemaObjectConstructor) + .expresses(ZodSchemaObject(props.schema, props.schemaWithDefaultValues(props.schema))) } -- 2.49.1 From d7c8fd1a2d4e80685c82eb5fbb97cb606e13fcde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 15 Mar 2024 19:18:10 +0100 Subject: [PATCH 07/74] stripZodSchemaDefaults util --- src/util/index.ts | 1 + src/util/zod.ts | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/util/zod.ts diff --git a/src/util/index.ts b/src/util/index.ts index 7bc5968..03b6dcd 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -2,3 +2,4 @@ export * from "./class" export * from "./effect" export * from "./extend" export * from "./misc" +export * from "./zod" diff --git a/src/util/zod.ts b/src/util/zod.ts new file mode 100644 index 0000000..05b00a9 --- /dev/null +++ b/src/util/zod.ts @@ -0,0 +1,25 @@ +import { mapValues } from "lodash-es" +import { z } from "zod" + + +export function stripZodObjectDefaults< + T extends z.ZodRawShape, + UnknownKeys extends z.UnknownKeysParam, + Catchall extends z.ZodTypeAny, + Output, + Input, +>( + schema: z.ZodObject +) { + return schema.extend( + mapValues(schema.shape, v => + v instanceof z.ZodDefault + ? v.removeDefault() + : v + ) as { + [K in keyof T]: T[K] extends z.ZodDefault + ? NestedDef + : T[K] + } + ) +} -- 2.49.1 From a985d14beac712442ca1d54eea4ef39ca5e03d52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 16 Mar 2024 01:48:33 +0100 Subject: [PATCH 08/74] ZodSchemaObject refactoring --- src/ZodSchemaClass.ts | 21 ++++-------- src/tests.ts | 14 +++----- src/traits/ZodSchemaObject.ts | 61 +++++++++++++---------------------- 3 files changed, 34 insertions(+), 62 deletions(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 2791794..94b84e5 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -11,23 +11,14 @@ class ZodSchemaObjectConstructor { export function ZodSchemaClass< - SchemaT extends z.ZodRawShape, - SchemaCatchall extends z.ZodTypeAny, - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, >( - props: { - schema: z.ZodObject - - schemaWithDefaultValues: ( - schema: z.ZodObject - ) => z.ZodObject - } + schema: z.ZodObject ) { return expression .extends(ZodSchemaObjectConstructor) - .expresses(ZodSchemaObject(props.schema, props.schemaWithDefaultValues(props.schema))) + .expresses(ZodSchemaObject(schema)) } diff --git a/src/tests.ts b/src/tests.ts index 2caa7d2..42f4ca7 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -31,19 +31,15 @@ import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaO // .expresses(MobXObservableZodSchemaObject) // .build() -const exp = ZodSchemaClass({ - schema: z.object({ +const exp = ZodSchemaClass( + z.object({ /** User ID */ - id: z.bigint(), + id: z.bigint().default(-1n), /** Username */ name: z.string(), - }), - - schemaWithDefaultValues: s => s.extend({ - id: s.shape.id.default(-1n), - }), -}) + }) +) .expresses(MobXObservableZodSchemaObject) .build() diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 4ccb7d7..e5ddb0c 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -1,7 +1,7 @@ import { ImplStatic, trait } from "@thilawyn/traitify-ts" import { Class, HasRequiredKeys } from "type-fest" import { z } from "zod" -import { StaticMembers, parseZodSchemaEffect } from "../util" +import { StaticMembers, parseZodSchemaEffect, stripZodObjectDefaults } from "../util" type CreateArgs = ( @@ -12,33 +12,29 @@ type CreateArgs = ( export const ZodSchemaObject = < - SchemaT extends z.ZodRawShape, - SchemaCatchall extends z.ZodTypeAny, - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, >( - schema: z.ZodObject, - schemaWithDefaultValues: z.ZodObject, + schemaWithDefaults: z.ZodObject, ) => trait .implement(Super => { class ZodSchemaObject extends Super { - static readonly schema = schema - static readonly schemaWithDefaultValues = schemaWithDefaultValues + static readonly schema = stripZodObjectDefaults(schemaWithDefaults) + static readonly schemaWithDefaults = schemaWithDefaults static transform< - Instance extends Values, + Instance extends Values, - T extends z.ZodRawShape, - UnknownKeys extends z.UnknownKeysParam, - Catchall extends z.ZodTypeAny, - Output extends Values, - Input, + TransformT extends z.ZodRawShape, + TransformUnknownKeys extends z.UnknownKeysParam, + TransformCatchall extends z.ZodTypeAny, + TransformOutput extends Values, + TransformInput, >( this: Class, - schema: z.ZodObject, + schema: z.ZodObject, ) { return schema.transform(values => new this(values)) } @@ -54,7 +50,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { return this - .transform(this.schemaWithDefaultValues) + .transform(this.schemaWithDefaults) .parse(values, params) } @@ -68,7 +64,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { return this - .transform(this.schemaWithDefaultValues) + .transform(this.schemaWithDefaults) .parseAsync(values, params) } @@ -82,7 +78,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { return parseZodSchemaEffect( - this.transform(this.schemaWithDefaultValues), + this.transform(this.schemaWithDefaults), values, params, ) @@ -95,23 +91,12 @@ export const ZodSchemaObject = < export type ZodSchemaObjectTrait< - SchemaT extends z.ZodRawShape, - SchemaCatchall extends z.ZodTypeAny, - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, > = ( ReturnType< - typeof ZodSchemaObject< - SchemaT, - SchemaCatchall, - SchemaWithDefaultValuesT, - SchemaWithDefaultValuesCatchall, - - Values, - PartialValues - > + typeof ZodSchemaObject > ) -- 2.49.1 From 2bf207883f912e616fc3c88030562bdccf5b9be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 16 Mar 2024 02:04:58 +0100 Subject: [PATCH 09/74] extend --- src/traits/ZodSchemaObject.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index e5ddb0c..54a3601 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -1,5 +1,5 @@ import { ImplStatic, trait } from "@thilawyn/traitify-ts" -import { Class, HasRequiredKeys } from "type-fest" +import { AbstractClass, Class, HasRequiredKeys } from "type-fest" import { z } from "zod" import { StaticMembers, parseZodSchemaEffect, stripZodObjectDefaults } from "../util" @@ -83,6 +83,15 @@ export const ZodSchemaObject = < params, ) } + + + static extend< + Self extends AbstractClass & ImplStatic + >( + this: Self + ) { + + } } return ZodSchemaObject as Class & StaticMembers -- 2.49.1 From 11f384d933b6f921fc03bb6aaae05cc16a08a7fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 16 Mar 2024 23:20:39 +0100 Subject: [PATCH 10/74] ExtendableZodSchemaObject --- src/ZodSchemaClass.ts | 4 ++-- src/traits/ExtendableZodSchemaObject.ts | 31 ++++++++++++++----------- src/traits/ZodSchemaObject.ts | 25 ++++++++++++++------ 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 94b84e5..c13f9d6 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -16,9 +16,9 @@ export function ZodSchemaClass< Values extends object, PartialValues extends Partial, >( - schema: z.ZodObject + schemaWithDefaults: z.ZodObject ) { return expression .extends(ZodSchemaObjectConstructor) - .expresses(ZodSchemaObject(schema)) + .expresses(ZodSchemaObject(schemaWithDefaults)) } diff --git a/src/traits/ExtendableZodSchemaObject.ts b/src/traits/ExtendableZodSchemaObject.ts index 0fc0891..c89c66d 100644 --- a/src/traits/ExtendableZodSchemaObject.ts +++ b/src/traits/ExtendableZodSchemaObject.ts @@ -1,16 +1,19 @@ -// import { trait } from "@thilawyn/traitify-ts" -// import { ZodSchemaClassExtender } from "../builders/ZodSchemaClassExtender" -// import { ZodSchemaClass } from "../shapes/ZodSchemaClass" +import { expression } from "@thilawyn/traitify-ts" +import { z } from "zod" +import { ZodSchemaObject } from "./ZodSchemaObject" -// export const ExtendableZodSchemaObject = trait -// .implement(Super => class ExtendableZodSchemaObject extends Super { -// static extend< -// Self extends ZodSchemaClass, -// >( -// this: Self -// ) { -// return new ZodSchemaClassExtender(this, this) -// } -// }) -// .build() +export const ExtendableZodSchemaObject = < + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, +>( + schemaWithDefaults: z.ZodObject, +) => expression + .expresses(ZodSchemaObject(schemaWithDefaults)) + .buildAnyway() + .subtrait() + .implement(Super => class ExtendableZodSchemaObject extends Super { + }) + .build() diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 54a3601..850121f 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -1,5 +1,5 @@ import { ImplStatic, trait } from "@thilawyn/traitify-ts" -import { AbstractClass, Class, HasRequiredKeys } from "type-fest" +import { Class, HasRequiredKeys } from "type-fest" import { z } from "zod" import { StaticMembers, parseZodSchemaEffect, stripZodObjectDefaults } from "../util" @@ -85,13 +85,24 @@ export const ZodSchemaObject = < } - static extend< - Self extends AbstractClass & ImplStatic - >( - this: Self - ) { + // static extend< + // Self extends AbstractClass & ImplStatic, - } + // ExtendedT extends z.ZodRawShape, + // ExtendedCatchall extends z.ZodTypeAny, + // ExtendedValues extends Values, + // ExtendedPartialValues extends Partial, + // >( + // this: Self, + + // schemaWithDefaults: ( + // schemaWithDefaults: typeof this.schemaWithDefaults + // ) => z.ZodObject, + // ) { + // return expression + // .extends(this) + // .expresses(ZodSchemaObject(schemaWithDefaults(this.schemaWithDefaults))) + // } } return ZodSchemaObject as Class & StaticMembers -- 2.49.1 From 73303a174855ffb3c5c20e49868e8cd906088de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 12:29:07 +0100 Subject: [PATCH 11/74] ZodSchemaObject refactoring --- src/ZodSchemaClass.ts | 16 +-- src/traits/ExtendableZodSchemaObject.ts | 4 +- src/traits/ZodSchemaObject.ts | 164 ++++++++++++------------ 3 files changed, 90 insertions(+), 94 deletions(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index c13f9d6..c246529 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -1,15 +1,9 @@ import { expression } from "@thilawyn/traitify-ts" +import { Class } from "type-fest" import { z } from "zod" import { ZodSchemaObject } from "./lib" -class ZodSchemaObjectConstructor { - constructor(values: Values) { - Object.assign(this, values) - } -} - - export function ZodSchemaClass< T extends z.ZodRawShape, Catchall extends z.ZodTypeAny, @@ -19,6 +13,12 @@ export function ZodSchemaClass< schemaWithDefaults: z.ZodObject ) { return expression - .extends(ZodSchemaObjectConstructor) + .extends( + class ZodSchemaObjectConstructor { + constructor(values: Values) { + Object.assign(this, values) + } + } as Class + ) .expresses(ZodSchemaObject(schemaWithDefaults)) } diff --git a/src/traits/ExtendableZodSchemaObject.ts b/src/traits/ExtendableZodSchemaObject.ts index c89c66d..9c9ec54 100644 --- a/src/traits/ExtendableZodSchemaObject.ts +++ b/src/traits/ExtendableZodSchemaObject.ts @@ -12,8 +12,8 @@ export const ExtendableZodSchemaObject = < schemaWithDefaults: z.ZodObject, ) => expression .expresses(ZodSchemaObject(schemaWithDefaults)) - .buildAnyway() + .build() .subtrait() - .implement(Super => class ExtendableZodSchemaObject extends Super { + .implement(Super => class ExtendableZodSchemaObjectImpl extends Super { }) .build() diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 850121f..03b94fd 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -1,7 +1,7 @@ import { ImplStatic, trait } from "@thilawyn/traitify-ts" import { Class, HasRequiredKeys } from "type-fest" import { z } from "zod" -import { StaticMembers, parseZodSchemaEffect, stripZodObjectDefaults } from "../util" +import { parseZodSchemaEffect, stripZodObjectDefaults } from "../util" type CreateArgs = ( @@ -19,93 +19,89 @@ export const ZodSchemaObject = < >( schemaWithDefaults: z.ZodObject, ) => trait - .implement(Super => { - class ZodSchemaObject extends Super { - static readonly schema = stripZodObjectDefaults(schemaWithDefaults) - static readonly schemaWithDefaults = schemaWithDefaults + .implement(Super => class ZodSchemaObjectImpl extends Super { + static readonly schema = stripZodObjectDefaults(schemaWithDefaults) + static readonly schemaWithDefaults = schemaWithDefaults - static transform< - Instance extends Values, + static transform< + Instance extends Values, - TransformT extends z.ZodRawShape, - TransformUnknownKeys extends z.UnknownKeysParam, - TransformCatchall extends z.ZodTypeAny, - TransformOutput extends Values, - TransformInput, - >( - this: Class, - schema: z.ZodObject, - ) { - return schema.transform(values => new this(values)) - } - - - static create< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return this - .transform(this.schemaWithDefaults) - .parse(values, params) - } - - static createPromise< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return this - .transform(this.schemaWithDefaults) - .parseAsync(values, params) - } - - static createEffect< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return parseZodSchemaEffect( - this.transform(this.schemaWithDefaults), - values, - params, - ) - } - - - // static extend< - // Self extends AbstractClass & ImplStatic, - - // ExtendedT extends z.ZodRawShape, - // ExtendedCatchall extends z.ZodTypeAny, - // ExtendedValues extends Values, - // ExtendedPartialValues extends Partial, - // >( - // this: Self, - - // schemaWithDefaults: ( - // schemaWithDefaults: typeof this.schemaWithDefaults - // ) => z.ZodObject, - // ) { - // return expression - // .extends(this) - // .expresses(ZodSchemaObject(schemaWithDefaults(this.schemaWithDefaults))) - // } + TransformT extends z.ZodRawShape, + TransformUnknownKeys extends z.UnknownKeysParam, + TransformCatchall extends z.ZodTypeAny, + TransformOutput extends Values, + TransformInput, + >( + this: Class, + schema: z.ZodObject, + ) { + return schema.transform(values => new this(values)) } - return ZodSchemaObject as Class & StaticMembers + + static create< + Instance extends Values + >( + this: ( + Class & + ImplStatic + ), + ...[values, params]: CreateArgs + ) { + return this + .transform(this.schemaWithDefaults) + .parse(values, params) + } + + static createPromise< + Instance extends Values + >( + this: ( + Class & + ImplStatic + ), + ...[values, params]: CreateArgs + ) { + return this + .transform(this.schemaWithDefaults) + .parseAsync(values, params) + } + + static createEffect< + Instance extends Values + >( + this: ( + Class & + ImplStatic + ), + ...[values, params]: CreateArgs + ) { + return parseZodSchemaEffect( + this.transform(this.schemaWithDefaults), + values, + params, + ) + } + + + // static extend< + // Self extends AbstractClass & ImplStatic, + + // ExtendedT extends z.ZodRawShape, + // ExtendedCatchall extends z.ZodTypeAny, + // ExtendedValues extends Values, + // ExtendedPartialValues extends Partial, + // >( + // this: Self, + + // schemaWithDefaults: ( + // schemaWithDefaults: typeof this.schemaWithDefaults + // ) => z.ZodObject, + // ) { + // return expression + // .extends(this) + // .expresses(ZodSchemaObject(schemaWithDefaults(this.schemaWithDefaults))) + // } }) .build() -- 2.49.1 From 2a23259b3e4a1cda8f2ad46ccc2e2ee008c42bd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 12:53:34 +0100 Subject: [PATCH 12/74] Tests --- src/tests.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/tests.ts b/src/tests.ts index 42f4ca7..6438366 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2,6 +2,7 @@ import { Implements } from "@thilawyn/traitify-ts" import { z } from "zod" import { ZodSchemaClass } from "./ZodSchemaClass" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" +import { stripZodObjectDefaults } from "./util" // const exp = zodSchemaClass @@ -43,6 +44,16 @@ const exp = ZodSchemaClass( .expresses(MobXObservableZodSchemaObject) .build() +const test = stripZodObjectDefaults( + z.object({ + /** User ID */ + id: z.bigint().default(-1n), + + /** Username */ + name: z.string(), + }) +) + @exp.staticImplements class User extends exp.extends implements Implements {} -- 2.49.1 From 9f7b7f8b42efd72302b32ab3fb563c181215d070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 13:03:16 +0100 Subject: [PATCH 13/74] Schema fix --- src/traits/ZodSchemaObject.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 03b94fd..fc7a319 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -20,7 +20,7 @@ export const ZodSchemaObject = < schemaWithDefaults: z.ZodObject, ) => trait .implement(Super => class ZodSchemaObjectImpl extends Super { - static readonly schema = stripZodObjectDefaults(schemaWithDefaults) + static readonly schema = stripZodObjectDefaults(schemaWithDefaults) static readonly schemaWithDefaults = schemaWithDefaults static transform< -- 2.49.1 From d45708dc2681a85b5627c5d321d8ec5a07cd323b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 13:12:42 +0100 Subject: [PATCH 14/74] ExtendableZodSchemaObject --- src/ZodSchemaClass.ts | 4 ++-- src/traits/ExtendableZodSchemaObject.ts | 21 ++++++++++++++++++++- src/traits/ZodSchemaObject.ts | 20 -------------------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index c246529..19ee1e9 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -1,7 +1,7 @@ import { expression } from "@thilawyn/traitify-ts" import { Class } from "type-fest" import { z } from "zod" -import { ZodSchemaObject } from "./lib" +import { ExtendableZodSchemaObject } from "./traits/ExtendableZodSchemaObject" export function ZodSchemaClass< @@ -20,5 +20,5 @@ export function ZodSchemaClass< } } as Class ) - .expresses(ZodSchemaObject(schemaWithDefaults)) + .expresses(ExtendableZodSchemaObject(schemaWithDefaults)) } diff --git a/src/traits/ExtendableZodSchemaObject.ts b/src/traits/ExtendableZodSchemaObject.ts index 9c9ec54..aebadee 100644 --- a/src/traits/ExtendableZodSchemaObject.ts +++ b/src/traits/ExtendableZodSchemaObject.ts @@ -1,4 +1,5 @@ -import { expression } from "@thilawyn/traitify-ts" +import { ImplStatic, expression } from "@thilawyn/traitify-ts" +import { AbstractClass } from "type-fest" import { z } from "zod" import { ZodSchemaObject } from "./ZodSchemaObject" @@ -15,5 +16,23 @@ export const ExtendableZodSchemaObject = < .build() .subtrait() .implement(Super => class ExtendableZodSchemaObjectImpl extends Super { + static extend< + Self extends AbstractClass & ImplStatic, + + ExtendedT extends z.ZodRawShape, + ExtendedCatchall extends z.ZodTypeAny, + ExtendedValues extends Values, + ExtendedPartialValues extends Partial, + >( + this: Self, + + schemaWithDefaults: ( + schemaWithDefaults: typeof this.schemaWithDefaults + ) => z.ZodObject, + ) { + return expression + .extends(this) + .expresses(ExtendableZodSchemaObject(schemaWithDefaults(this.schemaWithDefaults))) + } }) .build() diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index fc7a319..7564b10 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -82,26 +82,6 @@ export const ZodSchemaObject = < params, ) } - - - // static extend< - // Self extends AbstractClass & ImplStatic, - - // ExtendedT extends z.ZodRawShape, - // ExtendedCatchall extends z.ZodTypeAny, - // ExtendedValues extends Values, - // ExtendedPartialValues extends Partial, - // >( - // this: Self, - - // schemaWithDefaults: ( - // schemaWithDefaults: typeof this.schemaWithDefaults - // ) => z.ZodObject, - // ) { - // return expression - // .extends(this) - // .expresses(ZodSchemaObject(schemaWithDefaults(this.schemaWithDefaults))) - // } }) .build() -- 2.49.1 From 1a1a1697192cbd6b160d65a65ee5e582be6612fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 13:22:31 +0100 Subject: [PATCH 15/74] ZodSchemaObject fix --- src/traits/ZodSchemaObject.ts | 122 ++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 59 deletions(-) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 7564b10..3ffdfc6 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -19,69 +19,73 @@ export const ZodSchemaObject = < >( schemaWithDefaults: z.ZodObject, ) => trait - .implement(Super => class ZodSchemaObjectImpl extends Super { - static readonly schema = stripZodObjectDefaults(schemaWithDefaults) - static readonly schemaWithDefaults = schemaWithDefaults + .implement(Super => { + class ZodSchemaObjectImpl extends Super { + static readonly schema = stripZodObjectDefaults(schemaWithDefaults) + static readonly schemaWithDefaults = schemaWithDefaults - static transform< - Instance extends Values, + static transform< + Instance extends Values, - TransformT extends z.ZodRawShape, - TransformUnknownKeys extends z.UnknownKeysParam, - TransformCatchall extends z.ZodTypeAny, - TransformOutput extends Values, - TransformInput, - >( - this: Class, - schema: z.ZodObject, - ) { - return schema.transform(values => new this(values)) + TransformT extends z.ZodRawShape, + TransformUnknownKeys extends z.UnknownKeysParam, + TransformCatchall extends z.ZodTypeAny, + TransformOutput extends Values, + TransformInput, + >( + this: Class, + schema: z.ZodObject, + ) { + return schema.transform(values => new this(values)) + } + + + static create< + Instance extends Values + >( + this: ( + Class & + ImplStatic + ), + ...[values, params]: CreateArgs + ) { + return this + .transform(this.schemaWithDefaults) + .parse(values, params) + } + + static createPromise< + Instance extends Values + >( + this: ( + Class & + ImplStatic + ), + ...[values, params]: CreateArgs + ) { + return this + .transform(this.schemaWithDefaults) + .parseAsync(values, params) + } + + static createEffect< + Instance extends Values + >( + this: ( + Class & + ImplStatic + ), + ...[values, params]: CreateArgs + ) { + return parseZodSchemaEffect( + this.transform(this.schemaWithDefaults), + values, + params, + ) + } } - - static create< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return this - .transform(this.schemaWithDefaults) - .parse(values, params) - } - - static createPromise< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return this - .transform(this.schemaWithDefaults) - .parseAsync(values, params) - } - - static createEffect< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return parseZodSchemaEffect( - this.transform(this.schemaWithDefaults), - values, - params, - ) - } + return ZodSchemaObjectImpl }) .build() -- 2.49.1 From 89ed8d4f44eed35479c2a4fa076a8b1f74c45bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 14:34:46 +0100 Subject: [PATCH 16/74] ExtendableZodSchemaObject --- src/tests.ts | 73 ++++--------------------- src/traits/ExtendableZodSchemaObject.ts | 17 +++++- 2 files changed, 27 insertions(+), 63 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index 6438366..ed5f0b6 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2,85 +2,36 @@ import { Implements } from "@thilawyn/traitify-ts" import { z } from "zod" import { ZodSchemaClass } from "./ZodSchemaClass" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" -import { stripZodObjectDefaults } from "./util" -// const exp = zodSchemaClass -// .schema({ -// schema: z.object({ -// /** User ID */ -// id: z.bigint(), - -// /** Username */ -// name: z.string(), -// }), - -// schemaWithDefaultValues: s => s.extend({ -// id: s.shape.id.default(-1n), -// }), -// }) -// .jsonifiable({ -// jsonifySchema: s => s.extend({ -// id: jsonify.bigint(s.shape.id) -// }), - -// dejsonifySchema: s => s.extend({ -// id: dejsonify.bigint(s.shape.id) -// }), -// }) -// .toExpression() -// .expresses(MobXObservableZodSchemaObject) -// .build() - -const exp = ZodSchemaClass( +const userExp = ZodSchemaClass( z.object({ /** User ID */ id: z.bigint().default(-1n), /** Username */ name: z.string(), + + /** Role */ + role: z.enum(["User", "Moderator", "Admin"]).default("User"), }) ) .expresses(MobXObservableZodSchemaObject) .build() -const test = stripZodObjectDefaults( - z.object({ - /** User ID */ - id: z.bigint().default(-1n), - - /** Username */ - name: z.string(), - }) -) - - -@exp.staticImplements -class User extends exp.extends implements Implements {} +@userExp.staticImplements +class User extends userExp.extends implements Implements {} const inst = User.create({ id: 1n, name: "User" }) // console.log(inst.name) const instEffect = User.createEffect({ id: 1n, name: "User" }) -// const jsonifiedUser = await inst.jsonifyPromise() -// const dejsonifiedInst = await User.dejsonifyPromise(jsonifiedUser) +const adminUserExp = User.extend(s => s.extend({ + role: z.literal("Admin").default("Admin") +})).build() -// const AdminUserProto = User.extend() -// .schema({ -// schema: s => s.extend({ -// name: z.literal("Admin"), -// prout: z.string(), -// }), -// defaultValues: v => ({ ...v, name: "Admin" as const }), -// }) -// .jsonifiable({ -// jsonifySchema: (s, json) => json.extend({ -// prout: s.shape.prout -// }) -// }) +@adminUserExp.staticImplements +class AdminUser extends adminUserExp.extends implements Implements {} - -// class AdminUser extends AdminUserProto.toClass() {} -// const subInst = await AdminUser.createPromise({ id: 2n, prout: "" }) -// console.log(subInst) +const admin = AdminUser.create({ id: 2n, name: "Admin" }) diff --git a/src/traits/ExtendableZodSchemaObject.ts b/src/traits/ExtendableZodSchemaObject.ts index aebadee..b7eb3d7 100644 --- a/src/traits/ExtendableZodSchemaObject.ts +++ b/src/traits/ExtendableZodSchemaObject.ts @@ -1,6 +1,7 @@ import { ImplStatic, expression } from "@thilawyn/traitify-ts" import { AbstractClass } from "type-fest" import { z } from "zod" +import { Extend, StaticMembers } from "../util" import { ZodSchemaObject } from "./ZodSchemaObject" @@ -17,7 +18,8 @@ export const ExtendableZodSchemaObject = < .subtrait() .implement(Super => class ExtendableZodSchemaObjectImpl extends Super { static extend< - Self extends AbstractClass & ImplStatic, + Self extends AbstractClass + & ImplStatic, ExtendedT extends z.ZodRawShape, ExtendedCatchall extends z.ZodTypeAny, @@ -31,7 +33,18 @@ export const ExtendableZodSchemaObject = < ) => z.ZodObject, ) { return expression - .extends(this) + .extends( + this as unknown as ( + AbstractClass< + Omit< + Extend<[InstanceType, ExtendedValues]>, + keyof ExtendableZodSchemaObjectImpl + >, + [values: ExtendedValues] + > & + Omit, keyof ImplStatic> + ) + ) .expresses(ExtendableZodSchemaObject(schemaWithDefaults(this.schemaWithDefaults))) } }) -- 2.49.1 From 12f12311fa8db3239ac8e1c801bcc41f6a177c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 14:38:26 +0100 Subject: [PATCH 17/74] Cleanup --- src/util/class.ts | 93 +---------------------------------------------- src/util/misc.ts | 3 -- 2 files changed, 1 insertion(+), 95 deletions(-) delete mode 100644 src/util/misc.ts diff --git a/src/util/class.ts b/src/util/class.ts index 616f709..a228590 100644 --- a/src/util/class.ts +++ b/src/util/class.ts @@ -1,69 +1,6 @@ -import { AbstractClass, Class as ConcreteClass } from "type-fest" +import { AbstractClass } from "type-fest" -/** - * Represents the possible types of a class. - */ -export type ClassType = "AbstractClass" | "Class" - -/** - * Represents a class based on the specified type. - * @template Type - The type of the class ("AbstractClass" or "Class"). - * @template T - The type parameter of the class. - * @template Arguments - The type of arguments the class constructor takes. - */ -export type Class< - Type extends ClassType, - T, - Arguments extends unknown[] = any[], -> = ( - Type extends "AbstractClass" - ? AbstractClass - : Type extends "Class" - ? ConcreteClass - : never -) - -/** - * Gets the type of a class (either "Class" or "AbstractClass"). - * @template C - The class type to determine. - */ -export type GetClassType = ( - C extends ConcreteClass - ? "Class" - : C extends AbstractClass - ? "AbstractClass" - : never -) - -/** - * Represents an array of instances corresponding to the provided classes. - * @template Classes - An array of classes extending AbstractClass. - */ -export type ClassesInstances[]> = ( - Classes extends [infer Class, ...infer Rest] - ? Class extends AbstractClass - ? Rest extends AbstractClass[] - ? [InstanceType, ...ClassesInstances] - : never - : never - : [] -) - -/** - * Represents an intersection of instances of the provided classes. - * @template Classes - An array of classes extending AbstractClass. - */ -export type ClassesInstancesIntersection[]> = ( - Classes extends [infer Class, ...infer Rest] - ? Class extends AbstractClass - ? Rest extends AbstractClass[] - ? InstanceType & ClassesInstancesIntersection - : never - : never - : {} -) - /** * Represents the static members of a class. * @template Class - A class extending AbstractClass. @@ -71,31 +8,3 @@ export type ClassesInstancesIntersection> = ( Omit ) - -/** - * Represents an array of static members corresponding to the provided classes. - * @template Classes - An array of classes extending AbstractClass. - */ -export type ClassesStaticMembers[]> = ( - Classes extends [infer Class, ...infer Rest] - ? Class extends AbstractClass - ? Rest extends AbstractClass[] - ? [StaticMembers, ...ClassesStaticMembers] - : never - : never - : [] -) - -/** - * Represents an intersection of static members of the provided classes. - * @template Classes - An array of classes extending AbstractClass. - */ -export type ClassesStaticMembersIntersection[]> = ( - Classes extends [infer Class, ...infer Rest] - ? Class extends AbstractClass - ? Rest extends AbstractClass[] - ? StaticMembers & ClassesStaticMembersIntersection - : never - : never - : {} -) diff --git a/src/util/misc.ts b/src/util/misc.ts deleted file mode 100644 index f381be2..0000000 --- a/src/util/misc.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function identity(value: T) { - return value -} -- 2.49.1 From c672e1f2bb8cf3c7aefee220c2ffe8ea7f6d2df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 15:27:05 +0100 Subject: [PATCH 18/74] JsonifiedZodSchemaObject --- src/tests.ts | 20 ++++++++++++- src/traits/JsonifiedZodSchemaObject.ts | 40 ++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/traits/JsonifiedZodSchemaObject.ts diff --git a/src/tests.ts b/src/tests.ts index ed5f0b6..de3601a 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,6 +1,8 @@ -import { Implements } from "@thilawyn/traitify-ts" +import { Implements, expression } from "@thilawyn/traitify-ts" import { z } from "zod" import { ZodSchemaClass } from "./ZodSchemaClass" +import { dejsonify, jsonify } from "./schema/jsonifiable" +import { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" @@ -27,6 +29,22 @@ const inst = User.create({ id: 1n, name: "User" }) const instEffect = User.createEffect({ id: 1n, name: "User" }) +const jsonifiedUserExp = expression.expresses( + JsonifiedZodSchemaObject(User, { + jsonifySchema: s => s.extend({ + id: jsonify.bigint(s.shape.id) + }), + + dejsonifySchema: s => s.extend({ + id: dejsonify.bigint(s.shape.id) + }), + }) +).build() + +@jsonifiedUserExp.staticImplements +class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} + + const adminUserExp = User.extend(s => s.extend({ role: z.literal("Admin").default("Admin") })).build() diff --git a/src/traits/JsonifiedZodSchemaObject.ts b/src/traits/JsonifiedZodSchemaObject.ts new file mode 100644 index 0000000..2e6c93c --- /dev/null +++ b/src/traits/JsonifiedZodSchemaObject.ts @@ -0,0 +1,40 @@ +import { TraitClass, expression } from "@thilawyn/traitify-ts" +import { Jsonifiable } from "type-fest" +import { z } from "zod" +import { ZodSchemaObject, ZodSchemaObjectTrait } from "./ZodSchemaObject" + + +export const JsonifiedZodSchemaObject = < + Of extends TraitClass>, + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, + + JsonifyT extends z.ZodRawShape, + JsonifyCatchall extends z.ZodTypeAny, + DejsonifyT extends z.ZodRawShape, + DejsonifyCatchall extends z.ZodTypeAny, + JsonifiedValues extends Jsonifiable, +>( + of: Of | TraitClass>, + + props: { + jsonifySchema: ( + schema: typeof of.schema + ) => z.ZodObject, + + dejsonifySchema: ( + schema: typeof of.schema + ) => z.ZodObject, + }, +) => expression + .expresses(ZodSchemaObject(of.schemaWithDefaults)) + .build() + .subtrait() + .implement(Super => class JsonifiedZodSchemaObjectImpl extends Super { + static readonly of = of as Of + static readonly jsonifySchema = props.jsonifySchema(of.schema) + static readonly dejsonifySchema = props.dejsonifySchema(of.schema) + }) + .build() -- 2.49.1 From 17e148d6d2538006d694c7fc0443cd61b0d3e8b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 15:29:42 +0100 Subject: [PATCH 19/74] Cleanup --- src/tests.ts | 1 - src/util/index.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index de3601a..cb84277 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -25,7 +25,6 @@ const userExp = ZodSchemaClass( class User extends userExp.extends implements Implements {} const inst = User.create({ id: 1n, name: "User" }) -// console.log(inst.name) const instEffect = User.createEffect({ id: 1n, name: "User" }) diff --git a/src/util/index.ts b/src/util/index.ts index 03b6dcd..bdefda8 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -1,5 +1,4 @@ export * from "./class" export * from "./effect" export * from "./extend" -export * from "./misc" export * from "./zod" -- 2.49.1 From 63e31a159b6d30c47861391947e710b02240b357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 16:33:22 +0100 Subject: [PATCH 20/74] transform -> pipeSchemaToInstance --- src/traits/ZodSchemaObject.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 3ffdfc6..4b60219 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -24,7 +24,7 @@ export const ZodSchemaObject = < static readonly schema = stripZodObjectDefaults(schemaWithDefaults) static readonly schemaWithDefaults = schemaWithDefaults - static transform< + static pipeSchemaToInstance< Instance extends Values, TransformT extends z.ZodRawShape, @@ -50,7 +50,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { return this - .transform(this.schemaWithDefaults) + .pipeSchemaToInstance(this.schemaWithDefaults) .parse(values, params) } @@ -64,7 +64,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { return this - .transform(this.schemaWithDefaults) + .pipeSchemaToInstance(this.schemaWithDefaults) .parseAsync(values, params) } @@ -78,7 +78,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { return parseZodSchemaEffect( - this.transform(this.schemaWithDefaults), + this.pipeSchemaToInstance(this.schemaWithDefaults), values, params, ) -- 2.49.1 From af00628434984fc5d94a4f99e905fc72e4356733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 16:39:26 +0100 Subject: [PATCH 21/74] Fix --- src/traits/ZodSchemaObject.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 4b60219..c930df6 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -25,16 +25,16 @@ export const ZodSchemaObject = < static readonly schemaWithDefaults = schemaWithDefaults static pipeSchemaToInstance< - Instance extends Values, + Instance extends Values, - TransformT extends z.ZodRawShape, - TransformUnknownKeys extends z.UnknownKeysParam, - TransformCatchall extends z.ZodTypeAny, - TransformOutput extends Values, - TransformInput, + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + SchemaOutput extends Values, + SchemaInput, >( this: Class, - schema: z.ZodObject, + schema: z.ZodObject, ) { return schema.transform(values => new this(values)) } -- 2.49.1 From 2772be0be99184e321ecb1a8a13a1412c59c1141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 16:40:40 +0100 Subject: [PATCH 22/74] Fix --- src/traits/ZodSchemaObject.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index c930df6..b9846eb 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -24,7 +24,7 @@ export const ZodSchemaObject = < static readonly schema = stripZodObjectDefaults(schemaWithDefaults) static readonly schemaWithDefaults = schemaWithDefaults - static pipeSchemaToInstance< + static pipeSchemaIntoInstance< Instance extends Values, SchemaT extends z.ZodRawShape, @@ -50,7 +50,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { return this - .pipeSchemaToInstance(this.schemaWithDefaults) + .pipeSchemaIntoInstance(this.schemaWithDefaults) .parse(values, params) } @@ -64,7 +64,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { return this - .pipeSchemaToInstance(this.schemaWithDefaults) + .pipeSchemaIntoInstance(this.schemaWithDefaults) .parseAsync(values, params) } @@ -78,7 +78,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { return parseZodSchemaEffect( - this.pipeSchemaToInstance(this.schemaWithDefaults), + this.pipeSchemaIntoInstance(this.schemaWithDefaults), values, params, ) -- 2.49.1 From afd703b78152c0684c6c81248079346e23bf1b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 16:52:26 +0100 Subject: [PATCH 23/74] pipeInstanceIntoSchema --- src/traits/ZodSchemaObject.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index b9846eb..05fb8c5 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -24,6 +24,7 @@ export const ZodSchemaObject = < static readonly schema = stripZodObjectDefaults(schemaWithDefaults) static readonly schemaWithDefaults = schemaWithDefaults + static pipeSchemaIntoInstance< Instance extends Values, @@ -39,6 +40,25 @@ export const ZodSchemaObject = < return schema.transform(values => new this(values)) } + static pipeInstanceIntoSchema< + Instance extends Values, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + SchemaOutput, + SchemaInput extends Values, + >( + this: ( + Class & + ImplStatic + ), + + schema: z.ZodObject, + ) { + return schema.transform(values => new this(values)) + } + static create< Instance extends Values -- 2.49.1 From a05ad759adcfec172c2dbccd93ebb0778c0cd5a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 17 Mar 2024 19:31:39 +0100 Subject: [PATCH 24/74] Fixed pipeInstanceIntoSchema --- src/traits/ZodSchemaObject.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 05fb8c5..fb479bb 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -41,7 +41,7 @@ export const ZodSchemaObject = < } static pipeInstanceIntoSchema< - Instance extends Values, + Self extends Class, SchemaT extends z.ZodRawShape, SchemaUnknownKeys extends z.UnknownKeysParam, @@ -49,14 +49,10 @@ export const ZodSchemaObject = < SchemaOutput, SchemaInput extends Values, >( - this: ( - Class & - ImplStatic - ), - - schema: z.ZodObject, + this: Self, + schema: z.ZodObject, ) { - return schema.transform(values => new this(values)) + return z.instanceof(this).pipe(schema) } -- 2.49.1 From 1bb719c0b4dc60bac5e27b7165f44a24f705dcfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 11:00:31 +0100 Subject: [PATCH 25/74] JsonifiedZodSchemaObject --- src/traits/JsonifiedZodSchemaObject.ts | 86 ++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 12 deletions(-) diff --git a/src/traits/JsonifiedZodSchemaObject.ts b/src/traits/JsonifiedZodSchemaObject.ts index 2e6c93c..ed0da83 100644 --- a/src/traits/JsonifiedZodSchemaObject.ts +++ b/src/traits/JsonifiedZodSchemaObject.ts @@ -1,7 +1,8 @@ -import { TraitClass, expression } from "@thilawyn/traitify-ts" -import { Jsonifiable } from "type-fest" +import { ImplStatic, TraitClass, trait } from "@thilawyn/traitify-ts" +import { Class, Jsonifiable } from "type-fest" import { z } from "zod" -import { ZodSchemaObject, ZodSchemaObjectTrait } from "./ZodSchemaObject" +import { parseZodSchemaEffect } from "../util" +import { ZodSchemaObjectTrait } from "./ZodSchemaObject" export const JsonifiedZodSchemaObject = < @@ -28,13 +29,74 @@ export const JsonifiedZodSchemaObject = < schema: typeof of.schema ) => z.ZodObject, }, -) => expression - .expresses(ZodSchemaObject(of.schemaWithDefaults)) +) => trait + .implement(Super => class JsonifiedZodSchemaObjectImpl extends Super { + static readonly of = of as Of + static readonly jsonifySchema = props.jsonifySchema(of.schema) + static readonly dejsonifySchema = props.dejsonifySchema(of.schema) + + + static pipeSchemaIntoInstance< + Instance extends JsonifiedValues, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + SchemaOutput extends JsonifiedValues, + SchemaInput, + >( + this: Class, + schema: z.ZodObject, + ) { + return schema.transform(values => new this(values)) + } + + + static jsonify< + Instance extends JsonifiedValues + >( + this: ( + Class & + ImplStatic + ), + values: Values, + params?: Partial, + ) { + return this + .pipeSchemaIntoInstance(this.jsonifySchema) + .parse(values, params) + } + + static jsonifyPromise< + Instance extends JsonifiedValues + >( + this: ( + Class & + ImplStatic + ), + values: Values, + params?: Partial, + ) { + return this + .pipeSchemaIntoInstance(this.jsonifySchema) + .parseAsync(values, params) + } + + static jsonifyEffect< + Instance extends JsonifiedValues + >( + this: ( + Class & + ImplStatic + ), + values: Values, + params?: Partial, + ) { + return parseZodSchemaEffect( + this.pipeSchemaIntoInstance(this.jsonifySchema), + values, + params, + ) + } + }) .build() - .subtrait() - .implement(Super => class JsonifiedZodSchemaObjectImpl extends Super { - static readonly of = of as Of - static readonly jsonifySchema = props.jsonifySchema(of.schema) - static readonly dejsonifySchema = props.dejsonifySchema(of.schema) - }) - .build() -- 2.49.1 From c16bfe24fdf68d006ad84837e12bfe3a0c188c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 11:34:50 +0100 Subject: [PATCH 26/74] JsonifiedZodSchemaClass --- src/JsonifiedZodSchemaClass.ts | 42 ++++++++++++++++++++++++++ src/tests.ts | 24 +++++++-------- src/traits/JsonifiedZodSchemaObject.ts | 2 +- 3 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 src/JsonifiedZodSchemaClass.ts diff --git a/src/JsonifiedZodSchemaClass.ts b/src/JsonifiedZodSchemaClass.ts new file mode 100644 index 0000000..eaa3ba6 --- /dev/null +++ b/src/JsonifiedZodSchemaClass.ts @@ -0,0 +1,42 @@ +import { TraitClass, expression } from "@thilawyn/traitify-ts" +import { Class, Jsonifiable } from "type-fest" +import { z } from "zod" +import { ZodSchemaObjectTrait } from "./lib" +import { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject" + + +export function JsonifiedZodSchemaClass< + Of extends TraitClass>, + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, + + JsonifyT extends z.ZodRawShape, + JsonifyCatchall extends z.ZodTypeAny, + DejsonifyT extends z.ZodRawShape, + DejsonifyCatchall extends z.ZodTypeAny, + JsonifiedValues extends object & Jsonifiable, +>( + of: Of | TraitClass>, + + props: { + jsonifySchema: ( + schema: typeof of.schema + ) => z.ZodObject, + + dejsonifySchema: ( + schema: typeof of.schema + ) => z.ZodObject, + }, +) { + return expression + .extends( + class JsonifiedZodSchemaObjectConstructor { + constructor(values: JsonifiedValues) { + Object.assign(this, values) + } + } as Class + ) + .expresses(JsonifiedZodSchemaObject(of, props)) +} diff --git a/src/tests.ts b/src/tests.ts index cb84277..172086f 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,8 +1,8 @@ -import { Implements, expression } from "@thilawyn/traitify-ts" +import { Implements } from "@thilawyn/traitify-ts" import { z } from "zod" +import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" import { dejsonify, jsonify } from "./schema/jsonifiable" -import { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" @@ -28,21 +28,21 @@ const inst = User.create({ id: 1n, name: "User" }) const instEffect = User.createEffect({ id: 1n, name: "User" }) -const jsonifiedUserExp = expression.expresses( - JsonifiedZodSchemaObject(User, { - jsonifySchema: s => s.extend({ - id: jsonify.bigint(s.shape.id) - }), +const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { + jsonifySchema: s => s.extend({ + id: jsonify.bigint(s.shape.id) + }), - dejsonifySchema: s => s.extend({ - id: dejsonify.bigint(s.shape.id) - }), - }) -).build() + dejsonifySchema: s => s.extend({ + id: dejsonify.bigint(s.shape.id) + }), +}).build() @jsonifiedUserExp.staticImplements class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} +const jsonifiedUser = JsonifiedUser.jsonify(inst) + const adminUserExp = User.extend(s => s.extend({ role: z.literal("Admin").default("Admin") diff --git a/src/traits/JsonifiedZodSchemaObject.ts b/src/traits/JsonifiedZodSchemaObject.ts index ed0da83..b34a527 100644 --- a/src/traits/JsonifiedZodSchemaObject.ts +++ b/src/traits/JsonifiedZodSchemaObject.ts @@ -16,7 +16,7 @@ export const JsonifiedZodSchemaObject = < JsonifyCatchall extends z.ZodTypeAny, DejsonifyT extends z.ZodRawShape, DejsonifyCatchall extends z.ZodTypeAny, - JsonifiedValues extends Jsonifiable, + JsonifiedValues extends object & Jsonifiable, >( of: Of | TraitClass>, -- 2.49.1 From 74629918d7f7a2e09fcb2fde364c39653812886d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 12:38:57 +0100 Subject: [PATCH 27/74] JsonifiedZodSchemaObject work --- src/JsonifiedZodSchemaClass.ts | 12 +++---- src/tests.ts | 2 +- src/traits/JsonifiedZodSchemaObject.ts | 48 ++++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/JsonifiedZodSchemaClass.ts b/src/JsonifiedZodSchemaClass.ts index eaa3ba6..289a66b 100644 --- a/src/JsonifiedZodSchemaClass.ts +++ b/src/JsonifiedZodSchemaClass.ts @@ -1,12 +1,12 @@ -import { TraitClass, expression } from "@thilawyn/traitify-ts" +import { expression } from "@thilawyn/traitify-ts" import { Class, Jsonifiable } from "type-fest" import { z } from "zod" -import { ZodSchemaObjectTrait } from "./lib" -import { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject" +import { JsonifiedZodSchemaObject, OfClass, OfClassInstance } from "./traits/JsonifiedZodSchemaObject" export function JsonifiedZodSchemaClass< - Of extends TraitClass>, + Of extends OfClass, + OfInstance extends OfClassInstance, T extends z.ZodRawShape, Catchall extends z.ZodTypeAny, Values extends object, @@ -18,7 +18,7 @@ export function JsonifiedZodSchemaClass< DejsonifyCatchall extends z.ZodTypeAny, JsonifiedValues extends object & Jsonifiable, >( - of: Of | TraitClass>, + of: Of | OfClass, props: { jsonifySchema: ( @@ -38,5 +38,5 @@ export function JsonifiedZodSchemaClass< } } as Class ) - .expresses(JsonifiedZodSchemaObject(of, props)) + .expresses(JsonifiedZodSchemaObject(of as Of, props)) } diff --git a/src/tests.ts b/src/tests.ts index 172086f..0d8db8b 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -42,7 +42,7 @@ const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} const jsonifiedUser = JsonifiedUser.jsonify(inst) - +jsonifiedUser.dejsonify() const adminUserExp = User.extend(s => s.extend({ role: z.literal("Admin").default("Admin") diff --git a/src/traits/JsonifiedZodSchemaObject.ts b/src/traits/JsonifiedZodSchemaObject.ts index b34a527..4fe18b0 100644 --- a/src/traits/JsonifiedZodSchemaObject.ts +++ b/src/traits/JsonifiedZodSchemaObject.ts @@ -1,12 +1,35 @@ -import { ImplStatic, TraitClass, trait } from "@thilawyn/traitify-ts" +import { ImplStatic, TraitInstance, TraitStaticMembers, trait } from "@thilawyn/traitify-ts" import { Class, Jsonifiable } from "type-fest" import { z } from "zod" import { parseZodSchemaEffect } from "../util" import { ZodSchemaObjectTrait } from "./ZodSchemaObject" +export type OfClass< + Instance extends OfClassInstance, + + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, +> = ( + Class & + TraitStaticMembers> +) + +export type OfClassInstance< + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, +> = ( + Values & TraitInstance> +) + + export const JsonifiedZodSchemaObject = < - Of extends TraitClass>, + Of extends OfClass, + OfInstance extends OfClassInstance, T extends z.ZodRawShape, Catchall extends z.ZodTypeAny, Values extends object, @@ -18,7 +41,7 @@ export const JsonifiedZodSchemaObject = < DejsonifyCatchall extends z.ZodTypeAny, JsonifiedValues extends object & Jsonifiable, >( - of: Of | TraitClass>, + of: Of | OfClass, props: { jsonifySchema: ( @@ -31,6 +54,8 @@ export const JsonifiedZodSchemaObject = < }, ) => trait .implement(Super => class JsonifiedZodSchemaObjectImpl extends Super { + declare ["constructor"]: typeof JsonifiedZodSchemaObjectImpl + static readonly of = of as Of static readonly jsonifySchema = props.jsonifySchema(of.schema) static readonly dejsonifySchema = props.dejsonifySchema(of.schema) @@ -98,5 +123,22 @@ export const JsonifiedZodSchemaObject = < params, ) } + + + dejsonify(params?: Partial) { + return this.constructor.of.pipeSchemaIntoInstance( + this.constructor.dejsonifySchema + ).parse(this, params) + } + + dejsonifyPromise(params?: Partial) { + return this.constructor.of.pipeSchemaIntoInstance( + this.constructor.dejsonifySchema + ).parseAsync(this, params) + } + + dejsonifyEffect(params?: Partial) { + return parseZodSchemaEffect(this.constructor.dejsonifySchema, this, params) + } }) .build() -- 2.49.1 From 0aa2e3fdf71b06551022c952b960e3395350d310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 12:41:16 +0100 Subject: [PATCH 28/74] dejsonifyEffect --- src/traits/JsonifiedZodSchemaObject.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/traits/JsonifiedZodSchemaObject.ts b/src/traits/JsonifiedZodSchemaObject.ts index 4fe18b0..07f1a6e 100644 --- a/src/traits/JsonifiedZodSchemaObject.ts +++ b/src/traits/JsonifiedZodSchemaObject.ts @@ -138,7 +138,11 @@ export const JsonifiedZodSchemaObject = < } dejsonifyEffect(params?: Partial) { - return parseZodSchemaEffect(this.constructor.dejsonifySchema, this, params) + return parseZodSchemaEffect( + this.constructor.of.pipeSchemaIntoInstance(this.constructor.dejsonifySchema), + this, + params, + ) } }) .build() -- 2.49.1 From cb18d086eca4cb6954163f276f4b660824bb4085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 12:49:35 +0100 Subject: [PATCH 29/74] Tests --- src/tests.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index 0d8db8b..f8434d6 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -24,8 +24,8 @@ const userExp = ZodSchemaClass( @userExp.staticImplements class User extends userExp.extends implements Implements {} -const inst = User.create({ id: 1n, name: "User" }) -const instEffect = User.createEffect({ id: 1n, name: "User" }) +const userInst = User.create({ id: 1n, name: "User" }) +const userInstEffect = User.createEffect({ id: 1n, name: "User" }) const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { @@ -41,8 +41,9 @@ const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { @jsonifiedUserExp.staticImplements class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} -const jsonifiedUser = JsonifiedUser.jsonify(inst) -jsonifiedUser.dejsonify() +const jsonifiedUserInst = JsonifiedUser.jsonify(userInst) +console.log(JSON.stringify(jsonifiedUserInst)) +jsonifiedUserInst.dejsonify() const adminUserExp = User.extend(s => s.extend({ role: z.literal("Admin").default("Admin") -- 2.49.1 From cb89de90c28f5cff62fd4c2760c1b0a2641d7f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 12:51:29 +0100 Subject: [PATCH 30/74] Cleanup --- src/builders/ZodSchemaClassBuilder.ts | 133 --------------- src/builders/ZodSchemaClassExtender.ts | 196 ----------------------- src/lib.ts | 5 +- src/shapes/JsonifiableZodSchemaClass.ts | 78 --------- src/shapes/ZodSchemaClass.ts | 55 ------- src/traits/JsonifiableZodSchemaObject.ts | 110 ------------- 6 files changed, 3 insertions(+), 574 deletions(-) delete mode 100644 src/builders/ZodSchemaClassBuilder.ts delete mode 100644 src/builders/ZodSchemaClassExtender.ts delete mode 100644 src/shapes/JsonifiableZodSchemaClass.ts delete mode 100644 src/shapes/ZodSchemaClass.ts delete mode 100644 src/traits/JsonifiableZodSchemaObject.ts diff --git a/src/builders/ZodSchemaClassBuilder.ts b/src/builders/ZodSchemaClassBuilder.ts deleted file mode 100644 index a16ed6f..0000000 --- a/src/builders/ZodSchemaClassBuilder.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { Trait, TraitExpressionBuilder, expression } from "@thilawyn/traitify-ts" -import { AbstractClass } from "type-fest" -import { EmptyObject } from "type-fest/source/empty-object" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { JsonifiableZodSchemaObject } from "../traits/JsonifiableZodSchemaObject" -import { ZodSchemaObject } from "../traits/ZodSchemaObject" - - -export class ZodSchemaClassBuilder< - Superclass extends AbstractClass, - const Traits extends readonly Trait[], - Schemas extends object, -> { - declare ["constructor"]: typeof ZodSchemaClassBuilder - - constructor( - protected readonly expression: TraitExpressionBuilder, - protected readonly schemas: Schemas, - ) {} - - - schema< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, - >( - this: ZodSchemaClassBuilder, - - props: { - schema: z.ZodObject - - schemaWithDefaultValues: ( - schema: z.ZodObject - ) => z.ZodObject - }, - ) { - const schema = props.schema - const schemaWithDefaultValues = props.schemaWithDefaultValues(props.schema) - - abstract class ZodSchemaObjectConstructor { - constructor(values: Values) { - Object.assign(this, values) - } - } - - return new this.constructor( - this.expression - .extends(ZodSchemaObjectConstructor as AbstractClass) - .expresses(ZodSchemaObject(schema, schemaWithDefaultValues)), - - { schema, schemaWithDefaultValues } as const, - ) - } - - jsonifiable< - S extends { - readonly schema: z.ZodObject, - readonly schemaWithDefaultValues: z.ZodObject, - jsonifySchema?: never - dejsonifySchema?: never - }, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues 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, - >( - this: ZodSchemaClassBuilder, - readonly schemaWithDefaultValues: z.ZodObject, - jsonifySchema?: never - dejsonifySchema?: never - }>, - - props: { - jsonifySchema: ( - schema: z.ZodObject - ) => z.ZodObject - - dejsonifySchema: ( - schema: z.ZodObject - ) => z.ZodObject - }, - ) { - const jsonifySchema = props.jsonifySchema(this.schemas.schema) - const dejsonifySchema = props.dejsonifySchema(this.schemas.schema) - - return new this.constructor( - this.expression.expresses( - JsonifiableZodSchemaObject( - this.schemas.schema, - this.schemas.schemaWithDefaultValues, - jsonifySchema, - dejsonifySchema, - ) - ), - - { ...this.schemas as S, jsonifySchema, dejsonifySchema } as const, - ) - } - - - toExpression() { - return this.expression - } -} - - -export const zodSchemaClass = new ZodSchemaClassBuilder(expression, {}) diff --git a/src/builders/ZodSchemaClassExtender.ts b/src/builders/ZodSchemaClassExtender.ts deleted file mode 100644 index d78a3c4..0000000 --- a/src/builders/ZodSchemaClassExtender.ts +++ /dev/null @@ -1,196 +0,0 @@ -// import { expression } from "@thilawyn/traitify-ts" -// import { AbstractClass, Simplify } from "type-fest" -// import { JsonifiableObject } from "type-fest/source/jsonifiable" -// import { z } from "zod" -// import { JsonifiableZodSchemaAbstractClass } from "../shapes/JsonifiableZodSchemaClass" -// import { ZodSchemaAbstractClass } from "../shapes/ZodSchemaClass" -// import { Extend, Override, StaticMembers } from "../util" - - -// export class ZodSchemaClassExtender< -// Superclass extends AbstractClass, -// Subclass extends AbstractClass, -// > { -// declare ["constructor"]: typeof ZodSchemaClassExtender - -// constructor( -// readonly superclass: Superclass, -// readonly subclass: Subclass, -// ) {} - - -// schema< -// Super extends ZodSchemaAbstractClass, - -// SuperSchemaT extends z.ZodRawShape, -// SuperSchemaUnknownKeys extends z.UnknownKeysParam, -// SuperSchemaCatchall extends z.ZodTypeAny, - -// SuperValues extends object, -// SuperDefaultValues extends Partial, - -// SchemaT extends z.ZodRawShape, -// SchemaUnknownKeys extends z.UnknownKeysParam, -// SchemaCatchall extends z.ZodTypeAny, - -// Values extends SuperValues, -// DefaultValues extends Partial, -// >( -// this: ZodSchemaClassExtender< -// Super | ZodSchemaAbstractClass, -// any -// >, - -// props: { -// schema: (schema: Super["schema"]) => z.ZodObject -// defaultValues: (defaultValues: SuperDefaultValues) => DefaultValues -// }, -// ) { -// const schema = props.schema(this.superclass.schema) -// const defaultValues = props.defaultValues(this.superclass.defaultValues) - -// class Schemas extends (this.superclass as AbstractClass) { -// static readonly schema = schema -// static readonly defaultValues = defaultValues -// } - -// return new this.constructor( -// this.superclass as Super, - -// Schemas as unknown as AbstractClass< -// Simplify< -// Extend<[InstanceType, Values]> -// >, - -// [values: Values] -// > & -// Simplify< -// Override<[ -// StaticMembers, -// StaticMembers, -// ]> -// > -// ) -// } - -// jsonifiable< -// /** Superclass jsonifiable schemas */ -// Super extends JsonifiableZodSchemaAbstractClass< -// any, - -// SuperJsonifySchemaT, -// SuperJsonifySchemaUnknownKeys, -// SuperJsonifySchemaCatchall, - -// SuperDejsonifySchemaT, -// SuperDejsonifySchemaUnknownKeys, -// SuperDejsonifySchemaCatchall, - -// SuperJsonifiedValues, -// SuperValues -// >, - -// SuperJsonifySchemaT extends z.ZodRawShape, -// SuperJsonifySchemaUnknownKeys extends z.UnknownKeysParam, -// SuperJsonifySchemaCatchall extends z.ZodTypeAny, - -// SuperDejsonifySchemaT extends z.ZodRawShape, -// SuperDejsonifySchemaUnknownKeys extends z.UnknownKeysParam, -// SuperDejsonifySchemaCatchall extends z.ZodTypeAny, - -// SuperJsonifiedValues extends JsonifiableObject, -// SuperValues extends object, - -// /** New schemas */ -// Self extends ZodSchemaAbstractClass, - -// SelfSchemaT extends z.ZodRawShape, -// SelfSchemaUnknownKeys extends z.UnknownKeysParam, -// SelfSchemaCatchall extends z.ZodTypeAny, - -// SelfValues extends object, -// SelfDefaultValues extends Partial, - -// /* New jsonifiable schemas */ -// 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 SuperJsonifiedValues, -// Values extends SelfValues, -// >( -// this: ZodSchemaClassExtender< -// Super | JsonifiableZodSchemaAbstractClass< -// any, - -// SuperJsonifySchemaT, -// SuperJsonifySchemaUnknownKeys, -// SuperJsonifySchemaCatchall, - -// SuperDejsonifySchemaT, -// SuperDejsonifySchemaUnknownKeys, -// SuperDejsonifySchemaCatchall, - -// SuperJsonifiedValues, -// SuperValues -// >, - -// Self | ZodSchemaAbstractClass -// >, - -// props: { -// jsonifySchema: ( -// schema: Self["schema"], -// jsonifySchema: Super["jsonifySchema"], -// ) => z.ZodObject - -// dejsonifySchema: ( -// schema: Self["schema"], -// dejsonifySchema: Super["dejsonifySchema"], -// ) => z.ZodObject -// }, -// ) { -// const jsonifySchema = props.jsonifySchema(this.subclass.schema, this.superclass.jsonifySchema) -// const dejsonifySchema = props.dejsonifySchema(this.subclass.schema, this.superclass.dejsonifySchema) - -// class JsonifiableSchemas extends (this.subclass as AbstractClass) { -// static readonly jsonifySchema = jsonifySchema -// readonly jsonifySchema = jsonifySchema -// static readonly dejsonifySchema = dejsonifySchema -// readonly dejsonifySchema = dejsonifySchema -// } - -// return new this.constructor( -// this.superclass as Super, - -// JsonifiableSchemas as unknown as AbstractClass< -// Simplify< -// Override<[InstanceType, JsonifiableSchemas]> -// >, - -// ConstructorParameters< -// ZodSchemaAbstractClass -// > -// > & -// Simplify< -// Override<[ -// StaticMembers, -// StaticMembers, -// ]> -// >, -// ) -// } - - -// toClass() { -// return this.subclass -// } - -// toExpressionBuilder() { -// return expression.extends(this.subclass) -// } -// } diff --git a/src/lib.ts b/src/lib.ts index ef4a60b..593f780 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,4 +1,5 @@ -export { ZodSchemaClassBuilder, zodSchemaClass } from "./builders/ZodSchemaClassBuilder" -export { JsonifiableZodSchemaObject } from "./traits/JsonifiableZodSchemaObject" +export { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" +export { ZodSchemaClass } from "./ZodSchemaClass" +export { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject" export { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" export { ZodSchemaObject, ZodSchemaObjectTrait } from "./traits/ZodSchemaObject" diff --git a/src/shapes/JsonifiableZodSchemaClass.ts b/src/shapes/JsonifiableZodSchemaClass.ts deleted file mode 100644 index 2f35971..0000000 --- a/src/shapes/JsonifiableZodSchemaClass.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { AbstractClass, Class } from "type-fest" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" - - -export type JsonifiableZodSchemaClass< - Instance extends Values, - - 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, - Values extends object, -> = ( - Class & - JsonifiableZodSchemas< - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - Values - > -) - -export type JsonifiableZodSchemaAbstractClass< - Instance extends Values, - - 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, - Values extends object, -> = ( - AbstractClass & - JsonifiableZodSchemas< - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - Values - > -) - -export type JsonifiableZodSchemas< - 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, - Values extends object, -> = { - readonly jsonifySchema: z.ZodObject - readonly dejsonifySchema: z.ZodObject -} diff --git a/src/shapes/ZodSchemaClass.ts b/src/shapes/ZodSchemaClass.ts deleted file mode 100644 index 680c59a..0000000 --- a/src/shapes/ZodSchemaClass.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { AbstractClass, Class } from "type-fest" -import { z } from "zod" - - -export type ZodSchemaClass< - Instance extends Values, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, -> = ( - Class & - ZodSchemas -) - -export type ZodSchemaAbstractClass< - Instance extends Values, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, -> = ( - AbstractClass & - ZodSchemas -) - -export type ZodSchemas< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, -> = { - readonly schema: z.ZodObject - readonly schemaWithDefaultValues: z.ZodObject -} diff --git a/src/traits/JsonifiableZodSchemaObject.ts b/src/traits/JsonifiableZodSchemaObject.ts deleted file mode 100644 index c747a8b..0000000 --- a/src/traits/JsonifiableZodSchemaObject.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { ImplStatic, expression } from "@thilawyn/traitify-ts" -import { Class } from "type-fest" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { parseZodSchemaEffect } from "../util" -import { ZodSchemaObject } from "./ZodSchemaObject" - - -export const JsonifiableZodSchemaObject = < - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues 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, ->( - schema: z.ZodObject, - schemaWithDefaultValues: z.ZodObject, - jsonifySchema: z.ZodObject, - dejsonifySchema: z.ZodObject, -) => expression - .expresses(ZodSchemaObject(schema, schemaWithDefaultValues)) - .build() - .subtrait() - .implement(Super => class JsonifiableZodSchemaObject extends Super { - declare ["constructor"]: typeof JsonifiableZodSchemaObject - - static readonly jsonifySchema = jsonifySchema - static readonly dejsonifySchema = dejsonifySchema - - - jsonify(params?: Partial) { - return this.constructor.jsonifySchema.parse(this, params) - } - - jsonifyPromise(params?: Partial) { - return this.constructor.jsonifySchema.parseAsync(this, params) - } - - jsonifyEffect(params?: Partial) { - return parseZodSchemaEffect( - this.constructor.jsonifySchema, - this, - params, - ) - } - - - static dejsonify< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - values: JsonifiedValues, - params?: Partial, - ) { - return this - .transform(this.dejsonifySchema) - .parse(values, params) - } - - static dejsonifyPromise< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - values: JsonifiedValues, - params?: Partial, - ) { - return this - .transform(this.dejsonifySchema) - .parseAsync(values, params) - } - - static dejsonifyEffect< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - values: JsonifiedValues, - params?: Partial, - ) { - return parseZodSchemaEffect( - this.transform(this.dejsonifySchema), - values, - params, - ) - } - }) - .build() -- 2.49.1 From 4d96ddfa2b6bb3dda0bfa7a877afa9be96618594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 12:55:15 +0100 Subject: [PATCH 31/74] Dependencies upgrade --- bun.lockb | Bin 160864 -> 160864 bytes package.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lockb b/bun.lockb index 6409dc584fc1f2037ea68159368bd3086dfe4393..e4a74877745ebcb758c51e99996c0de9b8de72e4 100755 GIT binary patch delta 2055 zcmZXT3piA17{|{!GscX`b;XR!$TY~5>kv^IN@2n%sitfRm4rlte{p%27&k zNrjlwOqWfoQj#Q>R+eUHRZ^mfF2>lCZMM_y_dMV8KL7XszW?X&h4wNwwfi7d8L%@6a_RGgX+RsBP$^@nQ+n9glGV2 zB68*-W4tikamqJQj}~|a%JD&qbhN1dS2*c^OY(6-EvKVJJzC(MQDZ(TArv^HqUxR5 zpzarX1oxuP?A=k!o?Qp_?HxNV@&zhFlt0!nw)9`hjwwG%=N=C09F%3VQ#JSp_Yt#) zPHX4gH|x>$DSgr68848F(zUuomGdm4FKQO7r0~1<6j=8cog#G5x!~a*sr{wExmxkI z3+LJ=+-GS^aUxELr%`=PqLy`FaVx8Ag{V@h)?vD==@M_Mum4lEgB}0?fB=BkLF!uM zst$I=?T#_rh?22&SEX<#Yk{h z3%%z&SZ&oWK2M6aZgk!w9Iqkq?=dIj7_($v!&T}mxIB1lCosGqY{7?-Dnj$NE2+vg z*~6!wiPr2A(jqu}c?Vm~XEbn&Tg*K+SP)6-<(~};5S%Y`0;Gl^S9P%Lk~Ze!rY^>* z#_BjzI;VMCPwEU!S9fW_NM#2bKKfQuf$>h((sHB2YE`f4@OG734CehpkN$bB z$h}Sd9hH98>LcM^a8 z$;LAhmLEqHGmz0Oc)B+Eb-A4-;nUK4ZfzHEZS4=+Mm+*nKl#x%-C`dxhXL0#vR&T_!q`?SeKKz+shDl zXGhvwt<3=weZdbae@Kl?f*x-xQ(GGK2qty}^!W{BEkETl_LWY6)F?FFv$A}-bw!>s zFeu=x#>c*l2Mqb<9HH?iS;V~!;D9IV=!qbuc&vpy-|KaeBc^JaxBKpJtI!7njr8*3 zeBU|^o-pPniLYkasS%}!EcNSV>Li7n_Z#C_x<*d%X?di+2~9TurvG@aXr(d{Fg`DF%uEFNjcVV_rmSM7eu z)pryB+;BU>q>a|hWmiex?I+_Mu+uC(W9d;p6M7ixnE1D=78`~vIuiOyXnHG-skiD@ zVnY7FVg;)>tZ~ILqn^UV6tpS0g1@pO0IPcK%oMJqPuZ5XYS^U4{kBuVHmddFh&eEK`sF7E&+`tgJST8#$>yy7BqB0d;p+p1ArL- z2!f6c4l)ZKDY2lFt;3|_i#Qa-!SPxmqMPK9%7K;0@?=W$Z=iweKf@)+FclfzcVPUu zWV-Gv)i40u{TlP!(*i%TVBu|*15>Vp2G}p#u;8YOhJyUarbvwG_CT<2N4r2Z3;^zk zV}dx^y^kDbDefy&4%~z+gAAB?2P8`-Zh}J&po?VaJ(vN)dN$BB$Vv6?I delta 2020 zcmY+D4LDT!9>>o)4KrvEVTPGu&}y+U7}vYHX`5mgT5pkxUbt8#TdkL7++uZU$!YIN zN!V;`ZzeLKc_Ab;c63SBx>H-B7cZ5U%GmpFZewT9^ZcLR^ZR|jzwiI^obw#{n3jA@ zt7wfy4}oJ=>G#HbdXjPz!XavQvjzw8+3@=Ad z+S(PH5zsuR<$pGv>J7nJO<}1wdFoB)Qsc7n&m@+M+H#(H)2ZGNm})kbszG^7wWv-e z2i8MdOl<&e9m_Q*VXa53MdqMBFal8K%Dx#o$lJxb82Ac zgNj8?hQ*bMl%yC%f76Goy}J9zo;&Q@hA^f$JklGpfRl<@cXlRq^Ut zFQFc)?QA(PE*b1yAx^ntw&A^Wo)6Kw?iK|%*tCRD8qw~tb=+rP?t^_G2!bJqpbzSH za8wU&a;ASzHJtLr&ll%(WiDPfi$!zfzO?hvf@%Yz%uaqsqIvUv*NrB!#-(Pe?p)%Y z#`>v@+;q3MM5h6_Fp_hYJE{khIv%JyRcN5%&cAqa#l9x@ z-KoAB{c(sLO}{i0`{OZ%*Xg$biu7-_**W1y6RAPh$>Wy~5Xbl-wb|5AgVC=Z=6YOO zt)E1>e)b`HMNHyWo*u9{N)wy#rXqHi;f%cuuZ8X*dPUm4P&8hS*PQ?HdY_o`LxIkJ z=-cL}Yrp)t!00PC1^y6Ur%}*c>RT(`0!RQI^zq%rfunkGwTH`x8*=}R?$Gs#fBkz~ zd7}5U0bwegZCQ~F75Y~3V9(C_b3zXJp0}26PWxi%f$GT|)NHEgVEinbxQaJ&5Zxvr zaqa(mtt>3-=;kU)LdaaQ=Ej0{?Q+Mj6;+%j*{{R732}<%TN+P99W{wUgeEQu3yPkx zt{T{P=#TqMb78c@&RYNnh7cv)ZWS7+xSM3h_`-6HO{|PZ=1C6+M-5YB#v+qk_(Pd* zqPl~fn4eYIP@i*($UA;=4gY0rKt{@wjk9j1O{~>^zMV%DJ+WCRv4zAv&Mv-tjqaM| zpWETYU4O(O`}_>vXGXrox;QER(W#3Q(~q+XW`?&2+8vIS9I6<7wb}LQ=B&a>Sva8mqIJZ5I>kUNZnuHzo{bG&g*jG8I5YWl43*(b_SrQGJ>q?E>V>&j(Fw0my z{x-egH3I37jA^mAV*H2I*4A3>7d8Y(@lU3HZYWO(3f~-cBmA6u)tz;p=y;$esMBeE z=kchqlkl}G=kut#|9qWmmgLfo$rw!ej@*^4lyFqI6;`Y&!}Ia8dM?|`k%m%l z?^_#@XOjKjwU*S~yY2jXnbR5uwyXh`BF+%zDS*uc6AiFfTRE<6fldAfbO^H5 zgCKJV;su|Xm{?mbTg1UGYZyvp6HsVC(M;>xl_Y(Gs1$4wEGtufxdj`${oh;#%$C5M zU#KV*Sgm-jGDFavPchHdts=~<_iIxr7)=Np<34UXW4yCDBU)xWAN)&{W~7C>?B;j8OkF bJ+lm1j&V#8Q{_iWHbpAIE73PYIFbJY0d(>g diff --git a/package.json b/package.json index fbd80fd..738f57b 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "dependencies": { "@thilawyn/traitify-ts": "^0.1.15", "decimal.js": "^10.4.3", - "effect": "^2.4.3", + "effect": "^2.4.7", "lodash-es": "^4.17.21", "mobx": "^6.12.0", "type-fest": "^4.12.0", @@ -50,9 +50,9 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@types/lodash-es": "^4.17.12", "bun-types": "latest", - "npm-check-updates": "^16.14.15", + "npm-check-updates": "^16.14.17", "npm-sort": "^0.0.4", - "rollup": "^4.12.1", + "rollup": "^4.13.0", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-ts": "^3.4.5", "ts-functional-pipe": "^3.1.2", -- 2.49.1 From aa3987e3726f61ddc1a221b42ad4976f3dfc5a88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 17:15:15 +0100 Subject: [PATCH 32/74] Tests --- src/tests.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index f8434d6..d63a63c 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,15 +1,17 @@ import { Implements } from "@thilawyn/traitify-ts" +import { Option } from "effect" import { z } from "zod" import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" import { dejsonify, jsonify } from "./schema/jsonifiable" +import { effect } from "./schema/lib" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" const userExp = ZodSchemaClass( z.object({ /** User ID */ - id: z.bigint().default(-1n), + id: effect.option.option(z.bigint()).default(Option.none()), /** Username */ name: z.string(), @@ -24,8 +26,8 @@ const userExp = ZodSchemaClass( @userExp.staticImplements class User extends userExp.extends implements Implements {} -const userInst = User.create({ id: 1n, name: "User" }) -const userInstEffect = User.createEffect({ id: 1n, name: "User" }) +const userInst = User.create({ id: Option.some(1n), name: "User" }) +const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { @@ -52,4 +54,4 @@ const adminUserExp = User.extend(s => s.extend({ @adminUserExp.staticImplements class AdminUser extends adminUserExp.extends implements Implements {} -const admin = AdminUser.create({ id: 2n, name: "Admin" }) +const admin = AdminUser.create({ id: Option.some(2n), name: "Admin" }) -- 2.49.1 From 1fd74bb8510af85bca316aeaa4b0546722a2c47b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 18:00:52 +0100 Subject: [PATCH 33/74] jsonifiable -> jsonified --- .../{jsonifiable => jsonified}/bigint.ts | 0 src/schema/{jsonifiable => jsonified}/date.ts | 0 .../{jsonifiable => jsonified}/decimal.ts | 0 .../{jsonifiable => jsonified}/index.ts | 0 src/schema/jsonified/option.ts | 21 +++++++++++++++++++ src/schema/lib.ts | 2 +- src/tests.ts | 2 +- 7 files changed, 23 insertions(+), 2 deletions(-) rename src/schema/{jsonifiable => jsonified}/bigint.ts (100%) rename src/schema/{jsonifiable => jsonified}/date.ts (100%) rename src/schema/{jsonifiable => jsonified}/decimal.ts (100%) rename src/schema/{jsonifiable => jsonified}/index.ts (100%) create mode 100644 src/schema/jsonified/option.ts diff --git a/src/schema/jsonifiable/bigint.ts b/src/schema/jsonified/bigint.ts similarity index 100% rename from src/schema/jsonifiable/bigint.ts rename to src/schema/jsonified/bigint.ts diff --git a/src/schema/jsonifiable/date.ts b/src/schema/jsonified/date.ts similarity index 100% rename from src/schema/jsonifiable/date.ts rename to src/schema/jsonified/date.ts diff --git a/src/schema/jsonifiable/decimal.ts b/src/schema/jsonified/decimal.ts similarity index 100% rename from src/schema/jsonifiable/decimal.ts rename to src/schema/jsonified/decimal.ts diff --git a/src/schema/jsonifiable/index.ts b/src/schema/jsonified/index.ts similarity index 100% rename from src/schema/jsonifiable/index.ts rename to src/schema/jsonified/index.ts diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts new file mode 100644 index 0000000..6bc1598 --- /dev/null +++ b/src/schema/jsonified/option.ts @@ -0,0 +1,21 @@ +import { Option } from "effect" +import { identity } from "lodash-es" +import { z } from "zod" + + +export const jsonifyOption = { + option: (schema: S) => + z.union([option.some(schema), option.none(schema)]), + + some: (schema: S) => z + .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option") + .pipe(z.object({ value: schema }).passthrough()) + .transform>>(identity), + + none: (_schema?: S) => + z.custom + : unknown + >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), +} as const diff --git a/src/schema/lib.ts b/src/schema/lib.ts index 9339106..b7c00ae 100644 --- a/src/schema/lib.ts +++ b/src/schema/lib.ts @@ -1,2 +1,2 @@ export * from "./effect" -export * from "./jsonifiable" +export * from "./jsonified" diff --git a/src/tests.ts b/src/tests.ts index d63a63c..edbf0c7 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -3,7 +3,7 @@ import { Option } from "effect" import { z } from "zod" import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" -import { dejsonify, jsonify } from "./schema/jsonifiable" +import { dejsonify, jsonify } from "./schema/jsonified" import { effect } from "./schema/lib" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" -- 2.49.1 From 27a8fc1c9bddf212d7425b9d07ea3117d244fae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 18 Mar 2024 18:32:27 +0100 Subject: [PATCH 34/74] jsonifyOption work --- src/schema/jsonified/index.ts | 2 ++ src/schema/jsonified/option.ts | 17 ++++++++++------- src/tests.ts | 4 ++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/schema/jsonified/index.ts b/src/schema/jsonified/index.ts index 6bff7ae..983b523 100644 --- a/src/schema/jsonified/index.ts +++ b/src/schema/jsonified/index.ts @@ -1,12 +1,14 @@ import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./bigint" import { dejsonifyDateSchema, jsonifyDateSchema } from "./date" import { dejsonifyDecimalSchema, jsonifyDecimalSchema } from "./decimal" +import { jsonifyOption } from "./option" export const jsonify = { bigint: jsonifyBigIntSchema, date: jsonifyDateSchema, decimal: jsonifyDecimalSchema, + option: jsonifyOption, } as const export const dejsonify = { diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index 6bc1598..11c5500 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -1,16 +1,19 @@ import { Option } from "effect" -import { identity } from "lodash-es" import { z } from "zod" +import { effect } from "../effect" export const jsonifyOption = { - option: (schema: S) => - z.union([option.some(schema), option.none(schema)]), + // option: (schema: S) => + // z.union([option.some(schema), option.none(schema)]), - some: (schema: S) => z - .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option") - .pipe(z.object({ value: schema }).passthrough()) - .transform>>(identity), + some: < + S extends ReturnType>, + T extends z.ZodSchema, + >( + schema: S | ReturnType> + ) => + (schema as S).transform(v => Option.getOrThrow(v)), none: (_schema?: S) => z.custom s.extend({ id: jsonify.bigint(s.shape.id) -- 2.49.1 From c61f5332fc121487c0e605ffe8b9e2cf8319804e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 19 Mar 2024 17:41:41 +0100 Subject: [PATCH 35/74] Schema work --- src/schema/jsonified/bigint.ts | 23 +++++++------- src/schema/jsonified/date.ts | 23 +++++++------- src/schema/jsonified/decimal.ts | 23 +++++++------- src/schema/jsonified/option.ts | 56 ++++++++++++++++++++++++++++----- src/tests.ts | 2 +- 5 files changed, 85 insertions(+), 42 deletions(-) diff --git a/src/schema/jsonified/bigint.ts b/src/schema/jsonified/bigint.ts index b6d02d0..4627b45 100644 --- a/src/schema/jsonified/bigint.ts +++ b/src/schema/jsonified/bigint.ts @@ -13,16 +13,17 @@ export function jsonifyBigIntSchema(schema: S) { export function dejsonifyBigIntSchema(schema: S) { return z .custom(identity) - .pipe(z - .string() - .transform(v => { - try { - return BigInt(v) - } - catch (e) { - return v - } - }) - .pipe(schema) + .pipe( + z + .string() + .transform(v => { + try { + return BigInt(v) + } + catch (e) { + return v + } + }) ) + .pipe(schema) } diff --git a/src/schema/jsonified/date.ts b/src/schema/jsonified/date.ts index e147a5d..1524456 100644 --- a/src/schema/jsonified/date.ts +++ b/src/schema/jsonified/date.ts @@ -13,16 +13,17 @@ export function jsonifyDateSchema(schema: S) { export function dejsonifyDateSchema(schema: S) { return z .custom(identity) - .pipe(z - .string() - .transform(v => { - try { - return new Date(v) - } - catch (e) { - return v - } - }) - .pipe(schema) + .pipe( + z + .string() + .transform(v => { + try { + return new Date(v) + } + catch (e) { + return v + } + }) ) + .pipe(schema) } diff --git a/src/schema/jsonified/decimal.ts b/src/schema/jsonified/decimal.ts index ca87662..2aacd7a 100644 --- a/src/schema/jsonified/decimal.ts +++ b/src/schema/jsonified/decimal.ts @@ -18,16 +18,17 @@ export function dejsonifyDecimalSchema< >(schema: S) { return z .custom(identity) - .pipe(z - .string() - .transform(v => { - try { - return new Decimal(v) - } - catch (e) { - return v - } - }) - .pipe(schema) + .pipe( + z + .string() + .transform(v => { + try { + return new Decimal(v) + } + catch (e) { + return v + } + }) ) + .pipe(schema) } diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index 11c5500..3e68732 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -1,11 +1,21 @@ import { Option } from "effect" import { z } from "zod" import { effect } from "../effect" +import { Opaque } from "type-fest" +import { identity } from "lodash-es" + + +export type JsonifiedEffectOption = Opaque export const jsonifyOption = { - // option: (schema: S) => - // z.union([option.some(schema), option.none(schema)]), + option: < + S extends ReturnType>, + T extends z.ZodTypeAny, + >( + schema: S | ReturnType> + ) => + (schema as S).transform(v => Option.getOrNull(v)), some: < S extends ReturnType>, @@ -15,10 +25,40 @@ export const jsonifyOption = { ) => (schema as S).transform(v => Option.getOrThrow(v)), - none: (_schema?: S) => - z.custom - : unknown - >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), + none: < + S extends ReturnType>, + T extends z.ZodSchema | unknown = unknown, + >( + schema: S | ReturnType> + ) => + (schema as S).transform(() => null), +} as const + +export const dejsonifyOption = { + option: < + S extends ReturnType>, + T extends z.ZodSchema, + >( + schema: S | ReturnType> + ) => z + .custom>(identity) + .pipe( + z. + ), + + some: < + S extends ReturnType>, + T extends z.ZodSchema, + >( + schema: S | ReturnType> + ) => + (schema as S).transform(v => Option.getOrThrow(v)), + + none: < + S extends ReturnType>, + T extends z.ZodSchema | unknown = unknown, + >( + schema: S | ReturnType> + ) => + (schema as S).transform(() => null), } as const diff --git a/src/tests.ts b/src/tests.ts index 81b3fb1..3f93b47 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -32,7 +32,7 @@ const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) const jsonifiedOption = jsonify.option.some( effect.option.some(z.literal("prout")) -).parse({}) +) const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { jsonifySchema: s => s.extend({ -- 2.49.1 From 5e7588510da440a5c61085521ccf85d0c94a79bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 19 Mar 2024 17:44:46 +0100 Subject: [PATCH 36/74] Option fix --- src/schema/effect/option.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index 53b6abf..98ff4bc 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -4,17 +4,17 @@ import { z } from "zod" export const option = { - option: (schema: S) => + option: (schema: S) => z.union([option.some(schema), option.none(schema)]), - some: (schema: S) => z + some: (schema: S) => z .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option") .pipe(z.object({ value: schema }).passthrough()) .transform>>(identity), - none: (_schema?: S) => + none: (_schema?: S) => z.custom : unknown >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), -- 2.49.1 From 9ddda594ef4012decfbd6bafe6964854a70db079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 19 Mar 2024 18:25:56 +0100 Subject: [PATCH 37/74] Schema work --- src/schema/decimal.ts | 5 +++++ src/schema/jsonified/bigint.ts | 4 ++-- src/schema/jsonified/date.ts | 4 ++-- src/schema/jsonified/decimal.ts | 8 ++------ src/schema/lib.ts | 1 + 5 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 src/schema/decimal.ts diff --git a/src/schema/decimal.ts b/src/schema/decimal.ts new file mode 100644 index 0000000..cb16e42 --- /dev/null +++ b/src/schema/decimal.ts @@ -0,0 +1,5 @@ +import Decimal from "decimal.js" +import { z } from "zod" + + +export const decimal = z.custom(v => Decimal.isDecimal(v)) diff --git a/src/schema/jsonified/bigint.ts b/src/schema/jsonified/bigint.ts index 4627b45..6266dd5 100644 --- a/src/schema/jsonified/bigint.ts +++ b/src/schema/jsonified/bigint.ts @@ -6,11 +6,11 @@ import { z } from "zod" export type JsonifiedBigInt = Opaque -export function jsonifyBigIntSchema(schema: S) { +export function jsonifyBigIntSchema>(schema: S) { return schema.transform(v => v.toString() as JsonifiedBigInt) } -export function dejsonifyBigIntSchema(schema: S) { +export function dejsonifyBigIntSchema>(schema: S) { return z .custom(identity) .pipe( diff --git a/src/schema/jsonified/date.ts b/src/schema/jsonified/date.ts index 1524456..ff4d0a1 100644 --- a/src/schema/jsonified/date.ts +++ b/src/schema/jsonified/date.ts @@ -6,11 +6,11 @@ import { z } from "zod" export type JsonifiedDate = Opaque -export function jsonifyDateSchema(schema: S) { +export function jsonifyDateSchema>(schema: S) { return schema.transform(v => v.toString() as JsonifiedDate) } -export function dejsonifyDateSchema(schema: S) { +export function dejsonifyDateSchema>(schema: S) { return z .custom(identity) .pipe( diff --git a/src/schema/jsonified/decimal.ts b/src/schema/jsonified/decimal.ts index 2aacd7a..eb500a6 100644 --- a/src/schema/jsonified/decimal.ts +++ b/src/schema/jsonified/decimal.ts @@ -7,15 +7,11 @@ import { z } from "zod" export type JsonifiedDecimal = Opaque -export function jsonifyDecimalSchema< - S extends z.ZodType ->(schema: S) { +export function jsonifyDecimalSchema>(schema: S) { return schema.transform(v => v.toJSON() as JsonifiedDecimal) } -export function dejsonifyDecimalSchema< - S extends z.ZodType ->(schema: S) { +export function dejsonifyDecimalSchema>(schema: S) { return z .custom(identity) .pipe( diff --git a/src/schema/lib.ts b/src/schema/lib.ts index b7c00ae..0ab38cb 100644 --- a/src/schema/lib.ts +++ b/src/schema/lib.ts @@ -1,2 +1,3 @@ +export * from "./decimal" export * from "./effect" export * from "./jsonified" -- 2.49.1 From 4ac60d3b18eecfa13e559741bf14f02baaaf88d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 19 Mar 2024 20:20:41 +0100 Subject: [PATCH 38/74] Schema work --- src/schema/effect/index.ts | 2 ++ src/schema/effect/option.ts | 4 ++++ src/schema/jsonified/option.ts | 12 +++++++----- src/tests.ts | 7 ++++++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/schema/effect/index.ts b/src/schema/effect/index.ts index 904b057..7d00ecc 100644 --- a/src/schema/effect/index.ts +++ b/src/schema/effect/index.ts @@ -4,3 +4,5 @@ import { option } from "./option" export const effect = { option, } as const + +export { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome } from "./option" diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index 98ff4bc..baca6ee 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -19,3 +19,7 @@ export const option = { : unknown >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), } as const + +export type ZodEffectOption = ReturnType> +export type ZodEffectOptionSome = ReturnType> +export type ZodEffectOptionNone = ReturnType> diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index 3e68732..543706d 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -1,19 +1,21 @@ import { Option } from "effect" +import { identity } from "lodash-es" +import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" import { effect } from "../effect" -import { Opaque } from "type-fest" -import { identity } from "lodash-es" +import { ZodEffectOption } from "../effect/option" -export type JsonifiedEffectOption = Opaque +export type JsonifiedEffectOption = Opaque export const jsonifyOption = { option: < - S extends ReturnType>, + S extends ZodEffectOption, T extends z.ZodTypeAny, + Jsonify, >( - schema: S | ReturnType> + schema: S | ZodEffectOption, ) => (schema as S).transform(v => Option.getOrNull(v)), diff --git a/src/tests.ts b/src/tests.ts index 3f93b47..4e2caff 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -4,8 +4,9 @@ import { z } from "zod" import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" import { dejsonify, jsonify } from "./schema/jsonified" -import { effect } from "./schema/lib" +import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effect } from "./schema/lib" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" +import { satisfies } from "effect/Function" const userExp = ZodSchemaClass( @@ -30,6 +31,10 @@ const userInst = User.create({ id: Option.some(1n), name: "User" }) const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) +const t = z.literal("prout") +const optionT = effect.option.option(t) +const someT = optionT._def.options[0] satisfies ZodEffectOptionSome + const jsonifiedOption = jsonify.option.some( effect.option.some(z.literal("prout")) ) -- 2.49.1 From 28a80f799c7c9064c247b3612e74a6254734144c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 20 Mar 2024 13:56:27 +0100 Subject: [PATCH 39/74] Working jsonifyOption.some --- src/schema/effect/option.ts | 4 ++++ src/schema/jsonified/option.ts | 16 +++++++++------- src/tests.ts | 9 +++++++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index baca6ee..5b8c7f1 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -20,6 +20,10 @@ export const option = { >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), } as const + export type ZodEffectOption = ReturnType> export type ZodEffectOptionSome = ReturnType> export type ZodEffectOptionNone = ReturnType> + +export const effectOptionSomeInnerType = (schema: ZodEffectOptionSome): S => + schema._def.schema._def.out.shape.value diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index 543706d..c2c58f0 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -3,7 +3,7 @@ import { identity } from "lodash-es" import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" import { effect } from "../effect" -import { ZodEffectOption } from "../effect/option" +import { ZodEffectOption, ZodEffectOptionSome, effectOptionSomeInnerType } from "../effect/option" export type JsonifiedEffectOption = Opaque @@ -13,19 +13,21 @@ export const jsonifyOption = { option: < S extends ZodEffectOption, T extends z.ZodTypeAny, - Jsonify, + // Jsonify extends (schema: z.ZodType<>), >( schema: S | ZodEffectOption, ) => (schema as S).transform(v => Option.getOrNull(v)), some: < - S extends ReturnType>, - T extends z.ZodSchema, + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: S | ReturnType> - ) => - (schema as S).transform(v => Option.getOrThrow(v)), + schema: ZodEffectOptionSome, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) => schema + .transform(v => Option.getOrThrow(v)) + .pipe(jsonifySchema(effectOptionSomeInnerType(schema))), none: < S extends ReturnType>, diff --git a/src/tests.ts b/src/tests.ts index 4e2caff..0bd9fce 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -7,6 +7,8 @@ import { dejsonify, jsonify } from "./schema/jsonified" import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effect } from "./schema/lib" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" import { satisfies } from "effect/Function" +import { identity } from "lodash-es" +import { jsonifyBigIntSchema } from "./schema/jsonified/bigint" const userExp = ZodSchemaClass( @@ -35,9 +37,12 @@ const t = z.literal("prout") const optionT = effect.option.option(t) const someT = optionT._def.options[0] satisfies ZodEffectOptionSome -const jsonifiedOption = jsonify.option.some( - effect.option.some(z.literal("prout")) +const jsonifiedBigIntOption = jsonify.option.some( + effect.option.some(z.bigint()), + jsonifyBigIntSchema, ) +type T = z.output + const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { jsonifySchema: s => s.extend({ -- 2.49.1 From 53dfd254f798131646fddb77cb1f378d6baa3443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 20 Mar 2024 14:17:32 +0100 Subject: [PATCH 40/74] Jsonify option work --- src/schema/jsonified/option.ts | 25 ++++++++++++++----------- src/tests.ts | 19 ++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index c2c58f0..c26a375 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -3,7 +3,7 @@ import { identity } from "lodash-es" import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" import { effect } from "../effect" -import { ZodEffectOption, ZodEffectOptionSome, effectOptionSomeInnerType } from "../effect/option" +import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionSomeInnerType } from "../effect/option" export type JsonifiedEffectOption = Opaque @@ -11,13 +11,15 @@ export type JsonifiedEffectOption = Opaque, - T extends z.ZodTypeAny, - // Jsonify extends (schema: z.ZodType<>), + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: S | ZodEffectOption, - ) => - (schema as S).transform(v => Option.getOrNull(v)), + schema: ZodEffectOption, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) => z.union([ + jsonifyOption.some(schema._def.options[0], jsonifySchema), + jsonifyOption.none(schema._def.options[1], jsonifySchema), + ]), some: < InnerS extends z.ZodTypeAny, @@ -30,12 +32,13 @@ export const jsonifyOption = { .pipe(jsonifySchema(effectOptionSomeInnerType(schema))), none: < - S extends ReturnType>, - T extends z.ZodSchema | unknown = unknown, + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: S | ReturnType> + schema: ZodEffectOptionNone, + _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, ) => - (schema as S).transform(() => null), + schema.transform(() => null), } as const export const dejsonifyOption = { diff --git a/src/tests.ts b/src/tests.ts index 0bd9fce..a8486c5 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -4,11 +4,9 @@ import { z } from "zod" import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" import { dejsonify, jsonify } from "./schema/jsonified" -import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effect } from "./schema/lib" -import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" -import { satisfies } from "effect/Function" -import { identity } from "lodash-es" import { jsonifyBigIntSchema } from "./schema/jsonified/bigint" +import { effect } from "./schema/lib" +import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" const userExp = ZodSchemaClass( @@ -33,15 +31,18 @@ const userInst = User.create({ id: Option.some(1n), name: "User" }) const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) -const t = z.literal("prout") -const optionT = effect.option.option(t) -const someT = optionT._def.options[0] satisfies ZodEffectOptionSome +const jsonifiedBigIntOption = jsonify.option.option( + effect.option.option(z.bigint()), + jsonifyBigIntSchema, +) +type T1 = z.output -const jsonifiedBigIntOption = jsonify.option.some( + +const jsonifiedBigIntOptionSome = jsonify.option.some( effect.option.some(z.bigint()), jsonifyBigIntSchema, ) -type T = z.output +type T2 = z.output const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { -- 2.49.1 From 389bc696aacaa092e9daa09f9e8b18af78469a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 20 Mar 2024 14:43:47 +0100 Subject: [PATCH 41/74] Option schema wor --- src/schema/effect/option.ts | 16 +++++++++++++--- src/schema/jsonified/option.ts | 8 ++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index 5b8c7f1..b86e4d8 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -22,8 +22,18 @@ export const option = { export type ZodEffectOption = ReturnType> -export type ZodEffectOptionSome = ReturnType> -export type ZodEffectOptionNone = ReturnType> -export const effectOptionSomeInnerType = (schema: ZodEffectOptionSome): S => +export const effectOptionSomeSchema = (schema: ZodEffectOption): ZodEffectOptionSome => + schema.options[0] + +export const effectOptionNoneSchema = (schema: ZodEffectOption): ZodEffectOptionNone => + schema.options[1] + + +export type ZodEffectOptionSome = ReturnType> + +export const effectOptionSomeInnerSchema = (schema: ZodEffectOptionSome): S => schema._def.schema._def.out.shape.value + + +export type ZodEffectOptionNone = ReturnType> diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index c26a375..bddc561 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -3,7 +3,7 @@ import { identity } from "lodash-es" import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" import { effect } from "../effect" -import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionSomeInnerType } from "../effect/option" +import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "../effect/option" export type JsonifiedEffectOption = Opaque @@ -17,8 +17,8 @@ export const jsonifyOption = { schema: ZodEffectOption, jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, ) => z.union([ - jsonifyOption.some(schema._def.options[0], jsonifySchema), - jsonifyOption.none(schema._def.options[1], jsonifySchema), + jsonifyOption.some(effectOptionSomeSchema(schema), jsonifySchema), + jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema), ]), some: < @@ -29,7 +29,7 @@ export const jsonifyOption = { jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, ) => schema .transform(v => Option.getOrThrow(v)) - .pipe(jsonifySchema(effectOptionSomeInnerType(schema))), + .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))), none: < InnerS extends z.ZodTypeAny, -- 2.49.1 From f666eff496f85d9650f2fbcd4d27f9a6d3e98aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 20 Mar 2024 16:55:23 +0100 Subject: [PATCH 42/74] Option work --- src/schema/jsonified/option.ts | 67 ++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index bddc561..749562d 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -2,11 +2,12 @@ import { Option } from "effect" import { identity } from "lodash-es" import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" -import { effect } from "../effect" import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "../effect/option" export type JsonifiedEffectOption = Opaque +export type JsonifiedEffectOptionSome = Opaque +export type JsonifiedEffectOptionNone = Opaque export const jsonifyOption = { @@ -21,6 +22,39 @@ export const jsonifyOption = { jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema), ]), + some: < + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOptionSome, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) => schema + .transform(v => Option.getOrThrow(v)) + .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) + .transform>>(identity), + + none: < + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOptionNone, + _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, + ) => + schema.transform(() => null as JsonifiedEffectOptionNone), +} as const + +export const dejsonifyOption = { + option: < + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOption, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) => z.union([ + jsonifyOption.some(effectOptionSomeSchema(schema), jsonifySchema), + jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema), + ]), + some: < InnerS extends z.ZodTypeAny, JsonifiedInnerS extends z.ZodTypeAny = InnerS, @@ -38,34 +72,5 @@ export const jsonifyOption = { schema: ZodEffectOptionNone, _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, ) => - schema.transform(() => null), -} as const - -export const dejsonifyOption = { - option: < - S extends ReturnType>, - T extends z.ZodSchema, - >( - schema: S | ReturnType> - ) => z - .custom>(identity) - .pipe( - z. - ), - - some: < - S extends ReturnType>, - T extends z.ZodSchema, - >( - schema: S | ReturnType> - ) => - (schema as S).transform(v => Option.getOrThrow(v)), - - none: < - S extends ReturnType>, - T extends z.ZodSchema | unknown = unknown, - >( - schema: S | ReturnType> - ) => - (schema as S).transform(() => null), + z.null().pipe(schema), } as const -- 2.49.1 From a5c5b62c9fc0b25f14f4935ef269b52f2d8d9ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 21 Mar 2024 00:52:26 +0100 Subject: [PATCH 43/74] Jsonify work --- src/schema/effect/index.ts | 2 +- src/schema/jsonified/bigint.ts | 24 +++++++-------------- src/schema/jsonified/option.ts | 6 +++--- src/tests.ts | 38 +++++++++++++++++++++------------- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/schema/effect/index.ts b/src/schema/effect/index.ts index 7d00ecc..65e5538 100644 --- a/src/schema/effect/index.ts +++ b/src/schema/effect/index.ts @@ -5,4 +5,4 @@ export const effect = { option, } as const -export { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome } from "./option" +export { effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema, type ZodEffectOption, type ZodEffectOptionNone, type ZodEffectOptionSome } from "./option" diff --git a/src/schema/jsonified/bigint.ts b/src/schema/jsonified/bigint.ts index 6266dd5..635e234 100644 --- a/src/schema/jsonified/bigint.ts +++ b/src/schema/jsonified/bigint.ts @@ -1,29 +1,19 @@ -import { identity } from "lodash-es" -import { Opaque } from "type-fest" import { z } from "zod" -export type JsonifiedBigInt = Opaque +export type JsonifiedBigIntBrand = "@thilawyn/zod-schema-class/JsonifiedBigInt" export function jsonifyBigIntSchema>(schema: S) { - return schema.transform(v => v.toString() as JsonifiedBigInt) + return schema + .transform(v => v.toString()) + .brand() } export function dejsonifyBigIntSchema>(schema: S) { return z - .custom(identity) - .pipe( - z - .string() - .transform(v => { - try { - return BigInt(v) - } - catch (e) { - return v - } - }) - ) + .custom>() + .pipe(z.string()) + .pipe(z.coerce.bigint()) .pipe(schema) } diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index 749562d..4e60ca6 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -2,7 +2,7 @@ import { Option } from "effect" import { identity } from "lodash-es" import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" -import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "../effect/option" +import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "../effect" export type JsonifiedEffectOption = Opaque @@ -31,7 +31,7 @@ export const jsonifyOption = { ) => schema .transform(v => Option.getOrThrow(v)) .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) - .transform>>(identity), + .brand<"@thilawyn/zod-schema-class/JsonifiedEffectOptionSome">(), none: < InnerS extends z.ZodTypeAny, @@ -40,7 +40,7 @@ export const jsonifyOption = { schema: ZodEffectOptionNone, _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, ) => - schema.transform(() => null as JsonifiedEffectOptionNone), + schema.transform(() => null), } as const export const dejsonifyOption = { diff --git a/src/tests.ts b/src/tests.ts index a8486c5..96a2559 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,7 +1,6 @@ import { Implements } from "@thilawyn/traitify-ts" import { Option } from "effect" import { z } from "zod" -import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" import { dejsonify, jsonify } from "./schema/jsonified" import { jsonifyBigIntSchema } from "./schema/jsonified/bigint" @@ -44,23 +43,34 @@ const jsonifiedBigIntOptionSome = jsonify.option.some( ) type T2 = z.output +const jsonifiedBigIntOptionNone = jsonify.option.none( + effect.option.none(z.bigint()), + jsonifyBigIntSchema, +) +type T3 = z.output -const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { - jsonifySchema: s => s.extend({ - id: jsonify.bigint(s.shape.id) - }), - dejsonifySchema: s => s.extend({ - id: dejsonify.bigint(s.shape.id) - }), -}).build() +const dejsonifyBigInt = dejsonify.bigint(z.bigint()) +type T4 = z.input -@jsonifiedUserExp.staticImplements -class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} -const jsonifiedUserInst = JsonifiedUser.jsonify(userInst) -console.log(JSON.stringify(jsonifiedUserInst)) -jsonifiedUserInst.dejsonify() +// const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { +// jsonifySchema: s => s.extend({ +// id: jsonify.bigint(s.shape.id) +// }), + +// dejsonifySchema: s => s.extend({ +// id: dejsonify.bigint(s.shape.id) +// }), +// }).build() + +// @jsonifiedUserExp.staticImplements +// class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} + +// const jsonifiedUserInst = JsonifiedUser.jsonify(userInst) +// console.log(JSON.stringify(jsonifiedUserInst)) +// jsonifiedUserInst.dejsonify() + const adminUserExp = User.extend(s => s.extend({ role: z.literal("Admin").default("Admin") -- 2.49.1 From 7bc302d88262000a82ef86ac25335ce4c05bab51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 21 Mar 2024 14:38:12 +0100 Subject: [PATCH 44/74] Option jsonification work --- src/schema/jsonified/date.ts | 24 +++++----------- src/schema/jsonified/decimal.ts | 10 +++---- src/schema/jsonified/option.ts | 49 +++++++++++++++++---------------- src/tests.ts | 7 +---- 4 files changed, 38 insertions(+), 52 deletions(-) diff --git a/src/schema/jsonified/date.ts b/src/schema/jsonified/date.ts index ff4d0a1..8af03cd 100644 --- a/src/schema/jsonified/date.ts +++ b/src/schema/jsonified/date.ts @@ -1,29 +1,19 @@ -import { identity } from "lodash-es" -import { Opaque } from "type-fest" import { z } from "zod" -export type JsonifiedDate = Opaque +export type JsonifiedDateBrand = "@thilawyn/zod-schema-class/JsonifiedDate" export function jsonifyDateSchema>(schema: S) { - return schema.transform(v => v.toString() as JsonifiedDate) + return schema + .transform(v => v.toString()) + .brand() } export function dejsonifyDateSchema>(schema: S) { return z - .custom(identity) - .pipe( - z - .string() - .transform(v => { - try { - return new Date(v) - } - catch (e) { - return v - } - }) - ) + .custom>() + .pipe(z.string()) + .pipe(z.coerce.date()) .pipe(schema) } diff --git a/src/schema/jsonified/decimal.ts b/src/schema/jsonified/decimal.ts index eb500a6..e638a80 100644 --- a/src/schema/jsonified/decimal.ts +++ b/src/schema/jsonified/decimal.ts @@ -1,19 +1,19 @@ import { Decimal } from "decimal.js" -import { identity } from "lodash-es" -import { Opaque } from "type-fest" import { z } from "zod" -export type JsonifiedDecimal = Opaque +export type JsonifiedDecimalBrand = "@thilawyn/zod-schema-class/JsonifiedDecimal" export function jsonifyDecimalSchema>(schema: S) { - return schema.transform(v => v.toJSON() as JsonifiedDecimal) + return schema + .transform(v => v.toJSON()) + .brand() } export function dejsonifyDecimalSchema>(schema: S) { return z - .custom(identity) + .custom>() .pipe( z .string() diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index 4e60ca6..c2b45a4 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -1,13 +1,10 @@ import { Option } from "effect" import { identity } from "lodash-es" -import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "../effect" -export type JsonifiedEffectOption = Opaque -export type JsonifiedEffectOptionSome = Opaque -export type JsonifiedEffectOptionNone = Opaque +export type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome" export const jsonifyOption = { @@ -31,7 +28,7 @@ export const jsonifyOption = { ) => schema .transform(v => Option.getOrThrow(v)) .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) - .brand<"@thilawyn/zod-schema-class/JsonifiedEffectOptionSome">(), + .brand(), none: < InnerS extends z.ZodTypeAny, @@ -45,32 +42,36 @@ export const jsonifyOption = { export const dejsonifyOption = { option: < - InnerS extends z.ZodTypeAny, - JsonifiedInnerS extends z.ZodTypeAny = InnerS, + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOption, - jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + schema: ZodEffectOption, + dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, ) => z.union([ - jsonifyOption.some(effectOptionSomeSchema(schema), jsonifySchema), - jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema), + dejsonifyOption.some(effectOptionSomeSchema(schema), dejsonifySchema), + dejsonifyOption.none(effectOptionNoneSchema(schema), dejsonifySchema), ]), some: < - InnerS extends z.ZodTypeAny, - JsonifiedInnerS extends z.ZodTypeAny = InnerS, + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionSome, - jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, - ) => schema - .transform(v => Option.getOrThrow(v)) - .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))), + schema: ZodEffectOptionSome, + dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, + ) => z + .custom & z.BRAND>() + .pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema))) + .transform(v => Option.some>(v)) + .pipe(schema), none: < - InnerS extends z.ZodTypeAny, - JsonifiedInnerS extends z.ZodTypeAny = InnerS, + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionNone, - _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, - ) => - z.null().pipe(schema), + schema: ZodEffectOptionNone, + _dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS, + ) => z + .null() + .transform(() => Option.none>()) + .pipe(schema), } as const diff --git a/src/tests.ts b/src/tests.ts index 96a2559..d3c3023 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2,7 +2,7 @@ import { Implements } from "@thilawyn/traitify-ts" import { Option } from "effect" import { z } from "zod" import { ZodSchemaClass } from "./ZodSchemaClass" -import { dejsonify, jsonify } from "./schema/jsonified" +import { jsonify } from "./schema/jsonified" import { jsonifyBigIntSchema } from "./schema/jsonified/bigint" import { effect } from "./schema/lib" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" @@ -36,7 +36,6 @@ const jsonifiedBigIntOption = jsonify.option.option( ) type T1 = z.output - const jsonifiedBigIntOptionSome = jsonify.option.some( effect.option.some(z.bigint()), jsonifyBigIntSchema, @@ -50,10 +49,6 @@ const jsonifiedBigIntOptionNone = jsonify.option.none( type T3 = z.output -const dejsonifyBigInt = dejsonify.bigint(z.bigint()) -type T4 = z.input - - // const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { // jsonifySchema: s => s.extend({ // id: jsonify.bigint(s.shape.id) -- 2.49.1 From 8c525f09684bffdf82084260208ed7ec2becb4aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 21 Mar 2024 14:58:51 +0100 Subject: [PATCH 45/74] Schema work --- src/schema/jsonified/index.ts | 3 ++- src/schema/lib.ts | 14 +++++++++++--- src/tests.ts | 27 ++++++++++++++------------- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/schema/jsonified/index.ts b/src/schema/jsonified/index.ts index 983b523..a70a3b9 100644 --- a/src/schema/jsonified/index.ts +++ b/src/schema/jsonified/index.ts @@ -1,7 +1,7 @@ import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./bigint" import { dejsonifyDateSchema, jsonifyDateSchema } from "./date" import { dejsonifyDecimalSchema, jsonifyDecimalSchema } from "./decimal" -import { jsonifyOption } from "./option" +import { dejsonifyOption, jsonifyOption } from "./option" export const jsonify = { @@ -15,4 +15,5 @@ export const dejsonify = { bigint: dejsonifyBigIntSchema, date: dejsonifyDateSchema, decimal: dejsonifyDecimalSchema, + option: dejsonifyOption, } as const diff --git a/src/schema/lib.ts b/src/schema/lib.ts index 0ab38cb..868d177 100644 --- a/src/schema/lib.ts +++ b/src/schema/lib.ts @@ -1,3 +1,11 @@ -export * from "./decimal" -export * from "./effect" -export * from "./jsonified" +import { decimal } from "./decimal" +import { effect } from "./effect" +import { dejsonify, jsonify } from "./jsonified" + + +export const s = { + decimal, + effect, + jsonify, + dejsonify, +} as const diff --git a/src/tests.ts b/src/tests.ts index d3c3023..95bded1 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2,16 +2,15 @@ import { Implements } from "@thilawyn/traitify-ts" import { Option } from "effect" import { z } from "zod" import { ZodSchemaClass } from "./ZodSchemaClass" -import { jsonify } from "./schema/jsonified" -import { jsonifyBigIntSchema } from "./schema/jsonified/bigint" -import { effect } from "./schema/lib" +import { dejsonify, jsonify } from "./schema/jsonified" +import { s } from "./schema/lib" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" const userExp = ZodSchemaClass( z.object({ /** User ID */ - id: effect.option.option(z.bigint()).default(Option.none()), + id: s.effect.option.option(z.bigint()).default(Option.none()), /** Username */ name: z.string(), @@ -31,22 +30,24 @@ const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) const jsonifiedBigIntOption = jsonify.option.option( - effect.option.option(z.bigint()), - jsonifyBigIntSchema, + s.effect.option.option(z.bigint()), + s.jsonify.bigint, ) -type T1 = z.output const jsonifiedBigIntOptionSome = jsonify.option.some( - effect.option.some(z.bigint()), - jsonifyBigIntSchema, + s.effect.option.some(z.bigint()), + s.jsonify.bigint, ) -type T2 = z.output +const dejsonifiedBigIntOptionSome = dejsonify.option.some( + s.effect.option.some(z.bigint()), + s.dejsonify.bigint, +) +type T2 = z.output const jsonifiedBigIntOptionNone = jsonify.option.none( - effect.option.none(z.bigint()), - jsonifyBigIntSchema, + s.effect.option.none(z.bigint()), + s.jsonify.bigint, ) -type T3 = z.output // const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { -- 2.49.1 From d6907c8e28885fa67baec8a886eb2de04f58b757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 21 Mar 2024 17:42:59 +0100 Subject: [PATCH 46/74] Schema work --- src/schema/effect/index.ts | 10 +++- .../option.ts => effect/jsonifiedOption.ts} | 2 +- src/schema/jsonified/index.ts | 3 -- src/tests.ts | 47 +++++-------------- 4 files changed, 22 insertions(+), 40 deletions(-) rename src/schema/{jsonified/option.ts => effect/jsonifiedOption.ts} (98%) diff --git a/src/schema/effect/index.ts b/src/schema/effect/index.ts index 65e5538..38ea322 100644 --- a/src/schema/effect/index.ts +++ b/src/schema/effect/index.ts @@ -1,8 +1,14 @@ +import { dejsonifyOption, jsonifyOption } from "./jsonifiedOption" import { option } from "./option" export const effect = { option, -} as const -export { effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema, type ZodEffectOption, type ZodEffectOptionNone, type ZodEffectOptionSome } from "./option" + jsonify: { + option: jsonifyOption + } as const, + dejsonify: { + option: dejsonifyOption + } as const, +} as const diff --git a/src/schema/jsonified/option.ts b/src/schema/effect/jsonifiedOption.ts similarity index 98% rename from src/schema/jsonified/option.ts rename to src/schema/effect/jsonifiedOption.ts index c2b45a4..e693878 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/effect/jsonifiedOption.ts @@ -1,7 +1,7 @@ import { Option } from "effect" import { identity } from "lodash-es" import { z } from "zod" -import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "../effect" +import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "./option" export type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome" diff --git a/src/schema/jsonified/index.ts b/src/schema/jsonified/index.ts index a70a3b9..6bff7ae 100644 --- a/src/schema/jsonified/index.ts +++ b/src/schema/jsonified/index.ts @@ -1,19 +1,16 @@ import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./bigint" import { dejsonifyDateSchema, jsonifyDateSchema } from "./date" import { dejsonifyDecimalSchema, jsonifyDecimalSchema } from "./decimal" -import { dejsonifyOption, jsonifyOption } from "./option" export const jsonify = { bigint: jsonifyBigIntSchema, date: jsonifyDateSchema, decimal: jsonifyDecimalSchema, - option: jsonifyOption, } as const export const dejsonify = { bigint: dejsonifyBigIntSchema, date: dejsonifyDateSchema, decimal: dejsonifyDecimalSchema, - option: dejsonifyOption, } as const diff --git a/src/tests.ts b/src/tests.ts index 95bded1..229b1fc 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,8 +1,8 @@ import { Implements } from "@thilawyn/traitify-ts" import { Option } from "effect" import { z } from "zod" +import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" -import { dejsonify, jsonify } from "./schema/jsonified" import { s } from "./schema/lib" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" @@ -29,42 +29,21 @@ const userInst = User.create({ id: Option.some(1n), name: "User" }) const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) -const jsonifiedBigIntOption = jsonify.option.option( - s.effect.option.option(z.bigint()), - s.jsonify.bigint, -) +const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { + jsonifySchema: schema => schema.extend({ + id: s.effect.jsonify.option.option(schema.shape.id, s.jsonify.bigint) + }), -const jsonifiedBigIntOptionSome = jsonify.option.some( - s.effect.option.some(z.bigint()), - s.jsonify.bigint, -) -const dejsonifiedBigIntOptionSome = dejsonify.option.some( - s.effect.option.some(z.bigint()), - s.dejsonify.bigint, -) -type T2 = z.output + dejsonifySchema: schema => schema.extend({ + id: s.effect.dejsonify.option.option(schema.shape.id, s.dejsonify.bigint) + }), +}).build() -const jsonifiedBigIntOptionNone = jsonify.option.none( - s.effect.option.none(z.bigint()), - s.jsonify.bigint, -) +@jsonifiedUserExp.staticImplements +class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} - -// const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { -// jsonifySchema: s => s.extend({ -// id: jsonify.bigint(s.shape.id) -// }), - -// dejsonifySchema: s => s.extend({ -// id: dejsonify.bigint(s.shape.id) -// }), -// }).build() - -// @jsonifiedUserExp.staticImplements -// class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} - -// const jsonifiedUserInst = JsonifiedUser.jsonify(userInst) -// console.log(JSON.stringify(jsonifiedUserInst)) +const jsonifiedUserInst = JsonifiedUser.jsonify(userInst) +console.log(JSON.stringify(jsonifiedUserInst)) // jsonifiedUserInst.dejsonify() -- 2.49.1 From 7d278f7422b71cb610a70ecc4c9949bfdf2e92a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 21 Mar 2024 18:34:33 +0100 Subject: [PATCH 47/74] Schema work --- src/schema/effect/option.ts | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index b86e4d8..ba6aed1 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -3,25 +3,23 @@ import { identity } from "lodash-es" import { z } from "zod" -export const option = { - option: (schema: S) => - z.union([option.some(schema), option.none(schema)]), +export const option = (schema: S) => + z.union([option.some(schema), option.none(schema)]) - some: (schema: S) => z - .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option") - .pipe(z.object({ value: schema }).passthrough()) - .transform>>(identity), +option.some = (schema: S) => z + .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option") + .pipe(z.object({ value: schema }).passthrough()) + .transform>>(identity) - none: (_schema?: S) => - z.custom - : unknown - >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), -} as const +option.none = (_schema?: S) => + z.custom + : unknown + >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option") -export type ZodEffectOption = ReturnType> +export type ZodEffectOption = ReturnType> export const effectOptionSomeSchema = (schema: ZodEffectOption): ZodEffectOptionSome => schema.options[0] -- 2.49.1 From 74ac3b41ad88a96fb996ba41f50b513b52e9a2e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 01:11:13 +0100 Subject: [PATCH 48/74] Schema work --- src/schema/effect/option.ts | 86 ++++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 16 deletions(-) diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index ba6aed1..a3f91aa 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -3,23 +3,83 @@ import { identity } from "lodash-es" import { z } from "zod" +type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome" + + export const option = (schema: S) => z.union([option.some(schema), option.none(schema)]) -option.some = (schema: S) => z - .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option") + +const some = < + InnerS extends z.ZodTypeAny +>(schema: InnerS) => z + .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option.Some") .pipe(z.object({ value: schema }).passthrough()) - .transform>>(identity) + .transform>>(identity) -option.none = (_schema?: S) => - z.custom - : unknown - >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option") +some.jsonify = < + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, +>( + schema: ZodEffectOptionSome, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, +) => schema + .transform(v => Option.getOrThrow(v)) + .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) + .brand() + +some.dejsonify = < + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, +>( + schema: ZodEffectOptionSome, + dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, +) => z + .custom & z.BRAND>() + .pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema))) + .transform(v => Option.some>(v)) + .pipe(schema) + +option.some = some -export type ZodEffectOption = ReturnType> +const none = < + InnerS extends z.ZodTypeAny | unknown = unknown +>(_schema?: InnerS) => + z.custom< + Option.None< + InnerS extends z.ZodTypeAny + ? z.output + : unknown + > + >(v => Option.isOption(v) && Option.isNone(v), "Not an Option.None") + +none.jsonify = < + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, +>( + schema: ZodEffectOptionNone, + _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, +) => + schema.transform(() => null), + +none.dejsonify = < + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, +>( + schema: ZodEffectOptionNone, + _dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS, +) => z + .null() + .transform(() => Option.none>()) + .pipe(schema), + +option.none = none + + +export type ZodEffectOption = ReturnType> +export type ZodEffectOptionSome = ReturnType> +export type ZodEffectOptionNone = ReturnType> export const effectOptionSomeSchema = (schema: ZodEffectOption): ZodEffectOptionSome => schema.options[0] @@ -27,11 +87,5 @@ export const effectOptionSomeSchema = (schema: ZodEffect export const effectOptionNoneSchema = (schema: ZodEffectOption): ZodEffectOptionNone => schema.options[1] - -export type ZodEffectOptionSome = ReturnType> - export const effectOptionSomeInnerSchema = (schema: ZodEffectOptionSome): S => schema._def.schema._def.out.shape.value - - -export type ZodEffectOptionNone = ReturnType> -- 2.49.1 From 7f1e9693f2c0bd6c601ba02f5ba70301d419a46f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 12:55:39 +0100 Subject: [PATCH 49/74] Option refactoring --- src/schema/effect/option.ts | 146 ++++++++++++++++++++---------------- 1 file changed, 81 insertions(+), 65 deletions(-) diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index a3f91aa..56163f9 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -6,75 +6,91 @@ import { z } from "zod" type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome" -export const option = (schema: S) => - z.union([option.some(schema), option.none(schema)]) +export function option(schema: S) { + return z.union([option.some(schema), option.none(schema)]) +} + +export module option { + export function some< + InnerS extends z.ZodTypeAny + >( + schema: InnerS + ) { + return z + .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option.Some") + .pipe(z.object({ value: schema }).passthrough()) + .transform>>(identity) + } + + export module some { + export function jsonify< + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOptionSome, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) { + return schema + .transform(v => Option.getOrThrow(v)) + .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) + .brand() + } + + export function dejsonify< + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOptionSome, + dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, + ) { + return z + .custom & z.BRAND>() + .pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema))) + .transform(v => Option.some>(v)) + .pipe(schema) + } + } -const some = < - InnerS extends z.ZodTypeAny ->(schema: InnerS) => z - .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option.Some") - .pipe(z.object({ value: schema }).passthrough()) - .transform>>(identity) + export function none< + InnerS extends z.ZodTypeAny | unknown = unknown + >( + _schema?: InnerS + ) { + return z.custom< + Option.None< + InnerS extends z.ZodTypeAny + ? z.output + : unknown + > + >(v => Option.isOption(v) && Option.isNone(v), "Not an Option.None") + } -some.jsonify = < - InnerS extends z.ZodTypeAny, - JsonifiedInnerS extends z.ZodTypeAny = InnerS, ->( - schema: ZodEffectOptionSome, - jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, -) => schema - .transform(v => Option.getOrThrow(v)) - .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) - .brand() + export module none { + export function jsonify< + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOptionNone, + _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, + ) { + return schema.transform(() => null) + } -some.dejsonify = < - InnerS extends z.ZodTypeAny, - DejsonifiedInnerS extends z.ZodTypeAny = InnerS, ->( - schema: ZodEffectOptionSome, - dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, -) => z - .custom & z.BRAND>() - .pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema))) - .transform(v => Option.some>(v)) - .pipe(schema) - -option.some = some - - -const none = < - InnerS extends z.ZodTypeAny | unknown = unknown ->(_schema?: InnerS) => - z.custom< - Option.None< - InnerS extends z.ZodTypeAny - ? z.output - : unknown - > - >(v => Option.isOption(v) && Option.isNone(v), "Not an Option.None") - -none.jsonify = < - InnerS extends z.ZodTypeAny, - JsonifiedInnerS extends z.ZodTypeAny = InnerS, ->( - schema: ZodEffectOptionNone, - _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, -) => - schema.transform(() => null), - -none.dejsonify = < - InnerS extends z.ZodTypeAny, - DejsonifiedInnerS extends z.ZodTypeAny = InnerS, ->( - schema: ZodEffectOptionNone, - _dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS, -) => z - .null() - .transform(() => Option.none>()) - .pipe(schema), - -option.none = none + export function dejsonify< + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOptionNone, + _dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS, + ) { + return z + .null() + .transform(() => Option.none>()) + .pipe(schema) + } + } +} export type ZodEffectOption = ReturnType> -- 2.49.1 From 440ad80bc33ff6b2bcd1575ba3a813865dc8ee4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 13:39:13 +0100 Subject: [PATCH 50/74] Option module --- src/schema/effect/index.ts | 16 ++---- src/schema/effect/jsonifiedOption.ts | 77 ---------------------------- src/schema/effect/option.ts | 75 +++++++++++++++++++-------- 3 files changed, 58 insertions(+), 110 deletions(-) delete mode 100644 src/schema/effect/jsonifiedOption.ts diff --git a/src/schema/effect/index.ts b/src/schema/effect/index.ts index 38ea322..bc47e44 100644 --- a/src/schema/effect/index.ts +++ b/src/schema/effect/index.ts @@ -1,14 +1,6 @@ -import { dejsonifyOption, jsonifyOption } from "./jsonifiedOption" -import { option } from "./option" +import { option as optionModule } from "./option" -export const effect = { - option, - - jsonify: { - option: jsonifyOption - } as const, - dejsonify: { - option: dejsonifyOption - } as const, -} as const +export module effect { + export const option = optionModule +} diff --git a/src/schema/effect/jsonifiedOption.ts b/src/schema/effect/jsonifiedOption.ts deleted file mode 100644 index e693878..0000000 --- a/src/schema/effect/jsonifiedOption.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Option } from "effect" -import { identity } from "lodash-es" -import { z } from "zod" -import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "./option" - - -export type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome" - - -export const jsonifyOption = { - option: < - InnerS extends z.ZodTypeAny, - JsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOption, - jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, - ) => z.union([ - jsonifyOption.some(effectOptionSomeSchema(schema), jsonifySchema), - jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema), - ]), - - some: < - InnerS extends z.ZodTypeAny, - JsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOptionSome, - jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, - ) => schema - .transform(v => Option.getOrThrow(v)) - .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) - .brand(), - - none: < - InnerS extends z.ZodTypeAny, - JsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOptionNone, - _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, - ) => - schema.transform(() => null), -} as const - -export const dejsonifyOption = { - option: < - InnerS extends z.ZodTypeAny, - DejsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOption, - dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, - ) => z.union([ - dejsonifyOption.some(effectOptionSomeSchema(schema), dejsonifySchema), - dejsonifyOption.none(effectOptionNoneSchema(schema), dejsonifySchema), - ]), - - some: < - InnerS extends z.ZodTypeAny, - DejsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOptionSome, - dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, - ) => z - .custom & z.BRAND>() - .pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema))) - .transform(v => Option.some>(v)) - .pipe(schema), - - none: < - InnerS extends z.ZodTypeAny, - DejsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOptionNone, - _dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS, - ) => z - .null() - .transform(() => Option.none>()) - .pipe(schema), -} as const diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index 56163f9..30e3fd2 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -6,11 +6,48 @@ import { z } from "zod" type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome" -export function option(schema: S) { +export function option(schema: InnerS) { return z.union([option.some(schema), option.none(schema)]) } export module option { + export type Option = ReturnType> + + function getSomeSchema(schema: Option): some.Some { + return schema.options[0] + } + function getNoneSchema(schema: Option): none.None { + return schema.options[1] + } + + + export function jsonify< + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: Option, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) { + return z.union([ + some.jsonify(getSomeSchema(schema), jsonifySchema), + none.jsonify(getNoneSchema(schema), jsonifySchema), + ]) + } + + export function dejsonify< + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: Option, + dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, + ) { + return z.union([ + some.dejsonify(getSomeSchema(schema), dejsonifySchema), + none.dejsonify(getNoneSchema(schema), dejsonifySchema), + ]) + } + + export function some< InnerS extends z.ZodTypeAny >( @@ -23,16 +60,23 @@ export module option { } export module some { + export type Some = ReturnType> + + function getInnerSchema(schema: Some): InnerS { + return schema._def.schema._def.out.shape.value + } + + export function jsonify< InnerS extends z.ZodTypeAny, JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionSome, + schema: Some, jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, ) { return schema .transform(v => Option.getOrThrow(v)) - .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) + .pipe(jsonifySchema(getInnerSchema(schema))) .brand() } @@ -40,12 +84,12 @@ export module option { InnerS extends z.ZodTypeAny, DejsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionSome, + schema: Some, dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, ) { return z .custom & z.BRAND>() - .pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema))) + .pipe(dejsonifySchema(getInnerSchema(schema))) .transform(v => Option.some>(v)) .pipe(schema) } @@ -67,11 +111,14 @@ export module option { } export module none { + export type None = ReturnType> + + export function jsonify< InnerS extends z.ZodTypeAny, JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionNone, + schema: None, _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, ) { return schema.transform(() => null) @@ -81,7 +128,7 @@ export module option { InnerS extends z.ZodTypeAny, DejsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionNone, + schema: None, _dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS, ) { return z @@ -91,17 +138,3 @@ export module option { } } } - - -export type ZodEffectOption = ReturnType> -export type ZodEffectOptionSome = ReturnType> -export type ZodEffectOptionNone = ReturnType> - -export const effectOptionSomeSchema = (schema: ZodEffectOption): ZodEffectOptionSome => - schema.options[0] - -export const effectOptionNoneSchema = (schema: ZodEffectOption): ZodEffectOptionNone => - schema.options[1] - -export const effectOptionSomeInnerSchema = (schema: ZodEffectOptionSome): S => - schema._def.schema._def.out.shape.value -- 2.49.1 From 61c2398f1f3c51a84c181f2cbe5ad2542e7d452e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 13:40:41 +0100 Subject: [PATCH 51/74] Tests fix --- src/tests.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index 229b1fc..8feea0f 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -10,7 +10,7 @@ import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaO const userExp = ZodSchemaClass( z.object({ /** User ID */ - id: s.effect.option.option(z.bigint()).default(Option.none()), + id: s.effect.option(z.bigint()).default(Option.none()), /** Username */ name: z.string(), @@ -31,11 +31,11 @@ const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { jsonifySchema: schema => schema.extend({ - id: s.effect.jsonify.option.option(schema.shape.id, s.jsonify.bigint) + id: s.effect.option.jsonify(schema.shape.id, s.jsonify.bigint) }), dejsonifySchema: schema => schema.extend({ - id: s.effect.dejsonify.option.option(schema.shape.id, s.dejsonify.bigint) + id: s.effect.option.dejsonify(schema.shape.id, s.dejsonify.bigint) }), }).build() -- 2.49.1 From b14fff96a48effbf98260f4f2541c6696f0c342d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 14:04:23 +0100 Subject: [PATCH 52/74] Module fix --- src/schema/effect/index.ts | 7 +------ src/schema/lib.ts | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/schema/effect/index.ts b/src/schema/effect/index.ts index bc47e44..720a9ef 100644 --- a/src/schema/effect/index.ts +++ b/src/schema/effect/index.ts @@ -1,6 +1 @@ -import { option as optionModule } from "./option" - - -export module effect { - export const option = optionModule -} +export { option } from "./option" diff --git a/src/schema/lib.ts b/src/schema/lib.ts index 868d177..1323289 100644 --- a/src/schema/lib.ts +++ b/src/schema/lib.ts @@ -1,5 +1,5 @@ import { decimal } from "./decimal" -import { effect } from "./effect" +import * as effect from "./effect" import { dejsonify, jsonify } from "./jsonified" -- 2.49.1 From 13c58d027072de4462dd0cd0d874a66f323c4dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 14:29:06 +0100 Subject: [PATCH 53/74] Decimal refactoring --- src/schema/decimal.ts | 33 ++++++++++++++++++++++++++++++++- src/schema/jsonified/decimal.ts | 30 ------------------------------ src/schema/jsonified/index.ts | 3 --- 3 files changed, 32 insertions(+), 34 deletions(-) delete mode 100644 src/schema/jsonified/decimal.ts diff --git a/src/schema/decimal.ts b/src/schema/decimal.ts index cb16e42..5f946b7 100644 --- a/src/schema/decimal.ts +++ b/src/schema/decimal.ts @@ -2,4 +2,35 @@ import Decimal from "decimal.js" import { z } from "zod" -export const decimal = z.custom(v => Decimal.isDecimal(v)) +type JsonifiedDecimalBrand = "@thilawyn/zod-schema-class/JsonifiedDecimal" + + +export function decimal() { + return z.custom(v => Decimal.isDecimal(v)) +} + +export module decimal { + export function jsonifyDecimalSchema>(schema: S) { + return schema + .transform(v => v.toJSON()) + .brand() + } + + export function dejsonifyDecimalSchema>(schema: S) { + return z + .custom>() + .pipe( + z + .string() + .transform(v => { + try { + return new Decimal(v) + } + catch (e) { + return v + } + }) + ) + .pipe(schema) + } +} diff --git a/src/schema/jsonified/decimal.ts b/src/schema/jsonified/decimal.ts deleted file mode 100644 index e638a80..0000000 --- a/src/schema/jsonified/decimal.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Decimal } from "decimal.js" -import { z } from "zod" - - -export type JsonifiedDecimalBrand = "@thilawyn/zod-schema-class/JsonifiedDecimal" - - -export function jsonifyDecimalSchema>(schema: S) { - return schema - .transform(v => v.toJSON()) - .brand() -} - -export function dejsonifyDecimalSchema>(schema: S) { - return z - .custom>() - .pipe( - z - .string() - .transform(v => { - try { - return new Decimal(v) - } - catch (e) { - return v - } - }) - ) - .pipe(schema) -} diff --git a/src/schema/jsonified/index.ts b/src/schema/jsonified/index.ts index 6bff7ae..d307697 100644 --- a/src/schema/jsonified/index.ts +++ b/src/schema/jsonified/index.ts @@ -1,16 +1,13 @@ import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./bigint" import { dejsonifyDateSchema, jsonifyDateSchema } from "./date" -import { dejsonifyDecimalSchema, jsonifyDecimalSchema } from "./decimal" export const jsonify = { bigint: jsonifyBigIntSchema, date: jsonifyDateSchema, - decimal: jsonifyDecimalSchema, } as const export const dejsonify = { bigint: dejsonifyBigIntSchema, date: dejsonifyDateSchema, - decimal: dejsonifyDecimalSchema, } as const -- 2.49.1 From 94bb18721946846c9bfa17143ed920c48db1c623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 14:45:54 +0100 Subject: [PATCH 54/74] Finished schema refactoring --- src/schema/{jsonified => }/bigint.ts | 6 +++--- src/schema/{jsonified => }/date.ts | 6 +++--- src/schema/jsonified/index.ts | 13 ------------- src/schema/lib.ts | 7 ++++--- src/tests.ts | 4 ++-- 5 files changed, 12 insertions(+), 24 deletions(-) rename src/schema/{jsonified => }/bigint.ts (54%) rename src/schema/{jsonified => }/date.ts (54%) delete mode 100644 src/schema/jsonified/index.ts diff --git a/src/schema/jsonified/bigint.ts b/src/schema/bigint.ts similarity index 54% rename from src/schema/jsonified/bigint.ts rename to src/schema/bigint.ts index 635e234..079f598 100644 --- a/src/schema/jsonified/bigint.ts +++ b/src/schema/bigint.ts @@ -1,16 +1,16 @@ import { z } from "zod" -export type JsonifiedBigIntBrand = "@thilawyn/zod-schema-class/JsonifiedBigInt" +type JsonifiedBigIntBrand = "@thilawyn/zod-schema-class/JsonifiedBigInt" -export function jsonifyBigIntSchema>(schema: S) { +export function jsonify>(schema: S) { return schema .transform(v => v.toString()) .brand() } -export function dejsonifyBigIntSchema>(schema: S) { +export function dejsonify>(schema: S) { return z .custom>() .pipe(z.string()) diff --git a/src/schema/jsonified/date.ts b/src/schema/date.ts similarity index 54% rename from src/schema/jsonified/date.ts rename to src/schema/date.ts index 8af03cd..287121e 100644 --- a/src/schema/jsonified/date.ts +++ b/src/schema/date.ts @@ -1,16 +1,16 @@ import { z } from "zod" -export type JsonifiedDateBrand = "@thilawyn/zod-schema-class/JsonifiedDate" +type JsonifiedDateBrand = "@thilawyn/zod-schema-class/JsonifiedDate" -export function jsonifyDateSchema>(schema: S) { +export function jsonify>(schema: S) { return schema .transform(v => v.toString()) .brand() } -export function dejsonifyDateSchema>(schema: S) { +export function dejsonify>(schema: S) { return z .custom>() .pipe(z.string()) diff --git a/src/schema/jsonified/index.ts b/src/schema/jsonified/index.ts deleted file mode 100644 index d307697..0000000 --- a/src/schema/jsonified/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./bigint" -import { dejsonifyDateSchema, jsonifyDateSchema } from "./date" - - -export const jsonify = { - bigint: jsonifyBigIntSchema, - date: jsonifyDateSchema, -} as const - -export const dejsonify = { - bigint: dejsonifyBigIntSchema, - date: dejsonifyDateSchema, -} as const diff --git a/src/schema/lib.ts b/src/schema/lib.ts index 1323289..1208dd9 100644 --- a/src/schema/lib.ts +++ b/src/schema/lib.ts @@ -1,11 +1,12 @@ +import * as bigint from "./bigint" +import * as date from "./date" import { decimal } from "./decimal" import * as effect from "./effect" -import { dejsonify, jsonify } from "./jsonified" export const s = { + bigint, + date, decimal, effect, - jsonify, - dejsonify, } as const diff --git a/src/tests.ts b/src/tests.ts index 8feea0f..57a5ddc 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -31,11 +31,11 @@ const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { jsonifySchema: schema => schema.extend({ - id: s.effect.option.jsonify(schema.shape.id, s.jsonify.bigint) + id: s.effect.option.jsonify(schema.shape.id, s.bigint.jsonify) }), dejsonifySchema: schema => schema.extend({ - id: s.effect.option.dejsonify(schema.shape.id, s.dejsonify.bigint) + id: s.effect.option.dejsonify(schema.shape.id, s.bigint.dejsonify) }), }).build() -- 2.49.1 From 1910c9ff9faa21d512f995f89120454be7753d19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 22:12:23 +0100 Subject: [PATCH 55/74] Static trait refactoring --- src/traits/ExtendableZodSchemaObject.ts | 12 +++---- src/traits/JsonifiedZodSchemaObject.ts | 42 +++++++++++-------------- src/traits/ZodSchemaObject.ts | 30 +++++++----------- 3 files changed, 36 insertions(+), 48 deletions(-) diff --git a/src/traits/ExtendableZodSchemaObject.ts b/src/traits/ExtendableZodSchemaObject.ts index b7eb3d7..d8d271b 100644 --- a/src/traits/ExtendableZodSchemaObject.ts +++ b/src/traits/ExtendableZodSchemaObject.ts @@ -1,4 +1,4 @@ -import { ImplStatic, expression } from "@thilawyn/traitify-ts" +import { ImplStatic, expression, implStaticThis } from "@thilawyn/traitify-ts" import { AbstractClass } from "type-fest" import { z } from "zod" import { Extend, StaticMembers } from "../util" @@ -18,8 +18,7 @@ export const ExtendableZodSchemaObject = < .subtrait() .implement(Super => class ExtendableZodSchemaObjectImpl extends Super { static extend< - Self extends AbstractClass - & ImplStatic, + Self extends AbstractClass, ExtendedT extends z.ZodRawShape, ExtendedCatchall extends z.ZodTypeAny, @@ -29,12 +28,13 @@ export const ExtendableZodSchemaObject = < this: Self, schemaWithDefaults: ( - schemaWithDefaults: typeof this.schemaWithDefaults + schemaWithDefaults: z.ZodObject ) => z.ZodObject, ) { + const t = implStaticThis(ExtendableZodSchemaObjectImpl, this) return expression .extends( - this as unknown as ( + t as unknown as ( AbstractClass< Omit< Extend<[InstanceType, ExtendedValues]>, @@ -45,7 +45,7 @@ export const ExtendableZodSchemaObject = < Omit, keyof ImplStatic> ) ) - .expresses(ExtendableZodSchemaObject(schemaWithDefaults(this.schemaWithDefaults))) + .expresses(ExtendableZodSchemaObject(schemaWithDefaults(t.schemaWithDefaults))) } }) .build() diff --git a/src/traits/JsonifiedZodSchemaObject.ts b/src/traits/JsonifiedZodSchemaObject.ts index 07f1a6e..7302621 100644 --- a/src/traits/JsonifiedZodSchemaObject.ts +++ b/src/traits/JsonifiedZodSchemaObject.ts @@ -1,4 +1,4 @@ -import { ImplStatic, TraitInstance, TraitStaticMembers, trait } from "@thilawyn/traitify-ts" +import { TraitInstance, TraitStaticMembers, implStaticInstantiableThis, trait } from "@thilawyn/traitify-ts" import { Class, Jsonifiable } from "type-fest" import { z } from "zod" import { parseZodSchemaEffect } from "../util" @@ -80,45 +80,39 @@ export const JsonifiedZodSchemaObject = < static jsonify< Instance extends JsonifiedValues >( - this: ( - Class & - ImplStatic - ), - values: Values, - params?: Partial, + this: Class, + values: Values, + params?: Partial, ) { - return this - .pipeSchemaIntoInstance(this.jsonifySchema) + const t = implStaticInstantiableThis(JsonifiedZodSchemaObjectImpl, this) + return t + .pipeSchemaIntoInstance(t.jsonifySchema) .parse(values, params) } static jsonifyPromise< Instance extends JsonifiedValues >( - this: ( - Class & - ImplStatic - ), - values: Values, - params?: Partial, + this: Class, + values: Values, + params?: Partial, ) { - return this - .pipeSchemaIntoInstance(this.jsonifySchema) + const t = implStaticInstantiableThis(JsonifiedZodSchemaObjectImpl, this) + return t + .pipeSchemaIntoInstance(t.jsonifySchema) .parseAsync(values, params) } static jsonifyEffect< Instance extends JsonifiedValues >( - this: ( - Class & - ImplStatic - ), - values: Values, - params?: Partial, + this: Class, + values: Values, + params?: Partial, ) { + const t = implStaticInstantiableThis(JsonifiedZodSchemaObjectImpl, this) return parseZodSchemaEffect( - this.pipeSchemaIntoInstance(this.jsonifySchema), + t.pipeSchemaIntoInstance(t.jsonifySchema), values, params, ) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index fb479bb..4720ca3 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -1,4 +1,4 @@ -import { ImplStatic, trait } from "@thilawyn/traitify-ts" +import { implStaticInstantiableThis, trait } from "@thilawyn/traitify-ts" import { Class, HasRequiredKeys } from "type-fest" import { z } from "zod" import { parseZodSchemaEffect, stripZodObjectDefaults } from "../util" @@ -59,42 +59,36 @@ export const ZodSchemaObject = < static create< Instance extends Values >( - this: ( - Class & - ImplStatic - ), + this: Class, ...[values, params]: CreateArgs ) { - return this - .pipeSchemaIntoInstance(this.schemaWithDefaults) + const t = implStaticInstantiableThis(ZodSchemaObjectImpl, this) + return t + .pipeSchemaIntoInstance(t.schemaWithDefaults) .parse(values, params) } static createPromise< Instance extends Values >( - this: ( - Class & - ImplStatic - ), + this: Class, ...[values, params]: CreateArgs ) { - return this - .pipeSchemaIntoInstance(this.schemaWithDefaults) + const t = implStaticInstantiableThis(ZodSchemaObjectImpl, this) + return t + .pipeSchemaIntoInstance(t.schemaWithDefaults) .parseAsync(values, params) } static createEffect< Instance extends Values >( - this: ( - Class & - ImplStatic - ), + this: Class, ...[values, params]: CreateArgs ) { + const t = implStaticInstantiableThis(ZodSchemaObjectImpl, this) return parseZodSchemaEffect( - this.pipeSchemaIntoInstance(this.schemaWithDefaults), + t.pipeSchemaIntoInstance(t.schemaWithDefaults), values, params, ) -- 2.49.1 From 8089aa82b44213502ee22697926a5e639147b117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 23:37:36 +0100 Subject: [PATCH 56/74] Added tsup --- bun.lockb | Bin 160864 -> 177705 bytes package.json | 1 + 2 files changed, 1 insertion(+) diff --git a/bun.lockb b/bun.lockb index e4a74877745ebcb758c51e99996c0de9b8de72e4..a84ecd4ee4392000e28218230dc9613bf52a3986 100755 GIT binary patch delta 38678 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

cSgaUMt$w`KJf&OuYc#+Ae=o-LKge!vX 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 Uk?g&BYz@(uG1S^41|}N*2eSh4lmGw# delta 29064 zcmeIbd3;UR`p3WbmXH$;VvLBHBtk-hB!pw0a!jGbOhgbwB8i$MrGsh}-PJ{v(pF1b zo!jVDr88-@MSBfJX|I;ntQ0MN?`IE}d#~H?_r6}g-}m+V<8D6ZSVo}d3!zM;wS z?6R~v#$!*tHlw+2&IpVuOslAAwKT0L85xeO?dXBX8tBI>Xj)z5r^wpK^~n0j`;m2! z;~m-4iH~;l@<=J~VtGxgiQMMZH2xQ@cI3-dHLa|s6&Ae#QI3fI)$D{XpnK4-p_8EK zQFM`WkWfXwP&<8oX7=5gd7Ab)x}=|(K6!Fheu35kUD9XekI5;Z!;wzq!(AlE%m{0P%@jsyl7eXAsj={)XNU?-#k+s+zD;DMDOrAU~SJVE#7^*@U z!+##DDY@A(`8jz7gK2pP@kNn#Ln5PW(}p`TcUo>bNwg!5ULMJC7fotxccjFTc^Q&Q z)5cPcSSmYfN>(;wg`oc&ouci6i^(7f7B{gAD&5pBXaG_ybRJ$zc^qBF_yD>L#dvF^ zHO(Jur;kHQL)trfL!=DJxMp_z2&4x+ESCDEU=InTrX8SkfV*wRyM@oagY+>uKI=tpsDyuL*25W2DFPKIWCbY6E zZi18^Vj`(W%gT?*kWfZeOxBcfIoeUuOZbV}fO%%o&-; zOn6x|NgeHu=cX4-h+(+el22A&^-gvJ$|0qp&7Jb{va<8i$7$O5$vI=FU(@dGY$uS( znwy@V@A{e35q5(f?qXMT3@H{!C%rUuR#$tdvyozX*OIPEYs>tcj7d_^F?6wWR<4w( zY3tEt;A-}=o1d3ikT(-PGcPYDBWG-82PeLnQ%*gkn5D8KGpCR$Ysz@l-!A7glJX0S z`Vo+Xu6={aAa=ak$8OL`q?qB}yKFrpoqrQDwFU!i`_Dj1cXMO1)1|E!9e%(dyP-Xh z5?>i!%Gu+$bq~7b|G%XIX~2;*JHoZ&0(cp~f@$MoCSsCpxI@v)46&E$2;#;0Omp)0 zMoI;(v5;(3Ylhl8=sifbf}$vRvGmqqc6_Vh?2t^fqOAm~B3m%(Qb0pw1>|e+n5ZZc zSsuw+&zU|&(;gaWH)In-C+Qg2jF`ze<2_VR3H>lV6kZ!`H(<=PtjYM={Pm;krT#m- zSojL*YD9K7DF~@Bf)!8}x!rG$DHl<=H^XjM&Xf#UVcPV(^xRy={-0MuMPe;q zF=aw#URFUqj%sq&_z49&$S=j==xC*;jT&cHGd_LVcquRtPV!xYmvlXl_<*9*NDN+B zlui%F(8eSPG0+wkymYX3mTj1dj(ig-1-wqYbZ|;eZh%p*JfA)GhpAs-3zd&$i>3 zy!4DrCTtfVc3p&&`Ev*X3<%B;70U(z4pJH#KFjV#7KKAEk8lnP#-W0$iIDdU?l&+hRGhhKygi{31`%UJtHV1)*{ zd8P8JL03aEC*5edYo)oN%I464qfgzuwlw|n2Zeo(<$Skgq;I70?$>97zB4CO?O>h@ z$u&1rJrNXj{>a(<>gS5hrPYoGz1KhML*vHYrDksR9_CjS>zYX+q2}i5QBl_?>#ye4 z?{ctK{bLQbd+NV4RDbf@ZofU1`%+Hao0HFEtT{Dy=)l8mw|6m*Ru45thcq{@RF5)? zDh_@$B(!3UN|h$x)u6)He=odlX!DAXEYMmW3oH5L**8D>=B<58dc4suv|oU^v{G|( zN2P^ttPPI}_AJ1jz35^oGo)Ff@nt!4QCFX#d(D!rK2HICZ%bUD8B#aV*jC<5>E;V8 zz`#Sz-rbS|zaTW&3PoT%n=2yJ-{STV8f}H*D{0zrEA$AVu~z5;p^;XoA5+c_y-dhX z7tAS*%}pR=*Rh?@AS*{ToMxd@S6%`A!cdA3*6v^KQg zFhgPzjlk+=u;1tL;c__nC<-uByCeqALA%S`HLgV0zG3`uHqqUQ*j-N9v1iJs8f*o8R5+#Qi<46SW0O7eM@L-x0--Oc!xs$&MH z`i#DH%#>80XIUM$eao69dVcu3Ms`n~x|-I(s&;pDqA{wjnbO~9yi(U(gt%1K3~uEM zjIO6?!%T0hL8DPbIF5HTcuf#1KIy1f{ZkO!oO{fp4 z3^O%1DF7u&Xk%}*89d16(VN&U(acoFsXdyc4YXRh%86r=MkabHHPy6^#Oda;$i%=A zXl>2jjgvhq3CS|mt+74V)GSH!d78!8W6RW_6ZfDsBS|?kH8n9XEtY0mi$oFXA|cPW z!jYnsxokmF5NSK1Fk2Y>JTzyx(OyTBdBwt~&!^DD4Oo5lL}9iRD_=+~`Ou^<_Comr zO)OVR8e~+8GfRg0JWs^g6=6Wu(jhcSVh=-IR*(z>TCYUUFf>`3EUAZ+0#N#yUiyBL z5a(=?h;DXhp=mwP?9o|>CaVKmG9KSaoVob^wm~i34v4|i(WFky-#XE=9*zHYlZ^u{ z&ESzfPnTA1%a>8dLNuo#XrG{AIopkRenq1}(n$Ikkzl5b@_B~i9wdX+tH3AFk}Qkw zad_K2v5B_nus_AVg4WL}DAkwfxrrvjfv>>FbWAcAb?|u#nc-3_lRP#ta4VYS_dJzb z+gWWRW}wMvk#%IEvAVSxJjUla1S#vo9<(aNOP?)I=;?tbUBGBqXO^R3PzL)18vmK@ zskAXB*&g~bmX_~mR++{t$!2gfpC^c^A#L=?{586@H5WDW8H?JQCB*G;;sPvNm2PJ) z%J2ntY)1{2b!JP5tYswH^A?&+GuyD|+nFUzeV!f^eQWOB>u9X#_DQ^o*3nGK^aa*q5LvRR$(|8}qymPeSz_QSG}dEmvga2_u$6U^P! zT-3xD_<2{c?5>Dp&s5UemX!{?h$byz7@`sbFQaubcSR=~ow}RBu|Cf{7Lcqcs~?_E z(CoxafWQDEx>?4GO6K_yE(G#5N_6D06ol?!_Um76=@P*4kVgnQW}BSy2d|FY6<-6hsy7OoOA$xv_rQb&rtJv$+7-Y|MYya?!Mq{lw zaZjV!V{V}^2mX|+YpNQ%+; zZ@aj_kYSoO#`Ml_8$>{i$}WM4_o7J_+o-9-IgPfmNZcMYhRiO&=sdy>Zu#sX=q36IS~I^U;#b-fi0k5nzHk^CTeMwaGGEjt?!xa!gMUV&TcQ1pgx% zPLV?6#@JS~O(0**iIXE0E8t7CcysZ{wn1EG%Q$(geS9pMJn+MwB&KRd^oCG&iquuOXaGQ8M)5SrA=8bN!+(a6r} z+9zoCV9U@4jI)cjn(di{CIewF>KD zTVs|cOt^gvC!$FYndJ8-1)<0gGUi>Ag0kFIEXK9Y9k(ZR zr-`C0|i4t&AO$%#vtdVEM_? zIXV68MM#=#dy>b5w;Lc68%>7KI_)rwY%}G4Utrs8*Y(XKBrUS**^b6uE>^-WH_>D< z+S^y}DR#f?)7l5nQi!8p`AGpN)+wyv)eVGlP?Tp06QgH(;k=zp0pSC*dTCN#6%e;;a*>z!hkC{oJ-e1f;pv z#uHel!0KKz&PWK^-IJEDMw86gl+%|31?Hl5KBLJrv!tERGjf`pl3w8vADd>T_Ojs-g;dcH%GzT0s%=Gjvfn_=BN zGtL!{XEO_Ao|<<$$NlYep8 zElAO~0XhCmN-5icboN6a)8Jzuhe(P4L==wOWm)vyK;rjUH!bY|pB7;i^tGjF+Mh`& z;2S5M$THxNqu(wi-C>9SSLw`riI9XxoP>WSrKd-obRs3+F-I3E`uC20CmBfGPe3gF zi#RXIa02F%Gca{=Qp>3>! zN}&l6V6p!@shh`DoqCcX*vWOf6zi1}-V9t(r%-HB2~F54PU_pGP*wR5S4v~_tk)tE+(HBAnqp=flyA&$g;YCWYiKB~@0%IKg&!lW{ z?MWvM?dqiOs&kGh1$2iHu7?vLQi44lU8Dq4_z;WrMT%P)iIg6vBc+@Sq#UGott&vxV#iR2I|!5l}wT}o|J;idKhCthSZ^dh8C_c(ICBNymg zG)Tt#B=(=AQ1?3tA8_PCk>=JX>J&;fOVA|uGNc^0ONoEX$+g@`r<`=ROX=<^c#%&z z>DD>&87KYiQtDf;Q>|`RT@_g{`x{8f@unl+LQ3*tAss2zY;oe>b>vn@zK4{t z{Ls-qLW*zv($T*{%4GQ~QVwK)tHON_AyR_-`H+eaI{fWY_(KjaQW|vB(M1NCy`QY^ zfz(b4YYu#}j2Y$oJCNr`Xn@V86h;|%&QW>0hy+(}A{ z+Y&EHe0)g8_Kxh}$c_@pAyVQyIkL0Eij}3QTeMKa-NA zmy=GU*_$r|MQc7d++&wr()^R ze|k|+_`kk7pl~_;r~pE7a9*_?C*Rrfc@_r z@#nl0e5Z>6Xp5H$|Ma4Oc>Chul3D$~7YF~nIQYkl1=(BvdvWmJivuna{(Eu2TCgq_ z#QFdC;s7K3_u@cKEb8$g^1l}cw_g-s5KVMhEPr-UAn7DtEcpN1i-T%+zBqVe=F4A~ zGus{an=7_>&E?1adZc;mc$(ScU9Z{oN59_KT=rv{9&MiFvx(X9r!>8(xsuNq^E{ui zX3rC8dNXq!pUusye8!onC)4zJb0eQEO#SCHy`?#X&sOGZd?uKlU()nMGyRt|bI1E$ z^W$IqdTTS}RGK;C1Ft#llwVIa-~TMljQY@P?m}y4);OJJ?nj$@+OM}accLx)$ZN)& z@#`JUnP<|>q>sJkVYJR>*3)c# zKFz#>w)(tZ_nRltHtg`4y)XFn-sZ{+Y3AUaUh_IyU$f`MG&88gYi_#e*Hg`_Xq(YS z{OZ>Sm^=5SnG-(qns1>EG&k-|GebZ3n%+x(J#jod>JJEu^p}SZ8`c!k~RjNlj zjFxXUzDD(brMuVs`ZV(ZTIfEy`@3JCZa(-s)uWw8n`yTGgX;Iw-9P;LZ1W^q)B(DC z-LKCzS6;`wXxGsS&7L`|CUPVj#mhRs4>kG_{H!<(G-sN81uiv+P2%TJU z$h&+i+5^g?qxLxLRoOcFgJ#Gv42=4*s1KbU4i#g#_ifxf)7?l)Fy z>ig3AAalkKUe&b>#41faS_UHOZ(emth}D|v6a=v!Vto+AQ<}OU#KPlVHP8dGPE${N zAd-Ics=#1~XEfD6SRZ6OtEm@6uGf@NRv)B4XKp-_W<0N{p=ibiO}#F1qo#t(Az#qc z7?Ce(>MtT+(o`ica+9VeihNm9ABcQKQ(@&P?NxKx$7%X&=E;xg|1XTuCw~16bLA)W z{uE<`_LkZ6Q~G|IG5XYR6l*GveCCeR*seUyd`DCDD?rRRgYharY|+#nA)?MQQ$FgNd8}Dl>x}tRYyjLx*NahbUbx?>C=b7a@{QAeHzLR0U z;59RM`t?uE*U)-g^qN&m{Q6Eay@Wx(=vD1P$oiS47KM;?!>?X-T8LemYEubf@FlNW zU5R1)()4U&)GxCvw)yql<~wMc(Q0k?>wC?t?ezIKoB-N4W{vmh^A%Rb`+j|&xf5*% zTFeK2{eU@>{>-?F>-xyAe`_B5h}nG&*Y&YqKWtvbR{POL?C=}kY3gTbz{20Xs&{2t zbWBrERE9|U!>g_f@q?yPsz988*i?lk9yha&(ckMdCz%UX zA+A7pt3mw2G^hr#;igw@72-7Wpt?S2`Cy%;Q61te69Ga6=`giIVa_uZLSZ%wvrCwZ zOokdT6L`*E&8-1*NmC`lgqDJd34{4fQ?tTgb_jD=n5zt4O_&)0FpF!#{LbhJ6BP*4 zE*$1MgAxw2UzpRv++cdYVcq1JS!SL@BkhHpB@bt_u;Ude(th z5d^WR4n!GsRfrxQh!J%mJZfWIh$}*P>p_%NL+U|n2!_}ygjad$LkuoUD7!vH1@(>) zLFFK7HGl|FSq&gI3$aUx%Bn^~hzVYZxeXzzs+~fFmWPOG1W{ehYy`1Gh{HnEP>mxX zW>kP!905^N9S|a_B1F4Lh+68wNQnJHoED;vY8?f!Fa%PA$rt-7?A+cQ*BIuxFUo%5yG#A zBtmSc3$ay*-pZ2%F}NN?b`nHi^^Ooh^&x7thDcRetsyoGu}g>nszw`#2@N3Twt*O^ zb_x;N5F#cSB2CRq=3|EthlLoT8n=a*(FkI3TZm!mfDlm;5bfGQj8G4@gV-;`X(2|b z);@@Zkr1nW5b5fq5J^!Gz1u@%sFm#@P6%;bh)mV91H_8P5Suzcj8|8M=n)Muq9a6> z+Sn1|iV)sT5R=r9P7oWKKx`EvTX{M|3~maM-5DZBy(2_W3`DIitmLV>`Im2SBM@e- zzxs`Q-JJMWoJcJCF7#=-8MY4>(hPm>KEE+tH|y`mfrx(Je!nqOH}|0PJ^;3c1Ab$+ zZq7e|^N2$~jy_j6;}7CGL|=Z;Zxrh0_vj1b(Yt=@H}28RN537Ul3Ji&LSLYpoem9B zCq!R=$Zy=In-|bmv_v0x*l#?bn@=Aeq0t-3=jQ}=X-*et|xAxst517bpJh~+&XmaAhzgtmd` z+7m*lWj!Hw2ysb>m8xS3#EfK!^(hdm)OjJI+CmIuuIj7RI+;xSg$V2g@svvK1+lOl z#9KnFQ+jWRBp*a(Z-{4#U+b;6D5cJ&>TT89K6-#U(NC|Uwhz^V0$=6%k_yGUQ}r)( zb9=1-_3&`Whj_HctKu^CN!8pp7GzA$ij_Y=m8*=&VZ~u1^hLV4v{sar=^slfW0h3V z{R933jqJZ?Q{__i&BeK+^q^8?tRfkU=Zw)i7}BmCq6Qaqu#?W~puR}u>_!^2eXJf- zq3NtQ8s5O~- zSYUfUNrkR1v^RSae?7>va&vn*^lYm+`B~%h3v%)@OZO?BGEN^FSleyihhywN^^=;W z@OQ^C<7ejT8O1+N(nspX>2a!Cw*H)vII;Llww|YZLvrM)4XvmNvRv`har(_tR`Kp1 z{_UAl{PI-&a=+mHato8A;8_*+neHpRannA8b8qIlH*{QGny^|DaJV;k(#yq8x>|%U0XZIVxY~p-Ta0}dUW%y$jyv2^J6)kx7s7pVMsCkb z!g}Bn0@9;L9j-p%9S&zArFRX0JlP?Ka=3mG>ZHGR>e&S*KoM!9Ih!` zO^18loeVLMwH$H-QkGXNC;@WF81mn`<0wyF$?+0|R4g~~N=ty_WhY%6VGo=%{uPId zCtS_pUUj&_7LY%pNRM7~$d-gk^iRx{oo)x_%$X;XcxkNcaPb(KLCy zf&cPks#ceZrJ-*-Tx-I7Gugz7EOy8?kYav`-0W~`pC!O??~5wpD}7>w+$|mqhJc}9 z7#I%ZuCh3;{$PNi`s~)D%P%3{Qm_m>s;L{h^{~Q~gr5Mbz>`26+Zyl`SPRyHr@=Ge zS#UR)4rYLvU>2AS=770i9>9xeMc^JVA1na(0&$Sy5M?yP`WU-V9(R^Up)Ic{))MPT zhh^!@QlA7S1G)Vzx5P(*(Lg+AKOo=3`9U0r2Q5HL&o8E6jT)$Tod<-#O_Z9p<;3&dB-lTA%Q zBM=FqfcVQ`P!@=vyhgvoH$D$GfQ{e<@FI8#YyvNXSHNrFb&wAVKn55KGG(caBaj9L zgCSrj7y(9t(O>`=2trlQz51}i>I7v?%5>C$e1|FDd&-jp~@4*k?Z{RpM29AL5z+2!=nV-`Lj0Y2dcp`bE zL!Kw;0y+YDHl+xDGDrtwz=z-?@G;m4N`S0=S=Ztn9|8@5xZvu*1LSGK-@qAg3j734 zFl5@#;B8P0HiJG?*d55jEb^d>JQR~n0bhaLU=R2jd;`vcL*OtFxBDG<3akYWgHI^$ zQ%%j=tw$7YBm5U2&%($9Hs2C2-Z2=QB>Xct3XXvvz)#>=unsH%hspa5*bfeXgJ2KX z3$}yz!3SUq*a|vO?g8@24Te)P)Tc!O@;vE>;0)pVKpulhN6!OO!5|=Bb_SRL#)EO7 zC%7NH0y=<-pbWT3`d>jQ!ViM`z!cCGd;)fW&vb_R3j*S1SAia&5~vLRAoC4y1)Ky& zfq2{V;5Tp;+ytSZ2B-;SPm+9s(_kNZARP$;vcJfF@;A62opi=P0@A|Tpbn@Dz9!?l z;5|^64B?NuVug0}_FxQ>owbjmqe6^}s^e{bZ{Q1__`QXbDhKhPKS0lk4VsT=4Dx`2+LgLI%1fzCi8djUV_0a8Fu zAQ=aOyMXvMX|VXcG$%Y5IUEcFt}h&@JO}mULh+}MVzFglDOdz#{)n%e3UWaX5Emi~ zP&~jSa2Z`DeFeg@l79iRh<^e{!FS*b&=KqcB|zr8`0WqC`(TP}c;d{Z5l@44U@ce! zo&YPs3Xl(EQAlCAAjb*IVkrRg!E7LIOw!y9W`UVt2AB@!fO`N-;O{&0Owo!U6j%-( z1B<~!U=er_+z;*r_kjgYcp>ru@GvleqgwM zBnz(aBR+P5Pr=9F6R-n(4n6~4g2UjiU@zDWz5;uk@Yl$1z<#g~xD`nwq!MY^0dNpV z1BCk)90Jr`XzfMEQGNj5gJa-t;74#0oB$Jb+X;?Cwg%;ZoP(Svt~oLhv;xgQEcgSy z0aDz{CBnag)8Hbw03_d8a7MtLh@1Of5D zQmBE{fd+0Oq#?fnX~6G5I(h|M16M_t@xKAC18IanDlbg|(n4{70U!`aoLfj)bT?d; zuvkNeN*W^h#iP3oktOO{z&&e_xh7jjp}7AL;8xs`i0bI#=B4*xKwQ1FTr3bySmuFi z9pNNheIWaqG(y4+9X$pa4LZU%LN*2wAPPjvhA0Ywzn>sV52R4noGsAB5;D#*wo;(T zj&O0vcqiNvDV<0_N<$=lM|43FVQKVuq|BjYAakRQY=|=BGf~EZc0kr;8dCPE?m*69 zJHp8Xk`*Fpx`D2s3+M>i10U!BIssV`osq%|*BA5xJ%MbxeL!!}tB?;rc#aJ2@<>6K z@LkA$Kq~1EQo#T)2*^Z~v+_GlM6rU5{}ABLf!inJV0cL*C@hWQPP8$E(}BB8MiCwf zWJugX-2%^$Stiy9AQqBB#X`f7!+}h&+pRPjPOKsRLh?$U3>p89C~~oo1?oAFF_KDU zP0LtIC9;${I%%h%OZ)@iJ}?awfP9b#?gjI}Y#`j-U^*B;{u#)bU>2Ao<3E?cJwS${ z2uSAnU;(%vJPaNJi@_sc36SA2kqSHxmOJ4U$R|L5;-5i24c3CEz>`3}O_SBI2CN3_ z%JVVdEj~DgU(}1=_+Agui;w)EA1oDKkUu$V41Bkz4!`hp^(|KnePn!Wi`eE&Bd@CX zn;shOzI%1R+d-B3zmoDgDdJ+A$HukRa=mKG?|P^)$E!w?GQoX)Z1Kj36N`6$@Hr`4 z#>U0Apc!8KWnde+AMDz7^K;9Hp$@6#1+RKZYH?r0`uN-aXMz$x`i&ILV_P(jjn}q$ z)zRPd`0&puqb$~Y^J?vbON-WQuA=+eCC19myU(j)uTcMSQiPCV_UB1&-goKDzFR3S z6B9~I)$tXN^ovd@z7Ixvinw7b(u#A?%RLY-2HA$)}FvTQY6NTU68#;o^Oubpe?VWH}Y-}Smii%|9M?|Qu93svW2 zwtgO}g8$It`~7PUUzj~h-M13|lANBtGro_9+Tvnc#wIk6bKhHB9QyI0ufDqRH)7&t zEwtojfqIxyjeTKi`ycehy`hk^;>!y27WPsV^<$JSGt7NgvHOxbt8{BEY^Ur#^A!Ooz3*Z^+!SV|rFl!^s;yo+|24%NvaXMl?ThU*%gV?ysPh zO6hl+-F6wDlD9T_f9%*O=u+n{AKl7(yn;F+dG9p4?Y!>$wrkDms~?~9P0_8q$rV-8 z^Ll7C_qERp^HxP3Uf9!Xr%*+@QA4%Ap$CS$uSGmOcG(+a<^?o!%#Mq@KSGVZ!2m6Z zP_u4es8tc_WznCFP&-856rujOq4x^6-ZM!D@;3hRdiBEj(;eee!rllq_9iJ0MX06K zjVg~mU3SCD5jxP;~T;9hBHR?q! zpJ4O~ci*=ASfj3^{-_a9VpYUEW?PJ0{*@7$;J)6sUi*h;=6gSyN&=b8Oau2#!R|{C ziAltfvk=Eds@l2{8t%R-xcHo>a^+GF+)s*@wnHz9RQ+|Mm+?)cTB{rJ#?eUiwa8y0 zRgi(yqEuUhR+f)agAAJKzTkTA(h&oQGH-S=OYkK6sXcRp%4(u!fJbK2ZgjU=xzpeYZ6Q2X(w>Lv7W z_l48r+xYr?o&QGsx~&_XU^4Bv2|XZ5XTOkT=|Y zNB75Jx%)2pYIGrmGiBPxs#m3S_if%Se*1a&EBb~qw^IE3yd#>a8Wzm*DUJPm9^4alLsn$Fi8K-)cre*)W?K9(4QE5hh`@fdq%(TUE z>I=&FleW9B49{*{d&~=ujp=LX(rwwCzigqx%TT}j?(gqCO^dT9H@SGL-wCZ$zcR+S z1o!>tNhu{~;#Y;uAVo`hm%ybBTNmdQMSIe|`Tn~LOCP(Hw^pJ$C8fJBaqqbITP<|- zlue{yJCg>?NK|!$X!`=Ei~|SzO!%Qv;{~J;S4^MXcT~GC6Lm^wyjLZvDdY|R_jzw7 zsi%Wj2QRfz=SXS1-9`m_n5o;^D4z#?M;kR*^sn2fheiLcjp}s@$6PZ=)id`kK!d)l%ZuFCvJ&IWXj&L9wPYo$FX)pI z-a*wpqgUloo_=Taa3iyWnsP?(Wh8Y}@17yLTqjjNn2uHNq@seEZtg3>-FLZK1zU|t z@2rmgOb*v2SNKJ*8a$DUdG__9dpoPxU$Be&X6irkivbpd4B1o zb2C=7VIH}8AMT>&kk>fYMdgOml0f3wDHwk70gA^` zv8}j9^V^f?(B|ixKB1?tCdP3f5BgQpvMeO`mC;?V?h5*AQR-PzI1Y5XUyUxyLfPY2 zk0BG>*L}BbI{)>{Va=>s=pFrY-{*a1_KgAN-qFF7;kfoIe)R{n7@l6LS~<$9*-O1w zfm+>nly@E7@57hETH&0mS}|4YUTR)BqljAH_8NvB?!N7Ot3H3%>~8IckkZ+tM)Xm& z%i~7e_o5HpT(j!rg9%-&6qeZ+^sxu?!l)CF1Rs$4~5oN=tLDyV3@Y4q!_qC<>cE#3Fr?|jAgm$7%Xt?Lwot32J`b}d)E z_1~)6VeL6XKMYfmsjP~;Mwmf~pMx|G2TD+d0cpdf%XaZh>Hn_;qJTj1NZs$f~Q**-AdVGkorPW4&ceJ%9!Iwn(9}D1~`*JJz0gGZ5ymM3whhg zWO$h&_CkLmLx| ztp{(4-fR1O;pK^!^J$3V4&ClkOiB$-RU`NkM!ww`pZm(mVavBSy_M1#8{>^J>T~RC zyy#ay)}UhBON6TX&+yo8orXpk)ho;h3wPgx|3tst7lwZExHzJCd;d+%Q1ioR)W1KY zq4!^f8DAJXGSu3dbc3qT)TFAt8LECbIo;pk7_#k5;FCvAM^UyoBF)P8>b$r#Z0)vjv+pWcHLp8l(RQVbSXPp!Y2=;S5l%`Ej2c@5hg#~ZdIt{O;3|5INa?>eA6O=Q`2F~C2%rvJS= z9_RYq@H_ZKX8}GrNrl&=EBMBK$Z+>Z9mZ6tzasP1+Rr(i=33PDntyNaKRL`$Rl7dR zYV#y@q#>?la($zZ(O{r@w>}QS{V|feo}2Y@?Kx4;Ql_)fI4<<|X*{?At>HxL;Ra0W z*R$0@WVrj25D!m`sct^;)OWW^a95`z|J@k^BSZU_(lo=_<<$ob@qSKw-K}0#Y(%?V z7gIb{?Ksb6{s&XlALsRP;m%Jx6g@QdvDe-`xKmmoBg6*uN}if`ffJ)`d1}Q4a+Kt$ z&qdnb4<&TTw@-Q6UEKa!NySzZ$S6BFGs*oGih#lKckL?u!pFoo*ByuQRiBG|nd<%y zMeyol2k$NOLkp`?Ykr1KQ%_#hdnNp9v!qol3(fs)iU-OxUeo)T*Pkb^c!Ad3d%0WH z{*|*}_s1z-KD6ajz5J$Oq;O8T+@GNsl=@kp^onnON{r(WBWI|`8ZjvD4^lLH-nae7 z`^NA^o}BfHSLb@+4}5gE`;!#r-d{?+_x{aI0c>N|w}kRlWAh07!Ma)YS8dOHwqoW} z6Zd2pdbGWpYcCKZUlV$A+J5qL>JwWioon<2z7=uv{%eYPP73!IEgJRv^hCs#3$)BF z)&8oyY8^5C9D8}Uc)Q;6SB>>t;&Ux*jpm9uk4Msa_jfJ^{8BAp(9En$w4enZiL9^B zQ7t2lE)BO(gq*QQ4!4VXX5!t`X5JW9iZ40UbY- zF;9I(in1Fn+F$!m_*GXIBaMzcLvM6a*P@t@H6v6?W21Ih%?SJC{)e-b=j>0~r>*$a z&axxFcz$DJV>z`X&Zt>Db(ry(UMeFePu(1D%vSGqH`5_`i^8Xs+(ej6%QF{vSMH0=Y|l&)B4TcQV4%(LqMT;?9Le ztPxIbewry}de+#234G8$eu-sDru@)Pj9PQQQAaiFz{h*-3}2x2rJK@yjN8@@Mq1g- z?3{^NF?pHeGiRuJxm*l2?`Ui*R`(cPNiY(sQ*T~b=44GalQ;jhJ#b-7d$wB`QCsB3) diff --git a/package.json b/package.json index 738f57b..2803954 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-ts": "^3.4.5", "ts-functional-pipe": "^3.1.2", + "tsup": "^8.0.2", "tsx": "^4.7.1", "typescript": "^5.4.2" } -- 2.49.1 From 2c3996a9bc1d20d59851d0d88fdfb7f6ca7cfe1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 23 Mar 2024 00:55:55 +0100 Subject: [PATCH 57/74] Dependencies upgrade --- bun.lockb | Bin 177705 -> 177706 bytes package.json | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bun.lockb b/bun.lockb index a84ecd4ee4392000e28218230dc9613bf52a3986..50ca046cdc1662b72bb11e0895c33172be381ad3 100755 GIT binary patch delta 15531 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%0Dbv-S$ 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 NEVgn+q-AH>{{Z2L9q0f6 delta 15551 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 O)SpFE&Fo~_Ui#l<8zfHv diff --git a/package.json b/package.json index 2803954..31d1619 100644 --- a/package.json +++ b/package.json @@ -38,12 +38,12 @@ "clean:node": "rm -rf node_modules" }, "dependencies": { - "@thilawyn/traitify-ts": "^0.1.15", + "@thilawyn/traitify-ts": "^0.1.16", "decimal.js": "^10.4.3", - "effect": "^2.4.7", + "effect": "^2.4.11", "lodash-es": "^4.17.21", - "mobx": "^6.12.0", - "type-fest": "^4.12.0", + "mobx": "^6.12.1", + "type-fest": "^4.13.1", "zod": "^3.22.4" }, "devDependencies": { @@ -58,6 +58,6 @@ "ts-functional-pipe": "^3.1.2", "tsup": "^8.0.2", "tsx": "^4.7.1", - "typescript": "^5.4.2" + "typescript": "^5.4.3" } } -- 2.49.1 From f0b2e5242d9aeba6143024ab129587b6b58fc075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 23 Mar 2024 01:12:01 +0100 Subject: [PATCH 58/74] tsconfig.json fix for build --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 5470793..c8b2ea9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,7 @@ // "allowImportingTsExtensions": true, // "noEmit": true, "declaration": true, - "composite": true, + // "composite": true, "strict": true, "downlevelIteration": true, "skipLibCheck": true, -- 2.49.1 From d3588721a52a6478b8ea962c6c8f86ac032c319c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 23 Mar 2024 01:19:07 +0100 Subject: [PATCH 59/74] Exports update --- src/lib.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.ts b/src/lib.ts index 593f780..8d3cdc8 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,5 +1,6 @@ export { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" export { ZodSchemaClass } from "./ZodSchemaClass" +export { ExtendableZodSchemaObject } from "./traits/ExtendableZodSchemaObject" export { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject" export { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" export { ZodSchemaObject, ZodSchemaObjectTrait } from "./traits/ZodSchemaObject" -- 2.49.1 From 7f0d894e9362b86615aaef65ab66a40f709489a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 23 Mar 2024 14:28:50 +0100 Subject: [PATCH 60/74] Build system refactoring --- .drone.jsonnet | 4 ++-- bun.lockb | Bin 177706 -> 154440 bytes package.json | 19 +++++++------------ rollup.config.ts | 43 ------------------------------------------- tsup.config.ts | 11 +++++++++++ 5 files changed, 20 insertions(+), 57 deletions(-) delete mode 100644 rollup.config.ts create mode 100644 tsup.config.ts diff --git a/.drone.jsonnet b/.drone.jsonnet index fefec26..ecbbc49 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -16,8 +16,8 @@ local lint_step = { local build_step = { name: "build", - image: bun_image, - commands: ["bun run build"], + image: node_image, + commands: ["npm run build"], }; local pack_step = { diff --git a/bun.lockb b/bun.lockb index 50ca046cdc1662b72bb11e0895c33172be381ad3..50ef8b827880a37f1bd49dd1e6cc4a259be57bf2 100755 GIT binary patch delta 26849 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 delta 40354 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

!(fH*3ywP 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 - defineConfig({ - input, - - output: [ - { - file: pkg.exports[name].import.default, - format: "esm", - }, - { - file: pkg.exports[name].require.default, - format: "cjs", - }, - ], - - external: id => !/^[./]/.test(id), - - plugins: [ - nodeResolve(), - ts(), - - cleanup({ - comments: "jsdoc", - extensions: ["ts"], - }), - ], - }) - - -export default [ - createBundleConfig("src/lib.ts", "."), - createBundleConfig("src/schema/lib.ts", "./schema"), -] diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..ed2a957 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsup" + + +export default defineConfig({ + entry: ["src/lib.ts", "src/schema/lib.ts"], + format: ["esm", "cjs"], + dts: true, + splitting: false, + sourcemap: true, + clean: true, +}) -- 2.49.1 From 36f987e18be646b6e288bb7a12982363697d1ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 23 Mar 2024 16:50:49 +0100 Subject: [PATCH 61/74] Dependencies upgrade --- bun.lockb | Bin 154440 -> 154440 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 50ef8b827880a37f1bd49dd1e6cc4a259be57bf2..6a3dbcc116f52f30cc4f69a9d15d2dc50b66166a 100755 GIT binary patch delta 165 zcmV;W09yaZwh73#36L%z`EN)ga4(*9C^u1ZmziF_bQlmZ9T+<%9u&#nUwt9^u}(@G z0TGkI87H&A8@+x&r~ClaD!4?zwEZ7XiNvUS+f-P8+!^haO`C8n5DrIm-3WSzv2QE* z&h4kx*ie~cKW)m6appd Date: Sat, 23 Mar 2024 19:52:44 +0100 Subject: [PATCH 62/74] Fixed extend --- src/ExtendZodSchemaClass.ts | 56 +++++++++++++++++++++ src/ZodSchemaClass.ts | 4 +- src/lib.ts | 2 +- src/tests.ts | 9 ++-- src/traits/MobXObservableZodSchemaObject.ts | 6 ++- 5 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 src/ExtendZodSchemaClass.ts diff --git a/src/ExtendZodSchemaClass.ts b/src/ExtendZodSchemaClass.ts new file mode 100644 index 0000000..9bc2c97 --- /dev/null +++ b/src/ExtendZodSchemaClass.ts @@ -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> & Values, + [values: Values] + > & + TraitStaticMembers> + ), + + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, + + ExtendedT extends z.ZodRawShape, + ExtendedCatchall extends z.ZodTypeAny, + ExtendedValues extends Values, + ExtendedPartialValues extends Partial, +>( + class_: Self | ( + AbstractClass< + TraitInstance> & Values, + [values: Values] + > & + TraitStaticMembers> + ), + + schemaWithDefaults: ( + schemaWithDefaults: z.ZodObject + ) => z.ZodObject, +) { + return expression + .extends( + class_ as unknown as ( + AbstractClass< + Omit< + Extend<[InstanceType, ExtendedValues]>, + keyof TraitInstance> + >, + [values: ExtendedValues] + > & + Omit< + StaticMembers, + keyof TraitStaticMembers> + > + ) + ) + .expresses(ZodSchemaObject(schemaWithDefaults((class_ as Self).schemaWithDefaults))) +} diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts index 19ee1e9..1b4b9a1 100644 --- a/src/ZodSchemaClass.ts +++ b/src/ZodSchemaClass.ts @@ -1,7 +1,7 @@ import { expression } from "@thilawyn/traitify-ts" import { Class } from "type-fest" import { z } from "zod" -import { ExtendableZodSchemaObject } from "./traits/ExtendableZodSchemaObject" +import { ZodSchemaObject } from "./traits/ZodSchemaObject" export function ZodSchemaClass< @@ -20,5 +20,5 @@ export function ZodSchemaClass< } } as Class ) - .expresses(ExtendableZodSchemaObject(schemaWithDefaults)) + .expresses(ZodSchemaObject(schemaWithDefaults)) } diff --git a/src/lib.ts b/src/lib.ts index 8d3cdc8..b7d4fe2 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,6 +1,6 @@ +export { ExtendZodSchemaClass } from "./ExtendZodSchemaClass" export { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" export { ZodSchemaClass } from "./ZodSchemaClass" -export { ExtendableZodSchemaObject } from "./traits/ExtendableZodSchemaObject" export { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject" export { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" export { ZodSchemaObject, ZodSchemaObjectTrait } from "./traits/ZodSchemaObject" diff --git a/src/tests.ts b/src/tests.ts index 57a5ddc..fc6421a 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,6 +1,7 @@ import { Implements } from "@thilawyn/traitify-ts" import { Option } from "effect" import { z } from "zod" +import { ExtendZodSchemaClass } from "./ExtendZodSchemaClass" import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" import { ZodSchemaClass } from "./ZodSchemaClass" import { s } from "./schema/lib" @@ -47,9 +48,11 @@ console.log(JSON.stringify(jsonifiedUserInst)) // jsonifiedUserInst.dejsonify() -const adminUserExp = User.extend(s => s.extend({ - role: z.literal("Admin").default("Admin") -})).build() +const adminUserExp = ExtendZodSchemaClass(User, + schema => schema.extend({ + role: z.literal("Admin").default("Admin") + }) +).build() @adminUserExp.staticImplements class AdminUser extends adminUserExp.extends implements Implements {} diff --git a/src/traits/MobXObservableZodSchemaObject.ts b/src/traits/MobXObservableZodSchemaObject.ts index c9913da..9c3a409 100644 --- a/src/traits/MobXObservableZodSchemaObject.ts +++ b/src/traits/MobXObservableZodSchemaObject.ts @@ -8,13 +8,15 @@ export const MobXObservableZodSchemaObject = trait .staticAbstract(Super => class extends Super { declare readonly schema: z.ZodObject }) - .implement(Super => class ObservableZodSchemaObject extends Super { + .implement(Super => class MobXObservableZodSchemaObjectImpl extends Super { + declare ["constructor"]: typeof MobXObservableZodSchemaObjectImpl + constructor(...args: any[]) { super(...args) makeObservable(this, mapValues( - (this.constructor as typeof ObservableZodSchemaObject).schema.shape, + this.constructor.schema.shape, () => observable, ) ) -- 2.49.1 From 727ab43448d538f7752a9a7ee30d3015d994e10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 23 Mar 2024 20:23:45 +0100 Subject: [PATCH 63/74] Upgraded dependencies --- bun.lockb | Bin 154440 -> 154440 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 6a3dbcc116f52f30cc4f69a9d15d2dc50b66166a..e23eb40c98567a669eea548bd5fe88ff0f58026d 100755 GIT binary patch delta 165 zcmV;W09yaZwh73#36L%zoM=eLB(rk#clUKc?#q@! zT|p-u7X_Fvkl`}=8|ftR#Yzf`qN=8~gT0!!y_x}83jsK{7p4I{KNL7GbaG*7bZKUJ TEp&4&FfK7JF*vtq Date: Sat, 23 Mar 2024 20:58:34 +0100 Subject: [PATCH 64/74] JsonifiedZodSchemaObject work --- src/traits/JsonifiedZodSchemaObject.ts | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/traits/JsonifiedZodSchemaObject.ts b/src/traits/JsonifiedZodSchemaObject.ts index 7302621..342446c 100644 --- a/src/traits/JsonifiedZodSchemaObject.ts +++ b/src/traits/JsonifiedZodSchemaObject.ts @@ -119,6 +119,35 @@ export const JsonifiedZodSchemaObject = < } + static dejsonify( + values: JsonifiedValues, + params?: Partial, + ) { + return this.of + .pipeSchemaIntoInstance(this.dejsonifySchema) + .parse(values, params) + } + + static dejsonifyPromise( + values: JsonifiedValues, + params?: Partial, + ) { + return this.of + .pipeSchemaIntoInstance(this.dejsonifySchema) + .parseAsync(values, params) + } + + static dejsonifyEffect( + values: JsonifiedValues, + params?: Partial, + ) { + return parseZodSchemaEffect( + this.of.pipeSchemaIntoInstance(this.dejsonifySchema), + values, + params, + ) + } + dejsonify(params?: Partial) { return this.constructor.of.pipeSchemaIntoInstance( this.constructor.dejsonifySchema -- 2.49.1 From 100df15a0723e4b6656148c414768198f782f9b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 02:06:27 +0100 Subject: [PATCH 65/74] Fix --- src/ExtendZodSchemaClass.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ExtendZodSchemaClass.ts b/src/ExtendZodSchemaClass.ts index 9bc2c97..5038c48 100644 --- a/src/ExtendZodSchemaClass.ts +++ b/src/ExtendZodSchemaClass.ts @@ -6,7 +6,7 @@ import { Extend, StaticMembers } from "./util" export function ExtendZodSchemaClass< - Self extends ( + Self extends ( AbstractClass< TraitInstance> & Values, [values: Values] @@ -38,7 +38,7 @@ export function ExtendZodSchemaClass< ) { return expression .extends( - class_ as unknown as ( + class_ as ( AbstractClass< Omit< Extend<[InstanceType, ExtendedValues]>, -- 2.49.1 From 77a3d58933462e5cdb0ba2affbb948b39450b06c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 02:51:25 +0100 Subject: [PATCH 66/74] Fix --- src/ExtendZodSchemaClass.ts | 4 ++-- src/traits/JsonifiedZodSchemaObject.ts | 3 +++ src/traits/ZodSchemaObject.ts | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ExtendZodSchemaClass.ts b/src/ExtendZodSchemaClass.ts index 5038c48..05143de 100644 --- a/src/ExtendZodSchemaClass.ts +++ b/src/ExtendZodSchemaClass.ts @@ -8,7 +8,7 @@ import { Extend, StaticMembers } from "./util" export function ExtendZodSchemaClass< Self extends ( AbstractClass< - TraitInstance> & Values, + Values & TraitInstance>, [values: Values] > & TraitStaticMembers> @@ -26,7 +26,7 @@ export function ExtendZodSchemaClass< >( class_: Self | ( AbstractClass< - TraitInstance> & Values, + Values & TraitInstance>, [values: Values] > & TraitStaticMembers> diff --git a/src/traits/JsonifiedZodSchemaObject.ts b/src/traits/JsonifiedZodSchemaObject.ts index 342446c..34ee1c3 100644 --- a/src/traits/JsonifiedZodSchemaObject.ts +++ b/src/traits/JsonifiedZodSchemaObject.ts @@ -85,6 +85,7 @@ export const JsonifiedZodSchemaObject = < params?: Partial, ) { const t = implStaticInstantiableThis(JsonifiedZodSchemaObjectImpl, this) + return t .pipeSchemaIntoInstance(t.jsonifySchema) .parse(values, params) @@ -98,6 +99,7 @@ export const JsonifiedZodSchemaObject = < params?: Partial, ) { const t = implStaticInstantiableThis(JsonifiedZodSchemaObjectImpl, this) + return t .pipeSchemaIntoInstance(t.jsonifySchema) .parseAsync(values, params) @@ -111,6 +113,7 @@ export const JsonifiedZodSchemaObject = < params?: Partial, ) { const t = implStaticInstantiableThis(JsonifiedZodSchemaObjectImpl, this) + return parseZodSchemaEffect( t.pipeSchemaIntoInstance(t.jsonifySchema), values, diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index 4720ca3..2efca03 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -63,6 +63,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { const t = implStaticInstantiableThis(ZodSchemaObjectImpl, this) + return t .pipeSchemaIntoInstance(t.schemaWithDefaults) .parse(values, params) @@ -75,6 +76,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { const t = implStaticInstantiableThis(ZodSchemaObjectImpl, this) + return t .pipeSchemaIntoInstance(t.schemaWithDefaults) .parseAsync(values, params) @@ -87,6 +89,7 @@ export const ZodSchemaObject = < ...[values, params]: CreateArgs ) { const t = implStaticInstantiableThis(ZodSchemaObjectImpl, this) + return parseZodSchemaEffect( t.pipeSchemaIntoInstance(t.schemaWithDefaults), values, -- 2.49.1 From 9aa25a351d0bdc28ea32f1b444f7a37244a5baf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 16:06:24 +0100 Subject: [PATCH 67/74] Added types --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index aac51c9..e858356 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "files": [ "./dist" ], + "types": "./dist/lib.d.ts", "exports": { ".": { "import": { -- 2.49.1 From d9493ab198d305e4125b6a716d74734926c7545f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 16:35:30 +0100 Subject: [PATCH 68/74] stripZodObjectDefaults work --- src/util/zod.ts | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/util/zod.ts b/src/util/zod.ts index 05b00a9..62d15be 100644 --- a/src/util/zod.ts +++ b/src/util/zod.ts @@ -11,15 +11,32 @@ export function stripZodObjectDefaults< >( schema: z.ZodObject ) { - return schema.extend( + const s = schema.extend( mapValues(schema.shape, v => v instanceof z.ZodDefault ? v.removeDefault() : v ) as { - [K in keyof T]: T[K] extends z.ZodDefault - ? NestedDef + [K in keyof T]: T[K] extends z.ZodDefault + ? Def : T[K] } ) + + type test = z.input + return s as unknown as z.ZodObject< + { + [K in keyof T]: T[K] extends z.ZodDefault + ? Def + : T[K] + }, + UnknownKeys, + Catchall, + { + [K in keyof z.output]: T[K] extends z.ZodDefault + ? Def + : T[K] + }, + Input + > } -- 2.49.1 From 4a20846058bbdd76c9babebd5ff16cc455127657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 17:19:59 +0100 Subject: [PATCH 69/74] stripZodObjectDefaults fix --- src/util/zod.ts | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/util/zod.ts b/src/util/zod.ts index 62d15be..efcf26c 100644 --- a/src/util/zod.ts +++ b/src/util/zod.ts @@ -11,32 +11,15 @@ export function stripZodObjectDefaults< >( schema: z.ZodObject ) { - const s = schema.extend( + return schema.extend( mapValues(schema.shape, v => v instanceof z.ZodDefault ? v.removeDefault() : v ) as { - [K in keyof T]: T[K] extends z.ZodDefault - ? Def + [K in keyof T]: T[K] extends z.ZodDefault + ? ReturnType : T[K] } ) - - type test = z.input - return s as unknown as z.ZodObject< - { - [K in keyof T]: T[K] extends z.ZodDefault - ? Def - : T[K] - }, - UnknownKeys, - Catchall, - { - [K in keyof z.output]: T[K] extends z.ZodDefault - ? Def - : T[K] - }, - Input - > } -- 2.49.1 From 466cfe5919514545f20e0e48e6e99ab6d5e37ffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 17:28:55 +0100 Subject: [PATCH 70/74] Fix --- src/ExtendZodSchemaClass.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ExtendZodSchemaClass.ts b/src/ExtendZodSchemaClass.ts index 05143de..e65ee3d 100644 --- a/src/ExtendZodSchemaClass.ts +++ b/src/ExtendZodSchemaClass.ts @@ -1,7 +1,7 @@ import { TraitInstance, TraitStaticMembers, expression } from "@thilawyn/traitify-ts" import { AbstractClass } from "type-fest" import { z } from "zod" -import { ZodSchemaObject, ZodSchemaObjectTrait } from "./lib" +import { ZodSchemaObject, ZodSchemaObjectTrait } from "./traits/ZodSchemaObject" import { Extend, StaticMembers } from "./util" -- 2.49.1 From 79da11f2e0f204c89d6da668b7e18720cdfe02a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 19:37:33 +0100 Subject: [PATCH 71/74] Tests2 --- src/tests2.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/tests2.ts diff --git a/src/tests2.ts b/src/tests2.ts new file mode 100644 index 0000000..b61c281 --- /dev/null +++ b/src/tests2.ts @@ -0,0 +1,20 @@ +import { Option } from "effect" +import { z } from "zod" +import { s } from "./schema/lib" + + +const schema = z.object({ + id: s.effect.option(z.bigint()) +}) + +const jsonifySchema = schema.extend({ + id: s.effect.option.jsonify(schema.shape.id, s.bigint.jsonify) +}) + +const dejsonifySchema = schema.extend({ + id: s.effect.option.dejsonify(schema.shape.id, s.bigint.dejsonify) +}) + + +const jsonified = jsonifySchema.parse({ id: Option.some(1n) }) +console.log(dejsonifySchema.parse(jsonified)) -- 2.49.1 From 4c82f05f9f9b816ff4d79347835e7bd814c0385a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 21:52:02 +0100 Subject: [PATCH 72/74] Fixed Option --- src/schema/effect/option.ts | 12 +++++++++--- src/tests.ts | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index 30e3fd2..8908d0c 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -54,9 +54,12 @@ export module option { schema: InnerS ) { return z - .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option.Some") + .custom>>( + v => Option.isOption(v) && Option.isSome(v), + "Not an Option.Some", + ) .pipe(z.object({ value: schema }).passthrough()) - .transform>>(identity) + .transform(v => Option.some>(v.value)) } export module some { @@ -107,7 +110,10 @@ export module option { ? z.output : unknown > - >(v => Option.isOption(v) && Option.isNone(v), "Not an Option.None") + >( + v => Option.isOption(v) && Option.isNone(v), + "Not an Option.None", + ) } export module none { diff --git a/src/tests.ts b/src/tests.ts index fc6421a..d73750e 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -44,8 +44,8 @@ const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} const jsonifiedUserInst = JsonifiedUser.jsonify(userInst) -console.log(JSON.stringify(jsonifiedUserInst)) -// jsonifiedUserInst.dejsonify() +// console.log(JSON.stringify(jsonifiedUserInst)) +console.log(jsonifiedUserInst.dejsonify().id) const adminUserExp = ExtendZodSchemaClass(User, -- 2.49.1 From 75b240c64a5de055a7e7d83d93800fb1d09df24e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 22:16:57 +0100 Subject: [PATCH 73/74] Dependencies refactoring --- bun.lockb | Bin 154440 -> 154779 bytes package.json | 17 ++++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/bun.lockb b/bun.lockb index e23eb40c98567a669eea548bd5fe88ff0f58026d..1fa311a30d1131e4a696606c3bb24cf81e628ce2 100755 GIT binary patch delta 19530 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 delta 19515 zcmai+34G4S_Wz%WJmf*_+mncWCn1O=RAMQ`BNQbs`7TX=zu)csKd+wW%;(IRnRCvZnfZR7m@eAxJG8|& zH>%;4l%dg`I^LVn?fSdP6FRlNyZuV@1CMoXRA9Y)sa7C7|0?D2l#qs_(z7#0O!3Te@GEedN~|Mes7^Q2)Yy@^F`N3F3&42r5^cU;@ylSX9>8-=GCx#^SB;hT|* zM=$#Afybpy7!^4teadRA5C=3|4Ba2*@t~5w5*`k3%$LY@m?zJgyMwqT7LTfG^Br(& z&T?9|lF*Kum_23K*x~8xkc)>oV>2^lHYZp2cp|`$!>P(obZ|Ym3|JIi1Aeud$HRa5 zAMjNRz5-5F{)^Qfu?wReg@9Ah6fPZBfQ!Y&;4<*r7%Ee+m@lH9KP4?IQw$8%zTl>L zKi0MV{=J^V_4*f>`v6Bo55v5Yr`cBeqGaBKd*ID+l?j;4{2sEh_vh} zS!ol7jT)9VOk(5t2VIG~rK0WD+2gVzbI0aPXiFVyA^&P~JB{YFu&sR7;koHqPo(Ft zVu^u_J|!(PGb48b*)UF=$n*Tt(r)ks4P=04V{Ef8J3Pl8-}4azNW5faX3+yo?D7mG zxg;#d(3ko*W9@#b$Jza4!ezdS!&y`L_u-=dJ$h9bKY!%d306k~TH6iU!Nrgs4sHRL zcuj2MbO;wuY9SZTOT%Sg{gB=6e!MLoLTIF&D`!nTAp_M;unp)=eT6&}qA5sz-k_mm zN&#FfeLc~}haLGSCqiTx(f4@zfJM*O-Wj-^-LV@P^oB`{hGj%%WRDo@>4Ls^J}NCY za!OiGc3W_Q2yS(-Egsg<-bDMs#qt1L>Mv6-c;>@)eLkH^1n$S_r;F9g>)qK_bH!c3 zQr*tst>7{P7nwnkyEC~LOjhNugO`K58_1$Ac7Lxs^*I??IcXz29u1bA>KVAisa7{D z@Vb78zvg6QV(OHDJ=U1a^oco`IWA}H$ei@t+)+9$Bvu9M1tHb*lF^lkoBpWHbH@%F zlZ$ToUba0M;{be4Q!jQWCE4!hq)*71f;>GZCsH=D9H&0b>8B4|5~q{H)3eda$R2sP zkKIr8$E^PI@}EW^itd_thz1gv#!g4!@G{^neVutpV-=1{_w?;&2VgZ^oE;aLl{OB8 z>L%Or=io9=Q{htI2|ej27zYHm0T-8)4`l!`piGKgktOc)+1%6aV8X-^k)x5_rd~RX zA7E$N9O|opSHPux9$W?(!vK}w#|GM4_C|OFcmQ&V^v%cZ`jM&Z$dd9mDM;$353)Px z2QLl2j9gM81ug@Ss$(Z*dpx@a+lDk?>O_xe9Tu56c4Qj{C(1TtWMb{PrL_uci0;`JJOIT^*VvDw4qjPy*(NgFqg zx&Pmf0UdPB5|#6Q9d0*fRbrFJGY^tZN2X02Da~U!ZzYkMz-5rB)K`XA2ZzGbaAzo% zk47$|UeB<-d33ZLg$@q?3NG!xq+Yzq9y?C9t~^iL(4jf$Pk20TX6NSSpyKhknMnHl z#{~K&(;o05Tsn52f?PL0MlR8^6NiDB3YnH?aJW2tD%|I3!}D2pdp@raM)6<=xEB2A zIJ@KZU>P8D?C`W)yzap~iU+ZJe96iU-C3>fNGmyfL`L@TNFEU~NJVKqNN*@vIb{$& z3o4FQNx1u<;sHyP2Tin%Y)k-Tj9(q!g-tQiWhVBdQq}#U!l}hFRArVFoh(mX_FAQ zlZljiTCxL_?Ao$8XAjn&l0DcmN_KZ&{UK{gkn9%IDcLRdQwmu9l_E5D+hj_%-Wz|& zu2Zu5Q-gF$?ZlwpO6rBR6V&6n0B|N$ht)|?4RuPLL^W71;Cr1esFN6Ur<4w>o1mg} zO5H@2sTc4~1>YgsUoTNTrBmu92AwUV7uHKq<#a*4L|+nF$FZ94(=~g<>6H43zHg9l z{1E80+Oc$1P(M*Ur~M5Qy$8#ot5a*Y@y#M9rByMR4Bs)3%w18PRzKEPslp#KSwB|w z)+r4Wy_=Br(-Bc^e8nqr6rvkqwd~@cV4YSs)~i7sbZY%JK^H6Pg^dz?;cRs>Oo+Zz zFV@!=B*PT5&^!lOg9aU~q!%`(0gGLF_vvNWo}&Ft64er&(j?J$jv7gyB6?ZfSYJGQ ztLOz=T}^Tj-eCU)5DA_iB>wx#u*um-JnaDLY}H8;&e#5^MBiy-ac7s)UHRG8>5gCuRJn-CWQXa!&Z6w5WVhYOPYQa!Z4b)x#GPHCO!J4ub`DZQ*- ztn%psWCI%6L18m%66;$9auT6oTnHf1wiLUg8oS9Q){F&-H4I5It^$cQK~@rf4U$Cl zS_wY9i5+MBB~jne{P5QQBkO7qNM?vMV~nK^vRe8sfb6&}8yy!C zWv7`v-~iAct6sgL{fUXbL&z8fla`U-KZ5L)aj8zMuS?TEA#XnDVQVT6Na+tZ{G_-n z5mp~@9HtA}C8|Z*-#*cIgc{MaR)Y%H3y_VBw)^y0vE8Ws9TI)N5Cw@Q8v~QOu!TEi z;_4X(SpihFwZCJcFPTgb7mHd!odzw08{&e>;%aWAA};K@!9e zoz^NY!~xdc{)-Hr^4GddLRn-9#x)WI^Ax(q}s*_`+iCzCBuE)gRP@-bgfj z*yPj^RZwF>+MYUcr%tT*3D86OeBCy_cPPnjVei{Mz2K2VZQbk-vSW%EIWuK21r($Wo6La_ByO*g0E?ZKjnuv3&a$2<}G*Rc6d}r z_YjalCV?KcI=a-FZb2x^+%kv{Tf_jeyHRY=BMSXEya z^h)%N=wvSn`#4?-5=Nty0wm+IK{k%{ z*61opx};GX-w;Y-IVVRz;4#d>-?Y;*a= zt%K|lkn}=^^o;er2f|d2$Fz*N5Yj@{q`f9Cft*lOjrCRUWzPaLgqedu_BJhPHVY)P zVQrY+gCOf6jH4lM zJnaKOQdh(}?q3DT6oDGYss4K5FdjZrYz=$AOaa+3zSJ((_Z-NXHlnyoFBqQayN`@* zRHm|fT*v@>Che8K07Me7Kx8BS8f1q@9H=?a9Y#*H!62fCA#ze&1EDO4Kz4lG;~Dw~ zS`L!*C@N>A&zowuv%~rfXo#gLb-{x;HQaV;qAnPj=-Z7opv;qfg~lZ zCE!!T?S!$T*a0M?`mAH)6_7pg67M6RX4J7MvforpcN1pW^tcd!R9QQ-Z#GDp*;~jy zkQmD|ZsXXX-_rHM>;zx;5$>ia{=5j1Q91LOk-ZM0IS1Jtkl1eLN~@7}*S76TK<%t{ zk}KyycIrzn?MK-oU{dQ??@OQr>zF)7i8UgoqE#=$oiRz=QJ})vTny@hrWKi>-!pVr zPJ(aHXm>pm67TDRbSfwIZAxM$(?yar9rMQoVb}zaM8`f7-vHUsAuW7oKmqECTkUFR z+L}I{mJk;Lc$g~t`O<)7`IpgH8uV+X9#B8Q+b&Dol4JKtN@A>?ARma_LRN}r+r3(E zma3)pKauFmM%KaZd}Le*!1i16_IpsG)mUN@J=R{G_A5#rNG6k&ft%Yw_9~NL6d5P^ zCdSB5og@odm&V2g18f^BjsNoz)m@N2AJ)eAG$rYjqo0WE1lbc*lhi1eV;?zIW_jBQ zvYwE#DRrie9q&yb>A`-{zTqJ2QNq_C*B;egRue!H8G8?W$3gbY+ydE4PSUBt1iPKR zcV>X39nVv|*sRbg(-VDPBa=OixvL)=RBNKO{bx>e^KRL&ShZ58%t%y4^a8#g)&+b| z*8V3G)drpNWMa_wPw0hD%KLJ`lh14{`S*S$^}DmWQSgWAm_>n&;}*QH^z20ed5>C@ ztcvUC#mTCKp1C+#zqmM5Utb(hp*ns^vMQzL@m*S9_^zn$@?A;y`e(ALtXJ_}MXP1W%CA%S4$~X>4%fcdlT}rn#&?9?&UZCk_Fu`W zy3XLchTg|_P3?apS=G|x`L3-G^Ib>RT%N4z>M6^U_2lKD`uy^Ms;?WqnXDVU8LDT$ z8Q>S30?-*y+Z6%TSkGL6A1m+!6shA^ChNGBp?b;6fNH9*fv$p*Rs~eFUa%@zzq%?^ z-vhPKT~{aTE~`WJ+SLISqwj+5fKt~4RIFaLCRwjs6RJbs3aEIU@>a6$|5m8p1!|*x zYm;@z+EAUfHlW(-?VxR-h;;##s590j>rv}M^-)lJ?SDI2S9v>B&v-kaI_krqL!ij@ z0o6%QS&x6~@elNfZny#eHsIfefcypmIsG+NKw-Ns~22@Xd z4RjThv?-u^=>?ncZxjB3`sl8k@ozK!Z4Riu`Yz}WD0NFfCF@mN@NWzLZ4K~?Ps&#O z+lqgnf!enX|F+@Zwt!02+dAb|F+{FC{6p{O;$toc)o|}!+a0dHFqSd zbUlUd5&AgaBXz@_c(xPIb_P_2F4&o@M(gNZ$!d(A$#G_pr+`Q_wedH zyaG+rzWsQ$AFuWY)C|2Hv<(z-AfWPe#sR!KfLEZWwEul(?R{qL{eXH#9|j!)MSc+A z7riMTFl!$$YoHf&!-M#C5Z?|4)J$CfIshfKopS@Dt6dkMQp!{5u*@3v|j+ z{5y(&phepEG5&pwe;)_<^=><88z|zFfO<`5e1d1^=5&td* z)F=8H=qf1b-vM=8FZeh9{Tu&4Cw13L_;(5aE(O$Q`Yz}WDD{hgI;~fIfq!4%-{pWR z&?%Sk?=t>@&S~G5`1d9LeHl>a^>)xUP{fshx~Ma*;NKPe16|Vouki0H{QD}PF6+af zL!ij71L}&N@-_Z_jenr8b;GOpcNPDx2GliO06GI|do7^8)ibZ*-!=RLUDxs7;NLg+ z_f0_E)Ym{)K}p{R)NQ@sTm1VL|3E+JuHWI`clh^RK>eieg6@D)uLsmGdewFOyN-W1 z0_v_#xq*K-@DKEx_T9w4oA`G#pzi7IplzUtTY;bl9zFV2KRxOe4&DkVrTw>Y@HP(K z4shfh1|0%LejiX?J>`2G{2m8E#dO0TaPS8l{J}chKxaU0e+}GOT?Hlm9FQaKXB_+)2SMd^*I#h(7aaU0Ajcf&4k-0bKn}V)ICuvK?*`Q?K#n`mHc-TG0Xgt~V*-D}KTu8W{~iB+$G_hLa_E5$fg^Vv2!fSG5QGLJh&L(0 z2>J&j*d>BC#^*&4;zf|DG=SA>{Y3M`Hz=vSA4?$N`Ac8X@Xj>dXz|1U;;Kkwyu8Sba z#Fs!2R|3J35(s*lYa+NRf~1lNdYJ_!5xiOw!95Z5FDuW=^Y!|^c5k!t8tcc*niU_WYAj`y8LJ(I8!IDY{#+qv)xGI9A$_U1r1(gxJS{cDT5#*Y# zRSIfQCM=-lOf|;g31ZPChwg!S(W@ZfpFV;YCT?DgDd`$##H4!YSiC~VoCW5OX zNUDWko>@=}!K<|p+!KK|U2ChGW^O$dY#yzns;XyARvpz-E!?`Rj`~&w9WQBC*Ha&R z@08|GwOeb(sTM)HOjvO716Axl`F>nw>+XiCw^IAJmTj!cd&!Nu&D1b&CEk@n&AvK3 z5um=cMzrehwL3B6>##cZwo)M#pW(%*I4=i59{vI^|1ySu4YtReZ>7enQHGx{!@c8q zRWB|rDoZ!MtTFu4EZ&vgHuGZDEETskB2EqTM!3fO#9Mnwr@w6enMmZwDdSpfo!?ds zR;s%BDM77J8C#bms$3P?kzT@3O@)^fzj_93&FrY^Boz;tt1!ponftQ&aIQ+oyZ^xc zh%AdLsZA1#`M6kMfhF;HvK^fw;B$^_tRo8s^MY!9#yK)CDB$!r-jNkWmQI;ZD^HFi zEC$N7g`QkT7J^KSkk151=A)c#_RUk}+e%aUJmFN8p!|p}TI_tcBN7k3JxHr?0kp!Nu zkbM5;$igWnSrU(D7BcatDilo_U-LY(9mNQQEhx)JoRDHQsHG#DUV~(cWyyz_yNgxrvJxZ7Z&~W>t)7x5dWjks zUy9-qXfgB(^fDxBe}nib$iojx9)8pEWI={BuiI1kj9;$F3=+m?hX$?y`Y{@64V2F6q4MOoP7-H=aeNkQ=x&- z07z0H6Dsa8rMGj%7GLZL4p+2>^clYLS4)u$oZdL=pX;j&-5CxXbmLwZ$ay!x1n{=TId~UE3_Hf2yKF-ehc&wbObsKy$9`u z_CQR5XQ#~7yU-43yHnl`-v#Z14nd-L5PBav0PTlF_XFrd=s0u?IsttO{TsRneGZ+0 z#IbYGSxBb2z$u@H=Uw3I5_A>%8j`Sm1$Bn5Kwm-~9o!b)9l8NshnhhzL(HS+N9YIW zXXq|;2a+>h9s%TWK^_U@$f^S=s2#+kL!PG-g+wR;DhbK?*9`JP!O%TADgqCJq~Qbb zedtX{c4OggxjE&g$ReRAs39adRS%NEC5mBiKU4*(tcbsKS`I1;m4Qk_Vn{Ja3@8DK zmvXEWhkOn$1rLR+BLOahSAvUy<>3{eijdU1eT4t1T$gekSq2iu%5dqRHrzEtR)HIV z2+GwUna3LNT2M_$I+u2mnDr?)fW&(_q#HwGxI~}{)RM9r9g&G%UUR;pAu&SA@~9!W zEz}y4j^)W99%==}LGrvNW#Mh0haho4I(4Jjk+MXh9bBeX`V%hwwTE}G%XyxMDTo)H zAsJX2h>}nj%3}2-xFk^klHBM9^*}xmJ^@OCE`mqG)1hRjJ0yKb{v-*3`$2u7$Dm$N zPnrK76dr|oL#;N|2jqIh4mkMIc!vW1(zFro`>j?N3&Y z6kdcRbbp7>h2}v2aLV)G8tSr~FFso?ZEf|YnyiYnh>A8Fcmq?r zP54UHLUk}bS1Nyud%^6&g*{8wG~X2;teQnd$45m+d)zB%hl)LFI$zCtudt?wSwhor z_s&|CUw@76eWX=-p+clNjsin`D|+sox6sNDUt7BFiGziDV@&l`*pL@&|C{uT?GLSN zSv2dbLIw94-MME*bdG-I?7qU9~e4aef`RW@0TV1yrWRTy&w2u@LQt> zmu)?{u%?S?yBeR}3x)fx%v)K$@*}?#DrB4SD5$5+EYX|qwOw!3{i7|*UfMLZQ12gR z&uaCFT5RU5LH%vBYK>}9-n}XE<#+Ff?X7X|c#zs*Zmv-^tGf3B8!cQn_l>EU(}L8X z=&0sV>~&{LnkH|lDnXY^n$B;j?&0pWwnY`UeiQcG&M{~N#`K(%OIT0Z?n~ynnBiWUd~0mRz5a z-hcJ6u0OtZB}hFP9TgqLq40irGj2VRaj#+C%T(*f)q41B;ZU~6s-)RPPvP#Z%9IaU z_5P;Y-S5yNelp@q<~9mgZw1J`UHRyfnL9t_HCe* zHs@gB?p?~eWz)ypZ+Ub9t*|mGx|wIcDg6#%buU>C={l@Lt(kqrOg1nX{;!(0^o%m8 zG*#=&q<0v1hgl=6n7IfGcdtV3s8Fd~>YN2n2P;M+gdFiEaw8VGcPD!-ym6!5Kabxp zR2Xg2P{4s{u&OJn*>^7EZcXc1s>}<=3-vyzX4Y?1Rbt%hnqRfA8}d`fhYu8L6s_*@ z)F3lr>#vP#{@bz6g*EleJu$+)0U9y2r@Auzv;0DZ$4&GmjF@Z!!a_~@CN(nXT3z$; zCe=LX$GRqHvl`LLy+Ao@_{$r1o;`e#pfO{T_3mBFJxvy!ZPT|(H!I$(MBWkVnWdZQ zz1U%fm_1SmGcMpD@oA$HS2chQ~+Em|yjqdf&;Qq}YJ6d%0`zScM+ROCWLa5#Q zpT(D4I{R#~%Pp)P$U1Tb88EMaxZ|sP^{t7q<_7$!ZIp4DxSBbM)p0R zHr2Zfn)*_=fK_AdW+P17tr+naS%*JvkIayFd7dHG;LPtTV5n*J>{&$mU-&an_XF&;#R9a1zhG1s+lBQtiFITHC3Kwb$`S z&CQLSs!CP&a^%)qzVhXZyzo34a|DU}y4)0u-F|z8qr)?ZKRZX3ZXz)XKfg*>mmjN!L&NV@MM5nKXAV;{MpT zdcVDUo|Ln)x$X1!u_kISo3MK&w^a1;FSj3PIS37zGTK%*X?t-i(@fio)%WAfdh}bl z7hy-XPU!Jz?(h704Wq2h*u64a+J8MN=GEl5LUV7#oBJ}Bdnp z&Qsb%?_;c5CLqjOIF*92p@qpq5Yw);ee}H_HtzIK3I2y^=p?UuK{)Nyr4vP`U+Ps@ zGr%0BY4~3^%{1yg2AgQYVd3r#;T^xPDVx~xjgeMI)-E4ydWv45QQgh1Bf!P)sj&al z%t@Ic=D0L-%y2IpXEm%gboI+adj=_S01rK{o9g=+|9(6BM%)*^CR?*I8~;$~h|l!d z&koB3?A%Y1UhZI@@+Xo%`{LsFb6+l0yw$!7P?&x4HpJkvt;Hgg2o&nExnthb*){>wJH$dvtn=c$7{Jbs|^$&s}mu;EQHzab5G zFExI?ZAFuXDs2fyIq~0NnjYkkbZWkl4}oou(|V4nN$#i>rVT9Iz3cn^;Kh&rxa){K**N>9wNc9HI`asF z*%_z8P4qb$H#WDWkB3YNERgLa{~WTWhgGp~_p<5ycXxH)Qq|Xk4xNS4$J{(mqcp>V zykF&*@Xukk6KcBY`MGN1V=c;NcluFN<|8#il{b?#Gj3;hxO)@Z%fGgn@On&s zVbiJRxH$iu`SuevQk5}%juBgXM$A8tVf^hBv-23n+s9OOIi}oe*9(U|cJKbWD@?G= z5cBK2HUv}rpL6R>o!xI$_ZoJazrFr>^O|?}60mWQSwGX_h?HYg4BJ!~kg#)-3yj#EBJ@xCP_7e(g`kC|6QMze- zk}UjdJxig5+GPfd-v52`VQKI*!ml=RtXDRxPpYa_|2hRv4>4byB)axWGf|(aFvlhH z!M|0QnJ$9n#(c{1jx<+3<*(aN9toEdrH(#AnJA-~5Zc1I` zfbC;$pC;5^Q}+zkxc}pslsz}Ri!WSnfHm?;6Uz^__RAiRVYAO*{b+OU3t zHm^S~^Z&RHjdXULs_upNo!tjb_q@~ZFvB^|E+1!_8s{-C*z`Hiw756thgPWdYWn(W zJR@7XC~unf-uQw;<-^i8Jee}T=eui0~fN%;?(i?e^)o6DaPW8g)m)_&JF zD=*U3m)Yh5ITLhroN4m!!d2_8-k85Qi3s0+Tv#pTRoOmstmP5z{*MCgtn~k|Y{}5u zg_C7(vLnG>G1^*iSD(2-`Iyf_@>vw9dyn^ zVk$bm4G>d6lCuWlUd{g()gIDYA_#VUD-aTK~zax4sn=@aiaU6hMFRSV`oAbC| zp0qsjgK7KZz9~05fqmd#V&}fu@J)Y<9%iPf#qiTe3B>36PJ1JHO$~oLu)HWdRk?4e z2Nhag=xz?9rd~7GU}3MZt5u-(^3C$o&%~YfG`nn%y?(&fT3@Pi%BYe-wYK)VqN3E+ KJzuHMC;mUTw8q;2 diff --git a/package.json b/package.json index e858356..dcf74c0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thilawyn/zod-schema-class", - "version": "0.1.2", + "version": "0.1.3", "type": "module", "publishConfig": { "registry": "https://git.jvalver.de/api/packages/thilawyn/npm/" @@ -40,13 +40,20 @@ }, "dependencies": { "@thilawyn/traitify-ts": "^0.1.18", - "decimal.js": "^10.4.3", - "effect": "^2.4.11", "lodash-es": "^4.17.21", - "mobx": "^6.12.1", - "type-fest": "^4.13.1", + "type-fest": "^4.14.0", "zod": "^3.22.4" }, + "peerDependencies": { + "mobx": "^6.12.1", + "decimal.js": "^10.4.3", + "effect": "^2.4.11" + }, + "peerDependenciesMeta": { + "mobx": { "optional": true }, + "decimal.js": { "optional": true }, + "effect": { "optional": true } + }, "devDependencies": { "@types/lodash-es": "^4.17.12", "bun-types": "latest", -- 2.49.1 From 62130433beea4391ffd52cb9bb798bfe48974c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 22:23:47 +0100 Subject: [PATCH 74/74] Dependencies upgrade --- bun.lockb | Bin 154779 -> 154440 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 1fa311a30d1131e4a696606c3bb24cf81e628ce2..422b3ef287913d5d3ee5d3d855e545f2f223ce3e 100755 GIT binary patch delta 20872 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