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 @@
|
|
|
1
|
+
{"version":3,"file":"Set.js","sourceRoot":"","sources":["Set.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ChangeListener, dualUseTracker_callOrigMethodOnTarget, ClassTrackingConfiguration,
|
|
3
|
+
DualUseTracker,
|
|
4
|
+
ForWatchedProxyHandler, IWatchedProxyHandler_common, makeIteratorTranslateValue,
|
|
5
|
+
ObjKey,
|
|
6
|
+
RecordedRead,
|
|
7
|
+
RecordedReadOnProxiedObject,
|
|
8
|
+
EventHook, runChangeOperation, UnspecificObjectChange
|
|
9
|
+
} from "../common";
|
|
10
|
+
import {getChangeHooksForObject, changeHooksForObject} from "../objectChangeTracking";
|
|
11
|
+
import {arraysAreShallowlyEqual, MapSet, newDefaultMap} from "../Util";
|
|
12
|
+
import {WatchedProxyHandler} from "../watchedProxyFacade";
|
|
13
|
+
import {RecordedReadOnProxiedObjectExt} from "../RecordedReadOnProxiedObjectExt";
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Listeners for one set.
|
|
18
|
+
* 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.
|
|
19
|
+
* {@link ObjectChangeHooks} are also subscribed on Sets
|
|
20
|
+
*/
|
|
21
|
+
class SetChangeHooks {
|
|
22
|
+
afterSpecificValueChanged = newDefaultMap<unknown, EventHook>( () => new EventHook());
|
|
23
|
+
afterAnyValueChanged = new EventHook();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const changeHooksForSet = new WeakMap<Set<unknown>, SetChangeHooks>();
|
|
27
|
+
export function getChangeHooksForSet(set: Set<unknown>) {
|
|
28
|
+
let result = changeHooksForSet.get(set);
|
|
29
|
+
if(result === undefined) {
|
|
30
|
+
changeHooksForSet.set(set, result = new SetChangeHooks());
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Can be either used as a supervisor-class in a WatchedProxyHandler, or installed on the non-proxied object via Object.setPrototypeOf
|
|
37
|
+
* The "this" may be different in these cases.
|
|
38
|
+
*/
|
|
39
|
+
export class SetChangeTracker<T> extends Set<T> implements DualUseTracker<Set<T>>{
|
|
40
|
+
|
|
41
|
+
get _watchedProxyHandler(): IWatchedProxyHandler_common | undefined {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected _withUnspecificChange<R>(changeFn: () => R): R {
|
|
46
|
+
return runChangeOperation(this, new UnspecificObjectChange(this), [getChangeHooksForObject(this).unspecificChange], changeFn)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Will return the original object when this class is used as supervisor class in the WatchedProxyHandler
|
|
51
|
+
*/
|
|
52
|
+
get _target(): Set<T> {
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Pretend that this is a Set
|
|
58
|
+
*/
|
|
59
|
+
get ["constructor"]() {
|
|
60
|
+
return Set;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
add(value:T): this {
|
|
64
|
+
value = this._watchedProxyHandler?this._watchedProxyHandler.getFacade().getUnproxiedValue(value):value; // Translate to unproxied value
|
|
65
|
+
|
|
66
|
+
if(this._target.has(value)) { // No change?
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
runChangeOperation(this, new UnspecificObjectChange(this),[getChangeHooksForSet(this).afterSpecificValueChanged.get(value), getChangeHooksForSet(this).afterAnyValueChanged],() => {
|
|
70
|
+
dualUseTracker_callOrigMethodOnTarget(this, "add", [value]);
|
|
71
|
+
});
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
delete(value: T): boolean {
|
|
76
|
+
value = this._watchedProxyHandler?this._watchedProxyHandler.getFacade().getUnproxiedValue(value):value; // Translate to unproxied value
|
|
77
|
+
|
|
78
|
+
if(!this._target.has(value)) { // no change?
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return runChangeOperation(this, new UnspecificObjectChange(this),[getChangeHooksForSet(this).afterSpecificValueChanged.get(value), getChangeHooksForSet(this).afterAnyValueChanged],() => {
|
|
83
|
+
return dualUseTracker_callOrigMethodOnTarget(this, "delete", [value]);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
clear() {
|
|
88
|
+
return runChangeOperation(this, new UnspecificObjectChange(this),[getChangeHooksForSet(this).afterAnyValueChanged, getChangeHooksForObject(this).unspecificChange],() => {
|
|
89
|
+
return dualUseTracker_callOrigMethodOnTarget(this, "clear", []);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export class RecordedSet_has extends RecordedReadOnProxiedObjectExt {
|
|
96
|
+
value!: unknown;
|
|
97
|
+
/**
|
|
98
|
+
* Result of the .has call
|
|
99
|
+
*/
|
|
100
|
+
result: boolean;
|
|
101
|
+
obj!: Set<unknown>;
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
constructor(value: unknown, result: boolean) {
|
|
105
|
+
super();
|
|
106
|
+
this.value = value;
|
|
107
|
+
this.result = result;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
get isChanged() {
|
|
111
|
+
return this.result !== this.obj.has(this.value);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
getAffectingChangeHooks(target: this["obj"]) {
|
|
115
|
+
return [
|
|
116
|
+
getChangeHooksForSet(target).afterSpecificValueChanged.get(this.value),
|
|
117
|
+
getChangeHooksForObject(target).unspecificChange
|
|
118
|
+
];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
equals(other: RecordedRead) {
|
|
122
|
+
if (!(other instanceof RecordedSet_has)) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return this.proxyHandler === other.proxyHandler && this.obj === other.obj && this.value === other.value && this.result === other.result;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export class RecordedSetValuesRead extends RecordedReadOnProxiedObjectExt {
|
|
131
|
+
values: Array<unknown>;
|
|
132
|
+
|
|
133
|
+
obj!:Set<unknown>;
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
constructor(values: Array<unknown>) {
|
|
137
|
+
super();
|
|
138
|
+
this.values = values;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
getAffectingChangeHooks(target: this["obj"]) {
|
|
142
|
+
return [
|
|
143
|
+
getChangeHooksForSet(target).afterAnyValueChanged,
|
|
144
|
+
getChangeHooksForObject(target).unspecificChange
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
equals(other: RecordedRead): boolean {
|
|
149
|
+
if (!(other instanceof RecordedSetValuesRead)) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return this.proxyHandler === other.proxyHandler && this.obj === other.obj && arraysAreShallowlyEqual(this.values, other.values);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
get isChanged(): boolean {
|
|
157
|
+
return !arraysAreShallowlyEqual(this.values, [...(this.obj).values()]);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export class SetReadTracker<T> extends Set<T> implements ForWatchedProxyHandler<Set<T>> {
|
|
162
|
+
get _watchedProxyHandler(): WatchedProxyHandler {
|
|
163
|
+
throw new Error("not calling from inside a WatchedProxyHandler"); // Will return the handler when called through the handler
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
get _target(): Set<T> {
|
|
167
|
+
throw new Error("not calling from inside a WatchedProxyHandler"); // Will return the value when called through the handler
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
protected _fireAfterValuesRead() {
|
|
171
|
+
let recordedSetValuesRead = new RecordedSetValuesRead([...this._target]);
|
|
172
|
+
this._watchedProxyHandler?.fireAfterRead(recordedSetValuesRead);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Pretend that this is a Set
|
|
177
|
+
*/
|
|
178
|
+
get ["constructor"]() {
|
|
179
|
+
return Set;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
has(value: T): boolean {
|
|
183
|
+
value = this._watchedProxyHandler.getFacade().getUnproxiedValue(value);
|
|
184
|
+
const result = this._target.has(value);
|
|
185
|
+
|
|
186
|
+
const read = new RecordedSet_has(value, result);
|
|
187
|
+
this._watchedProxyHandler?.fireAfterRead(read);
|
|
188
|
+
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
values(): SetIterator<T> {
|
|
193
|
+
const result = this._target.values();
|
|
194
|
+
this._fireAfterValuesRead();
|
|
195
|
+
return makeIteratorTranslateValue(result, (value) => this._watchedProxyHandler.getFacade().getProxyFor(value));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
entries(): SetIterator<[T, T]> {
|
|
199
|
+
const result = this._target.entries();
|
|
200
|
+
this._fireAfterValuesRead();
|
|
201
|
+
|
|
202
|
+
const facade = this._watchedProxyHandler.getFacade();
|
|
203
|
+
return makeIteratorTranslateValue<[T, T], SetIterator<[T, T]>/*strange that TS does not infer the types here*/>(result, ([value1,value2]) => [facade.getProxyFor(value1), facade.getProxyFor(value2)]);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
keys(): SetIterator<T> {
|
|
207
|
+
const result = this._target.keys();
|
|
208
|
+
this._fireAfterValuesRead();
|
|
209
|
+
return makeIteratorTranslateValue(result, (value) => this._watchedProxyHandler.getFacade().getProxyFor(value));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
forEach(callbackfn: (value: T, value2: T, set: Set<T>, ...restOfArgs: unknown[]) => void, ...restOfArgs: unknown[]) {
|
|
213
|
+
const getProxyFor: (<T>(val: T)=>T) = (value) => this._watchedProxyHandler.getFacade().getProxyFor(value);
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Calls callbackFn but supplies it it's arguments *proxied*
|
|
217
|
+
*/
|
|
218
|
+
function callCallbackFnWithProxies(this: Set<T>, value: T, value2: T, set: Set<T>, ...restOfArgs: unknown[]): void{
|
|
219
|
+
callbackfn.apply(this, [getProxyFor(value), getProxyFor(value2), getProxyFor(set), ...restOfArgs]);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const result = this._target.forEach(callCallbackFnWithProxies, ...restOfArgs);
|
|
223
|
+
this._fireAfterValuesRead();
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
[Symbol.iterator](): SetIterator<T> {
|
|
228
|
+
const result = this._target[Symbol.iterator]();
|
|
229
|
+
this._fireAfterValuesRead();
|
|
230
|
+
return makeIteratorTranslateValue(result, (value) => this._watchedProxyHandler.getFacade().getProxyFor(value));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
get size(): number {
|
|
234
|
+
const result = this._target.size;
|
|
235
|
+
this._fireAfterValuesRead();
|
|
236
|
+
return result;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export const config = new class extends ClassTrackingConfiguration {
|
|
241
|
+
clazz=Set;
|
|
242
|
+
readTracker= SetReadTracker;
|
|
243
|
+
changeTracker = SetChangeTracker
|
|
244
|
+
receiverMustBeNonProxied = true;
|
|
245
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ClassTrackingConfiguration } from "../common";
|
|
2
|
+
/**
|
|
3
|
+
* Register configurations here:
|
|
4
|
+
*/
|
|
5
|
+
export declare const classTrackingConfigurations: ClassTrackingConfiguration[];
|
|
6
|
+
export declare function getTrackingConfigFor(obj: object): ClassTrackingConfiguration | undefined;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,0BAA0B,EAAQ,MAAM,WAAW,CAAC;AAO5D;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,0BAA0B,EAAwD,CAAC;AAI7H,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS,CAuBxF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.classTrackingConfigurations = void 0;
|
|
4
|
+
exports.getTrackingConfigFor = getTrackingConfigFor;
|
|
5
|
+
const Array_1 = require("./Array");
|
|
6
|
+
const Set_1 = require("./Set");
|
|
7
|
+
const Map_1 = require("./Map");
|
|
8
|
+
const Iterator_1 = require("./Iterator");
|
|
9
|
+
const Util_1 = require("../Util");
|
|
10
|
+
/**
|
|
11
|
+
* Register configurations here:
|
|
12
|
+
*/
|
|
13
|
+
exports.classTrackingConfigurations = [Array_1.config, Set_1.config, Map_1.config, Iterator_1.IteratorConfig];
|
|
14
|
+
const cache_clazzToConfig = new WeakMap();
|
|
15
|
+
function getTrackingConfigFor(obj) {
|
|
16
|
+
const clazz = obj.constructor;
|
|
17
|
+
if (clazz === undefined) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
if (cache_clazzToConfig.has(clazz)) {
|
|
21
|
+
return cache_clazzToConfig.get(clazz);
|
|
22
|
+
}
|
|
23
|
+
const result = exports.classTrackingConfigurations.find(cfg => {
|
|
24
|
+
if (cfg.clazz === clazz) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
if ((0, Util_1.classIsSubclassOf)(clazz, cfg.clazz)) {
|
|
28
|
+
cfg.worksForSubclasses || (0, Util_1.throwError)(`Subclasses of ${cfg.clazz.name} are not supported. Actually got: ${clazz.name}`);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
});
|
|
33
|
+
cache_clazzToConfig.set(clazz, result);
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAcA,oDAuBC;AApCD,mCAA6C;AAC7C,+BAAyC;AACzC,+BAAyC;AACzC,yCAAyC;AACzC,kCAAsD;AAEtD;;GAEG;AACU,QAAA,2BAA2B,GAAiC,CAAC,cAAW,EAAE,YAAS,EAAE,YAAS,EAAE,yBAAc,CAAC,CAAC;AAE7H,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAAiD,CAAC;AAEzF,SAAgB,oBAAoB,CAAC,GAAW;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAoB,CAAC;IACvC,IAAG,KAAK,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAG,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,mCAA2B,CAAC,IAAI,CAAC,GAAG,CAAA,EAAE;QACjD,IAAG,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAG,IAAA,wBAAiB,EAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,kBAAkB,IAAI,IAAA,iBAAU,EAAC,iBAAiB,GAAG,CAAC,KAAK,CAAC,IAAI,qCAAqC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACvH,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import {ClassTrackingConfiguration, Clazz} from "../common";
|
|
2
|
+
import {config as arrayConfig} from "./Array"
|
|
3
|
+
import {config as setConfig} from "./Set"
|
|
4
|
+
import {config as mapConfig} from "./Map"
|
|
5
|
+
import {IteratorConfig} from "./Iterator"
|
|
6
|
+
import {classIsSubclassOf, throwError} from "../Util";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Register configurations here:
|
|
10
|
+
*/
|
|
11
|
+
export const classTrackingConfigurations: ClassTrackingConfiguration[] = [arrayConfig, setConfig, mapConfig, IteratorConfig];
|
|
12
|
+
|
|
13
|
+
const cache_clazzToConfig = new WeakMap<Clazz, ClassTrackingConfiguration | undefined>();
|
|
14
|
+
|
|
15
|
+
export function getTrackingConfigFor(obj: object): ClassTrackingConfiguration | undefined {
|
|
16
|
+
const clazz = obj.constructor as Clazz;
|
|
17
|
+
if(clazz === undefined) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if(cache_clazzToConfig.has(clazz)) {
|
|
22
|
+
return cache_clazzToConfig.get(clazz);
|
|
23
|
+
}
|
|
24
|
+
const result = classTrackingConfigurations.find(cfg=> {
|
|
25
|
+
if(cfg.clazz === clazz) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if(classIsSubclassOf(clazz, cfg.clazz)) {
|
|
30
|
+
cfg.worksForSubclasses || throwError(`Subclasses of ${cfg.clazz.name} are not supported. Actually got: ${clazz.name}`);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return false;
|
|
35
|
+
});
|
|
36
|
+
cache_clazzToConfig.set(clazz, result);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
package/common.d.ts
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { WatchedProxyHandler } from "./watchedProxyFacade";
|
|
2
|
+
import { WeakMapSet } from "./Util";
|
|
3
|
+
import { ProxyFacade } from "./proxyFacade";
|
|
4
|
+
export type ObjKey = string | symbol;
|
|
5
|
+
export declare abstract class RecordedRead {
|
|
6
|
+
abstract equals(other: RecordedRead): boolean;
|
|
7
|
+
abstract get isChanged(): boolean;
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @param listener
|
|
11
|
+
* @param trackOriginal true to install a tracker on the non-proxied- (by this facade) original object
|
|
12
|
+
*/
|
|
13
|
+
abstract onAfterChange(listener: () => void, trackOriginal?: boolean): void;
|
|
14
|
+
abstract offAfterChange(listener: () => void): void;
|
|
15
|
+
}
|
|
16
|
+
export declare abstract class RecordedReadOnProxiedObject extends RecordedRead {
|
|
17
|
+
proxyHandler: WatchedProxyHandler;
|
|
18
|
+
/**
|
|
19
|
+
* A bit redundant with proxyhandler. But for performance reasons, we leave it
|
|
20
|
+
*/
|
|
21
|
+
obj: object;
|
|
22
|
+
}
|
|
23
|
+
export type AfterReadListener = (read: RecordedRead) => void;
|
|
24
|
+
export type AfterChangeOwnKeysListener = () => void;
|
|
25
|
+
export type Clazz = {
|
|
26
|
+
new (...args: any[]): unknown;
|
|
27
|
+
};
|
|
28
|
+
export type GetIteratorValueProxiedFn<T> = (value: T) => T;
|
|
29
|
+
export type IteratorReturningProxiedValue<T> = Iterator<T> & {
|
|
30
|
+
_getValueProxied: GetIteratorValueProxiedFn<T>;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* A change operation that may later be serializable. Beeing able to store it in the transaction protocol of membrace-db. Or to syncronize live objects between server->client
|
|
34
|
+
*/
|
|
35
|
+
export declare abstract class ChangeOperation {
|
|
36
|
+
/**
|
|
37
|
+
* Saved inputs as arguments for the do function
|
|
38
|
+
*/
|
|
39
|
+
inputs?: Parameters<this["_do"]>;
|
|
40
|
+
abstract _do(...inputs: unknown[]): {
|
|
41
|
+
result: unknown;
|
|
42
|
+
undoInfo: unknown;
|
|
43
|
+
};
|
|
44
|
+
_unDo(undoInfo: ReturnType<this["_do"]>["undoInfo"]): void;
|
|
45
|
+
constructor();
|
|
46
|
+
withInputs(...inputs: Parameters<this["_do"]>): this;
|
|
47
|
+
do(): ReturnType<this["_do"]>["undoInfo"];
|
|
48
|
+
}
|
|
49
|
+
export declare function registerChangeOperationClass(clazz: typeof ChangeOperation): void;
|
|
50
|
+
export type ChangeListener = (change: ChangeOperation) => void;
|
|
51
|
+
/**
|
|
52
|
+
* Registry for one possible potential target event type. I.e. a property of a certain object, or a more abstract one like: "some key of a certain object has changed".
|
|
53
|
+
*/
|
|
54
|
+
export declare class EventHook {
|
|
55
|
+
/**
|
|
56
|
+
* Called before the change
|
|
57
|
+
* @param change
|
|
58
|
+
*/
|
|
59
|
+
beforeListeners: Set<ChangeListener>;
|
|
60
|
+
/**
|
|
61
|
+
* Called after the change
|
|
62
|
+
* @param change
|
|
63
|
+
*/
|
|
64
|
+
afterListeners: Set<ChangeListener>;
|
|
65
|
+
/**
|
|
66
|
+
* To be able to easily control the before and after for exactly the same change. It's an idea / no good use case found yet.
|
|
67
|
+
* @param change
|
|
68
|
+
* @param doChange
|
|
69
|
+
*/
|
|
70
|
+
fireBefore(change: ChangeOperation): void;
|
|
71
|
+
fireAfter(change: ChangeOperation): void;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* For use in proxy and direct
|
|
75
|
+
*/
|
|
76
|
+
export interface DualUseTracker<T> {
|
|
77
|
+
/**
|
|
78
|
+
* Will return the handler when called through the handler
|
|
79
|
+
*/
|
|
80
|
+
get _watchedProxyHandler(): IWatchedProxyHandler_common | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* The original (unproxied) object
|
|
83
|
+
*/
|
|
84
|
+
get _target(): T;
|
|
85
|
+
}
|
|
86
|
+
export declare function dualUseTracker_callOrigMethodOnTarget<O extends object, M extends keyof O>(tracker: DualUseTracker<O>, methodName: M, args: unknown[]): ReturnType<O[M]>;
|
|
87
|
+
/**
|
|
88
|
+
* Like Object.getOwnPropertyDescriptor. But for all parent classes
|
|
89
|
+
* @param o
|
|
90
|
+
* @param p
|
|
91
|
+
*/
|
|
92
|
+
export declare function getPropertyDescriptor(o: object, p: PropertyKey): PropertyDescriptor | undefined;
|
|
93
|
+
export type GetterFlags = {
|
|
94
|
+
origHadGetter?: boolean;
|
|
95
|
+
};
|
|
96
|
+
export type SetterFlags = {
|
|
97
|
+
origHadSetter?: boolean;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Informs hooksToServe's beforeListeners + executes changeOperation + informs hooksToServe's afterListeners.
|
|
101
|
+
* All this while preventing listeners from beeing called twice (this is the main purpose of this function!). Even during the same operation (call) that spans a call stack (the stack can go through multiple proxy layers)
|
|
102
|
+
* <p>
|
|
103
|
+
* This function is needed, because there's some overlapping of concerns in listener types, especially for Arrays. Also internal methods may again call the set method which itsself wants to call the propertychange_listeners.
|
|
104
|
+
* </p>
|
|
105
|
+
* @param forTarget object to sync on. All hooks passed to nested runChangeOperation calls will only be fired once.
|
|
106
|
+
* @param paramForListeners the parameter for the change listeners. It won't be run by this function / it's just the parameter. When setting to undefined, it indicates that this runChangeOperation call is only to wrap multiple nested calls / sync them on targetObject. The default anyChange hook won't be called at this level either.
|
|
107
|
+
* @param hooksToServe these hooks will be called (not twice, as mentioned).
|
|
108
|
+
* @param changeOperationFn
|
|
109
|
+
*/
|
|
110
|
+
export declare function runChangeOperation<R>(forTarget: object, paramForListeners: ChangeOperation | undefined, hooksToServe: EventHook[], changeOperationFn: () => R): R;
|
|
111
|
+
export declare function checkEsRuntimeBehaviour(): void;
|
|
112
|
+
export interface IWatchedProxyHandler_common {
|
|
113
|
+
/**
|
|
114
|
+
* Registers the Read to this WatchedProxyHandler and fires it on the WatchedFacade (informs WatchedFacade's listeners)
|
|
115
|
+
* @param read
|
|
116
|
+
*/
|
|
117
|
+
fireAfterRead(read: RecordedReadOnProxiedObject): void;
|
|
118
|
+
getFacade(): ProxyFacade<any>;
|
|
119
|
+
}
|
|
120
|
+
export interface ForWatchedProxyHandler<T> extends DualUseTracker<T> {
|
|
121
|
+
/**
|
|
122
|
+
* Will return the handler when called through the handler
|
|
123
|
+
*/
|
|
124
|
+
get _watchedProxyHandler(): IWatchedProxyHandler_common;
|
|
125
|
+
/**
|
|
126
|
+
* The original (unproxied) object
|
|
127
|
+
*/
|
|
128
|
+
get _target(): T;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Configures tracking behaviour for a certain class
|
|
132
|
+
*/
|
|
133
|
+
export declare abstract class ClassTrackingConfiguration {
|
|
134
|
+
/**
|
|
135
|
+
* For which is this config?
|
|
136
|
+
*/
|
|
137
|
+
abstract clazz: Clazz;
|
|
138
|
+
worksForSubclasses: boolean;
|
|
139
|
+
readTracker?: Clazz;
|
|
140
|
+
changeTracker?: Clazz;
|
|
141
|
+
/**
|
|
142
|
+
* Built-in Methods, which are using fields / calling methods on the proxy transparently/loyally, so those methods don't call/use internal stuff directly.
|
|
143
|
+
* Tested with, see dev_generateEsRuntimeBehaviourCheckerCode.ts
|
|
144
|
+
* May include read-only / reader methods
|
|
145
|
+
*/
|
|
146
|
+
knownHighLevelMethods: Set<ObjKey>;
|
|
147
|
+
/**
|
|
148
|
+
* Non-high level. These fire `RecordedUnspecificRead`s then. So better implement them instead to fire i.e RecordedArrayValuesRead.
|
|
149
|
+
*/
|
|
150
|
+
readOnlyMethods: Set<ObjKey>;
|
|
151
|
+
/**
|
|
152
|
+
* Non-high level. Same as above: better implement them
|
|
153
|
+
*/
|
|
154
|
+
readOnlyFields: Set<ObjKey>;
|
|
155
|
+
/**
|
|
156
|
+
* Default, if not listed as high-level method
|
|
157
|
+
*/
|
|
158
|
+
receiverMustBeNonProxied: boolean;
|
|
159
|
+
/**
|
|
160
|
+
* Makes the WatchedProxyFacade's handler also track/fire reads for methods that are not **directly** in the this.readTracker class.
|
|
161
|
+
*/
|
|
162
|
+
trackTreads: boolean;
|
|
163
|
+
/**
|
|
164
|
+
* (For Array:) Flags to track setting properties, meaning changes are not only done by calling methods. This will use a Proxy (install a Proxy as Prototype).
|
|
165
|
+
*/
|
|
166
|
+
trackSettingObjectProperties: boolean;
|
|
167
|
+
/**
|
|
168
|
+
* Wrap the results of methods which are not in the readTracker or changeTracker in proxies
|
|
169
|
+
* Take caution when enabling this. It is not always a good idea. I.e. Map#entries() return new intermediates arrays [] and these will then also be proxied and result in a false positive something-has-changed detection when comparing recorded Reads.
|
|
170
|
+
*/
|
|
171
|
+
proxyUnhandledMethodResults: boolean;
|
|
172
|
+
/**
|
|
173
|
+
* Lists read and changeTracker as far as they're present
|
|
174
|
+
*/
|
|
175
|
+
getTrackerClasses(): Clazz[];
|
|
176
|
+
}
|
|
177
|
+
export declare function recordedReadsArraysAreEqual(a: RecordedRead[], b: RecordedRead[]): boolean;
|
|
178
|
+
/**
|
|
179
|
+
* Patches the iterator so it runs the value through the translateFn
|
|
180
|
+
* @param iterator
|
|
181
|
+
* @param translateFn
|
|
182
|
+
*/
|
|
183
|
+
export declare function makeIteratorTranslateValue<V, IT extends Iterator<V>>(iterator: IT, translateFn: (value: V) => V): IT;
|
|
184
|
+
/**
|
|
185
|
+
* Base for ProxyFacades and change-tracking of original objects (without proxy facades) See {@see changeTrackedOriginaObjects the changeTrackedOriginaObjects global instance}
|
|
186
|
+
*/
|
|
187
|
+
export declare class PartialGraph {
|
|
188
|
+
/**
|
|
189
|
+
* True means, it spreads it's self when members are read or set. Not yet implemented for non-proxy-facades.
|
|
190
|
+
* Always true for proxy-facade subclasses (that's their job).
|
|
191
|
+
*/
|
|
192
|
+
viral: boolean;
|
|
193
|
+
/**
|
|
194
|
+
* Called after a change has been made to any object inside this graph
|
|
195
|
+
* Note: There are also listeners for specified properties/situations (which are more capable)
|
|
196
|
+
* @protected
|
|
197
|
+
*/
|
|
198
|
+
_changeHook: EventHook;
|
|
199
|
+
/**
|
|
200
|
+
*
|
|
201
|
+
* @param listener Called when a change is made to any object inside this graph.
|
|
202
|
+
* The listener is called when the change is not yet written unlike {@see onAfterChange}. So throwing an exception in the listener will prevent the actual change from happening.
|
|
203
|
+
*/
|
|
204
|
+
onBeforeChange(listener: ChangeListener): void;
|
|
205
|
+
/**
|
|
206
|
+
* Unregister listener from {@see PartialGraph#onBeforeChange}
|
|
207
|
+
* @param listener
|
|
208
|
+
*/
|
|
209
|
+
offBeforeChange(listener: ChangeListener): void;
|
|
210
|
+
/**
|
|
211
|
+
*
|
|
212
|
+
* @param listener Called after a change has been made to any object inside this graph
|
|
213
|
+
*/
|
|
214
|
+
onAfterChange(listener: ChangeListener): void;
|
|
215
|
+
/**
|
|
216
|
+
* Unregister listener from {@see PartialGraph#onAfterChange}
|
|
217
|
+
* @param listener
|
|
218
|
+
*/
|
|
219
|
+
offAfterChange(listener: ChangeListener): void;
|
|
220
|
+
hasObj(obj: object): boolean | undefined;
|
|
221
|
+
_register(obj: object): void;
|
|
222
|
+
}
|
|
223
|
+
export declare const objectMembershipInGraphs: WeakMapSet<object, PartialGraph>;
|
|
224
|
+
/**
|
|
225
|
+
* TODO: Implement subclasses
|
|
226
|
+
*/
|
|
227
|
+
export declare class UnspecificObjectChange extends ChangeOperation {
|
|
228
|
+
constructor(target?: object);
|
|
229
|
+
_do(...inputs: unknown[]): {
|
|
230
|
+
result: undefined;
|
|
231
|
+
undoInfo: undefined;
|
|
232
|
+
};
|
|
233
|
+
_unDo(undoInfo: ReturnType<this["_do"]>["undoInfo"]): void;
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=common.d.ts.map
|
package/common.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAgE,UAAU,EAAC,MAAM,QAAQ,CAAC;AACjG,OAAO,EAAgB,WAAW,EAAC,MAAM,eAAe,CAAC;AAGzD,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,8BAAsB,YAAY;IAC9B,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;IAE7C,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC;IAElC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI;IAE3E,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;CACtD;AAED,8BAAsB,2BAA4B,SAAQ,YAAY;IAClE,YAAY,EAAG,mBAAmB,CAAA;IAClC;;OAEG;IACH,GAAG,EAAG,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;AAE7D,MAAM,MAAM,0BAA0B,GAAG,MAAM,IAAI,CAAC;AACpD,MAAM,MAAM,KAAK,GAAG;IAChB,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;AAC3D,MAAM,MAAM,6BAA6B,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG;IAAC,gBAAgB,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAA;CAAC,CAAA;AAE7G;;GAEG;AACH,8BAAsB,eAAe;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAEhC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAC;IAExE,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI;;IAS1D,UAAU,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI;IAKpD,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;CAK5C;AAGD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,eAAe,QAKzE;AAID,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;AAE/D;;GAEG;AACH,qBAAa,SAAS;IAClB;;;OAGG;IACH,eAAe,sBAA8B;IAE7C;;;OAGG;IACH,cAAc,sBAA4B;IAE1C;;;;OAIG;IAGH,UAAU,CAAC,MAAM,EAAE,eAAe;IAIlC,SAAS,CAAC,MAAM,EAAE,eAAe;CAGpC;AAGD;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAE7B;;OAEG;IACH,IAAI,oBAAoB,IAAI,2BAA2B,GAAG,SAAS,CAAC;IAEpE;;OAEG;IACH,IAAI,OAAO,IAAI,CAAC,CAAA;CACnB;AAGD,wBAAgB,qCAAqC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAIvK;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,GAAI,kBAAkB,GAAG,SAAS,CAShG;AAED,MAAM,MAAM,WAAW,GAAG;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AACD,MAAM,MAAM,WAAW,GAAG;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAmBD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,eAAe,GAAG,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,GAAI,CAAC,CA6ClK;AAID,wBAAgB,uBAAuB,SAgEtC;AAED,MAAM,WAAW,2BAA2B;IACxC;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAEvD,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,sBAAsB,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IAChE;;OAEG;IACH,IAAI,oBAAoB,IAAI,2BAA2B,CAAC;IAExD;;OAEG;IACH,IAAI,OAAO,IAAI,CAAC,CAAA;CACnB;AAED;;GAEG;AACH,8BAAsB,0BAA0B;IAC5C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IAErB,kBAAkB,UAAS;IAE3B,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB;;;;OAIG;IACH,qBAAqB,cAAqB;IAC1C;;OAEG;IACH,eAAe,cAAsB;IAErC;;OAEG;IACH,cAAc,cAAqB;IAEnC;;OAEG;IACH,wBAAwB,UAAM;IAE9B;;OAEG;IACH,WAAW,UAAM;IAEjB;;OAEG;IACH,4BAA4B,UAAO;IAEnC;;;OAGG;IACH,2BAA2B,UAAM;IAEjC;;OAEG;IACH,iBAAiB,IAAI,KAAK,EAAE;CAU/B;AAED,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,WAE/E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAYpH;AAGD;;GAEG;AACH,qBAAa,YAAY;IACrB;;;OAGG;IACH,KAAK,UAAS;IAEd;;;;OAIG;IACH,WAAW,YAAkB;IAE7B;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,cAAc;IAIvC;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,cAAc;IAIxC;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,cAAc;IAItC;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,cAAc;IAIvC,MAAM,CAAC,GAAG,EAAE,MAAM;IAIlB,SAAS,CAAC,GAAG,EAAE,MAAM;CAGxB;AAED,eAAO,MAAM,wBAAwB,kCAAyC,CAAC;AAE/E;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,eAAe;gBAC3C,MAAM,CAAC,EAAE,MAAM;IAQ3B,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE;;;;IAKxB,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI;CAG7D"}
|