{"version":3,"sources":["src/components/context/provider/provides-decorator.tsx"],"names":["Provides","args","target","propertyKey","context","elementAttribute","contextKey","__syContextProvidesKeys","find","el","push","watcherPropertyKey","Object","defineProperty","[object Object]","this","__syConsumersMap","has","set","Set","consumersSet","get","forEach","changeValue","watchers","constructor","obj","configurable","__syContextProvidesWrapped","connectedCallback","disconnectedCallback","async","Map","connectCallbackReturn","call","element","name","__syContextProvidesListeningFunction","e","detail","providerKey","key","unsubscribe","add","delete","stopPropagation","addEventListener","disconnectedCallbackReturn","removeEventListener"],"mappings":"SAEgBA,EAASC,GACvB,MAAO,CAACC,EAAaC,KACnB,MAAMC,SAAiBH,IAAS,SAAWA,EAAOA,GAAMG,QACxD,MAAMC,SAA0BJ,IAAS,SAAW,KAAOA,GAAMI,kBAAoB,KACrF,MAAMC,EAAaF,GAAWD,EAE9BD,EAAOK,wBAA0BL,EAAOK,yBAA2B,GACnE,IAAKL,EAAOK,wBAAwBC,MAAMC,GAAOA,EAAGH,aAAeA,IAAa,CAC9EJ,EAAOK,wBAAwBG,KAAK,CAAEJ,WAAAA,EAAYH,YAAAA,IAIpD,MAAMQ,EAAqB,eAAeR,WAC1CS,OAAOC,eAAeX,EAAQS,EAAoB,CAChDG,QACE,IAAKC,KAAKC,iBAAiBC,IAAIX,GAAa,CAC1CS,KAAKC,iBAAiBE,IAAIZ,EAAY,IAAIa,KAE5C,MAAMC,EAAeL,KAAKC,iBAAiBK,IAAIf,GAC/Cc,EAAaE,SAASb,IACpBA,EAAGc,YAAYR,KAAKZ,UAK1B,MAAMqB,SAAEA,GAAatB,EAAOuB,YAC5Bb,OAAOC,eAAeX,EAAOuB,YAAa,WAAY,CACpDX,MACE,MAAMY,EAAM,IAAMF,GAAY,IAC9BE,EAAIvB,GAAeuB,EAAIvB,IAAgB,GACvCuB,EAAIvB,GAAaO,KAAKC,GACtB,OAAOe,GAETC,aAAc,OAGhB,GAAIzB,EAAO0B,2BAA4B,OAEvC1B,EAAO0B,2BAA6B,KAEpC,MAAMC,kBAAEA,EAAiBC,qBAAEA,GAAyB5B,EAEpDA,EAAO2B,kBAAoBE,iBACzBhB,KAAKC,iBAAmBD,KAAKC,kBAAoB,IAAIgB,IAErD,MAAMC,EAAwBJ,GAAmBK,KAAKnB,MAEtD,MAAMoB,EAAUpB,KAAKV,GACrB,IAAK8B,EAAS,CACZ,KAAM,6EAA6EpB,MAAMU,aAAaW,uHAGxGrB,KAAKsB,qCAAwCC,IAC3C,MAAMlC,QAAEA,GAAYkC,GAAGC,OACvB,MAAMC,EAActC,EAAOK,wBAAwBC,MAAMiC,GAAQA,EAAInC,aAAeF,IAGpF,IAAKoC,EAAa,OAElB,IAAKzB,KAAKC,iBAAiBC,IAAIb,GAAU,CACvCW,KAAKC,iBAAiBE,IAAId,EAAS,IAAIe,KAEzC,MAAMC,EAAeL,KAAKC,iBAAiBK,IAAIjB,GAE/C,GAAIkC,EAAEC,OAAO9B,KAAO6B,EAAEC,OAAO9B,GAAGiC,YAAa,CAC3CtB,EAAauB,IAAIL,EAAEC,OAAO9B,IAC1B6B,EAAEC,OAAO9B,GAAGc,YAAYR,KAAKyB,EAAYrC,cACzCmC,EAAEC,OAAO9B,GAAGiC,YAAc,KACxBtB,EAAawB,OAAON,EAAEC,OAAO9B,IAC7B6B,EAAEC,OAAO9B,GAAGiC,YAAc,MAE5BJ,EAAEO,oBAINV,GAASW,iBAAiB,gCAAiC/B,KAAKsB,sCAEhE,OAAOJ,GAGT/B,EAAO4B,qBAAuBC,iBAC5B,MAAMgB,EAA6BjB,GAAsBI,KAAKnB,MAE9D,GAAIA,KAAKsB,qCAAsC,CAC7C,MAAMF,EAAUpB,KAAKV,GACrB,IAAK8B,EAAS,CACZ,KAAM,6EAA6EpB,MAAMU,aAAaW,uHAExGD,GAASa,oBAAoB,gCAAiCjC,KAAKsB,sCAErE,OAAOU","sourcesContent":["import { SubscribeConsumerEventData } from '../consumer/consumer';\n\nexport function Provides(args?: string | { context?: string; elementAttribute?: string }) {\n return (target: any, propertyKey: string): void => {\n const context = typeof args === 'string' ? args : args?.context;\n const elementAttribute = typeof args === 'string' ? 'el' : args?.elementAttribute || 'el';\n const contextKey = context ?? propertyKey;\n\n target.__syContextProvidesKeys = target.__syContextProvidesKeys || [];\n if (!target.__syContextProvidesKeys.find((el) => el.contextKey === contextKey)) {\n target.__syContextProvidesKeys.push({ contextKey, propertyKey });\n }\n\n // Define property watcher\n const watcherPropertyKey = `__syContext_${propertyKey}Watcher`;\n Object.defineProperty(target, watcherPropertyKey, {\n value() {\n if (!this.__syConsumersMap.has(contextKey)) {\n this.__syConsumersMap.set(contextKey, new Set());\n }\n const consumersSet = this.__syConsumersMap.get(contextKey);\n consumersSet.forEach((el) => {\n el.changeValue(this[propertyKey]);\n });\n },\n });\n\n const { watchers } = target.constructor;\n Object.defineProperty(target.constructor, 'watchers', {\n get() {\n const obj = { ...(watchers ?? {}) };\n obj[propertyKey] = obj[propertyKey] ?? [];\n obj[propertyKey].push(watcherPropertyKey);\n return obj;\n },\n configurable: true,\n });\n\n if (target.__syContextProvidesWrapped) return;\n\n target.__syContextProvidesWrapped = true;\n\n const { connectedCallback, disconnectedCallback } = target;\n\n target.connectedCallback = async function () {\n this.__syConsumersMap = this.__syConsumersMap ?? new Map>();\n\n const connectCallbackReturn = connectedCallback?.call(this);\n\n const element = this[elementAttribute];\n if (!element) {\n throw `@Provides decorators requires '@Element' to be defined in the component (\"${this?.constructor?.name}\"). The @Element attribute name is, by default, 'el'. You can change it with a parameter in @Provides decorator.`;\n }\n\n this.__syContextProvidesListeningFunction = (e: CustomEvent) => {\n const { context } = e?.detail;\n const providerKey = target.__syContextProvidesKeys.find((key) => key.contextKey === context);\n\n // Not for this provider\n if (!providerKey) return;\n\n if (!this.__syConsumersMap.has(context)) {\n this.__syConsumersMap.set(context, new Set());\n }\n const consumersSet = this.__syConsumersMap.get(context);\n\n if (e.detail.el && !e.detail.el.unsubscribe) {\n consumersSet.add(e.detail.el);\n e.detail.el.changeValue(this[providerKey.propertyKey]);\n e.detail.el.unsubscribe = () => {\n consumersSet.delete(e.detail.el);\n e.detail.el.unsubscribe = null;\n };\n e.stopPropagation();\n }\n };\n\n element?.addEventListener('syContextConsumerDidSubscribe', this.__syContextProvidesListeningFunction);\n\n return connectCallbackReturn;\n };\n\n target.disconnectedCallback = async function () {\n const disconnectedCallbackReturn = disconnectedCallback?.call(this);\n\n if (this.__syContextProvidesListeningFunction) {\n const element = this[elementAttribute];\n if (!element) {\n throw `@Provides decorators requires '@Element' to be defined in the component (\"${this?.constructor?.name}\"). The @Element attribute name is, by default, 'el'. You can change it with a parameter in @Provides decorator.`;\n }\n element?.removeEventListener('syContextConsumerDidSubscribe', this.__syContextProvidesListeningFunction);\n }\n return disconnectedCallbackReturn;\n };\n };\n}\n"]}