@furystack/shades 8.0.10 → 8.0.12
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/esm/component-factory.spec.d.ts +2 -0
- package/esm/component-factory.spec.d.ts.map +1 -0
- package/esm/component-factory.spec.js +80 -0
- package/esm/component-factory.spec.js.map +1 -0
- package/esm/components/lazy-load.spec.d.ts +2 -0
- package/esm/components/lazy-load.spec.d.ts.map +1 -0
- package/esm/components/lazy-load.spec.js +76 -0
- package/esm/components/lazy-load.spec.js.map +1 -0
- package/esm/components/route-link.spec.d.ts +2 -0
- package/esm/components/route-link.spec.d.ts.map +1 -0
- package/esm/components/route-link.spec.js +33 -0
- package/esm/components/route-link.spec.js.map +1 -0
- package/esm/components/router.spec.d.ts +2 -0
- package/esm/components/router.spec.d.ts.map +1 -0
- package/esm/components/router.spec.js +89 -0
- package/esm/components/router.spec.js.map +1 -0
- package/esm/services/location-service.js +21 -18
- package/esm/services/location-service.js.map +1 -1
- package/esm/services/location-service.spec.d.ts +2 -0
- package/esm/services/location-service.spec.d.ts.map +1 -0
- package/esm/services/location-service.spec.js +90 -0
- package/esm/services/location-service.spec.js.map +1 -0
- package/esm/services/resource-manager.js +21 -23
- package/esm/services/resource-manager.js.map +1 -1
- package/esm/services/resource-manager.spec.d.ts +2 -0
- package/esm/services/resource-manager.spec.d.ts.map +1 -0
- package/esm/services/resource-manager.spec.js +31 -0
- package/esm/services/resource-manager.spec.js.map +1 -0
- package/esm/services/screen-service.js +32 -31
- package/esm/services/screen-service.js.map +1 -1
- package/esm/services/screen-service.spec.d.ts +2 -0
- package/esm/services/screen-service.spec.d.ts.map +1 -0
- package/esm/services/screen-service.spec.js +28 -0
- package/esm/services/screen-service.spec.js.map +1 -0
- package/esm/shade-resources.integration.spec.d.ts +2 -0
- package/esm/shade-resources.integration.spec.d.ts.map +1 -0
- package/esm/shade-resources.integration.spec.js +58 -0
- package/esm/shade-resources.integration.spec.js.map +1 -0
- package/esm/shade.js +80 -74
- package/esm/shade.js.map +1 -1
- package/esm/shades.integration.spec.d.ts +2 -0
- package/esm/shades.integration.spec.d.ts.map +1 -0
- package/esm/shades.integration.spec.js +254 -0
- package/esm/shades.integration.spec.js.map +1 -0
- package/package.json +8 -8
- package/src/component-factory.spec.tsx +2 -2
- package/src/components/lazy-load.spec.tsx +4 -2
- package/src/components/route-link.spec.tsx +4 -2
- package/src/components/router.spec.tsx +5 -3
- package/src/services/location-service.spec.ts +1 -1
- package/src/services/resource-manager.spec.ts +1 -1
- package/src/services/screen-service.spec.ts +1 -1
- package/src/shade-resources.integration.spec.tsx +3 -3
- package/src/shades.integration.spec.tsx +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-factory.spec.d.ts","sourceRoot":"","sources":["../src/component-factory.spec.tsx"],"names":[],"mappings":"AACA,OAAO,OAAO,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { createComponent } from './shade-component.js';
|
|
2
|
+
import './jsx';
|
|
3
|
+
import { Shade } from './shade.js';
|
|
4
|
+
import { Injector } from '@furystack/inject';
|
|
5
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
6
|
+
describe('Shades Component Factory', () => {
|
|
7
|
+
describe('HTML Elements', () => {
|
|
8
|
+
it('Should create a simple component', () => {
|
|
9
|
+
const component = createComponent("div", null, "test");
|
|
10
|
+
expect(component).toBeInstanceOf(HTMLDivElement);
|
|
11
|
+
expect(component.innerHTML).toBe('test');
|
|
12
|
+
expect(component.outerHTML).toBe('<div>test</div>');
|
|
13
|
+
});
|
|
14
|
+
it('Should apply styles', () => {
|
|
15
|
+
const component = createComponent("div", { style: { color: 'red' } }, "a");
|
|
16
|
+
expect(component).toBeInstanceOf(HTMLDivElement);
|
|
17
|
+
expect(component.style.color).toBe('red');
|
|
18
|
+
});
|
|
19
|
+
it('Should apply data attributes', () => {
|
|
20
|
+
const component = createComponent("div", { "data-testid": "asd-123" }, "a");
|
|
21
|
+
expect(component).toBeInstanceOf(HTMLDivElement);
|
|
22
|
+
expect(component.getAttribute('data-testid')).toBe('asd-123');
|
|
23
|
+
});
|
|
24
|
+
it('Should create a nested component', () => {
|
|
25
|
+
const component = (createComponent("div", { style: { display: 'flex' } },
|
|
26
|
+
createComponent("h1", null, "Hi, I'm a header"),
|
|
27
|
+
createComponent("p", null,
|
|
28
|
+
"paragraph... ",
|
|
29
|
+
['a', 'b', 'c']),
|
|
30
|
+
createComponent("a", { target: "_blank", href: "https://google.com" }, "link")));
|
|
31
|
+
expect(component).toBeInstanceOf(HTMLDivElement);
|
|
32
|
+
expect(component.childElementCount).toBe(3);
|
|
33
|
+
expect(component.innerHTML).toBe(`<h1>Hi, I'm a header</h1><p>paragraph... abc</p><a target="_blank" href="https://google.com">link</a>`);
|
|
34
|
+
});
|
|
35
|
+
it('Should attach listeners', () => {
|
|
36
|
+
const onclick = vi.fn();
|
|
37
|
+
const component = createComponent("div", { onclick: onclick });
|
|
38
|
+
expect(component.onclick).toBe(onclick);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('Shade components', () => {
|
|
42
|
+
it('Should render a basic component', () => {
|
|
43
|
+
const Example = Shade({ shadowDomName: 'example-basic', render: () => createComponent("div", null) });
|
|
44
|
+
const component = (createComponent("div", null,
|
|
45
|
+
createComponent(Example, null)));
|
|
46
|
+
const shade = component.firstElementChild;
|
|
47
|
+
expect(shade.props).toEqual({});
|
|
48
|
+
expect(shade.shadeChildren).toEqual([]);
|
|
49
|
+
});
|
|
50
|
+
it('Should render a component with props', () => {
|
|
51
|
+
const Example = Shade({
|
|
52
|
+
shadowDomName: 'example-with-props',
|
|
53
|
+
render: ({ props }) => createComponent("div", null, props.foo),
|
|
54
|
+
});
|
|
55
|
+
const component = (createComponent("div", null,
|
|
56
|
+
createComponent(Example, { foo: "example", injector: new Injector() })));
|
|
57
|
+
const shade = component.firstElementChild;
|
|
58
|
+
shade.callConstructed();
|
|
59
|
+
expect(shade.props.foo).toEqual('example');
|
|
60
|
+
expect(shade.shadeChildren).toEqual([]);
|
|
61
|
+
expect(shade.innerHTML).toBe('<div>example</div>');
|
|
62
|
+
});
|
|
63
|
+
it('Should render a component with state', () => {
|
|
64
|
+
const Example = Shade({
|
|
65
|
+
shadowDomName: 'example-with-state',
|
|
66
|
+
render: ({ useState }) => {
|
|
67
|
+
useState('foo', 'example');
|
|
68
|
+
return createComponent("div", null);
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
const component = (createComponent("div", null,
|
|
72
|
+
createComponent(Example, { injector: new Injector() })));
|
|
73
|
+
const shade = component.firstElementChild;
|
|
74
|
+
shade.callConstructed();
|
|
75
|
+
expect(shade.resourceManager.stateObservers.get('foo')?.getValue()).toEqual('example');
|
|
76
|
+
expect(shade.shadeChildren).toEqual([]);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=component-factory.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-factory.spec.js","sourceRoot":"","sources":["../src/component-factory.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-load.spec.d.ts","sourceRoot":"","sources":["../../src/components/lazy-load.spec.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { TextEncoder, TextDecoder } from 'util';
|
|
2
|
+
global.TextEncoder = TextEncoder;
|
|
3
|
+
global.TextDecoder = TextDecoder;
|
|
4
|
+
import { Injector } from '@furystack/inject';
|
|
5
|
+
import { sleepAsync } from '@furystack/utils';
|
|
6
|
+
import { LazyLoad } from './lazy-load.js';
|
|
7
|
+
import { describe, it, expect, vi, afterEach, beforeEach } from 'vitest';
|
|
8
|
+
import { initializeShadeRoot } from '../initialize.js';
|
|
9
|
+
import { createComponent } from '../shade-component.js';
|
|
10
|
+
describe('Lazy Load', () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
document.body.innerHTML = '<div id="root"></div>';
|
|
13
|
+
});
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
document.body.innerHTML = '';
|
|
16
|
+
});
|
|
17
|
+
it('Shuld display the loader and completed state', async () => {
|
|
18
|
+
const injector = new Injector();
|
|
19
|
+
const rootElement = document.getElementById('root');
|
|
20
|
+
initializeShadeRoot({
|
|
21
|
+
injector,
|
|
22
|
+
rootElement,
|
|
23
|
+
jsxElement: (createComponent(LazyLoad, { loader: createComponent("div", null, "Loading..."), component: async () => {
|
|
24
|
+
await sleepAsync(100);
|
|
25
|
+
return createComponent("div", null, "Loaded");
|
|
26
|
+
} })),
|
|
27
|
+
});
|
|
28
|
+
expect(document.body.innerHTML).toBe('<div id="root"><lazy-load><div>Loading...</div></lazy-load></div>');
|
|
29
|
+
await sleepAsync(150);
|
|
30
|
+
expect(document.body.innerHTML).toBe('<div id="root"><lazy-load><div>Loaded</div></lazy-load></div>');
|
|
31
|
+
});
|
|
32
|
+
it('Shuld display the failed state with a retryer', async () => {
|
|
33
|
+
const injector = new Injector();
|
|
34
|
+
const rootElement = document.getElementById('root');
|
|
35
|
+
const load = vi.fn(async () => {
|
|
36
|
+
throw Error(':(');
|
|
37
|
+
});
|
|
38
|
+
initializeShadeRoot({
|
|
39
|
+
injector,
|
|
40
|
+
rootElement,
|
|
41
|
+
jsxElement: (createComponent(LazyLoad, { loader: createComponent("div", null, "Loading..."), component: load, error: (e, retry) => (createComponent("button", { id: "retry", onclick: retry }, e.message)) })),
|
|
42
|
+
});
|
|
43
|
+
expect(document.body.innerHTML).toBe('<div id="root"><lazy-load><div>Loading...</div></lazy-load></div>');
|
|
44
|
+
await sleepAsync(1);
|
|
45
|
+
expect(load).toBeCalledTimes(1);
|
|
46
|
+
expect(document.body.innerHTML).toBe('<div id="root"><lazy-load><button id="retry">:(</button></lazy-load></div>');
|
|
47
|
+
document.getElementById('retry')?.click();
|
|
48
|
+
expect(load).toBeCalledTimes(2);
|
|
49
|
+
});
|
|
50
|
+
it('Shuld display the failed state with a retryer', async () => {
|
|
51
|
+
const injector = new Injector();
|
|
52
|
+
const rootElement = document.getElementById('root');
|
|
53
|
+
let counter = 0;
|
|
54
|
+
const load = vi.fn(async () => {
|
|
55
|
+
if (!counter) {
|
|
56
|
+
counter += 1;
|
|
57
|
+
throw Error(':(');
|
|
58
|
+
}
|
|
59
|
+
return createComponent("div", null, "success");
|
|
60
|
+
});
|
|
61
|
+
initializeShadeRoot({
|
|
62
|
+
injector,
|
|
63
|
+
rootElement,
|
|
64
|
+
jsxElement: (createComponent(LazyLoad, { loader: createComponent("div", null, "Loading..."), component: load, error: (e, retry) => (createComponent("button", { id: "retry", onclick: retry }, e.message)) })),
|
|
65
|
+
});
|
|
66
|
+
expect(document.body.innerHTML).toBe('<div id="root"><lazy-load><div>Loading...</div></lazy-load></div>');
|
|
67
|
+
await sleepAsync(1);
|
|
68
|
+
expect(load).toBeCalledTimes(1);
|
|
69
|
+
expect(document.body.innerHTML).toBe('<div id="root"><lazy-load><button id="retry">:(</button></lazy-load></div>');
|
|
70
|
+
document.getElementById('retry')?.click();
|
|
71
|
+
expect(load).toBeCalledTimes(2);
|
|
72
|
+
await sleepAsync(1);
|
|
73
|
+
expect(document.body.innerHTML).toBe('<div id="root"><lazy-load><div>success</div></lazy-load></div>');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=lazy-load.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-load.spec.js","sourceRoot":"","sources":["../../src/components/lazy-load.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-link.spec.d.ts","sourceRoot":"","sources":["../../src/components/route-link.spec.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { TextEncoder, TextDecoder } from 'util';
|
|
2
|
+
global.TextEncoder = TextEncoder;
|
|
3
|
+
global.TextDecoder = TextDecoder;
|
|
4
|
+
import { Injector } from '@furystack/inject';
|
|
5
|
+
import { RouteLink } from './route-link.js';
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { LocationService } from '../services/location-service.js';
|
|
8
|
+
import { initializeShadeRoot } from '../initialize.js';
|
|
9
|
+
import { createComponent } from '../shade-component.js';
|
|
10
|
+
describe('RouteLink', () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
document.body.innerHTML = '<div id="root"></div>';
|
|
13
|
+
});
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
document.body.innerHTML = '';
|
|
16
|
+
});
|
|
17
|
+
it('Shuld display the loader and completed state', async () => {
|
|
18
|
+
const injector = new Injector();
|
|
19
|
+
const rootElement = document.getElementById('root');
|
|
20
|
+
const onRouteChange = vi.fn();
|
|
21
|
+
injector.getInstance(LocationService).onLocationPathChanged.subscribe(onRouteChange);
|
|
22
|
+
initializeShadeRoot({
|
|
23
|
+
injector,
|
|
24
|
+
rootElement,
|
|
25
|
+
jsxElement: (createComponent(RouteLink, { id: "route", href: "/subroute" }, "Link")),
|
|
26
|
+
});
|
|
27
|
+
expect(document.body.innerHTML).toBe('<div id="root"><a is="route-link" id="route" href="/subroute" style="text-decoration: inherit;">Link</a></div>');
|
|
28
|
+
expect(onRouteChange).not.toBeCalled();
|
|
29
|
+
document.getElementById('route')?.click();
|
|
30
|
+
expect(onRouteChange).toBeCalledTimes(1);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=route-link.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-link.spec.js","sourceRoot":"","sources":["../../src/components/route-link.spec.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAE/C,MAAM,CAAC,WAAW,GAAG,WAAW,CAAA;AAChC,MAAM,CAAC,WAAW,GAAG,WAAkB,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,uBAAuB,CAAA;IACnD,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAmB,CAAA;QAErE,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAE7B,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QAEpF,mBAAmB,CAAC;YAClB,QAAQ;YACR,WAAW;YACX,UAAU,EAAE,CACV,gBAAC,SAAS,IAAC,EAAE,EAAC,OAAO,EAAC,IAAI,EAAC,WAAW,WAE1B,CACb;SACF,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAClC,gHAAgH,CACjH,CAAA;QACD,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;QACtC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAA;QACzC,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.spec.d.ts","sourceRoot":"","sources":["../../src/components/router.spec.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { TextEncoder, TextDecoder } from 'util';
|
|
2
|
+
global.TextEncoder = TextEncoder;
|
|
3
|
+
global.TextDecoder = TextDecoder;
|
|
4
|
+
import { Injector } from '@furystack/inject';
|
|
5
|
+
import { Router } from './router.js';
|
|
6
|
+
import { RouteLink } from './route-link.js';
|
|
7
|
+
import { sleepAsync } from '@furystack/utils';
|
|
8
|
+
import { describe, it, expect, vi, afterEach, beforeEach } from 'vitest';
|
|
9
|
+
import { LocationService } from '../services/location-service.js';
|
|
10
|
+
import { initializeShadeRoot } from '../initialize.js';
|
|
11
|
+
import { createComponent } from '../shade-component.js';
|
|
12
|
+
describe('Router', () => {
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
document.body.innerHTML = '<div id="root"></div>';
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
document.body.innerHTML = '';
|
|
18
|
+
});
|
|
19
|
+
it('Shuld display the loader and completed state', async () => {
|
|
20
|
+
history.pushState(null, '', '/');
|
|
21
|
+
const onVisit = vi.fn();
|
|
22
|
+
const onLeave = vi.fn();
|
|
23
|
+
const onLastLeave = vi.fn();
|
|
24
|
+
const injector = new Injector();
|
|
25
|
+
const rootElement = document.getElementById('root');
|
|
26
|
+
const onRouteChange = vi.fn();
|
|
27
|
+
injector.getInstance(LocationService).onLocationPathChanged.subscribe(onRouteChange);
|
|
28
|
+
initializeShadeRoot({
|
|
29
|
+
injector,
|
|
30
|
+
rootElement,
|
|
31
|
+
jsxElement: (createComponent("div", null,
|
|
32
|
+
createComponent(RouteLink, { id: "home", href: "/" }, "home"),
|
|
33
|
+
createComponent(RouteLink, { id: "a", href: "/route-a" }, "a"),
|
|
34
|
+
createComponent(RouteLink, { id: "b", href: "/route-b" }, "b"),
|
|
35
|
+
createComponent(RouteLink, { id: "b-with-id", href: "/route-b/123" }, "b-with-id"),
|
|
36
|
+
createComponent(RouteLink, { id: "c", href: "/route-c" }, "c"),
|
|
37
|
+
createComponent(RouteLink, { id: "x", href: "/route-x" }, "x"),
|
|
38
|
+
createComponent(Router, { routes: [
|
|
39
|
+
{ url: '/route-a', component: () => createComponent("div", { id: "content" }, "route-a"), onVisit, onLeave },
|
|
40
|
+
{ url: '/route-b/:id?', component: ({ match }) => createComponent("div", { id: "content" },
|
|
41
|
+
"route-b",
|
|
42
|
+
match.params.id) },
|
|
43
|
+
{
|
|
44
|
+
url: '/route-c',
|
|
45
|
+
component: () => createComponent("div", { id: "content" }, "route-c"),
|
|
46
|
+
onLeave: onLastLeave,
|
|
47
|
+
},
|
|
48
|
+
{ url: '/', component: () => createComponent("div", { id: "content" }, "home") },
|
|
49
|
+
], notFound: createComponent("div", { id: "content" }, "not found") }))),
|
|
50
|
+
});
|
|
51
|
+
const getContent = () => document.getElementById('content')?.innerHTML;
|
|
52
|
+
const getLocation = () => location.pathname;
|
|
53
|
+
const clickOn = (name) => document.getElementById(name)?.click();
|
|
54
|
+
await sleepAsync(100);
|
|
55
|
+
expect(getLocation()).toBe('/');
|
|
56
|
+
expect(getContent()).toBe('home');
|
|
57
|
+
expect(onVisit).not.toBeCalled();
|
|
58
|
+
clickOn('a');
|
|
59
|
+
await sleepAsync(100);
|
|
60
|
+
expect(getContent()).toBe('route-a');
|
|
61
|
+
expect(getLocation()).toBe('/route-a');
|
|
62
|
+
expect(onRouteChange).toBeCalledTimes(1);
|
|
63
|
+
expect(onVisit).toBeCalledTimes(1);
|
|
64
|
+
clickOn('a');
|
|
65
|
+
await sleepAsync(100);
|
|
66
|
+
expect(onVisit).toBeCalledTimes(1);
|
|
67
|
+
expect(onLeave).not.toBeCalled();
|
|
68
|
+
clickOn('b');
|
|
69
|
+
await sleepAsync(100);
|
|
70
|
+
expect(onLeave).toBeCalledTimes(1);
|
|
71
|
+
expect(getContent()).toBe('route-b');
|
|
72
|
+
expect(getLocation()).toBe('/route-b');
|
|
73
|
+
clickOn('b-with-id');
|
|
74
|
+
await sleepAsync(100);
|
|
75
|
+
expect(getContent()).toBe('route-b123');
|
|
76
|
+
expect(getLocation()).toBe('/route-b/123');
|
|
77
|
+
clickOn('c');
|
|
78
|
+
await sleepAsync(100);
|
|
79
|
+
expect(getContent()).toBe('route-c');
|
|
80
|
+
expect(getLocation()).toBe('/route-c');
|
|
81
|
+
expect(onLastLeave).not.toBeCalled();
|
|
82
|
+
clickOn('x');
|
|
83
|
+
await sleepAsync(100);
|
|
84
|
+
expect(getContent()).toBe('not found');
|
|
85
|
+
expect(getLocation()).toBe('/route-x');
|
|
86
|
+
expect(onLastLeave).toBeCalledTimes(1);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=router.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.spec.js","sourceRoot":"","sources":["../../src/components/router.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
import { ObservableValue, Trace } from '@furystack/utils';
|
|
11
11
|
import { Injectable } from '@furystack/inject';
|
|
12
12
|
import { deserializeQueryString, serializeToQueryString } from '@furystack/rest';
|
|
13
|
-
|
|
13
|
+
let LocationService = class LocationService {
|
|
14
14
|
dispose() {
|
|
15
15
|
window.removeEventListener('popstate', this.updateState);
|
|
16
16
|
window.removeEventListener('hashchange', this.updateState);
|
|
@@ -21,11 +21,28 @@ export let LocationService = class LocationService {
|
|
|
21
21
|
this.onDeserializedLocationSearchChanged.dispose();
|
|
22
22
|
this.locationDeserializerObserver.dispose();
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Observable value that will be updated when the location pathname (e.g. /page/1) changes
|
|
26
|
+
*/
|
|
27
|
+
onLocationPathChanged = new ObservableValue(new URL(location.href).pathname);
|
|
28
|
+
/**
|
|
29
|
+
* Observable value that will be updated when the location hash (e.g. #hash) changes
|
|
30
|
+
*/
|
|
31
|
+
onLocationHashChanged = new ObservableValue(location.hash);
|
|
32
|
+
/**
|
|
33
|
+
* Observable value that will be updated when the location search (e.g. ?search=1) changes
|
|
34
|
+
*/
|
|
35
|
+
onLocationSearchChanged = new ObservableValue(location.search);
|
|
36
|
+
onDeserializedLocationSearchChanged = new ObservableValue(deserializeQueryString(this.onLocationSearchChanged.getValue()));
|
|
37
|
+
locationDeserializerObserver = this.onLocationSearchChanged.subscribe((search) => {
|
|
38
|
+
this.onDeserializedLocationSearchChanged.setValue(deserializeQueryString(search));
|
|
39
|
+
});
|
|
24
40
|
updateState() {
|
|
25
41
|
this.onLocationPathChanged.setValue(location.pathname);
|
|
26
42
|
this.onLocationHashChanged.setValue(location.hash);
|
|
27
43
|
this.onLocationSearchChanged.setValue(location.search);
|
|
28
44
|
}
|
|
45
|
+
searchParamObservables = new Map();
|
|
29
46
|
/**
|
|
30
47
|
*
|
|
31
48
|
* @param key The search param key (e.g. ?search=1 -> search)
|
|
@@ -51,24 +68,9 @@ export let LocationService = class LocationService {
|
|
|
51
68
|
}
|
|
52
69
|
return existing;
|
|
53
70
|
}
|
|
71
|
+
pushStateTracer;
|
|
72
|
+
replaceStateTracer;
|
|
54
73
|
constructor() {
|
|
55
|
-
/**
|
|
56
|
-
* Observable value that will be updated when the location pathname (e.g. /page/1) changes
|
|
57
|
-
*/
|
|
58
|
-
this.onLocationPathChanged = new ObservableValue(new URL(location.href).pathname);
|
|
59
|
-
/**
|
|
60
|
-
* Observable value that will be updated when the location hash (e.g. #hash) changes
|
|
61
|
-
*/
|
|
62
|
-
this.onLocationHashChanged = new ObservableValue(location.hash);
|
|
63
|
-
/**
|
|
64
|
-
* Observable value that will be updated when the location search (e.g. ?search=1) changes
|
|
65
|
-
*/
|
|
66
|
-
this.onLocationSearchChanged = new ObservableValue(location.search);
|
|
67
|
-
this.onDeserializedLocationSearchChanged = new ObservableValue(deserializeQueryString(this.onLocationSearchChanged.getValue()));
|
|
68
|
-
this.locationDeserializerObserver = this.onLocationSearchChanged.subscribe((search) => {
|
|
69
|
-
this.onDeserializedLocationSearchChanged.setValue(deserializeQueryString(search));
|
|
70
|
-
});
|
|
71
|
-
this.searchParamObservables = new Map();
|
|
72
74
|
window.addEventListener('popstate', () => this.updateState());
|
|
73
75
|
window.addEventListener('hashchange', () => this.updateState());
|
|
74
76
|
this.pushStateTracer = Trace.method({
|
|
@@ -89,4 +91,5 @@ LocationService = __decorate([
|
|
|
89
91
|
Injectable({ lifetime: 'singleton' }),
|
|
90
92
|
__metadata("design:paramtypes", [])
|
|
91
93
|
], LocationService);
|
|
94
|
+
export { LocationService };
|
|
92
95
|
//# sourceMappingURL=location-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAEzE,
|
|
1
|
+
{"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location-service.spec.d.ts","sourceRoot":"","sources":["../../src/services/location-service.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { TextEncoder, TextDecoder } from 'util';
|
|
2
|
+
global.TextEncoder = TextEncoder;
|
|
3
|
+
global.TextDecoder = TextDecoder;
|
|
4
|
+
import { Injector } from '@furystack/inject';
|
|
5
|
+
import { using } from '@furystack/utils';
|
|
6
|
+
import { serializeValue } from '@furystack/rest';
|
|
7
|
+
import { LocationService } from './location-service.js';
|
|
8
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
9
|
+
describe('LocationService', () => {
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
document.body.innerHTML = '<div id="root"></div>';
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
document.body.innerHTML = '';
|
|
15
|
+
});
|
|
16
|
+
it('Shuld be constructed', () => {
|
|
17
|
+
using(new Injector(), (i) => {
|
|
18
|
+
const s = i.getInstance(LocationService);
|
|
19
|
+
expect(s).toBeInstanceOf(LocationService);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
it('Shuld update state on events', () => {
|
|
23
|
+
using(new Injector(), (i) => {
|
|
24
|
+
const onLocaionChanged = vi.fn();
|
|
25
|
+
const s = i.getInstance(LocationService);
|
|
26
|
+
s.onLocationPathChanged.subscribe(onLocaionChanged);
|
|
27
|
+
expect(onLocaionChanged).toBeCalledTimes(0);
|
|
28
|
+
history.pushState(null, '', '/loc1');
|
|
29
|
+
expect(onLocaionChanged).toBeCalledTimes(1);
|
|
30
|
+
history.replaceState(null, '', '/loc2');
|
|
31
|
+
expect(onLocaionChanged).toBeCalledTimes(2);
|
|
32
|
+
// TODO: Figure out testing hashchange and popstate subscriptions
|
|
33
|
+
// window.dispatchEvent(new HashChangeEvent('hashchange', { newURL: '/loc3' }))
|
|
34
|
+
// expect(onLocaionChanged).toBeCalledTimes(3)
|
|
35
|
+
// window.dispatchEvent(new PopStateEvent('popstate', {}))
|
|
36
|
+
// expect(onLocaionChanged).toBeCalledTimes(4)
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('useSearchParam', () => {
|
|
40
|
+
it('Should create observables lazily', () => {
|
|
41
|
+
using(new Injector(), (i) => {
|
|
42
|
+
const service = i.getInstance(LocationService);
|
|
43
|
+
const observables = service.searchParamObservables;
|
|
44
|
+
const testSearchParam = service.useSearchParam('test', null);
|
|
45
|
+
expect(observables.size).toBe(1);
|
|
46
|
+
const testSearchParam2 = service.useSearchParam('test', null);
|
|
47
|
+
expect(observables.size).toBe(1);
|
|
48
|
+
expect(testSearchParam).toBe(testSearchParam2);
|
|
49
|
+
const testSearchParam3 = service.useSearchParam('test2', undefined);
|
|
50
|
+
expect(observables.size).toBe(2);
|
|
51
|
+
expect(testSearchParam3).not.toBe(testSearchParam2);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
it('Should return the default value, if not present in the query string', () => {
|
|
55
|
+
using(new Injector(), (i) => {
|
|
56
|
+
const service = i.getInstance(LocationService);
|
|
57
|
+
const testSearchParam = service.useSearchParam('test', { value: 'foo' });
|
|
58
|
+
expect(testSearchParam.getValue()).toEqual({ value: 'foo' });
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
it('Should return the value from the query string', () => {
|
|
62
|
+
using(new Injector(), (i) => {
|
|
63
|
+
const service = i.getInstance(LocationService);
|
|
64
|
+
history.pushState(null, '', `/loc1?test=${serializeValue(1)}`);
|
|
65
|
+
const testSearchParam = service.useSearchParam('test', 123);
|
|
66
|
+
expect(testSearchParam.getValue()).toBe(1);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it('should update the observable value on push / replace states', () => {
|
|
70
|
+
using(new Injector(), (i) => {
|
|
71
|
+
const service = i.getInstance(LocationService);
|
|
72
|
+
history.pushState(null, '', `/loc1?test=${serializeValue(1)}`);
|
|
73
|
+
const testSearchParam = service.useSearchParam('test', 234);
|
|
74
|
+
expect(testSearchParam.getValue()).toBe(1);
|
|
75
|
+
history.replaceState(null, '', `/loc1?test=${serializeValue('2')}`);
|
|
76
|
+
expect(testSearchParam.getValue()).toBe('2');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
it('Should update the URL based on search value change', () => {
|
|
80
|
+
using(new Injector(), (i) => {
|
|
81
|
+
const service = i.getInstance(LocationService);
|
|
82
|
+
history.pushState(null, '', `/loc1?test=${serializeValue('2')}`);
|
|
83
|
+
const testSearchParam = service.useSearchParam('test', '');
|
|
84
|
+
testSearchParam.setValue('2');
|
|
85
|
+
expect(location.search).toBe('?test=IjIi');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=location-service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location-service.spec.js","sourceRoot":"","sources":["../../src/services/location-service.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,35 +3,33 @@ import { ObservableValue } from '@furystack/utils';
|
|
|
3
3
|
* Class for managing observables and disposables for components, based on key-value maps
|
|
4
4
|
*/
|
|
5
5
|
export class ResourceManager {
|
|
6
|
-
|
|
7
|
-
this.disposables = new Map();
|
|
8
|
-
this.observers = new Map();
|
|
9
|
-
this.useObservable = (key, observable, callback, getLast) => {
|
|
10
|
-
const alreadyUsed = this.observers.get(key);
|
|
11
|
-
if (alreadyUsed) {
|
|
12
|
-
return [alreadyUsed.observable.getValue(), alreadyUsed.observable.setValue.bind(alreadyUsed.observable)];
|
|
13
|
-
}
|
|
14
|
-
const observer = observable.subscribe(callback, getLast);
|
|
15
|
-
this.observers.set(key, observer);
|
|
16
|
-
return [observable.getValue(), observable.setValue.bind(observable)];
|
|
17
|
-
};
|
|
18
|
-
this.stateObservers = new Map();
|
|
19
|
-
this.useState = (key, initialValue, callback) => {
|
|
20
|
-
if (!this.stateObservers.has(key)) {
|
|
21
|
-
const newObservable = new ObservableValue(initialValue);
|
|
22
|
-
this.stateObservers.set(key, newObservable);
|
|
23
|
-
newObservable.subscribe(callback);
|
|
24
|
-
}
|
|
25
|
-
const observable = this.stateObservers.get(key);
|
|
26
|
-
return [observable.getValue(), observable.setValue.bind(observable)];
|
|
27
|
-
};
|
|
28
|
-
}
|
|
6
|
+
disposables = new Map();
|
|
29
7
|
useDisposable(key, factory) {
|
|
30
8
|
if (!this.disposables.has(key)) {
|
|
31
9
|
this.disposables.set(key, factory());
|
|
32
10
|
}
|
|
33
11
|
return this.disposables.get(key);
|
|
34
12
|
}
|
|
13
|
+
observers = new Map();
|
|
14
|
+
useObservable = (key, observable, callback, getLast) => {
|
|
15
|
+
const alreadyUsed = this.observers.get(key);
|
|
16
|
+
if (alreadyUsed) {
|
|
17
|
+
return [alreadyUsed.observable.getValue(), alreadyUsed.observable.setValue.bind(alreadyUsed.observable)];
|
|
18
|
+
}
|
|
19
|
+
const observer = observable.subscribe(callback, getLast);
|
|
20
|
+
this.observers.set(key, observer);
|
|
21
|
+
return [observable.getValue(), observable.setValue.bind(observable)];
|
|
22
|
+
};
|
|
23
|
+
stateObservers = new Map();
|
|
24
|
+
useState = (key, initialValue, callback) => {
|
|
25
|
+
if (!this.stateObservers.has(key)) {
|
|
26
|
+
const newObservable = new ObservableValue(initialValue);
|
|
27
|
+
this.stateObservers.set(key, newObservable);
|
|
28
|
+
newObservable.subscribe(callback);
|
|
29
|
+
}
|
|
30
|
+
const observable = this.stateObservers.get(key);
|
|
31
|
+
return [observable.getValue(), observable.setValue.bind(observable)];
|
|
32
|
+
};
|
|
35
33
|
dispose() {
|
|
36
34
|
this.disposables.forEach((r) => r.dispose());
|
|
37
35
|
this.disposables.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-manager.js","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIlD;;GAEG;AACH,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"resource-manager.js","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIlD;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAA;IAErD,aAAa,CAAuB,GAAW,EAAE,OAAgB;QACtE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;SACrC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAM,CAAA;IACvC,CAAC;IAEe,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAA;IAE1D,aAAa,GAAG,CACrB,GAAW,EACX,UAA8B,EAC9B,QAAgC,EAChC,OAAiB,EAC4B,EAAE;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAiC,CAAA;QAC3E,IAAI,WAAW,EAAE;YACf,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;SACzG;QACD,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACxD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACjC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,CAAC,CAAA;IAEe,cAAc,GAAG,IAAI,GAAG,EAAgC,CAAA;IAEjE,QAAQ,GAAG,CAChB,GAAW,EACX,YAAe,EACf,QAAgC,EACa,EAAE;QAC/C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACjC,MAAM,aAAa,GAAG,IAAI,eAAe,CAAI,YAAY,CAAC,CAAA;YAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;YAC3C,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;SAClC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAuB,CAAA;QACrE,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,CAAC,CAAA;IAEM,OAAO;QACZ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC5C,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QACxB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QAEtB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-manager.spec.d.ts","sourceRoot":"","sources":["../../src/services/resource-manager.spec.ts"],"names":[],"mappings":""}
|