From cdba0c91873b9788c24b0824efe37aee0f4ded1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 27 Jun 2024 18:47:11 +0200 Subject: [PATCH] 0.1.4 (#5) 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/thilalib/pulls/5 --- bun.lockb | Bin 154880 -> 154881 bytes package.json | 10 +++--- src/effect/schema/Jsonifiable.ts | 36 +++++++++++++++++++--- src/effect/schema/Kind.ts | 9 ++++++ src/effect/schema/class/MobXObservable.ts | 12 +++----- src/effect/schema/index.ts | 1 + src/effect/schema/{class => }/tests.ts | 24 +++++++++------ 7 files changed, 66 insertions(+), 26 deletions(-) create mode 100644 src/effect/schema/Kind.ts rename src/effect/schema/{class => }/tests.ts (56%) diff --git a/bun.lockb b/bun.lockb index f65e392d0ba03dd9f5d7dfa9159ff12223f237cc..168faa40218c76207a86d4ecb9240cb9f463139d 100755 GIT binary patch delta 558 zcmV+}0@3||x(R{036L%!lLg}wS6_CFMIobPPucw~PYP$L>&CioJFc$)6z4QEaj{Ry z3<=M7000UA0Du;=Aq__jlPD`NvzQuCVgV78(HSR`kQ)fI7<~`{lPDrE4Uu;M06qW! zfB*mh07R1^U@Mc58wd&6cK`rA004jklVMUf0Uxv3eoPub{&2mP3SU=_XMEmg$t-5LF@nyrn#6{Deov%*@Y3uV$-;4?JopX{t^Wfzs01{w)W9X507^SQkVVrjNX%Uy5IvLM*000UA0DyEEGUfV44!Z&YUNbH+IW91lAL0QR1T_Ev7PmX% w0j&W6X_x8a0p|fRx6$MQmvsR*w`p1eGXa;h?*Sl}yjubt0x>eT+FJr90qmLNi~s-t delta 560 zcmV-00?++{x(R@~36L%!%EidyOaIsIx z3<=J6000UA0Du*9^S_b7W53Y~+;`t56H7x8~M|2uea480eAsG%WWVp_sptpCQ!chP0Oy{mJsatX7Ljj{uM3i z^2x-sJyvWbwI?2U8kt0a-RMbm_I2-Dmi{6Fas}$ZwmyIF;7(nE>0tPXM5}0jx zY+=wyo$b<8l`A~=E7^RJQb?mitQbP=%@_*0^US6tzG|{iobSgUs^cJ9k&{$GXCpZ= ztSGnTA^|gl8aV)EW@cq$bN~QfAm5aM%*D3^0bVmMG%hliGNu7E0XCOsrU9A)FaVbw zrvV$69;X2q0Wh~WrvcA88P0bA015yAfOHu$<@!bry8;1TGcGYVE;5%N;sF>0G5`P- yw>#nitpNdOm+9jH=K(Oc(c}S_bpbZFX<7m^0hf|V0w9;XTLK*cIk($e0ww{iZ0uVA 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 }`))