From c3e1bffe0d793844688f8dce9edee8ab388311fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 10 Jan 2024 00:55:46 +0100 Subject: [PATCH] JsonifiableSchemable attempt as a trait --- bun.lockb | Bin 154055 -> 159977 bytes package.json | 5 ++- src/jsonifiable/JsonifiableSchemable.ts | 52 ++++++++++++++++++++++++ src/jsonifiable/index.ts | 1 + src/tests.ts | 49 +++++++++------------- 5 files changed, 76 insertions(+), 31 deletions(-) create mode 100644 src/jsonifiable/JsonifiableSchemable.ts create mode 100644 src/jsonifiable/index.ts diff --git a/bun.lockb b/bun.lockb index 4e23eb8b4364adf2258b86fdc025f2982746ab68..dc2bf927cab3aee136b3fe7dbe87262a7a246c20 100755 GIT binary patch delta 31264 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 F{|Cl_-wXf% delta 28420 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 A1ONa4 diff --git a/package.json b/package.json index 1fa0eb4..04f6667 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,9 @@ "clean:node": "rm -rf node_modules" }, "dependencies": { + "@thilawyn/thilatrait": "^0.1.1", "decimal.js": "^10.4.3", - "effect": "^2.0.0-next.62", + "effect": "^2.0.2", "lodash-es": "^4.17.21", "type-fest": "^4.9.0", "zod": "^3.22.4" @@ -50,7 +51,7 @@ "bun-types": "latest", "npm-check-updates": "^16.14.12", "npm-sort": "^0.0.4", - "rollup": "^4.9.1", + "rollup": "^4.9.4", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-ts": "^3.4.5", "tsx": "^4.7.0", diff --git a/src/jsonifiable/JsonifiableSchemable.ts b/src/jsonifiable/JsonifiableSchemable.ts new file mode 100644 index 0000000..914b7f5 --- /dev/null +++ b/src/jsonifiable/JsonifiableSchemable.ts @@ -0,0 +1,52 @@ +import { trait } from "@thilawyn/thilatrait" +import { JsonifiableObject } from "type-fest/source/jsonifiable" +import { z } from "zod" + + +export const JsonifiableSchemable = < + JsonifySchemaT extends z.ZodRawShape, + JsonifySchemaUnknownKeys extends z.UnknownKeysParam, + JsonifySchemaCatchall extends z.ZodTypeAny, + + DejsonifySchemaT extends z.ZodRawShape, + DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, + DejsonifySchemaCatchall extends z.ZodTypeAny, + + Values extends {}, + JsonifiedValues extends JsonifiableObject, +>( + jsonifySchema: z.ZodObject< + JsonifySchemaT, + JsonifySchemaUnknownKeys, + JsonifySchemaCatchall, + JsonifiedValues, + Values + >, + + dejsonifySchema: z.ZodObject< + DejsonifySchemaT, + DejsonifySchemaUnknownKeys, + DejsonifySchemaCatchall, + Values, + JsonifiedValues + >, +) => + trait(Parent => { + abstract class JsonifiableSchemable extends Parent { + abstract readonly schema: z.ZodObject< + z.ZodRawShape, + z.UnknownKeysParam, + z.ZodTypeAny, + Values, + Values + > + + static readonly jsonifySchema = jsonifySchema + readonly jsonifySchema = jsonifySchema + + static readonly dejsonifySchema = dejsonifySchema + readonly dejsonifySchema = dejsonifySchema + } + + return JsonifiableSchemable + }) diff --git a/src/jsonifiable/index.ts b/src/jsonifiable/index.ts new file mode 100644 index 0000000..2662891 --- /dev/null +++ b/src/jsonifiable/index.ts @@ -0,0 +1 @@ +export * from "./JsonifiableSchemable" diff --git a/src/tests.ts b/src/tests.ts index 905a71a..33cca5c 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,39 +1,30 @@ +import { extendsAndExpresses } from "@thilawyn/thilatrait" import { z } from "zod" -import { SchemableClassInput, extendSchemableClass, makeSchemableClass, newSchemableEffect } from "." +import { makeSchemableClass, newSchemable } from "." +import { JsonifiableSchemable } from "./jsonifiable" +import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./legacy/jsonifiable" -// class Test1 { -// static readonly schema = Test1Schema -// readonly schema = Test1Schema - -// static readonly defaultValues = { prout: "heugneu" } -// readonly defaultValues = { prout: "heugneu" } - -// prout: string = "heugneu" -// } - -const Test1 = makeSchemableClass( - z.object({ prout: z.string() }), - {}, -) - -new Test1({ prout: "adfd" }).prout +const UserLevel = z.enum(["User", "Admin"]) -const Test2 = extendSchemableClass( - Test1, - schema => schema.extend({ prout: z.literal("ruquier"), ruquier: z.number() }), - () => ({ prout: "ruquier" as const }), -) +const UserProto = makeSchemableClass(z.object({ + id: z.bigint(), + name: z.string(), + level: UserLevel, +}), { + level: "User" +} as const) -Test2.defaultValues -new Test2({ prout: "ruquier", ruquier: 69 }) +UserProto.defaultValues -class Test3 extends Test2 { -} +class User extends extendsAndExpresses(UserProto, + JsonifiableSchemable( + UserProto.schema.extend({ id: jsonifyBigIntSchema(z.bigint()) }), + UserProto.schema.extend({ id: dejsonifyBigIntSchema(z.bigint()) }), + ) +) {} -type Test = SchemableClassInput, typeof Test3.defaultValues> - -const test3inst = newSchemableEffect(Test3, { ruquier: 48 }) +const user1 = newSchemable(User, { id: 1n, name: "User" })