proxy-facades 1.0.0
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/.idea/.name +1 -0
- package/.idea/modules.xml +8 -0
- package/.idea/proxy-facades.iml +8 -0
- package/.idea/vcs.xml +6 -0
- package/DEVELOPMENT.md +15 -0
- package/LICENSE +21 -0
- package/RecordedReadOnProxiedObjectExt.d.ts +22 -0
- package/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
- package/RecordedReadOnProxiedObjectExt.js +41 -0
- package/RecordedReadOnProxiedObjectExt.js.map +1 -0
- package/RecordedReadOnProxiedObjectExt.ts +41 -0
- package/Util.d.ts +85 -0
- package/Util.d.ts.map +1 -0
- package/Util.js +239 -0
- package/Util.js.map +1 -0
- package/Util.ts +254 -0
- package/class-trackers/Array.d.ts +93 -0
- package/class-trackers/Array.d.ts.map +1 -0
- package/class-trackers/Array.js +193 -0
- package/class-trackers/Array.js.map +1 -0
- package/class-trackers/Array.ts +245 -0
- package/class-trackers/Iterator.d.ts +38 -0
- package/class-trackers/Iterator.d.ts.map +1 -0
- package/class-trackers/Iterator.js +69 -0
- package/class-trackers/Iterator.js.map +1 -0
- package/class-trackers/Iterator.ts +73 -0
- package/class-trackers/Map.d.ts +128 -0
- package/class-trackers/Map.d.ts.map +1 -0
- package/class-trackers/Map.js +310 -0
- package/class-trackers/Map.js.map +1 -0
- package/class-trackers/Map.ts +403 -0
- package/class-trackers/Set.d.ts +85 -0
- package/class-trackers/Set.d.ts.map +1 -0
- package/class-trackers/Set.js +197 -0
- package/class-trackers/Set.js.map +1 -0
- package/class-trackers/Set.ts +245 -0
- package/class-trackers/index.d.ts +7 -0
- package/class-trackers/index.d.ts.map +1 -0
- package/class-trackers/index.js +36 -0
- package/class-trackers/index.js.map +1 -0
- package/class-trackers/index.ts +38 -0
- package/class-trackers/readme.md +2 -0
- package/common.d.ts +235 -0
- package/common.d.ts.map +1 -0
- package/common.js +378 -0
- package/common.js.map +1 -0
- package/common.ts +501 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.ts +85 -0
- package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts +22 -0
- package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
- package/dist/mjs/RecordedReadOnProxiedObjectExt.js +37 -0
- package/dist/mjs/RecordedReadOnProxiedObjectExt.js.map +1 -0
- package/dist/mjs/Util.d.ts +85 -0
- package/dist/mjs/Util.d.ts.map +1 -0
- package/dist/mjs/Util.js +223 -0
- package/dist/mjs/Util.js.map +1 -0
- package/dist/mjs/class-trackers/Array.d.ts +93 -0
- package/dist/mjs/class-trackers/Array.d.ts.map +1 -0
- package/dist/mjs/class-trackers/Array.js +186 -0
- package/dist/mjs/class-trackers/Array.js.map +1 -0
- package/dist/mjs/class-trackers/Iterator.d.ts +38 -0
- package/dist/mjs/class-trackers/Iterator.d.ts.map +1 -0
- package/dist/mjs/class-trackers/Iterator.js +65 -0
- package/dist/mjs/class-trackers/Iterator.js.map +1 -0
- package/dist/mjs/class-trackers/Map.d.ts +128 -0
- package/dist/mjs/class-trackers/Map.d.ts.map +1 -0
- package/dist/mjs/class-trackers/Map.js +299 -0
- package/dist/mjs/class-trackers/Map.js.map +1 -0
- package/dist/mjs/class-trackers/Set.d.ts +85 -0
- package/dist/mjs/class-trackers/Set.d.ts.map +1 -0
- package/dist/mjs/class-trackers/Set.js +189 -0
- package/dist/mjs/class-trackers/Set.js.map +1 -0
- package/dist/mjs/class-trackers/index.d.ts +7 -0
- package/dist/mjs/class-trackers/index.d.ts.map +1 -0
- package/dist/mjs/class-trackers/index.js +32 -0
- package/dist/mjs/class-trackers/index.js.map +1 -0
- package/dist/mjs/common.d.ts +235 -0
- package/dist/mjs/common.d.ts.map +1 -0
- package/dist/mjs/common.js +361 -0
- package/dist/mjs/common.js.map +1 -0
- package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
- package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
- package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
- package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
- package/dist/mjs/index.d.ts +8 -0
- package/dist/mjs/index.d.ts.map +1 -0
- package/dist/mjs/index.js +8 -0
- package/dist/mjs/index.js.map +1 -0
- package/dist/mjs/objectChangeTracking.d.ts +43 -0
- package/dist/mjs/objectChangeTracking.d.ts.map +1 -0
- package/dist/mjs/objectChangeTracking.js +209 -0
- package/dist/mjs/objectChangeTracking.js.map +1 -0
- package/dist/mjs/origChangeTracking.d.ts +14 -0
- package/dist/mjs/origChangeTracking.d.ts.map +1 -0
- package/dist/mjs/origChangeTracking.js +58 -0
- package/dist/mjs/origChangeTracking.js.map +1 -0
- package/dist/mjs/proxyFacade.d.ts +45 -0
- package/dist/mjs/proxyFacade.d.ts.map +1 -0
- package/dist/mjs/proxyFacade.js +179 -0
- package/dist/mjs/proxyFacade.js.map +1 -0
- package/dist/mjs/watchedProxyFacade.d.ts +84 -0
- package/dist/mjs/watchedProxyFacade.d.ts.map +1 -0
- package/dist/mjs/watchedProxyFacade.js +300 -0
- package/dist/mjs/watchedProxyFacade.js.map +1 -0
- package/index.d.ts +8 -0
- package/index.d.ts.map +1 -0
- package/index.js +36 -0
- package/index.js.map +1 -0
- package/index.ts +7 -0
- package/index_esm.mjs +44 -0
- package/objectChangeTracking.d.ts +43 -0
- package/objectChangeTracking.d.ts.map +1 -0
- package/objectChangeTracking.js +214 -0
- package/objectChangeTracking.js.map +1 -0
- package/objectChangeTracking.ts +251 -0
- package/origChangeTracking.d.ts +14 -0
- package/origChangeTracking.d.ts.map +1 -0
- package/origChangeTracking.js +63 -0
- package/origChangeTracking.js.map +1 -0
- package/origChangeTracking.ts +72 -0
- package/package.json +52 -0
- package/proxyFacade.d.ts +45 -0
- package/proxyFacade.d.ts.map +1 -0
- package/proxyFacade.js +187 -0
- package/proxyFacade.js.map +1 -0
- package/proxyFacade.ts +222 -0
- package/readme.md +111 -0
- package/watchedProxyFacade.d.ts +84 -0
- package/watchedProxyFacade.d.ts.map +1 -0
- package/watchedProxyFacade.js +312 -0
- package/watchedProxyFacade.js.map +1 -0
- package/watchedProxyFacade.ts +369 -0
package/readme.md
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Proxy facades for Javascript
|
|
2
|
+
|
|
3
|
+
## What are proxy facades?
|
|
4
|
+
A proxy is a wrapper for an (original) object that allows to track some things, like i.e. record all property-reads.
|
|
5
|
+
A proxy facade is, when that proxy also returns it's child objects wrapped in proxies, and those return their child objects wrapped too, and so on.
|
|
6
|
+
You're presented a virtual world, that looks and behaves just like the original one.
|
|
7
|
+
|
|
8
|
+
````typescript
|
|
9
|
+
const orig = {
|
|
10
|
+
appName: "HelloApp",
|
|
11
|
+
users: [
|
|
12
|
+
{id: 1, name: "Bob", active: true},
|
|
13
|
+
{id: 2, name: "Alice", active: false}
|
|
14
|
+
],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const facade = new SomeProxyFacadeSubclass(); // See WatchedProxyFacade example
|
|
18
|
+
const proxy = facade.getProxyFor(orig); // retrieve a proxy
|
|
19
|
+
console.log(proxy.appName); // Behaves like the original. Outputs: "HelloApp"
|
|
20
|
+
|
|
21
|
+
// Now retrieve a child-object:
|
|
22
|
+
const proxiedUser = proxy.users[0]; // Returns also a proxy
|
|
23
|
+
console.log(proxiedUser.name); // Behaves like the original. Outputs: "Bob"
|
|
24
|
+
````
|
|
25
|
+
|
|
26
|
+
This library proxies objects using the Javascript [Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) class.
|
|
27
|
+
|
|
28
|
+
## What useful things can you do with it?
|
|
29
|
+
|
|
30
|
+
### Watch an object infinitely deep for changes
|
|
31
|
+
````javascript
|
|
32
|
+
import {WatchedProxyFacade} from "./watchedProxyFacade";
|
|
33
|
+
|
|
34
|
+
const orig = {
|
|
35
|
+
users: [
|
|
36
|
+
{id: 1, name: "Bob", active: true},
|
|
37
|
+
{id: 2, name: "Alice", active: true}
|
|
38
|
+
],
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const facade = new WatchedProxyFacade();
|
|
42
|
+
facade.onAfterChange((change) => console.log("something has changed!"))
|
|
43
|
+
const proxy = facade.getProxyFor(orig);
|
|
44
|
+
|
|
45
|
+
proxy.users[1].active=false; // Modify some deep value -> will log "something has changed!"
|
|
46
|
+
````
|
|
47
|
+
|
|
48
|
+
### Watch for changes of precisely those values, that you've read before
|
|
49
|
+
This variant of a proxy facade is used in [react-deepwatch](). With this, you have a hook for an event when some (deep) value changes of precisely the data, that was read by you.
|
|
50
|
+
|
|
51
|
+
This examples records all your **reads** and watches them for changes afterwards:
|
|
52
|
+
|
|
53
|
+
````typescript
|
|
54
|
+
import {WatchedProxyFacade, RecordedRead} from "./watchedProxyFacade";
|
|
55
|
+
|
|
56
|
+
const orig = {
|
|
57
|
+
appName: "HelloApp",
|
|
58
|
+
users: [
|
|
59
|
+
{id: 1, name: "Bob", active: true},
|
|
60
|
+
{id: 2, name: "Alice", active: true}
|
|
61
|
+
],
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const facade = new WatchedProxyFacade();
|
|
65
|
+
facade.onAfterRead(((read: RecordedRead) => {
|
|
66
|
+
read.onAfterChange( () => console.log("Something interesting was changed!"), true /* true=let's also track the original here;) */)
|
|
67
|
+
// Also the read.equals(...) method might be handy, to check, if any of your preconditions have changed.
|
|
68
|
+
// Also there are subclasses of RecordedRead: I.e. RecordedOwnKeysRead or RecordedArrayValuesRead
|
|
69
|
+
}))
|
|
70
|
+
|
|
71
|
+
const proxy = facade.getProxyFor(orig);
|
|
72
|
+
|
|
73
|
+
// <my reader code>
|
|
74
|
+
console.log(proxy.users[0].active); // Prints true (so far so good)
|
|
75
|
+
// </my reader code>
|
|
76
|
+
|
|
77
|
+
//facade.offAfterRead(...) // You should unregister the listener when your code-of-interest has finished
|
|
78
|
+
|
|
79
|
+
proxy.users[0].active = false; // Fires the event and prints: "Something interesting was changed!"
|
|
80
|
+
proxy.users[1].active = false; // Does NOT fire the event, cause <my reader code> is not interested in Alice!
|
|
81
|
+
|
|
82
|
+
// 👍👍👍Now comes another nice feature:
|
|
83
|
+
orig.users[0].active = true; // Also for **orig**, it fires the event and prints: "Something interesting was changed!". The trackOriginal parameter (above) has installed traps via prototype altering on orig, orig.users and orig.users[0] to track these objects too!
|
|
84
|
+
orig.users[1].active = true; // Again (also for orig), it does NOT fire the event, cause <my reader code> is not interested in Alice!
|
|
85
|
+
|
|
86
|
+
orig.users[0].name = "Bob_renamed"; // Also for orig, it does not fire the event, cause <my reader code> is not interested in the "name" field
|
|
87
|
+
````
|
|
88
|
+
|
|
89
|
+
### Other facade types (planned)
|
|
90
|
+
In the future, there will be a `TransactionProxyFacade`, where you can record you changes and commit them to the main memory at once, or roll them back.
|
|
91
|
+
|
|
92
|
+
Because proxy facades exploit all sorts of js tricks, it's good to have them all maintained in one package (here), so they can coordinate each other and don't crash, if different facade libraries are used on the same data.
|
|
93
|
+
|
|
94
|
+
## Supports
|
|
95
|
+
All usual Javascript structures:
|
|
96
|
+
Object properties, Arrays, Sets, Maps, Iterators (also tracks iterating with `Object.keys(...)`),
|
|
97
|
+
class instances (your methods will see `this` as a proxy), property accessors (=getters/setters - these are treated as whitebox, so the code **inside** them is tracked for reads/writes, just like your class's methods).
|
|
98
|
+
You can also **layer** multiple proxy facades👍.
|
|
99
|
+
|
|
100
|
+
## Does not support
|
|
101
|
+
- Cloning proxied objects (if clone sets the same, shared prototype)
|
|
102
|
+
- Deleting properties with the `delete` operator. It cannot be tracked. Use the `deleteProperty` function therefore.
|
|
103
|
+
- Modifications on the prototype are not tracked (which is very unusual anyway).
|
|
104
|
+
- When your code alters the prototype chain.
|
|
105
|
+
- **Sub-** classes of `Array`, `Set` and `Map`. `WeakSet`, `WeakMap`, `WeakRef`. _Subclasses awareness may be implemented soon. Write me an isse if you need it._
|
|
106
|
+
|
|
107
|
+
## Install
|
|
108
|
+
_You've propably guessed it:_
|
|
109
|
+
````bash
|
|
110
|
+
npm install --save --ignore-scripts proxy-facades
|
|
111
|
+
````
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { FacadeProxyHandler, ProxyFacade } from "./proxyFacade";
|
|
2
|
+
import { AfterReadListener, ChangeListener, EventHook, IWatchedProxyHandler_common, ObjKey, RecordedRead, RecordedReadOnProxiedObject } from "./common";
|
|
3
|
+
import { RecordedReadOnProxiedObjectExt } from "./RecordedReadOnProxiedObjectExt";
|
|
4
|
+
/**
|
|
5
|
+
* Access a single value (=variable or return value from a function)
|
|
6
|
+
* This read is can only be constructed manually (not through a WatchedProxyFacade / WatchedProxyHandler
|
|
7
|
+
*/
|
|
8
|
+
export declare class RecordedValueRead extends RecordedRead {
|
|
9
|
+
value: unknown;
|
|
10
|
+
constructor(value: unknown);
|
|
11
|
+
get isChanged(): boolean;
|
|
12
|
+
onAfterChange(listener: () => void, trackOriginal?: boolean): void;
|
|
13
|
+
offAfterChange(listener: () => void): void;
|
|
14
|
+
equals(other: RecordedRead): boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class RecordedPropertyRead extends RecordedReadOnProxiedObjectExt {
|
|
17
|
+
key: ObjKey;
|
|
18
|
+
value: unknown;
|
|
19
|
+
constructor(key: ObjKey, value: unknown);
|
|
20
|
+
get isChanged(): boolean;
|
|
21
|
+
getAffectingChangeHooks(target: this["obj"]): EventHook[];
|
|
22
|
+
equals(other: RecordedRead): boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare class RecordedOwnKeysRead extends RecordedReadOnProxiedObjectExt {
|
|
25
|
+
value: ArrayLike<string | symbol>;
|
|
26
|
+
constructor(value: RecordedOwnKeysRead["value"]);
|
|
27
|
+
get isChanged(): boolean;
|
|
28
|
+
getAffectingChangeHooks(target: this["obj"]): EventHook[];
|
|
29
|
+
equals(other: RecordedRead): boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Fired when a method was called that is not implemented in the supervisor. May be from a future js version
|
|
33
|
+
*/
|
|
34
|
+
export declare class RecordedUnspecificRead extends RecordedReadOnProxiedObjectExt {
|
|
35
|
+
get isChanged(): boolean;
|
|
36
|
+
getAffectingChangeHooks(target: this["obj"]): EventHook[];
|
|
37
|
+
equals(other: RecordedRead): boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Use cases:
|
|
41
|
+
* - record read + watch recorded for modifications. For re-render trigger
|
|
42
|
+
* - record read and make several snapshots (when load is called) and compare exactly those reads
|
|
43
|
+
*/
|
|
44
|
+
export declare class WatchedProxyFacade extends ProxyFacade<WatchedProxyHandler> {
|
|
45
|
+
trackReadsOnPrototype: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Called after a read has been made to any object inside this facade
|
|
48
|
+
* @protected
|
|
49
|
+
*/
|
|
50
|
+
_afterReadListeners: Set<AfterReadListener>;
|
|
51
|
+
onAfterRead(listener: AfterReadListener): void;
|
|
52
|
+
offAfterRead(listener: AfterReadListener): void;
|
|
53
|
+
constructor();
|
|
54
|
+
/**
|
|
55
|
+
* Watches for writes on a specified property
|
|
56
|
+
* @param obj
|
|
57
|
+
* @param key Not restricted here (for the tests), but it must not be number !
|
|
58
|
+
* @param listener
|
|
59
|
+
*/
|
|
60
|
+
onAfterWriteOnProperty<O extends object, K extends keyof O>(obj: O, key: K, listener: ChangeListener): void;
|
|
61
|
+
/**
|
|
62
|
+
* Watches for writes on a specified property
|
|
63
|
+
* @param obj
|
|
64
|
+
* @param key Not restricted here (for the tests), but it must not be number !
|
|
65
|
+
* @param listener
|
|
66
|
+
*/
|
|
67
|
+
offAfterWriteOnProperty<O extends object, K extends keyof O>(obj: O, key: K, listener: ChangeListener): void;
|
|
68
|
+
protected crateHandler(target: object, facade: any): WatchedProxyHandler;
|
|
69
|
+
}
|
|
70
|
+
export declare class WatchedProxyHandler extends FacadeProxyHandler<WatchedProxyFacade> implements IWatchedProxyHandler_common {
|
|
71
|
+
constructor(target: object, facade: WatchedProxyFacade);
|
|
72
|
+
get trackingConfig(): import("./common").ClassTrackingConfiguration | undefined;
|
|
73
|
+
fireAfterRead(read: RecordedReadOnProxiedObject): void;
|
|
74
|
+
getFacade(): WatchedProxyFacade;
|
|
75
|
+
get(fake_target: object, key: string | symbol, receiver: any): any;
|
|
76
|
+
rawRead(key: ObjKey): unknown;
|
|
77
|
+
protected rawChange(key: string | symbol, newUnproxiedValue: any): void;
|
|
78
|
+
deleteProperty(target: object, key: string | symbol): boolean;
|
|
79
|
+
ownKeys(target: object): ArrayLike<string | symbol>;
|
|
80
|
+
isForArray(): boolean;
|
|
81
|
+
isForSet(): boolean;
|
|
82
|
+
isForMap(): boolean;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=watchedProxyFacade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watchedProxyFacade.d.ts","sourceRoot":"","sources":["watchedProxyFacade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WatchedProxyHandler = exports.WatchedProxyFacade = exports.RecordedUnspecificRead = exports.RecordedOwnKeysRead = exports.RecordedPropertyRead = exports.RecordedValueRead = void 0;
|
|
7
|
+
const proxyFacade_1 = require("./proxyFacade");
|
|
8
|
+
const Util_1 = require("./Util");
|
|
9
|
+
const common_1 = require("./common");
|
|
10
|
+
const objectChangeTracking_1 = require("./objectChangeTracking");
|
|
11
|
+
const underscore_1 = __importDefault(require("underscore"));
|
|
12
|
+
const index_1 = require("./class-trackers/index");
|
|
13
|
+
const RecordedReadOnProxiedObjectExt_1 = require("./RecordedReadOnProxiedObjectExt");
|
|
14
|
+
/**
|
|
15
|
+
* Access a single value (=variable or return value from a function)
|
|
16
|
+
* This read is can only be constructed manually (not through a WatchedProxyFacade / WatchedProxyHandler
|
|
17
|
+
*/
|
|
18
|
+
class RecordedValueRead extends common_1.RecordedRead {
|
|
19
|
+
constructor(value) {
|
|
20
|
+
super();
|
|
21
|
+
this.value = value;
|
|
22
|
+
}
|
|
23
|
+
get isChanged() {
|
|
24
|
+
throw new Error("Cannot check if simple value (not on object) has changed.");
|
|
25
|
+
}
|
|
26
|
+
onAfterChange(listener, trackOriginal = false) {
|
|
27
|
+
throw new Error("Cannot listen for changes on simple value (not on object)");
|
|
28
|
+
}
|
|
29
|
+
offAfterChange(listener) {
|
|
30
|
+
}
|
|
31
|
+
equals(other) {
|
|
32
|
+
if (!(other instanceof RecordedValueRead)) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return this.value === other.value;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.RecordedValueRead = RecordedValueRead;
|
|
39
|
+
class RecordedPropertyRead extends RecordedReadOnProxiedObjectExt_1.RecordedReadOnProxiedObjectExt {
|
|
40
|
+
constructor(key, value) {
|
|
41
|
+
super();
|
|
42
|
+
this.key = key;
|
|
43
|
+
this.value = value;
|
|
44
|
+
}
|
|
45
|
+
get isChanged() {
|
|
46
|
+
//@ts-ignore
|
|
47
|
+
return this.obj[this.key] !== this.value;
|
|
48
|
+
}
|
|
49
|
+
getAffectingChangeHooks(target) {
|
|
50
|
+
const result = [
|
|
51
|
+
(0, objectChangeTracking_1.getChangeHooksForObject)(target).changeSpecificProperty.get(this.key)
|
|
52
|
+
];
|
|
53
|
+
if (Array.isArray(this.obj)) {
|
|
54
|
+
result.push((0, objectChangeTracking_1.getChangeHooksForObject)(target).unspecificChange);
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
equals(other) {
|
|
59
|
+
if (!(other instanceof RecordedPropertyRead)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return this.proxyHandler === other.proxyHandler && this.obj === other.obj && this.key === other.key && this.value === other.value;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.RecordedPropertyRead = RecordedPropertyRead;
|
|
66
|
+
class RecordedOwnKeysRead extends RecordedReadOnProxiedObjectExt_1.RecordedReadOnProxiedObjectExt {
|
|
67
|
+
constructor(value) {
|
|
68
|
+
super();
|
|
69
|
+
this.value = value;
|
|
70
|
+
}
|
|
71
|
+
get isChanged() {
|
|
72
|
+
return !underscore_1.default.isEqual(Reflect.ownKeys(this.obj), this.value);
|
|
73
|
+
}
|
|
74
|
+
getAffectingChangeHooks(target) {
|
|
75
|
+
const result = [
|
|
76
|
+
(0, objectChangeTracking_1.getChangeHooksForObject)(target).changeOwnKeys
|
|
77
|
+
];
|
|
78
|
+
if (Array.isArray(this.obj)) {
|
|
79
|
+
result.push((0, objectChangeTracking_1.getChangeHooksForObject)(target).unspecificChange);
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
equals(other) {
|
|
84
|
+
if (!(other instanceof RecordedOwnKeysRead)) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
return this.proxyHandler === other.proxyHandler && this.obj === other.obj && underscore_1.default.isEqual(this.value, other.value);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.RecordedOwnKeysRead = RecordedOwnKeysRead;
|
|
91
|
+
/**
|
|
92
|
+
* Fired when a method was called that is not implemented in the supervisor. May be from a future js version
|
|
93
|
+
*/
|
|
94
|
+
class RecordedUnspecificRead extends RecordedReadOnProxiedObjectExt_1.RecordedReadOnProxiedObjectExt {
|
|
95
|
+
get isChanged() {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
getAffectingChangeHooks(target) {
|
|
99
|
+
return [
|
|
100
|
+
(0, objectChangeTracking_1.getChangeHooksForObject)(target).anyChange
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
equals(other) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.RecordedUnspecificRead = RecordedUnspecificRead;
|
|
108
|
+
/**
|
|
109
|
+
* Use cases:
|
|
110
|
+
* - record read + watch recorded for modifications. For re-render trigger
|
|
111
|
+
* - record read and make several snapshots (when load is called) and compare exactly those reads
|
|
112
|
+
*/
|
|
113
|
+
class WatchedProxyFacade extends proxyFacade_1.ProxyFacade {
|
|
114
|
+
onAfterRead(listener) {
|
|
115
|
+
this._afterReadListeners.add(listener);
|
|
116
|
+
}
|
|
117
|
+
offAfterRead(listener) {
|
|
118
|
+
this._afterReadListeners.delete(listener);
|
|
119
|
+
}
|
|
120
|
+
constructor() {
|
|
121
|
+
super();
|
|
122
|
+
// ** Configuration**
|
|
123
|
+
this.trackReadsOnPrototype = false;
|
|
124
|
+
// *** State: ****
|
|
125
|
+
/**
|
|
126
|
+
* Called after a read has been made to any object inside this facade
|
|
127
|
+
* @protected
|
|
128
|
+
*/
|
|
129
|
+
this._afterReadListeners = new Set();
|
|
130
|
+
(0, common_1.checkEsRuntimeBehaviour)();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Watches for writes on a specified property
|
|
134
|
+
* @param obj
|
|
135
|
+
* @param key Not restricted here (for the tests), but it must not be number !
|
|
136
|
+
* @param listener
|
|
137
|
+
*/
|
|
138
|
+
onAfterWriteOnProperty(obj, key, listener) {
|
|
139
|
+
(0, objectChangeTracking_1.getChangeHooksForObject)(obj).changeSpecificProperty.get(key).afterListeners.add(listener);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Watches for writes on a specified property
|
|
143
|
+
* @param obj
|
|
144
|
+
* @param key Not restricted here (for the tests), but it must not be number !
|
|
145
|
+
* @param listener
|
|
146
|
+
*/
|
|
147
|
+
offAfterWriteOnProperty(obj, key, listener) {
|
|
148
|
+
var _a;
|
|
149
|
+
(_a = objectChangeTracking_1.changeHooksForObject.get(obj)) === null || _a === void 0 ? void 0 : _a.changeSpecificProperty.get(key).afterListeners.delete(listener);
|
|
150
|
+
}
|
|
151
|
+
crateHandler(target, facade) {
|
|
152
|
+
return new WatchedProxyHandler(target, facade);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.WatchedProxyFacade = WatchedProxyFacade;
|
|
156
|
+
class WatchedProxyHandler extends proxyFacade_1.FacadeProxyHandler {
|
|
157
|
+
constructor(target, facade) {
|
|
158
|
+
super(target, facade);
|
|
159
|
+
}
|
|
160
|
+
get trackingConfig() {
|
|
161
|
+
return (0, index_1.getTrackingConfigFor)(this.target); // TODO: cache (performance)
|
|
162
|
+
}
|
|
163
|
+
fireAfterRead(read) {
|
|
164
|
+
read.proxyHandler = this;
|
|
165
|
+
read.obj = this.target;
|
|
166
|
+
this.facade._afterReadListeners.forEach(l => l(read)); // Inform listeners
|
|
167
|
+
}
|
|
168
|
+
getFacade() {
|
|
169
|
+
return this.facade;
|
|
170
|
+
}
|
|
171
|
+
get(fake_target, key, receiver) {
|
|
172
|
+
var _a;
|
|
173
|
+
const target = this.target;
|
|
174
|
+
const proxy = this.proxy;
|
|
175
|
+
const thisHandler = this;
|
|
176
|
+
const receiverMustBeNonProxied = ((_a = this.trackingConfig) === null || _a === void 0 ? void 0 : _a.receiverMustBeNonProxied) === true;
|
|
177
|
+
if (key === "_watchedProxyHandler") { // TODO: use symbol for that (performance)
|
|
178
|
+
return this;
|
|
179
|
+
}
|
|
180
|
+
if (key === "_target") { // TODO: use symbol for that (performance)
|
|
181
|
+
return this.target;
|
|
182
|
+
}
|
|
183
|
+
// Check for and use supervisor class:
|
|
184
|
+
if (this.trackingConfig !== undefined) {
|
|
185
|
+
for (const TrackerClass of this.trackingConfig.getTrackerClasses()) {
|
|
186
|
+
let propOnSupervisor = Object.getOwnPropertyDescriptor(TrackerClass.prototype, key);
|
|
187
|
+
if (propOnSupervisor !== undefined) { // Supervisor class is responsible for the property (or method) ?
|
|
188
|
+
//@ts-ignore
|
|
189
|
+
if (propOnSupervisor.get) { // Prop is a getter?
|
|
190
|
+
return this.facade.getProxyFor(propOnSupervisor.get.apply(this.proxy));
|
|
191
|
+
}
|
|
192
|
+
if (propOnSupervisor.set) { // Prop is a setter ?
|
|
193
|
+
throw new Error("setters not yet implemented");
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
typeof propOnSupervisor.value === "function" || (0, Util_1.throwError)(`Accessing supervisor's plain property: ${String(key)}`); // validity check
|
|
197
|
+
const supervisorMethod = propOnSupervisor.value;
|
|
198
|
+
return supervisorMethod;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// When arriving here, the field is not **directly** in one of the tracker classes
|
|
203
|
+
//@ts-ignore
|
|
204
|
+
origMethod = this.target[key];
|
|
205
|
+
if (this.trackingConfig.knownHighLevelMethods.has(key)) {
|
|
206
|
+
return trapHighLevelReaderWriterMethod;
|
|
207
|
+
}
|
|
208
|
+
if (typeof origMethod === "function" && !(key in Object.prototype)) { // Read+write method that was not handled directly by supervisor class?
|
|
209
|
+
if (this.trackingConfig.readOnlyMethods.has(key)) {
|
|
210
|
+
return trapForGenericReaderMethod;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
return trapForGenericReaderWriterMethod; // Assume the worst, that it is a writer method
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return super.get(fake_target, key, receiver);
|
|
218
|
+
var origMethod = undefined;
|
|
219
|
+
/**
|
|
220
|
+
* Fires a RecordedUnspecificRead
|
|
221
|
+
*/
|
|
222
|
+
function trapForGenericReaderMethod(...args) {
|
|
223
|
+
var _a, _b;
|
|
224
|
+
const callResult = origMethod.apply(receiverMustBeNonProxied ? target : this, args); // call original method:
|
|
225
|
+
if (((_a = thisHandler.trackingConfig) === null || _a === void 0 ? void 0 : _a.trackTreads) !== false) { // not explicitly disabled ?
|
|
226
|
+
thisHandler.fireAfterRead(new RecordedUnspecificRead());
|
|
227
|
+
}
|
|
228
|
+
return ((_b = thisHandler.trackingConfig) === null || _b === void 0 ? void 0 : _b.proxyUnhandledMethodResults) ? thisHandler.facade.getProxyFor(callResult) : callResult;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Fires a RecordedUnspecificRead and calls the unspecificChange listeners
|
|
232
|
+
* @param args
|
|
233
|
+
*/
|
|
234
|
+
function trapForGenericReaderWriterMethod(...args) {
|
|
235
|
+
return (0, common_1.runChangeOperation)(proxy, new common_1.UnspecificObjectChange(proxy), [(0, objectChangeTracking_1.getChangeHooksForObject)(proxy).unspecificChange], () => {
|
|
236
|
+
var _a, _b;
|
|
237
|
+
const callResult = origMethod.apply(receiverMustBeNonProxied ? target : this, args); // call original method:
|
|
238
|
+
if (((_a = thisHandler.trackingConfig) === null || _a === void 0 ? void 0 : _a.trackTreads) !== false) { // not explicitly disabled ?
|
|
239
|
+
thisHandler.fireAfterRead(new RecordedUnspecificRead());
|
|
240
|
+
}
|
|
241
|
+
return ((_b = thisHandler.trackingConfig) === null || _b === void 0 ? void 0 : _b.proxyUnhandledMethodResults) ? thisHandler.facade.getProxyFor(callResult) : callResult;
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Wraps it in runAndCallListenersOnce_after
|
|
246
|
+
* @param args
|
|
247
|
+
*/
|
|
248
|
+
function trapHighLevelReaderWriterMethod(...args) {
|
|
249
|
+
return (0, common_1.runChangeOperation)(proxy, undefined, [], () => {
|
|
250
|
+
return origMethod.apply(this, args); // call original method
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
rawRead(key) {
|
|
255
|
+
var _a;
|
|
256
|
+
const result = super.rawRead(key);
|
|
257
|
+
if (!this.facade.trackReadsOnPrototype) {
|
|
258
|
+
if (Object.getOwnPropertyDescriptor(this.target, key) === undefined && (0, common_1.getPropertyDescriptor)(this.target, key) !== undefined) { // Property is on prototype only ?
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (((_a = this.trackingConfig) === null || _a === void 0 ? void 0 : _a.trackTreads) !== false) { // not explicitly disabled ?
|
|
263
|
+
this.fireAfterRead(new RecordedPropertyRead(key, result)); // Inform listeners
|
|
264
|
+
}
|
|
265
|
+
return result;
|
|
266
|
+
}
|
|
267
|
+
rawChange(key, newUnproxiedValue) {
|
|
268
|
+
const changeHooksForThisObject = (0, objectChangeTracking_1.getChangeHooksForObject)(this.proxy);
|
|
269
|
+
const hooksToServe = [];
|
|
270
|
+
if (this.isForArray()) {
|
|
271
|
+
hooksToServe.push(changeHooksForThisObject.unspecificChange);
|
|
272
|
+
}
|
|
273
|
+
hooksToServe.push(changeHooksForThisObject.changeSpecificProperty.get(key));
|
|
274
|
+
hooksToServe.push(changeHooksForThisObject.changeAnyProperty);
|
|
275
|
+
const isNewProperty = (0, common_1.getPropertyDescriptor)(this.target, key) === undefined;
|
|
276
|
+
if (isNewProperty) {
|
|
277
|
+
hooksToServe.push(changeHooksForThisObject.changeOwnKeys);
|
|
278
|
+
}
|
|
279
|
+
(0, common_1.runChangeOperation)(this.proxy, new common_1.UnspecificObjectChange(this.proxy), hooksToServe, () => {
|
|
280
|
+
super.rawChange(key, newUnproxiedValue);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
deleteProperty(target, key) {
|
|
284
|
+
const doesExists = Object.getOwnPropertyDescriptor(this.target, key) !== undefined;
|
|
285
|
+
if (!doesExists) {
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
return (0, common_1.runChangeOperation)(this.proxy, new common_1.UnspecificObjectChange(this.proxy), [(0, objectChangeTracking_1.getChangeHooksForObject)(this.proxy).changeOwnKeys], () => {
|
|
289
|
+
this.set(target, key, undefined, this.proxy); // Set to undefined first, so property change listeners will get informed
|
|
290
|
+
return super.deleteProperty(target, key);
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
ownKeys(target) {
|
|
294
|
+
var _a;
|
|
295
|
+
const result = Reflect.ownKeys(this.target);
|
|
296
|
+
if (((_a = this.trackingConfig) === null || _a === void 0 ? void 0 : _a.trackTreads) !== false) { // not explicitly disabled ?
|
|
297
|
+
this.fireAfterRead(new RecordedOwnKeysRead(result));
|
|
298
|
+
}
|
|
299
|
+
return result;
|
|
300
|
+
}
|
|
301
|
+
isForArray() {
|
|
302
|
+
return Array.isArray(this.target);
|
|
303
|
+
}
|
|
304
|
+
isForSet() {
|
|
305
|
+
return this.target instanceof Set;
|
|
306
|
+
}
|
|
307
|
+
isForMap() {
|
|
308
|
+
return this.target instanceof Map;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
exports.WatchedProxyHandler = WatchedProxyHandler;
|
|
312
|
+
//# sourceMappingURL=watchedProxyFacade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watchedProxyFacade.js","sourceRoot":"","sources":["watchedProxyFacade.ts"],"names":[],"mappings":"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"}
|