diff --git a/bun.lockb b/bun.lockb index f65e392..168faa4 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index f066f24..808c720 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thilawyn/thilalib", - "version": "0.1.3", + "version": "0.1.4", "type": "module", "files": [ "./dist" @@ -46,11 +46,11 @@ "clean:node": "rm -rf node_modules" }, "dependencies": { - "remeda": "^2.2.0", + "remeda": "^2.2.1", "type-fest": "^4.20.1" }, "devDependencies": { - "bun-types": "^1.1.16", + "bun-types": "^1.1.17", "npm-check-updates": "^16.14.20", "npm-sort": "^0.0.4", "tsup": "^8.1.0", @@ -58,8 +58,8 @@ "typescript": "^5.5.2" }, "optionalDependencies": { - "@effect/schema": "^0.68.9", - "effect": "^3.4.2", + "@effect/schema": "^0.68.12", + "effect": "^3.4.5", "mobx": "^6.12.4" } } diff --git a/src/effect/schema/Jsonifiable.ts b/src/effect/schema/Jsonifiable.ts index 26c19b2..e426a20 100644 --- a/src/effect/schema/Jsonifiable.ts +++ b/src/effect/schema/Jsonifiable.ts @@ -2,12 +2,38 @@ import { Schema as S } from "@effect/schema" import type * as TF from "type-fest" +// export function Jsonifiable< +// A, I, R, +// JsonifiableA extends I, JsonifiableI extends TF.Jsonifiable, JsonifiableR, +// >( +// schema: S.Schema, +// jsonifiable: S.Schema, +// ) { +// return jsonifiable.pipe(S.compose(schema)) +// } + +// export function Jsonifiable( +// schema: S.Schema +// ) { +// return < +// JsonifiableA extends I, +// JsonifiableI extends TF.Jsonifiable, +// JsonifiableR, +// >( +// jsonifiable: S.Schema +// ) => +// jsonifiable.pipe(S.compose(schema)) +// } + export function Jsonifiable< - A, I, R, - JsonifiableA extends I, JsonifiableI extends TF.Jsonifiable, JsonifiableR, + JsonifiableA, + JsonifiableI extends TF.Jsonifiable, + JsonifiableR, >( - schema: S.Schema, - jsonifiable: S.Schema, + jsonifiable: S.Schema ) { - return jsonifiable.pipe(S.compose(schema)) + return ( + schema: S.Schema + ) => + jsonifiable.pipe(S.compose(schema)) } diff --git a/src/effect/schema/Kind.ts b/src/effect/schema/Kind.ts new file mode 100644 index 0000000..3f6748a --- /dev/null +++ b/src/effect/schema/Kind.ts @@ -0,0 +1,9 @@ +import { Schema as S } from "@effect/schema" + + +export function Kind(kind: Kind) { + return S.withConstructorDefault( + S.propertySignature(S.Literal(kind)), + () => kind, + ) +} diff --git a/src/effect/schema/class/MobXObservable.ts b/src/effect/schema/class/MobXObservable.ts index cc47903..f967df0 100644 --- a/src/effect/schema/class/MobXObservable.ts +++ b/src/effect/schema/class/MobXObservable.ts @@ -3,18 +3,16 @@ import { makeObservable, observable, type CreateObservableOptions } from "mobx" import { mapValues } from "remeda" -interface MobXObservableInput { +interface MobXObservableA { new(...args: any[]): S.Struct.Type readonly fields: { readonly [K in keyof S.Struct.Fields]: S.Struct.Fields[K] } } -export function MobXObservable< - This extends MobXObservableInput ->( - class_: This, +export function MobXObservable( + self: A, options?: Omit, ) { - return class MobXObservable extends class_ { + return class MobXObservable extends self { declare ["constructor"]: typeof MobXObservable constructor(...args: any[]) { @@ -25,5 +23,5 @@ export function MobXObservable< options, ) } - } as This + } as A } diff --git a/src/effect/schema/index.ts b/src/effect/schema/index.ts index 2275c31..e4b52a0 100644 --- a/src/effect/schema/index.ts +++ b/src/effect/schema/index.ts @@ -1,2 +1,3 @@ export { Jsonifiable } from "./Jsonifiable" +export { Kind } from "./Kind" export { Tag } from "./Tag" diff --git a/src/effect/schema/class/tests.ts b/src/effect/schema/tests.ts similarity index 56% rename from src/effect/schema/class/tests.ts rename to src/effect/schema/tests.ts index 859af98..0e9f692 100644 --- a/src/effect/schema/class/tests.ts +++ b/src/effect/schema/tests.ts @@ -1,18 +1,24 @@ import { Schema as S } from "@effect/schema" import { reaction, runInAction } from "mobx" -import { pipe } from "remeda" -import { MobXObservable } from "./MobXObservable" -import { MutableTaggedClass } from "./MutableTaggedClass" +import { Jsonifiable } from "./Jsonifiable" +import { MobXObservable, MutableTaggedClass } from "./class" -class User extends pipe( - MutableTaggedClass()("User", { - id: S.BigIntFromSelf, - role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), - }), - MobXObservable, +class User extends MutableTaggedClass()("User", { + id: S.BigIntFromSelf, + role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), +}).pipe( + MobXObservable ) {} +const JsonifiableUser = User.pipe( + Jsonifiable(S.Struct({ + ...User.fields, + id: S.BigInt, + })) +) + + const user1 = new User({ id: -1n, role: "BasicUser" }) reaction(() => user1.id, id => console.log(`user1 id changed: ${ id }`))