From 2e09d9a0e089a4f0dc4243da393cbe4bd6c2d923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 11 Mar 2024 19:44:21 +0100 Subject: [PATCH] 0.1.2 (#3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Julien Valverdé Reviewed-on: https://git.jvalver.de/Thilawyn/zod-schema-class/pulls/3 --- README.md | 2 +- bun.lockb | Bin 160294 -> 160864 bytes package.json | 45 ++-- rollup.config.ts | 5 +- src/SchemableClass.ts | 54 ----- src/builders/ZodSchemaClassBuilder.ts | 133 +++++++++++ src/builders/ZodSchemaClassExtender.ts | 196 ++++++++++++++++ src/defineDefaultValues.ts | 8 - src/extendSchemableClass.ts | 95 -------- src/index.ts | 5 - src/jsonifiable/JsonifiableSchemableClass.ts | 80 ------- src/jsonifiable/dejsonifySchemable.ts | 213 ------------------ src/jsonifiable/index.ts | 4 - .../makeJsonifiableSchemableClass.ts | 134 ----------- src/jsonifiable/schema/index.ts | 4 - src/jsonifiable/schema/schemable.ts | 139 ------------ src/legacy/SchemableClass.ts | 90 -------- src/legacy/index.ts | 3 - .../jsonifiable/JsonifiableSchemableClass.ts | 66 ------ src/legacy/jsonifiable/dejsonifySchemable.ts | 47 ---- src/legacy/jsonifiable/index.ts | 4 - .../makeJsonifiableSchemableClass.ts | 98 -------- src/legacy/jsonifiable/schema/bigint.ts | 18 -- src/legacy/jsonifiable/schema/date.ts | 18 -- src/legacy/jsonifiable/schema/decimal.ts | 19 -- src/legacy/jsonifiable/schema/index.ts | 4 - src/legacy/jsonifiable/schema/schemable.ts | 25 -- src/legacy/makeSchemableClass.ts | 49 ---- src/legacy/newSchemable.ts | 77 ------- src/legacy/tests.ts | 64 ------ src/legacy/util.ts | 82 ------- src/lib.ts | 4 + src/makeSchemableClass.ts | 82 ------- src/newSchemable.ts | 127 ----------- src/observable/index.ts | 1 - .../makeSchemableClassObservable.ts | 29 --- src/schema/effect/index.ts | 6 + src/schema/effect/option.ts | 21 ++ .../schema => schema/jsonifiable}/bigint.ts | 4 +- .../schema => schema/jsonifiable}/date.ts | 4 +- .../schema => schema/jsonifiable}/decimal.ts | 4 +- src/schema/jsonifiable/index.ts | 16 ++ src/schema/lib.ts | 2 + src/shapes/JsonifiableZodSchemaClass.ts | 78 +++++++ src/shapes/ZodSchemaClass.ts | 55 +++++ src/tests.ts | 93 ++++---- src/traits/ExtendableZodSchemaObject.ts | 16 ++ src/traits/JsonifiableZodSchemaObject.ts | 110 +++++++++ src/traits/MobXObservableZodSchemaObject.ts | 23 ++ src/traits/ZodSchemaObject.ts | 122 ++++++++++ src/util.ts | 56 ----- src/util/class.ts | 101 +++++++++ src/util/effect.ts | 23 ++ src/util/extend.ts | 55 +++++ src/util/index.ts | 4 + src/util/misc.ts | 3 + 56 files changed, 1042 insertions(+), 1778 deletions(-) delete mode 100644 src/SchemableClass.ts create mode 100644 src/builders/ZodSchemaClassBuilder.ts create mode 100644 src/builders/ZodSchemaClassExtender.ts delete mode 100644 src/defineDefaultValues.ts delete mode 100644 src/extendSchemableClass.ts delete mode 100644 src/index.ts delete mode 100644 src/jsonifiable/JsonifiableSchemableClass.ts delete mode 100644 src/jsonifiable/dejsonifySchemable.ts delete mode 100644 src/jsonifiable/index.ts delete mode 100644 src/jsonifiable/makeJsonifiableSchemableClass.ts delete mode 100644 src/jsonifiable/schema/index.ts delete mode 100644 src/jsonifiable/schema/schemable.ts delete mode 100644 src/legacy/SchemableClass.ts delete mode 100644 src/legacy/index.ts delete mode 100644 src/legacy/jsonifiable/JsonifiableSchemableClass.ts delete mode 100644 src/legacy/jsonifiable/dejsonifySchemable.ts delete mode 100644 src/legacy/jsonifiable/index.ts delete mode 100644 src/legacy/jsonifiable/makeJsonifiableSchemableClass.ts delete mode 100644 src/legacy/jsonifiable/schema/bigint.ts delete mode 100644 src/legacy/jsonifiable/schema/date.ts delete mode 100644 src/legacy/jsonifiable/schema/decimal.ts delete mode 100644 src/legacy/jsonifiable/schema/index.ts delete mode 100644 src/legacy/jsonifiable/schema/schemable.ts delete mode 100644 src/legacy/makeSchemableClass.ts delete mode 100644 src/legacy/newSchemable.ts delete mode 100644 src/legacy/tests.ts delete mode 100644 src/legacy/util.ts create mode 100644 src/lib.ts delete mode 100644 src/makeSchemableClass.ts delete mode 100644 src/newSchemable.ts delete mode 100644 src/observable/index.ts delete mode 100644 src/observable/makeSchemableClassObservable.ts create mode 100644 src/schema/effect/index.ts create mode 100644 src/schema/effect/option.ts rename src/{jsonifiable/schema => schema/jsonifiable}/bigint.ts (82%) rename src/{jsonifiable/schema => schema/jsonifiable}/date.ts (82%) rename src/{jsonifiable/schema => schema/jsonifiable}/decimal.ts (84%) create mode 100644 src/schema/jsonifiable/index.ts create mode 100644 src/schema/lib.ts create mode 100644 src/shapes/JsonifiableZodSchemaClass.ts create mode 100644 src/shapes/ZodSchemaClass.ts create mode 100644 src/traits/ExtendableZodSchemaObject.ts create mode 100644 src/traits/JsonifiableZodSchemaObject.ts create mode 100644 src/traits/MobXObservableZodSchemaObject.ts create mode 100644 src/traits/ZodSchemaObject.ts delete mode 100644 src/util.ts create mode 100644 src/util/class.ts create mode 100644 src/util/effect.ts create mode 100644 src/util/extend.ts create mode 100644 src/util/index.ts create mode 100644 src/util/misc.ts diff --git a/README.md b/README.md index adb9b58..5005fab 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# schemable-class +# zod-schema-class Create TypeScript classes out of Zod schemas diff --git a/bun.lockb b/bun.lockb index a8be37ec9a258a1b8ffb32b87f1705fd70b7789f..6409dc584fc1f2037ea68159368bd3086dfe4393 100755 GIT binary patch delta 31902 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 KEaN1#?(|<*Mqj@G diff --git a/package.json b/package.json index 2ab619a..fbd80fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "@thilawyn/schemable-class", - "version": "0.1.1", + "name": "@thilawyn/zod-schema-class", + "version": "0.1.2", "type": "module", "publishConfig": { "registry": "https://git.jvalver.de/api/packages/thilawyn/npm/" @@ -11,32 +11,22 @@ "exports": { ".": { "import": { - "types": "./dist/schemable.d.mts", - "default": "./dist/schemable.mjs" + "types": "./dist/lib.d.mts", + "default": "./dist/lib.mjs" }, "require": { - "types": "./dist/schemable.d.cts", - "default": "./dist/schemable.cjs" + "types": "./dist/lib.d.cts", + "default": "./dist/lib.cjs" } }, - "./jsonifiable": { + "./schema": { "import": { - "types": "./dist/jsonifiable.d.mts", - "default": "./dist/jsonifiable.mjs" + "types": "./dist/schema.d.mts", + "default": "./dist/schema.mjs" }, "require": { - "types": "./dist/jsonifiable.d.cts", - "default": "./dist/jsonifiable.cjs" - } - }, - "./observable": { - "import": { - "types": "./dist/observable.d.mts", - "default": "./dist/observable.mjs" - }, - "require": { - "types": "./dist/observable.d.cts", - "default": "./dist/observable.cjs" + "types": "./dist/schema.d.cts", + "default": "./dist/schema.cjs" } } }, @@ -48,24 +38,25 @@ "clean:node": "rm -rf node_modules" }, "dependencies": { + "@thilawyn/traitify-ts": "^0.1.15", "decimal.js": "^10.4.3", - "effect": "^2.1.1", + "effect": "^2.4.3", "lodash-es": "^4.17.21", "mobx": "^6.12.0", - "type-fest": "^4.9.0", + "type-fest": "^4.12.0", "zod": "^3.22.4" }, "devDependencies": { "@rollup/plugin-node-resolve": "^15.2.3", "@types/lodash-es": "^4.17.12", "bun-types": "latest", - "npm-check-updates": "^16.14.12", + "npm-check-updates": "^16.14.15", "npm-sort": "^0.0.4", - "rollup": "^4.9.5", + "rollup": "^4.12.1", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-ts": "^3.4.5", "ts-functional-pipe": "^3.1.2", - "tsx": "^4.7.0", - "typescript": "^5.3.3" + "tsx": "^4.7.1", + "typescript": "^5.4.2" } } diff --git a/rollup.config.ts b/rollup.config.ts index 292a90c..566206a 100644 --- a/rollup.config.ts +++ b/rollup.config.ts @@ -38,7 +38,6 @@ export const createBundleConfig = ( export default [ - createBundleConfig("src/index.ts", "."), - createBundleConfig("src/jsonifiable/index.ts", "./jsonifiable"), - createBundleConfig("src/observable/index.ts", "./observable"), + createBundleConfig("src/lib.ts", "."), + createBundleConfig("src/schema/lib.ts", "./schema"), ] diff --git a/src/SchemableClass.ts b/src/SchemableClass.ts deleted file mode 100644 index f54a32f..0000000 --- a/src/SchemableClass.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { z } from "zod" -import { Class, ClassType } from "./util" - - -export type SchemableClass< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues extends Partial, - - Type extends ClassType = "AbstractClass" -> = ( - Class< - Type, - - { - readonly schema: z.ZodObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - Values - > - - readonly defaultValues: DefaultValues - } & Values, - - Parameters<(values: Values) => never> - > & { - readonly schema: z.ZodObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - Values - > - - readonly defaultValues: DefaultValues - } -) - - -export type SchemableClassInput< - Values extends {}, - DefaultValues extends Partial, -> = { - [Key in Exclude]: Values[Key] -} & { - [Key in keyof DefaultValues]?: Key extends keyof Values - ? Values[Key] - : never -} diff --git a/src/builders/ZodSchemaClassBuilder.ts b/src/builders/ZodSchemaClassBuilder.ts new file mode 100644 index 0000000..a16ed6f --- /dev/null +++ b/src/builders/ZodSchemaClassBuilder.ts @@ -0,0 +1,133 @@ +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 new file mode 100644 index 0000000..d78a3c4 --- /dev/null +++ b/src/builders/ZodSchemaClassExtender.ts @@ -0,0 +1,196 @@ +// 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/defineDefaultValues.ts b/src/defineDefaultValues.ts deleted file mode 100644 index 634d83a..0000000 --- a/src/defineDefaultValues.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Opaque } from "type-fest" - - -export type DefinedDefaultValuesTag = "@thilawyn/schemable-class/DefinedDefaultValues" - -export function defineDefaultValues(values: T) { - return values as Opaque -} diff --git a/src/extendSchemableClass.ts b/src/extendSchemableClass.ts deleted file mode 100644 index bb392e1..0000000 --- a/src/extendSchemableClass.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { AbstractClass, Class as ConcreteClass, Opaque } from "type-fest" -import { z } from "zod" -import { DefinedDefaultValuesTag, SchemableClass } from "." -import { StaticMembers } from "./util" - - -export function extendSchemableClass< - C extends SchemableClass< - ExtendSchemaT, - ExtendSchemaUnknownKeys, - ExtendSchemaCatchall, - ExtendSchemaValues, - ExtendDefaultValues - >, - - ExtendSchemaT extends z.ZodRawShape, - ExtendSchemaUnknownKeys extends z.UnknownKeysParam, - ExtendSchemaCatchall extends z.ZodTypeAny, - ExtendSchemaValues extends {}, - ExtendDefaultValues extends Partial, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - SchemaValues extends ExtendSchemaValues, - - DefaultValues extends Partial, ->( - extend: C | SchemableClass< - ExtendSchemaT, - ExtendSchemaUnknownKeys, - ExtendSchemaCatchall, - ExtendSchemaValues, - ExtendDefaultValues - >, - - props: { - schema: (props: { - schema: z.ZodObject< - ExtendSchemaT, - ExtendSchemaUnknownKeys, - ExtendSchemaCatchall, - ExtendSchemaValues, - ExtendSchemaValues - > - - shape: ExtendSchemaT - }) => z.ZodObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - SchemaValues, - SchemaValues - > - - defaultValues: (defaultValues: ExtendDefaultValues) => Opaque - }, -) { - type Class = ( - C extends ConcreteClass - ? ConcreteClass - : AbstractClass - ) - - const schema = props.schema({ - schema: extend.schema, - shape: extend.schema.shape, - }) - const defaultValues = props.defaultValues(extend.defaultValues) - - return class extends extend { - static readonly schema = schema - readonly schema = schema - - static readonly defaultValues = defaultValues - readonly defaultValues = defaultValues - } as unknown as ( - Class< - Omit, "schema" | "defaultValues" | keyof ExtendSchemaValues> & - { - readonly schema: z.ZodObject, - readonly defaultValues: DefaultValues, - } & - SchemaValues, - - Parameters<(values: SchemaValues) => void> - > & - - Omit, "schema" | "defaultValues"> & - { - readonly schema: z.ZodObject, - readonly defaultValues: DefaultValues, - } - ) -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 4b4c248..0000000 --- a/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./SchemableClass" -export * from "./defineDefaultValues" -export * from "./extendSchemableClass" -export * from "./makeSchemableClass" -export * from "./newSchemable" diff --git a/src/jsonifiable/JsonifiableSchemableClass.ts b/src/jsonifiable/JsonifiableSchemableClass.ts deleted file mode 100644 index da145d6..0000000 --- a/src/jsonifiable/JsonifiableSchemableClass.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Effect } from "effect" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { SchemableClass } from ".." -import { Class, ClassType } from "../util" - - -export type JsonifiableSchemableClass< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues 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, - - Type extends ClassType = "AbstractClass" -> = ( - SchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - DefaultValues, - Type - > & - - Class< - Type, - - { - readonly jsonifySchema: z.ZodObject< - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - JsonifiedValues, - Values - > - - readonly dejsonifySchema: z.ZodObject< - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - Values, - JsonifiedValues - > - - jsonify(): JsonifiedValues - jsonifyPromise(): Promise - jsonifyEffect(): Effect.Effect, JsonifiedValues> - }, - - any[] - > & { - readonly jsonifySchema: z.ZodObject< - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - JsonifiedValues, - Values - > - - readonly dejsonifySchema: z.ZodObject< - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - Values, - JsonifiedValues - > - } -) diff --git a/src/jsonifiable/dejsonifySchemable.ts b/src/jsonifiable/dejsonifySchemable.ts deleted file mode 100644 index b8e7f80..0000000 --- a/src/jsonifiable/dejsonifySchemable.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { Effect, pipe } from "effect" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { JsonifiableSchemableClass } from "." -import { parseZodTypeEffect } from "../util" - - -export function dejsonifySchemable< - C extends JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues 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, ->( - class_: C | JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - values: JsonifiedValues, - params?: Partial, -) { - return new class_( - class_.dejsonifySchema.parse(values, params) - ) as InstanceType -} - - -export async function dejsonifySchemablePromise< - C extends JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues 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, ->( - class_: C | JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - values: JsonifiedValues, - params?: Partial, -) { - return new class_( - await class_.dejsonifySchema.parseAsync(values, params) - ) as InstanceType -} - - -export function dejsonifySchemableEffect< - C extends JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues 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, ->( - class_: C | JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - values: JsonifiedValues, - params?: Partial, -) { - return pipe( - parseZodTypeEffect(class_.dejsonifySchema, values, params), - Effect.map(values => new class_(values) as InstanceType), - ) -} diff --git a/src/jsonifiable/index.ts b/src/jsonifiable/index.ts deleted file mode 100644 index 74e7d23..0000000 --- a/src/jsonifiable/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./JsonifiableSchemableClass" -export * from "./dejsonifySchemable" -export * from "./makeJsonifiableSchemableClass" -export * from "./schema" diff --git a/src/jsonifiable/makeJsonifiableSchemableClass.ts b/src/jsonifiable/makeJsonifiableSchemableClass.ts deleted file mode 100644 index 691a3f2..0000000 --- a/src/jsonifiable/makeJsonifiableSchemableClass.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { Effect } from "effect" -import { AbstractClass, Class as ConcreteClass } from "type-fest" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { SchemableClass } from ".." -import { StaticMembers, parseZodTypeEffect } from "../util" - - -export function makeJsonifiableSchemableClass< - C extends SchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - DefaultValues - >, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues 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, ->( - extend: C | SchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - DefaultValues - >, - - props: { - jsonifySchema: (props: { - schema: z.ZodObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - Values - > - - shape: SchemaT - }) => z.ZodObject< - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - JsonifiedValues, - Values - > - - dejsonifySchema: (props: { - schema: z.ZodObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - Values - > - - shape: SchemaT - }) => z.ZodObject< - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - Values, - JsonifiedValues - > - }, -) { - type Class = ( - C extends ConcreteClass - ? ConcreteClass - : AbstractClass - ) - - const jsonifySchema = props.jsonifySchema({ - schema: extend.schema, - shape: extend.schema.shape, - }) - - const dejsonifySchema = props.dejsonifySchema({ - schema: extend.schema, - shape: extend.schema.shape, - }) - - return class extends extend { - static readonly jsonifySchema = jsonifySchema - readonly jsonifySchema = jsonifySchema - - static readonly dejsonifySchema = dejsonifySchema - readonly dejsonifySchema = dejsonifySchema - - jsonify() { - return this.jsonifySchema.parse(this) - } - - jsonifyPromise() { - return this.jsonifySchema.parseAsync(this) - } - - jsonifyEffect() { - return parseZodTypeEffect(this.jsonifySchema, this) - } - } as unknown as ( - Class< - InstanceType & { - readonly jsonifySchema: z.ZodObject, - readonly dejsonifySchema: z.ZodObject, - - jsonify(): JsonifiedValues - jsonifyPromise(): Promise - jsonifyEffect(): Effect.Effect, JsonifiedValues> - }, - - ConstructorParameters - > & - - StaticMembers & { - readonly jsonifySchema: z.ZodObject, - readonly dejsonifySchema: z.ZodObject, - } - ) -} diff --git a/src/jsonifiable/schema/index.ts b/src/jsonifiable/schema/index.ts deleted file mode 100644 index 08ecef8..0000000 --- a/src/jsonifiable/schema/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./bigint" -export * from "./date" -export * from "./decimal" -export * from "./schemable" diff --git a/src/jsonifiable/schema/schemable.ts b/src/jsonifiable/schema/schemable.ts deleted file mode 100644 index b0a72bc..0000000 --- a/src/jsonifiable/schema/schemable.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { JsonifiableSchemableClass } from ".." - - -export function jsonifySchemableSchema< - C extends JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues 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, - - S extends z.ZodType, z.ZodTypeDef, InstanceType>, ->( - class_: C | JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - schema: S, -) { - return schema.pipe(class_.jsonifySchema) -} - - -export function dejsonifySchemableSchema< - C extends JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues 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, - - S extends z.ZodType, z.ZodTypeDef, InstanceType>, ->( - class_: C | JsonifiableSchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - Values, - DefaultValues, - - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - - "Class" - >, - - schema: S, -) { - return class_.dejsonifySchema.transform(v => new class_(v)).pipe(schema) -} diff --git a/src/legacy/SchemableClass.ts b/src/legacy/SchemableClass.ts deleted file mode 100644 index f85216c..0000000 --- a/src/legacy/SchemableClass.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Class } from "type-fest" -import { z } from "zod" - - -/** - * Configuration for creating a schemable object with validation schemas. - * @template Values - The type representing the expected values. - * @template Input - The type representing the input values. - * @template SchemaT - The type representing the base validation schema. - * @template SchemaUnknownKeys - The type representing the unknown keys behavior in the base validation schema. - * @template SchemaCatchall - The type representing the catchall behavior in the base validation schema. - * @template SchemaWithDefaultValuesT - The type representing the validation schema with default values. - * @template SchemaWithDefaultValuesUnknownKeys - The type representing the unknown keys behavior in the validation schema with default values. - * @template SchemaWithDefaultValuesCatchall - The type representing the catchall behavior in the validation schema with default values. - */ -export type SchemableConfig< - Values extends {} = {}, - Input extends {} = {}, - - SchemaT extends z.ZodRawShape = z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam = z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny = z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape = z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam = z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny = z.ZodTypeAny, -> = { - readonly values: Values - readonly input: Input - - readonly schema: z.ZodObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - Values - > - - readonly schemaWithDefaultValues: z.ZodObject< - SchemaWithDefaultValuesT, - SchemaWithDefaultValuesUnknownKeys, - SchemaWithDefaultValuesCatchall, - Values, - Input - > -} - - -/** - * Represents a class with validation schemas. - * @template $Config - The configuration type for the schemable object. - */ -export type SchemableClass< - $Config extends SchemableConfig -> = ( - Class< - SchemableObject<$Config>, - SchemableClassConstructorParams<$Config> - > & { - readonly $schemableConfig: $Config - readonly schema: $Config["schema"] - readonly schemaWithDefaultValues: $Config["schemaWithDefaultValues"] - } -) - -/** - * Represents the constructor parameters for the schemable object class. - * @template $Config - The configuration type for the schemable object. - */ -export type SchemableClassConstructorParams< - $Config extends SchemableConfig -> = ( - Parameters< - (data: $Config["values"]) => void - > -) - -/** - * Represents an object with validation schemas. - * @template $Config - The configuration type for the schemable object. - */ -export type SchemableObject< - $Config extends SchemableConfig -> = ( - { - readonly $schemableConfig: $Config - readonly schema: $Config["schema"] - readonly schemaWithDefaultValues: $Config["schemaWithDefaultValues"] - } & $Config["values"] -) diff --git a/src/legacy/index.ts b/src/legacy/index.ts deleted file mode 100644 index 17d8b56..0000000 --- a/src/legacy/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./SchemableClass" -export * from "./makeSchemableClass" -export * from "./newSchemable" diff --git a/src/legacy/jsonifiable/JsonifiableSchemableClass.ts b/src/legacy/jsonifiable/JsonifiableSchemableClass.ts deleted file mode 100644 index c0dc3c0..0000000 --- a/src/legacy/jsonifiable/JsonifiableSchemableClass.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Effect } from "effect" -import { Class } from "type-fest" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { SchemableClassConstructorParams, SchemableConfig } from ".." - - -export type JsonifiableSchemableConfig< - $SchemableConfig extends SchemableConfig = SchemableConfig, - - JsonifiedValues extends JsonifiableObject = {}, - - JsonifySchemaT extends z.ZodRawShape = z.ZodRawShape, - JsonifySchemaUnknownKeys extends z.UnknownKeysParam = z.UnknownKeysParam, - JsonifySchemaCatchall extends z.ZodTypeAny = z.ZodTypeAny, - - DejsonifySchemaT extends z.ZodRawShape = z.ZodRawShape, - DejsonifySchemaUnknownKeys extends z.UnknownKeysParam = z.UnknownKeysParam, - DejsonifySchemaCatchall extends z.ZodTypeAny = z.ZodTypeAny, -> = { - readonly $schemableConfig: $SchemableConfig - - readonly jsonifiedValues: JsonifiedValues - - readonly jsonifySchema: z.ZodObject< - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - JsonifiedValues, - $SchemableConfig["values"] - > - - readonly dejsonifySchema: z.ZodObject< - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - $SchemableConfig["values"], - JsonifiedValues - > -} - - -export type JsonifiableSchemableClass< - $Config extends JsonifiableSchemableConfig -> = ( - Class< - JsonifiableSchemableObject<$Config>, - SchemableClassConstructorParams<$Config["$schemableConfig"]> - > & { - readonly $jsonifiableSchemableConfig: $Config - readonly jsonifySchema: $Config["jsonifySchema"] - readonly dejsonifySchema: $Config["dejsonifySchema"] - } -) - -export type JsonifiableSchemableObject< - $Config extends JsonifiableSchemableConfig -> = { - readonly $jsonifiableSchemableConfig: $Config - readonly jsonifySchema: $Config["jsonifySchema"] - readonly dejsonifySchema: $Config["dejsonifySchema"] - - jsonify(): $Config["jsonifiedValues"] - jsonifyPromise(): Promise<$Config["jsonifiedValues"]> - jsonifyEffect(): Effect.Effect, $Config["jsonifiedValues"]> -} diff --git a/src/legacy/jsonifiable/dejsonifySchemable.ts b/src/legacy/jsonifiable/dejsonifySchemable.ts deleted file mode 100644 index 35ceafb..0000000 --- a/src/legacy/jsonifiable/dejsonifySchemable.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Effect, pipe } from "effect" -import { z } from "zod" -import { JsonifiableSchemableClass, JsonifiableSchemableConfig } from "." -import { parseZodTypeEffect } from "../util" - - -export const dejsonifySchemable = < - C extends JsonifiableSchemableClass<$Config>, - $Config extends JsonifiableSchemableConfig, ->( - class_: C | JsonifiableSchemableClass<$Config>, - values: $Config["jsonifiedValues"], - params?: Partial, -) => - new class_(class_.dejsonifySchema.parse(values, params)) as InstanceType - - -export const dejsonifySchemablePromise = async < - C extends JsonifiableSchemableClass<$Config>, - $Config extends JsonifiableSchemableConfig, ->( - class_: C | JsonifiableSchemableClass<$Config>, - values: $Config["jsonifiedValues"], - params?: Partial, -) => - new class_(await class_.dejsonifySchema.parseAsync(values, params)) as InstanceType - - -export const dejsonifySchemableEffect = < - C extends JsonifiableSchemableClass<$Config>, - $Config extends JsonifiableSchemableConfig, ->( - class_: C | JsonifiableSchemableClass<$Config>, - values: $Config["jsonifiedValues"], - params?: Partial, -) => pipe( - parseZodTypeEffect< - z.output, - z.input - >( - class_.dejsonifySchema, - values, - params, - ), - - Effect.map(values => new class_(values) as InstanceType), -) diff --git a/src/legacy/jsonifiable/index.ts b/src/legacy/jsonifiable/index.ts deleted file mode 100644 index 74e7d23..0000000 --- a/src/legacy/jsonifiable/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./JsonifiableSchemableClass" -export * from "./dejsonifySchemable" -export * from "./makeJsonifiableSchemableClass" -export * from "./schema" diff --git a/src/legacy/jsonifiable/makeJsonifiableSchemableClass.ts b/src/legacy/jsonifiable/makeJsonifiableSchemableClass.ts deleted file mode 100644 index a956b0b..0000000 --- a/src/legacy/jsonifiable/makeJsonifiableSchemableClass.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Class } from "type-fest" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { JsonifiableSchemableClass, JsonifiableSchemableConfig, JsonifiableSchemableObject } from "." -import { SchemableClass, SchemableConfig } from ".." -import { StaticMembers, parseZodTypeEffect } from "../util" - - -export function makeJsonifiableSchemableClass< - C extends SchemableClass<$SchemableConfig>, - $SchemableConfig extends SchemableConfig, - - JsonifiedValues extends JsonifiableObject, - - JsonifySchemaT extends z.ZodRawShape, - JsonifySchemaUnknownKeys extends z.UnknownKeysParam, - JsonifySchemaCatchall extends z.ZodTypeAny, - - DejsonifySchemaT extends z.ZodRawShape, - DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, - DejsonifySchemaCatchall extends z.ZodTypeAny, ->( - class_: C | SchemableClass<$SchemableConfig>, - - props: { - jsonifySchema: (props: { - schema: $SchemableConfig["schema"] - s: $SchemableConfig["schema"]["shape"] - }) => z.ZodObject< - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - JsonifiedValues, - $SchemableConfig["values"] - > - - dejsonifySchema: (props: { - schema: $SchemableConfig["schema"] - s: $SchemableConfig["schema"]["shape"] - }) => z.ZodObject< - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - $SchemableConfig["values"], - JsonifiedValues - > - }, -) { - - const jsonifySchema = props.jsonifySchema({ - schema: class_.schema, - s: class_.schema.shape, - }) - - const dejsonifySchema = props.dejsonifySchema({ - schema: class_.schema, - s: class_.schema.shape, - }) - - const $jsonifiableSchemableConfig = { - $schemableConfig: class_.$schemableConfig, - jsonifiedValues: undefined as unknown as JsonifiedValues, - jsonifySchema: undefined as unknown as typeof jsonifySchema, - dejsonifySchema: undefined as unknown as typeof dejsonifySchema, - } as const satisfies JsonifiableSchemableConfig - - const jsonifiableClass = class JsonifiableSchemableObject extends class_ { - static readonly $jsonifiableSchemableConfig = $jsonifiableSchemableConfig - static readonly jsonifySchema = jsonifySchema - static readonly dejsonifySchema = dejsonifySchema - - readonly $jsonifiableSchemableConfig = $jsonifiableSchemableConfig - readonly jsonifySchema = jsonifySchema - readonly dejsonifySchema = dejsonifySchema - - jsonify() { - return this.jsonifySchema.parse(this) - } - - jsonifyPromise() { - return this.jsonifySchema.parseAsync(this) - } - - jsonifyEffect() { - return parseZodTypeEffect(this.jsonifySchema, this) - } - } satisfies JsonifiableSchemableClass - - return jsonifiableClass as unknown as ( - Class< - InstanceType & JsonifiableSchemableObject, - ConstructorParameters - > & - StaticMembers & - StaticMembers> - ) - -} diff --git a/src/legacy/jsonifiable/schema/bigint.ts b/src/legacy/jsonifiable/schema/bigint.ts deleted file mode 100644 index b0f0093..0000000 --- a/src/legacy/jsonifiable/schema/bigint.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z } from "zod" - - -export const jsonifyBigIntSchema = (schema: S) => - schema.transform(v => v.toString()) - -export const dejsonifyBigIntSchema = (schema: S) => - z - .string() - .transform(v => { - try { - return BigInt(v) - } - catch (e) { - return v - } - }) - .pipe(schema) diff --git a/src/legacy/jsonifiable/schema/date.ts b/src/legacy/jsonifiable/schema/date.ts deleted file mode 100644 index b5ac677..0000000 --- a/src/legacy/jsonifiable/schema/date.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z } from "zod" - - -export const jsonifyDateSchema = (schema: S) => - schema.transform(v => v.toString()) - -export const dejsonifyDateSchema = (schema: S) => - z - .string() - .transform(v => { - try { - return new Date(v) - } - catch (e) { - return v - } - }) - .pipe(schema) diff --git a/src/legacy/jsonifiable/schema/decimal.ts b/src/legacy/jsonifiable/schema/decimal.ts deleted file mode 100644 index 58c492d..0000000 --- a/src/legacy/jsonifiable/schema/decimal.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Decimal } from "decimal.js" -import { z } from "zod" - - -export const jsonifyDecimalSchema = >(schema: S) => - schema.transform(v => v.toJSON()) - -export const dejsonifyDecimalSchema = >(schema: S) => - z - .string() - .transform(v => { - try { - return new Decimal(v) - } - catch (e) { - return v - } - }) - .pipe(schema) diff --git a/src/legacy/jsonifiable/schema/index.ts b/src/legacy/jsonifiable/schema/index.ts deleted file mode 100644 index 08ecef8..0000000 --- a/src/legacy/jsonifiable/schema/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./bigint" -export * from "./date" -export * from "./decimal" -export * from "./schemable" diff --git a/src/legacy/jsonifiable/schema/schemable.ts b/src/legacy/jsonifiable/schema/schemable.ts deleted file mode 100644 index c6e2a2d..0000000 --- a/src/legacy/jsonifiable/schema/schemable.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { z } from "zod" -import { JsonifiableSchemableClass, JsonifiableSchemableConfig } from ".." - - -// TODO: try to find a way to get rid of the 'class_' arg -export const jsonifySchemableSchema = < - C extends JsonifiableSchemableClass<$Config>, - $Config extends JsonifiableSchemableConfig, - S extends z.ZodType, z.ZodTypeDef, InstanceType>, ->( - class_: C | JsonifiableSchemableClass<$Config>, - schema: S, -) => - schema.pipe(class_.jsonifySchema) - -// TODO: try to find a way to get rid of the 'class_' arg -export const dejsonifySchemableSchema = < - C extends JsonifiableSchemableClass<$Config>, - $Config extends JsonifiableSchemableConfig, - S extends z.ZodType, z.ZodTypeDef, InstanceType>, ->( - class_: C | JsonifiableSchemableClass<$Config>, - schema: S, -) => - class_.dejsonifySchema.transform(v => new class_(v)).pipe(schema) diff --git a/src/legacy/makeSchemableClass.ts b/src/legacy/makeSchemableClass.ts deleted file mode 100644 index 88bcf72..0000000 --- a/src/legacy/makeSchemableClass.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { z } from "zod" -import { SchemableClass, SchemableConfig } from "." -import { zodObjectRemoveDefaults } from "./util" - - -export function makeSchemableClass< - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - SchemaWithDefaultValuesOutput extends SchemaWithDefaultValuesInput, // TODO: apply "StripSchemaInputDefaults"? - SchemaWithDefaultValuesInput extends {}, ->( - { - schema: schemaWithDefaultValues - }: { - schema: z.ZodObject< - SchemaWithDefaultValuesT, - SchemaWithDefaultValuesUnknownKeys, - SchemaWithDefaultValuesCatchall, - SchemaWithDefaultValuesOutput, - SchemaWithDefaultValuesInput - > - } -) { - - const schema = zodObjectRemoveDefaults(schemaWithDefaultValues) - - const $schemableConfig = { - values: undefined as unknown as z.output, - input: undefined as unknown as z.input, - schema: undefined as unknown as typeof schema, - schemaWithDefaultValues: undefined as unknown as typeof schemaWithDefaultValues, - } as const satisfies SchemableConfig - - return class SchemableObject { - static readonly $schemableConfig = $schemableConfig - static readonly schema = schema - static readonly schemaWithDefaultValues = schemaWithDefaultValues - - readonly $schemableConfig = $schemableConfig - readonly schema = schema - readonly schemaWithDefaultValues = schemaWithDefaultValues - - constructor(data: z.output) { - Object.assign(this, data) - } - } as SchemableClass - -} diff --git a/src/legacy/newSchemable.ts b/src/legacy/newSchemable.ts deleted file mode 100644 index da0be36..0000000 --- a/src/legacy/newSchemable.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Effect, pipe } from "effect" -import { HasRequiredKeys } from "type-fest" -import { z } from "zod" -import { SchemableClass, SchemableConfig } from "." -import { parseZodTypeEffect } from "./util" - - -type ParamsArgs = [] | [Partial] - -type NewSchemableArgs = - HasRequiredKeys extends true - ? [Input, ...ParamsArgs] - : [] | [Input, ...ParamsArgs] - - -/** - * Creates a new instance of a SchemableClass with default values. - * - * @param class_ - The SchemableClass. - * @param values - The values to be parsed and used to create the instance. - * @param params - Optional parameters for parsing. - * @returns A new instance of the specified SchemableClass. - */ -export const newSchemable = < - C extends SchemableClass<$Config>, - $Config extends SchemableConfig, ->( - class_: C | SchemableClass<$Config>, - ...[values, params]: NewSchemableArgs<$Config["input"]> -) => - new class_(class_.schemaWithDefaultValues.parse(values || {}, params)) as InstanceType - - -/** - * Creates a new instance of a SchemableClass with default values asynchronously. - * - * @param class_ - The SchemableClass. - * @param values - The values to be parsed and used to create the instance. - * @param params - Optional parameters for parsing. - * @returns A Promise resolving to a new instance of the specified SchemableClass. - */ -export const newSchemablePromise = async < - C extends SchemableClass<$Config>, - $Config extends SchemableConfig, ->( - class_: C | SchemableClass<$Config>, - ...[values, params]: NewSchemableArgs<$Config["input"]> -) => - new class_(await class_.schemaWithDefaultValues.parseAsync(values || {}, params)) as InstanceType - - -/** - * Creates a new instance of a SchemableClass with default values as an Effect. - * - * @param class_ - The SchemableClass. - * @param values - The values to be parsed and used to create the instance. - * @param params - Optional parameters for parsing. - * @returns An Effect producing a new instance of the specified SchemableClass. - */ -export const newSchemableEffect = < - C extends SchemableClass<$Config>, - $Config extends SchemableConfig, ->( - class_: C | SchemableClass<$Config>, - ...[values, params]: NewSchemableArgs<$Config["input"]> -) => pipe( - parseZodTypeEffect< - z.output, - z.input - >( - class_.schemaWithDefaultValues, - values || {}, - params, - ), - - Effect.map(values => new class_(values) as InstanceType), -) diff --git a/src/legacy/tests.ts b/src/legacy/tests.ts deleted file mode 100644 index c19daf7..0000000 --- a/src/legacy/tests.ts +++ /dev/null @@ -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/legacy/util.ts b/src/legacy/util.ts deleted file mode 100644 index 2cf7b08..0000000 --- a/src/legacy/util.ts +++ /dev/null @@ -1,82 +0,0 @@ -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/lib.ts b/src/lib.ts new file mode 100644 index 0000000..ef4a60b --- /dev/null +++ b/src/lib.ts @@ -0,0 +1,4 @@ +export { ZodSchemaClassBuilder, zodSchemaClass } from "./builders/ZodSchemaClassBuilder" +export { JsonifiableZodSchemaObject } from "./traits/JsonifiableZodSchemaObject" +export { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" +export { ZodSchemaObject, ZodSchemaObjectTrait } from "./traits/ZodSchemaObject" diff --git a/src/makeSchemableClass.ts b/src/makeSchemableClass.ts deleted file mode 100644 index 0345eb7..0000000 --- a/src/makeSchemableClass.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { AbstractClass, Class as ConcreteClass, Opaque } from "type-fest" -import { z } from "zod" -import { DefinedDefaultValuesTag } from "." -import { StaticMembers } from "./util" - - -export function makeSchemableClassFrom< - C extends AbstractClass<{ - schema?: never - defaultValues?: never - }, []> & { - schema?: never - defaultValues?: never - }, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues extends Partial, ->( - extend: C, - - { schema, defaultValues }: { - schema: z.ZodObject - defaultValues: Opaque - }, -) { - type Class = ( - C extends ConcreteClass - ? ConcreteClass - : AbstractClass - ) - - return class extends (extend as unknown as ConcreteClass) { - static readonly schema = schema - readonly schema = schema - - static readonly defaultValues = defaultValues - readonly defaultValues = defaultValues - - constructor(values: Values) { - super() - Object.assign(this, values) - } - } as unknown as ( - Class< - InstanceType & - { - readonly schema: z.ZodObject, - readonly defaultValues: DefaultValues, - } & - Values, - - Parameters<(values: Values) => void> - > & - - StaticMembers & - { - readonly schema: z.ZodObject, - readonly defaultValues: DefaultValues, - } - ) -} - - -export function makeSchemableClass< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues extends Partial, ->( - props: { - schema: z.ZodObject - defaultValues: Opaque - } -) { - return makeSchemableClassFrom(Object, props) -} diff --git a/src/newSchemable.ts b/src/newSchemable.ts deleted file mode 100644 index 98a5498..0000000 --- a/src/newSchemable.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { Effect, pipe } from "effect" -import { HasRequiredKeys } from "type-fest" -import { z } from "zod" -import { SchemableClass, SchemableClassInput } from "." -import { parseZodTypeEffect } from "./util" - - -type ParamsArgs = [] | [params: Partial] - -type NewSchemableArgs = - HasRequiredKeys extends true - ? [values: Input, ...args: ParamsArgs] - : [] | [values: Input, ...args: ParamsArgs] - - -export function newSchemable< - C extends SchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - DefaultValues, - "Class" - >, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues extends Partial, ->( - class_: C | SchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - DefaultValues, - "Class" - >, - - ...[values, params]: NewSchemableArgs< - SchemableClassInput - > -) { - return new class_( - class_.schema.parse({ ...class_.defaultValues, ...values }, params) - ) as InstanceType -} - - -export async function newSchemablePromise< - C extends SchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - DefaultValues, - "Class" - >, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues extends Partial, ->( - class_: C | SchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - DefaultValues, - "Class" - >, - - ...[values, params]: NewSchemableArgs< - SchemableClassInput - > -) { - return new class_( - await class_.schema.parseAsync({ ...class_.defaultValues, ...values }, params) - ) as InstanceType -} - - -export function newSchemableEffect< - C extends SchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - DefaultValues, - "Class" - >, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues extends Partial, ->( - class_: C | SchemableClass< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - DefaultValues, - "Class" - >, - - ...[values, params]: NewSchemableArgs< - SchemableClassInput - > -) { - return pipe( - parseZodTypeEffect( - class_.schema, - { ...class_.defaultValues, ...values }, - params, - ), - - Effect.map(values => new class_(values) as InstanceType), - ) -} diff --git a/src/observable/index.ts b/src/observable/index.ts deleted file mode 100644 index 6f219a5..0000000 --- a/src/observable/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./makeSchemableClassObservable" diff --git a/src/observable/makeSchemableClassObservable.ts b/src/observable/makeSchemableClassObservable.ts deleted file mode 100644 index 7b5fcb7..0000000 --- a/src/observable/makeSchemableClassObservable.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { mapValues } from "lodash-es" -import { makeObservable, observable } from "mobx" -import { AbstractConstructor } from "type-fest" -import { z } from "zod" -import { SchemableClass } from ".." - - -export function makeSchemableClassObservable< - C extends SchemableClass, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - Values extends {}, - DefaultValues extends Partial, ->( - extend: C | SchemableClass -) { - return class extends (extend as AbstractConstructor) { - constructor(...args: any[]) { - super(...args) - - makeObservable(this, - mapValues(this.schema.shape, () => observable) - ) - } - } as unknown as C -} diff --git a/src/schema/effect/index.ts b/src/schema/effect/index.ts new file mode 100644 index 0000000..904b057 --- /dev/null +++ b/src/schema/effect/index.ts @@ -0,0 +1,6 @@ +import { option } from "./option" + + +export const effect = { + option, +} as const diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts new file mode 100644 index 0000000..53b6abf --- /dev/null +++ b/src/schema/effect/option.ts @@ -0,0 +1,21 @@ +import { Option } from "effect" +import { identity } from "lodash-es" +import { z } from "zod" + + +export const option = { + 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/jsonifiable/schema/bigint.ts b/src/schema/jsonifiable/bigint.ts similarity index 82% rename from src/jsonifiable/schema/bigint.ts rename to src/schema/jsonifiable/bigint.ts index 76a605d..b6d02d0 100644 --- a/src/jsonifiable/schema/bigint.ts +++ b/src/schema/jsonifiable/bigint.ts @@ -1,9 +1,9 @@ +import { identity } from "lodash-es" import { Opaque } from "type-fest" import { z } from "zod" -import { identity } from "../../util" -export type JsonifiedBigInt = Opaque +export type JsonifiedBigInt = Opaque export function jsonifyBigIntSchema(schema: S) { diff --git a/src/jsonifiable/schema/date.ts b/src/schema/jsonifiable/date.ts similarity index 82% rename from src/jsonifiable/schema/date.ts rename to src/schema/jsonifiable/date.ts index c70b2ed..e147a5d 100644 --- a/src/jsonifiable/schema/date.ts +++ b/src/schema/jsonifiable/date.ts @@ -1,9 +1,9 @@ +import { identity } from "lodash-es" import { Opaque } from "type-fest" import { z } from "zod" -import { identity } from "../../util" -export type JsonifiedDate = Opaque +export type JsonifiedDate = Opaque export function jsonifyDateSchema(schema: S) { diff --git a/src/jsonifiable/schema/decimal.ts b/src/schema/jsonifiable/decimal.ts similarity index 84% rename from src/jsonifiable/schema/decimal.ts rename to src/schema/jsonifiable/decimal.ts index be387ee..ca87662 100644 --- a/src/jsonifiable/schema/decimal.ts +++ b/src/schema/jsonifiable/decimal.ts @@ -1,10 +1,10 @@ import { Decimal } from "decimal.js" +import { identity } from "lodash-es" import { Opaque } from "type-fest" import { z } from "zod" -import { identity } from "../../util" -export type JsonifiedDecimal = Opaque +export type JsonifiedDecimal = Opaque export function jsonifyDecimalSchema< diff --git a/src/schema/jsonifiable/index.ts b/src/schema/jsonifiable/index.ts new file mode 100644 index 0000000..6bff7ae --- /dev/null +++ b/src/schema/jsonifiable/index.ts @@ -0,0 +1,16 @@ +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 diff --git a/src/schema/lib.ts b/src/schema/lib.ts new file mode 100644 index 0000000..9339106 --- /dev/null +++ b/src/schema/lib.ts @@ -0,0 +1,2 @@ +export * from "./effect" +export * from "./jsonifiable" diff --git a/src/shapes/JsonifiableZodSchemaClass.ts b/src/shapes/JsonifiableZodSchemaClass.ts new file mode 100644 index 0000000..2f35971 --- /dev/null +++ b/src/shapes/JsonifiableZodSchemaClass.ts @@ -0,0 +1,78 @@ +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 new file mode 100644 index 0000000..680c59a --- /dev/null +++ b/src/shapes/ZodSchemaClass.ts @@ -0,0 +1,55 @@ +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/tests.ts b/src/tests.ts index 6015710..dff7e44 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,63 +1,64 @@ -import { pipeInto } from "ts-functional-pipe" +import { Implements } from "@thilawyn/traitify-ts" import { z } from "zod" -import { defineDefaultValues, extendSchemableClass, makeSchemableClass, newSchemable } from "." -import { dejsonifyBigIntSchema, dejsonifySchemable, jsonifyBigIntSchema, makeJsonifiableSchemableClass } from "./jsonifiable" -import { makeSchemableClassObservable } from "./observable" +import { zodSchemaClass } from "./builders/ZodSchemaClassBuilder" +import { dejsonify, jsonify } from "./schema/jsonifiable" +import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" -const UserLevel = z.enum(["User", "Admin"]) - - -class User extends pipeInto( - makeSchemableClass({ +const exp = zodSchemaClass + .schema({ schema: z.object({ - id: z.bigint(), - name: z.string(), - level: UserLevel, + /** User ID */ + id: z.bigint(), + + /** Username */ + name: z.string(), }), - defaultValues: defineDefaultValues({ - level: "User" as const + schemaWithDefaultValues: s => s.extend({ + id: s.shape.id.default(-1n), }), - }), - - v => makeSchemableClassObservable(v), - - v => makeJsonifiableSchemableClass(v, { - jsonifySchema: ({ schema, shape }) => schema.extend({ - id: jsonifyBigIntSchema(shape.id) + }) + .jsonifiable({ + jsonifySchema: s => s.extend({ + id: jsonify.bigint(s.shape.id) }), - dejsonifySchema: ({ schema, shape }) => schema.extend({ - id: dejsonifyBigIntSchema(shape.id) + dejsonifySchema: s => s.extend({ + id: dejsonify.bigint(s.shape.id) }), - }), -) {} - -User.schema + }) + .toExpression() + .expresses(MobXObservableZodSchemaObject) + .build() -const user1 = newSchemable(User, { id: 1n, name: "User" }) -user1.schema +@exp.staticImplements +class User extends exp.extends implements Implements {} -const jsonifiedUser1 = user1.jsonify() -console.log(jsonifiedUser1) -console.log(dejsonifySchemable(User, jsonifiedUser1)) +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 UserWithPhone = extendSchemableClass(User, { - schema: ({ schema }) => schema.extend({ - phone: z.string() - }), - - defaultValues: defaultValues => defineDefaultValues({ - ...defaultValues, - phone: "+33600000000", - }), -}) - -UserWithPhone.defaultValues +// 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 +// }) +// }) -// const user2 = newSchemable(UserWithPhone, { id: 1n, name: "User" }) -// console.log(user2.jsonify()) +// class AdminUser extends AdminUserProto.toClass() {} +// const subInst = await AdminUser.createPromise({ id: 2n, prout: "" }) +// console.log(subInst) diff --git a/src/traits/ExtendableZodSchemaObject.ts b/src/traits/ExtendableZodSchemaObject.ts new file mode 100644 index 0000000..0fc0891 --- /dev/null +++ b/src/traits/ExtendableZodSchemaObject.ts @@ -0,0 +1,16 @@ +// import { trait } from "@thilawyn/traitify-ts" +// import { ZodSchemaClassExtender } from "../builders/ZodSchemaClassExtender" +// import { ZodSchemaClass } from "../shapes/ZodSchemaClass" + + +// export const ExtendableZodSchemaObject = trait +// .implement(Super => class ExtendableZodSchemaObject extends Super { +// static extend< +// Self extends ZodSchemaClass, +// >( +// this: Self +// ) { +// return new ZodSchemaClassExtender(this, this) +// } +// }) +// .build() diff --git a/src/traits/JsonifiableZodSchemaObject.ts b/src/traits/JsonifiableZodSchemaObject.ts new file mode 100644 index 0000000..c747a8b --- /dev/null +++ b/src/traits/JsonifiableZodSchemaObject.ts @@ -0,0 +1,110 @@ +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() diff --git a/src/traits/MobXObservableZodSchemaObject.ts b/src/traits/MobXObservableZodSchemaObject.ts new file mode 100644 index 0000000..c9913da --- /dev/null +++ b/src/traits/MobXObservableZodSchemaObject.ts @@ -0,0 +1,23 @@ +import { trait } from "@thilawyn/traitify-ts" +import { mapValues } from "lodash-es" +import { makeObservable, observable } from "mobx" +import { z } from "zod" + + +export const MobXObservableZodSchemaObject = trait + .staticAbstract(Super => class extends Super { + declare readonly schema: z.ZodObject + }) + .implement(Super => class ObservableZodSchemaObject extends Super { + constructor(...args: any[]) { + super(...args) + + makeObservable(this, + mapValues( + (this.constructor as typeof ObservableZodSchemaObject).schema.shape, + () => observable, + ) + ) + } + }) + .build() diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts new file mode 100644 index 0000000..e866fdf --- /dev/null +++ b/src/traits/ZodSchemaObject.ts @@ -0,0 +1,122 @@ +import { ImplStatic, trait } from "@thilawyn/traitify-ts" +import { Class, HasRequiredKeys } from "type-fest" +import { z } from "zod" +import { parseZodSchemaEffect } from "../util" + + +type CreateArgs = ( + HasRequiredKeys extends true + ? [values: Input, params?: Partial] + : [] | [values: Input, params?: Partial] +) + + +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, +) => trait + .implement(Super => class ZodSchemaObject extends Super { + static readonly schema = schema + static readonly schemaWithDefaultValues = schemaWithDefaultValues + + 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)) + } + + + 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, + ) + } + }) + .build() + + +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, + PartialValues extends Partial, +> = ( + ReturnType< + typeof ZodSchemaObject< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + + SchemaWithDefaultValuesT, + SchemaWithDefaultValuesUnknownKeys, + SchemaWithDefaultValuesCatchall, + + Values, + PartialValues + > + > +) diff --git a/src/util.ts b/src/util.ts deleted file mode 100644 index a1c11d4..0000000 --- a/src/util.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Effect, pipe } from "effect" -import { AbstractClass, Class as ConcreteClass } from "type-fest" -import { z } from "zod" - - -export function identity(value: T) { - return value -} - - -export type ClassType = "AbstractClass" | "Class" - -export type Class< - Type extends ClassType, - T, - Arguments extends unknown[] = any[], -> = ( - Type extends "AbstractClass" - ? AbstractClass - : Type extends "Class" - ? ConcreteClass - : never -) - - -/** - * 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] -} - - -/** - * 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/util/class.ts b/src/util/class.ts new file mode 100644 index 0000000..616f709 --- /dev/null +++ b/src/util/class.ts @@ -0,0 +1,101 @@ +import { AbstractClass, Class as ConcreteClass } 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. + */ +export type StaticMembers> = ( + 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/effect.ts b/src/util/effect.ts new file mode 100644 index 0000000..b4da92b --- /dev/null +++ b/src/util/effect.ts @@ -0,0 +1,23 @@ +import { Effect, pipe } from "effect" +import { z } from "zod" + + +/** + * Parses a value using a Zod schema wrapped in an Effect monad. + * + * @param schema - The Zod 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 parseZodSchemaEffect = ( + 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/util/extend.ts b/src/util/extend.ts new file mode 100644 index 0000000..fb28207 --- /dev/null +++ b/src/util/extend.ts @@ -0,0 +1,55 @@ +/** + * Represents the common keys between two types. + * @template A - The first type. + * @template B - The second type. + */ +export type CommonKeys = Extract + +export type Extend = ( + T extends readonly [ + infer Super, + infer Self, + ...infer Rest extends readonly object[], + ] + ? Pick> extends Pick> + ? Extend> & Self, + ...Rest, + ]> + : never + : T extends readonly [infer Self] + ? Self + : {} +) + +export type Override = ( + T extends readonly [ + infer Super, + infer Self, + ...infer Rest extends readonly object[], + ] + ? Override> & Self, + ...Rest, + ]> + : T extends readonly [infer Self] + ? Self + : {} +) + +/** + * Merges an inheritance tree defined by an array of types without allowing overrides. + * @template T - An array of types representing the inheritance tree. + */ +export type ExtendWithoutOverriding = ( + T extends [infer Super, infer Self, ...infer Rest] + ? Pick> extends Pick> + ? ExtendWithoutOverriding<[ + Super & Self, + ...Rest, + ]> + : never + : T extends [infer Self] + ? Self + : void +) diff --git a/src/util/index.ts b/src/util/index.ts new file mode 100644 index 0000000..7bc5968 --- /dev/null +++ b/src/util/index.ts @@ -0,0 +1,4 @@ +export * from "./class" +export * from "./effect" +export * from "./extend" +export * from "./misc" diff --git a/src/util/misc.ts b/src/util/misc.ts new file mode 100644 index 0000000..f381be2 --- /dev/null +++ b/src/util/misc.ts @@ -0,0 +1,3 @@ +export function identity(value: T) { + return value +}