@furystack/shades 7.1.0 → 7.1.1
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/services/location-service.js +12 -17
- package/dist/services/location-service.js.map +1 -1
- package/dist/services/location-service.spec.js +4 -12
- package/dist/services/location-service.spec.js.map +1 -1
- package/package.json +2 -1
- package/src/services/location-service.spec.ts +4 -13
- package/src/services/location-service.tsx +17 -18
- package/types/services/location-service.d.ts +2 -1
- package/types/services/location-service.d.ts.map +1 -1
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.LocationService = void 0;
|
|
13
13
|
const utils_1 = require("@furystack/utils");
|
|
14
14
|
const inject_1 = require("@furystack/inject");
|
|
15
|
+
const rest_1 = require("@furystack/rest");
|
|
15
16
|
let LocationService = class LocationService {
|
|
16
17
|
dispose() {
|
|
17
18
|
window.removeEventListener('popstate', this.updateState);
|
|
@@ -19,6 +20,9 @@ let LocationService = class LocationService {
|
|
|
19
20
|
this.pushStateTracer.dispose();
|
|
20
21
|
this.replaceStateTracer.dispose();
|
|
21
22
|
this.onLocationPathChanged.dispose();
|
|
23
|
+
this.onLocationSearchChanged.dispose();
|
|
24
|
+
this.onDeserializedLocationSearchChanged.dispose();
|
|
25
|
+
this.locationDeserializerObserver.dispose();
|
|
22
26
|
}
|
|
23
27
|
updateState() {
|
|
24
28
|
this.onLocationPathChanged.setValue(location.pathname);
|
|
@@ -32,17 +36,16 @@ let LocationService = class LocationService {
|
|
|
32
36
|
* @returns An observable with the current value (or default value) of the search param
|
|
33
37
|
*/
|
|
34
38
|
useSearchParam(key, defaultValue) {
|
|
35
|
-
const actualValue = this.
|
|
39
|
+
const actualValue = this.onDeserializedLocationSearchChanged.getValue()[key] ?? defaultValue;
|
|
36
40
|
if (!this.searchParamObservables.has(key)) {
|
|
37
41
|
const newObservable = new utils_1.ObservableValue(actualValue);
|
|
38
42
|
this.searchParamObservables.set(key, newObservable);
|
|
39
43
|
newObservable.subscribe((value) => {
|
|
40
|
-
const params =
|
|
41
|
-
params.set(key, encodeURIComponent(JSON.stringify(value)));
|
|
44
|
+
const params = (0, rest_1.serializeToQueryString)({ ...(0, rest_1.deserializeQueryString)(location.search), [key]: value });
|
|
42
45
|
history.pushState({}, '', `${location.pathname}?${params}`);
|
|
43
46
|
});
|
|
44
|
-
this.
|
|
45
|
-
const value =
|
|
47
|
+
this.onDeserializedLocationSearchChanged.subscribe((search) => {
|
|
48
|
+
const value = search[key] ?? defaultValue;
|
|
46
49
|
this.searchParamObservables.get(key)?.setValue(value);
|
|
47
50
|
});
|
|
48
51
|
}
|
|
@@ -61,19 +64,11 @@ let LocationService = class LocationService {
|
|
|
61
64
|
* Observable value that will be updated when the location search (e.g. ?search=1) changes
|
|
62
65
|
*/
|
|
63
66
|
this.onLocationSearchChanged = new utils_1.ObservableValue(location.search);
|
|
67
|
+
this.onDeserializedLocationSearchChanged = new utils_1.ObservableValue((0, rest_1.deserializeQueryString)(this.onLocationSearchChanged.getValue()));
|
|
68
|
+
this.locationDeserializerObserver = this.onLocationSearchChanged.subscribe((search) => {
|
|
69
|
+
this.onDeserializedLocationSearchChanged.setValue((0, rest_1.deserializeQueryString)(search));
|
|
70
|
+
});
|
|
64
71
|
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
|
-
};
|
|
77
72
|
window.addEventListener('popstate', () => this.updateState());
|
|
78
73
|
window.addEventListener('hashchange', () => this.updateState());
|
|
79
74
|
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;
|
|
1
|
+
{"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"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"}
|
|
@@ -54,20 +54,12 @@ describe('LocationService', () => {
|
|
|
54
54
|
expect(testSearchParam.getValue()).toEqual({ value: 'foo' });
|
|
55
55
|
});
|
|
56
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
57
|
it('Should return the value from the query string', () => {
|
|
66
58
|
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
67
59
|
const service = i.getInstance(_1.LocationService);
|
|
68
|
-
history.pushState(null, '', '/loc1?test
|
|
60
|
+
history.pushState(null, '', '/loc1?test=1');
|
|
69
61
|
const testSearchParam = service.useSearchParam('test', 123);
|
|
70
|
-
expect(testSearchParam.getValue()).toBe(
|
|
62
|
+
expect(testSearchParam.getValue()).toBe(1);
|
|
71
63
|
});
|
|
72
64
|
});
|
|
73
65
|
it('should update the observable value on push / replace states', () => {
|
|
@@ -83,10 +75,10 @@ describe('LocationService', () => {
|
|
|
83
75
|
it('Should update the URL based on search value change', () => {
|
|
84
76
|
(0, utils_1.using)(new inject_1.Injector(), (i) => {
|
|
85
77
|
const service = i.getInstance(_1.LocationService);
|
|
86
|
-
history.pushState(null, '', '/loc1?test
|
|
78
|
+
history.pushState(null, '', '/loc1?test=2');
|
|
87
79
|
const testSearchParam = service.useSearchParam('test', '');
|
|
88
80
|
testSearchParam.setValue('2');
|
|
89
|
-
expect(location.search).toBe('?test
|
|
81
|
+
expect(location.search).toBe('?test=2');
|
|
90
82
|
});
|
|
91
83
|
});
|
|
92
84
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location-service.spec.js","sourceRoot":"","sources":["../../src/services/location-service.spec.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"location-service.spec.js","sourceRoot":"","sources":["../../src/services/location-service.spec.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.1.
|
|
3
|
+
"version": "7.1.1",
|
|
4
4
|
"description": "Google Authentication Provider for FuryStack",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"files": [
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@furystack/core": "^11.2.4",
|
|
39
39
|
"@furystack/inject": "^7.1.6",
|
|
40
|
+
"@furystack/rest": "^4.1.8",
|
|
40
41
|
"@furystack/utils": "^3.1.6",
|
|
41
42
|
"path-to-regexp": "^6.2.1",
|
|
42
43
|
"semaphore-async-await": "^1.5.1"
|
|
@@ -66,21 +66,12 @@ describe('LocationService', () => {
|
|
|
66
66
|
})
|
|
67
67
|
})
|
|
68
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
69
|
it('Should return the value from the query string', () => {
|
|
79
70
|
using(new Injector(), (i) => {
|
|
80
71
|
const service = i.getInstance(LocationService)
|
|
81
|
-
history.pushState(null, '', '/loc1?test
|
|
72
|
+
history.pushState(null, '', '/loc1?test=1')
|
|
82
73
|
const testSearchParam = service.useSearchParam('test', 123)
|
|
83
|
-
expect(testSearchParam.getValue()).toBe(
|
|
74
|
+
expect(testSearchParam.getValue()).toBe(1)
|
|
84
75
|
})
|
|
85
76
|
})
|
|
86
77
|
|
|
@@ -98,10 +89,10 @@ describe('LocationService', () => {
|
|
|
98
89
|
it('Should update the URL based on search value change', () => {
|
|
99
90
|
using(new Injector(), (i) => {
|
|
100
91
|
const service = i.getInstance(LocationService)
|
|
101
|
-
history.pushState(null, '', '/loc1?test
|
|
92
|
+
history.pushState(null, '', '/loc1?test=2')
|
|
102
93
|
const testSearchParam = service.useSearchParam('test', '')
|
|
103
94
|
testSearchParam.setValue('2')
|
|
104
|
-
expect(location.search).toBe('?test
|
|
95
|
+
expect(location.search).toBe('?test=2')
|
|
105
96
|
})
|
|
106
97
|
})
|
|
107
98
|
})
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Disposable } from '@furystack/utils'
|
|
2
2
|
import { ObservableValue, Trace } from '@furystack/utils'
|
|
3
3
|
import { Injectable } from '@furystack/inject'
|
|
4
|
+
import { deserializeQueryString, serializeToQueryString } from '@furystack/rest'
|
|
4
5
|
@Injectable({ lifetime: 'singleton' })
|
|
5
6
|
export class LocationService implements Disposable {
|
|
6
7
|
public dispose() {
|
|
@@ -9,6 +10,9 @@ export class LocationService implements Disposable {
|
|
|
9
10
|
this.pushStateTracer.dispose()
|
|
10
11
|
this.replaceStateTracer.dispose()
|
|
11
12
|
this.onLocationPathChanged.dispose()
|
|
13
|
+
this.onLocationSearchChanged.dispose()
|
|
14
|
+
this.onDeserializedLocationSearchChanged.dispose()
|
|
15
|
+
this.locationDeserializerObserver.dispose()
|
|
12
16
|
}
|
|
13
17
|
|
|
14
18
|
/**
|
|
@@ -24,7 +28,15 @@ export class LocationService implements Disposable {
|
|
|
24
28
|
/**
|
|
25
29
|
* Observable value that will be updated when the location search (e.g. ?search=1) changes
|
|
26
30
|
*/
|
|
27
|
-
public onLocationSearchChanged = new ObservableValue(location.search)
|
|
31
|
+
public onLocationSearchChanged = new ObservableValue<string>(location.search)
|
|
32
|
+
|
|
33
|
+
public onDeserializedLocationSearchChanged = new ObservableValue(
|
|
34
|
+
deserializeQueryString(this.onLocationSearchChanged.getValue()),
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
public locationDeserializerObserver = this.onLocationSearchChanged.subscribe((search) => {
|
|
38
|
+
this.onDeserializedLocationSearchChanged.setValue(deserializeQueryString(search))
|
|
39
|
+
})
|
|
28
40
|
|
|
29
41
|
public updateState() {
|
|
30
42
|
this.onLocationPathChanged.setValue(location.pathname)
|
|
@@ -34,18 +46,6 @@ export class LocationService implements Disposable {
|
|
|
34
46
|
|
|
35
47
|
public readonly searchParamObservables = new Map<string, ObservableValue<any>>()
|
|
36
48
|
|
|
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
49
|
/**
|
|
50
50
|
*
|
|
51
51
|
* @param key The search param key (e.g. ?search=1 -> search)
|
|
@@ -53,19 +53,18 @@ export class LocationService implements Disposable {
|
|
|
53
53
|
* @returns An observable with the current value (or default value) of the search param
|
|
54
54
|
*/
|
|
55
55
|
public useSearchParam<T>(key: string, defaultValue: T) {
|
|
56
|
-
const actualValue = (this.
|
|
56
|
+
const actualValue = (this.onDeserializedLocationSearchChanged.getValue()[key] as T) ?? defaultValue
|
|
57
57
|
if (!this.searchParamObservables.has(key)) {
|
|
58
58
|
const newObservable = new ObservableValue(actualValue)
|
|
59
59
|
this.searchParamObservables.set(key, newObservable)
|
|
60
60
|
|
|
61
61
|
newObservable.subscribe((value) => {
|
|
62
|
-
const params =
|
|
63
|
-
params.set(key, encodeURIComponent(JSON.stringify(value)))
|
|
62
|
+
const params = serializeToQueryString({ ...deserializeQueryString(location.search), [key]: value })
|
|
64
63
|
history.pushState({}, '', `${location.pathname}?${params}`)
|
|
65
64
|
})
|
|
66
65
|
|
|
67
|
-
this.
|
|
68
|
-
const value =
|
|
66
|
+
this.onDeserializedLocationSearchChanged.subscribe((search) => {
|
|
67
|
+
const value = (search[key] as T) ?? defaultValue
|
|
69
68
|
this.searchParamObservables.get(key)?.setValue(value as T)
|
|
70
69
|
})
|
|
71
70
|
}
|
|
@@ -14,9 +14,10 @@ export declare class LocationService implements Disposable {
|
|
|
14
14
|
* Observable value that will be updated when the location search (e.g. ?search=1) changes
|
|
15
15
|
*/
|
|
16
16
|
onLocationSearchChanged: ObservableValue<string>;
|
|
17
|
+
onDeserializedLocationSearchChanged: ObservableValue<any>;
|
|
18
|
+
locationDeserializerObserver: import("@furystack/utils").ValueObserver<string>;
|
|
17
19
|
updateState(): void;
|
|
18
20
|
readonly searchParamObservables: Map<string, ObservableValue<any>>;
|
|
19
|
-
private tryGetValueFromSearch;
|
|
20
21
|
/**
|
|
21
22
|
*
|
|
22
23
|
* @param key The search param key (e.g. ?search=1 -> search)
|
|
@@ -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;
|
|
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;AAGzD,qBACa,eAAgB,YAAW,UAAU;IACzC,OAAO;IAWd;;OAEG;IACI,qBAAqB,0BAAuD;IAEnF;;OAEG;IACI,qBAAqB,0BAAqC;IAEjE;;OAEG;IACI,uBAAuB,0BAA+C;IAEtE,mCAAmC,uBAEzC;IAEM,4BAA4B,mDAEjC;IAEK,WAAW;IAMlB,SAAgB,sBAAsB,oCAA0C;IAEhF;;;;;OAKG;IACI,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAmBrD,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,kBAAkB,CAAY;;CAoBvC"}
|