{"version":3,"file":"options-vue3.mjs","sources":["effector-vue/lib/unwrapProxy.ts","effector-vue/lib/deepEqual.ts","effector-vue/lib/deepCopy.ts","effector-vue/optionsApi.ts"],"sourcesContent":["import {isReactive, toRaw, unref} from 'vue-next'\n\nexport function unwrapProxy<T>(payload: T) {\n  const data = unref(payload)\n  const raw = isReactive(data) ? toRaw(data) : data\n  return raw\n}\n","// @ts-nocheck\nexport function deepEqual(x, y) {\n  if (x === y) {\n    return true\n  } else if (\n    typeof x == 'object' &&\n    x != null &&\n    typeof y == 'object' &&\n    y != null\n  ) {\n    if (Object.keys(x).length != Object.keys(y).length) return false\n\n    for (const prop in x) {\n      // eslint-disable-next-line no-prototype-builtins\n      if (y.hasOwnProperty(prop)) {\n        if (!deepEqual(x[prop], y[prop])) return false\n      } else return false\n    }\n\n    return true\n  } else return false\n}\n","// @ts-nocheck\nexport function deepCopy<T>(obj, cache = new Map()): T {\n  if (obj === null || typeof obj !== 'object') {\n    return obj\n  }\n\n  if (obj instanceof Date) {\n    return obj\n  }\n\n  const hit = cache.get(obj)\n\n  if (hit) {\n    return hit\n  }\n\n  const copy = Array.isArray(obj) ? [] : {}\n  cache.set(obj, copy)\n\n  for (const key of Object.keys(obj)) {\n    copy[key] = deepCopy(obj[key], cache)\n  }\n\n  return copy\n}\n","import {\n  is,\n  Store,\n  sample,\n  restore,\n  clearNode,\n  withRegion,\n  createEvent,\n} from 'effector'\nimport {\n  Plugin,\n  ComponentOptions,\n  shallowRef,\n  watch,\n  WatchCallback,\n  WatchOptions,\n} from 'vue-next'\n\nimport {unwrapProxy} from './lib/unwrapProxy'\nimport {deepEqual} from './lib/deepEqual'\nimport {deepCopy} from './lib/deepCopy'\n\ntype Body = {\n  vModel: boolean\n  value: Store<any>\n}\n\nconst mixin: ComponentOptions = {\n  data() {\n    let shape = this.$options.effector\n\n    if (!shape) return {}\n\n    if (typeof shape !== 'function') {\n      throw Error('[effector] option should be a function')\n    }\n\n    shape = shape.call(this)\n\n    if (typeof shape !== 'object') {\n      throw Error('Returned value should be an object')\n    }\n\n    // @ts-ignore\n    this.__clear = createEvent()\n\n    const config: Record<string, Body> = {}\n    const state: Record<string, any> = {}\n\n    // @ts-ignore\n    withRegion(this.__clear, () => {\n      for (const key in shape) {\n        const value = shape[key]\n\n        const watchOptions: WatchOptions = {deep: true, immediate: false}\n        let watchCallback: WatchCallback\n\n        let nextID = 0\n\n        let fromEvent = false\n        let isSelfUpdate = false\n\n        if (is.store(value)) {\n          config[key] = {\n            value,\n            vModel: false,\n          }\n        } else if (is.event(value) || is.effect(value)) {\n          config[key] = {\n            value: restore(\n              value.map(() => ++nextID),\n              null,\n            ),\n            vModel: false,\n          }\n        } else {\n          if (!is.store(value.value)) {\n            throw Error(`Effector property ${key}.value should be Store`)\n          }\n          config[key] = value\n        }\n\n        state[key] = shallowRef(config[key].value.getState())\n\n        config[key].value.updates.watch((payload: unknown) => {\n          if (isSelfUpdate) {\n            return\n          }\n\n          fromEvent = true\n          state[key].value = shallowRef(payload).value\n        })\n\n        if (!config[key].vModel) {\n          let temp: any = null\n\n          watchCallback = (newValue, oldValue) => {\n            if (!fromEvent) {\n              const isEqual = deepEqual(newValue, temp)\n\n              if (isEqual) {\n                temp = null\n                return\n              }\n\n              console.error(\n                `[${key}] is immutable value. You must update this value via effector events`,\n              )\n\n              temp = deepCopy(oldValue)\n              state[key].value = deepCopy(oldValue)\n            }\n\n            fromEvent = false\n          }\n        } else {\n          const updated = createEvent<unknown>()\n          sample({clock: updated, target: value.value})\n\n          watchCallback = value => {\n            isSelfUpdate = true\n\n            if (!fromEvent) {\n              updated(unwrapProxy(value))\n            }\n\n            fromEvent = false\n            isSelfUpdate = false\n          }\n        }\n\n        watch(() => state[key].value, watchCallback, watchOptions)\n      }\n    })\n\n    return state\n  },\n\n  beforeUnmount() {\n    if (this.__clear) {\n      clearNode(this.__clear)\n    }\n  },\n}\n\nexport const VueEffector: Plugin = {\n  install(app) {\n    app.mixin(mixin)\n  },\n}\n"],"names":["unwrapProxy","payload","data","unref","isReactive","toRaw","deepEqual","x","y","Object","keys","length","prop","hasOwnProperty","deepCopy","obj","cache","Map","Date","hit","get","copy","Array","isArray","set","key","mixin","shape","this","$options","effector","Error","call","__clear","createEvent","config","state","withRegion","value","watchOptions","deep","immediate","watchCallback","nextID","fromEvent","isSelfUpdate","is","store","vModel","event","effect","restore","map","shallowRef","getState","updates","watch","updated","sample","clock","target","temp","newValue","oldValue","console","error","beforeUnmount","clearNode","VueEffector","install","app"],"mappings":"AAEO,SAASA,EAAeC,SACvBC,EAAOC,EAAMF,UACPG,EAAWF,GAAQG,EAAMH,GAAQA,ECHxC,SAASI,EAAUC,EAAGC,MACvBD,IAAMC,SACD,EACF,GACO,iBAALD,GACF,MAALA,GACY,iBAALC,GACF,MAALA,EACA,IACIC,OAAOC,KAAKH,GAAGI,QAAUF,OAAOC,KAAKF,GAAGG,OAAQ,OAAO,MAEtD,MAAMC,KAAQL,EAAG,KAEhBC,EAAEK,eAAeD,GAEd,OAAO,MADPN,EAAUC,EAAEK,GAAOJ,EAAEI,IAAQ,OAAO,SAItC,EACF,OAAO,ECnBT,SAASE,EAAYC,EAAKC,EAAQ,IAAIC,QAC/B,OAARF,GAA+B,iBAARA,SAClBA,KAGLA,aAAeG,YACVH,QAGHI,EAAMH,EAAMI,IAAIL,MAElBI,SACKA,QAGHE,EAAOC,MAAMC,QAAQR,GAAO,GAAK,GACvCC,EAAMQ,IAAIT,EAAKM,OAEV,MAAMI,KAAOhB,OAAOC,KAAKK,GAC5BM,EAAKI,GAAOX,EAASC,EAAIU,GAAMT,UAG1BK,wMCIT,MAAMK,EAA0B,CAC9BxB,WACMyB,EAAQC,KAAKC,SAASC,aAErBH,EAAO,MAAO,MAEE,mBAAVA,QACHI,MAAM,6CAGdJ,EAAQA,EAAMK,KAAKJ,MAEE,iBAAVD,QACHI,MAAM,2CAITE,QAAUC,UAETC,EAA+B,GAC/BC,EAA6B,UAGnCC,EAAWT,KAAKK,SAAS,SAClB,MAAMR,KAAOE,EAAO,OACjBW,EAAQX,EAAMF,GAEdc,EAA6B,CAACC,KAAM,EAAMC,UAAW,OACvDC,EAEAC,EAAS,EAETC,EAAY,EACZC,EAAe,KAEfC,EAAGC,MAAMT,GACXH,EAAOV,GAAO,CACZa,MAAAA,EACAU,OAAQ,QAEL,GAAIF,EAAGG,MAAMX,IAAUQ,EAAGI,OAAOZ,GACtCH,EAAOV,GAAO,CACZa,MAAOa,EACLb,EAAMc,KAAI,MAAQT,IAClB,MAEFK,OAAQ,OAEL,KACAF,EAAGC,MAAMT,EAAMA,aACZP,MAAO,qBAAoBN,2BAEnCU,EAAOV,GAAOa,KAGhBF,EAAMX,GAAO4B,EAAWlB,EAAOV,GAAKa,MAAMgB,YAE1CnB,EAAOV,GAAKa,MAAMiB,QAAQC,OAAOvD,IAC3B4C,IAIJD,EAAY,EACZR,EAAMX,GAAKa,MAAQe,EAAWpD,GAASqC,UAGpCH,EAAOV,GAAKuB,OAsBV,OACCS,EAAUvB,IAChBwB,EAAO,CAACC,MAAOF,EAASG,OAAQtB,EAAMA,QAEtCI,EAAgBJ,IACdO,EAAe,EAEVD,GACHa,EAAQzD,EAAYsC,IAGtBM,EAAY,EACZC,EAAe,OAlCM,KACnBgB,EAAY,KAEhBnB,EAAgB,CAACoB,EAAUC,SACpBnB,EAAW,IACEtC,EAAUwD,EAAUD,eAGlCA,EAAO,MAITG,QAAQC,MACL,IAAGxC,yEAGNoC,EAAO/C,EAASiD,GAChB3B,EAAMX,GAAKa,MAAQxB,EAASiD,GAG9BnB,EAAY,GAkBhBY,GAAM,IAAMpB,EAAMX,GAAKa,OAAOI,EAAeH,OAI1CH,GAGT8B,gBACMtC,KAAKK,SACPkC,EAAUvC,KAAKK,WAKRmC,EAAsB,CACjCC,QAAQC,GACNA,EAAI5C,MAAMA"}