proxy-facades 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.idea/.name +1 -0
  2. package/.idea/modules.xml +8 -0
  3. package/.idea/proxy-facades.iml +8 -0
  4. package/.idea/vcs.xml +6 -0
  5. package/DEVELOPMENT.md +15 -0
  6. package/LICENSE +21 -0
  7. package/RecordedReadOnProxiedObjectExt.d.ts +22 -0
  8. package/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
  9. package/RecordedReadOnProxiedObjectExt.js +41 -0
  10. package/RecordedReadOnProxiedObjectExt.js.map +1 -0
  11. package/RecordedReadOnProxiedObjectExt.ts +41 -0
  12. package/Util.d.ts +85 -0
  13. package/Util.d.ts.map +1 -0
  14. package/Util.js +239 -0
  15. package/Util.js.map +1 -0
  16. package/Util.ts +254 -0
  17. package/class-trackers/Array.d.ts +93 -0
  18. package/class-trackers/Array.d.ts.map +1 -0
  19. package/class-trackers/Array.js +193 -0
  20. package/class-trackers/Array.js.map +1 -0
  21. package/class-trackers/Array.ts +245 -0
  22. package/class-trackers/Iterator.d.ts +38 -0
  23. package/class-trackers/Iterator.d.ts.map +1 -0
  24. package/class-trackers/Iterator.js +69 -0
  25. package/class-trackers/Iterator.js.map +1 -0
  26. package/class-trackers/Iterator.ts +73 -0
  27. package/class-trackers/Map.d.ts +128 -0
  28. package/class-trackers/Map.d.ts.map +1 -0
  29. package/class-trackers/Map.js +310 -0
  30. package/class-trackers/Map.js.map +1 -0
  31. package/class-trackers/Map.ts +403 -0
  32. package/class-trackers/Set.d.ts +85 -0
  33. package/class-trackers/Set.d.ts.map +1 -0
  34. package/class-trackers/Set.js +197 -0
  35. package/class-trackers/Set.js.map +1 -0
  36. package/class-trackers/Set.ts +245 -0
  37. package/class-trackers/index.d.ts +7 -0
  38. package/class-trackers/index.d.ts.map +1 -0
  39. package/class-trackers/index.js +36 -0
  40. package/class-trackers/index.js.map +1 -0
  41. package/class-trackers/index.ts +38 -0
  42. package/class-trackers/readme.md +2 -0
  43. package/common.d.ts +235 -0
  44. package/common.d.ts.map +1 -0
  45. package/common.js +378 -0
  46. package/common.js.map +1 -0
  47. package/common.ts +501 -0
  48. package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
  49. package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
  50. package/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
  51. package/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
  52. package/dev_generateEsRuntimeBehaviourCheckerCode.ts +85 -0
  53. package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts +22 -0
  54. package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
  55. package/dist/mjs/RecordedReadOnProxiedObjectExt.js +37 -0
  56. package/dist/mjs/RecordedReadOnProxiedObjectExt.js.map +1 -0
  57. package/dist/mjs/Util.d.ts +85 -0
  58. package/dist/mjs/Util.d.ts.map +1 -0
  59. package/dist/mjs/Util.js +223 -0
  60. package/dist/mjs/Util.js.map +1 -0
  61. package/dist/mjs/class-trackers/Array.d.ts +93 -0
  62. package/dist/mjs/class-trackers/Array.d.ts.map +1 -0
  63. package/dist/mjs/class-trackers/Array.js +186 -0
  64. package/dist/mjs/class-trackers/Array.js.map +1 -0
  65. package/dist/mjs/class-trackers/Iterator.d.ts +38 -0
  66. package/dist/mjs/class-trackers/Iterator.d.ts.map +1 -0
  67. package/dist/mjs/class-trackers/Iterator.js +65 -0
  68. package/dist/mjs/class-trackers/Iterator.js.map +1 -0
  69. package/dist/mjs/class-trackers/Map.d.ts +128 -0
  70. package/dist/mjs/class-trackers/Map.d.ts.map +1 -0
  71. package/dist/mjs/class-trackers/Map.js +299 -0
  72. package/dist/mjs/class-trackers/Map.js.map +1 -0
  73. package/dist/mjs/class-trackers/Set.d.ts +85 -0
  74. package/dist/mjs/class-trackers/Set.d.ts.map +1 -0
  75. package/dist/mjs/class-trackers/Set.js +189 -0
  76. package/dist/mjs/class-trackers/Set.js.map +1 -0
  77. package/dist/mjs/class-trackers/index.d.ts +7 -0
  78. package/dist/mjs/class-trackers/index.d.ts.map +1 -0
  79. package/dist/mjs/class-trackers/index.js +32 -0
  80. package/dist/mjs/class-trackers/index.js.map +1 -0
  81. package/dist/mjs/common.d.ts +235 -0
  82. package/dist/mjs/common.d.ts.map +1 -0
  83. package/dist/mjs/common.js +361 -0
  84. package/dist/mjs/common.js.map +1 -0
  85. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
  86. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
  87. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
  88. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
  89. package/dist/mjs/index.d.ts +8 -0
  90. package/dist/mjs/index.d.ts.map +1 -0
  91. package/dist/mjs/index.js +8 -0
  92. package/dist/mjs/index.js.map +1 -0
  93. package/dist/mjs/objectChangeTracking.d.ts +43 -0
  94. package/dist/mjs/objectChangeTracking.d.ts.map +1 -0
  95. package/dist/mjs/objectChangeTracking.js +209 -0
  96. package/dist/mjs/objectChangeTracking.js.map +1 -0
  97. package/dist/mjs/origChangeTracking.d.ts +14 -0
  98. package/dist/mjs/origChangeTracking.d.ts.map +1 -0
  99. package/dist/mjs/origChangeTracking.js +58 -0
  100. package/dist/mjs/origChangeTracking.js.map +1 -0
  101. package/dist/mjs/proxyFacade.d.ts +45 -0
  102. package/dist/mjs/proxyFacade.d.ts.map +1 -0
  103. package/dist/mjs/proxyFacade.js +179 -0
  104. package/dist/mjs/proxyFacade.js.map +1 -0
  105. package/dist/mjs/watchedProxyFacade.d.ts +84 -0
  106. package/dist/mjs/watchedProxyFacade.d.ts.map +1 -0
  107. package/dist/mjs/watchedProxyFacade.js +300 -0
  108. package/dist/mjs/watchedProxyFacade.js.map +1 -0
  109. package/index.d.ts +8 -0
  110. package/index.d.ts.map +1 -0
  111. package/index.js +36 -0
  112. package/index.js.map +1 -0
  113. package/index.ts +7 -0
  114. package/index_esm.mjs +44 -0
  115. package/objectChangeTracking.d.ts +43 -0
  116. package/objectChangeTracking.d.ts.map +1 -0
  117. package/objectChangeTracking.js +214 -0
  118. package/objectChangeTracking.js.map +1 -0
  119. package/objectChangeTracking.ts +251 -0
  120. package/origChangeTracking.d.ts +14 -0
  121. package/origChangeTracking.d.ts.map +1 -0
  122. package/origChangeTracking.js +63 -0
  123. package/origChangeTracking.js.map +1 -0
  124. package/origChangeTracking.ts +72 -0
  125. package/package.json +52 -0
  126. package/proxyFacade.d.ts +45 -0
  127. package/proxyFacade.d.ts.map +1 -0
  128. package/proxyFacade.js +187 -0
  129. package/proxyFacade.js.map +1 -0
  130. package/proxyFacade.ts +222 -0
  131. package/readme.md +111 -0
  132. package/watchedProxyFacade.d.ts +84 -0
  133. package/watchedProxyFacade.d.ts.map +1 -0
  134. package/watchedProxyFacade.js +312 -0
  135. package/watchedProxyFacade.js.map +1 -0
  136. package/watchedProxyFacade.ts +369 -0
@@ -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"}
@@ -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"}