@furystack/shades 14.0.0 → 15.0.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/CHANGELOG.md +30 -0
- package/esm/compile-route.d.ts +5 -0
- package/esm/compile-route.d.ts.map +1 -1
- package/esm/compile-route.js +5 -0
- package/esm/compile-route.js.map +1 -1
- package/esm/component-factory.spec.d.ts.map +1 -1
- package/esm/component-factory.spec.js +2 -2
- package/esm/component-factory.spec.js.map +1 -1
- package/esm/components/nested-hooks.js +2 -2
- package/esm/components/nested-hooks.js.map +1 -1
- package/esm/components/nested-hooks.spec.js +14 -14
- package/esm/components/nested-hooks.spec.js.map +1 -1
- package/esm/components/nested-navigate.js +1 -1
- package/esm/components/nested-navigate.js.map +1 -1
- package/esm/components/nested-navigate.spec.js +16 -16
- package/esm/components/nested-navigate.spec.js.map +1 -1
- package/esm/components/nested-replace.js +1 -1
- package/esm/components/nested-replace.js.map +1 -1
- package/esm/components/nested-replace.spec.js +6 -6
- package/esm/components/nested-replace.spec.js.map +1 -1
- package/esm/components/nested-route-link.js +1 -1
- package/esm/components/nested-route-link.js.map +1 -1
- package/esm/components/nested-route-link.spec.js +8 -8
- package/esm/components/nested-route-link.spec.js.map +1 -1
- package/esm/components/nested-router.js +3 -3
- package/esm/components/nested-router.js.map +1 -1
- package/esm/components/nested-router.spec.js +24 -24
- package/esm/components/nested-router.spec.js.map +1 -1
- package/esm/css-generator.d.ts +9 -26
- package/esm/css-generator.d.ts.map +1 -1
- package/esm/css-generator.js +9 -26
- package/esm/css-generator.js.map +1 -1
- package/esm/css-generator.spec.js.map +1 -1
- package/esm/models/css-object.d.ts +3 -5
- package/esm/models/css-object.d.ts.map +1 -1
- package/esm/models/render-options.d.ts +16 -20
- package/esm/models/render-options.d.ts.map +1 -1
- package/esm/models/shade-component.d.ts +6 -4
- package/esm/models/shade-component.d.ts.map +1 -1
- package/esm/models/shade-component.js +3 -3
- package/esm/models/shade-component.js.map +1 -1
- package/esm/services/location-service.d.ts +39 -42
- package/esm/services/location-service.d.ts.map +1 -1
- package/esm/services/location-service.js +115 -134
- package/esm/services/location-service.js.map +1 -1
- package/esm/services/location-service.spec.js +32 -30
- package/esm/services/location-service.spec.js.map +1 -1
- package/esm/services/route-match-service.d.ts +3 -2
- package/esm/services/route-match-service.d.ts.map +1 -1
- package/esm/services/route-match-service.js +13 -22
- package/esm/services/route-match-service.js.map +1 -1
- package/esm/services/route-match-service.spec.js +40 -51
- package/esm/services/route-match-service.spec.js.map +1 -1
- package/esm/services/route-meta-utils.js.map +1 -1
- package/esm/services/route-meta-utils.spec.js +3 -3
- package/esm/services/route-meta-utils.spec.js.map +1 -1
- package/esm/services/screen-service.d.ts +13 -72
- package/esm/services/screen-service.d.ts.map +1 -1
- package/esm/services/screen-service.js +45 -137
- package/esm/services/screen-service.js.map +1 -1
- package/esm/services/screen-service.spec.js +19 -18
- package/esm/services/screen-service.spec.js.map +1 -1
- package/esm/services/spatial-navigation-service.d.ts +17 -39
- package/esm/services/spatial-navigation-service.d.ts.map +1 -1
- package/esm/services/spatial-navigation-service.js +280 -313
- package/esm/services/spatial-navigation-service.js.map +1 -1
- package/esm/services/spatial-navigation-service.spec.js +163 -158
- package/esm/services/spatial-navigation-service.spec.js.map +1 -1
- package/esm/shade-component.d.ts +14 -17
- package/esm/shade-component.d.ts.map +1 -1
- package/esm/shade-component.js +14 -17
- package/esm/shade-component.js.map +1 -1
- package/esm/shade.d.ts +18 -15
- package/esm/shade.d.ts.map +1 -1
- package/esm/shade.js +22 -32
- package/esm/shade.js.map +1 -1
- package/esm/style-manager.d.ts +8 -22
- package/esm/style-manager.d.ts.map +1 -1
- package/esm/style-manager.js +8 -22
- package/esm/style-manager.js.map +1 -1
- package/esm/styled-shade.d.ts +4 -7
- package/esm/styled-shade.d.ts.map +1 -1
- package/esm/styled-shade.js +4 -4
- package/esm/styled-shade.js.map +1 -1
- package/esm/view-transition.d.ts +10 -22
- package/esm/view-transition.d.ts.map +1 -1
- package/esm/view-transition.js +10 -22
- package/esm/view-transition.js.map +1 -1
- package/esm/vnode.js.map +1 -1
- package/esm/vnode.spec.js.map +1 -1
- package/package.json +9 -8
- package/src/compile-route.ts +5 -0
- package/src/component-factory.spec.tsx +3 -2
- package/src/components/nested-hooks.spec.ts +14 -14
- package/src/components/nested-hooks.ts +2 -2
- package/src/components/nested-navigate.spec.ts +17 -16
- package/src/components/nested-navigate.ts +1 -1
- package/src/components/nested-replace.spec.ts +7 -6
- package/src/components/nested-replace.ts +1 -1
- package/src/components/nested-route-link.spec.tsx +8 -8
- package/src/components/nested-route-link.tsx +1 -1
- package/src/components/nested-router.spec.tsx +24 -24
- package/src/components/nested-router.tsx +5 -5
- package/src/css-generator.spec.ts +1 -1
- package/src/css-generator.ts +9 -26
- package/src/models/css-object.ts +3 -5
- package/src/models/render-options.ts +17 -20
- package/src/models/shade-component.ts +6 -4
- package/src/services/location-service.spec.ts +35 -31
- package/src/services/location-service.tsx +156 -122
- package/src/services/route-match-service.spec.ts +41 -32
- package/src/services/route-match-service.ts +17 -8
- package/src/services/route-meta-utils.spec.ts +3 -3
- package/src/services/route-meta-utils.ts +1 -1
- package/src/services/screen-service.spec.ts +21 -20
- package/src/services/screen-service.ts +65 -110
- package/src/services/spatial-navigation-service.spec.ts +165 -160
- package/src/services/spatial-navigation-service.ts +299 -287
- package/src/shade-component.ts +14 -17
- package/src/shade.ts +31 -41
- package/src/style-manager.ts +9 -22
- package/src/styled-shade.ts +5 -8
- package/src/view-transition.ts +10 -22
- package/src/vnode.spec.ts +3 -3
- package/src/vnode.ts +2 -2
|
@@ -1,156 +1,137 @@
|
|
|
1
|
-
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
import { Injectable } from '@furystack/inject';
|
|
1
|
+
import { defineService } from '@furystack/inject';
|
|
11
2
|
import { deserializeQueryString as defaultDeserializeQueryString, serializeToQueryString as defaultSerializeToQueryString, } from '@furystack/rest';
|
|
12
3
|
import { ObservableValue } from '@furystack/utils';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
window.history.pushState
|
|
48
|
-
window.history.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
this.onLocationHashChanged.setValue(location.hash.replace('#', ''));
|
|
73
|
-
this.onLocationSearchChanged.setValue(location.search);
|
|
74
|
-
}).bind(this);
|
|
75
|
-
/**
|
|
76
|
-
* Navigate to a path. Use this instead of raw history.pushState for SPA routing.
|
|
77
|
-
* The LocationService interceptor ensures routing state is updated correctly.
|
|
78
|
-
*/
|
|
79
|
-
navigate(path) {
|
|
80
|
-
// eslint-disable-next-line furystack/prefer-location-service -- This IS the LocationService.navigate() implementation.
|
|
81
|
-
history.pushState(null, '', path);
|
|
82
|
-
this.updateState();
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Replace the current history entry with a new path. Use this instead of
|
|
86
|
-
* raw history.replaceState for SPA redirects (e.g. the intermediate URL
|
|
87
|
-
* should not appear in the browser's back/forward stack).
|
|
88
|
-
*/
|
|
89
|
-
replace(path) {
|
|
90
|
-
// eslint-disable-next-line furystack/prefer-location-service -- This IS the LocationService.replace() implementation.
|
|
91
|
-
history.replaceState(null, '', path);
|
|
92
|
-
this.updateState();
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Internal cache of per-key search parameter observables created by {@link useSearchParam}.
|
|
96
|
-
*/
|
|
97
|
-
searchParamObservables = new Map();
|
|
98
|
-
/**
|
|
99
|
-
* Gets or creates an observable for a search parameter
|
|
100
|
-
* @param key The search param key (e.g. ?search=1 -> search)
|
|
101
|
-
* @param defaultValue The default value if not provided
|
|
102
|
-
* @returns An observable with the current value (or default value) of the search param
|
|
103
|
-
*/
|
|
104
|
-
useSearchParam(key, defaultValue) {
|
|
105
|
-
const existing = this.searchParamObservables.get(key);
|
|
106
|
-
if (!existing) {
|
|
107
|
-
const currentDeserialized = this.onDeserializedLocationSearchChanged.getValue();
|
|
4
|
+
export const LocationServiceSettings = defineService({
|
|
5
|
+
name: '@furystack/shades/LocationServiceSettings',
|
|
6
|
+
lifetime: 'singleton',
|
|
7
|
+
factory: () => ({
|
|
8
|
+
serialize: defaultSerializeToQueryString,
|
|
9
|
+
deserialize: defaultDeserializeQueryString,
|
|
10
|
+
}),
|
|
11
|
+
});
|
|
12
|
+
export const LocationService = defineService({
|
|
13
|
+
name: '@furystack/shades/LocationService',
|
|
14
|
+
lifetime: 'singleton',
|
|
15
|
+
factory: ({ inject, onDispose }) => {
|
|
16
|
+
const { serialize, deserialize } = inject(LocationServiceSettings);
|
|
17
|
+
const onLocationPathChanged = new ObservableValue(new URL(location.href).pathname);
|
|
18
|
+
const onLocationHashChanged = new ObservableValue(location.hash.replace('#', ''));
|
|
19
|
+
const onLocationSearchChanged = new ObservableValue(location.search);
|
|
20
|
+
const onDeserializedLocationSearchChanged = new ObservableValue(deserialize(location.search));
|
|
21
|
+
const searchParamObservables = new Map();
|
|
22
|
+
const updateState = () => {
|
|
23
|
+
onLocationPathChanged.setValue(location.pathname);
|
|
24
|
+
onLocationHashChanged.setValue(location.hash.replace('#', ''));
|
|
25
|
+
onLocationSearchChanged.setValue(location.search);
|
|
26
|
+
};
|
|
27
|
+
const locationDeserializerObserver = onLocationSearchChanged.subscribe((search) => {
|
|
28
|
+
onDeserializedLocationSearchChanged.setValue(deserialize(search));
|
|
29
|
+
});
|
|
30
|
+
const popStateListener = (_ev) => {
|
|
31
|
+
updateState();
|
|
32
|
+
};
|
|
33
|
+
const hashChangeListener = (_ev) => {
|
|
34
|
+
updateState();
|
|
35
|
+
};
|
|
36
|
+
window.addEventListener('popstate', popStateListener);
|
|
37
|
+
window.addEventListener('hashchange', hashChangeListener);
|
|
38
|
+
const originalPushState = window.history.pushState.bind(window.history);
|
|
39
|
+
window.history.pushState = (...args) => {
|
|
40
|
+
originalPushState(...args);
|
|
41
|
+
updateState();
|
|
42
|
+
};
|
|
43
|
+
const originalReplaceState = window.history.replaceState.bind(window.history);
|
|
44
|
+
window.history.replaceState = (...args) => {
|
|
45
|
+
originalReplaceState(...args);
|
|
46
|
+
updateState();
|
|
47
|
+
};
|
|
48
|
+
const navigate = (path) => {
|
|
49
|
+
// eslint-disable-next-line furystack/prefer-location-service -- This IS the LocationService.navigate() implementation.
|
|
50
|
+
history.pushState(null, '', path);
|
|
51
|
+
updateState();
|
|
52
|
+
};
|
|
53
|
+
const replace = (path) => {
|
|
54
|
+
// eslint-disable-next-line furystack/prefer-location-service -- This IS the LocationService.replace() implementation.
|
|
55
|
+
history.replaceState(null, '', path);
|
|
56
|
+
updateState();
|
|
57
|
+
};
|
|
58
|
+
const useSearchParam = (key, defaultValue) => {
|
|
59
|
+
const existing = searchParamObservables.get(key);
|
|
60
|
+
if (existing)
|
|
61
|
+
return existing;
|
|
62
|
+
const currentDeserialized = onDeserializedLocationSearchChanged.getValue();
|
|
108
63
|
const actualValue = Object.prototype.hasOwnProperty.call(currentDeserialized, key)
|
|
109
64
|
? currentDeserialized[key]
|
|
110
65
|
: defaultValue;
|
|
111
66
|
const newObservable = new ObservableValue(actualValue);
|
|
112
|
-
|
|
67
|
+
searchParamObservables.set(key, newObservable);
|
|
113
68
|
newObservable.subscribe((value) => {
|
|
114
|
-
const currentQueryStringObject =
|
|
69
|
+
const currentQueryStringObject = onDeserializedLocationSearchChanged.getValue();
|
|
115
70
|
if (currentQueryStringObject[key] !== value) {
|
|
116
|
-
const params =
|
|
71
|
+
const params = serialize({ ...currentQueryStringObject, [key]: value });
|
|
117
72
|
const newUrl = `${location.pathname}?${params}`;
|
|
118
73
|
// eslint-disable-next-line furystack/prefer-location-service -- Internal LocationService plumbing for search param sync.
|
|
119
74
|
history.pushState({}, '', newUrl);
|
|
120
75
|
}
|
|
121
76
|
});
|
|
122
|
-
|
|
77
|
+
onDeserializedLocationSearchChanged.subscribe((search) => {
|
|
123
78
|
const value = search[key] ?? defaultValue;
|
|
124
|
-
|
|
79
|
+
searchParamObservables.get(key)?.setValue(value);
|
|
125
80
|
});
|
|
126
81
|
return newObservable;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
82
|
+
};
|
|
83
|
+
onDispose(() => {
|
|
84
|
+
window.removeEventListener('popstate', popStateListener);
|
|
85
|
+
window.removeEventListener('hashchange', hashChangeListener);
|
|
86
|
+
window.history.pushState = originalPushState;
|
|
87
|
+
window.history.replaceState = originalReplaceState;
|
|
88
|
+
locationDeserializerObserver[Symbol.dispose]();
|
|
89
|
+
// eslint-disable-next-line furystack/prefer-using-wrapper -- Disposal is deferred to the injector's onDispose hook.
|
|
90
|
+
onLocationSearchChanged[Symbol.dispose]();
|
|
91
|
+
// eslint-disable-next-line furystack/prefer-using-wrapper -- Disposal is deferred to the injector's onDispose hook.
|
|
92
|
+
onDeserializedLocationSearchChanged[Symbol.dispose]();
|
|
93
|
+
// eslint-disable-next-line furystack/prefer-using-wrapper -- Disposal is deferred to the injector's onDispose hook.
|
|
94
|
+
onLocationPathChanged[Symbol.dispose]();
|
|
95
|
+
// eslint-disable-next-line furystack/prefer-using-wrapper -- Disposal is deferred to the injector's onDispose hook.
|
|
96
|
+
onLocationHashChanged[Symbol.dispose]();
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
deserializeQueryString: deserialize,
|
|
100
|
+
onLocationPathChanged,
|
|
101
|
+
onLocationHashChanged,
|
|
102
|
+
onLocationSearchChanged,
|
|
103
|
+
onDeserializedLocationSearchChanged,
|
|
104
|
+
searchParamObservables,
|
|
105
|
+
updateState,
|
|
106
|
+
navigate,
|
|
107
|
+
replace,
|
|
108
|
+
useSearchParam,
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
});
|
|
142
112
|
/**
|
|
143
|
-
* Configures custom serialization for URL search state
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
113
|
+
* Configures custom (de)serialization for URL search state by binding
|
|
114
|
+
* {@link LocationServiceSettings} on the given injector.
|
|
115
|
+
*
|
|
116
|
+
* Must be called **before** any consumer resolves {@link LocationService}:
|
|
117
|
+
* the service patches `history.pushState` / `history.replaceState` and
|
|
118
|
+
* subscribes to `popstate` / `hashchange` on construction, and those
|
|
119
|
+
* listeners are only torn down when the owning injector is disposed.
|
|
120
|
+
* Rebinding after the first resolution would leak the previous instance,
|
|
121
|
+
* so this helper throws loudly if that happens.
|
|
122
|
+
*
|
|
123
|
+
* @param injector The root injector.
|
|
124
|
+
* @param serialize Function to serialize state to a query string.
|
|
125
|
+
* @param deserialize Function to deserialize a query string to state.
|
|
126
|
+
* @throws If {@link LocationService} has already been resolved on
|
|
127
|
+
* `injector` (or any reachable ancestor).
|
|
148
128
|
*/
|
|
149
129
|
export const useCustomSearchStateSerializer = (injector, serialize, deserialize) => {
|
|
150
|
-
if (injector.
|
|
151
|
-
throw new Error('useCustomSearchStateSerializer must be called before
|
|
130
|
+
if (injector.isResolved(LocationService)) {
|
|
131
|
+
throw new Error('useCustomSearchStateSerializer must be called before LocationService is resolved for the first time. ' +
|
|
132
|
+
'Configure serializers during injector bootstrap (e.g. before the first render).');
|
|
152
133
|
}
|
|
153
|
-
|
|
154
|
-
injector.
|
|
134
|
+
injector.bind(LocationServiceSettings, () => ({ serialize, deserialize }));
|
|
135
|
+
injector.invalidate(LocationServiceSettings);
|
|
155
136
|
};
|
|
156
137
|
//# sourceMappingURL=location-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createInjector } from '@furystack/inject';
|
|
2
2
|
import { deserializeQueryString, serializeToQueryString, serializeValue } from '@furystack/rest';
|
|
3
3
|
import { usingAsync } from '@furystack/utils';
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
@@ -11,15 +11,16 @@ describe('LocationService', () => {
|
|
|
11
11
|
document.body.innerHTML = '';
|
|
12
12
|
});
|
|
13
13
|
it('Shuld be constructed', async () => {
|
|
14
|
-
await usingAsync(
|
|
15
|
-
const s = i.
|
|
16
|
-
expect(s).
|
|
14
|
+
await usingAsync(createInjector(), async (i) => {
|
|
15
|
+
const s = i.get(LocationService);
|
|
16
|
+
expect(s).toBeDefined();
|
|
17
|
+
expect(typeof s.navigate).toBe('function');
|
|
17
18
|
});
|
|
18
19
|
});
|
|
19
20
|
it('Shuld update state on events', async () => {
|
|
20
|
-
await usingAsync(
|
|
21
|
+
await usingAsync(createInjector(), async (i) => {
|
|
21
22
|
const onLocaionChanged = vi.fn();
|
|
22
|
-
const s = i.
|
|
23
|
+
const s = i.get(LocationService);
|
|
23
24
|
s.onLocationPathChanged.subscribe(onLocaionChanged);
|
|
24
25
|
expect(onLocaionChanged).toBeCalledTimes(0);
|
|
25
26
|
history.pushState(null, '', '/loc1');
|
|
@@ -34,9 +35,9 @@ describe('LocationService', () => {
|
|
|
34
35
|
});
|
|
35
36
|
});
|
|
36
37
|
it('Should update location path when navigate is called', async () => {
|
|
37
|
-
await usingAsync(
|
|
38
|
+
await usingAsync(createInjector(), async (i) => {
|
|
38
39
|
const onLocationChanged = vi.fn();
|
|
39
|
-
const s = i.
|
|
40
|
+
const s = i.get(LocationService);
|
|
40
41
|
s.onLocationPathChanged.subscribe(onLocationChanged);
|
|
41
42
|
s.navigate('/dashboard');
|
|
42
43
|
expect(s.onLocationPathChanged.getValue()).toBe('/dashboard');
|
|
@@ -45,8 +46,8 @@ describe('LocationService', () => {
|
|
|
45
46
|
});
|
|
46
47
|
describe('replace', () => {
|
|
47
48
|
it('Should update the observable path without pushing a new history entry', async () => {
|
|
48
|
-
await usingAsync(
|
|
49
|
-
const s = i.
|
|
49
|
+
await usingAsync(createInjector(), async (i) => {
|
|
50
|
+
const s = i.get(LocationService);
|
|
50
51
|
const lengthBefore = history.length;
|
|
51
52
|
s.replace('/replaced');
|
|
52
53
|
expect(s.onLocationPathChanged.getValue()).toBe('/replaced');
|
|
@@ -54,8 +55,8 @@ describe('LocationService', () => {
|
|
|
54
55
|
});
|
|
55
56
|
});
|
|
56
57
|
it('Should call history.replaceState rather than pushState', async () => {
|
|
57
|
-
await usingAsync(
|
|
58
|
-
const s = i.
|
|
58
|
+
await usingAsync(createInjector(), async (i) => {
|
|
59
|
+
const s = i.get(LocationService);
|
|
59
60
|
const pushSpy = vi.spyOn(history, 'pushState');
|
|
60
61
|
const replaceSpy = vi.spyOn(history, 'replaceState');
|
|
61
62
|
s.replace('/replaced-2');
|
|
@@ -67,8 +68,8 @@ describe('LocationService', () => {
|
|
|
67
68
|
});
|
|
68
69
|
});
|
|
69
70
|
it('Should notify path subscribers after replace', async () => {
|
|
70
|
-
await usingAsync(
|
|
71
|
-
const s = i.
|
|
71
|
+
await usingAsync(createInjector(), async (i) => {
|
|
72
|
+
const s = i.get(LocationService);
|
|
72
73
|
const onLocationChanged = vi.fn();
|
|
73
74
|
s.onLocationPathChanged.subscribe(onLocationChanged);
|
|
74
75
|
s.replace('/notify');
|
|
@@ -78,8 +79,8 @@ describe('LocationService', () => {
|
|
|
78
79
|
});
|
|
79
80
|
describe('useSearchParam', () => {
|
|
80
81
|
it('Should create observables lazily', async () => {
|
|
81
|
-
await usingAsync(
|
|
82
|
-
const service = i.
|
|
82
|
+
await usingAsync(createInjector(), async (i) => {
|
|
83
|
+
const service = i.get(LocationService);
|
|
83
84
|
const observables = service.searchParamObservables;
|
|
84
85
|
const testSearchParam = service.useSearchParam('test', null);
|
|
85
86
|
expect(observables.size).toBe(1);
|
|
@@ -92,23 +93,23 @@ describe('LocationService', () => {
|
|
|
92
93
|
});
|
|
93
94
|
});
|
|
94
95
|
it('Should return the default value, if not present in the query string', async () => {
|
|
95
|
-
await usingAsync(
|
|
96
|
-
const service = i.
|
|
96
|
+
await usingAsync(createInjector(), async (i) => {
|
|
97
|
+
const service = i.get(LocationService);
|
|
97
98
|
const testSearchParam = service.useSearchParam('test', { value: 'foo' });
|
|
98
99
|
expect(testSearchParam.getValue()).toEqual({ value: 'foo' });
|
|
99
100
|
});
|
|
100
101
|
});
|
|
101
102
|
it('Should return the value from the query string', async () => {
|
|
102
|
-
await usingAsync(
|
|
103
|
-
const service = i.
|
|
103
|
+
await usingAsync(createInjector(), async (i) => {
|
|
104
|
+
const service = i.get(LocationService);
|
|
104
105
|
history.pushState(null, '', `/loc1?test=${serializeValue(1)}`);
|
|
105
106
|
const testSearchParam = service.useSearchParam('test', 123);
|
|
106
107
|
expect(testSearchParam.getValue()).toBe(1);
|
|
107
108
|
});
|
|
108
109
|
});
|
|
109
110
|
it('should update the observable value on push / replace states', async () => {
|
|
110
|
-
await usingAsync(
|
|
111
|
-
const service = i.
|
|
111
|
+
await usingAsync(createInjector(), async (i) => {
|
|
112
|
+
const service = i.get(LocationService);
|
|
112
113
|
history.pushState(null, '', `/loc1?test=${serializeValue(1)}`);
|
|
113
114
|
const testSearchParam = service.useSearchParam('test', 234);
|
|
114
115
|
expect(testSearchParam.getValue()).toBe(1);
|
|
@@ -117,28 +118,29 @@ describe('LocationService', () => {
|
|
|
117
118
|
});
|
|
118
119
|
});
|
|
119
120
|
it('Should update the URL based on search value change', async () => {
|
|
120
|
-
await usingAsync(
|
|
121
|
-
const service = i.
|
|
121
|
+
await usingAsync(createInjector(), async (i) => {
|
|
122
|
+
const service = i.get(LocationService);
|
|
122
123
|
history.pushState(null, '', `/loc1?test=${serializeValue('2')}`);
|
|
123
124
|
const testSearchParam = service.useSearchParam('test', '');
|
|
124
125
|
testSearchParam.setValue('2');
|
|
125
126
|
expect(location.search).toBe('?test=IjIi');
|
|
126
127
|
});
|
|
127
128
|
});
|
|
128
|
-
it('Should throw
|
|
129
|
-
await usingAsync(
|
|
129
|
+
it('Should throw when called after LocationService has been resolved', async () => {
|
|
130
|
+
await usingAsync(createInjector(), async (i) => {
|
|
130
131
|
const customSerializer = vi.fn((value) => serializeToQueryString(value));
|
|
131
132
|
const customDeserializer = vi.fn((value) => deserializeQueryString(value));
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
// Eagerly resolve once so the service patches history / adds listeners.
|
|
134
|
+
i.get(LocationService);
|
|
135
|
+
expect(() => useCustomSearchStateSerializer(i, customSerializer, customDeserializer)).toThrow(/before LocationService is resolved/);
|
|
134
136
|
});
|
|
135
137
|
});
|
|
136
138
|
it('Should use custom serializer and deserializer', async () => {
|
|
137
|
-
await usingAsync(
|
|
139
|
+
await usingAsync(createInjector(), async (i) => {
|
|
138
140
|
const customSerializer = vi.fn((value) => serializeToQueryString(value));
|
|
139
141
|
const customDeserializer = vi.fn((value) => deserializeQueryString(value));
|
|
140
142
|
useCustomSearchStateSerializer(i, customSerializer, customDeserializer);
|
|
141
|
-
const locationService = i.
|
|
143
|
+
const locationService = i.get(LocationService);
|
|
142
144
|
const testSearchParam = locationService.useSearchParam('test', { value: 'foo' });
|
|
143
145
|
testSearchParam.setValue({ value: 'bar' });
|
|
144
146
|
expect(customSerializer).toBeCalledWith({ test: { value: 'bar' } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location-service.spec.js","sourceRoot":"","sources":["../../src/services/location-service.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"location-service.spec.js","sourceRoot":"","sources":["../../src/services/location-service.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Token } from '@furystack/inject';
|
|
1
2
|
import { ObservableValue } from '@furystack/utils';
|
|
2
3
|
import type { MatchChainEntry } from '../components/nested-router.js';
|
|
3
4
|
/**
|
|
@@ -5,8 +6,8 @@ import type { MatchChainEntry } from '../components/nested-router.js';
|
|
|
5
6
|
* NestedRouter as an observable. Consumers (breadcrumbs, document title,
|
|
6
7
|
* navigation trees) subscribe to this instead of re-running route matching.
|
|
7
8
|
*/
|
|
8
|
-
export
|
|
9
|
+
export interface RouteMatchService {
|
|
9
10
|
readonly currentMatchChain: ObservableValue<MatchChainEntry[]>;
|
|
10
|
-
[Symbol.dispose](): void;
|
|
11
11
|
}
|
|
12
|
+
export declare const RouteMatchService: Token<RouteMatchService, 'singleton'>;
|
|
12
13
|
//# sourceMappingURL=route-match-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-match-service.d.ts","sourceRoot":"","sources":["../../src/services/route-match-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route-match-service.d.ts","sourceRoot":"","sources":["../../src/services/route-match-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAErE;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,iBAAiB,EAAE,eAAe,CAAC,eAAe,EAAE,CAAC,CAAA;CAC/D;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,WAAW,CAWlE,CAAA"}
|
|
@@ -1,24 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
import { Injectable } from '@furystack/inject';
|
|
1
|
+
import { defineService } from '@furystack/inject';
|
|
8
2
|
import { ObservableValue } from '@furystack/utils';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
Injectable({ lifetime: 'singleton' })
|
|
22
|
-
], RouteMatchService);
|
|
23
|
-
export { RouteMatchService };
|
|
3
|
+
export const RouteMatchService = defineService({
|
|
4
|
+
name: '@furystack/shades/RouteMatchService',
|
|
5
|
+
lifetime: 'singleton',
|
|
6
|
+
factory: ({ onDispose }) => {
|
|
7
|
+
const currentMatchChain = new ObservableValue([]);
|
|
8
|
+
onDispose(() => {
|
|
9
|
+
// eslint-disable-next-line furystack/prefer-using-wrapper -- Disposal is deferred to the injector's onDispose hook.
|
|
10
|
+
currentMatchChain[Symbol.dispose]();
|
|
11
|
+
});
|
|
12
|
+
return { currentMatchChain };
|
|
13
|
+
},
|
|
14
|
+
});
|
|
24
15
|
//# sourceMappingURL=route-match-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-match-service.js","sourceRoot":"","sources":["../../src/services/route-match-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"route-match-service.js","sourceRoot":"","sources":["../../src/services/route-match-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAYlD,MAAM,CAAC,MAAM,iBAAiB,GAA0C,aAAa,CAAC;IACpF,IAAI,EAAE,qCAAqC;IAC3C,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;QACzB,MAAM,iBAAiB,GAAG,IAAI,eAAe,CAAoB,EAAE,CAAC,CAAA;QACpE,SAAS,CAAC,GAAG,EAAE;YACb,oHAAoH;YACpH,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QACrC,CAAC,CAAC,CAAA;QACF,OAAO,EAAE,iBAAiB,EAAE,CAAA;IAC9B,CAAC;CACF,CAAC,CAAA"}
|