@furystack/shades 7.1.0 → 7.1.2

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.
@@ -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.tryGetValueFromSearch(key, location.search) ?? defaultValue;
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 = new URLSearchParams(location.search);
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.onLocationSearchChanged.subscribe((search) => {
45
- const value = this.tryGetValueFromSearch(key, search) || defaultValue;
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":"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"}
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=%25221%2522');
60
+ history.pushState(null, '', '/loc1?test=1');
69
61
  const testSearchParam = service.useSearchParam('test', 123);
70
- expect(testSearchParam.getValue()).toBe('1');
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=%25221%2522');
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=%25222%2522');
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.0",
3
+ "version": "7.1.2",
4
4
  "description": "Google Authentication Provider for FuryStack",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -30,13 +30,14 @@
30
30
  "homepage": "https://github.com/furystack/furystack",
31
31
  "devDependencies": {
32
32
  "@types/jest": "^29.4.0",
33
- "@types/jsdom": "^20.0.1",
34
- "@types/node": "^18.11.18",
33
+ "@types/jsdom": "^21.1.0",
34
+ "@types/node": "^18.13.0",
35
35
  "jsdom": "^21.1.0"
36
36
  },
37
37
  "dependencies": {
38
- "@furystack/core": "^11.2.4",
38
+ "@furystack/core": "^11.2.5",
39
39
  "@furystack/inject": "^7.1.6",
40
+ "@furystack/rest": "^4.1.9",
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=%25221%2522')
72
+ history.pushState(null, '', '/loc1?test=1')
82
73
  const testSearchParam = service.useSearchParam('test', 123)
83
- expect(testSearchParam.getValue()).toBe('1')
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=%25221%2522')
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=%25222%2522')
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.tryGetValueFromSearch(key, location.search) as T) ?? defaultValue
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 = new URLSearchParams(location.search)
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.onLocationSearchChanged.subscribe((search) => {
68
- const value = this.tryGetValueFromSearch(key, search) || defaultValue
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;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"}
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"}