1 | import { typeOf } from "./helpers.js"
|
2 |
|
3 | export const proxy = (root, callback) => {
|
4 | let proxyCache = new WeakMap()
|
5 |
|
6 | function createProxy(target, handler) {
|
7 | let proxy = proxyCache.get(target)
|
8 | if (proxy === undefined) {
|
9 | proxy = new Proxy(target, handler)
|
10 | proxyCache.set(target, proxy)
|
11 | }
|
12 | return proxy
|
13 | }
|
14 |
|
15 | const handler = {
|
16 | get(target, property) {
|
17 | if (["Object", "Array"].includes(typeOf(target[property]))) {
|
18 | return createProxy(target[property], handler)
|
19 | } else {
|
20 | return Reflect.get(...arguments)
|
21 | }
|
22 | },
|
23 | set(target, property, value) {
|
24 | if (value === target[property]) return true
|
25 |
|
26 | callback()
|
27 | return Reflect.set(...arguments)
|
28 | },
|
29 | deleteProperty() {
|
30 | callback()
|
31 | return Reflect.deleteProperty(...arguments)
|
32 | },
|
33 | }
|
34 |
|
35 | return new Proxy(root, handler)
|
36 | }
|