@furystack/shades 12.1.0 → 12.2.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/CHANGELOG.md +20 -0
- package/esm/services/resource-manager.d.ts +7 -1
- package/esm/services/resource-manager.d.ts.map +1 -1
- package/esm/services/resource-manager.js +26 -6
- package/esm/services/resource-manager.js.map +1 -1
- package/esm/services/resource-manager.spec.js +77 -0
- package/esm/services/resource-manager.spec.js.map +1 -1
- package/package.json +1 -1
- package/src/services/resource-manager.spec.ts +96 -0
- package/src/services/resource-manager.ts +29 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [12.2.0] - 2026-02-22
|
|
4
|
+
|
|
5
|
+
### ✨ Features
|
|
6
|
+
|
|
7
|
+
### Dependency tracking for `useDisposable`
|
|
8
|
+
|
|
9
|
+
`useDisposable` now accepts an optional `deps` array parameter. When the serialized deps value changes between renders, the old resource is automatically disposed and a new one is created. This enables resources that depend on dynamic parameters (e.g., entity-sync subscriptions with changing query options) to be re-created without encoding all parameters into the cache key.
|
|
10
|
+
|
|
11
|
+
**Usage:**
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
const liveEntity = useDisposable('entitySync:MyModel', () => syncService.subscribeEntity(MyModel, currentKey), [
|
|
15
|
+
currentKey,
|
|
16
|
+
])
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 🧪 Tests
|
|
20
|
+
|
|
21
|
+
- Added tests for `useDisposable` dependency tracking in `ResourceManager`, covering re-creation on deps change and no-op when deps are unchanged
|
|
22
|
+
|
|
3
23
|
## [12.1.0] - 2026-02-19
|
|
4
24
|
|
|
5
25
|
### ✨ Features
|
|
@@ -5,14 +5,20 @@ import { ObservableValue } from '@furystack/utils';
|
|
|
5
5
|
*/
|
|
6
6
|
export declare class ResourceManager implements AsyncDisposable {
|
|
7
7
|
private readonly disposables;
|
|
8
|
+
private readonly disposableDeps;
|
|
8
9
|
/**
|
|
9
10
|
* Returns an existing disposable resource by key, or creates and caches a new one.
|
|
10
11
|
* Resources are automatically disposed when the component is removed from the DOM.
|
|
12
|
+
* When `deps` is provided, the resource is re-created (and the old one disposed) whenever
|
|
13
|
+
* the serialized deps value changes. This is useful for resources that depend on dynamic
|
|
14
|
+
* parameters (e.g., entity-sync subscriptions with changing query options).
|
|
11
15
|
* @param key Unique key for caching this resource
|
|
12
16
|
* @param factory Factory function called once to create the resource
|
|
17
|
+
* @param deps Optional dependency array -- when deps change, the old resource is disposed and a new one is created.
|
|
18
|
+
* Values are compared via `JSON.stringify`, so `undefined` and `null` are treated as equal within arrays.
|
|
13
19
|
* @returns The cached or newly created resource
|
|
14
20
|
*/
|
|
15
|
-
useDisposable<T extends Disposable | AsyncDisposable>(key: string, factory: () => T): T;
|
|
21
|
+
useDisposable<T extends Disposable | AsyncDisposable>(key: string, factory: () => T, deps?: readonly unknown[]): T;
|
|
16
22
|
readonly observers: Map<string, ValueObserver<any>>;
|
|
17
23
|
/**
|
|
18
24
|
* Subscribes to an observable value by key. If the observable changes between renders,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-manager.d.ts","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAChG,OAAO,EAAE,eAAe,EAAmC,MAAM,kBAAkB,CAAA;AAEnF;;GAEG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkD;
|
|
1
|
+
{"version":3,"file":"resource-manager.d.ts","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAChG,OAAO,EAAE,eAAe,EAAmC,MAAM,kBAAkB,CAAA;AAEnF;;GAEG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkD;IAC9E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAE3D;;;;;;;;;;;OAWG;IACI,aAAa,CAAC,CAAC,SAAS,UAAU,GAAG,eAAe,EACzD,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,EAChB,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,GACxB,CAAC;IAsBJ,SAAgB,SAAS,kCAAwC;IAEjE;;;;;;;;OAQG;IACI,aAAa,GAAI,CAAC,EACvB,KAAK,MAAM,EACX,YAAY,eAAe,CAAC,CAAC,CAAC,EAC9B,UAAU,mBAAmB,CAAC,CAAC,CAAC,EAChC,UAAU,oBAAoB,CAAC,CAAC,CAAC,KAChC,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAc7C;IAED,SAAgB,cAAc,oCAA0C;IAExE;;;;;;;OAOG;IACI,QAAQ,GAAI,CAAC,EAClB,KAAK,MAAM,EACX,cAAc,CAAC,EACf,UAAU,mBAAmB,CAAC,CAAC,CAAC,KAC/B,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAa7C;IAEY,CAAC,MAAM,CAAC,YAAY,CAAC;CA6BnC"}
|
|
@@ -5,21 +5,40 @@ import { ObservableValue, isAsyncDisposable, isDisposable } from '@furystack/uti
|
|
|
5
5
|
*/
|
|
6
6
|
export class ResourceManager {
|
|
7
7
|
disposables = new Map();
|
|
8
|
+
disposableDeps = new Map();
|
|
8
9
|
/**
|
|
9
10
|
* Returns an existing disposable resource by key, or creates and caches a new one.
|
|
10
11
|
* Resources are automatically disposed when the component is removed from the DOM.
|
|
12
|
+
* When `deps` is provided, the resource is re-created (and the old one disposed) whenever
|
|
13
|
+
* the serialized deps value changes. This is useful for resources that depend on dynamic
|
|
14
|
+
* parameters (e.g., entity-sync subscriptions with changing query options).
|
|
11
15
|
* @param key Unique key for caching this resource
|
|
12
16
|
* @param factory Factory function called once to create the resource
|
|
17
|
+
* @param deps Optional dependency array -- when deps change, the old resource is disposed and a new one is created.
|
|
18
|
+
* Values are compared via `JSON.stringify`, so `undefined` and `null` are treated as equal within arrays.
|
|
13
19
|
* @returns The cached or newly created resource
|
|
14
20
|
*/
|
|
15
|
-
useDisposable(key, factory) {
|
|
21
|
+
useDisposable(key, factory, deps) {
|
|
16
22
|
const existing = this.disposables.get(key);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
this.
|
|
20
|
-
|
|
23
|
+
const depsKey = deps !== undefined ? JSON.stringify(deps) : undefined;
|
|
24
|
+
if (existing) {
|
|
25
|
+
if (depsKey !== undefined && this.disposableDeps.get(key) !== depsKey) {
|
|
26
|
+
if (isDisposable(existing))
|
|
27
|
+
existing[Symbol.dispose]();
|
|
28
|
+
if (isAsyncDisposable(existing))
|
|
29
|
+
void existing[Symbol.asyncDispose]();
|
|
30
|
+
const created = factory();
|
|
31
|
+
this.disposables.set(key, created);
|
|
32
|
+
this.disposableDeps.set(key, depsKey);
|
|
33
|
+
return created;
|
|
34
|
+
}
|
|
35
|
+
return existing;
|
|
21
36
|
}
|
|
22
|
-
|
|
37
|
+
const created = factory();
|
|
38
|
+
this.disposables.set(key, created);
|
|
39
|
+
if (depsKey !== undefined)
|
|
40
|
+
this.disposableDeps.set(key, depsKey);
|
|
41
|
+
return created;
|
|
23
42
|
}
|
|
24
43
|
observers = new Map();
|
|
25
44
|
/**
|
|
@@ -84,6 +103,7 @@ export class ResourceManager {
|
|
|
84
103
|
throw error;
|
|
85
104
|
}
|
|
86
105
|
this.disposables.clear();
|
|
106
|
+
this.disposableDeps.clear();
|
|
87
107
|
this.observers.forEach((r) => r[Symbol.dispose]());
|
|
88
108
|
this.observers.clear();
|
|
89
109
|
this.stateObservers.forEach((r) => r[Symbol.dispose]());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-manager.js","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEnF;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,WAAW,GAAG,IAAI,GAAG,EAAwC,CAAA;
|
|
1
|
+
{"version":3,"file":"resource-manager.js","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -178,5 +178,82 @@ describe('ResourceManager', () => {
|
|
|
178
178
|
})).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: There was an error during disposing 1 stores: Error: Failed to dispose]`);
|
|
179
179
|
expect(disposable[Symbol.asyncDispose]).toHaveBeenCalledTimes(1);
|
|
180
180
|
});
|
|
181
|
+
describe('useDisposable with deps', () => {
|
|
182
|
+
it('Should behave identically without deps (backward compat)', async () => {
|
|
183
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
184
|
+
const factory = vi.fn(() => ({
|
|
185
|
+
[Symbol.dispose]: () => { },
|
|
186
|
+
}));
|
|
187
|
+
const d1 = rm.useDisposable('test', factory);
|
|
188
|
+
const d2 = rm.useDisposable('test', factory);
|
|
189
|
+
expect(d1).toBe(d2);
|
|
190
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
it('Should return cached resource when deps are the same', async () => {
|
|
194
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
195
|
+
const factory = vi.fn(() => ({
|
|
196
|
+
[Symbol.dispose]: () => { },
|
|
197
|
+
}));
|
|
198
|
+
const d1 = rm.useDisposable('test', factory, [1, 'a']);
|
|
199
|
+
const d2 = rm.useDisposable('test', factory, [1, 'a']);
|
|
200
|
+
expect(d1).toBe(d2);
|
|
201
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
it('Should dispose old resource and create new one when deps change', async () => {
|
|
205
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
206
|
+
const dispose1 = vi.fn();
|
|
207
|
+
const dispose2 = vi.fn();
|
|
208
|
+
const d1 = rm.useDisposable('test', () => ({ [Symbol.dispose]: dispose1 }), ['v1']);
|
|
209
|
+
expect(dispose1).not.toHaveBeenCalled();
|
|
210
|
+
const d2 = rm.useDisposable('test', () => ({ [Symbol.dispose]: dispose2 }), ['v2']);
|
|
211
|
+
expect(dispose1).toHaveBeenCalledTimes(1);
|
|
212
|
+
expect(d1).not.toBe(d2);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
it('Should call Symbol.asyncDispose on old async-disposable resource when deps change', async () => {
|
|
216
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
217
|
+
const asyncDispose1 = vi.fn();
|
|
218
|
+
rm.useDisposable('test', () => ({ [Symbol.asyncDispose]: asyncDispose1 }), ['v1']);
|
|
219
|
+
rm.useDisposable('test', () => ({ [Symbol.dispose]: () => { } }), ['v2']);
|
|
220
|
+
expect(asyncDispose1).toHaveBeenCalledTimes(1);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
it('Should handle multiple sequential dep changes (A -> B -> C)', async () => {
|
|
224
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
225
|
+
const disposeA = vi.fn();
|
|
226
|
+
const disposeB = vi.fn();
|
|
227
|
+
const disposeC = vi.fn();
|
|
228
|
+
const a = rm.useDisposable('test', () => ({ [Symbol.dispose]: disposeA }), ['A']);
|
|
229
|
+
const b = rm.useDisposable('test', () => ({ [Symbol.dispose]: disposeB }), ['B']);
|
|
230
|
+
const c = rm.useDisposable('test', () => ({ [Symbol.dispose]: disposeC }), ['C']);
|
|
231
|
+
expect(a).not.toBe(b);
|
|
232
|
+
expect(b).not.toBe(c);
|
|
233
|
+
expect(disposeA).toHaveBeenCalledTimes(1);
|
|
234
|
+
expect(disposeB).toHaveBeenCalledTimes(1);
|
|
235
|
+
expect(disposeC).not.toHaveBeenCalled();
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
it('Should dispose the final resource on ResourceManager disposal', async () => {
|
|
239
|
+
const disposeFn = vi.fn();
|
|
240
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
241
|
+
rm.useDisposable('test', () => ({ [Symbol.dispose]: vi.fn() }), ['v1']);
|
|
242
|
+
rm.useDisposable('test', () => ({ [Symbol.dispose]: disposeFn }), ['v2']);
|
|
243
|
+
expect(disposeFn).not.toHaveBeenCalled();
|
|
244
|
+
});
|
|
245
|
+
expect(disposeFn).toHaveBeenCalledTimes(1);
|
|
246
|
+
});
|
|
247
|
+
it('Should treat undefined and null as equal within deps (JSON.stringify behavior)', async () => {
|
|
248
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
249
|
+
const factory = vi.fn(() => ({
|
|
250
|
+
[Symbol.dispose]: vi.fn(),
|
|
251
|
+
}));
|
|
252
|
+
rm.useDisposable('test', factory, [undefined]);
|
|
253
|
+
rm.useDisposable('test', factory, [null]);
|
|
254
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
});
|
|
181
258
|
});
|
|
182
259
|
//# sourceMappingURL=resource-manager.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-manager.spec.js","sourceRoot":"","sources":["../../src/services/resource-manager.spec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resource-manager.spec.js","sourceRoot":"","sources":["../../src/services/resource-manager.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE;gBAChD,aAAa;YACf,CAAC,CAAC,CAAA;YACF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE;gBAChD,aAAa;YACf,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAE3B,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QACvG,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YACjC,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAA;YAClC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAExB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACtB,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAExC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACvB,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACxC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YACzB,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAEzB,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;YACvC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;YAEvC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YAChB,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;YAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAExB,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;YACrC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;YACrC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;YAErC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YACjC,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAA;YAClC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAExB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC5D,SAAS,CAAC,CAAC,CAAC,CAAA;YACZ,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAE7B,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YAC5D,SAAS,CAAC,EAAE,CAAC,CAAA;YACb,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC9B,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAExB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YACnD,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAEpB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YACnD,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACpB,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAExC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YACnD,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACpB,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACxC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YACjC,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YACjC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAExB,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YACtC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YAEtC,QAAQ,CAAC,SAAS,EAAE,CAAA;YACpB,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YAChB,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;YAEvC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YAChB,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAExB,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YACtC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;YACtC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC3B,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE;oBACrB,aAAa;gBACf,CAAC;aACF,CAAC,CAAC,CAAA;YACH,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC5C,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAE5C,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACnB,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,UAAU,GAAG;YACjB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;SAC1B,CAAA;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACjC,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,UAAU,GAAG;YACjB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;SAC/B,CAAA;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACjC,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,UAAU,GAAG;YACjB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;gBAC3B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACtC,CAAC,CAAC;SACH,CAAA;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,MAAM,CACV,KAAK,IAAI,EAAE,CACT,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACjC,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CACL,CAAC,OAAO,CAAC,kCAAkC,CAC1C,iFAAiF,CAClF,CAAA;QAED,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,IAAI,UAAmC,CAAA;QAEvC,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAS,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAC7D,UAAU,GAAG,QAAQ,CAAA;QACvB,CAAC,CAAC,CAAA;QAEF,sDAAsD;QACtD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAW,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,UAAU,GAAG;YACjB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACtC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACtC,CAAC,CAAC;SACH,CAAA;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,MAAM,CACV,KAAK,IAAI,EAAE,CACT,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACnD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACjC,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC,CAAC,CACL,CAAC,OAAO,CAAC,kCAAkC,CAC1C,iFAAiF,CAClF,CAAA;QAED,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACnD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;oBAC3B,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC;iBAC3B,CAAC,CAAC,CAAA;gBACH,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAC5C,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAE5C,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACnB,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YAC1C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACnD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;oBAC3B,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC;iBAC3B,CAAC,CAAC,CAAA;gBACH,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;gBACtD,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;gBAEtD,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACnB,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YAC1C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACnD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBACxB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBAExB,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;gBACnF,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;gBAEvC,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;gBACnF,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;gBACzC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACzB,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;YACjG,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACnD,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBAE7B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;gBAClF,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;gBAExE,MAAM,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YAChD,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACnD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBACxB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBACxB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBAExB,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;gBACjF,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;gBACjF,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;gBAEjF,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACrB,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACrB,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;gBACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;gBACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;YACzC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAEzB,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACnD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;gBACvE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;gBACzE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;YAC1C,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;YAC9F,MAAM,UAAU,CAAC,IAAI,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACnD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;oBAC3B,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;iBAC1B,CAAC,CAAC,CAAA;gBAEH,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;gBAC9C,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;gBAEzC,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;YAC1C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -227,4 +227,100 @@ describe('ResourceManager', () => {
|
|
|
227
227
|
|
|
228
228
|
expect(disposable[Symbol.asyncDispose]).toHaveBeenCalledTimes(1)
|
|
229
229
|
})
|
|
230
|
+
|
|
231
|
+
describe('useDisposable with deps', () => {
|
|
232
|
+
it('Should behave identically without deps (backward compat)', async () => {
|
|
233
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
234
|
+
const factory = vi.fn(() => ({
|
|
235
|
+
[Symbol.dispose]: () => {},
|
|
236
|
+
}))
|
|
237
|
+
const d1 = rm.useDisposable('test', factory)
|
|
238
|
+
const d2 = rm.useDisposable('test', factory)
|
|
239
|
+
|
|
240
|
+
expect(d1).toBe(d2)
|
|
241
|
+
expect(factory).toHaveBeenCalledTimes(1)
|
|
242
|
+
})
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
it('Should return cached resource when deps are the same', async () => {
|
|
246
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
247
|
+
const factory = vi.fn(() => ({
|
|
248
|
+
[Symbol.dispose]: () => {},
|
|
249
|
+
}))
|
|
250
|
+
const d1 = rm.useDisposable('test', factory, [1, 'a'])
|
|
251
|
+
const d2 = rm.useDisposable('test', factory, [1, 'a'])
|
|
252
|
+
|
|
253
|
+
expect(d1).toBe(d2)
|
|
254
|
+
expect(factory).toHaveBeenCalledTimes(1)
|
|
255
|
+
})
|
|
256
|
+
})
|
|
257
|
+
|
|
258
|
+
it('Should dispose old resource and create new one when deps change', async () => {
|
|
259
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
260
|
+
const dispose1 = vi.fn()
|
|
261
|
+
const dispose2 = vi.fn()
|
|
262
|
+
|
|
263
|
+
const d1 = rm.useDisposable('test', () => ({ [Symbol.dispose]: dispose1 }), ['v1'])
|
|
264
|
+
expect(dispose1).not.toHaveBeenCalled()
|
|
265
|
+
|
|
266
|
+
const d2 = rm.useDisposable('test', () => ({ [Symbol.dispose]: dispose2 }), ['v2'])
|
|
267
|
+
expect(dispose1).toHaveBeenCalledTimes(1)
|
|
268
|
+
expect(d1).not.toBe(d2)
|
|
269
|
+
})
|
|
270
|
+
})
|
|
271
|
+
|
|
272
|
+
it('Should call Symbol.asyncDispose on old async-disposable resource when deps change', async () => {
|
|
273
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
274
|
+
const asyncDispose1 = vi.fn()
|
|
275
|
+
|
|
276
|
+
rm.useDisposable('test', () => ({ [Symbol.asyncDispose]: asyncDispose1 }), ['v1'])
|
|
277
|
+
rm.useDisposable('test', () => ({ [Symbol.dispose]: () => {} }), ['v2'])
|
|
278
|
+
|
|
279
|
+
expect(asyncDispose1).toHaveBeenCalledTimes(1)
|
|
280
|
+
})
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
it('Should handle multiple sequential dep changes (A -> B -> C)', async () => {
|
|
284
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
285
|
+
const disposeA = vi.fn()
|
|
286
|
+
const disposeB = vi.fn()
|
|
287
|
+
const disposeC = vi.fn()
|
|
288
|
+
|
|
289
|
+
const a = rm.useDisposable('test', () => ({ [Symbol.dispose]: disposeA }), ['A'])
|
|
290
|
+
const b = rm.useDisposable('test', () => ({ [Symbol.dispose]: disposeB }), ['B'])
|
|
291
|
+
const c = rm.useDisposable('test', () => ({ [Symbol.dispose]: disposeC }), ['C'])
|
|
292
|
+
|
|
293
|
+
expect(a).not.toBe(b)
|
|
294
|
+
expect(b).not.toBe(c)
|
|
295
|
+
expect(disposeA).toHaveBeenCalledTimes(1)
|
|
296
|
+
expect(disposeB).toHaveBeenCalledTimes(1)
|
|
297
|
+
expect(disposeC).not.toHaveBeenCalled()
|
|
298
|
+
})
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
it('Should dispose the final resource on ResourceManager disposal', async () => {
|
|
302
|
+
const disposeFn = vi.fn()
|
|
303
|
+
|
|
304
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
305
|
+
rm.useDisposable('test', () => ({ [Symbol.dispose]: vi.fn() }), ['v1'])
|
|
306
|
+
rm.useDisposable('test', () => ({ [Symbol.dispose]: disposeFn }), ['v2'])
|
|
307
|
+
expect(disposeFn).not.toHaveBeenCalled()
|
|
308
|
+
})
|
|
309
|
+
|
|
310
|
+
expect(disposeFn).toHaveBeenCalledTimes(1)
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
it('Should treat undefined and null as equal within deps (JSON.stringify behavior)', async () => {
|
|
314
|
+
await usingAsync(new ResourceManager(), async (rm) => {
|
|
315
|
+
const factory = vi.fn(() => ({
|
|
316
|
+
[Symbol.dispose]: vi.fn(),
|
|
317
|
+
}))
|
|
318
|
+
|
|
319
|
+
rm.useDisposable('test', factory, [undefined])
|
|
320
|
+
rm.useDisposable('test', factory, [null])
|
|
321
|
+
|
|
322
|
+
expect(factory).toHaveBeenCalledTimes(1)
|
|
323
|
+
})
|
|
324
|
+
})
|
|
325
|
+
})
|
|
230
326
|
})
|
|
@@ -7,22 +7,44 @@ import { ObservableValue, isAsyncDisposable, isDisposable } from '@furystack/uti
|
|
|
7
7
|
*/
|
|
8
8
|
export class ResourceManager implements AsyncDisposable {
|
|
9
9
|
private readonly disposables = new Map<string, Disposable | AsyncDisposable>()
|
|
10
|
+
private readonly disposableDeps = new Map<string, string>()
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Returns an existing disposable resource by key, or creates and caches a new one.
|
|
13
14
|
* Resources are automatically disposed when the component is removed from the DOM.
|
|
15
|
+
* When `deps` is provided, the resource is re-created (and the old one disposed) whenever
|
|
16
|
+
* the serialized deps value changes. This is useful for resources that depend on dynamic
|
|
17
|
+
* parameters (e.g., entity-sync subscriptions with changing query options).
|
|
14
18
|
* @param key Unique key for caching this resource
|
|
15
19
|
* @param factory Factory function called once to create the resource
|
|
20
|
+
* @param deps Optional dependency array -- when deps change, the old resource is disposed and a new one is created.
|
|
21
|
+
* Values are compared via `JSON.stringify`, so `undefined` and `null` are treated as equal within arrays.
|
|
16
22
|
* @returns The cached or newly created resource
|
|
17
23
|
*/
|
|
18
|
-
public useDisposable<T extends Disposable | AsyncDisposable>(
|
|
24
|
+
public useDisposable<T extends Disposable | AsyncDisposable>(
|
|
25
|
+
key: string,
|
|
26
|
+
factory: () => T,
|
|
27
|
+
deps?: readonly unknown[],
|
|
28
|
+
): T {
|
|
19
29
|
const existing = this.disposables.get(key)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
30
|
+
const depsKey = deps !== undefined ? JSON.stringify(deps) : undefined
|
|
31
|
+
|
|
32
|
+
if (existing) {
|
|
33
|
+
if (depsKey !== undefined && this.disposableDeps.get(key) !== depsKey) {
|
|
34
|
+
if (isDisposable(existing)) existing[Symbol.dispose]()
|
|
35
|
+
if (isAsyncDisposable(existing)) void existing[Symbol.asyncDispose]()
|
|
36
|
+
const created = factory()
|
|
37
|
+
this.disposables.set(key, created)
|
|
38
|
+
this.disposableDeps.set(key, depsKey)
|
|
39
|
+
return created
|
|
40
|
+
}
|
|
41
|
+
return existing as T
|
|
24
42
|
}
|
|
25
|
-
|
|
43
|
+
|
|
44
|
+
const created = factory()
|
|
45
|
+
this.disposables.set(key, created)
|
|
46
|
+
if (depsKey !== undefined) this.disposableDeps.set(key, depsKey)
|
|
47
|
+
return created
|
|
26
48
|
}
|
|
27
49
|
|
|
28
50
|
public readonly observers = new Map<string, ValueObserver<any>>()
|
|
@@ -108,6 +130,7 @@ export class ResourceManager implements AsyncDisposable {
|
|
|
108
130
|
}
|
|
109
131
|
|
|
110
132
|
this.disposables.clear()
|
|
133
|
+
this.disposableDeps.clear()
|
|
111
134
|
this.observers.forEach((r) => r[Symbol.dispose]())
|
|
112
135
|
this.observers.clear()
|
|
113
136
|
|