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
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// **** See the function common.ts#checkEsRuntimeBehaviour ***
|
|
3
|
+
// Array:
|
|
4
|
+
outputExpecterCode(["a"], (v) => v.at(0));
|
|
5
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.concat("d", "e", "f"));
|
|
6
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.map(x => read(x)));
|
|
7
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.forEach(x => read(x)));
|
|
8
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.join(","));
|
|
9
|
+
//outputExpecterCode(["a", "b", "c"], (v) => v.keys());
|
|
10
|
+
//outputExpecterCode(["a", "b", "c"], (v) => v.values());
|
|
11
|
+
outputExpecterCode(["a", "b", "c", "d"], (v) => v.slice(1, 3));
|
|
12
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.some(x => x === "a"));
|
|
13
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.filter(x => x === "a"));
|
|
14
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.find(x => x === "a"));
|
|
15
|
+
//outputExpecterCode(["a", "b", "c"], (v) => v.entries());
|
|
16
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.every(x => x === "a"));
|
|
17
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.findIndex(x => x === "a"));
|
|
18
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.includes("b", 1));
|
|
19
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.indexOf("b", 1));
|
|
20
|
+
outputExpecterCode(["a", "b", "c"], (v) => v[Symbol.iterator]().next());
|
|
21
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.lastIndexOf("b", 1));
|
|
22
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.reduce((p, c) => p + c));
|
|
23
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.reduceRight((p, c) => p + c));
|
|
24
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.toLocaleString());
|
|
25
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.toString());
|
|
26
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.unshift("_a", "_b"));
|
|
27
|
+
outputExpecterCode(["a", "b", "c", "d"], v => v.splice(1, 2, "newB", "newC", "newX"));
|
|
28
|
+
outputExpecterCode(["a", "b", "c", "d"], v => v.copyWithin(3, 1, 3));
|
|
29
|
+
outputExpecterCode(["a", "b", "c", "d"], v => v.reverse());
|
|
30
|
+
// Iterator
|
|
31
|
+
console.log("if([].values().forEach) { // Runtime supports these iterator functions like forEach, filter, .... ");
|
|
32
|
+
outputExpecterCode(() => ["a", "b", "c"][Symbol.iterator](), it => it.forEach(x => x));
|
|
33
|
+
outputExpecterCode(() => ["a", "b", "c"][Symbol.iterator](), it => it.filter(x => x === "b"));
|
|
34
|
+
outputExpecterCode(() => ["a", "b", "c"][Symbol.iterator](), it => it.take(2));
|
|
35
|
+
outputExpecterCode(() => ["a", "b", "c"][Symbol.iterator](), it => it.toArray());
|
|
36
|
+
console.log("}");
|
|
37
|
+
// Set:
|
|
38
|
+
//outputExpecterCode(new Set<string>(["a","b","c"]), v => v.forEach(i => read(i))) // TypeError: Method Set.prototype.forEach called on incompatible receiver #<Set>
|
|
39
|
+
//outputExpecterCode(new Set<string>(["a","b","c"]), v => v.intersection(new Set<string>(["b","c","e"]))) // TypeError: Method Set.prototype.intersection called on incompatible receiver #<Set>
|
|
40
|
+
/**
|
|
41
|
+
*
|
|
42
|
+
*/
|
|
43
|
+
function outputExpecterCode(orig, fn) {
|
|
44
|
+
let origJS = JSON.stringify(orig);
|
|
45
|
+
if (typeof orig === "function") {
|
|
46
|
+
origJS = orig.toString().replace(/\s+/g, " ").replace(/^\(\)=>/, "").toString();
|
|
47
|
+
orig = orig();
|
|
48
|
+
}
|
|
49
|
+
const usedFields = new Set();
|
|
50
|
+
const proxy = new Proxy(orig, {
|
|
51
|
+
get(target, p, receiver) {
|
|
52
|
+
usedFields.add(p);
|
|
53
|
+
if (p === "next") {
|
|
54
|
+
//@ts-ignore
|
|
55
|
+
return (...args) => target.next(...args); // .next() method must run on target, not on proxy
|
|
56
|
+
}
|
|
57
|
+
//@ts-ignore
|
|
58
|
+
return target[p];
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
read(fn(proxy));
|
|
62
|
+
console.log(`expectUsingMethodsOrFields(${origJS}, ${fnToString(fn)}, [${[...usedFields.values()].map(f => typeof f === "string" ? `"${f}"` : `${f.toString().replace(/(^Symbol\()|(\)$)/g, "")}`).join(",")}])`);
|
|
63
|
+
function fnToString(fn) {
|
|
64
|
+
return fn.toString().replace(/\s+/g, " ").toString();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Just do something the runtime can't optimize away
|
|
69
|
+
* @param value
|
|
70
|
+
*/
|
|
71
|
+
function read(value) {
|
|
72
|
+
if (("" + value) == "blaaxyxzzzsdf") {
|
|
73
|
+
throw new Error("should never get here");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=dev_generateEsRuntimeBehaviourCheckerCode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev_generateEsRuntimeBehaviourCheckerCode.js","sourceRoot":"","sources":["../../dev_generateEsRuntimeBehaviourCheckerCode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { RecordedRead, RecordedReadOnProxiedObject, ClassTrackingConfiguration, dualUseTracker_callOrigMethodOnTarget, IteratorReturningProxiedValue, GetIteratorValueProxiedFn, DualUseTracker, ForWatchedProxyHandler } from "./common";
|
|
2
|
+
export { ProxyFacade, FacadeProxyHandler, invalidateObject, getGlobalOrig } from "./proxyFacade";
|
|
3
|
+
export { deleteProperty, changeTrackedOrigObjects, installChangeTracker } from "./origChangeTracking";
|
|
4
|
+
export { RecordedArrayValuesRead } from "./class-trackers/Array";
|
|
5
|
+
export { RecordedMap_has, RecordedMap_get, RecordedMapEntriesRead, RecordedMapKeysRead, RecordedMapValuesRead } from "./class-trackers/Map";
|
|
6
|
+
export { RecordedSet_has, RecordedSetValuesRead } from "./class-trackers/Set";
|
|
7
|
+
export { RecordedValueRead, RecordedUnspecificRead, RecordedPropertyRead, RecordedOwnKeysRead, WatchedProxyFacade, WatchedProxyHandler } from "./watchedProxyFacade";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,qCAAqC,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,cAAc,EAAE,sBAAsB,EAAC,MAAM,UAAU,CAAA;AACvO,OAAO,EAAC,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAC,cAAc,EAAE,wBAAwB,EAAE,oBAAoB,EAAC,MAAM,sBAAsB,CAAA;AACnG,OAAO,EAAC,uBAAuB,EAAC,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAC,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,qBAAqB,EAAC,MAAM,sBAAsB,CAAA;AACzI,OAAO,EAAC,eAAe,EAAE,qBAAqB,EAAC,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EAAC,iBAAiB,EAAE,sBAAsB,EAAE,oBAAoB,EAAC,mBAAmB,EAAE,kBAAkB,EAAG,mBAAmB,EAAC,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { RecordedRead, RecordedReadOnProxiedObject, ClassTrackingConfiguration, dualUseTracker_callOrigMethodOnTarget } from "./common";
|
|
2
|
+
export { ProxyFacade, FacadeProxyHandler, invalidateObject, getGlobalOrig } from "./proxyFacade";
|
|
3
|
+
export { deleteProperty, changeTrackedOrigObjects, installChangeTracker } from "./origChangeTracking";
|
|
4
|
+
export { RecordedArrayValuesRead } from "./class-trackers/Array";
|
|
5
|
+
export { RecordedMap_has, RecordedMap_get, RecordedMapEntriesRead, RecordedMapKeysRead, RecordedMapValuesRead } from "./class-trackers/Map";
|
|
6
|
+
export { RecordedSet_has, RecordedSetValuesRead } from "./class-trackers/Set";
|
|
7
|
+
export { RecordedValueRead, RecordedUnspecificRead, RecordedPropertyRead, RecordedOwnKeysRead, WatchedProxyFacade, WatchedProxyHandler } from "./watchedProxyFacade";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,qCAAqC,EAAmG,MAAM,UAAU,CAAA;AACvO,OAAO,EAAC,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAC,cAAc,EAAE,wBAAwB,EAAE,oBAAoB,EAAC,MAAM,sBAAsB,CAAA;AACnG,OAAO,EAAC,uBAAuB,EAAC,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAC,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,qBAAqB,EAAC,MAAM,sBAAsB,CAAA;AACzI,OAAO,EAAC,eAAe,EAAE,qBAAqB,EAAC,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EAAC,iBAAiB,EAAE,sBAAsB,EAAE,oBAAoB,EAAC,mBAAmB,EAAE,kBAAkB,EAAG,mBAAmB,EAAC,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ClassTrackingConfiguration, EventHook, ObjKey } from "./common";
|
|
2
|
+
/**
|
|
3
|
+
* Contains change listeners for one specific object.
|
|
4
|
+
* Note for specificity: There will be only one of the **change** events fired. The Recorded...Read.onChange handler will add the listeners to all possible candidates. It's this way around.
|
|
5
|
+
* Does not apply to setterInvoke.. These are fired in addition (not thought through for all situations)
|
|
6
|
+
*/
|
|
7
|
+
declare class ObjectChangeHooks {
|
|
8
|
+
/**
|
|
9
|
+
* For writes on **setters** (also if these are the same/unchanged values)
|
|
10
|
+
*/
|
|
11
|
+
setterInvoke: import("./Util").DefaultMap<ObjKey, EventHook>;
|
|
12
|
+
changeSpecificProperty: import("./Util").DefaultMap<ObjKey, EventHook>;
|
|
13
|
+
changeAnyProperty: EventHook;
|
|
14
|
+
/**
|
|
15
|
+
* Means, the result of Object.keys will be different after the change. All iterations over the object/arrays's keys or values are informed that there was a change. Individual {@link changeSpecificProperty} are not affected!
|
|
16
|
+
*/
|
|
17
|
+
changeOwnKeys: EventHook;
|
|
18
|
+
/**
|
|
19
|
+
* These will always be called, no matter how specific a change is
|
|
20
|
+
*/
|
|
21
|
+
anyChange: EventHook;
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
*/
|
|
25
|
+
unspecificChange: EventHook;
|
|
26
|
+
}
|
|
27
|
+
export declare const changeHooksForObject: WeakMap<object, ObjectChangeHooks>;
|
|
28
|
+
export declare function getChangeHooksForObject(obj: object): ObjectChangeHooks;
|
|
29
|
+
export declare class ObjectProxyHandler implements ProxyHandler<object> {
|
|
30
|
+
target: object;
|
|
31
|
+
origPrototype: object | null;
|
|
32
|
+
proxy: object;
|
|
33
|
+
trackingConfig?: ClassTrackingConfiguration;
|
|
34
|
+
constructor(target: object, trackingConfig: ClassTrackingConfiguration | undefined);
|
|
35
|
+
installSetterTrap(key: ObjKey): void;
|
|
36
|
+
protected withUnspecificChange<R>(changeFn: () => R): R;
|
|
37
|
+
get(fake_target: object, key: ObjKey, receiver: any): any;
|
|
38
|
+
set(fake_target: object, key: ObjKey, value: any, receiver: any): boolean;
|
|
39
|
+
getPrototypeOf(target: object): object | null;
|
|
40
|
+
defineProperty(target: object, property: string | symbol, attributes: PropertyDescriptor): boolean;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=objectChangeTracking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectChangeTracking.d.ts","sourceRoot":"","sources":["../../objectChangeTracking.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,0BAA0B,EAC1B,SAAS,EAGT,MAAM,EAIT,MAAM,UAAU,CAAC;AAElB;;;;GAIG;AACH,cAAM,iBAAiB;IACnB;;OAEG;IACH,YAAY,iDAA4D;IACxE,sBAAsB,iDAA4D;IAClF,iBAAiB,YAAmB;IAEpC;;OAEG;IACH,aAAa,YAAmB;IAChC;;OAEG;IACH,SAAS,YAAmB;IAE5B;;OAEG;IACH,gBAAgB,YAAmB;CACtC;AAID,eAAO,MAAM,oBAAoB,oCAA2C,CAAC;AAC7E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,qBAMlD;AAED,qBAAa,kBAAmB,YAAW,YAAY,CAAC,MAAM,CAAC;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,0BAA0B,CAAA;gBAE/B,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,0BAA0B,GAAG,SAAS;IAmBlF,iBAAiB,CAAC,GAAG,EAAE,MAAM;IAkE7B,SAAS,CAAC,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;IAIvD,GAAG,CAAC,WAAW,EAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAC,GAAG,GAAG,GAAG;IA2EvD,GAAG,CAAC,WAAW,EAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAC,GAAG,EAAE,QAAQ,EAAC,GAAG;IAkB5D,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI7C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,OAAO;CAIrG"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Listeners for one object
|
|
3
|
+
*/
|
|
4
|
+
import { newDefaultMap } from "./Util";
|
|
5
|
+
import { EventHook, getPropertyDescriptor, runChangeOperation, UnspecificObjectChange, } from "./common";
|
|
6
|
+
/**
|
|
7
|
+
* Contains change listeners for one specific object.
|
|
8
|
+
* Note for specificity: There will be only one of the **change** events fired. The Recorded...Read.onChange handler will add the listeners to all possible candidates. It's this way around.
|
|
9
|
+
* Does not apply to setterInvoke.. These are fired in addition (not thought through for all situations)
|
|
10
|
+
*/
|
|
11
|
+
class ObjectChangeHooks {
|
|
12
|
+
constructor() {
|
|
13
|
+
/**
|
|
14
|
+
* For writes on **setters** (also if these are the same/unchanged values)
|
|
15
|
+
*/
|
|
16
|
+
this.setterInvoke = newDefaultMap(() => new EventHook());
|
|
17
|
+
this.changeSpecificProperty = newDefaultMap(() => new EventHook());
|
|
18
|
+
this.changeAnyProperty = new EventHook();
|
|
19
|
+
/**
|
|
20
|
+
* Means, the result of Object.keys will be different after the change. All iterations over the object/arrays's keys or values are informed that there was a change. Individual {@link changeSpecificProperty} are not affected!
|
|
21
|
+
*/
|
|
22
|
+
this.changeOwnKeys = new EventHook();
|
|
23
|
+
/**
|
|
24
|
+
* These will always be called, no matter how specific a change is
|
|
25
|
+
*/
|
|
26
|
+
this.anyChange = new EventHook();
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
*/
|
|
30
|
+
this.unspecificChange = new EventHook();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export const changeHooksForObject = new WeakMap();
|
|
34
|
+
export function getChangeHooksForObject(obj) {
|
|
35
|
+
let result = changeHooksForObject.get(obj);
|
|
36
|
+
if (result === undefined) {
|
|
37
|
+
changeHooksForObject.set(obj, result = new ObjectChangeHooks());
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
export class ObjectProxyHandler {
|
|
42
|
+
constructor(target, trackingConfig) {
|
|
43
|
+
this.target = target;
|
|
44
|
+
this.trackingConfig = trackingConfig;
|
|
45
|
+
this.origPrototype = Object.getPrototypeOf(target);
|
|
46
|
+
Object.getOwnPropertyNames(target).forEach(key => {
|
|
47
|
+
if (key === "length" && Array.isArray(target)) {
|
|
48
|
+
return; // Leave the length property as is. It won't be set directly anyway
|
|
49
|
+
}
|
|
50
|
+
this.installSetterTrap(key);
|
|
51
|
+
});
|
|
52
|
+
// Create proxy:
|
|
53
|
+
//const targetForProxy = {}; // The virtual way
|
|
54
|
+
const targetForProxy = target; // Preserves Object.keys and instanceof behaviour :), iterators and other stuff. But the downside with this is, that it does not allow to proxy read only properties
|
|
55
|
+
this.proxy = new Proxy(targetForProxy, this);
|
|
56
|
+
}
|
|
57
|
+
installSetterTrap(key) {
|
|
58
|
+
let target = this.target;
|
|
59
|
+
let origDescriptor = getPropertyDescriptor(target, key);
|
|
60
|
+
//@ts-ignore
|
|
61
|
+
let currentValue = (origDescriptor === null || origDescriptor === void 0 ? void 0 : origDescriptor.value /* performance */) || target[key];
|
|
62
|
+
const origSetter = origDescriptor === null || origDescriptor === void 0 ? void 0 : origDescriptor.set;
|
|
63
|
+
const origGetter = origDescriptor === null || origDescriptor === void 0 ? void 0 : origDescriptor.get;
|
|
64
|
+
let origOwnDescriptor = Object.getOwnPropertyDescriptor(target, key);
|
|
65
|
+
if (origOwnDescriptor !== undefined) {
|
|
66
|
+
if (origOwnDescriptor.configurable !== true) {
|
|
67
|
+
throw new Error("Cannot delete non- 'configurable' property:" + String(key));
|
|
68
|
+
}
|
|
69
|
+
//@ts-ignore
|
|
70
|
+
delete target[key]; // delete the old, or the following Object.defineProperty will conflict
|
|
71
|
+
}
|
|
72
|
+
const newSetter = (newValue) => {
|
|
73
|
+
const changeHooksForTarget = getChangeHooksForObject(target);
|
|
74
|
+
if (origSetter !== undefined) {
|
|
75
|
+
runChangeOperation(target, new UnspecificObjectChange(target), [changeHooksForTarget.setterInvoke.get(key)], () => {
|
|
76
|
+
origSetter.apply(target, [newValue]); // call the setter
|
|
77
|
+
});
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (origGetter !== undefined) {
|
|
81
|
+
currentValue = origGetter.apply(target); // call the getter. Is this a good idea to refresh the value here?
|
|
82
|
+
throw new TypeError("Target originally had a getter and no setter but the property is set.");
|
|
83
|
+
}
|
|
84
|
+
//@ts-ignore
|
|
85
|
+
if (newValue !== currentValue) { // modify ?
|
|
86
|
+
// run change operation and call listeners:
|
|
87
|
+
const hooksToServe = [];
|
|
88
|
+
if (Array.isArray(target)) {
|
|
89
|
+
hooksToServe.push(changeHooksForTarget.unspecificChange);
|
|
90
|
+
}
|
|
91
|
+
hooksToServe.push(changeHooksForTarget.changeSpecificProperty.get(key));
|
|
92
|
+
hooksToServe.push(changeHooksForTarget.changeAnyProperty);
|
|
93
|
+
runChangeOperation(target, new UnspecificObjectChange(target), hooksToServe, () => {
|
|
94
|
+
//@ts-ignore
|
|
95
|
+
currentValue = newValue;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
newSetter.origHadSetter = origSetter !== undefined;
|
|
100
|
+
const newGetter = () => {
|
|
101
|
+
if (origGetter !== undefined) {
|
|
102
|
+
currentValue = origGetter.apply(target); // call the getter
|
|
103
|
+
}
|
|
104
|
+
return currentValue;
|
|
105
|
+
};
|
|
106
|
+
newGetter.origHadGetter = origGetter !== undefined;
|
|
107
|
+
Object.defineProperty(target, key, {
|
|
108
|
+
set: newSetter,
|
|
109
|
+
get: newGetter,
|
|
110
|
+
enumerable: origOwnDescriptor !== undefined ? origOwnDescriptor === null || origOwnDescriptor === void 0 ? void 0 : origOwnDescriptor.enumerable : true,
|
|
111
|
+
configurable: true, // Allow to delete the property. Note that you should use the {@link deleteProperty} function
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
withUnspecificChange(changeFn) {
|
|
115
|
+
return runChangeOperation(this.target, new UnspecificObjectChange(this.target), [getChangeHooksForObject(this.target).unspecificChange], changeFn);
|
|
116
|
+
}
|
|
117
|
+
get(fake_target, key, receiver) {
|
|
118
|
+
var _a, _b, _c;
|
|
119
|
+
// Validity check
|
|
120
|
+
const target = this.target;
|
|
121
|
+
if (receiver !== target) {
|
|
122
|
+
throw new Error("Invalid state. Get was called on a different object than this write-tracker-proxy (which is set as the prototype) is for. Did you clone the object, resulting in shared prototypes?");
|
|
123
|
+
}
|
|
124
|
+
// Check for and use change tracker class:
|
|
125
|
+
const changeTrackerClass = (_a = this.trackingConfig) === null || _a === void 0 ? void 0 : _a.changeTracker;
|
|
126
|
+
if (changeTrackerClass !== undefined) {
|
|
127
|
+
let propOnSupervisor = Object.getOwnPropertyDescriptor(changeTrackerClass.prototype, key);
|
|
128
|
+
if (propOnSupervisor !== undefined) { // Supervisor class is responsible for the property (or method) ?
|
|
129
|
+
//@ts-ignore
|
|
130
|
+
if (propOnSupervisor.get) { // Prop is a getter?
|
|
131
|
+
return propOnSupervisor.get.apply(target);
|
|
132
|
+
}
|
|
133
|
+
else if (propOnSupervisor.value) { // Prop is a value, meaning a function. (Supervisors don't have fields)
|
|
134
|
+
return changeTrackerClass.prototype[key];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const origValue = changeTrackerClass.prototype[key];
|
|
139
|
+
if (typeof origValue === "function") {
|
|
140
|
+
origMethod = origValue;
|
|
141
|
+
if ((_b = this.trackingConfig) === null || _b === void 0 ? void 0 : _b.knownHighLevelMethods.has(key)) {
|
|
142
|
+
return trapForHighLevelWriterMethod;
|
|
143
|
+
}
|
|
144
|
+
else if (!((_c = this.trackingConfig) === null || _c === void 0 ? void 0 : _c.readOnlyMethods.has(key)) && !(key in Object.prototype)) { // Read-write method that was not handled directly by change tracker class?
|
|
145
|
+
return trapForGenericWriterMethod; // Assume the worst, that it is a writer method
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// return this.target[key]; // This line does not work because it does not consult ObjectProxyHandler#getPrototypeOf and therefore uses the actual tinkered prototype chain which has this proxy in there and calls get (endless recursion)
|
|
151
|
+
const propDesc = getPropertyDescriptor(target, key);
|
|
152
|
+
if (propDesc !== undefined) {
|
|
153
|
+
let result;
|
|
154
|
+
let getter = propDesc.get;
|
|
155
|
+
if (getter !== undefined) {
|
|
156
|
+
result = getter.apply(target);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
result = propDesc.value;
|
|
160
|
+
}
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
var origMethod = undefined;
|
|
164
|
+
/**
|
|
165
|
+
* Calls the unspecificChange listeners
|
|
166
|
+
* @param args
|
|
167
|
+
*/
|
|
168
|
+
function trapForGenericWriterMethod(...args) {
|
|
169
|
+
if (this !== receiver) {
|
|
170
|
+
//throw new Error("Invalid state. Method was called on invalid target")
|
|
171
|
+
}
|
|
172
|
+
return runChangeOperation(target, new UnspecificObjectChange(target), [getChangeHooksForObject(target).unspecificChange], () => {
|
|
173
|
+
return origMethod.apply(this, args); // call original method
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Wraps it in runAndCallListenersOnce_after
|
|
178
|
+
* @param args
|
|
179
|
+
*/
|
|
180
|
+
function trapForHighLevelWriterMethod(...args) {
|
|
181
|
+
if (this !== receiver) {
|
|
182
|
+
//throw new Error("Invalid state. Method was called on invalid target")
|
|
183
|
+
}
|
|
184
|
+
return runChangeOperation(target, undefined, [], () => {
|
|
185
|
+
return origMethod.apply(this, args); // call original method
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
set(fake_target, key, value, receiver) {
|
|
190
|
+
// Validity check
|
|
191
|
+
if (receiver !== this.target) {
|
|
192
|
+
throw new Error("Invalid state. Set was called on a different object than this write-tracker-proxy (which is set as the prototype) is for. Did you clone the object, resulting in shared prototypes?");
|
|
193
|
+
}
|
|
194
|
+
runChangeOperation(this.target, new UnspecificObjectChange(this.target), [getChangeHooksForObject(this.target).changeOwnKeys], () => {
|
|
195
|
+
// if this "set" method got called, there is no setter trap installed yet
|
|
196
|
+
this.installSetterTrap(key);
|
|
197
|
+
//@ts-ignore
|
|
198
|
+
this.target[key] = value; // Set value again. this should call the setter trap
|
|
199
|
+
});
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
getPrototypeOf(target) {
|
|
203
|
+
return this.origPrototype;
|
|
204
|
+
}
|
|
205
|
+
defineProperty(target, property, attributes) {
|
|
206
|
+
throw new Error("Defineproperty not yet supported");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=objectChangeTracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectChangeTracking.js","sourceRoot":"","sources":["../../objectChangeTracking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PartialGraph } from "./common";
|
|
2
|
+
export declare const changeTrackedOrigObjects: PartialGraph;
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param obj
|
|
6
|
+
*/
|
|
7
|
+
export declare function installChangeTracker(obj: object): void;
|
|
8
|
+
/**
|
|
9
|
+
* Use this to delete properties on objects that have a write tracker installed. Otherwise they are not deletable and the write tracker cannot track the object's keys modification and inform listeners
|
|
10
|
+
* @param obj
|
|
11
|
+
* @param key
|
|
12
|
+
*/
|
|
13
|
+
export declare function deleteProperty<O extends object>(obj: O, key: keyof O): boolean;
|
|
14
|
+
//# sourceMappingURL=origChangeTracking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origChangeTracking.d.ts","sourceRoot":"","sources":["../../origChangeTracking.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,YAAY,EAA6C,MAAM,UAAU,CAAC;AAUlF,eAAO,MAAM,wBAAwB,cAAqB,CAAC;AAI3D;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,QA2B/C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,WAepE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// This file has functions / classes that allow to watch writes to the original unproxied objects (or arrays/sets/maps)
|
|
2
|
+
// unproxied=not part of a proxy facade. Technically this can install Proxys as the prototype, to catch writes.
|
|
3
|
+
import { PartialGraph, runChangeOperation, UnspecificObjectChange } from "./common";
|
|
4
|
+
import { ObjectProxyHandler, getChangeHooksForObject } from "./objectChangeTracking";
|
|
5
|
+
import { getTrackingConfigFor } from "./class-trackers/index";
|
|
6
|
+
import { isProxyForAFacade } from "./proxyFacade";
|
|
7
|
+
import { throwError } from "./Util";
|
|
8
|
+
export const changeTrackedOrigObjects = new PartialGraph();
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
* @param obj
|
|
12
|
+
*/
|
|
13
|
+
export function installChangeTracker(obj) {
|
|
14
|
+
!isProxyForAFacade(obj) || throwError("Cannot install change tracker on a proxy. The proxy should already support change tracking.");
|
|
15
|
+
if (changeTrackedOrigObjects.hasObj(obj)) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
function inner() {
|
|
19
|
+
const trackingConfig = getTrackingConfigFor(obj);
|
|
20
|
+
if (trackingConfig) {
|
|
21
|
+
if (trackingConfig.trackSettingObjectProperties) {
|
|
22
|
+
// Achieve this with the ObjectProxyhandler. It will consider getTrackingConfigFor(obj).changeTracker itsself:
|
|
23
|
+
const proxy = new ObjectProxyHandler(obj, trackingConfig).proxy;
|
|
24
|
+
Object.setPrototypeOf(obj, proxy);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (trackingConfig.changeTracker !== undefined) {
|
|
28
|
+
Object.setPrototypeOf(obj, trackingConfig.changeTracker.prototype);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else { // Non-special object ?
|
|
32
|
+
const proxy = new ObjectProxyHandler(obj, trackingConfig).proxy;
|
|
33
|
+
Object.setPrototypeOf(obj, proxy);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
inner();
|
|
37
|
+
changeTrackedOrigObjects._register(obj);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Use this to delete properties on objects that have a write tracker installed. Otherwise they are not deletable and the write tracker cannot track the object's keys modification and inform listeners
|
|
41
|
+
* @param obj
|
|
42
|
+
* @param key
|
|
43
|
+
*/
|
|
44
|
+
export function deleteProperty(obj, key) {
|
|
45
|
+
if (!changeTrackedOrigObjects.hasObj(obj)) {
|
|
46
|
+
return delete obj[key];
|
|
47
|
+
}
|
|
48
|
+
const doesExist = Object.getOwnPropertyDescriptor(obj, key) !== undefined;
|
|
49
|
+
if (!doesExist) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return runChangeOperation(obj, new UnspecificObjectChange(obj), [getChangeHooksForObject(obj).changeOwnKeys], () => {
|
|
53
|
+
//@ts-ignore
|
|
54
|
+
obj[key] = undefined; // Set to undefined first, so property change listeners will get informed
|
|
55
|
+
return delete obj[key];
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=origChangeTracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origChangeTracking.js","sourceRoot":"","sources":["../../origChangeTracking.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,+GAA+G;AAG/G,OAAO,EAAC,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAC,MAAM,UAAU,CAAC;AAClF,OAAO,EACH,kBAAkB,EAElB,uBAAuB,EAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAChD,OAAO,EAAC,UAAU,EAAC,MAAM,QAAQ,CAAC;AAElC,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,YAAY,EAAE,CAAC;AAI3D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC5C,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,6FAA6F,CAAC,CAAC;IACrI,IAAG,wBAAwB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO;IACX,CAAC;IAED,SAAS,KAAK;QACV,MAAM,cAAc,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,cAAc,EAAE,CAAC;YACjB,IAAI,cAAc,CAAC,4BAA4B,EAAE,CAAC;gBAC9C,8GAA8G;gBAC9G,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC;gBAChE,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClC,OAAO;YACX,CAAC;YAED,IAAI,cAAc,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBAC7C,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACvE,CAAC;QACL,CAAC;aAAM,CAAC,CAAC,uBAAuB;YAC5B,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC;YAChE,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;IACL,CAAC;IACD,KAAK,EAAE,CAAC;IAER,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAmB,GAAM,EAAE,GAAY;IACjE,IAAG,CAAC,wBAAwB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC;IAC1E,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,kBAAkB,CAAC,GAAG,EAAE,IAAI,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE;QAC/G,YAAY;QACZ,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,yEAAyE;QAC/F,OAAO,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
*/
|
|
4
|
+
import { ObjKey, PartialGraph } from "./common";
|
|
5
|
+
export declare abstract class ProxyFacade<HANDLER extends FacadeProxyHandler<any>> extends PartialGraph {
|
|
6
|
+
/**
|
|
7
|
+
* Treats them like functions, meaning, they get a proxied 'this'. WatchProxies will see the access to the real properties
|
|
8
|
+
*/
|
|
9
|
+
propertyAccessorsAsWhiteBox: boolean;
|
|
10
|
+
protected objectsToProxyHandlers: WeakMap<object, HANDLER>;
|
|
11
|
+
protected abstract crateHandler(target: object, facade: any): HANDLER;
|
|
12
|
+
getProxyFor<O>(value: O): O;
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @param value
|
|
16
|
+
* @return the original non-proxied value
|
|
17
|
+
*/
|
|
18
|
+
getUnproxiedValue<O>(value: O): O;
|
|
19
|
+
getHandlerFor(obj: object): HANDLER;
|
|
20
|
+
}
|
|
21
|
+
export declare abstract class FacadeProxyHandler<FACADE extends ProxyFacade<any>> implements ProxyHandler<object> {
|
|
22
|
+
target: object;
|
|
23
|
+
proxy: object;
|
|
24
|
+
facade: FACADE;
|
|
25
|
+
constructor(target: object, facade: FACADE);
|
|
26
|
+
deleteProperty(target: object, key: string | symbol): boolean;
|
|
27
|
+
defineProperty(target: object, property: string | symbol, attributes: PropertyDescriptor): boolean;
|
|
28
|
+
get(fake_target: object, p: string | symbol, receiver: any): any;
|
|
29
|
+
protected rawRead(key: ObjKey): unknown;
|
|
30
|
+
set(fake_target: object, p: string | symbol, value: any, receiver: any): boolean;
|
|
31
|
+
protected rawChange(p: string | symbol, newUnproxiedValue: any): void;
|
|
32
|
+
}
|
|
33
|
+
export declare function isProxyForAFacade(obj: object): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Makes the obj throw an error when trying to access it
|
|
36
|
+
* @param obj
|
|
37
|
+
* @param message
|
|
38
|
+
* @param cause
|
|
39
|
+
*/
|
|
40
|
+
export declare function invalidateObject(obj: object, message: string, cause?: Error): void;
|
|
41
|
+
/**
|
|
42
|
+
* @returns the real real origial object from the real world
|
|
43
|
+
*/
|
|
44
|
+
export declare function getGlobalOrig<T extends object>(obj: T): T;
|
|
45
|
+
//# sourceMappingURL=proxyFacade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxyFacade.d.ts","sourceRoot":"","sources":["../../proxyFacade.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAIH,MAAM,EACN,YAAY,EAEf,MAAM,UAAU,CAAC;AAIlB,8BAAsB,WAAW,CAAC,OAAO,SAAS,kBAAkB,CAAC,GAAG,CAAC,CAAE,SAAQ,YAAY;IAE3F;;OAEG;IACI,2BAA2B,UAAQ;IAG1C,SAAS,CAAC,sBAAsB,2BAAkC;IAElE,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO;IAErE,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAwB3B;;;;OAIG;IACH,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAQjC,aAAa,CAAC,GAAG,EAAE,MAAM,GAC4B,OAAO;CAG/D;AAED,8BAAsB,kBAAkB,CAAC,MAAM,SAAS,WAAW,CAAC,GAAG,CAAC,CAAE,YAAW,YAAY,CAAC,MAAM,CAAC;IACrG,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;gBAEH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAU1C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAK7D,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,OAAO;IAIlG,GAAG,CAAE,WAAW,EAAC,MAAM,EAAE,CAAC,EAAC,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAC,GAAG;IA+BxD,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAKvC,GAAG,CAAC,WAAW,EAAC,MAAM,EAAE,CAAC,EAAC,MAAM,GAAG,MAAM,EAAE,KAAK,EAAC,GAAG,EAAE,QAAQ,EAAC,GAAG;IAoBlE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,iBAAiB,EAAE,GAAG;CAOjE;AAQD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,WAE5C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,QAoC3E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAMzD"}
|