{"version":3,"file":"propsObserver.mjs","names":["propsObserver","propsToWatch","Class","constructor","args","_defineProperty","props","observablePropKeys","length","Object","keys","forEach","key","__observableProps","onPropsChange","_","shouldEmitChanges","changedProps","entries","value","arePropsEqual","is","componentWillUnmount","undefined","render"],"sources":["../../src/decorators/propsObserver.ts"],"sourcesContent":["type WatchedProps<Props> = { [key in keyof Props]?: unknown };\n\ntype Constructor<Props> = new (...args: any[]) => {\n  props: Props;\n  onPropsChange(changedProps: WatchedProps<Props>): void;\n  render(): React.ReactNode;\n  componentWillUnmount?(): void;\n};\n\nfunction propsObserver<\n  P extends Record<string, any>,\n  C extends Constructor<P>,\n>(propsToWatch: Array<keyof P>) {\n  return function (Class: C): C & Constructor<P> {\n    return class extends Class {\n      __observableProps: WatchedProps<P> = {};\n\n      constructor(...args: any[]) {\n        super(...args);\n\n        if (!this.props) return;\n\n        const observablePropKeys = propsToWatch.length === 0 ? Object.keys(this.props) : [...propsToWatch];\n\n        observablePropKeys.forEach((key) => {\n          this.__observableProps[key] = this.props[key];\n        });\n      }\n\n      onPropsChange(_?: WatchedProps<P>) {\n        let shouldEmitChanges = false;\n        const changedProps: WatchedProps<P> = {};\n\n        Object.entries(this.__observableProps).forEach(([key, value]: [key: keyof P, value: unknown]) => {\n          const arePropsEqual = Object.is(value, this.props[key]);\n\n          if (!arePropsEqual) {\n            this.__observableProps[key] = this.props[key];\n            changedProps[key] = this.props[key];\n\n            shouldEmitChanges = true;\n          }\n        });\n\n        if (!shouldEmitChanges) return;\n\n        super.onPropsChange(changedProps);\n      }\n\n      componentWillUnmount() {\n        super.componentWillUnmount?.();\n\n        Object.keys(this.__observableProps).forEach((key: keyof P) => {\n          this.__observableProps[key] = undefined;\n        });\n      }\n\n      render() {\n        this.onPropsChange();\n\n        return super.render();\n      }\n    };\n  };\n}\n\nexport default propsObserver;\n"],"mappings":";AASA,SAASA,aAAaA,CAGpBC,YAA4B,EAAE;EAC9B,OAAO,UAAUC,KAAQ,EAAsB;IAC7C,OAAO,cAAcA,KAAK,CAAC;MAGzBC,WAAWA,CAAC,GAAGC,IAAW,EAAE;QAC1B,KAAK,CAAC,GAAGA,IAAI,CAAC;QAACC,eAAA,4BAHoB,CAAC,CAAC;QAKrC,IAAI,CAAC,IAAI,CAACC,KAAK,EAAE;QAEjB,MAAMC,kBAAkB,GAAGN,YAAY,CAACO,MAAM,KAAK,CAAC,GAAGC,MAAM,CAACC,IAAI,CAAC,IAAI,CAACJ,KAAK,CAAC,GAAG,CAAC,GAAGL,YAAY,CAAC;QAElGM,kBAAkB,CAACI,OAAO,CAAEC,GAAG,IAAK;UAClC,IAAI,CAACC,iBAAiB,CAACD,GAAG,CAAC,GAAG,IAAI,CAACN,KAAK,CAACM,GAAG,CAAC;QAC/C,CAAC,CAAC;MACJ;MAEAE,aAAaA,CAACC,CAAmB,EAAE;QACjC,IAAIC,iBAAiB,GAAG,KAAK;QAC7B,MAAMC,YAA6B,GAAG,CAAC,CAAC;QAExCR,MAAM,CAACS,OAAO,CAAC,IAAI,CAACL,iBAAiB,CAAC,CAACF,OAAO,CAAC,CAAC,CAACC,GAAG,EAAEO,KAAK,CAAiC,KAAK;UAC/F,MAAMC,aAAa,GAAGX,MAAM,CAACY,EAAE,CAACF,KAAK,EAAE,IAAI,CAACb,KAAK,CAACM,GAAG,CAAC,CAAC;UAEvD,IAAI,CAACQ,aAAa,EAAE;YAClB,IAAI,CAACP,iBAAiB,CAACD,GAAG,CAAC,GAAG,IAAI,CAACN,KAAK,CAACM,GAAG,CAAC;YAC7CK,YAAY,CAACL,GAAG,CAAC,GAAG,IAAI,CAACN,KAAK,CAACM,GAAG,CAAC;YAEnCI,iBAAiB,GAAG,IAAI;UAC1B;QACF,CAAC,CAAC;QAEF,IAAI,CAACA,iBAAiB,EAAE;QAExB,KAAK,CAACF,aAAa,CAACG,YAAY,CAAC;MACnC;MAEAK,oBAAoBA,CAAA,EAAG;QACrB,KAAK,CAACA,oBAAoB,GAAG,CAAC;QAE9Bb,MAAM,CAACC,IAAI,CAAC,IAAI,CAACG,iBAAiB,CAAC,CAACF,OAAO,CAAEC,GAAY,IAAK;UAC5D,IAAI,CAACC,iBAAiB,CAACD,GAAG,CAAC,GAAGW,SAAS;QACzC,CAAC,CAAC;MACJ;MAEAC,MAAMA,CAAA,EAAG;QACP,IAAI,CAACV,aAAa,CAAC,CAAC;QAEpB,OAAO,KAAK,CAACU,MAAM,CAAC,CAAC;MACvB;IACF,CAAC;EACH,CAAC;AACH;AAEA,eAAexB,aAAa","ignoreList":[]}