{"version":3,"file":"index.mjs","names":["getters: any","result: any"],"sources":["../src/utils.ts","../src/index.ts"],"sourcesContent":["export function getAllGetters(obj: any) {\n  const getters: any = {};\n\n  // Iterate over all properties of the object itself (not its prototype chain)\n  Object.getOwnPropertyNames(obj).forEach(prop => {\n    const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n\n    // Check if the property has a getter\n    if (descriptor && typeof descriptor.get === 'function') {\n      getters[prop] = descriptor.get;\n    }\n  });\n\n  // Iterate over all properties of the object's prototype chain\n  let proto = Object.getPrototypeOf(obj);\n  while (proto !== null) {\n    Object.getOwnPropertyNames(proto).forEach(prop => {\n      const descriptor = Object.getOwnPropertyDescriptor(proto, prop);\n\n      // Check if the property has a getter\n      if (\n        descriptor &&\n        typeof descriptor.get === 'function' &&\n        !getters.hasOwnProperty(prop)\n      ) {\n        getters[prop] = descriptor.get;\n      }\n    });\n\n    proto = Object.getPrototypeOf(proto);\n  }\n\n  return getters;\n}\n","import { StateCreator, StoreMutatorIdentifier } from 'zustand';\nimport { getAllGetters } from './utils';\n\nconst prefix = '$$_computed_';\ntype ComputeFunctionType<StoreType, T> = (store: StoreType) => T;\n\nfunction injectComputedMiddleware(f: StateCreator<any>): StateCreator<any> {\n  return (set, get, api) => {\n    type Set = typeof set;\n    function getComputedState(state: any) {\n      const computedFunctions = Object.entries(state)\n        .filter(([key]) => key.startsWith(prefix))\n        .map(s => s[1] as ComputeFunctionType<any, any>);\n\n      const computedSt = computedFunctions.reduce(\n        (acc, cur) => ({\n          ...acc,\n          ...cur(state),\n        }),\n        {}\n      );\n\n      return computedSt;\n    }\n    const setWithComputedFactory = (set: Set) => (\n      update: any | ((state: any) => any),\n      replace?: boolean\n    ) => {\n      set((state: any) => {\n        const updated = typeof update === 'object' ? update : update(state);\n        const newState = {\n          ...state,\n          ...updated,\n        };\n\n        return {\n          ...newState,\n          ...getComputedState(newState),\n        };\n      }, replace as any);\n    };\n\n    const originalSetState = api.setState;\n\n    api.setState = setWithComputedFactory(originalSetState);\n    const st = f(setWithComputedFactory(set), get, api);\n\n    return Object.assign({}, st, getComputedState(st));\n  };\n}\n\nfunction withGetters(initialState: any) {\n  const getters = getAllGetters(initialState);\n  return (newState: any) => {\n    const result: any = {};\n\n    Object.keys(getters).forEach(key => {\n      result[key] = getters[key].bind(newState)();\n    });\n\n    return result;\n  };\n}\n\nexport function compute<StoreType>(\n  store: StoreType,\n  get?: never,\n  compute?: never\n): StoreType;\n\nexport function compute<StoreType, T extends Partial<StoreType>>(\n  id: string,\n  get: () => StoreType,\n  compute: ComputeFunctionType<StoreType, T>\n): T;\n\nexport function compute<StoreType, T extends Partial<StoreType>>(\n  get: () => StoreType,\n  compute: ComputeFunctionType<StoreType, T>,\n  id?: never\n): T;\nexport function compute(\n  // @ts-ignore\n  getOrId: any,\n  getOrCompute: any,\n  computeOrUndefined: any\n) {\n  if (typeof getOrId === 'string') {\n    return {\n      [`${prefix}_${getOrId}`]: computeOrUndefined,\n    };\n  }\n\n  if (typeof getOrId === 'object') {\n    return {\n      ...getOrId,\n      [prefix]: withGetters(getOrId),\n    };\n  }\n\n  return {\n    [prefix]: getOrCompute,\n  } as any;\n}\n\ntype ComputedState = <\n  T,\n  Mps extends [StoreMutatorIdentifier, unknown][] = [],\n  Mcs extends [StoreMutatorIdentifier, unknown][] = []\n>(\n  f: StateCreator<T, Mps, Mcs>\n) => StateCreator<T, Mps, Mcs>;\n\nexport const computed = (((f: any) =>\n  injectComputedMiddleware(f as any) as any) as unknown) as ComputedState;\n"],"mappings":";AAAA,SAAgB,cAAc,KAAU;CACtC,MAAMA,UAAe,EAAE;AAGvB,QAAO,oBAAoB,IAAI,CAAC,SAAQ,SAAQ;EAC9C,MAAM,aAAa,OAAO,yBAAyB,KAAK,KAAK;AAG7D,MAAI,cAAc,OAAO,WAAW,QAAQ,WAC1C,SAAQ,QAAQ,WAAW;GAE7B;CAGF,IAAI,QAAQ,OAAO,eAAe,IAAI;AACtC,QAAO,UAAU,MAAM;AACrB,SAAO,oBAAoB,MAAM,CAAC,SAAQ,SAAQ;GAChD,MAAM,aAAa,OAAO,yBAAyB,OAAO,KAAK;AAG/D,OACE,cACA,OAAO,WAAW,QAAQ,cAC1B,CAAC,QAAQ,eAAe,KAAK,CAE7B,SAAQ,QAAQ,WAAW;IAE7B;AAEF,UAAQ,OAAO,eAAe,MAAM;;AAGtC,QAAO;;;;;AC7BT,MAAM,SAAS;AAGf,SAAS,yBAAyB,GAAyC;AACzE,SAAQ,KAAK,KAAK,QAAQ;EAExB,SAAS,iBAAiB,OAAY;AAapC,UAZ0B,OAAO,QAAQ,MAAM,CAC5C,QAAQ,CAAC,SAAS,IAAI,WAAW,OAAO,CAAC,CACzC,KAAI,MAAK,EAAE,GAAoC,CAEb,QAClC,KAAK,SAAS;IACb,GAAG;IACH,GAAG,IAAI,MAAM;IACd,GACD,EAAE,CACH;;EAIH,MAAM,0BAA0B,WAC9B,QACA,YACG;AACH,UAAK,UAAe;IAClB,MAAM,UAAU,OAAO,WAAW,WAAW,SAAS,OAAO,MAAM;IACnE,MAAM,WAAW;KACf,GAAG;KACH,GAAG;KACJ;AAED,WAAO;KACL,GAAG;KACH,GAAG,iBAAiB,SAAS;KAC9B;MACA,QAAe;;EAGpB,MAAM,mBAAmB,IAAI;AAE7B,MAAI,WAAW,uBAAuB,iBAAiB;EACvD,MAAM,KAAK,EAAE,uBAAuB,IAAI,EAAE,KAAK,IAAI;AAEnD,SAAO,OAAO,OAAO,EAAE,EAAE,IAAI,iBAAiB,GAAG,CAAC;;;AAItD,SAAS,YAAY,cAAmB;CACtC,MAAM,UAAU,cAAc,aAAa;AAC3C,SAAQ,aAAkB;EACxB,MAAMC,SAAc,EAAE;AAEtB,SAAO,KAAK,QAAQ,CAAC,SAAQ,QAAO;AAClC,UAAO,OAAO,QAAQ,KAAK,KAAK,SAAS,EAAE;IAC3C;AAEF,SAAO;;;AAqBX,SAAgB,QAEd,SACA,cACA,oBACA;AACA,KAAI,OAAO,YAAY,SACrB,QAAO,GACJ,GAAG,OAAO,GAAG,YAAY,oBAC3B;AAGH,KAAI,OAAO,YAAY,SACrB,QAAO;EACL,GAAG;GACF,SAAS,YAAY,QAAQ;EAC/B;AAGH,QAAO,GACJ,SAAS,cACX;;AAWH,MAAa,aAAc,MACzB,yBAAyB,EAAS"}