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")