proxy-facades 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/.idea/.name +1 -0
  2. package/.idea/modules.xml +8 -0
  3. package/.idea/proxy-facades.iml +8 -0
  4. package/.idea/vcs.xml +6 -0
  5. package/DEVELOPMENT.md +15 -0
  6. package/LICENSE +21 -0
  7. package/RecordedReadOnProxiedObjectExt.d.ts +22 -0
  8. package/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
  9. package/RecordedReadOnProxiedObjectExt.js +41 -0
  10. package/RecordedReadOnProxiedObjectExt.js.map +1 -0
  11. package/RecordedReadOnProxiedObjectExt.ts +41 -0
  12. package/Util.d.ts +85 -0
  13. package/Util.d.ts.map +1 -0
  14. package/Util.js +239 -0
  15. package/Util.js.map +1 -0
  16. package/Util.ts +254 -0
  17. package/class-trackers/Array.d.ts +93 -0
  18. package/class-trackers/Array.d.ts.map +1 -0
  19. package/class-trackers/Array.js +193 -0
  20. package/class-trackers/Array.js.map +1 -0
  21. package/class-trackers/Array.ts +245 -0
  22. package/class-trackers/Iterator.d.ts +38 -0
  23. package/class-trackers/Iterator.d.ts.map +1 -0
  24. package/class-trackers/Iterator.js +69 -0
  25. package/class-trackers/Iterator.js.map +1 -0
  26. package/class-trackers/Iterator.ts +73 -0
  27. package/class-trackers/Map.d.ts +128 -0
  28. package/class-trackers/Map.d.ts.map +1 -0
  29. package/class-trackers/Map.js +310 -0
  30. package/class-trackers/Map.js.map +1 -0
  31. package/class-trackers/Map.ts +403 -0
  32. package/class-trackers/Set.d.ts +85 -0
  33. package/class-trackers/Set.d.ts.map +1 -0
  34. package/class-trackers/Set.js +197 -0
  35. package/class-trackers/Set.js.map +1 -0
  36. package/class-trackers/Set.ts +245 -0
  37. package/class-trackers/index.d.ts +7 -0
  38. package/class-trackers/index.d.ts.map +1 -0
  39. package/class-trackers/index.js +36 -0
  40. package/class-trackers/index.js.map +1 -0
  41. package/class-trackers/index.ts +38 -0
  42. package/class-trackers/readme.md +2 -0
  43. package/common.d.ts +235 -0
  44. package/common.d.ts.map +1 -0
  45. package/common.js +378 -0
  46. package/common.js.map +1 -0
  47. package/common.ts +501 -0
  48. package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
  49. package/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
  50. package/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
  51. package/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
  52. package/dev_generateEsRuntimeBehaviourCheckerCode.ts +85 -0
  53. package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts +22 -0
  54. package/dist/mjs/RecordedReadOnProxiedObjectExt.d.ts.map +1 -0
  55. package/dist/mjs/RecordedReadOnProxiedObjectExt.js +37 -0
  56. package/dist/mjs/RecordedReadOnProxiedObjectExt.js.map +1 -0
  57. package/dist/mjs/Util.d.ts +85 -0
  58. package/dist/mjs/Util.d.ts.map +1 -0
  59. package/dist/mjs/Util.js +223 -0
  60. package/dist/mjs/Util.js.map +1 -0
  61. package/dist/mjs/class-trackers/Array.d.ts +93 -0
  62. package/dist/mjs/class-trackers/Array.d.ts.map +1 -0
  63. package/dist/mjs/class-trackers/Array.js +186 -0
  64. package/dist/mjs/class-trackers/Array.js.map +1 -0
  65. package/dist/mjs/class-trackers/Iterator.d.ts +38 -0
  66. package/dist/mjs/class-trackers/Iterator.d.ts.map +1 -0
  67. package/dist/mjs/class-trackers/Iterator.js +65 -0
  68. package/dist/mjs/class-trackers/Iterator.js.map +1 -0
  69. package/dist/mjs/class-trackers/Map.d.ts +128 -0
  70. package/dist/mjs/class-trackers/Map.d.ts.map +1 -0
  71. package/dist/mjs/class-trackers/Map.js +299 -0
  72. package/dist/mjs/class-trackers/Map.js.map +1 -0
  73. package/dist/mjs/class-trackers/Set.d.ts +85 -0
  74. package/dist/mjs/class-trackers/Set.d.ts.map +1 -0
  75. package/dist/mjs/class-trackers/Set.js +189 -0
  76. package/dist/mjs/class-trackers/Set.js.map +1 -0
  77. package/dist/mjs/class-trackers/index.d.ts +7 -0
  78. package/dist/mjs/class-trackers/index.d.ts.map +1 -0
  79. package/dist/mjs/class-trackers/index.js +32 -0
  80. package/dist/mjs/class-trackers/index.js.map +1 -0
  81. package/dist/mjs/common.d.ts +235 -0
  82. package/dist/mjs/common.d.ts.map +1 -0
  83. package/dist/mjs/common.js +361 -0
  84. package/dist/mjs/common.js.map +1 -0
  85. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts +10 -0
  86. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.d.ts.map +1 -0
  87. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js +76 -0
  88. package/dist/mjs/dev_generateEsRuntimeBehaviourCheckerCode.js.map +1 -0
  89. package/dist/mjs/index.d.ts +8 -0
  90. package/dist/mjs/index.d.ts.map +1 -0
  91. package/dist/mjs/index.js +8 -0
  92. package/dist/mjs/index.js.map +1 -0
  93. package/dist/mjs/objectChangeTracking.d.ts +43 -0
  94. package/dist/mjs/objectChangeTracking.d.ts.map +1 -0
  95. package/dist/mjs/objectChangeTracking.js +209 -0
  96. package/dist/mjs/objectChangeTracking.js.map +1 -0
  97. package/dist/mjs/origChangeTracking.d.ts +14 -0
  98. package/dist/mjs/origChangeTracking.d.ts.map +1 -0
  99. package/dist/mjs/origChangeTracking.js +58 -0
  100. package/dist/mjs/origChangeTracking.js.map +1 -0
  101. package/dist/mjs/proxyFacade.d.ts +45 -0
  102. package/dist/mjs/proxyFacade.d.ts.map +1 -0
  103. package/dist/mjs/proxyFacade.js +179 -0
  104. package/dist/mjs/proxyFacade.js.map +1 -0
  105. package/dist/mjs/watchedProxyFacade.d.ts +84 -0
  106. package/dist/mjs/watchedProxyFacade.d.ts.map +1 -0
  107. package/dist/mjs/watchedProxyFacade.js +300 -0
  108. package/dist/mjs/watchedProxyFacade.js.map +1 -0
  109. package/index.d.ts +8 -0
  110. package/index.d.ts.map +1 -0
  111. package/index.js +36 -0
  112. package/index.js.map +1 -0
  113. package/index.ts +7 -0
  114. package/index_esm.mjs +44 -0
  115. package/objectChangeTracking.d.ts +43 -0
  116. package/objectChangeTracking.d.ts.map +1 -0
  117. package/objectChangeTracking.js +214 -0
  118. package/objectChangeTracking.js.map +1 -0
  119. package/objectChangeTracking.ts +251 -0
  120. package/origChangeTracking.d.ts +14 -0
  121. package/origChangeTracking.d.ts.map +1 -0
  122. package/origChangeTracking.js +63 -0
  123. package/origChangeTracking.js.map +1 -0
  124. package/origChangeTracking.ts +72 -0
  125. package/package.json +52 -0
  126. package/proxyFacade.d.ts +45 -0
  127. package/proxyFacade.d.ts.map +1 -0
  128. package/proxyFacade.js +187 -0
  129. package/proxyFacade.js.map +1 -0
  130. package/proxyFacade.ts +222 -0
  131. package/readme.md +111 -0
  132. package/watchedProxyFacade.d.ts +84 -0
  133. package/watchedProxyFacade.d.ts.map +1 -0
  134. package/watchedProxyFacade.js +312 -0
  135. package/watchedProxyFacade.js.map +1 -0
  136. package/watchedProxyFacade.ts +369 -0
package/.idea/.name ADDED
@@ -0,0 +1 @@
1
+ proxy-facades
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/proxy-facades.iml" filepath="$PROJECT_DIR$/.idea/proxy-facades.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="WEB_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="inheritedJdk" />
6
+ <orderEntry type="sourceFolder" forTests="false" />
7
+ </component>
8
+ </module>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
package/DEVELOPMENT.md ADDED
@@ -0,0 +1,15 @@
1
+ # Developing
2
+ ### Prepare
3
+
4
+ ```bash
5
+ git clone https://github.com/bogeeee/proxy-facades.git
6
+ cd proxy-facades
7
+ npm install --ignore-scripts
8
+ ```
9
+
10
+
11
+ ### Run the tests
12
+ from inside the project dir:
13
+ ```bash
14
+ npm run test
15
+ ```
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-present Boris Gingold
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -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,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecordedReadOnProxiedObjectExt = void 0;
4
+ const common_1 = require("./common");
5
+ const origChangeTracking_1 = require("./origChangeTracking");
6
+ const proxyFacade_1 = require("./proxyFacade");
7
+ /**
8
+ * Offers a more convenient method: getAffectingChangeHooks
9
+ */
10
+ class RecordedReadOnProxiedObjectExt extends common_1.RecordedReadOnProxiedObject {
11
+ /**
12
+ * @param listener
13
+ * @param trackOriginal
14
+ */
15
+ onAfterChange(listener, trackOriginal = false) {
16
+ this.getAffectingChangeHooks(this.proxyHandler.proxy).forEach(eventHook => eventHook.afterListeners.add(listener));
17
+ if (trackOriginal) {
18
+ if (!(0, proxyFacade_1.isProxyForAFacade)(this.obj)) {
19
+ (0, origChangeTracking_1.installChangeTracker)(this.obj);
20
+ }
21
+ this.getAffectingChangeHooks(this.obj).forEach(eventHook => eventHook.afterListeners.add(listener));
22
+ }
23
+ }
24
+ /**
25
+ *
26
+ */
27
+ offAfterChange(listener) {
28
+ this.getAffectingChangeHooks(this.obj).forEach(eventHook => eventHook.afterListeners.delete(listener));
29
+ this.getAffectingChangeHooks(this.proxyHandler.proxy).forEach(eventHook => eventHook.afterListeners.delete(listener));
30
+ }
31
+ /**
32
+ *
33
+ * @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
34
+ * @returns the sets where to add/remove listeners by the onChange/offChange methods
35
+ */
36
+ getAffectingChangeHooks(target) {
37
+ throw new Error("TODO");
38
+ }
39
+ }
40
+ exports.RecordedReadOnProxiedObjectExt = RecordedReadOnProxiedObjectExt;
41
+ //# sourceMappingURL=RecordedReadOnProxiedObjectExt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordedReadOnProxiedObjectExt.js","sourceRoot":"","sources":["RecordedReadOnProxiedObjectExt.ts"],"names":[],"mappings":";;;AAAA,qCAAgF;AAChF,6DAA0D;AAC1D,+CAAgD;AAGhD;;GAEG;AACH,MAAsB,8BAA+B,SAAQ,oCAA2B;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,IAAA,+BAAiB,EAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,IAAA,yCAAoB,EAAC,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;AAhCD,wEAgCC"}
@@ -0,0 +1,41 @@
1
+ import {ChangeListener, EventHook, RecordedReadOnProxiedObject} from "./common";
2
+ import {installChangeTracker} from "./origChangeTracking";
3
+ import {isProxyForAFacade} from "./proxyFacade";
4
+
5
+
6
+ /**
7
+ * Offers a more convenient method: getAffectingChangeHooks
8
+ */
9
+ export abstract class RecordedReadOnProxiedObjectExt extends RecordedReadOnProxiedObject {
10
+
11
+ /**
12
+ * @param listener
13
+ * @param trackOriginal
14
+ */
15
+ onAfterChange(listener: () => void, trackOriginal = false) {
16
+ this.getAffectingChangeHooks(this.proxyHandler.proxy).forEach(eventHook => eventHook.afterListeners.add(listener));
17
+ if (trackOriginal) {
18
+ if(!isProxyForAFacade(this.obj)) {
19
+ installChangeTracker(this.obj);
20
+ }
21
+ this.getAffectingChangeHooks(this.obj).forEach(eventHook => eventHook.afterListeners.add(listener));
22
+ }
23
+ }
24
+
25
+ /**
26
+ *
27
+ */
28
+ offAfterChange(listener: () => void) {
29
+ this.getAffectingChangeHooks(this.obj).forEach(eventHook => eventHook.afterListeners.delete(listener));
30
+ this.getAffectingChangeHooks(this.proxyHandler.proxy).forEach(eventHook => eventHook.afterListeners.delete(listener));
31
+ }
32
+
33
+ /**
34
+ *
35
+ * @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
36
+ * @returns the sets where to add/remove listeners by the onChange/offChange methods
37
+ */
38
+ getAffectingChangeHooks(target: object): EventHook[] {
39
+ throw new Error("TODO")
40
+ }
41
+ }
package/Util.d.ts ADDED
@@ -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
package/Util.d.ts.map ADDED
@@ -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/Util.js ADDED
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WeakMapSet = exports.DefaultMap = exports.MapSet = void 0;
4
+ exports.throwError = throwError;
5
+ exports.reThrowWithHint = reThrowWithHint;
6
+ exports.isObject = isObject;
7
+ exports.newDefaultMap = newDefaultMap;
8
+ exports.arraysAreEqualsByPredicateFn = arraysAreEqualsByPredicateFn;
9
+ exports.visitReplace = visitReplace;
10
+ exports.read = read;
11
+ exports.arraysAreShallowlyEqual = arraysAreShallowlyEqual;
12
+ exports.arraysWithEntriesAreShallowlyEqual = arraysWithEntriesAreShallowlyEqual;
13
+ exports.classIsSubclassOf = classIsSubclassOf;
14
+ function throwError(e) {
15
+ if (e !== null && e instanceof Error) {
16
+ throw e;
17
+ }
18
+ throw new Error(e);
19
+ }
20
+ function reThrowWithHint(e, hint) {
21
+ try {
22
+ if (e instanceof Error) {
23
+ // Add hint to error:
24
+ e.message += `\n${hint}`;
25
+ }
26
+ }
27
+ catch (x) {
28
+ }
29
+ throw e;
30
+ }
31
+ function isObject(value) {
32
+ return value !== null && typeof value === "object";
33
+ }
34
+ /**
35
+ * A Map<K, Set<V>>. But automatically add a new Set if needed
36
+ */
37
+ class MapSet {
38
+ constructor() {
39
+ this.map = new Map();
40
+ }
41
+ add(key, value) {
42
+ let set = this.map.get(key);
43
+ if (set === undefined) {
44
+ set = new Set();
45
+ this.map.set(key, set);
46
+ }
47
+ set.add(value);
48
+ }
49
+ delete(key, value) {
50
+ let set = this.map.get(key);
51
+ if (set !== undefined) {
52
+ set.delete(value);
53
+ if (set.size === 0) {
54
+ this.map.delete(key); // Clean up
55
+ }
56
+ }
57
+ }
58
+ get(key) {
59
+ return this.map.get(key);
60
+ }
61
+ /**
62
+ * @param key
63
+ * @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.
64
+ * It is automatically cleaned up after the last delete
65
+ */
66
+ get4use(key) {
67
+ const thisMapSet = this;
68
+ let set = this.map.get(key);
69
+ if (set === undefined) {
70
+ set = new class extends Set {
71
+ delete(value) {
72
+ const result = super.delete(value);
73
+ if (this.size === 0) {
74
+ thisMapSet.map.delete(key); // Clean up
75
+ }
76
+ return result;
77
+ }
78
+ add(value) {
79
+ if (thisMapSet.map.get(key) !== this) {
80
+ throw new Error("This set is invalid. You must add/delete immediately after calling get4modify");
81
+ }
82
+ return super.add(value);
83
+ }
84
+ };
85
+ this.map.set(key, set);
86
+ }
87
+ return set;
88
+ }
89
+ }
90
+ exports.MapSet = MapSet;
91
+ /**
92
+ * This Map does not return empty values, so there's always a default value created
93
+ */
94
+ class DefaultMap extends Map {
95
+ get(key) {
96
+ let result = super.get(key);
97
+ if (result === undefined) {
98
+ result = this.createDefaultValue();
99
+ this.set(key, result);
100
+ }
101
+ return result;
102
+ }
103
+ }
104
+ exports.DefaultMap = DefaultMap;
105
+ /**
106
+ *
107
+ * @param createDefaultValueFn
108
+ * @returns a Map that creates and inserts a default value when that value does not exist. So the #get method always returns something.
109
+ */
110
+ function newDefaultMap(createDefaultValueFn) {
111
+ return new class extends DefaultMap {
112
+ createDefaultValue() {
113
+ return createDefaultValueFn();
114
+ }
115
+ }();
116
+ }
117
+ /**
118
+ * A WeakMap<K, Set<V>>. But automatically add a new Set if needed
119
+ */
120
+ class WeakMapSet extends MapSet {
121
+ constructor() {
122
+ super(...arguments);
123
+ //@ts-ignore
124
+ this.map = new WeakMap();
125
+ }
126
+ }
127
+ exports.WeakMapSet = WeakMapSet;
128
+ function arraysAreEqualsByPredicateFn(a, b, equalsFn) {
129
+ if (a.length !== b.length) {
130
+ return false;
131
+ }
132
+ for (const k in a) {
133
+ if (!equalsFn(a[k], b[k])) {
134
+ return false;
135
+ }
136
+ }
137
+ return true;
138
+ }
139
+ function diagnosis_jsonPath(key) {
140
+ if (!Number.isNaN(Number(key))) {
141
+ return `[${key}]`;
142
+ }
143
+ return `.${key}`;
144
+ }
145
+ /**
146
+ * Usage:
147
+ * <pre><code>
148
+ * const result = visitReplace(target, (value, visitChilds, context) => {
149
+ * return value === 'needle' ? 'replaced' : visitChilds(value, context)
150
+ * });
151
+ * </code></pre>
152
+ *
153
+ * @param value
154
+ * @param visitor
155
+ * @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
156
+ */
157
+ function visitReplace(value, visitor, trackPath = false) {
158
+ const visisitedObjects = new Set();
159
+ function visitChilds(value, context) {
160
+ if (value === null) {
161
+ return value;
162
+ }
163
+ else if (typeof value === "object") {
164
+ const obj = value;
165
+ if (visisitedObjects.has(obj)) {
166
+ return value; // don't iterate again
167
+ }
168
+ visisitedObjects.add(obj);
169
+ for (let k in obj) {
170
+ const keyInParent = k;
171
+ const childValue = obj[keyInParent];
172
+ 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) }));
173
+ if (newValue !== childValue) { // Only if childValue really has changed. We don't want to interfer with setting a readonly property and trigger a proxy
174
+ // @ts-ignore
175
+ obj[keyInParent] = newValue;
176
+ }
177
+ }
178
+ }
179
+ return value;
180
+ }
181
+ if (trackPath === "onError") {
182
+ try {
183
+ return visitor(value, visitChilds, {}); // Fast try without context
184
+ }
185
+ catch (e) {
186
+ return visitReplace(value, visitor, true); // Try again with context
187
+ }
188
+ }
189
+ return visitor(value, visitChilds, { diagnosis_path: trackPath ? "" : undefined });
190
+ }
191
+ /**
192
+ * Just do something the runtime can't optimize away
193
+ * @param value
194
+ */
195
+ function read(value) {
196
+ if (("" + value) == "blaaxyxzzzsdf") {
197
+ throw new Error("should never get here");
198
+ }
199
+ }
200
+ function arraysAreShallowlyEqual(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] !== b[i]) {
206
+ return false;
207
+ }
208
+ }
209
+ return true;
210
+ }
211
+ /**
212
+ * Like arraysAreShallowlyEqual but this time for an array of entries (tuple of 2 values) like from Map#entries()
213
+ * @param a
214
+ * @param b
215
+ */
216
+ function arraysWithEntriesAreShallowlyEqual(a, b) {
217
+ if (a.length !== b.length) {
218
+ return false;
219
+ }
220
+ for (let i = 0; i < a.length; i++) {
221
+ if (a[i][0] !== b[i][0]) {
222
+ return false;
223
+ }
224
+ if (a[i][1] !== b[i][1]) {
225
+ return false;
226
+ }
227
+ }
228
+ return true;
229
+ }
230
+ function classIsSubclassOf(clazz, superClass) {
231
+ var _a, _b;
232
+ do {
233
+ if (clazz === superClass) {
234
+ return true;
235
+ }
236
+ } while ((clazz = (_b = (_a = clazz.prototype) === null || _a === void 0 ? void 0 : _a.prototype) === null || _b === void 0 ? void 0 : _b.constructor) !== undefined);
237
+ return false;
238
+ }
239
+ //# sourceMappingURL=Util.js.map
package/Util.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Util.js","sourceRoot":"","sources":["Util.ts"],"names":[],"mappings":"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"}