@webqit/observer 1.7.6 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitignore +3 -3
- package/LICENSE +20 -20
- package/README.md +202 -199
- package/dist/main.js +2 -2
- package/dist/main.js.map +7 -1
- package/package.json +68 -68
- package/src/actors.js +175 -0
- package/src/core/Descriptor.js +23 -0
- package/src/core/ListenerRegistration.js +54 -0
- package/src/core/ListenerRegistry.js +41 -0
- package/src/core/Registration.js +35 -0
- package/src/core/Registry.js +96 -0
- package/src/core/TrapsRegistration.js +35 -0
- package/src/core/TrapsRegistry.js +51 -0
- package/src/index.js +10 -74
- package/src/main.js +547 -0
- package/src/targets.browser.js +9 -0
- package/test/reactions.test.js +326 -337
- package/webpack.config.cjs +5 -5
- package/src/actions/_exec.js +0 -33
- package/src/actions/_setOrDefine.js +0 -136
- package/src/actions/apply.js +0 -19
- package/src/actions/construct.js +0 -19
- package/src/actions/defineProperty.js +0 -20
- package/src/actions/deleteProperty.js +0 -80
- package/src/actions/get.js +0 -53
- package/src/actions/getOwnPropertyDescriptor.js +0 -18
- package/src/actions/getPrototypeOf.js +0 -17
- package/src/actions/has.js +0 -18
- package/src/actions/isExtensible.js +0 -17
- package/src/actions/ownKeys.js +0 -17
- package/src/actions/preventExtensions.js +0 -17
- package/src/actions/set.js +0 -21
- package/src/actions/setPrototypeOf.js +0 -18
- package/src/actors/accessorize.js +0 -162
- package/src/actors/proxy.js +0 -59
- package/src/actors/unaccessorize.js +0 -26
- package/src/actors/unproxy.js +0 -17
- package/src/browser-entry.js +0 -11
- package/src/connectors/build.js +0 -64
- package/src/connectors/link.js +0 -76
- package/src/connectors/unlink.js +0 -35
- package/src/core/Action.js +0 -33
- package/src/core/Delta.js +0 -46
- package/src/core/Event.js +0 -141
- package/src/core/Fireable.js +0 -34
- package/src/core/Firebase.js +0 -136
- package/src/core/Interceptor.js +0 -33
- package/src/core/Interceptors.js +0 -61
- package/src/core/Mutation.js +0 -46
- package/src/core/Observer.js +0 -99
- package/src/core/Observers.js +0 -75
- package/src/core/utils.js +0 -51
- package/src/reactions/closure.js +0 -88
- package/src/reactions/intercept.js +0 -53
- package/src/reactions/observe.js +0 -45
- package/src/reactions/unintercept.js +0 -43
- package/src/reactions/unobserve.js +0 -36
package/webpack.config.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
module.exports = {
|
|
3
|
-
mode: process.argv.includes('--dev') ? 'development' : 'production',
|
|
4
|
-
entry: './src/browser-entry.js',
|
|
5
|
-
devtool: 'source-map',
|
|
1
|
+
|
|
2
|
+
module.exports = {
|
|
3
|
+
mode: process.argv.includes('--dev') ? 'development' : 'production',
|
|
4
|
+
entry: './src/browser-entry.js',
|
|
5
|
+
devtool: 'source-map',
|
|
6
6
|
};
|
package/src/actions/_exec.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import { _isTypeObject } from '@webqit/util/js/index.js';
|
|
6
|
-
import Interceptors from '../core/Interceptors.js';
|
|
7
|
-
import _unproxy from '../actors/unproxy.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Runs a Reflect operation of the specified type.
|
|
11
|
-
*
|
|
12
|
-
* @param string type
|
|
13
|
-
* @param array|object target
|
|
14
|
-
* @param object payload
|
|
15
|
-
* @param object params
|
|
16
|
-
*
|
|
17
|
-
* @return array
|
|
18
|
-
*/
|
|
19
|
-
export default function(type, target, payload = {}, params = {}) {
|
|
20
|
-
if (!target || !_isTypeObject(target)) {
|
|
21
|
-
throw new Error('Target must be of type object!');
|
|
22
|
-
}
|
|
23
|
-
target = _unproxy(target);
|
|
24
|
-
// ---------------------------------
|
|
25
|
-
// Execute any "keys" traps, otherwise "test" the default way
|
|
26
|
-
var interceptors, defaultHandler = function(_val) {
|
|
27
|
-
return arguments.length ? _val : Reflect[type](target, ...Object.values(payload));
|
|
28
|
-
};
|
|
29
|
-
if (interceptors = Interceptors.getFirebase(target, false, params.namespace)) {
|
|
30
|
-
return interceptors.fire({ type, ...payload }, defaultHandler);
|
|
31
|
-
}
|
|
32
|
-
return defaultHandler();
|
|
33
|
-
}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import {
|
|
6
|
-
_isObject, _isTypeObject, _internals,
|
|
7
|
-
_isNumber, _isArray, _isString
|
|
8
|
-
} from '@webqit/util/js/index.js';
|
|
9
|
-
import { _from as _arrFrom } from '@webqit/util/arr/index.js';
|
|
10
|
-
import build, { isUserObject } from '../connectors/build.js';
|
|
11
|
-
import Interceptors from '../core/Interceptors.js';
|
|
12
|
-
import Observers from '../core/Observers.js';
|
|
13
|
-
import Event from '../core/Event.js';
|
|
14
|
-
import unlink from '../connectors/unlink.js';
|
|
15
|
-
import link from '../connectors/link.js';
|
|
16
|
-
import _unproxy from '../actors/unproxy.js';
|
|
17
|
-
import _has from './has.js';
|
|
18
|
-
import _get from './get.js';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Executes a "_setProp" type of operation on a target.
|
|
22
|
-
* Fires any observers for the specific type that may be bound to target.
|
|
23
|
-
*
|
|
24
|
-
* @param bool define
|
|
25
|
-
* @param array|object target
|
|
26
|
-
* @param object payload
|
|
27
|
-
* @param Object params
|
|
28
|
-
*
|
|
29
|
-
* @return Event
|
|
30
|
-
*/
|
|
31
|
-
export default function(define, target, payload, params = {}) {
|
|
32
|
-
target = payload.receiver || target;
|
|
33
|
-
var keysOrPayload = payload.keysOrPayload;
|
|
34
|
-
var value = payload.value;
|
|
35
|
-
if (!target || !_isTypeObject(target)) {
|
|
36
|
-
throw new Error('Target must be of type object!');
|
|
37
|
-
}
|
|
38
|
-
if (_isObject(keysOrPayload)) {
|
|
39
|
-
params = value || {};
|
|
40
|
-
value = null;
|
|
41
|
-
}
|
|
42
|
-
// ----------
|
|
43
|
-
target = _unproxy(target);
|
|
44
|
-
var interceptors = Interceptors.getFirebase(target, false, params.namespace),
|
|
45
|
-
observers = Observers.getFirebase(target, false, params.namespace);
|
|
46
|
-
// ----------
|
|
47
|
-
const handleSet = (key, value, related, detail) => {
|
|
48
|
-
var type = 'set', descriptor;
|
|
49
|
-
if (define) {
|
|
50
|
-
type = 'defineProperty';
|
|
51
|
-
descriptor = value || {};
|
|
52
|
-
value = descriptor.value;
|
|
53
|
-
}
|
|
54
|
-
// ---------------------------------
|
|
55
|
-
// The event object
|
|
56
|
-
var isUpdate = false, oldValue;
|
|
57
|
-
if (_has(target, key, params)) {
|
|
58
|
-
isUpdate = true;
|
|
59
|
-
oldValue = _get(target, key, payload.receiver, params);
|
|
60
|
-
}
|
|
61
|
-
var e = {
|
|
62
|
-
name: key,
|
|
63
|
-
type,
|
|
64
|
-
value,
|
|
65
|
-
receiver: payload.receiver,
|
|
66
|
-
related,
|
|
67
|
-
detail,
|
|
68
|
-
isUpdate,
|
|
69
|
-
oldValue,
|
|
70
|
-
};
|
|
71
|
-
// ---------------------------------
|
|
72
|
-
// The set operation
|
|
73
|
-
var defaultSet = function(_success) {
|
|
74
|
-
if (arguments.length) {
|
|
75
|
-
if (descriptor) {
|
|
76
|
-
descriptor = _success;
|
|
77
|
-
} else {
|
|
78
|
-
value = _success;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if (descriptor) {
|
|
82
|
-
if (_internals(target, 'accessorizedProps', false).has(key)
|
|
83
|
-
&& !_internals(target, 'accessorizedProps').get(key).restore()) {
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
Object.defineProperty(target, key, descriptor);
|
|
87
|
-
return true;
|
|
88
|
-
}
|
|
89
|
-
if (_internals(target, 'accessorizedProps', false).has(key)) {
|
|
90
|
-
return _internals(target, 'accessorizedProps').get(key).set(value);
|
|
91
|
-
}
|
|
92
|
-
target[key] = value;
|
|
93
|
-
return true;
|
|
94
|
-
};
|
|
95
|
-
if (interceptors) {
|
|
96
|
-
var eventObject = descriptor
|
|
97
|
-
? {type: 'defineProperty', name: key, descriptor, receiver: payload.receiver, related, detail, isUpdate, oldValue}
|
|
98
|
-
: {type: 'set', name: key, value, receiver: payload.receiver, related, detail, isUpdate, oldValue};
|
|
99
|
-
e.success = interceptors.fire(eventObject, defaultSet);
|
|
100
|
-
} else {
|
|
101
|
-
e.success = defaultSet();
|
|
102
|
-
}
|
|
103
|
-
// ---------------------------------
|
|
104
|
-
if (e.success && e.value !== e.oldValue) {
|
|
105
|
-
// Unobserve outgoing value for bubbling
|
|
106
|
-
if (_isTypeObject(e.oldValue)) {
|
|
107
|
-
unlink(target, key, e.oldValue, null, params);
|
|
108
|
-
}
|
|
109
|
-
// Observe incoming value for bubbling
|
|
110
|
-
if (_isTypeObject(e.value)) {
|
|
111
|
-
link(target, key, e.value, null, params);
|
|
112
|
-
if (observers && (observers.subBuild || (observers.build && isUserObject(e.value)))) {
|
|
113
|
-
build(e.value, observers.subBuild, observers.build, params.namespace);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return e;
|
|
118
|
-
};
|
|
119
|
-
// ---------------------------------
|
|
120
|
-
var keys, events = [];
|
|
121
|
-
if (_isArray(keysOrPayload) || ((_isString(keysOrPayload) || _isNumber(keysOrPayload)) && (keys = _arrFrom(keysOrPayload)))) {
|
|
122
|
-
events = keys.map(key => handleSet(key, value, keys, params.detail));
|
|
123
|
-
} else if (_isObject(keysOrPayload) && (keys = Object.keys(keysOrPayload))) {
|
|
124
|
-
events = keys.map(key => handleSet(key, keysOrPayload[key], keys, params.detail));
|
|
125
|
-
}
|
|
126
|
-
var successfulEvents = events.filter(e => e.success !== false);
|
|
127
|
-
// ---------------------------------
|
|
128
|
-
var evt;
|
|
129
|
-
if (observers) {
|
|
130
|
-
evt = observers.fire(successfulEvents, params.cancellable);
|
|
131
|
-
evt.successCount = successfulEvents.length;
|
|
132
|
-
} else if (params.eventTypeReturn) {
|
|
133
|
-
evt = new Event(target);
|
|
134
|
-
}
|
|
135
|
-
return params.eventTypeReturn ? evt : successfulEvents.length > 0;
|
|
136
|
-
}
|
package/src/actions/apply.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _exec from './_exec.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Runs an "apply" operation on a target.
|
|
9
|
-
*
|
|
10
|
-
* @param array|object target
|
|
11
|
-
* @param object thisArgument
|
|
12
|
-
* @param array argumentsList
|
|
13
|
-
* @param object params
|
|
14
|
-
*
|
|
15
|
-
* @return array
|
|
16
|
-
*/
|
|
17
|
-
export default function(target, thisArgument, argumentsList, params = {}) {
|
|
18
|
-
return _exec('apply', target, { thisArgument, argumentsList }, params);
|
|
19
|
-
}
|
package/src/actions/construct.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _exec from './_exec.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Runs a "construct" operation on a target.
|
|
9
|
-
*
|
|
10
|
-
* @param array|object target
|
|
11
|
-
* @param array argumentsList
|
|
12
|
-
* @param object newTarget
|
|
13
|
-
* @param object params
|
|
14
|
-
*
|
|
15
|
-
* @return array
|
|
16
|
-
*/
|
|
17
|
-
export default function(target, argumentsList, newTarget = null, params = {}) {
|
|
18
|
-
return _exec('construct', target, arguments.length > 2 ? { argumentsList, newTarget } : { argumentsList }, params);
|
|
19
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _setOrDefine from './_setOrDefine.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Executes a "defineProperty" operation on a target.
|
|
9
|
-
* Fires any observers that may be bound to target.
|
|
10
|
-
*
|
|
11
|
-
* @param array|object target
|
|
12
|
-
* @param string|array keysOrPayload
|
|
13
|
-
* @param mixed value
|
|
14
|
-
* @param object params
|
|
15
|
-
*
|
|
16
|
-
* @return bool
|
|
17
|
-
*/
|
|
18
|
-
export default function(target, keysOrPayload, value = null, params = {}) {
|
|
19
|
-
return _setOrDefine(true/*define*/, target, { keysOrPayload, value }, params);
|
|
20
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import { _from as _arrFrom } from '@webqit/util/arr/index.js';
|
|
6
|
-
import { _isTypeObject, _internals } from '@webqit/util/js/index.js';
|
|
7
|
-
import Interceptors from '../core/Interceptors.js';
|
|
8
|
-
import Observers from '../core/Observers.js';
|
|
9
|
-
import Event from '../core/Event.js';
|
|
10
|
-
import unlink from '../connectors/unlink.js';
|
|
11
|
-
import _unproxy from '../actors/unproxy.js';
|
|
12
|
-
import _has from './has.js';
|
|
13
|
-
import _get from './get.js';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Executes a "deleteProperty" operation on a target.
|
|
17
|
-
* Fires any observers that may be bound to target.
|
|
18
|
-
*
|
|
19
|
-
* @param array|object target
|
|
20
|
-
* @param string|array keys
|
|
21
|
-
* @param object params
|
|
22
|
-
*
|
|
23
|
-
* @return Event
|
|
24
|
-
*/
|
|
25
|
-
export default function(target, keys, params = {}) {
|
|
26
|
-
if (!target || !_isTypeObject(target)) {
|
|
27
|
-
throw new Error('Target must be of type object!');
|
|
28
|
-
}
|
|
29
|
-
target = _unproxy(target);
|
|
30
|
-
var _keys = _arrFrom(keys);
|
|
31
|
-
var events = _keys.map(key => {
|
|
32
|
-
// ---------------------------------
|
|
33
|
-
// The event object
|
|
34
|
-
var oldValue;
|
|
35
|
-
if (_has(target, key, params)) {
|
|
36
|
-
oldValue = _get(target, key, null, params);
|
|
37
|
-
}
|
|
38
|
-
var e = {
|
|
39
|
-
name: key,
|
|
40
|
-
type: 'deleteProperty',
|
|
41
|
-
related: _keys,
|
|
42
|
-
detail: params.detail,
|
|
43
|
-
oldValue,
|
|
44
|
-
};
|
|
45
|
-
// ---------------------------------
|
|
46
|
-
// Execute any "del" traps, otherwise "del" the default way
|
|
47
|
-
var interceptors, defaultDel = function(_success) {
|
|
48
|
-
if (arguments.length) {
|
|
49
|
-
return _success;
|
|
50
|
-
}
|
|
51
|
-
if (_internals(target, 'accessorizedProps', false).has(key)
|
|
52
|
-
&& !_internals(target, 'accessorizedProps').get(key).restore()) {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
delete target[key];
|
|
56
|
-
return true;
|
|
57
|
-
};
|
|
58
|
-
if (interceptors = Interceptors.getFirebase(target, false, params.namespace)) {
|
|
59
|
-
e.success = interceptors.fire({type: 'deleteProperty', name:key, oldValue, related: _keys}, defaultDel);
|
|
60
|
-
} else {
|
|
61
|
-
e.success = defaultDel();
|
|
62
|
-
}
|
|
63
|
-
// ---------------------------------
|
|
64
|
-
// Unobserve outgoing value for bubbling
|
|
65
|
-
if (e.success && _isTypeObject(e.oldValue)) {
|
|
66
|
-
unlink(target, key, e.oldValue, null, params);
|
|
67
|
-
}
|
|
68
|
-
return e;
|
|
69
|
-
});
|
|
70
|
-
var successfulEvents = events.filter(e => e.success !== false);
|
|
71
|
-
// ---------------------------------
|
|
72
|
-
var observers, evt;
|
|
73
|
-
if (observers = Observers.getFirebase(target, false, params.namespace)) {
|
|
74
|
-
evt = observers.fire(successfulEvents, params.cancellable);
|
|
75
|
-
evt.successCount = successfulEvents.length;
|
|
76
|
-
} else if (params.eventTypeReturn) {
|
|
77
|
-
evt = new Event(target);
|
|
78
|
-
}
|
|
79
|
-
return params.eventTypeReturn ? evt : successfulEvents.length > 0;
|
|
80
|
-
}
|
package/src/actions/get.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import {
|
|
6
|
-
_isArray, _isNumeric, _isClass,
|
|
7
|
-
_isFunction, _isTypeObject, _internals
|
|
8
|
-
} from '@webqit/util/js/index.js';
|
|
9
|
-
import { _from as _objFrom } from '@webqit/util/obj/index.js';
|
|
10
|
-
import { _from as _arrFrom } from '@webqit/util/arr/index.js';
|
|
11
|
-
import Interceptors from '../core/Interceptors.js';
|
|
12
|
-
import _unproxy from '../actors/unproxy.js';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Runs a "get" operation on a target.
|
|
16
|
-
* Fires any such query observers that may be bound to target.
|
|
17
|
-
*
|
|
18
|
-
* @param array|object target
|
|
19
|
-
* @param string|array keys
|
|
20
|
-
* @param object receiver
|
|
21
|
-
* @param object params
|
|
22
|
-
*
|
|
23
|
-
* @return mixed
|
|
24
|
-
*/
|
|
25
|
-
export default function(target, keys, receiver = null, params = {}) {
|
|
26
|
-
target = receiver || target;
|
|
27
|
-
if (!target || !_isTypeObject(target)) {
|
|
28
|
-
throw new Error('Target must be of type object!');
|
|
29
|
-
}
|
|
30
|
-
target = _unproxy(target);
|
|
31
|
-
// ---------------------------------
|
|
32
|
-
var _keys = _arrFrom(keys);
|
|
33
|
-
var values = _keys.map(key => {
|
|
34
|
-
// Execute any "get" traps, otherwise "get" the default way
|
|
35
|
-
var interceptors, defaultGet = function(_value) {
|
|
36
|
-
if (arguments.length) {
|
|
37
|
-
return _value;
|
|
38
|
-
}
|
|
39
|
-
if (_internals(target, 'accessorizedProps').has(key) && _internals(target, 'accessorizedProps').get(key).touch(true)) {
|
|
40
|
-
return _internals(target, 'accessorizedProps').get(key).get();
|
|
41
|
-
}
|
|
42
|
-
return receiver
|
|
43
|
-
? Reflect.get(target, key, receiver)
|
|
44
|
-
: Reflect.get(target, key);
|
|
45
|
-
};
|
|
46
|
-
if (interceptors = Interceptors.getFirebase(target, true, params.namespace)) {
|
|
47
|
-
return interceptors.fire({type:'get', name: key, related: _keys, receiver}, defaultGet);
|
|
48
|
-
}
|
|
49
|
-
return defaultGet();
|
|
50
|
-
});
|
|
51
|
-
// ---------------------------------
|
|
52
|
-
return _isArray(keys) ? values : values[0];
|
|
53
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _exec from './_exec.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Runs a "getOwnPropertyDescriptor" operation on a target.
|
|
9
|
-
*
|
|
10
|
-
* @param array|object target
|
|
11
|
-
* @param string|number name
|
|
12
|
-
* @param object params
|
|
13
|
-
*
|
|
14
|
-
* @return array
|
|
15
|
-
*/
|
|
16
|
-
export default function(target, name, params = {}) {
|
|
17
|
-
return _exec('getOwnPropertyDescriptor', target, { name }, params);
|
|
18
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _exec from './_exec.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Runs a "getPrototypeOf" operation on a target.
|
|
9
|
-
*
|
|
10
|
-
* @param array|object target
|
|
11
|
-
* @param object params
|
|
12
|
-
*
|
|
13
|
-
* @return array
|
|
14
|
-
*/
|
|
15
|
-
export default function(target, params = {}) {
|
|
16
|
-
return _exec('getPrototypeOf', target, {}, params);
|
|
17
|
-
}
|
package/src/actions/has.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _exec from './_exec.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Runs a "has" operation on a target.
|
|
9
|
-
*
|
|
10
|
-
* @param array|object target
|
|
11
|
-
* @param string name
|
|
12
|
-
* @param object params
|
|
13
|
-
*
|
|
14
|
-
* @return array
|
|
15
|
-
*/
|
|
16
|
-
export default function(target, name, params = {}) {
|
|
17
|
-
return _exec('has', target, { name }, params);
|
|
18
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _exec from './_exec.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Runs a "isExtensible" operation on a target.
|
|
9
|
-
*
|
|
10
|
-
* @param array|object target
|
|
11
|
-
* @param object params
|
|
12
|
-
*
|
|
13
|
-
* @return array
|
|
14
|
-
*/
|
|
15
|
-
export default function(target, params = {}) {
|
|
16
|
-
return _exec('isExtensible', target, {}, params);
|
|
17
|
-
}
|
package/src/actions/ownKeys.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _exec from './_exec.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Runs a "ownKeys" operation on a target.
|
|
9
|
-
*
|
|
10
|
-
* @param array|object target
|
|
11
|
-
* @param object params
|
|
12
|
-
*
|
|
13
|
-
* @return array
|
|
14
|
-
*/
|
|
15
|
-
export default function(target, params = {}) {
|
|
16
|
-
return _exec('ownKeys', target, {}, params);
|
|
17
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _exec from './_exec.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Runs a "preventExtensions" operation on a target.
|
|
9
|
-
*
|
|
10
|
-
* @param array|object target
|
|
11
|
-
* @param object params
|
|
12
|
-
*
|
|
13
|
-
* @return array
|
|
14
|
-
*/
|
|
15
|
-
export default function(target, params = {}) {
|
|
16
|
-
return _exec('preventExtensions', target, {}, params);
|
|
17
|
-
}
|
package/src/actions/set.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _setOrDefine from './_setOrDefine.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Executes a "set" operation on a target.
|
|
9
|
-
* Fires any observers that may be bound to target.
|
|
10
|
-
*
|
|
11
|
-
* @param array|object target
|
|
12
|
-
* @param string|array keysOrPayload
|
|
13
|
-
* @param mixed value
|
|
14
|
-
* @param object receiver
|
|
15
|
-
* @param object params
|
|
16
|
-
*
|
|
17
|
-
* @return bool
|
|
18
|
-
*/
|
|
19
|
-
export default function(target, keysOrPayload, value = null, receiver = null, params = {}) {
|
|
20
|
-
return _setOrDefine(false/*define*/, target, arguments.length > 3 ? { keysOrPayload, value, receiver } : { keysOrPayload, value }, params);
|
|
21
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import _exec from './_exec.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Runs a "setPrototypeOf" operation on a target.
|
|
9
|
-
*
|
|
10
|
-
* @param array|object target
|
|
11
|
-
* @param object prototype
|
|
12
|
-
* @param object params
|
|
13
|
-
*
|
|
14
|
-
* @return array
|
|
15
|
-
*/
|
|
16
|
-
export default function(target, prototype, params = {}) {
|
|
17
|
-
return _exec('setPrototypeOf', target, { prototype }, params);
|
|
18
|
-
}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import { _isArray, _internals } from '@webqit/util/js/index.js';
|
|
6
|
-
import { _isObject } from '@webqit/util/js/index.js';
|
|
7
|
-
import { _from as _arrFrom } from '@webqit/util/arr/index.js';
|
|
8
|
-
import _get from '../actions/get.js';
|
|
9
|
-
import _set from '../actions/set.js';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Initializes "Reflxive getter/setter" traps on the target.
|
|
13
|
-
*
|
|
14
|
-
* @param array|object target
|
|
15
|
-
* @param string|array keys
|
|
16
|
-
* @param object params
|
|
17
|
-
*
|
|
18
|
-
* @return bool|array
|
|
19
|
-
*/
|
|
20
|
-
export default function(target, keys = [], params = {}) {
|
|
21
|
-
params = _isObject(keys) ? keys : params;
|
|
22
|
-
var successFlags = (arguments.length === 1 ? Object.keys(target) : _arrFrom(keys)).map(key => {
|
|
23
|
-
if (_internals(target, 'accessorizedProps').has(key) && _internals(target, 'accessorizedProps').get(key).touch(true)) {
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
// ----------
|
|
27
|
-
const getDescriptorDeep = () => {
|
|
28
|
-
var descriptor, proto = target;
|
|
29
|
-
while (!descriptor && (proto = Object.getPrototypeOf(proto))) {
|
|
30
|
-
descriptor = Object.getOwnPropertyDescriptor(proto, key);
|
|
31
|
-
}
|
|
32
|
-
return descriptor;
|
|
33
|
-
};
|
|
34
|
-
// ----------
|
|
35
|
-
var originalOwnDescriptor = Object.getOwnPropertyDescriptor(target, key),
|
|
36
|
-
altOriginalOwnDescriptor,
|
|
37
|
-
activeIsAltOriginalOwnDescriptor;
|
|
38
|
-
if (!originalOwnDescriptor) {
|
|
39
|
-
// Not an own property
|
|
40
|
-
// and maybe not even defined at all in the prototype chain
|
|
41
|
-
altOriginalOwnDescriptor = {
|
|
42
|
-
writable: true,
|
|
43
|
-
enumerable: key in target ? false/* existing but inherited*/ : true,
|
|
44
|
-
configurable: params.configurable !== false,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
// ----------
|
|
48
|
-
var reactiveOwnDescriptor = { ...(originalOwnDescriptor || altOriginalOwnDescriptor) };
|
|
49
|
-
if ('value' in reactiveOwnDescriptor) {
|
|
50
|
-
delete reactiveOwnDescriptor.value;
|
|
51
|
-
}
|
|
52
|
-
if ('writable' in reactiveOwnDescriptor) {
|
|
53
|
-
delete reactiveOwnDescriptor.writable;
|
|
54
|
-
}
|
|
55
|
-
// ----------
|
|
56
|
-
reactiveOwnDescriptor.get = () => {
|
|
57
|
-
if (controlObject.ongoingGets.length) {
|
|
58
|
-
// .touch(true)
|
|
59
|
-
return controlObject.get();
|
|
60
|
-
}
|
|
61
|
-
// _get() will return here
|
|
62
|
-
// but to call controlObject.get();
|
|
63
|
-
controlObject.ongoingGets.push(1);
|
|
64
|
-
var value = _get(target, key, null, params);
|
|
65
|
-
controlObject.ongoingGets.pop();
|
|
66
|
-
return value;
|
|
67
|
-
};
|
|
68
|
-
var setting;
|
|
69
|
-
reactiveOwnDescriptor.set = newValue => {
|
|
70
|
-
if (controlObject.ongoingSets.length) {
|
|
71
|
-
return controlObject.set(newValue);
|
|
72
|
-
}
|
|
73
|
-
// _set() will return here
|
|
74
|
-
// but to call controlObject.set();
|
|
75
|
-
controlObject.ongoingSets.push(1);
|
|
76
|
-
var operation = _set(target, key, newValue, null, params);
|
|
77
|
-
controlObject.ongoingSets.pop();
|
|
78
|
-
return operation;
|
|
79
|
-
};
|
|
80
|
-
// ----------
|
|
81
|
-
var controlObject = {
|
|
82
|
-
ongoingGets: [],
|
|
83
|
-
ongoingSets: [],
|
|
84
|
-
get: function() {
|
|
85
|
-
// ---------------------
|
|
86
|
-
var descriptor = originalOwnDescriptor;
|
|
87
|
-
if (!descriptor) {
|
|
88
|
-
if (activeIsAltOriginalOwnDescriptor) {
|
|
89
|
-
// Already switched to altOriginalOwnDescriptor
|
|
90
|
-
descriptor = altOriginalOwnDescriptor;
|
|
91
|
-
} else {
|
|
92
|
-
// getDescriptorDeep() or altOriginalOwnDescriptor
|
|
93
|
-
descriptor = getDescriptorDeep() || altOriginalOwnDescriptor;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// ---------------------
|
|
97
|
-
return descriptor.get ? descriptor.get.call(target) : descriptor.value;
|
|
98
|
-
},
|
|
99
|
-
set: function(value) {
|
|
100
|
-
// ---------------------
|
|
101
|
-
var descriptor = originalOwnDescriptor;
|
|
102
|
-
if (!descriptor) {
|
|
103
|
-
if (activeIsAltOriginalOwnDescriptor) {
|
|
104
|
-
// Already switched to altOriginalOwnDescriptor
|
|
105
|
-
descriptor = altOriginalOwnDescriptor;
|
|
106
|
-
} else if (descriptor = getDescriptorDeep()) {
|
|
107
|
-
if (('value' in descriptor)) {
|
|
108
|
-
// Deep is data property.
|
|
109
|
-
// We should rather switch to altOriginalOwnDescriptor
|
|
110
|
-
descriptor = altOriginalOwnDescriptor;
|
|
111
|
-
activeIsAltOriginalOwnDescriptor = true;
|
|
112
|
-
}
|
|
113
|
-
} else {
|
|
114
|
-
// Not yet switched to altOriginalOwnDescriptor
|
|
115
|
-
// and no getDescriptorDeep()
|
|
116
|
-
descriptor = altOriginalOwnDescriptor;
|
|
117
|
-
activeIsAltOriginalOwnDescriptor = true;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
// ---------------------
|
|
121
|
-
if (descriptor.set || descriptor.get) {
|
|
122
|
-
if (!descriptor.set) {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
// Can sometimes return undefined
|
|
126
|
-
return descriptor.set.call(target, value);
|
|
127
|
-
}
|
|
128
|
-
descriptor.value = value;
|
|
129
|
-
return true;
|
|
130
|
-
},
|
|
131
|
-
restore: function() {
|
|
132
|
-
try {
|
|
133
|
-
if (this.intact()) {
|
|
134
|
-
if (originalOwnDescriptor || activeIsAltOriginalOwnDescriptor /* switched */) {
|
|
135
|
-
Object.defineProperty(target, key, originalOwnDescriptor || altOriginalOwnDescriptor /* switch target */);
|
|
136
|
-
} else {
|
|
137
|
-
delete target[key];
|
|
138
|
-
}
|
|
139
|
-
_internals(target, 'accessorizedProps').delete(key);
|
|
140
|
-
}
|
|
141
|
-
return true;
|
|
142
|
-
} catch(e) {}
|
|
143
|
-
return false;
|
|
144
|
-
},
|
|
145
|
-
intact: function() {
|
|
146
|
-
return (Object.getOwnPropertyDescriptor(target, key) || {}).get === reactiveOwnDescriptor.get;
|
|
147
|
-
},
|
|
148
|
-
touch: function(attemptRestore = false) {
|
|
149
|
-
// If intact, or not intact but not restorable, return true - "valid"
|
|
150
|
-
return this.intact() || (attemptRestore ? !this.restore() : false);
|
|
151
|
-
},
|
|
152
|
-
}
|
|
153
|
-
// ----------
|
|
154
|
-
try {
|
|
155
|
-
Object.defineProperty(target, key, reactiveOwnDescriptor);
|
|
156
|
-
_internals(target, 'accessorizedProps').set(key, controlObject);
|
|
157
|
-
return true;
|
|
158
|
-
} catch(e) {}
|
|
159
|
-
return false;
|
|
160
|
-
});
|
|
161
|
-
return _isArray(keys) ? successFlags : successFlags[0];
|
|
162
|
-
}
|