Files
thilalib/src/Schema/MobX/ObservableClass.ts
Julien Valverdé 7179913d6d
Some checks failed
Publish / publish (push) Failing after 14s
Lint / lint (push) Successful in 12s
0.1.6 (#7)
Co-authored-by: Julien Valverdé <julien.valverde@mailo.com>
Reviewed-on: #7
2024-07-29 18:42:05 +02:00

27 lines
819 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] }
}
export const ObservableClass = <Self extends ObservableClassSelf>(
self: Self,
options?: Omit<CreateObservableOptions, "proxy">,
) =>
class Observable extends self {
declare ["constructor"]: typeof Observable
constructor(...args: any[]) {
super(...args)
makeObservable(this,
mapValues(this.constructor.fields, () => observable),
options,
)
}
} as Self