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,85 @@
|
|
|
1
|
+
// **** See the function common.ts#checkEsRuntimeBehaviour ***
|
|
2
|
+
|
|
3
|
+
// Array:
|
|
4
|
+
outputExpecterCode(["a"], (v) => v.at(0))
|
|
5
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.concat("d","e","f"));
|
|
6
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.map(x => read(x)));
|
|
7
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.forEach(x => read(x)));
|
|
8
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.join(","));
|
|
9
|
+
//outputExpecterCode(["a", "b", "c"], (v) => v.keys());
|
|
10
|
+
//outputExpecterCode(["a", "b", "c"], (v) => v.values());
|
|
11
|
+
outputExpecterCode(["a", "b", "c","d"], (v) => v.slice(1,3));
|
|
12
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.some( x => x ==="a"));
|
|
13
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.filter(x => x === "a"));
|
|
14
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.find(x => x === "a"));
|
|
15
|
+
//outputExpecterCode(["a", "b", "c"], (v) => v.entries());
|
|
16
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.every(x => x ==="a"));
|
|
17
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.findIndex(x => x ==="a"));
|
|
18
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.includes("b",1));
|
|
19
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.indexOf("b", 1));
|
|
20
|
+
outputExpecterCode(["a","b","c"], (v) => v[Symbol.iterator]().next());
|
|
21
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.lastIndexOf("b", 1));
|
|
22
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.reduce((p, c ) => p + c));
|
|
23
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.reduceRight((p, c) => p + c));
|
|
24
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.toLocaleString());
|
|
25
|
+
outputExpecterCode(["a", "b", "b"], (v) => v.toString());
|
|
26
|
+
outputExpecterCode(["a", "b", "c"], (v) => v.unshift("_a","_b"));
|
|
27
|
+
outputExpecterCode(["a", "b", "c","d"], v => v.splice(1,2, "newB", "newC", "newX"))
|
|
28
|
+
outputExpecterCode(["a", "b", "c","d"], v => v.copyWithin(3, 1,3))
|
|
29
|
+
outputExpecterCode(["a", "b", "c","d"], v => v.reverse());
|
|
30
|
+
|
|
31
|
+
// Iterator
|
|
32
|
+
console.log("if([].values().forEach) { // Runtime supports these iterator functions like forEach, filter, .... ")
|
|
33
|
+
outputExpecterCode(() => ["a", "b", "c"][Symbol.iterator](), it => it.forEach(x => x))
|
|
34
|
+
outputExpecterCode(() => ["a", "b", "c"][Symbol.iterator](), it => it.filter(x => x === "b"))
|
|
35
|
+
outputExpecterCode(() => ["a", "b", "c"][Symbol.iterator](), it => it.take(2));
|
|
36
|
+
outputExpecterCode(() => ["a", "b", "c"][Symbol.iterator](), it => it.toArray());
|
|
37
|
+
console.log("}")
|
|
38
|
+
|
|
39
|
+
// Set:
|
|
40
|
+
//outputExpecterCode(new Set<string>(["a","b","c"]), v => v.forEach(i => read(i))) // TypeError: Method Set.prototype.forEach called on incompatible receiver #<Set>
|
|
41
|
+
//outputExpecterCode(new Set<string>(["a","b","c"]), v => v.intersection(new Set<string>(["b","c","e"]))) // TypeError: Method Set.prototype.intersection called on incompatible receiver #<Set>
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
*
|
|
47
|
+
*/
|
|
48
|
+
function outputExpecterCode<T extends object>(orig: T | (() => T), fn: (proxy: T) => void ) {
|
|
49
|
+
let origJS = JSON.stringify(orig);
|
|
50
|
+
if(typeof orig === "function") {
|
|
51
|
+
origJS = orig.toString().replace(/\s+/g," ").replace(/^\(\)=>/,"").toString()
|
|
52
|
+
orig = orig();
|
|
53
|
+
}
|
|
54
|
+
const usedFields = new Set<string | symbol>();
|
|
55
|
+
const proxy = new Proxy(orig, {
|
|
56
|
+
get(target: T, p: string | symbol, receiver: any): any {
|
|
57
|
+
usedFields.add(p)
|
|
58
|
+
|
|
59
|
+
if(p === "next") {
|
|
60
|
+
//@ts-ignore
|
|
61
|
+
return (...args: unknown[]) => target.next(...args); // .next() method must run on target, not on proxy
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
//@ts-ignore
|
|
65
|
+
return target[p];
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
read(fn(proxy));
|
|
69
|
+
console.log(`expectUsingMethodsOrFields(${origJS}, ${fnToString(fn)}, [${[...usedFields.values()].map(f => typeof f === "string"?`"${f}"`:`${f.toString().replace(/(^Symbol\()|(\)$)/g,"")}`). join(",")}])`)
|
|
70
|
+
|
|
71
|
+
function fnToString(fn: (...args: any[]) => unknown) {
|
|
72
|
+
return fn.toString().replace(/\s+/g," ").toString();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Just do something the runtime can't optimize away
|
|
78
|
+
* @param value
|
|
79
|
+
*/
|
|
80
|
+
function read(value: any) {
|
|
81
|
+
if( ("" + value) == "blaaxyxzzzsdf" ) {
|
|
82
|
+
throw new Error("should never get here")
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EventHook, RecordedReadOnProxiedObject } from "./common";
|
|
2
|
+
/**
|
|
3
|
+
* Offers a more convenient method: getAffectingChangeHooks
|
|
4
|
+
*/
|
|
5
|
+
export declare abstract class RecordedReadOnProxiedObjectExt extends RecordedReadOnProxiedObject {
|
|
6
|
+
/**
|
|
7
|
+
* @param listener
|
|
8
|
+
* @param trackOriginal
|
|
9
|
+
*/
|
|
10
|
+
onAfterChange(listener: () => void, trackOriginal?: boolean): void;
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
offAfterChange(listener: () => void): void;
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
* @param target The target for which... This method might be called for multiple targets from different watchedproxyfacade layers or at last layer for the original unproxied object
|
|
18
|
+
* @returns the sets where to add/remove listeners by the onChange/offChange methods
|
|
19
|
+
*/
|
|
20
|
+
getAffectingChangeHooks(target: object): EventHook[];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=RecordedReadOnProxiedObjectExt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordedReadOnProxiedObjectExt.d.ts","sourceRoot":"","sources":["../../RecordedReadOnProxiedObjectExt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAE,2BAA2B,EAAC,MAAM,UAAU,CAAC;AAKhF;;GAEG;AACH,8BAAsB,8BAA+B,SAAQ,2BAA2B;IAEpF;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,aAAa,UAAQ;IAUzD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI;IAKnC;;;;OAIG;IACH,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;CAGvD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { RecordedReadOnProxiedObject } from "./common";
|
|
2
|
+
import { installChangeTracker } from "./origChangeTracking";
|
|
3
|
+
import { isProxyForAFacade } from "./proxyFacade";
|
|
4
|
+
/**
|
|
5
|
+
* Offers a more convenient method: getAffectingChangeHooks
|
|
6
|
+
*/
|
|
7
|
+
export class RecordedReadOnProxiedObjectExt extends RecordedReadOnProxiedObject {
|
|
8
|
+
/**
|
|
9
|
+
* @param listener
|
|
10
|
+
* @param trackOriginal
|
|
11
|
+
*/
|
|
12
|
+
onAfterChange(listener, trackOriginal = false) {
|
|
13
|
+
this.getAffectingChangeHooks(this.proxyHandler.proxy).forEach(eventHook => eventHook.afterListeners.add(listener));
|
|
14
|
+
if (trackOriginal) {
|
|
15
|
+
if (!isProxyForAFacade(this.obj)) {
|
|
16
|
+
installChangeTracker(this.obj);
|
|
17
|
+
}
|
|
18
|
+
this.getAffectingChangeHooks(this.obj).forEach(eventHook => eventHook.afterListeners.add(listener));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
offAfterChange(listener) {
|
|
25
|
+
this.getAffectingChangeHooks(this.obj).forEach(eventHook => eventHook.afterListeners.delete(listener));
|
|
26
|
+
this.getAffectingChangeHooks(this.proxyHandler.proxy).forEach(eventHook => eventHook.afterListeners.delete(listener));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @param target The target for which... This method might be called for multiple targets from different watchedproxyfacade layers or at last layer for the original unproxied object
|
|
31
|
+
* @returns the sets where to add/remove listeners by the onChange/offChange methods
|
|
32
|
+
*/
|
|
33
|
+
getAffectingChangeHooks(target) {
|
|
34
|
+
throw new Error("TODO");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=RecordedReadOnProxiedObjectExt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordedReadOnProxiedObjectExt.js","sourceRoot":"","sources":["../../RecordedReadOnProxiedObjectExt.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,2BAA2B,EAAC,MAAM,UAAU,CAAC;AAChF,OAAO,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAGhD;;GAEG;AACH,MAAM,OAAgB,8BAA+B,SAAQ,2BAA2B;IAEpF;;;OAGG;IACH,aAAa,CAAC,QAAoB,EAAE,aAAa,GAAG,KAAK;QACrD,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnH,IAAI,aAAa,EAAE,CAAC;YAChB,IAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxG,CAAC;IACL,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAoB;QAC/B,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1H,CAAC;IAED;;;;OAIG;IACH,uBAAuB,CAAC,MAAc;QAClC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;CACJ"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Clazz } from "./common";
|
|
2
|
+
export declare function throwError(e: string | Error): void;
|
|
3
|
+
export declare function reThrowWithHint(e: unknown, hint: string): void;
|
|
4
|
+
export declare function isObject(value: unknown): value is object;
|
|
5
|
+
/**
|
|
6
|
+
* A Map<K, Set<V>>. But automatically add a new Set if needed
|
|
7
|
+
*/
|
|
8
|
+
export declare class MapSet<K, V> {
|
|
9
|
+
map: Map<K, Set<V>>;
|
|
10
|
+
add(key: K, value: V): void;
|
|
11
|
+
delete(key: K, value: V): void;
|
|
12
|
+
get(key: K): Set<V> | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* @param key
|
|
15
|
+
* @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.
|
|
16
|
+
* It is automatically cleaned up after the last delete
|
|
17
|
+
*/
|
|
18
|
+
get4use(key: K): Set<V>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* This Map does not return empty values, so there's always a default value created
|
|
22
|
+
*/
|
|
23
|
+
export declare abstract class DefaultMap<K, V> extends Map<K, V> {
|
|
24
|
+
abstract createDefaultValue(): V;
|
|
25
|
+
get(key: K): V;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* @param createDefaultValueFn
|
|
30
|
+
* @returns a Map that creates and inserts a default value when that value does not exist. So the #get method always returns something.
|
|
31
|
+
*/
|
|
32
|
+
export declare function newDefaultMap<K, V>(createDefaultValueFn: () => V): DefaultMap<K, V>;
|
|
33
|
+
/**
|
|
34
|
+
* A WeakMap<K, Set<V>>. But automatically add a new Set if needed
|
|
35
|
+
*/
|
|
36
|
+
export declare class WeakMapSet<K, V> extends MapSet<K, V> {
|
|
37
|
+
map: WeakMap<K, Set<V>>;
|
|
38
|
+
}
|
|
39
|
+
export declare function arraysAreEqualsByPredicateFn<A, B>(a: A[], b: B[], equalsFn: (a: A, b: B) => boolean): boolean;
|
|
40
|
+
export type PromiseState<T> = {
|
|
41
|
+
state: "pending";
|
|
42
|
+
promise: Promise<T>;
|
|
43
|
+
} | {
|
|
44
|
+
state: "resolved";
|
|
45
|
+
resolvedValue: T;
|
|
46
|
+
} | {
|
|
47
|
+
state: "rejected";
|
|
48
|
+
rejectReason: any;
|
|
49
|
+
};
|
|
50
|
+
type VisitReplaceContext = {
|
|
51
|
+
/**
|
|
52
|
+
* Not safely escaped. Should be used for diag only !
|
|
53
|
+
*/
|
|
54
|
+
diagnosis_path?: string;
|
|
55
|
+
parentObject?: object;
|
|
56
|
+
key?: unknown;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Usage:
|
|
60
|
+
* <pre><code>
|
|
61
|
+
* const result = visitReplace(target, (value, visitChilds, context) => {
|
|
62
|
+
* return value === 'needle' ? 'replaced' : visitChilds(value, context)
|
|
63
|
+
* });
|
|
64
|
+
* </code></pre>
|
|
65
|
+
*
|
|
66
|
+
* @param value
|
|
67
|
+
* @param visitor
|
|
68
|
+
* @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
|
|
69
|
+
*/
|
|
70
|
+
export declare function visitReplace<O>(value: O, visitor: (value: unknown, visitChilds: (value: unknown, context: VisitReplaceContext) => unknown, context: VisitReplaceContext) => unknown, trackPath?: boolean | "onError"): O;
|
|
71
|
+
/**
|
|
72
|
+
* Just do something the runtime can't optimize away
|
|
73
|
+
* @param value
|
|
74
|
+
*/
|
|
75
|
+
export declare function read(value: any): void;
|
|
76
|
+
export declare function arraysAreShallowlyEqual(a: unknown[], b: unknown[]): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Like arraysAreShallowlyEqual but this time for an array of entries (tuple of 2 values) like from Map#entries()
|
|
79
|
+
* @param a
|
|
80
|
+
* @param b
|
|
81
|
+
*/
|
|
82
|
+
export declare function arraysWithEntriesAreShallowlyEqual(a: Array<[unknown, unknown]>, b: Array<[unknown, unknown]>): boolean;
|
|
83
|
+
export declare function classIsSubclassOf(clazz: Clazz, superClass: Clazz): boolean;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=Util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Util.d.ts","sourceRoot":"","sources":["../../Util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,UAAU,CAAC;AAE/B,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,QAK3C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAUvD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,mBAEtC;AAED;;GAEG;AACH,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC;IACpB,GAAG,iBAAuB;IAE1B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IASpB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAUvB,GAAG,CAAC,GAAG,EAAE,CAAC;IAIV;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,CAAC;CAuBjB;AAED;;GAEG;AACH,8BAAsB,UAAU,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,GAAG,CAAC,CAAC,EAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,kBAAkB,IAAI,CAAC;IAEhC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;CAQjB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAC,CAAC,EAAE,oBAAoB,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAMlF;AAED;;GAEG;AACH,qBAAa,UAAU,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9C,GAAG,qBAA4B;CAClC;AAED,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,KAAK,OAAO,WAUlG;AACD,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAAC,GAAG;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,CAAC,CAAA;CAAC,GAAG;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,GAAG,CAAA;CAAC,CAAC;AAGvJ,KAAK,mBAAmB,GAAG;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AASD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,EAAG,SAAS,GAAE,OAAO,GAAG,SAAiB,GAAG,CAAC,CAqChO;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,GAAG,QAI9B;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,WAUjE;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAa5G;AAGD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,WAOhE"}
|
package/dist/mjs/Util.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
export function throwError(e) {
|
|
2
|
+
if (e !== null && e instanceof Error) {
|
|
3
|
+
throw e;
|
|
4
|
+
}
|
|
5
|
+
throw new Error(e);
|
|
6
|
+
}
|
|
7
|
+
export function reThrowWithHint(e, hint) {
|
|
8
|
+
try {
|
|
9
|
+
if (e instanceof Error) {
|
|
10
|
+
// Add hint to error:
|
|
11
|
+
e.message += `\n${hint}`;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch (x) {
|
|
15
|
+
}
|
|
16
|
+
throw e;
|
|
17
|
+
}
|
|
18
|
+
export function isObject(value) {
|
|
19
|
+
return value !== null && typeof value === "object";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A Map<K, Set<V>>. But automatically add a new Set if needed
|
|
23
|
+
*/
|
|
24
|
+
export class MapSet {
|
|
25
|
+
constructor() {
|
|
26
|
+
this.map = new Map();
|
|
27
|
+
}
|
|
28
|
+
add(key, value) {
|
|
29
|
+
let set = this.map.get(key);
|
|
30
|
+
if (set === undefined) {
|
|
31
|
+
set = new Set();
|
|
32
|
+
this.map.set(key, set);
|
|
33
|
+
}
|
|
34
|
+
set.add(value);
|
|
35
|
+
}
|
|
36
|
+
delete(key, value) {
|
|
37
|
+
let set = this.map.get(key);
|
|
38
|
+
if (set !== undefined) {
|
|
39
|
+
set.delete(value);
|
|
40
|
+
if (set.size === 0) {
|
|
41
|
+
this.map.delete(key); // Clean up
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
get(key) {
|
|
46
|
+
return this.map.get(key);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @param key
|
|
50
|
+
* @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.
|
|
51
|
+
* It is automatically cleaned up after the last delete
|
|
52
|
+
*/
|
|
53
|
+
get4use(key) {
|
|
54
|
+
const thisMapSet = this;
|
|
55
|
+
let set = this.map.get(key);
|
|
56
|
+
if (set === undefined) {
|
|
57
|
+
set = new class extends Set {
|
|
58
|
+
delete(value) {
|
|
59
|
+
const result = super.delete(value);
|
|
60
|
+
if (this.size === 0) {
|
|
61
|
+
thisMapSet.map.delete(key); // Clean up
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
add(value) {
|
|
66
|
+
if (thisMapSet.map.get(key) !== this) {
|
|
67
|
+
throw new Error("This set is invalid. You must add/delete immediately after calling get4modify");
|
|
68
|
+
}
|
|
69
|
+
return super.add(value);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
this.map.set(key, set);
|
|
73
|
+
}
|
|
74
|
+
return set;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* This Map does not return empty values, so there's always a default value created
|
|
79
|
+
*/
|
|
80
|
+
export class DefaultMap extends Map {
|
|
81
|
+
get(key) {
|
|
82
|
+
let result = super.get(key);
|
|
83
|
+
if (result === undefined) {
|
|
84
|
+
result = this.createDefaultValue();
|
|
85
|
+
this.set(key, result);
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
*
|
|
92
|
+
* @param createDefaultValueFn
|
|
93
|
+
* @returns a Map that creates and inserts a default value when that value does not exist. So the #get method always returns something.
|
|
94
|
+
*/
|
|
95
|
+
export function newDefaultMap(createDefaultValueFn) {
|
|
96
|
+
return new class extends DefaultMap {
|
|
97
|
+
createDefaultValue() {
|
|
98
|
+
return createDefaultValueFn();
|
|
99
|
+
}
|
|
100
|
+
}();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* A WeakMap<K, Set<V>>. But automatically add a new Set if needed
|
|
104
|
+
*/
|
|
105
|
+
export class WeakMapSet extends MapSet {
|
|
106
|
+
constructor() {
|
|
107
|
+
super(...arguments);
|
|
108
|
+
//@ts-ignore
|
|
109
|
+
this.map = new WeakMap();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export function arraysAreEqualsByPredicateFn(a, b, equalsFn) {
|
|
113
|
+
if (a.length !== b.length) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
for (const k in a) {
|
|
117
|
+
if (!equalsFn(a[k], b[k])) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
function diagnosis_jsonPath(key) {
|
|
124
|
+
if (!Number.isNaN(Number(key))) {
|
|
125
|
+
return `[${key}]`;
|
|
126
|
+
}
|
|
127
|
+
return `.${key}`;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Usage:
|
|
131
|
+
* <pre><code>
|
|
132
|
+
* const result = visitReplace(target, (value, visitChilds, context) => {
|
|
133
|
+
* return value === 'needle' ? 'replaced' : visitChilds(value, context)
|
|
134
|
+
* });
|
|
135
|
+
* </code></pre>
|
|
136
|
+
*
|
|
137
|
+
* @param value
|
|
138
|
+
* @param visitor
|
|
139
|
+
* @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
|
|
140
|
+
*/
|
|
141
|
+
export function visitReplace(value, visitor, trackPath = false) {
|
|
142
|
+
const visisitedObjects = new Set();
|
|
143
|
+
function visitChilds(value, context) {
|
|
144
|
+
if (value === null) {
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
else if (typeof value === "object") {
|
|
148
|
+
const obj = value;
|
|
149
|
+
if (visisitedObjects.has(obj)) {
|
|
150
|
+
return value; // don't iterate again
|
|
151
|
+
}
|
|
152
|
+
visisitedObjects.add(obj);
|
|
153
|
+
for (let k in obj) {
|
|
154
|
+
const keyInParent = k;
|
|
155
|
+
const childValue = obj[keyInParent];
|
|
156
|
+
let newValue = visitor(childValue, visitChilds, Object.assign(Object.assign({}, context), { parentObject: value, key: keyInParent, diagnosis_path: (context.diagnosis_path !== undefined ? `${context.diagnosis_path}${diagnosis_jsonPath(keyInParent)}` : undefined) }));
|
|
157
|
+
if (newValue !== childValue) { // Only if childValue really has changed. We don't want to interfer with setting a readonly property and trigger a proxy
|
|
158
|
+
// @ts-ignore
|
|
159
|
+
obj[keyInParent] = newValue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return value;
|
|
164
|
+
}
|
|
165
|
+
if (trackPath === "onError") {
|
|
166
|
+
try {
|
|
167
|
+
return visitor(value, visitChilds, {}); // Fast try without context
|
|
168
|
+
}
|
|
169
|
+
catch (e) {
|
|
170
|
+
return visitReplace(value, visitor, true); // Try again with context
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return visitor(value, visitChilds, { diagnosis_path: trackPath ? "" : undefined });
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Just do something the runtime can't optimize away
|
|
177
|
+
* @param value
|
|
178
|
+
*/
|
|
179
|
+
export function read(value) {
|
|
180
|
+
if (("" + value) == "blaaxyxzzzsdf") {
|
|
181
|
+
throw new Error("should never get here");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
export function arraysAreShallowlyEqual(a, b) {
|
|
185
|
+
if (a.length !== b.length) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
for (let i = 0; i < a.length; i++) {
|
|
189
|
+
if (a[i] !== b[i]) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Like arraysAreShallowlyEqual but this time for an array of entries (tuple of 2 values) like from Map#entries()
|
|
197
|
+
* @param a
|
|
198
|
+
* @param b
|
|
199
|
+
*/
|
|
200
|
+
export function arraysWithEntriesAreShallowlyEqual(a, b) {
|
|
201
|
+
if (a.length !== b.length) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
for (let i = 0; i < a.length; i++) {
|
|
205
|
+
if (a[i][0] !== b[i][0]) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
if (a[i][1] !== b[i][1]) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
export function classIsSubclassOf(clazz, superClass) {
|
|
215
|
+
var _a, _b;
|
|
216
|
+
do {
|
|
217
|
+
if (clazz === superClass) {
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
} while ((clazz = (_b = (_a = clazz.prototype) === null || _a === void 0 ? void 0 : _a.prototype) === null || _b === void 0 ? void 0 : _b.constructor) !== undefined);
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=Util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Util.js","sourceRoot":"","sources":["../../Util.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":["../../../class-trackers/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"}
|