import { mapValues } from "lodash-es" import { makeObservable, observable } from "mobx" import { AbstractConstructor } from "type-fest" import { z } from "zod" import { SchemableClass } from ".." export function makeSchemableClassObservable< C extends SchemableClass, SchemaT extends z.ZodRawShape, SchemaUnknownKeys extends z.UnknownKeysParam, SchemaCatchall extends z.ZodTypeAny, Values extends {}, DefaultValues extends Partial, >( extend: C | SchemableClass ) { return class extends (extend as AbstractConstructor) { constructor(...args: any[]) { super(...args) makeObservable(this, mapValues(this.schema.shape, () => observable) ) } } as unknown as C }