From 0c8b9f345219f906002a3ebb2c491610ebd55129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 12 Jun 2024 02:14:19 +0200 Subject: [PATCH] Work --- src/effect/schema/class/Class.ts | 20 +++++++++++++++++++ src/effect/schema/class/MobXObservable.ts | 13 +++++++----- src/effect/schema/class/MutableClass.ts | 2 +- src/effect/schema/class/TMutableClass.ts | 24 +++++++++++------------ src/effect/schema/class/index.ts | 1 + src/effect/schema/class/tests.ts | 11 +++++------ src/effect/schema/class/util.ts | 4 ---- 7 files changed, 46 insertions(+), 29 deletions(-) create mode 100644 src/effect/schema/class/Class.ts diff --git a/src/effect/schema/class/Class.ts b/src/effect/schema/class/Class.ts new file mode 100644 index 0000000..dcbba72 --- /dev/null +++ b/src/effect/schema/class/Class.ts @@ -0,0 +1,20 @@ +import { Schema as S } from "@effect/schema" +import type { Annotations, Struct } from "@effect/schema/Schema" +import type { HasFields } from "./util" + + +export function Class(identifier: string) { + return ( + fieldsOr: Fields | HasFields, + annotations?: Annotations.Schema, + ) => + S.Class(identifier)(fieldsOr, annotations) as S.Class< + Self, + Fields, + Struct.Encoded, + Struct.Context, + Struct.Constructor, + {}, + {} + > +} diff --git a/src/effect/schema/class/MobXObservable.ts b/src/effect/schema/class/MobXObservable.ts index ea4cbdb..5ebbeb8 100644 --- a/src/effect/schema/class/MobXObservable.ts +++ b/src/effect/schema/class/MobXObservable.ts @@ -1,15 +1,18 @@ -import type { Class, Struct } from "@effect/schema/Schema" +import type { Struct } from "@effect/schema/Schema" import { makeObservable, observable, type CreateObservableOptions } from "mobx" import { mapValues } from "remeda" +import type { Constructor } from "type-fest" export function MobXObservable< - C extends Class + This extends Constructor, any> & { + readonly fields: { readonly [K in keyof Struct.Fields]: Struct.Fields[K] } + } >( - class_: C, + class_: This, options?: Omit, ) { - return class MobXObservable extends (class_ as Class) { + return class MobXObservable extends class_ { declare ["constructor"]: typeof MobXObservable constructor(...args: any[]) { @@ -20,5 +23,5 @@ export function MobXObservable< options, ) } - } as C + } as This } diff --git a/src/effect/schema/class/MutableClass.ts b/src/effect/schema/class/MutableClass.ts index 8d31f96..b4c3e0e 100644 --- a/src/effect/schema/class/MutableClass.ts +++ b/src/effect/schema/class/MutableClass.ts @@ -4,7 +4,7 @@ import type { TMutableClass } from "./TMutableClass" import type { HasFields } from "./util" -export function MutableClass(identifier: string) { +export function MutableClass(identifier: string) { return ( fieldsOr: Fields | HasFields, annotations?: Annotations.Schema, diff --git a/src/effect/schema/class/TMutableClass.ts b/src/effect/schema/class/TMutableClass.ts index 8b4a183..28171bd 100644 --- a/src/effect/schema/class/TMutableClass.ts +++ b/src/effect/schema/class/TMutableClass.ts @@ -2,7 +2,7 @@ import type { Annotations, Class, Struct } from "@effect/schema/Schema" import type { Mutable } from "effect/Types" import type { Constructor } from "type-fest" import type { StaticType } from "../../.." -import type { HasFields, MissingSelfGeneric } from "./util" +import type { HasFields } from "./util" export type TMutableClass< @@ -26,19 +26,17 @@ export type TMutableClass< StaticType>, "extend" > & { - extend(identifier: string): ( + extend(identifier: string): ( fields: newFields | HasFields, annotations?: Annotations.Schema, - ) => [Extended] extends [never] - ? MissingSelfGeneric<"Base.extend"> - : TMutableClass< - Extended, - Fields & newFields, - I & Struct.Encoded, - R | Struct.Context, - C & Struct.Constructor, - Self, - Proto - > + ) => TMutableClass< + Extended, + Fields & newFields, + I & Struct.Encoded, + R | Struct.Context, + C & Struct.Constructor, + Self, + Proto + > } ) diff --git a/src/effect/schema/class/index.ts b/src/effect/schema/class/index.ts index 48c560e..2cb45fd 100644 --- a/src/effect/schema/class/index.ts +++ b/src/effect/schema/class/index.ts @@ -1,3 +1,4 @@ +export { Class } from "./Class" export { MobXObservable } from "./MobXObservable" export { Mutable } from "./Mutable" export { MutableClass } from "./MutableClass" diff --git a/src/effect/schema/class/tests.ts b/src/effect/schema/class/tests.ts index 0207522..1a7ed47 100644 --- a/src/effect/schema/class/tests.ts +++ b/src/effect/schema/class/tests.ts @@ -3,22 +3,21 @@ import { MutableClass } from "./MutableClass" import { pipe } from "remeda" import { Mutable } from "./Mutable" import { MobXObservable } from "./MobXObservable" +import { Class } from "./Class" const UserSuper = () => pipe( - MutableClass("User")({ + Class("User")({ id: S.BigIntFromSelf, role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), }), - v => MobXObservable(v), + Mutable, + MobXObservable, ) -class User extends MutableClass("User")({ - id: S.BigIntFromSelf, - role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), -}) {} +class User extends UserSuper() {} const user1 = new User({ id: 1n, role: "BasicUser" }) user1.id = 1n diff --git a/src/effect/schema/class/util.ts b/src/effect/schema/class/util.ts index 504f41b..79e6027 100644 --- a/src/effect/schema/class/util.ts +++ b/src/effect/schema/class/util.ts @@ -1,10 +1,6 @@ import type { Struct } from "@effect/schema/Schema" -export type MissingSelfGeneric = ( - `Missing \`Self\` generic - use \`class Self extends ${Usage}()(${Params}{ ... })\`` -) - export type HasFields = ( | { readonly fields: Fields } | { readonly from: HasFields }