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)