(target: AnyObject, key: any, val?: any)
| 63 | * Auto unwrapping when access property |
| 64 | */ |
| 65 | export function defineAccessControl(target: AnyObject, key: any, val?: any) { |
| 66 | if (key === '__ob__') return |
| 67 | if (isRaw(target[key])) return |
| 68 | |
| 69 | let getter: (() => any) | undefined |
| 70 | let setter: ((x: any) => void) | undefined |
| 71 | const property = Object.getOwnPropertyDescriptor(target, key) |
| 72 | if (property) { |
| 73 | if (property.configurable === false) { |
| 74 | return |
| 75 | } |
| 76 | getter = property.get |
| 77 | setter = property.set |
| 78 | if ( |
| 79 | (!getter || setter) /* not only have getter */ && |
| 80 | arguments.length === 2 |
| 81 | ) { |
| 82 | val = target[key] |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | setupAccessControl(val) |
| 87 | proxy(target, key, { |
| 88 | get: function getterHandler() { |
| 89 | const value = getter ? getter.call(target) : val |
| 90 | // if the key is equal to RefKey, skip the unwrap logic |
| 91 | if (key !== RefKey && isRef(value)) { |
| 92 | return value.value |
| 93 | } else { |
| 94 | return value |
| 95 | } |
| 96 | }, |
| 97 | set: function setterHandler(newVal: any) { |
| 98 | if (getter && !setter) return |
| 99 | |
| 100 | // If the key is equal to RefKey, skip the unwrap logic |
| 101 | // If and only if "value" is ref and "newVal" is not a ref, |
| 102 | // the assignment should be proxied to "value" ref. |
| 103 | if (key !== RefKey && isRef(val) && !isRef(newVal)) { |
| 104 | val.value = newVal |
| 105 | } else if (setter) { |
| 106 | setter.call(target, newVal) |
| 107 | val = newVal |
| 108 | } else { |
| 109 | val = newVal |
| 110 | } |
| 111 | setupAccessControl(newVal) |
| 112 | }, |
| 113 | }) |
| 114 | } |
| 115 | |
| 116 | export function observe<T>(obj: T): T { |
| 117 | const Vue = getRegisteredVueOrDefault() |
no test coverage detected
searching dependent graphs…