@furystack/shades 7.0.0 → 7.1.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/dist/models/render-options.js +0 -23
- package/dist/models/render-options.js.map +1 -1
- package/dist/services/location-service.js +36 -0
- package/dist/services/location-service.js.map +1 -1
- package/dist/services/location-service.spec.js +62 -4
- package/dist/services/location-service.spec.js.map +1 -1
- package/dist/shade.js +46 -0
- package/dist/shade.js.map +1 -1
- package/package.json +6 -6
- package/src/models/render-options.ts +47 -25
- package/src/services/location-service.spec.ts +74 -5
- package/src/services/location-service.tsx +40 -0
- package/src/shade.ts +64 -0
- package/types/models/render-options.d.ts +40 -1
- package/types/models/render-options.d.ts.map +1 -1
- package/types/services/location-service.d.ts +9 -0
- package/types/services/location-service.d.ts.map +1 -1
- package/types/shade.d.ts.map +1 -1
|
@@ -1,26 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
// export type RenderOptionsState<TState> = unknown extends TState
|
|
4
|
-
// ? {}
|
|
5
|
-
// : {
|
|
6
|
-
// /**
|
|
7
|
-
// * @returns the current state object
|
|
8
|
-
// */
|
|
9
|
-
// getState: () => TState
|
|
10
|
-
// /**
|
|
11
|
-
// * Update the current component state's multiple properties in one-shot
|
|
12
|
-
// *
|
|
13
|
-
// * @param newState The partial new state object
|
|
14
|
-
// * @param skipRender Option to skip the render process
|
|
15
|
-
// */
|
|
16
|
-
// updateState: (newState: PartialElement<TState>, skipRender?: boolean) => void
|
|
17
|
-
// /**
|
|
18
|
-
// * @param key The key on the state object
|
|
19
|
-
// * @returns A tuple with the value and the setter function
|
|
20
|
-
// */
|
|
21
|
-
// useState: <T extends keyof TState>(
|
|
22
|
-
// key: T,
|
|
23
|
-
// ) => [value: TState[T], setValue: (newValue: TState[T], skipRender?: boolean) => void]
|
|
24
|
-
// }
|
|
25
|
-
// export type RenderOptions<TProps, TState> = RenderOptionsBase<TProps, TState> & RenderOptionsState<TState>
|
|
26
3
|
//# sourceMappingURL=render-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-options.js","sourceRoot":"","sources":["../../src/models/render-options.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-options.js","sourceRoot":"","sources":["../../src/models/render-options.ts"],"names":[],"mappings":""}
|
|
@@ -25,6 +25,29 @@ let LocationService = class LocationService {
|
|
|
25
25
|
this.onLocationHashChanged.setValue(location.hash);
|
|
26
26
|
this.onLocationSearchChanged.setValue(location.search);
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @param key The search param key (e.g. ?search=1 -> search)
|
|
31
|
+
* @param defaultValue The default value if not provided
|
|
32
|
+
* @returns An observable with the current value (or default value) of the search param
|
|
33
|
+
*/
|
|
34
|
+
useSearchParam(key, defaultValue) {
|
|
35
|
+
const actualValue = this.tryGetValueFromSearch(key, location.search) ?? defaultValue;
|
|
36
|
+
if (!this.searchParamObservables.has(key)) {
|
|
37
|
+
const newObservable = new utils_1.ObservableValue(actualValue);
|
|
38
|
+
this.searchParamObservables.set(key, newObservable);
|
|
39
|
+
newObservable.subscribe((value) => {
|
|
40
|
+
const params = new URLSearchParams(location.search);
|
|
41
|
+
params.set(key, encodeURIComponent(JSON.stringify(value)));
|
|
42
|
+
history.pushState({}, '', `${location.pathname}?${params}`);
|
|
43
|
+
});
|
|
44
|
+
this.onLocationSearchChanged.subscribe((search) => {
|
|
45
|
+
const value = this.tryGetValueFromSearch(key, search) || defaultValue;
|
|
46
|
+
this.searchParamObservables.get(key)?.setValue(value);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return this.searchParamObservables.get(key);
|
|
50
|
+
}
|
|
28
51
|
constructor() {
|
|
29
52
|
/**
|
|
30
53
|
* Observable value that will be updated when the location pathname (e.g. /page/1) changes
|
|
@@ -38,6 +61,19 @@ let LocationService = class LocationService {
|
|
|
38
61
|
* Observable value that will be updated when the location search (e.g. ?search=1) changes
|
|
39
62
|
*/
|
|
40
63
|
this.onLocationSearchChanged = new utils_1.ObservableValue(location.search);
|
|
64
|
+
this.searchParamObservables = new Map();
|
|
65
|
+
this.tryGetValueFromSearch = (key, search) => {
|
|
66
|
+
try {
|
|
67
|
+
const params = new URLSearchParams(search);
|
|
68
|
+
if (params.has(key)) {
|
|
69
|
+
const value = params.get(key);
|
|
70
|
+
return value && JSON.parse(decodeURIComponent(value));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
/** ignore */
|
|
75
|
+
}
|
|
76
|
+
};
|
|
41
77
|
window.addEventListener('popstate', () => this.updateState());
|
|
42
78
|
window.addEventListener('hashchange', () => this.updateState());
|
|
43
79
|
this.pushStateTracer = utils_1.Trace.method({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,4CAAyD;AACzD,8CAA8C;AAEvC,IAAM,eAAe,GAArB,MAAM,eAAe;IACnB,OAAO;QACZ,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACxD,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QAC1D,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAA;QAC9B,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAA;QACjC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAA;IACtC,CAAC;IAiBM,WAAW;QAChB,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACtD,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACxD,CAAC;IAKD;
|
|
1
|
+
{"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"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"}
|
|
@@ -9,14 +9,14 @@ const _1 = require("./");
|
|
|
9
9
|
describe('LocationService', () => {
|
|
10
10
|
beforeEach(() => (document.body.innerHTML = '<div id="root"></div>'));
|
|
11
11
|
afterEach(() => (document.body.innerHTML = ''));
|
|
12
|
-
it('Shuld be constructed',
|
|
13
|
-
|
|
12
|
+
it('Shuld be constructed', () => {
|
|
13
|
+
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
14
14
|
const s = i.getInstance(_1.LocationService);
|
|
15
15
|
expect(s).toBeInstanceOf(_1.LocationService);
|
|
16
16
|
});
|
|
17
17
|
});
|
|
18
|
-
it('Shuld update state on events',
|
|
19
|
-
|
|
18
|
+
it('Shuld update state on events', () => {
|
|
19
|
+
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
20
20
|
const onLocaionChanged = jest.fn();
|
|
21
21
|
const s = i.getInstance(_1.LocationService);
|
|
22
22
|
s.onLocationPathChanged.subscribe(onLocaionChanged);
|
|
@@ -32,5 +32,63 @@ describe('LocationService', () => {
|
|
|
32
32
|
// expect(onLocaionChanged).toBeCalledTimes(4)
|
|
33
33
|
});
|
|
34
34
|
});
|
|
35
|
+
describe('useSearchParam', () => {
|
|
36
|
+
it('Should create observables lazily', () => {
|
|
37
|
+
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
38
|
+
const service = i.getInstance(_1.LocationService);
|
|
39
|
+
const observables = service.searchParamObservables;
|
|
40
|
+
const testSearchParam = service.useSearchParam('test', null);
|
|
41
|
+
expect(observables.size).toBe(1);
|
|
42
|
+
const testSearchParam2 = service.useSearchParam('test', null);
|
|
43
|
+
expect(observables.size).toBe(1);
|
|
44
|
+
expect(testSearchParam).toBe(testSearchParam2);
|
|
45
|
+
const testSearchParam3 = service.useSearchParam('test2', undefined);
|
|
46
|
+
expect(observables.size).toBe(2);
|
|
47
|
+
expect(testSearchParam3).not.toBe(testSearchParam2);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
it('Should return the default value, if not present in the query string', () => {
|
|
51
|
+
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
52
|
+
const service = i.getInstance(_1.LocationService);
|
|
53
|
+
const testSearchParam = service.useSearchParam('test', { value: 'foo' });
|
|
54
|
+
expect(testSearchParam.getValue()).toEqual({ value: 'foo' });
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
it('Should return a default value, if failed to parse the value from the query string', () => {
|
|
58
|
+
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
59
|
+
const service = i.getInstance(_1.LocationService);
|
|
60
|
+
history.pushState(null, '', '/loc1?test=invalidValue');
|
|
61
|
+
const testSearchParam = service.useSearchParam('test', { value: 'foo' });
|
|
62
|
+
expect(testSearchParam.getValue()).toEqual({ value: 'foo' });
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
it('Should return the value from the query string', () => {
|
|
66
|
+
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
67
|
+
const service = i.getInstance(_1.LocationService);
|
|
68
|
+
history.pushState(null, '', '/loc1?test=%25221%2522');
|
|
69
|
+
const testSearchParam = service.useSearchParam('test', 123);
|
|
70
|
+
expect(testSearchParam.getValue()).toBe('1');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
it('should update the observable value on push / replace states', () => {
|
|
74
|
+
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
75
|
+
const service = i.getInstance(_1.LocationService);
|
|
76
|
+
history.pushState(null, '', '/loc1?test=1');
|
|
77
|
+
const testSearchParam = service.useSearchParam('test', 234);
|
|
78
|
+
expect(testSearchParam.getValue()).toBe(1);
|
|
79
|
+
history.replaceState(null, '', '/loc1?test=2');
|
|
80
|
+
expect(testSearchParam.getValue()).toBe(2);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
it('Should update the URL based on search value change', () => {
|
|
84
|
+
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
85
|
+
const service = i.getInstance(_1.LocationService);
|
|
86
|
+
history.pushState(null, '', '/loc1?test=%25221%2522');
|
|
87
|
+
const testSearchParam = service.useSearchParam('test', '');
|
|
88
|
+
testSearchParam.setValue('2');
|
|
89
|
+
expect(location.search).toBe('?test=%25222%2522');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
35
93
|
});
|
|
36
94
|
//# sourceMappingURL=location-service.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location-service.spec.js","sourceRoot":"","sources":["../../src/services/location-service.spec.ts"],"names":[],"mappings":";;AAAA,+BAA+C;AAE/C,MAAM,CAAC,WAAW,GAAG,kBAAW,CAAA;AAChC,MAAM,CAAC,WAAW,GAAG,kBAAkB,CAAA;AAEvC,8CAA4C;AAC5C,
|
|
1
|
+
{"version":3,"file":"location-service.spec.js","sourceRoot":"","sources":["../../src/services/location-service.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/shade.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Shade = void 0;
|
|
4
|
+
const utils_1 = require("@furystack/utils");
|
|
4
5
|
const inject_1 = require("@furystack/inject");
|
|
5
6
|
const resource_manager_1 = require("./services/resource-manager");
|
|
7
|
+
const services_1 = require("./services");
|
|
6
8
|
/**
|
|
7
9
|
* Factory method for creating Shade components
|
|
8
10
|
*
|
|
@@ -34,6 +36,50 @@ const Shade = (o) => {
|
|
|
34
36
|
element: this,
|
|
35
37
|
useObservable: (key, obesrvable, callback, getLast) => this.resourceManager.useObservable(key, obesrvable, callback || (() => this.updateComponent()), getLast),
|
|
36
38
|
useState: (key, initialValue) => this.resourceManager.useState(key, initialValue, this.updateComponent.bind(this)),
|
|
39
|
+
useSearchState: (key, initialValue) => this.resourceManager.useObservable(`useSearchState-${key}`, this.injector.getInstance(services_1.LocationService).useSearchParam(key, initialValue), () => this.updateComponent()),
|
|
40
|
+
useStoredState: (key, initialValue, storageArea = localStorage) => {
|
|
41
|
+
const getFromStorage = () => {
|
|
42
|
+
const value = storageArea?.getItem(key);
|
|
43
|
+
return value ? JSON.parse(value) : initialValue;
|
|
44
|
+
};
|
|
45
|
+
const setToStorage = (value) => {
|
|
46
|
+
if (JSON.stringify(value) !== storageArea?.getItem(key)) {
|
|
47
|
+
const newValue = JSON.stringify(value);
|
|
48
|
+
storageArea?.setItem(key, newValue);
|
|
49
|
+
}
|
|
50
|
+
if (JSON.stringify(observable.getValue()) !== JSON.stringify(value)) {
|
|
51
|
+
observable.setValue(value);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const observable = this.resourceManager.useDisposable(`useStoredState-${key}`, () => new utils_1.ObservableValue(getFromStorage()));
|
|
55
|
+
const updateFromStorageEvent = (e) => {
|
|
56
|
+
e.key === key &&
|
|
57
|
+
e.storageArea === storageArea &&
|
|
58
|
+
setToStorage((e.newValue && JSON.parse(e.newValue)) || initialValue);
|
|
59
|
+
};
|
|
60
|
+
this.resourceManager.useDisposable(`useStoredState-${key}-storage-event`, () => {
|
|
61
|
+
window.addEventListener('storage', updateFromStorageEvent);
|
|
62
|
+
const channelName = `useStoredState-broadcast-channel`;
|
|
63
|
+
const messageChannel = new BroadcastChannel(channelName);
|
|
64
|
+
messageChannel.onmessage = (e) => {
|
|
65
|
+
if (e.data.key === key) {
|
|
66
|
+
setToStorage(e.data.value);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const subscription = observable.subscribe((value) => {
|
|
70
|
+
messageChannel.postMessage({ key, value });
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
dispose: () => {
|
|
74
|
+
window.removeEventListener('storage', updateFromStorageEvent);
|
|
75
|
+
subscription.dispose();
|
|
76
|
+
messageChannel.close();
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
observable.subscribe(setToStorage);
|
|
81
|
+
return this.resourceManager.useObservable(`useStoredState-${key}`, observable, () => this.updateComponent());
|
|
82
|
+
},
|
|
37
83
|
useDisposable: this.resourceManager.useDisposable.bind(this.resourceManager),
|
|
38
84
|
};
|
|
39
85
|
return renderOptions;
|
package/dist/shade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shade.js","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":";;;AACA,8CAA4C;AAE5C,kEAA6D;
|
|
1
|
+
{"version":3,"file":"shade.js","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/shades",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.1.0",
|
|
4
4
|
"description": "Google Authentication Provider for FuryStack",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"files": [
|
|
@@ -29,15 +29,15 @@
|
|
|
29
29
|
},
|
|
30
30
|
"homepage": "https://github.com/furystack/furystack",
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@types/jest": "^29.
|
|
32
|
+
"@types/jest": "^29.4.0",
|
|
33
33
|
"@types/jsdom": "^20.0.1",
|
|
34
34
|
"@types/node": "^18.11.18",
|
|
35
|
-
"jsdom": "^21.
|
|
35
|
+
"jsdom": "^21.1.0"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@furystack/core": "^11.2.
|
|
39
|
-
"@furystack/inject": "^7.1.
|
|
40
|
-
"@furystack/utils": "^3.1.
|
|
38
|
+
"@furystack/core": "^11.2.4",
|
|
39
|
+
"@furystack/inject": "^7.1.6",
|
|
40
|
+
"@furystack/utils": "^3.1.6",
|
|
41
41
|
"path-to-regexp": "^6.2.1",
|
|
42
42
|
"semaphore-async-await": "^1.5.1"
|
|
43
43
|
},
|
|
@@ -8,37 +8,59 @@ export type RenderOptions<TProps> = {
|
|
|
8
8
|
injector: Injector
|
|
9
9
|
children?: ChildrenList
|
|
10
10
|
element: JSX.Element<TProps>
|
|
11
|
+
/**
|
|
12
|
+
* Creates and disposes a resource after the component has been detached from the DOM
|
|
13
|
+
*
|
|
14
|
+
* @param key The key for caching the disposable resource
|
|
15
|
+
* @param factory A factory method for creating the disposable resource
|
|
16
|
+
* @returns The Disposable instance
|
|
17
|
+
*/
|
|
11
18
|
useDisposable: <T extends Disposable>(key: string, factory: () => T) => T
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @param key The key for caching the observable value
|
|
23
|
+
* @param observable The observable value to observe
|
|
24
|
+
* @param callback Optional callback for reacting to changes. If no callback provided, the component will re-render on change
|
|
25
|
+
* @param getLast An option to trigger the callback with the initial value
|
|
26
|
+
* @returns tuple with the current value and a setter function
|
|
27
|
+
*/
|
|
12
28
|
useObservable: <T>(
|
|
13
29
|
key: string,
|
|
14
30
|
observable: ObservableValue<T>,
|
|
15
|
-
|
|
31
|
+
onChange?: (newValue: T) => void,
|
|
16
32
|
getLast?: boolean,
|
|
17
33
|
) => [value: T, setValue: (newValue: T) => void]
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Creates a state object that will trigger a component re-render on change
|
|
37
|
+
*
|
|
38
|
+
* @param key The Key for caching the observable value
|
|
39
|
+
* @param initialValue The initial value for the observable
|
|
40
|
+
* @returns tuple with the current value and a setter function
|
|
41
|
+
*/
|
|
18
42
|
useState: <T>(key: string, initialValue: T) => [value: T, setValue: (newValue: T) => void]
|
|
19
|
-
}
|
|
20
43
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// * Update the current component state's multiple properties in one-shot
|
|
30
|
-
// *
|
|
31
|
-
// * @param newState The partial new state object
|
|
32
|
-
// * @param skipRender Option to skip the render process
|
|
33
|
-
// */
|
|
34
|
-
// updateState: (newState: PartialElement<TState>, skipRender?: boolean) => void
|
|
35
|
-
// /**
|
|
36
|
-
// * @param key The key on the state object
|
|
37
|
-
// * @returns A tuple with the value and the setter function
|
|
38
|
-
// */
|
|
39
|
-
// useState: <T extends keyof TState>(
|
|
40
|
-
// key: T,
|
|
41
|
-
// ) => [value: TState[T], setValue: (newValue: TState[T], skipRender?: boolean) => void]
|
|
42
|
-
// }
|
|
44
|
+
/**
|
|
45
|
+
* Creates a state object that will use a value from the search string of the current location. Triggers a component re-render on change
|
|
46
|
+
*
|
|
47
|
+
* @param key The Key for caching the observable value
|
|
48
|
+
* @param initialValue The initial value - if the value is not found in the search string
|
|
49
|
+
* @returns a tuple with the current value and a setter function
|
|
50
|
+
*/
|
|
51
|
+
useSearchState: <T>(key: string, initialValue: T) => [value: T, setValue: (newValue: T) => void]
|
|
43
52
|
|
|
44
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Creates a state object that will use a value from the storage area. Triggers a component re-render on change
|
|
55
|
+
*
|
|
56
|
+
* @param key The key in the storage area
|
|
57
|
+
* @param initialValue The initial value that will be used if the key is not found in the storage area
|
|
58
|
+
* @param storageArea The storage area to use
|
|
59
|
+
* @returns a tuple with the current value and a setter function
|
|
60
|
+
*/
|
|
61
|
+
useStoredState: <T>(
|
|
62
|
+
key: string,
|
|
63
|
+
initialValue: T,
|
|
64
|
+
storageArea?: Storage,
|
|
65
|
+
) => [value: T, setValue: (newValue: T) => void]
|
|
66
|
+
}
|
|
@@ -4,22 +4,22 @@ global.TextEncoder = TextEncoder
|
|
|
4
4
|
global.TextDecoder = TextDecoder as any
|
|
5
5
|
|
|
6
6
|
import { Injector } from '@furystack/inject'
|
|
7
|
-
import {
|
|
7
|
+
import { using } from '@furystack/utils'
|
|
8
8
|
import { LocationService } from './'
|
|
9
9
|
|
|
10
10
|
describe('LocationService', () => {
|
|
11
11
|
beforeEach(() => (document.body.innerHTML = '<div id="root"></div>'))
|
|
12
12
|
afterEach(() => (document.body.innerHTML = ''))
|
|
13
13
|
|
|
14
|
-
it('Shuld be constructed',
|
|
15
|
-
|
|
14
|
+
it('Shuld be constructed', () => {
|
|
15
|
+
using(new Injector(), (i) => {
|
|
16
16
|
const s = i.getInstance(LocationService)
|
|
17
17
|
expect(s).toBeInstanceOf(LocationService)
|
|
18
18
|
})
|
|
19
19
|
})
|
|
20
20
|
|
|
21
|
-
it('Shuld update state on events',
|
|
22
|
-
|
|
21
|
+
it('Shuld update state on events', () => {
|
|
22
|
+
using(new Injector(), (i) => {
|
|
23
23
|
const onLocaionChanged = jest.fn()
|
|
24
24
|
const s = i.getInstance(LocationService)
|
|
25
25
|
s.onLocationPathChanged.subscribe(onLocaionChanged)
|
|
@@ -36,4 +36,73 @@ describe('LocationService', () => {
|
|
|
36
36
|
// expect(onLocaionChanged).toBeCalledTimes(4)
|
|
37
37
|
})
|
|
38
38
|
})
|
|
39
|
+
|
|
40
|
+
describe('useSearchParam', () => {
|
|
41
|
+
it('Should create observables lazily', () => {
|
|
42
|
+
using(new Injector(), (i) => {
|
|
43
|
+
const service = i.getInstance(LocationService)
|
|
44
|
+
const observables = service.searchParamObservables
|
|
45
|
+
|
|
46
|
+
const testSearchParam = service.useSearchParam('test', null)
|
|
47
|
+
expect(observables.size).toBe(1)
|
|
48
|
+
|
|
49
|
+
const testSearchParam2 = service.useSearchParam('test', null)
|
|
50
|
+
expect(observables.size).toBe(1)
|
|
51
|
+
|
|
52
|
+
expect(testSearchParam).toBe(testSearchParam2)
|
|
53
|
+
|
|
54
|
+
const testSearchParam3 = service.useSearchParam('test2', undefined)
|
|
55
|
+
expect(observables.size).toBe(2)
|
|
56
|
+
|
|
57
|
+
expect(testSearchParam3).not.toBe(testSearchParam2)
|
|
58
|
+
})
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('Should return the default value, if not present in the query string', () => {
|
|
62
|
+
using(new Injector(), (i) => {
|
|
63
|
+
const service = i.getInstance(LocationService)
|
|
64
|
+
const testSearchParam = service.useSearchParam('test', { value: 'foo' })
|
|
65
|
+
expect(testSearchParam.getValue()).toEqual({ value: 'foo' })
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
it('Should return a default value, if failed to parse the value from the query string', () => {
|
|
70
|
+
using(new Injector(), (i) => {
|
|
71
|
+
const service = i.getInstance(LocationService)
|
|
72
|
+
history.pushState(null, '', '/loc1?test=invalidValue')
|
|
73
|
+
const testSearchParam = service.useSearchParam('test', { value: 'foo' })
|
|
74
|
+
expect(testSearchParam.getValue()).toEqual({ value: 'foo' })
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('Should return the value from the query string', () => {
|
|
79
|
+
using(new Injector(), (i) => {
|
|
80
|
+
const service = i.getInstance(LocationService)
|
|
81
|
+
history.pushState(null, '', '/loc1?test=%25221%2522')
|
|
82
|
+
const testSearchParam = service.useSearchParam('test', 123)
|
|
83
|
+
expect(testSearchParam.getValue()).toBe('1')
|
|
84
|
+
})
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('should update the observable value on push / replace states', () => {
|
|
88
|
+
using(new Injector(), (i) => {
|
|
89
|
+
const service = i.getInstance(LocationService)
|
|
90
|
+
history.pushState(null, '', '/loc1?test=1')
|
|
91
|
+
const testSearchParam = service.useSearchParam('test', 234)
|
|
92
|
+
expect(testSearchParam.getValue()).toBe(1)
|
|
93
|
+
history.replaceState(null, '', '/loc1?test=2')
|
|
94
|
+
expect(testSearchParam.getValue()).toBe(2)
|
|
95
|
+
})
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
it('Should update the URL based on search value change', () => {
|
|
99
|
+
using(new Injector(), (i) => {
|
|
100
|
+
const service = i.getInstance(LocationService)
|
|
101
|
+
history.pushState(null, '', '/loc1?test=%25221%2522')
|
|
102
|
+
const testSearchParam = service.useSearchParam('test', '')
|
|
103
|
+
testSearchParam.setValue('2')
|
|
104
|
+
expect(location.search).toBe('?test=%25222%2522')
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
})
|
|
39
108
|
})
|
|
@@ -32,6 +32,46 @@ export class LocationService implements Disposable {
|
|
|
32
32
|
this.onLocationSearchChanged.setValue(location.search)
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
public readonly searchParamObservables = new Map<string, ObservableValue<any>>()
|
|
36
|
+
|
|
37
|
+
private tryGetValueFromSearch = (key: string, search: string): any | undefined => {
|
|
38
|
+
try {
|
|
39
|
+
const params = new URLSearchParams(search)
|
|
40
|
+
if (params.has(key)) {
|
|
41
|
+
const value = params.get(key)
|
|
42
|
+
return value && JSON.parse(decodeURIComponent(value))
|
|
43
|
+
}
|
|
44
|
+
} catch (error) {
|
|
45
|
+
/** ignore */
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
* @param key The search param key (e.g. ?search=1 -> search)
|
|
52
|
+
* @param defaultValue The default value if not provided
|
|
53
|
+
* @returns An observable with the current value (or default value) of the search param
|
|
54
|
+
*/
|
|
55
|
+
public useSearchParam<T>(key: string, defaultValue: T) {
|
|
56
|
+
const actualValue = (this.tryGetValueFromSearch(key, location.search) as T) ?? defaultValue
|
|
57
|
+
if (!this.searchParamObservables.has(key)) {
|
|
58
|
+
const newObservable = new ObservableValue(actualValue)
|
|
59
|
+
this.searchParamObservables.set(key, newObservable)
|
|
60
|
+
|
|
61
|
+
newObservable.subscribe((value) => {
|
|
62
|
+
const params = new URLSearchParams(location.search)
|
|
63
|
+
params.set(key, encodeURIComponent(JSON.stringify(value)))
|
|
64
|
+
history.pushState({}, '', `${location.pathname}?${params}`)
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
this.onLocationSearchChanged.subscribe((search) => {
|
|
68
|
+
const value = this.tryGetValueFromSearch(key, search) || defaultValue
|
|
69
|
+
this.searchParamObservables.get(key)?.setValue(value as T)
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
return this.searchParamObservables.get(key) as ObservableValue<T>
|
|
73
|
+
}
|
|
74
|
+
|
|
35
75
|
private pushStateTracer: Disposable
|
|
36
76
|
private replaceStateTracer: Disposable
|
|
37
77
|
|
package/src/shade.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Disposable } from '@furystack/utils'
|
|
2
|
+
import { ObservableValue } from '@furystack/utils'
|
|
2
3
|
import { Injector } from '@furystack/inject'
|
|
3
4
|
import type { ChildrenList, RenderOptions } from './models'
|
|
4
5
|
import { ResourceManager } from './services/resource-manager'
|
|
6
|
+
import { LocationService } from './services'
|
|
5
7
|
|
|
6
8
|
export type ShadeOptions<TProps> = {
|
|
7
9
|
/**
|
|
@@ -95,6 +97,68 @@ export const Shade = <TProps>(o: ShadeOptions<TProps>) => {
|
|
|
95
97
|
this.resourceManager.useObservable(key, obesrvable, callback || (() => this.updateComponent()), getLast),
|
|
96
98
|
useState: (key, initialValue) =>
|
|
97
99
|
this.resourceManager.useState(key, initialValue, this.updateComponent.bind(this)),
|
|
100
|
+
useSearchState: (key, initialValue) =>
|
|
101
|
+
this.resourceManager.useObservable(
|
|
102
|
+
`useSearchState-${key}`,
|
|
103
|
+
this.injector.getInstance(LocationService).useSearchParam(key, initialValue),
|
|
104
|
+
() => this.updateComponent(),
|
|
105
|
+
),
|
|
106
|
+
|
|
107
|
+
useStoredState: <T>(key: string, initialValue: T, storageArea = localStorage) => {
|
|
108
|
+
const getFromStorage = () => {
|
|
109
|
+
const value = storageArea?.getItem(key)
|
|
110
|
+
return value ? JSON.parse(value) : initialValue
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const setToStorage = (value: T) => {
|
|
114
|
+
if (JSON.stringify(value) !== storageArea?.getItem(key)) {
|
|
115
|
+
const newValue = JSON.stringify(value)
|
|
116
|
+
storageArea?.setItem(key, newValue)
|
|
117
|
+
}
|
|
118
|
+
if (JSON.stringify(observable.getValue()) !== JSON.stringify(value)) {
|
|
119
|
+
observable.setValue(value)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const observable = this.resourceManager.useDisposable(
|
|
124
|
+
`useStoredState-${key}`,
|
|
125
|
+
() => new ObservableValue(getFromStorage()),
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
const updateFromStorageEvent = (e: StorageEvent) => {
|
|
129
|
+
e.key === key &&
|
|
130
|
+
e.storageArea === storageArea &&
|
|
131
|
+
setToStorage((e.newValue && JSON.parse(e.newValue)) || initialValue)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
this.resourceManager.useDisposable(`useStoredState-${key}-storage-event`, () => {
|
|
135
|
+
window.addEventListener('storage', updateFromStorageEvent)
|
|
136
|
+
const channelName = `useStoredState-broadcast-channel`
|
|
137
|
+
const messageChannel = new BroadcastChannel(channelName)
|
|
138
|
+
messageChannel.onmessage = (e) => {
|
|
139
|
+
if (e.data.key === key) {
|
|
140
|
+
setToStorage(e.data.value)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const subscription = observable.subscribe((value) => {
|
|
144
|
+
messageChannel.postMessage({ key, value })
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
dispose: () => {
|
|
149
|
+
window.removeEventListener('storage', updateFromStorageEvent)
|
|
150
|
+
subscription.dispose()
|
|
151
|
+
messageChannel.close()
|
|
152
|
+
},
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
observable.subscribe(setToStorage)
|
|
157
|
+
|
|
158
|
+
return this.resourceManager.useObservable(`useStoredState-${key}`, observable, () =>
|
|
159
|
+
this.updateComponent(),
|
|
160
|
+
)
|
|
161
|
+
},
|
|
98
162
|
useDisposable: this.resourceManager.useDisposable.bind(this.resourceManager),
|
|
99
163
|
}
|
|
100
164
|
|
|
@@ -6,8 +6,47 @@ export type RenderOptions<TProps> = {
|
|
|
6
6
|
injector: Injector;
|
|
7
7
|
children?: ChildrenList;
|
|
8
8
|
element: JSX.Element<TProps>;
|
|
9
|
+
/**
|
|
10
|
+
* Creates and disposes a resource after the component has been detached from the DOM
|
|
11
|
+
*
|
|
12
|
+
* @param key The key for caching the disposable resource
|
|
13
|
+
* @param factory A factory method for creating the disposable resource
|
|
14
|
+
* @returns The Disposable instance
|
|
15
|
+
*/
|
|
9
16
|
useDisposable: <T extends Disposable>(key: string, factory: () => T) => T;
|
|
10
|
-
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
* @param key The key for caching the observable value
|
|
20
|
+
* @param observable The observable value to observe
|
|
21
|
+
* @param callback Optional callback for reacting to changes. If no callback provided, the component will re-render on change
|
|
22
|
+
* @param getLast An option to trigger the callback with the initial value
|
|
23
|
+
* @returns tuple with the current value and a setter function
|
|
24
|
+
*/
|
|
25
|
+
useObservable: <T>(key: string, observable: ObservableValue<T>, onChange?: (newValue: T) => void, getLast?: boolean) => [value: T, setValue: (newValue: T) => void];
|
|
26
|
+
/**
|
|
27
|
+
* Creates a state object that will trigger a component re-render on change
|
|
28
|
+
*
|
|
29
|
+
* @param key The Key for caching the observable value
|
|
30
|
+
* @param initialValue The initial value for the observable
|
|
31
|
+
* @returns tuple with the current value and a setter function
|
|
32
|
+
*/
|
|
11
33
|
useState: <T>(key: string, initialValue: T) => [value: T, setValue: (newValue: T) => void];
|
|
34
|
+
/**
|
|
35
|
+
* Creates a state object that will use a value from the search string of the current location. Triggers a component re-render on change
|
|
36
|
+
*
|
|
37
|
+
* @param key The Key for caching the observable value
|
|
38
|
+
* @param initialValue The initial value - if the value is not found in the search string
|
|
39
|
+
* @returns a tuple with the current value and a setter function
|
|
40
|
+
*/
|
|
41
|
+
useSearchState: <T>(key: string, initialValue: T) => [value: T, setValue: (newValue: T) => void];
|
|
42
|
+
/**
|
|
43
|
+
* Creates a state object that will use a value from the storage area. Triggers a component re-render on change
|
|
44
|
+
*
|
|
45
|
+
* @param key The key in the storage area
|
|
46
|
+
* @param initialValue The initial value that will be used if the key is not found in the storage area
|
|
47
|
+
* @param storageArea The storage area to use
|
|
48
|
+
* @returns a tuple with the current value and a setter function
|
|
49
|
+
*/
|
|
50
|
+
useStoredState: <T>(key: string, initialValue: T, storageArea?: Storage) => [value: T, setValue: (newValue: T) => void];
|
|
12
51
|
};
|
|
13
52
|
//# sourceMappingURL=render-options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-options.d.ts","sourceRoot":"","sources":["../../src/models/render-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEnE,MAAM,MAAM,aAAa,CAAC,MAAM,IAAI;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IAEtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B,aAAa,EAAE,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"render-options.d.ts","sourceRoot":"","sources":["../../src/models/render-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEnE,MAAM,MAAM,aAAa,CAAC,MAAM,IAAI;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IAEtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B;;;;;;OAMG;IACH,aAAa,EAAE,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAEzE;;;;;;;OAOG;IACH,aAAa,EAAE,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EAChC,OAAO,CAAC,EAAE,OAAO,KACd,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;IAEhD;;;;;;OAMG;IACH,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;IAE1F;;;;;;OAMG;IACH,cAAc,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;IAEhG;;;;;;;OAOG;IACH,cAAc,EAAE,CAAC,CAAC,EAChB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,EACf,WAAW,CAAC,EAAE,OAAO,KAClB,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;CACjD,CAAA"}
|
|
@@ -15,6 +15,15 @@ export declare class LocationService implements Disposable {
|
|
|
15
15
|
*/
|
|
16
16
|
onLocationSearchChanged: ObservableValue<string>;
|
|
17
17
|
updateState(): void;
|
|
18
|
+
readonly searchParamObservables: Map<string, ObservableValue<any>>;
|
|
19
|
+
private tryGetValueFromSearch;
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @param key The search param key (e.g. ?search=1 -> search)
|
|
23
|
+
* @param defaultValue The default value if not provided
|
|
24
|
+
* @returns An observable with the current value (or default value) of the search param
|
|
25
|
+
*/
|
|
26
|
+
useSearchParam<T>(key: string, defaultValue: T): ObservableValue<T>;
|
|
18
27
|
private pushStateTracer;
|
|
19
28
|
private replaceStateTracer;
|
|
20
29
|
constructor();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location-service.d.ts","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAS,MAAM,kBAAkB,CAAA;AAEzD,qBACa,eAAgB,YAAW,UAAU;IACzC,OAAO;IAQd;;OAEG;IACI,qBAAqB,0BAAuD;IAEnF;;OAEG;IACI,qBAAqB,0BAAqC;IAEjE;;OAEG;IACI,uBAAuB,0BAAuC;IAE9D,WAAW;IAMlB,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,kBAAkB,CAAY;;CAoBvC"}
|
|
1
|
+
{"version":3,"file":"location-service.d.ts","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAS,MAAM,kBAAkB,CAAA;AAEzD,qBACa,eAAgB,YAAW,UAAU;IACzC,OAAO;IAQd;;OAEG;IACI,qBAAqB,0BAAuD;IAEnF;;OAEG;IACI,qBAAqB,0BAAqC;IAEjE;;OAEG;IACI,uBAAuB,0BAAuC;IAE9D,WAAW;IAMlB,SAAgB,sBAAsB,oCAA0C;IAEhF,OAAO,CAAC,qBAAqB,CAU5B;IAED;;;;;OAKG;IACI,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAoBrD,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,kBAAkB,CAAY;;CAoBvC"}
|
package/types/shade.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAGlD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAI3D,MAAM,MAAM,YAAY,CAAC,MAAM,IAAI;IACjC;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAEvE;;OAEG;IACH,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAC3B,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;IAE/E;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IAEnD;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IAEnD;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAA;CAC7D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,KAAK,kGA8MjB,CAAA"}
|