proxy-facades 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/.name +1 -0
- package/.idea/modules.xml +8 -0
- package/.idea/proxy-facades.iml +8 -0
- package/.idea/vcs.xml +6 -0
- package/DEVELOPMENT.md +15 -0
- package/LICENSE +21 -0
- package/RecordedReadOnProxiedObjectExt.d.ts +22 -0
- package/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
- package/RecordedReadOnProxiedObjectExt.js +41 -0
- package/RecordedReadOnProxiedObjectExt.js.map +1 -0
- package/RecordedReadOnProxiedObjectExt.ts +41 -0
- package/Util.d.ts +85 -0
- package/Util.d.ts.map +1 -0
- package/Util.js +239 -0
- package/Util.js.map +1 -0
- package/Util.ts +254 -0
- package/class-trackers/Array.d.ts +93 -0
- package/class-trackers/Array.d.ts.map +1 -0
- package/class-trackers/Array.js +193 -0
- package/class-trackers/Array.js.map +1 -0
- package/class-trackers/Array.ts +245 -0
- package/class-trackers/Iterator.d.ts +38 -0
- package/class-trackers/Iterator.d.ts.map +1 -0
- package/class-trackers/Iterator.js +69 -0
- package/class-trackers/Iterator.js.map +1 -0
- package/class-trackers/Iterator.ts +73 -0
- package/class-trackers/Map.d.ts +128 -0
- package/class-trackers/Map.d.ts.map +1 -0
- package/class-trackers/Map.js +310 -0
- package/class-trackers/Map.js.map +1 -0
- package/class-trackers/Map.ts +403 -0
- package/class-trackers/Set.d.ts +85 -0
- package/class-trackers/Set.d.ts.map +1 -0
- package/class-trackers/Set.js +197 -0
- package/class-trackers/Set.js.map +1 -0
- package/class-trackers/Set.ts +245 -0
- package/class-trackers/index.d.ts +7 -0
- package/class-trackers/index.d.ts.map +1 -0
- package/class-trackers/index.js +36 -0
- package/class-trackers/index.js.map +1 -0
- package/class-trackers/index.ts +38 -0
- package/class-trackers/readme.md +2 -0
- package/common.d.ts +235 -0
- package/common.d.ts.map +1 -0
- package/common.js +378 -0
- package/common.js.map +1 -0
- package/common.ts +501 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
- package/dev_generateEsRuntimeBehaviourCheckerCode.ts +85 -0
- package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts +22 -0
- package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
- package/dist/mjs/RecordedReadOnProxiedObjectExt.js +37 -0
- package/dist/mjs/RecordedReadOnProxiedObjectExt.js.map +1 -0
- package/dist/mjs/Util.d.ts +85 -0
- package/dist/mjs/Util.d.ts.map +1 -0
- package/dist/mjs/Util.js +223 -0
- package/dist/mjs/Util.js.map +1 -0
- package/dist/mjs/class-trackers/Array.d.ts +93 -0
- package/dist/mjs/class-trackers/Array.d.ts.map +1 -0
- package/dist/mjs/class-trackers/Array.js +186 -0
- package/dist/mjs/class-trackers/Array.js.map +1 -0
- package/dist/mjs/class-trackers/Iterator.d.ts +38 -0
- package/dist/mjs/class-trackers/Iterator.d.ts.map +1 -0
- package/dist/mjs/class-trackers/Iterator.js +65 -0
- package/dist/mjs/class-trackers/Iterator.js.map +1 -0
- package/dist/mjs/class-trackers/Map.d.ts +128 -0
- package/dist/mjs/class-trackers/Map.d.ts.map +1 -0
- package/dist/mjs/class-trackers/Map.js +299 -0
- package/dist/mjs/class-trackers/Map.js.map +1 -0
- package/dist/mjs/class-trackers/Set.d.ts +85 -0
- package/dist/mjs/class-trackers/Set.d.ts.map +1 -0
- package/dist/mjs/class-trackers/Set.js +189 -0
- package/dist/mjs/class-trackers/Set.js.map +1 -0
- package/dist/mjs/class-trackers/index.d.ts +7 -0
- package/dist/mjs/class-trackers/index.d.ts.map +1 -0
- package/dist/mjs/class-trackers/index.js +32 -0
- package/dist/mjs/class-trackers/index.js.map +1 -0
- package/dist/mjs/common.d.ts +235 -0
- package/dist/mjs/common.d.ts.map +1 -0
- package/dist/mjs/common.js +361 -0
- package/dist/mjs/common.js.map +1 -0
- package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
- package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
- package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
- package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
- package/dist/mjs/index.d.ts +8 -0
- package/dist/mjs/index.d.ts.map +1 -0
- package/dist/mjs/index.js +8 -0
- package/dist/mjs/index.js.map +1 -0
- package/dist/mjs/objectChangeTracking.d.ts +43 -0
- package/dist/mjs/objectChangeTracking.d.ts.map +1 -0
- package/dist/mjs/objectChangeTracking.js +209 -0
- package/dist/mjs/objectChangeTracking.js.map +1 -0
- package/dist/mjs/origChangeTracking.d.ts +14 -0
- package/dist/mjs/origChangeTracking.d.ts.map +1 -0
- package/dist/mjs/origChangeTracking.js +58 -0
- package/dist/mjs/origChangeTracking.js.map +1 -0
- package/dist/mjs/proxyFacade.d.ts +45 -0
- package/dist/mjs/proxyFacade.d.ts.map +1 -0
- package/dist/mjs/proxyFacade.js +179 -0
- package/dist/mjs/proxyFacade.js.map +1 -0
- package/dist/mjs/watchedProxyFacade.d.ts +84 -0
- package/dist/mjs/watchedProxyFacade.d.ts.map +1 -0
- package/dist/mjs/watchedProxyFacade.js +300 -0
- package/dist/mjs/watchedProxyFacade.js.map +1 -0
- package/index.d.ts +8 -0
- package/index.d.ts.map +1 -0
- package/index.js +36 -0
- package/index.js.map +1 -0
- package/index.ts +7 -0
- package/index_esm.mjs +44 -0
- package/objectChangeTracking.d.ts +43 -0
- package/objectChangeTracking.d.ts.map +1 -0
- package/objectChangeTracking.js +214 -0
- package/objectChangeTracking.js.map +1 -0
- package/objectChangeTracking.ts +251 -0
- package/origChangeTracking.d.ts +14 -0
- package/origChangeTracking.d.ts.map +1 -0
- package/origChangeTracking.js +63 -0
- package/origChangeTracking.js.map +1 -0
- package/origChangeTracking.ts +72 -0
- package/package.json +52 -0
- package/proxyFacade.d.ts +45 -0
- package/proxyFacade.d.ts.map +1 -0
- package/proxyFacade.js +187 -0
- package/proxyFacade.js.map +1 -0
- package/proxyFacade.ts +222 -0
- package/readme.md +111 -0
- package/watchedProxyFacade.d.ts +84 -0
- package/watchedProxyFacade.d.ts.map +1 -0
- package/watchedProxyFacade.js +312 -0
- package/watchedProxyFacade.js.map +1 -0
- package/watchedProxyFacade.ts +369 -0
package/Util.ts
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import {Clazz} from "./common";
|
|
2
|
+
|
|
3
|
+
export function throwError(e: string | Error) {
|
|
4
|
+
if(e !== null && e instanceof Error) {
|
|
5
|
+
throw e;
|
|
6
|
+
}
|
|
7
|
+
throw new Error(e);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function reThrowWithHint(e: unknown, hint: string) {
|
|
11
|
+
try {
|
|
12
|
+
if(e instanceof Error) {
|
|
13
|
+
// Add hint to error:
|
|
14
|
+
e.message+= `\n${hint}`;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (x) {
|
|
18
|
+
}
|
|
19
|
+
throw e;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function isObject(value: unknown) {
|
|
23
|
+
return value !== null && typeof value === "object";
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A Map<K, Set<V>>. But automatically add a new Set if needed
|
|
28
|
+
*/
|
|
29
|
+
export class MapSet<K, V> {
|
|
30
|
+
map = new Map<K, Set<V>>()
|
|
31
|
+
|
|
32
|
+
add(key: K, value: V) {
|
|
33
|
+
let set = this.map.get(key);
|
|
34
|
+
if(set === undefined) {
|
|
35
|
+
set = new Set<V>();
|
|
36
|
+
this.map.set(key, set);
|
|
37
|
+
}
|
|
38
|
+
set.add(value);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
delete(key: K, value: V) {
|
|
42
|
+
let set = this.map.get(key);
|
|
43
|
+
if(set !== undefined) {
|
|
44
|
+
set.delete(value);
|
|
45
|
+
if(set.size === 0) {
|
|
46
|
+
this.map.delete(key); // Clean up
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get(key: K) {
|
|
52
|
+
return this.map.get(key);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @param key
|
|
57
|
+
* @return the set for the specified key (an empty one will be created if needed) on which you should call `add` or `delete` **immediately**, so no empty set is left there consuming memory.
|
|
58
|
+
* It is automatically cleaned up after the last delete
|
|
59
|
+
*/
|
|
60
|
+
get4use(key: K) {
|
|
61
|
+
const thisMapSet = this;
|
|
62
|
+
let set = this.map.get(key);
|
|
63
|
+
if(set === undefined) {
|
|
64
|
+
set = new class extends Set<V>{
|
|
65
|
+
delete(value: V): boolean {
|
|
66
|
+
const result = super.delete(value);
|
|
67
|
+
if(this.size === 0) {
|
|
68
|
+
thisMapSet.map.delete(key); // Clean up
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
add(value: V): this {
|
|
73
|
+
if(thisMapSet.map.get(key) !== this) {
|
|
74
|
+
throw new Error("This set is invalid. You must add/delete immediately after calling get4modify")
|
|
75
|
+
}
|
|
76
|
+
return super.add(value);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
this.map.set(key, set);
|
|
80
|
+
}
|
|
81
|
+
return set;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* This Map does not return empty values, so there's always a default value created
|
|
87
|
+
*/
|
|
88
|
+
export abstract class DefaultMap<K, V> extends Map<K,V>{
|
|
89
|
+
abstract createDefaultValue(): V;
|
|
90
|
+
|
|
91
|
+
get(key: K): V {
|
|
92
|
+
let result = super.get(key);
|
|
93
|
+
if(result === undefined) {
|
|
94
|
+
result = this.createDefaultValue();
|
|
95
|
+
this.set(key, result);
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
*
|
|
103
|
+
* @param createDefaultValueFn
|
|
104
|
+
* @returns a Map that creates and inserts a default value when that value does not exist. So the #get method always returns something.
|
|
105
|
+
*/
|
|
106
|
+
export function newDefaultMap<K,V>(createDefaultValueFn: () => V): DefaultMap<K, V> {
|
|
107
|
+
return new class extends DefaultMap<K, V> {
|
|
108
|
+
createDefaultValue(): V {
|
|
109
|
+
return createDefaultValueFn();
|
|
110
|
+
}
|
|
111
|
+
}()
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* A WeakMap<K, Set<V>>. But automatically add a new Set if needed
|
|
116
|
+
*/
|
|
117
|
+
export class WeakMapSet<K, V> extends MapSet<K, V> {
|
|
118
|
+
//@ts-ignore
|
|
119
|
+
map = new WeakMap<K, Set<V>>();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function arraysAreEqualsByPredicateFn<A, B>(a: A[], b: B[], equalsFn: (a: A,b: B) => boolean) {
|
|
123
|
+
if(a.length !== b.length) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
for(const k in a) {
|
|
127
|
+
if(!equalsFn(a[k], b[k])) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
export type PromiseState<T> = {state: "pending", promise: Promise<T>} | {state: "resolved", resolvedValue: T} | {state: "rejected", rejectReason: any};
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
type VisitReplaceContext = {
|
|
137
|
+
/**
|
|
138
|
+
* Not safely escaped. Should be used for diag only !
|
|
139
|
+
*/
|
|
140
|
+
diagnosis_path?: string
|
|
141
|
+
|
|
142
|
+
parentObject?: object
|
|
143
|
+
key?: unknown
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function diagnosis_jsonPath(key: unknown) {
|
|
147
|
+
if(!Number.isNaN(Number(key))) {
|
|
148
|
+
return `[${key}]`;
|
|
149
|
+
}
|
|
150
|
+
return `.${key}`;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Usage:
|
|
155
|
+
* <pre><code>
|
|
156
|
+
* const result = visitReplace(target, (value, visitChilds, context) => {
|
|
157
|
+
* return value === 'needle' ? 'replaced' : visitChilds(value, context)
|
|
158
|
+
* });
|
|
159
|
+
* </code></pre>
|
|
160
|
+
*
|
|
161
|
+
* @param value
|
|
162
|
+
* @param visitor
|
|
163
|
+
* @param trackPath whether to pass on the context object. This hurts performance because the path is concatted every time, so use it only when needed. Setting this to "onError" re-executes the visitprelace with the concetxt when an error was thrown
|
|
164
|
+
*/
|
|
165
|
+
export function visitReplace<O>(value: O, visitor: (value: unknown, visitChilds: (value: unknown, context: VisitReplaceContext) => unknown, context: VisitReplaceContext) => unknown , trackPath: boolean | "onError" = false): O {
|
|
166
|
+
const visisitedObjects = new Set<object>()
|
|
167
|
+
|
|
168
|
+
function visitChilds(value: unknown, context: VisitReplaceContext) {
|
|
169
|
+
if(value === null) {
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
else if(typeof value === "object") {
|
|
173
|
+
const obj = value as object;
|
|
174
|
+
if(visisitedObjects.has(obj)) {
|
|
175
|
+
return value; // don't iterate again
|
|
176
|
+
}
|
|
177
|
+
visisitedObjects.add(obj);
|
|
178
|
+
|
|
179
|
+
for (let k in obj) {
|
|
180
|
+
const keyInParent = k as keyof object;
|
|
181
|
+
const childValue = obj[keyInParent];
|
|
182
|
+
let newValue = visitor(childValue, visitChilds, {...context, parentObject: value, key: keyInParent, diagnosis_path: (context.diagnosis_path !== undefined?`${context.diagnosis_path!}${diagnosis_jsonPath(keyInParent)}`:undefined)});
|
|
183
|
+
if(newValue !== childValue) { // Only if childValue really has changed. We don't want to interfer with setting a readonly property and trigger a proxy
|
|
184
|
+
// @ts-ignore
|
|
185
|
+
obj[keyInParent] = newValue;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return value;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if(trackPath === "onError") {
|
|
193
|
+
try {
|
|
194
|
+
return visitor(value, visitChilds, {}) as O; // Fast try without context
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
return visitReplace(value, visitor, true); // Try again with context
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return visitor(value, visitChilds,{diagnosis_path: trackPath?"":undefined}) as O;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Just do something the runtime can't optimize away
|
|
206
|
+
* @param value
|
|
207
|
+
*/
|
|
208
|
+
export function read(value: any) {
|
|
209
|
+
if( ("" + value) == "blaaxyxzzzsdf" ) {
|
|
210
|
+
throw new Error("should never get here")
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export function arraysAreShallowlyEqual(a: unknown[], b: unknown[]) {
|
|
215
|
+
if(a.length !== b.length) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
for(let i = 0;i<a.length;i++) {
|
|
219
|
+
if(a[i] !== b[i]) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Like arraysAreShallowlyEqual but this time for an array of entries (tuple of 2 values) like from Map#entries()
|
|
228
|
+
* @param a
|
|
229
|
+
* @param b
|
|
230
|
+
*/
|
|
231
|
+
export function arraysWithEntriesAreShallowlyEqual(a: Array<[unknown, unknown]>, b: Array<[unknown, unknown]>) {
|
|
232
|
+
if(a.length !== b.length) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
for(let i = 0;i<a.length;i++) {
|
|
236
|
+
if(a[i][0] !== b[i][0]) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
if(a[i][1] !== b[i][1]) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
export function classIsSubclassOf(clazz: Clazz, superClass: Clazz) {
|
|
248
|
+
do {
|
|
249
|
+
if(clazz === superClass) {
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
} while((clazz = clazz.prototype?.prototype?.constructor) !== undefined);
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { DualUseTracker, ForWatchedProxyHandler, IWatchedProxyHandler_common, ObjKey, RecordedRead } from "../common";
|
|
2
|
+
import { WatchedProxyHandler } from "../watchedProxyFacade";
|
|
3
|
+
import { RecordedReadOnProxiedObjectExt } from "../RecordedReadOnProxiedObjectExt";
|
|
4
|
+
/**
|
|
5
|
+
* Listeners for one array.
|
|
6
|
+
* 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.
|
|
7
|
+
* {@link ObjectChangeHooks} are also subscribed on Arrays
|
|
8
|
+
*/
|
|
9
|
+
declare class ArrayChangeHooks {
|
|
10
|
+
}
|
|
11
|
+
export declare const changeHooksForArray: WeakMap<unknown[], ArrayChangeHooks>;
|
|
12
|
+
export declare function getChangeHooksForArray(array: unknown[]): ArrayChangeHooks;
|
|
13
|
+
/**
|
|
14
|
+
* Can be either used as a supervisor-class in a WatchedProxyHandler, or installed on the non-proxied object via Object.setPrototypeOf
|
|
15
|
+
* The "this" may be different in these cases.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ArrayChangeTracker<T> extends Array<T> implements DualUseTracker<Array<T>> {
|
|
18
|
+
get _watchedProxyHandler(): IWatchedProxyHandler_common | undefined;
|
|
19
|
+
protected _withUnspecificChange<R>(changeFn: () => R): R;
|
|
20
|
+
pop(...args: any[]): T | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Will return the original object when this class is used as supervisor class in the WatchedProxyHandler
|
|
23
|
+
*/
|
|
24
|
+
get _target(): Array<T>;
|
|
25
|
+
/**
|
|
26
|
+
* Pretend that this is an array
|
|
27
|
+
*/
|
|
28
|
+
get ["constructor"](): ArrayConstructor;
|
|
29
|
+
shift(...args: any[]): T | undefined;
|
|
30
|
+
sort(...args: any[]): Array<T>;
|
|
31
|
+
fill(...args: any[]): Array<T>;
|
|
32
|
+
}
|
|
33
|
+
export declare class RecordedArrayValuesRead extends RecordedReadOnProxiedObjectExt {
|
|
34
|
+
values: unknown[];
|
|
35
|
+
protected get origObj(): unknown[];
|
|
36
|
+
constructor(values: unknown[]);
|
|
37
|
+
getAffectingChangeHooks(target: this["obj"]): import("../common").EventHook[];
|
|
38
|
+
equals(other: RecordedRead): boolean;
|
|
39
|
+
get isChanged(): boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Patches methods / accessors
|
|
43
|
+
*/
|
|
44
|
+
export declare class ArrayReadTracker<T> extends Array<T> implements ForWatchedProxyHandler<Array<T>> {
|
|
45
|
+
get _watchedProxyHandler(): WatchedProxyHandler;
|
|
46
|
+
get _target(): Array<T>;
|
|
47
|
+
protected _fireAfterValuesRead(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Pretend that this is an array
|
|
50
|
+
*/
|
|
51
|
+
get ["constructor"](): ArrayConstructor;
|
|
52
|
+
values(): ArrayIterator<T>;
|
|
53
|
+
entries(): ArrayIterator<[number, T]>;
|
|
54
|
+
[Symbol.iterator](): ArrayIterator<T>;
|
|
55
|
+
get length(): number;
|
|
56
|
+
shift(...args: any[]): T | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Keep this method so it it treated as handled and not as making-unspecific-reads
|
|
59
|
+
* @param args
|
|
60
|
+
*/
|
|
61
|
+
forEach(...args: any[]): void;
|
|
62
|
+
pop(...args: any[]): T | undefined;
|
|
63
|
+
}
|
|
64
|
+
export declare const config: {
|
|
65
|
+
clazz: ArrayConstructor;
|
|
66
|
+
readTracker: typeof ArrayReadTracker;
|
|
67
|
+
changeTracker: typeof ArrayChangeTracker;
|
|
68
|
+
/**
|
|
69
|
+
* Built-in Methods, which are using fields / calling methods on the proxy transparently/loyally, so those methods don't call/use internal stuff directly.
|
|
70
|
+
* Tested with, see dev_generateEsRuntimeBehaviourCheckerCode.ts
|
|
71
|
+
* May include read-only / reader methods
|
|
72
|
+
*/
|
|
73
|
+
knownHighLevelMethods: Set<ObjKey>;
|
|
74
|
+
/**
|
|
75
|
+
* Non-high level. These fire `RecordedUnspecificRead`s then. So better implement them instead to fire i.e RecordedArrayValuesRead.
|
|
76
|
+
*/
|
|
77
|
+
readOnlyMethods: Set<ObjKey>;
|
|
78
|
+
/**
|
|
79
|
+
* Non-high level. Same as above: better implement them
|
|
80
|
+
*/
|
|
81
|
+
readOnlyFields: Set<ObjKey>;
|
|
82
|
+
/**
|
|
83
|
+
*
|
|
84
|
+
*/
|
|
85
|
+
receiverMustBeNonProxied: boolean;
|
|
86
|
+
trackSettingObjectProperties: boolean;
|
|
87
|
+
worksForSubclasses: boolean;
|
|
88
|
+
trackTreads: boolean;
|
|
89
|
+
proxyUnhandledMethodResults: boolean;
|
|
90
|
+
getTrackerClasses(): import("../common").Clazz[];
|
|
91
|
+
};
|
|
92
|
+
export {};
|
|
93
|
+
//# sourceMappingURL=Array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Array.d.ts","sourceRoot":"","sources":["Array.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,cAAc,EACd,sBAAsB,EAAE,2BAA2B,EACnD,MAAM,EACN,YAAY,EAEf,MAAM,WAAW,CAAC;AAOnB,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAC,8BAA8B,EAAC,MAAM,mCAAmC,CAAC;AAGjF;;;;GAIG;AACH,cAAM,gBAAgB;CAErB;AAED,eAAO,MAAM,mBAAmB,sCAA6C,CAAC;AAC9E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,oBAMtD;AAED;;;GAGG;AACH,qBAAa,kBAAkB,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAE,YAAW,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAKnF,IAAI,oBAAoB,IAAI,2BAA2B,GAAG,SAAS,CAElE;IAED,SAAS,CAAC,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;IAMxD,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAIlB;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAEtB;IAED;;OAEG;IACH,IAAI,CAAC,aAAa,CAAC,qBAElB;IAED,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS;IAKpC,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IAM9B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;CAIjC;AAED,qBAAa,uBAAwB,SAAQ,8BAA8B;IACvE,MAAM,EAAE,OAAO,EAAE,CAAC;IAElB,SAAS,KAAK,OAAO,IACE,OAAO,EAAE,CAC/B;gBAGW,MAAM,EAAE,OAAO,EAAE;IAK7B,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;IAQ3C,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;IAQpC,IAAI,SAAS,IAAI,OAAO,CAEvB;CAGJ;AAED;;GAEG;AACH,qBAAa,gBAAgB,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAE,YAAW,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzF,IAAI,oBAAoB,IAAI,mBAAmB,CAE9C;IAED,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAEtB;IAED,SAAS,CAAC,oBAAoB;IAK9B;;OAEG;IACH,IAAI,CAAC,aAAa,CAAC,qBAElB;IAED,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC;IAM1B,OAAO,IAAI,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAMrC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;IAMrC,IAAI,MAAM,IAAI,MAAM,CAInB;IAGD,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAcpB;;;OAGG;IACH,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAOtB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS;CAcrC;AAED,eAAO,MAAM,MAAM;;;;IAIf;;;;OAIG;2BAC+T,GAAG,CAAC,MAAM,CAAC;IAE7U;;OAEG;qBAC0J,GAAG,CAAC,MAAM,CAAC;IAExK;;OAEG;oBACqE,GAAG,CAAC,MAAM,CAAC;IAEnF;;OAEG;;;;;;;CAIN,CAAA"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = exports.ArrayReadTracker = exports.RecordedArrayValuesRead = exports.ArrayChangeTracker = exports.changeHooksForArray = void 0;
|
|
4
|
+
exports.getChangeHooksForArray = getChangeHooksForArray;
|
|
5
|
+
const common_1 = require("../common");
|
|
6
|
+
const Util_1 = require("../Util");
|
|
7
|
+
const objectChangeTracking_1 = require("../objectChangeTracking");
|
|
8
|
+
const RecordedReadOnProxiedObjectExt_1 = require("../RecordedReadOnProxiedObjectExt");
|
|
9
|
+
/**
|
|
10
|
+
* Listeners for one array.
|
|
11
|
+
* 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.
|
|
12
|
+
* {@link ObjectChangeHooks} are also subscribed on Arrays
|
|
13
|
+
*/
|
|
14
|
+
class ArrayChangeHooks {
|
|
15
|
+
}
|
|
16
|
+
exports.changeHooksForArray = new WeakMap();
|
|
17
|
+
function getChangeHooksForArray(array) {
|
|
18
|
+
let result = exports.changeHooksForArray.get(array);
|
|
19
|
+
if (result === undefined) {
|
|
20
|
+
exports.changeHooksForArray.set(array, result = new ArrayChangeHooks());
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Can be either used as a supervisor-class in a WatchedProxyHandler, or installed on the non-proxied object via Object.setPrototypeOf
|
|
26
|
+
* The "this" may be different in these cases.
|
|
27
|
+
*/
|
|
28
|
+
class ArrayChangeTracker extends Array {
|
|
29
|
+
// TODO: In the future, implement more fine granular change listeners that act on change of a certain index.
|
|
30
|
+
get _watchedProxyHandler() {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
_withUnspecificChange(changeFn) {
|
|
34
|
+
return (0, common_1.runChangeOperation)(this, new common_1.UnspecificObjectChange(this), [(0, objectChangeTracking_1.getChangeHooksForObject)(this).unspecificChange], changeFn);
|
|
35
|
+
}
|
|
36
|
+
//push(...items: any[]): number //already calls set
|
|
37
|
+
pop(...args) {
|
|
38
|
+
return this._withUnspecificChange(() => super.pop());
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Will return the original object when this class is used as supervisor class in the WatchedProxyHandler
|
|
42
|
+
*/
|
|
43
|
+
get _target() {
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Pretend that this is an array
|
|
48
|
+
*/
|
|
49
|
+
get ["constructor"]() {
|
|
50
|
+
return Array;
|
|
51
|
+
}
|
|
52
|
+
shift(...args) {
|
|
53
|
+
return this._withUnspecificChange(() => super.shift());
|
|
54
|
+
}
|
|
55
|
+
//@ts-ignore
|
|
56
|
+
sort(...args) {
|
|
57
|
+
return this._withUnspecificChange(() => super.sort());
|
|
58
|
+
}
|
|
59
|
+
//@ts-ignore
|
|
60
|
+
fill(...args) {
|
|
61
|
+
return this._withUnspecificChange(() => super.fill(...args));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.ArrayChangeTracker = ArrayChangeTracker;
|
|
65
|
+
class RecordedArrayValuesRead extends RecordedReadOnProxiedObjectExt_1.RecordedReadOnProxiedObjectExt {
|
|
66
|
+
get origObj() {
|
|
67
|
+
return this.obj;
|
|
68
|
+
}
|
|
69
|
+
constructor(values) {
|
|
70
|
+
super();
|
|
71
|
+
this.values = values;
|
|
72
|
+
}
|
|
73
|
+
getAffectingChangeHooks(target) {
|
|
74
|
+
return [
|
|
75
|
+
(0, objectChangeTracking_1.getChangeHooksForObject)(target).changeOwnKeys,
|
|
76
|
+
(0, objectChangeTracking_1.getChangeHooksForObject)(target).changeAnyProperty,
|
|
77
|
+
(0, objectChangeTracking_1.getChangeHooksForObject)(target).unspecificChange,
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
equals(other) {
|
|
81
|
+
if (!(other instanceof RecordedArrayValuesRead)) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return this.proxyHandler === other.proxyHandler && this.obj === other.obj && (0, Util_1.arraysAreShallowlyEqual)(this.values, other.values);
|
|
85
|
+
}
|
|
86
|
+
get isChanged() {
|
|
87
|
+
return !(0, Util_1.arraysAreShallowlyEqual)(this.values, this.origObj);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.RecordedArrayValuesRead = RecordedArrayValuesRead;
|
|
91
|
+
/**
|
|
92
|
+
* Patches methods / accessors
|
|
93
|
+
*/
|
|
94
|
+
class ArrayReadTracker extends Array {
|
|
95
|
+
get _watchedProxyHandler() {
|
|
96
|
+
throw new Error("not calling from inside a WatchedProxyHandler"); // Will return the handler when called through the handler
|
|
97
|
+
}
|
|
98
|
+
get _target() {
|
|
99
|
+
throw new Error("not calling from inside a WatchedProxyHandler"); // Will return the value when called through the handler
|
|
100
|
+
}
|
|
101
|
+
_fireAfterValuesRead() {
|
|
102
|
+
var _a;
|
|
103
|
+
let recordedArrayValuesRead = new RecordedArrayValuesRead([...this._target]);
|
|
104
|
+
(_a = this._watchedProxyHandler) === null || _a === void 0 ? void 0 : _a.fireAfterRead(recordedArrayValuesRead);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Pretend that this is an array
|
|
108
|
+
*/
|
|
109
|
+
get ["constructor"]() {
|
|
110
|
+
return Array;
|
|
111
|
+
}
|
|
112
|
+
values() {
|
|
113
|
+
const result = this._target.values();
|
|
114
|
+
this._fireAfterValuesRead();
|
|
115
|
+
return (0, common_1.makeIteratorTranslateValue)(result, (value) => this._watchedProxyHandler.getFacade().getProxyFor(value));
|
|
116
|
+
}
|
|
117
|
+
entries() {
|
|
118
|
+
const result = this._target.entries();
|
|
119
|
+
this._fireAfterValuesRead();
|
|
120
|
+
return (0, common_1.makeIteratorTranslateValue)(result, ([index, value]) => [index, this._watchedProxyHandler.getFacade().getProxyFor(value)]);
|
|
121
|
+
}
|
|
122
|
+
[Symbol.iterator]() {
|
|
123
|
+
const result = this._target[Symbol.iterator]();
|
|
124
|
+
this._fireAfterValuesRead();
|
|
125
|
+
return (0, common_1.makeIteratorTranslateValue)(result, (value) => this._watchedProxyHandler.getFacade().getProxyFor(value));
|
|
126
|
+
}
|
|
127
|
+
get length() {
|
|
128
|
+
const result = this._target.length;
|
|
129
|
+
this._fireAfterValuesRead();
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
//@ts-ignore
|
|
133
|
+
shift(...args) {
|
|
134
|
+
if (this.length == 0) {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
return (0, common_1.runChangeOperation)(this, new common_1.UnspecificObjectChange(this), [(0, objectChangeTracking_1.getChangeHooksForObject)(this).changeOwnKeys, (0, objectChangeTracking_1.getChangeHooksForObject)(this).unspecificChange], () => {
|
|
138
|
+
//@ts-ignore
|
|
139
|
+
const result = super.shift(...args);
|
|
140
|
+
this._fireAfterValuesRead();
|
|
141
|
+
return result;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Keep this method so it it treated as handled and not as making-unspecific-reads
|
|
146
|
+
* @param args
|
|
147
|
+
*/
|
|
148
|
+
forEach(...args) {
|
|
149
|
+
//@ts-ignore
|
|
150
|
+
return super.forEach(...args); //reads "length" an thererfore triggers the read
|
|
151
|
+
}
|
|
152
|
+
//@ts-ignore
|
|
153
|
+
pop(...args) {
|
|
154
|
+
if (this.length == 0) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
return (0, common_1.runChangeOperation)(this, new common_1.UnspecificObjectChange(this), [(0, objectChangeTracking_1.getChangeHooksForObject)(this).changeOwnKeys, (0, objectChangeTracking_1.getChangeHooksForObject)(this).unspecificChange], () => {
|
|
158
|
+
//@ts-ignore
|
|
159
|
+
const result = super.pop(...args);
|
|
160
|
+
this._fireAfterValuesRead();
|
|
161
|
+
return result;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
exports.ArrayReadTracker = ArrayReadTracker;
|
|
166
|
+
exports.config = new class extends common_1.ClassTrackingConfiguration {
|
|
167
|
+
constructor() {
|
|
168
|
+
super(...arguments);
|
|
169
|
+
this.clazz = Array;
|
|
170
|
+
this.readTracker = ArrayReadTracker;
|
|
171
|
+
this.changeTracker = ArrayChangeTracker;
|
|
172
|
+
/**
|
|
173
|
+
* Built-in Methods, which are using fields / calling methods on the proxy transparently/loyally, so those methods don't call/use internal stuff directly.
|
|
174
|
+
* Tested with, see dev_generateEsRuntimeBehaviourCheckerCode.ts
|
|
175
|
+
* May include read-only / reader methods
|
|
176
|
+
*/
|
|
177
|
+
this.knownHighLevelMethods = new Set(["at", "concat", "map", "forEach", "join", "slice", "some", "filter", "find", "every", "findIndex", "includes", "indexOf", Symbol.iterator, "lastIndexOf", "push", "reduce", "reduceRight", "toLocaleString", "toString", "unshift", "splice", "copyWithin", "reverse"]);
|
|
178
|
+
/**
|
|
179
|
+
* Non-high level. These fire `RecordedUnspecificRead`s then. So better implement them instead to fire i.e RecordedArrayValuesRead.
|
|
180
|
+
*/
|
|
181
|
+
this.readOnlyMethods = new Set(["keys" /* TODO: Implement .keys, mind, that it is different to RecordedOwnKeysRead which allows gaps*/]);
|
|
182
|
+
/**
|
|
183
|
+
* Non-high level. Same as above: better implement them
|
|
184
|
+
*/
|
|
185
|
+
this.readOnlyFields = new Set([Symbol.unscopables]);
|
|
186
|
+
/**
|
|
187
|
+
*
|
|
188
|
+
*/
|
|
189
|
+
this.receiverMustBeNonProxied = false;
|
|
190
|
+
this.trackSettingObjectProperties = true;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=Array.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Array.js","sourceRoot":"","sources":["Array.ts"],"names":[],"mappings":"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"}
|