From 1bdfc079b9f02ecd2d712e526460dad4b5002d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 9 Jan 2024 00:10:56 +0100 Subject: [PATCH] Moved everything to legacy --- src/{ => legacy}/SchemableClass.ts | 0 src/{ => legacy}/index.ts | 0 .../jsonifiable/JsonifiableSchemableClass.ts | 0 .../jsonifiable/dejsonifySchemable.ts | 0 src/{ => legacy}/jsonifiable/index.ts | 0 .../makeJsonifiableSchemableClass.ts | 0 src/{ => legacy}/jsonifiable/schema/bigint.ts | 0 src/{ => legacy}/jsonifiable/schema/date.ts | 0 .../jsonifiable/schema/decimal.ts | 0 src/{ => legacy}/jsonifiable/schema/index.ts | 0 .../jsonifiable/schema/schemable.ts | 0 src/{ => legacy}/makeSchemableClass.ts | 0 src/{ => legacy}/newSchemable.ts | 0 src/legacy/tests.ts | 64 +++++++++++++++ src/legacy/util.ts | 82 +++++++++++++++++++ src/tests.ts | 64 --------------- src/util.ts | 47 ----------- 17 files changed, 146 insertions(+), 111 deletions(-) rename src/{ => legacy}/SchemableClass.ts (100%) rename src/{ => legacy}/index.ts (100%) rename src/{ => legacy}/jsonifiable/JsonifiableSchemableClass.ts (100%) rename src/{ => legacy}/jsonifiable/dejsonifySchemable.ts (100%) rename src/{ => legacy}/jsonifiable/index.ts (100%) rename src/{ => legacy}/jsonifiable/makeJsonifiableSchemableClass.ts (100%) rename src/{ => legacy}/jsonifiable/schema/bigint.ts (100%) rename src/{ => legacy}/jsonifiable/schema/date.ts (100%) rename src/{ => legacy}/jsonifiable/schema/decimal.ts (100%) rename src/{ => legacy}/jsonifiable/schema/index.ts (100%) rename src/{ => legacy}/jsonifiable/schema/schemable.ts (100%) rename src/{ => legacy}/makeSchemableClass.ts (100%) rename src/{ => legacy}/newSchemable.ts (100%) create mode 100644 src/legacy/tests.ts create mode 100644 src/legacy/util.ts diff --git a/src/SchemableClass.ts b/src/legacy/SchemableClass.ts similarity index 100% rename from src/SchemableClass.ts rename to src/legacy/SchemableClass.ts diff --git a/src/index.ts b/src/legacy/index.ts similarity index 100% rename from src/index.ts rename to src/legacy/index.ts diff --git a/src/jsonifiable/JsonifiableSchemableClass.ts b/src/legacy/jsonifiable/JsonifiableSchemableClass.ts similarity index 100% rename from src/jsonifiable/JsonifiableSchemableClass.ts rename to src/legacy/jsonifiable/JsonifiableSchemableClass.ts diff --git a/src/jsonifiable/dejsonifySchemable.ts b/src/legacy/jsonifiable/dejsonifySchemable.ts similarity index 100% rename from src/jsonifiable/dejsonifySchemable.ts rename to src/legacy/jsonifiable/dejsonifySchemable.ts diff --git a/src/jsonifiable/index.ts b/src/legacy/jsonifiable/index.ts similarity index 100% rename from src/jsonifiable/index.ts rename to src/legacy/jsonifiable/index.ts diff --git a/src/jsonifiable/makeJsonifiableSchemableClass.ts b/src/legacy/jsonifiable/makeJsonifiableSchemableClass.ts similarity index 100% rename from src/jsonifiable/makeJsonifiableSchemableClass.ts rename to src/legacy/jsonifiable/makeJsonifiableSchemableClass.ts diff --git a/src/jsonifiable/schema/bigint.ts b/src/legacy/jsonifiable/schema/bigint.ts similarity index 100% rename from src/jsonifiable/schema/bigint.ts rename to src/legacy/jsonifiable/schema/bigint.ts diff --git a/src/jsonifiable/schema/date.ts b/src/legacy/jsonifiable/schema/date.ts similarity index 100% rename from src/jsonifiable/schema/date.ts rename to src/legacy/jsonifiable/schema/date.ts diff --git a/src/jsonifiable/schema/decimal.ts b/src/legacy/jsonifiable/schema/decimal.ts similarity index 100% rename from src/jsonifiable/schema/decimal.ts rename to src/legacy/jsonifiable/schema/decimal.ts diff --git a/src/jsonifiable/schema/index.ts b/src/legacy/jsonifiable/schema/index.ts similarity index 100% rename from src/jsonifiable/schema/index.ts rename to src/legacy/jsonifiable/schema/index.ts diff --git a/src/jsonifiable/schema/schemable.ts b/src/legacy/jsonifiable/schema/schemable.ts similarity index 100% rename from src/jsonifiable/schema/schemable.ts rename to src/legacy/jsonifiable/schema/schemable.ts diff --git a/src/makeSchemableClass.ts b/src/legacy/makeSchemableClass.ts similarity index 100% rename from src/makeSchemableClass.ts rename to src/legacy/makeSchemableClass.ts diff --git a/src/newSchemable.ts b/src/legacy/newSchemable.ts similarity index 100% rename from src/newSchemable.ts rename to src/legacy/newSchemable.ts diff --git a/src/legacy/tests.ts b/src/legacy/tests.ts new file mode 100644 index 0000000..c19daf7 --- /dev/null +++ b/src/legacy/tests.ts @@ -0,0 +1,64 @@ +import { z } from "zod" +import { makeSchemableClass, newSchemable } from "." +import { dejsonifyBigIntSchema, dejsonifySchemable, dejsonifySchemableSchema, jsonifyBigIntSchema, jsonifySchemableSchema, makeJsonifiableSchemableClass } from "./jsonifiable" + + +const GroupSchema = z.object({ + /** Group ID */ + id: z.bigint(), + + /** Group name */ + name: z.string(), +}) + +const GroupSchemableObject = makeSchemableClass({ schema: GroupSchema }) + +const GroupJsonifiableSchemableObject = makeJsonifiableSchemableClass(GroupSchemableObject, { + jsonifySchema: ({ schema, s }) => schema.extend({ + id: jsonifyBigIntSchema(s.id) + }), + + dejsonifySchema: ({ schema, s }) => schema.extend({ + id: dejsonifyBigIntSchema(s.id) + }), +}) + +class Group extends GroupJsonifiableSchemableObject {} + + +const UserSchema = z.object({ + /** User ID */ + id: z.bigint(), + + /** Name string */ + name: z.string(), + + /** User group */ + group: z.instanceof(Group), +}) + +const UserSchemableObject = makeSchemableClass({ schema: UserSchema }) + +const UserJsonifiableSchemableObject = makeJsonifiableSchemableClass(UserSchemableObject, { + jsonifySchema: ({ schema, s }) => schema.extend({ + id: jsonifyBigIntSchema(s.id), + group: jsonifySchemableSchema(Group, s.group), + }), + + dejsonifySchema: ({ schema, s }) => schema.extend({ + id: dejsonifyBigIntSchema(s.id), + group: dejsonifySchemableSchema(Group, s.group), + }), +}) + +class User extends UserJsonifiableSchemableObject {} + + +const group1 = new Group({ id: 1n, name: "Group 1" }) + +const user1 = new User({ id: 1n, name: "User 1", group: group1 }) +const user2 = newSchemable(User, { id: 2n, name: "User 2", group: group1 }) + +const jsonifiedUser2 = user2.jsonify() +const dejsonifiedUser2 = dejsonifySchemable(User, jsonifiedUser2) +console.log(dejsonifiedUser2) diff --git a/src/legacy/util.ts b/src/legacy/util.ts new file mode 100644 index 0000000..2cf7b08 --- /dev/null +++ b/src/legacy/util.ts @@ -0,0 +1,82 @@ +import { Effect, pipe } from "effect" +import { mapValues } from "lodash-es" +import { z } from "zod" + + +/** + * Represents the static members of a class. + * @template C - The class type. + */ +export type StaticMembers = { + [Key in keyof C as Key extends "prototype" ? never : Key]: C[Key] +} + + +/** + * Removes default values from a ZodObject schema and returns a new schema. + * + * @param schema - The ZodObject schema to process. + * @returns A new ZodObject schema with default values removed. + */ +export const zodObjectRemoveDefaults = < + T extends z.ZodRawShape, + UnknownKeys extends z.UnknownKeysParam, + Catchall extends z.ZodTypeAny, + Output extends {}, + Input extends {}, +>( + schema: z.ZodObject< + T, + UnknownKeys, + Catchall, + Output, + Input + > +) => + schema.extend(zodShapeRemoveDefaults(schema.shape)) + +/** + * Removes default values from a ZodObject shape and returns a new shape. + * + * @param shape - The ZodObject shape to process. + * @returns A new shape with default values removed. + */ +export const zodShapeRemoveDefaults = < + Shape extends z.ZodRawShape +>( + shape: Shape +): { + [K in keyof Shape]: + Shape[K] extends z.ZodDefault + ? T + : Shape[K] +} => + mapValues(shape, el => + el instanceof z.ZodDefault + ? el.removeDefault() + : el + ) + + +/** + * Parses a value using a ZodType schema wrapped in an Effect monad. + * + * @param schema - The ZodType schema to use for parsing. + * @param args - The arguments to pass to the `safeParseAsync` method of the schema. + * @returns An Effect monad representing the parsing result. + */ +export const parseZodTypeEffect = < + Output, + Input, +>( + schema: z.ZodType, + ...args: Parameters +) => pipe( + Effect.promise(() => schema.safeParseAsync(...args)), + + Effect.flatMap(response => + response.success + ? Effect.succeed(response.data) + : Effect.fail(response.error) + ), +) diff --git a/src/tests.ts b/src/tests.ts index c19daf7..e69de29 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,64 +0,0 @@ -import { z } from "zod" -import { makeSchemableClass, newSchemable } from "." -import { dejsonifyBigIntSchema, dejsonifySchemable, dejsonifySchemableSchema, jsonifyBigIntSchema, jsonifySchemableSchema, makeJsonifiableSchemableClass } from "./jsonifiable" - - -const GroupSchema = z.object({ - /** Group ID */ - id: z.bigint(), - - /** Group name */ - name: z.string(), -}) - -const GroupSchemableObject = makeSchemableClass({ schema: GroupSchema }) - -const GroupJsonifiableSchemableObject = makeJsonifiableSchemableClass(GroupSchemableObject, { - jsonifySchema: ({ schema, s }) => schema.extend({ - id: jsonifyBigIntSchema(s.id) - }), - - dejsonifySchema: ({ schema, s }) => schema.extend({ - id: dejsonifyBigIntSchema(s.id) - }), -}) - -class Group extends GroupJsonifiableSchemableObject {} - - -const UserSchema = z.object({ - /** User ID */ - id: z.bigint(), - - /** Name string */ - name: z.string(), - - /** User group */ - group: z.instanceof(Group), -}) - -const UserSchemableObject = makeSchemableClass({ schema: UserSchema }) - -const UserJsonifiableSchemableObject = makeJsonifiableSchemableClass(UserSchemableObject, { - jsonifySchema: ({ schema, s }) => schema.extend({ - id: jsonifyBigIntSchema(s.id), - group: jsonifySchemableSchema(Group, s.group), - }), - - dejsonifySchema: ({ schema, s }) => schema.extend({ - id: dejsonifyBigIntSchema(s.id), - group: dejsonifySchemableSchema(Group, s.group), - }), -}) - -class User extends UserJsonifiableSchemableObject {} - - -const group1 = new Group({ id: 1n, name: "Group 1" }) - -const user1 = new User({ id: 1n, name: "User 1", group: group1 }) -const user2 = newSchemable(User, { id: 2n, name: "User 2", group: group1 }) - -const jsonifiedUser2 = user2.jsonify() -const dejsonifiedUser2 = dejsonifySchemable(User, jsonifiedUser2) -console.log(dejsonifiedUser2) diff --git a/src/util.ts b/src/util.ts index 2cf7b08..276cbdd 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,5 +1,4 @@ import { Effect, pipe } from "effect" -import { mapValues } from "lodash-es" import { z } from "zod" @@ -12,52 +11,6 @@ export type StaticMembers = { } -/** - * Removes default values from a ZodObject schema and returns a new schema. - * - * @param schema - The ZodObject schema to process. - * @returns A new ZodObject schema with default values removed. - */ -export const zodObjectRemoveDefaults = < - T extends z.ZodRawShape, - UnknownKeys extends z.UnknownKeysParam, - Catchall extends z.ZodTypeAny, - Output extends {}, - Input extends {}, ->( - schema: z.ZodObject< - T, - UnknownKeys, - Catchall, - Output, - Input - > -) => - schema.extend(zodShapeRemoveDefaults(schema.shape)) - -/** - * Removes default values from a ZodObject shape and returns a new shape. - * - * @param shape - The ZodObject shape to process. - * @returns A new shape with default values removed. - */ -export const zodShapeRemoveDefaults = < - Shape extends z.ZodRawShape ->( - shape: Shape -): { - [K in keyof Shape]: - Shape[K] extends z.ZodDefault - ? T - : Shape[K] -} => - mapValues(shape, el => - el instanceof z.ZodDefault - ? el.removeDefault() - : el - ) - - /** * Parses a value using a ZodType schema wrapped in an Effect monad. *