0.1.4 (#5)
All checks were successful
Publish / publish (push) Successful in 13s
Lint / lint (push) Successful in 10s

Co-authored-by: Julien Valverdé <julien.valverde@mailo.com>
Reviewed-on: https://git.jvalver.de/Thilawyn/thilalib/pulls/5
This commit was merged in pull request #5.
This commit is contained in:
Julien Valverdé
2024-06-27 18:47:11 +02:00
parent aa2478eb86
commit cdba0c9187
7 changed files with 66 additions and 26 deletions

BIN
bun.lockb

Binary file not shown.

View File

@@ -1,6 +1,6 @@
{ {
"name": "@thilawyn/thilalib", "name": "@thilawyn/thilalib",
"version": "0.1.3", "version": "0.1.4",
"type": "module", "type": "module",
"files": [ "files": [
"./dist" "./dist"
@@ -46,11 +46,11 @@
"clean:node": "rm -rf node_modules" "clean:node": "rm -rf node_modules"
}, },
"dependencies": { "dependencies": {
"remeda": "^2.2.0", "remeda": "^2.2.1",
"type-fest": "^4.20.1" "type-fest": "^4.20.1"
}, },
"devDependencies": { "devDependencies": {
"bun-types": "^1.1.16", "bun-types": "^1.1.17",
"npm-check-updates": "^16.14.20", "npm-check-updates": "^16.14.20",
"npm-sort": "^0.0.4", "npm-sort": "^0.0.4",
"tsup": "^8.1.0", "tsup": "^8.1.0",
@@ -58,8 +58,8 @@
"typescript": "^5.5.2" "typescript": "^5.5.2"
}, },
"optionalDependencies": { "optionalDependencies": {
"@effect/schema": "^0.68.9", "@effect/schema": "^0.68.12",
"effect": "^3.4.2", "effect": "^3.4.5",
"mobx": "^6.12.4" "mobx": "^6.12.4"
} }
} }

View File

@@ -2,12 +2,38 @@ import { Schema as S } from "@effect/schema"
import type * as TF from "type-fest" import type * as TF from "type-fest"
// export function Jsonifiable<
// A, I, R,
// JsonifiableA extends I, JsonifiableI extends TF.Jsonifiable, JsonifiableR,
// >(
// schema: S.Schema<A, I, R>,
// jsonifiable: S.Schema<JsonifiableA, JsonifiableI, JsonifiableR>,
// ) {
// return jsonifiable.pipe(S.compose(schema))
// }
// export function Jsonifiable<A, I, R>(
// schema: S.Schema<A, I, R>
// ) {
// return <
// JsonifiableA extends I,
// JsonifiableI extends TF.Jsonifiable,
// JsonifiableR,
// >(
// jsonifiable: S.Schema<JsonifiableA, JsonifiableI, JsonifiableR>
// ) =>
// jsonifiable.pipe(S.compose(schema))
// }
export function Jsonifiable< export function Jsonifiable<
A, I, R, JsonifiableA,
JsonifiableA extends I, JsonifiableI extends TF.Jsonifiable, JsonifiableR, JsonifiableI extends TF.Jsonifiable,
JsonifiableR,
>( >(
schema: S.Schema<A, I, R>, jsonifiable: S.Schema<JsonifiableA, JsonifiableI, JsonifiableR>
jsonifiable: S.Schema<JsonifiableA, JsonifiableI, JsonifiableR>,
) { ) {
return jsonifiable.pipe(S.compose(schema)) return <A, R>(
schema: S.Schema<A, JsonifiableA, R>
) =>
jsonifiable.pipe(S.compose(schema))
} }

View File

@@ -0,0 +1,9 @@
import { Schema as S } from "@effect/schema"
export function Kind<Kind extends string>(kind: Kind) {
return S.withConstructorDefault(
S.propertySignature(S.Literal(kind)),
() => kind,
)
}

View File

@@ -3,18 +3,16 @@ import { makeObservable, observable, type CreateObservableOptions } from "mobx"
import { mapValues } from "remeda" import { mapValues } from "remeda"
interface MobXObservableInput { interface MobXObservableA {
new(...args: any[]): S.Struct.Type<S.Struct.Fields> new(...args: any[]): S.Struct.Type<S.Struct.Fields>
readonly fields: { readonly [K in keyof S.Struct.Fields]: S.Struct.Fields[K] } readonly fields: { readonly [K in keyof S.Struct.Fields]: S.Struct.Fields[K] }
} }
export function MobXObservable< export function MobXObservable<A extends MobXObservableA>(
This extends MobXObservableInput self: A,
>(
class_: This,
options?: Omit<CreateObservableOptions, "proxy">, options?: Omit<CreateObservableOptions, "proxy">,
) { ) {
return class MobXObservable extends class_ { return class MobXObservable extends self {
declare ["constructor"]: typeof MobXObservable declare ["constructor"]: typeof MobXObservable
constructor(...args: any[]) { constructor(...args: any[]) {
@@ -25,5 +23,5 @@ export function MobXObservable<
options, options,
) )
} }
} as This } as A
} }

View File

@@ -1,2 +1,3 @@
export { Jsonifiable } from "./Jsonifiable" export { Jsonifiable } from "./Jsonifiable"
export { Kind } from "./Kind"
export { Tag } from "./Tag" export { Tag } from "./Tag"

View File

@@ -1,18 +1,24 @@
import { Schema as S } from "@effect/schema" import { Schema as S } from "@effect/schema"
import { reaction, runInAction } from "mobx" import { reaction, runInAction } from "mobx"
import { pipe } from "remeda" import { Jsonifiable } from "./Jsonifiable"
import { MobXObservable } from "./MobXObservable" import { MobXObservable, MutableTaggedClass } from "./class"
import { MutableTaggedClass } from "./MutableTaggedClass"
class User extends pipe( class User extends MutableTaggedClass<User>()("User", {
MutableTaggedClass<User>()("User", {
id: S.BigIntFromSelf, id: S.BigIntFromSelf,
role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")),
}), }).pipe(
MobXObservable, MobXObservable
) {} ) {}
const JsonifiableUser = User.pipe(
Jsonifiable(S.Struct({
...User.fields,
id: S.BigInt,
}))
)
const user1 = new User({ id: -1n, role: "BasicUser" }) const user1 = new User({ id: -1n, role: "BasicUser" })
reaction(() => user1.id, id => console.log(`user1 id changed: ${ id }`)) reaction(() => user1.id, id => console.log(`user1 id changed: ${ id }`))