{"version":3,"sources":["../../src/object/objectWatcher.ts"],"names":["objectWatcher","obj","callback","options","opts","assignObject","listener","target","propKey","receiver","newValue","operate","eventArgs","oldValue","l","value"],"mappings":";;;;AAyBO,SAASA,CAAAA,CAAuCC,IAAMC,CAA8BC,CAAAA,CAAAA,CAA8B,CACrH,IAAMC,CAAAA,CAAOC,CAAa,CAAA,CACtB,EAAG,CAAA,CAAC,MAAM,KAAM,CAAA,QAAQ,CAC5B,CAAEF,CAAAA,CAAO,EACHG,CAAWJ,CAAAA,CAAAA,CACjB,GAAG,OAAOA,CAAY,EAAA,UAAA,CAAY,MAAM,IAAI,KAAA,CAAM,6BAA6B,CAC/E,CAAA,OAAO,IAAI,KAAMD,CAAAA,GAAAA,CAAI,CACjB,GAAA,CAAIM,CAAQC,CAAAA,CAAAA,CAAaC,EAAU,CAE/B,OADO,QAAQ,GAAIF,CAAAA,CAAAA,CAAOC,EAAQC,CAAQ,CAE9C,CACA,CAAA,GAAA,CAAIF,CAAOC,CAAAA,CAAAA,CAAaE,EAAUD,CAAU,CAAA,CACxC,GAAI,MAAO,CAAA,cAAA,CAAeD,CAAO,CAaxBA,CAAAA,CAb0B,KAAA,CAE/B,IAAMG,CAAAA,CADY,QAAQ,GAAIJ,CAAAA,CAAAA,CAAOC,CAAO,CAChB,CAAA,QAAA,CAAW,MACjCI,CAAqC,CAAA,CACvC,OAAAJ,CAAAA,CAAAA,CACA,KAAME,CAAAA,CAAAA,CACN,QAAAC,CACA,CAAA,MAAA,CAAOJ,CACX,CACGH,CAAAA,CAAAA,CAAK,GAAG,QAAS,CAAA,IAAI,CACpBQ,GAAAA,CAAAA,CAAU,QAAW,CAAA,OAAA,CAAQ,IAAIL,CAAOC,CAAAA,CAAAA,CAAQC,CAAQ,CAE5DH,CAAAA,CAAAA,CAAAA,CAAS,KAAKC,CAAOK,CAAAA,CAAS,EAClC,CAGA,OAAO,OAAA,CAAQ,IAAIL,CAAOC,CAAAA,CAAAA,CAAQE,EAASD,CAAQ,CACvD,EACA,cAAeF,CAAAA,CAAAA,CAAQC,CAAS,CAAA,CAC5B,GAAGJ,CAAAA,CAAK,GAAG,QAAS,CAAA,QAAQ,EAAG,CAC3B,IAAMS,EAAW,OAAQ,CAAA,GAAA,CAAIN,CAAOC,CAAAA,CAAO,CAC3CF,CAAAA,CAAAA,CAAS,KAAKC,CAAO,CAAA,CACjB,QAAAC,CACA,CAAA,KAAA,CAAMK,EACN,OAAQ,CAAA,QAAA,CACR,MAAON,CAAAA,CACX,CAAC,EACL,CACA,OAAO,OAAA,CAAQ,eAAeA,CAAQC,CAAAA,CAAO,CACjD,CACJ,CAAC,CAEL,CAGA,IAAIM,CAAAA,CAAGd,EAAe,CAAC,CAAA,CAAE,EAAE,CAAE,CAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAC,OAAA,CAAAQ,CAAQ,CAAA,KAAA,CAAAO,EAAM,QAAAF,CAAAA,CAAAA,CAAS,QAAAF,CAAO,CAAA,GAAI,CAClE,OAAQ,CAAA,GAAA,CAAI,CAAIA,CAAAA,EAAAA,CAAO,CAAMH,GAAAA,CAAAA,CAAAA,CAAAA,CAAS,QAAQO,CAAMF,CAAAA,CAAAA,EAAsB,EAAE,EAChF,CAAC,EAEDC,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,CACRA,CAAE,CAAA,CAAC,EAAI,GACPA,CAAAA,CAAAA,CAAE,MAAO,CAAA,CAAA,CAAE,CAAC,CAAA,CACZA,EAAE,GAAI,EAAA,CACN,OAAQ,CAAA,GAAA,CAAIA,CAAC,CAAA","file":"objectWatcher.mjs","sourcesContent":["import { assignObject } from './assignObject';\r\n/**\r\n * \r\n * 监视对象变化\r\n * \r\n * \r\n */\r\n\r\n\r\nexport type objectOperation = 'add' | 'update' | 'remove'\r\n\r\nexport interface ObjectWatcherOptions{\r\n    on: objectOperation | objectOperation[]\r\n}\r\n\r\nexport interface ObjectWatcherModifyParams{\r\n    propKey:string | symbol,\r\n    value:any,\r\n    oldValue?:any,\r\n    operate?:objectOperation,    \r\n    parent?:object\r\n}\r\n\r\nexport type ObjectModifyObserver = (params:ObjectWatcherModifyParams)=>void\r\n\r\nexport function objectWatcher<T extends object=object>(obj:T,callback:ObjectModifyObserver,options?:ObjectWatcherOptions){\r\n    const opts = assignObject({\r\n        on:['get','set','delete']\r\n    },options)\r\n    const listener = callback\r\n    if(typeof(callback)!=='function') throw new Error(\"callback must be a function\")\r\n    return new Proxy(obj,{\r\n        get(target, propKey:any, receiver) {\r\n            let v =Reflect.get(target,propKey,receiver) \r\n            return v\r\n        },\r\n        set(target,propKey:any, newValue, receiver) {  \r\n            if(!Object.hasOwnProperty(propKey)){\r\n                const isExisted = Reflect.has(target,propKey)\r\n                const operate = isExisted ? 'update' : 'add'\r\n                const eventArgs:ObjectWatcherModifyParams ={\r\n                    propKey,\r\n                    value:newValue, \r\n                    operate,\r\n                    parent:target \r\n                }   \r\n                if(opts.on.includes(\"on\")){ \r\n                    eventArgs.oldValue = Reflect.get(target,propKey,receiver)\r\n                }\r\n                listener.call(target,eventArgs)\r\n            }else if(propKey=='length'){        // 长度变化时一般是删除了某个值\r\n                \r\n            }\r\n            return Reflect.set(target,propKey,newValue,receiver)\r\n        },\r\n        deleteProperty(target, propKey) {\r\n            if(opts.on.includes('remove')) {\r\n                const oldValue = Reflect.get(target,propKey)\r\n                listener.call(target,{\r\n                    propKey,\r\n                    value:oldValue,\r\n                    operate:'remove',\r\n                    parent:target\r\n                })\r\n            }\r\n            return Reflect.deleteProperty(target, propKey);\r\n        },\r\n    })\r\n    \r\n}\r\n\r\n\r\nlet l= objectWatcher( [1,2,3,4,5],({propKey,value,oldValue,operate})=>{\r\n    console.log(`[${operate}]: `,propKey, ' --> ',value,oldValue ? oldValue : '')\r\n})\r\n\r\nl.push(6)\r\nl[0] = 100\r\nl.splice(1,1)\r\nl.pop()\r\nconsole.log(l)"]}