0.1.4 (#5)
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:
10
package.json
10
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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<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<
|
||||
A, I, R,
|
||||
JsonifiableA extends I, JsonifiableI extends TF.Jsonifiable, JsonifiableR,
|
||||
JsonifiableA,
|
||||
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))
|
||||
}
|
||||
|
||||
9
src/effect/schema/Kind.ts
Normal file
9
src/effect/schema/Kind.ts
Normal 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,
|
||||
)
|
||||
}
|
||||
@@ -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<S.Struct.Fields>
|
||||
readonly fields: { readonly [K in keyof S.Struct.Fields]: S.Struct.Fields[K] }
|
||||
}
|
||||
|
||||
export function MobXObservable<
|
||||
This extends MobXObservableInput
|
||||
>(
|
||||
class_: This,
|
||||
export function MobXObservable<A extends MobXObservableA>(
|
||||
self: A,
|
||||
options?: Omit<CreateObservableOptions, "proxy">,
|
||||
) {
|
||||
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
|
||||
}
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
export { Jsonifiable } from "./Jsonifiable"
|
||||
export { Kind } from "./Kind"
|
||||
export { Tag } from "./Tag"
|
||||
|
||||
@@ -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>()("User", {
|
||||
class User extends MutableTaggedClass<User>()("User", {
|
||||
id: S.BigIntFromSelf,
|
||||
role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")),
|
||||
}),
|
||||
MobXObservable,
|
||||
}).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 }`))
|
||||
|
||||
Reference in New Issue
Block a user