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.
Files changed (136) hide show
  1. package/.idea/.name +1 -0
  2. package/.idea/modules.xml +8 -0
  3. package/.idea/proxy-facades.iml +8 -0
  4. package/.idea/vcs.xml +6 -0
  5. package/DEVELOPMENT.md +15 -0
  6. package/LICENSE +21 -0
  7. package/RecordedReadOnProxiedObjectExt.d.ts +22 -0
  8. package/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
  9. package/RecordedReadOnProxiedObjectExt.js +41 -0
  10. package/RecordedReadOnProxiedObjectExt.js.map +1 -0
  11. package/RecordedReadOnProxiedObjectExt.ts +41 -0
  12. package/Util.d.ts +85 -0
  13. package/Util.d.ts.map +1 -0
  14. package/Util.js +239 -0
  15. package/Util.js.map +1 -0
  16. package/Util.ts +254 -0
  17. package/class-trackers/Array.d.ts +93 -0
  18. package/class-trackers/Array.d.ts.map +1 -0
  19. package/class-trackers/Array.js +193 -0
  20. package/class-trackers/Array.js.map +1 -0
  21. package/class-trackers/Array.ts +245 -0
  22. package/class-trackers/Iterator.d.ts +38 -0
  23. package/class-trackers/Iterator.d.ts.map +1 -0
  24. package/class-trackers/Iterator.js +69 -0
  25. package/class-trackers/Iterator.js.map +1 -0
  26. package/class-trackers/Iterator.ts +73 -0
  27. package/class-trackers/Map.d.ts +128 -0
  28. package/class-trackers/Map.d.ts.map +1 -0
  29. package/class-trackers/Map.js +310 -0
  30. package/class-trackers/Map.js.map +1 -0
  31. package/class-trackers/Map.ts +403 -0
  32. package/class-trackers/Set.d.ts +85 -0
  33. package/class-trackers/Set.d.ts.map +1 -0
  34. package/class-trackers/Set.js +197 -0
  35. package/class-trackers/Set.js.map +1 -0
  36. package/class-trackers/Set.ts +245 -0
  37. package/class-trackers/index.d.ts +7 -0
  38. package/class-trackers/index.d.ts.map +1 -0
  39. package/class-trackers/index.js +36 -0
  40. package/class-trackers/index.js.map +1 -0
  41. package/class-trackers/index.ts +38 -0
  42. package/class-trackers/readme.md +2 -0
  43. package/common.d.ts +235 -0
  44. package/common.d.ts.map +1 -0
  45. package/common.js +378 -0
  46. package/common.js.map +1 -0
  47. package/common.ts +501 -0
  48. package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
  49. package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
  50. package/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
  51. package/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
  52. package/dev_generateEsRuntimeBehaviourCheckerCode.ts +85 -0
  53. package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts +22 -0
  54. package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
  55. package/dist/mjs/RecordedReadOnProxiedObjectExt.js +37 -0
  56. package/dist/mjs/RecordedReadOnProxiedObjectExt.js.map +1 -0
  57. package/dist/mjs/Util.d.ts +85 -0
  58. package/dist/mjs/Util.d.ts.map +1 -0
  59. package/dist/mjs/Util.js +223 -0
  60. package/dist/mjs/Util.js.map +1 -0
  61. package/dist/mjs/class-trackers/Array.d.ts +93 -0
  62. package/dist/mjs/class-trackers/Array.d.ts.map +1 -0
  63. package/dist/mjs/class-trackers/Array.js +186 -0
  64. package/dist/mjs/class-trackers/Array.js.map +1 -0
  65. package/dist/mjs/class-trackers/Iterator.d.ts +38 -0
  66. package/dist/mjs/class-trackers/Iterator.d.ts.map +1 -0
  67. package/dist/mjs/class-trackers/Iterator.js +65 -0
  68. package/dist/mjs/class-trackers/Iterator.js.map +1 -0
  69. package/dist/mjs/class-trackers/Map.d.ts +128 -0
  70. package/dist/mjs/class-trackers/Map.d.ts.map +1 -0
  71. package/dist/mjs/class-trackers/Map.js +299 -0
  72. package/dist/mjs/class-trackers/Map.js.map +1 -0
  73. package/dist/mjs/class-trackers/Set.d.ts +85 -0
  74. package/dist/mjs/class-trackers/Set.d.ts.map +1 -0
  75. package/dist/mjs/class-trackers/Set.js +189 -0
  76. package/dist/mjs/class-trackers/Set.js.map +1 -0
  77. package/dist/mjs/class-trackers/index.d.ts +7 -0
  78. package/dist/mjs/class-trackers/index.d.ts.map +1 -0
  79. package/dist/mjs/class-trackers/index.js +32 -0
  80. package/dist/mjs/class-trackers/index.js.map +1 -0
  81. package/dist/mjs/common.d.ts +235 -0
  82. package/dist/mjs/common.d.ts.map +1 -0
  83. package/dist/mjs/common.js +361 -0
  84. package/dist/mjs/common.js.map +1 -0
  85. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
  86. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
  87. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
  88. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
  89. package/dist/mjs/index.d.ts +8 -0
  90. package/dist/mjs/index.d.ts.map +1 -0
  91. package/dist/mjs/index.js +8 -0
  92. package/dist/mjs/index.js.map +1 -0
  93. package/dist/mjs/objectChangeTracking.d.ts +43 -0
  94. package/dist/mjs/objectChangeTracking.d.ts.map +1 -0
  95. package/dist/mjs/objectChangeTracking.js +209 -0
  96. package/dist/mjs/objectChangeTracking.js.map +1 -0
  97. package/dist/mjs/origChangeTracking.d.ts +14 -0
  98. package/dist/mjs/origChangeTracking.d.ts.map +1 -0
  99. package/dist/mjs/origChangeTracking.js +58 -0
  100. package/dist/mjs/origChangeTracking.js.map +1 -0
  101. package/dist/mjs/proxyFacade.d.ts +45 -0
  102. package/dist/mjs/proxyFacade.d.ts.map +1 -0
  103. package/dist/mjs/proxyFacade.js +179 -0
  104. package/dist/mjs/proxyFacade.js.map +1 -0
  105. package/dist/mjs/watchedProxyFacade.d.ts +84 -0
  106. package/dist/mjs/watchedProxyFacade.d.ts.map +1 -0
  107. package/dist/mjs/watchedProxyFacade.js +300 -0
  108. package/dist/mjs/watchedProxyFacade.js.map +1 -0
  109. package/index.d.ts +8 -0
  110. package/index.d.ts.map +1 -0
  111. package/index.js +36 -0
  112. package/index.js.map +1 -0
  113. package/index.ts +7 -0
  114. package/index_esm.mjs +44 -0
  115. package/objectChangeTracking.d.ts +43 -0
  116. package/objectChangeTracking.d.ts.map +1 -0
  117. package/objectChangeTracking.js +214 -0
  118. package/objectChangeTracking.js.map +1 -0
  119. package/objectChangeTracking.ts +251 -0
  120. package/origChangeTracking.d.ts +14 -0
  121. package/origChangeTracking.d.ts.map +1 -0
  122. package/origChangeTracking.js +63 -0
  123. package/origChangeTracking.js.map +1 -0
  124. package/origChangeTracking.ts +72 -0
  125. package/package.json +52 -0
  126. package/proxyFacade.d.ts +45 -0
  127. package/proxyFacade.d.ts.map +1 -0
  128. package/proxyFacade.js +187 -0
  129. package/proxyFacade.js.map +1 -0
  130. package/proxyFacade.ts +222 -0
  131. package/readme.md +111 -0
  132. package/watchedProxyFacade.d.ts +84 -0
  133. package/watchedProxyFacade.d.ts.map +1 -0
  134. package/watchedProxyFacade.js +312 -0
  135. package/watchedProxyFacade.js.map +1 -0
  136. 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":";;;;;;AAAA,+CAA8D;AAC9D,iCAAkC;AAClC,qCAWkB;AAClB,iEAAqF;AACrF,4DAA0B;AAC1B,kDAA4D;AAC5D,qFAAgF;AAGhF;;;GAGG;AACH,MAAa,iBAAkB,SAAQ,qBAAY;IAG/C,YAAY,KAAc;QACtB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,SAAS;QACT,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACjF,CAAC;IAED,aAAa,CAAC,QAAoB,EAAE,aAAa,GAAG,KAAK;QACrD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACjF,CAAC;IAED,cAAc,CAAC,QAAoB;IACnC,CAAC;IAED,MAAM,CAAC,KAAmB;QACtB,IAAG,CAAE,CAAC,KAAK,YAAY,iBAAiB,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;IACtC,CAAC;CACJ;AA1BD,8CA0BC;AAED,MAAa,oBAAqB,SAAQ,+DAA8B;IAKpE,YAAY,GAAW,EAAE,KAAc;QACnC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,SAAS;QACT,YAAY;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;IAC7C,CAAC;IAED,uBAAuB,CAAC,MAAmB;QACvC,MAAM,MAAM,GAAG;YACX,IAAA,8CAAuB,EAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;SACvE,CAAA;QACD,IAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,IAAA,8CAAuB,EAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAmB;QACtB,IAAG,CAAE,CAAC,KAAK,YAAY,oBAAoB,CAAC,EAAE,CAAC;YAC3C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;IACtI,CAAC;CACJ;AAjCD,oDAiCC;AAED,MAAa,mBAAoB,SAAQ,+DAA8B;IAGnE,YAAY,KAAmC;QAC3C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,SAAS;QACT,OAAO,CAAC,oBAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,uBAAuB,CAAC,MAAmB;QACvC,MAAM,MAAM,GAAG;YACX,IAAA,8CAAuB,EAAC,MAAM,CAAC,CAAC,aAAa;SAChD,CAAA;QACD,IAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,IAAA,8CAAuB,EAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAmB;QACtB,IAAG,CAAE,CAAC,KAAK,YAAY,mBAAmB,CAAC,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,oBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACpH,CAAC;CACJ;AA7BD,kDA6BC;AAED;;GAEG;AACH,MAAa,sBAAuB,SAAQ,+DAA8B;IACtE,IAAI,SAAS;QACT,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,uBAAuB,CAAC,MAAmB;QACvC,OAAO;YACH,IAAA,8CAAuB,EAAC,MAAM,CAAC,CAAC,SAAS;SAC5C,CAAA;IACL,CAAC;IAED,MAAM,CAAC,KAAmB;QACtB,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AAdD,wDAcC;AAGD;;;;GAIG;AACH,MAAa,kBAAmB,SAAQ,yBAAgC;IAcpE,WAAW,CAAC,QAA2B;QACnC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,QAA2B;QACpC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;QACI,KAAK,EAAE,CAAC;QAtBZ,qBAAqB;QAErB,0BAAqB,GAAG,KAAK,CAAC;QAE9B,kBAAkB;QAElB;;;WAGG;QACH,wBAAmB,GAAG,IAAI,GAAG,EAAqB,CAAA;QAa9C,IAAA,gCAAuB,GAAE,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACH,sBAAsB,CAAuC,GAAM,EAAE,GAAM,EAAE,QAAyB;QAClG,IAAA,8CAAuB,EAAC,GAAG,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAa,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxG,CAAC;IAED;;;;;OAKG;IACH,uBAAuB,CAAuC,GAAM,EAAE,GAAM,EAAE,QAAyB;;QACnG,MAAA,2CAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,0CAAE,sBAAsB,CAAC,GAAG,CAAC,GAAa,EAAE,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7G,CAAC;IAES,YAAY,CAAC,MAAc,EAAE,MAAW;QAC9C,OAAO,IAAI,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;CACJ;AAlDD,gDAkDC;AAED,MAAa,mBAAoB,SAAQ,gCAAsC;IAE3E,YAAY,MAAc,EAAE,MAA0B;QAClD,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,cAAc;QACd,OAAO,IAAA,4BAAoB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,4BAA4B;IAC1E,CAAC;IAED,aAAa,CAAC,IAAiC;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QAEvB,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,mBAAmB;IAC9E,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,GAAG,CAAE,WAAkB,EAAE,GAAmB,EAAE,QAAY;;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,wBAAwB,GAAG,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,wBAAwB,MAAK,IAAI,CAAC;QAExF,IAAG,GAAG,KAAK,sBAAsB,EAAE,CAAC,CAAC,0CAA0C;YAC3E,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAG,GAAG,KAAK,SAAS,EAAE,CAAC,CAAC,0CAA0C;YAC9D,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;QAED,sCAAsC;QACtC,IAAG,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACnC,KAAI,MAAM,YAAY,IAAI,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAChE,IAAI,gBAAgB,GAAG,MAAM,CAAC,wBAAwB,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBACpF,IAAG,gBAAgB,KAAK,SAAS,EAAE,CAAC,CAAC,iEAAiE;oBAClG,YAAY;oBACZ,IAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,oBAAoB;wBAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3E,CAAC;oBACD,IAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,qBAAqB;wBAC5C,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;oBAClD,CAAC;yBACI,CAAC;wBACF,OAAO,gBAAgB,CAAC,KAAK,KAAK,UAAU,IAAI,IAAA,iBAAU,EAAC,0CAA0C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB;wBACtI,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,KAAK,CAAC;wBAChD,OAAO,gBAAgB,CAAC;oBAC5B,CAAC;gBACL,CAAC;YACL,CAAC;YACD,kFAAkF;YAClF,YAAY;YACZ,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpD,OAAO,+BAA+B,CAAA;YAC1C,CAAC;YAED,IAAG,OAAO,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,GAAU,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,uEAAuE;gBAC/I,IAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9C,OAAO,0BAA0B,CAAA;gBACrC,CAAC;qBACI,CAAC;oBACF,OAAO,gCAAgC,CAAA,CAAC,+CAA+C;gBAC3F,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAG7C,IAAI,UAAU,GAA+D,SAAS,CAAC;QACvF;;WAEG;QACH,SAAS,0BAA0B,CAAc,GAAG,IAAe;;YAC/D,MAAM,UAAU,GAAG,UAAW,CAAC,KAAK,CAAC,wBAAwB,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,wBAAwB;YAC1G,IAAG,CAAA,MAAA,WAAW,CAAC,cAAc,0CAAE,WAAW,MAAK,KAAK,EAAE,CAAC,CAAC,4BAA4B;gBAChF,WAAW,CAAC,aAAa,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,OAAO,CAAA,MAAA,WAAW,CAAC,cAAc,0CAAE,2BAA2B,EAAA,CAAC,CAAA,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA,CAAC,CAAA,UAAU,CAAC;QACzH,CAAC;QACD;;;WAGG;QACH,SAAS,gCAAgC,CAAc,GAAG,IAAe;YACrE,OAAO,IAAA,2BAAkB,EAAC,KAAK,EAAE,IAAI,+BAAsB,CAAC,KAAK,CAAC,EAAC,CAAC,IAAA,8CAAuB,EAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,EAAC,GAAG,EAAE;;gBACtH,MAAM,UAAU,GAAG,UAAW,CAAC,KAAK,CAAC,wBAAwB,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,wBAAwB;gBAC1G,IAAG,CAAA,MAAA,WAAW,CAAC,cAAc,0CAAE,WAAW,MAAK,KAAK,EAAE,CAAC,CAAC,4BAA4B;oBAChF,WAAW,CAAC,aAAa,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;gBAC5D,CAAC;gBACD,OAAO,CAAA,MAAA,WAAW,CAAC,cAAc,0CAAE,2BAA2B,EAAA,CAAC,CAAA,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA,CAAC,CAAA,UAAU,CAAC;YACzH,CAAC,CAAC,CAAC;QACP,CAAC;QACD;;;WAGG;QACH,SAAS,+BAA+B,CAAc,GAAG,IAAe;YACpE,OAAO,IAAA,2BAAkB,EAAC,KAAK,EAAE,SAAS,EAAC,EAAE,EAAC,GAAG,EAAE;gBAC/C,OAAO,UAAW,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAE,uBAAuB;YAClE,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAW;;QACf,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,IAAG,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACpC,IAAG,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,SAAS,IAAI,IAAA,8BAAqB,EAAC,IAAI,CAAC,MAAM,EAAC,GAAG,CAAE,KAAK,SAAS,EAAE,CAAC,CAAC,kCAAkC;gBAC7J,OAAO,MAAM,CAAC;YAClB,CAAC;QACL,CAAC;QACD,IAAG,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,WAAW,MAAK,KAAK,EAAE,CAAC,CAAC,4BAA4B;YACzE,IAAI,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB;QAClF,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAES,SAAS,CAAC,GAAoB,EAAE,iBAAsB;QAC5D,MAAM,wBAAwB,GAAG,IAAA,8CAAuB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,YAAY,GAAgB,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACpB,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QACjE,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;QAE9D,MAAM,aAAa,GAAG,IAAA,8BAAqB,EAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC;QAC5E,IAAI,aAAa,EAAE,CAAC;YAChB,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAC9D,CAAC;QAED,IAAA,2BAAkB,EAAC,IAAI,CAAC,KAAK,EAAE,IAAI,+BAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAC,YAAY,EAAC,GAAG,EAAE;YACpF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,cAAc,CAAC,MAAc,EAAE,GAAoB;QAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC;QACnF,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,IAAA,2BAAkB,EAAC,IAAI,CAAC,KAAK,EAAE,IAAI,+BAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAC,CAAC,IAAA,8CAAuB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,EAAC,GAAG,EAAE;YAClI,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,yEAAyE;YACvH,OAAO,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,MAAc;;QAClB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAG,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,WAAW,MAAK,KAAK,EAAE,CAAC,CAAC,4BAA4B;YACzE,IAAI,CAAC,aAAa,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAA;QACvD,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,UAAU;QACN,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,MAAM,YAAY,GAAG,CAAC;IACtC,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,MAAM,YAAY,GAAG,CAAC;IACtC,CAAC;CACJ;AA7KD,kDA6KC"}