27 lines
918 B
TypeScript
27 lines
918 B
TypeScript
import { Schema } from "@effect/schema"
|
|
import { makeObservable, observable, type CreateObservableOptions } from "mobx"
|
|
import { mapValues } from "remeda"
|
|
|
|
|
|
interface ObservableClassSelf {
|
|
new(...args: any[]): Schema.Struct.Type<Schema.Struct.Fields>
|
|
readonly fields: { readonly [K in keyof Schema.Struct.Fields]: Schema.Struct.Fields[K] }
|
|
}
|
|
|
|
interface ObservableClassOptions extends Omit<CreateObservableOptions, "proxy"> {}
|
|
|
|
export const ObservableClass = (options?: ObservableClassOptions) =>
|
|
<Self extends ObservableClassSelf>(self: Self) =>
|
|
class Observable extends self {
|
|
declare ["constructor"]: typeof Observable
|
|
|
|
constructor(...args: any[]) {
|
|
super(...args)
|
|
|
|
makeObservable(this,
|
|
mapValues(this.constructor.fields, () => observable),
|
|
options,
|
|
)
|
|
}
|
|
} as Self
|