{"version":3,"file":"effector-vue.mjs","sources":["effector-vue/EffectorScopePlugin.ts","effector-vue/index.ts"],"sourcesContent":["import {Scope} from 'effector'\nimport {Plugin} from 'vue-next'\n\nexport function EffectorScopePlugin(options: {\n  scope: Scope\n  scopeName?: string\n}): Plugin {\n  return {\n    install(app) {\n      let scopeName = options.scopeName ?? 'root'\n\n      app.config.globalProperties.scopeName = scopeName\n      app.provide(app.config.globalProperties.scopeName, options.scope)\n    },\n  }\n}\n","import Vue, {VueConstructor, ComponentOptions} from 'vue'\nimport {\n  createEvent,\n  restore,\n  is,\n  combine,\n  Store,\n  withRegion,\n  clearNode,\n  sample,\n  Unit,\n} from 'effector'\n\nexport const VueEffector = (vue: VueConstructor, options: Object) => {\n  vue.mixin(effectorMixin)\n}\n\nconst effectorMixin: ComponentOptions<Vue> = {\n  beforeCreate() {\n    let shape = this.$options.effector\n\n    if (typeof shape === 'function') {\n      // @ts-ignore\n      shape = shape.call(this)\n    }\n    if (!shape) return\n    if (!this.$options.computed) this.$options.computed = {}\n\n    let obj: {[key: string]: Unit<any>} = {}\n\n    // normalize effector field data\n    if (is.store(shape)) {\n      obj = {state: shape}\n    } else if (typeof shape === 'object') {\n      obj = {...shape}\n    } else {\n      throw Error('property should be Store')\n    }\n\n    // @ts-ignore\n    this.__clear = createEvent()\n\n    // @ts-ignore\n    withRegion(this.__clear, () => {\n      const state: Record<string, Store<any>> = {}\n      let nextID = 0\n\n      for (const key in obj) {\n        const v = obj[key]\n\n        if (is.store(v)) {\n          state[key] = v\n        } else if (is.event(v) || is.effect(v)) {\n          state[key] = restore(\n            v.map(() => ++nextID),\n            null,\n          )\n        } else {\n          throw Error(\n            `Effector property ${key} should be Store or Unit (will be transform to Store<number>)`,\n          )\n        }\n      }\n\n      const store = combine(state)\n      for (const key in store.defaultState) {\n        // @ts-ignore\n        Vue.util.defineReactive(this, key, store.defaultState[key])\n      }\n\n      store.watch(value => {\n        for (const key in value) {\n          // @ts-ignore\n          this[key] = value[key]\n        }\n      })\n\n      for (const key in state) {\n        const updated = createEvent()\n        sample({clock: updated, target: state[key]})\n\n        // @ts-ignore\n        this.$options.computed[key] = {\n          // @ts-ignore\n          get: () => this[key],\n          set: updated,\n        }\n      }\n    })\n  },\n\n  beforeDestroy() {\n    // @ts-ignore\n    if (this.__clear) {\n      // @ts-ignore\n      clearNode(this.__clear)\n    }\n  },\n}\n\nexport function createComponent<S>(options: any, store?: S) {\n  return Vue.extend(\n    Object.assign(\n      {},\n      options,\n      store && {\n        effector: () => store,\n      },\n    ),\n  )\n}\n\nexport {EffectorScopePlugin} from './EffectorScopePlugin'\n"],"names":["EffectorScopePlugin","options","install","app","scopeName","config","globalProperties","provide","scope","createComponent","store","Vue","extend","Object","assign","effector","VueEffector","vue","mixin","effectorMixin","beforeCreate","shape","this","$options","call","computed","obj","is","state","Error","__clear","createEvent","withRegion","nextID","key","v","event","effect","restore","map","combine","defaultState","util","defineReactive","watch","value","updated","sample","clock","target","get","set","beforeDestroy","clearNode"],"mappings":"AAGO,SAASA,EAAoBC,SAI3B,CACLC,QAAQC,aACFC,YAAYH,EAAQG,yBAAa,OAErCD,EAAIE,OAAOC,iBAAiBF,UAAYA,EACxCD,EAAII,QAAQJ,EAAIE,OAAOC,iBAAiBF,UAAWH,EAAQO,SCwF1D,SAASC,EAAmBR,EAAcS,UACxCC,EAAIC,OACTC,OAAOC,OACL,GACAb,EACAS,GAAS,CACPK,SAAU,IAAML,+JA7FXM,EAAeC,IAC1BA,EAAIC,MAAMC,IAGNA,EAAuC,CAC3CC,mBACMC,EAAQC,KAAKC,SAASR,YAEL,mBAAVM,IAETA,EAAQA,EAAMG,KAAKF,QAEhBD,EAAO,OACPC,KAAKC,SAASE,WAAUH,KAAKC,SAASE,SAAW,QAElDC,EAAkC,MAGlCC,EAAGjB,MAAMW,GACXK,EAAM,CAACE,MAAOP,OACT,CAAA,GAAqB,iBAAVA,QAGVQ,MAAM,4BAFZH,EAAM,IAAIL,QAMPS,QAAUC,IAGfC,EAAWV,KAAKQ,SAAS,WACjBF,EAAoC,OACtCK,EAAS,MAER,MAAMC,KAAOR,EAAK,OACfS,EAAIT,EAAIQ,MAEVP,EAAGjB,MAAMyB,GACXP,EAAMM,GAAOC,MACR,CAAA,IAAIR,EAAGS,MAAMD,KAAMR,EAAGU,OAAOF,SAM5BN,MACH,qBAAoBK,kEANvBN,EAAMM,GAAOI,EACXH,EAAEI,KAAI,MAAQN,IACd,aASAvB,EAAQ8B,EAAQZ,OACjB,MAAMM,KAAOxB,EAAM+B,aAEtB9B,EAAI+B,KAAKC,eAAerB,KAAMY,EAAKxB,EAAM+B,aAAaP,IAGxDxB,EAAMkC,OAAMC,QACL,MAAMX,KAAOW,OAEXX,GAAOW,EAAMX,UAIjB,MAAMA,KAAON,EAAO,OACjBkB,EAAUf,IAChBgB,EAAO,CAACC,MAAOF,EAASG,OAAQrB,EAAMM,UAGjCX,SAASE,SAASS,GAAO,CAE5BgB,IAAK,IAAM5B,KAAKY,GAChBiB,IAAKL,QAMbM,gBAEM9B,KAAKQ,SAEPuB,EAAU/B,KAAKQ"}