@furystack/shades 11.0.2 → 11.0.3
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/components/router.d.ts +4 -4
- package/esm/components/router.d.ts.map +1 -1
- package/esm/components/router.js.map +1 -1
- package/esm/components/router.spec.js +24 -17
- package/esm/components/router.spec.js.map +1 -1
- package/package.json +3 -3
- package/src/components/router.spec.tsx +26 -18
- package/src/components/router.tsx +7 -4
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { MatchOptions, MatchResult
|
|
1
|
+
import type { MatchOptions, MatchResult } from 'path-to-regexp';
|
|
2
2
|
import type { RenderOptions } from '../models/render-options.js';
|
|
3
|
-
export interface Route<TMatchResult
|
|
3
|
+
export interface Route<TMatchResult = unknown> {
|
|
4
4
|
url: string;
|
|
5
5
|
component: (options: {
|
|
6
6
|
currentUrl: string;
|
|
7
|
-
match: MatchResult<TMatchResult>;
|
|
7
|
+
match: MatchResult<TMatchResult extends object ? TMatchResult : object>;
|
|
8
8
|
}) => JSX.Element;
|
|
9
9
|
routingOptions?: MatchOptions;
|
|
10
10
|
onVisit?: (options: RenderOptions<unknown>) => Promise<void>;
|
|
@@ -12,7 +12,7 @@ export interface Route<TMatchResult extends object> {
|
|
|
12
12
|
}
|
|
13
13
|
export interface RouterProps {
|
|
14
14
|
style?: CSSStyleDeclaration;
|
|
15
|
-
routes: Array<Route<
|
|
15
|
+
routes: Array<Route<any>>;
|
|
16
16
|
notFound?: JSX.Element;
|
|
17
17
|
}
|
|
18
18
|
export interface RouterState {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/components/router.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/components/router.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAKhE,MAAM,WAAW,KAAK,CAAC,YAAY,GAAG,OAAO;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,CAAC,OAAO,EAAE;QACnB,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,WAAW,CAAC,YAAY,SAAS,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC,CAAA;KACxE,KAAK,GAAG,CAAC,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,YAAY,CAAA;IAC7B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7D;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IACzB,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IAC/B,iBAAiB,CAAC,EAAE,GAAG,CAAA;IACvB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAA;CACjB;AACD,eAAO,MAAM,MAAM;;qDAuDqiO,IAAK,OAAO,AADlkO,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/components/router.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAA;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/components/router.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TextDecoder, TextEncoder } from 'util';
|
|
2
2
|
global.TextEncoder = TextEncoder;
|
|
3
3
|
global.TextDecoder = TextDecoder;
|
|
4
4
|
import { Injector } from '@furystack/inject';
|
|
5
|
-
import { Router } from './router.js';
|
|
6
|
-
import { RouteLink } from './route-link.js';
|
|
7
5
|
import { sleepAsync } from '@furystack/utils';
|
|
8
|
-
import {
|
|
9
|
-
import { LocationService } from '../services/location-service.js';
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
10
7
|
import { initializeShadeRoot } from '../initialize.js';
|
|
8
|
+
import { LocationService } from '../services/location-service.js';
|
|
11
9
|
import { createComponent } from '../shade-component.js';
|
|
10
|
+
import { RouteLink } from './route-link.js';
|
|
11
|
+
import { Router } from './router.js';
|
|
12
12
|
describe('Router', () => {
|
|
13
13
|
beforeEach(() => {
|
|
14
14
|
document.body.innerHTML = '<div id="root"></div>';
|
|
@@ -25,6 +25,24 @@ describe('Router', () => {
|
|
|
25
25
|
const rootElement = document.getElementById('root');
|
|
26
26
|
const onRouteChange = vi.fn();
|
|
27
27
|
injector.getInstance(LocationService).onLocationPathChanged.subscribe(onRouteChange);
|
|
28
|
+
const route1 = {
|
|
29
|
+
url: '/route-a',
|
|
30
|
+
component: () => createComponent("div", { id: "content" }, "route-a"),
|
|
31
|
+
onVisit,
|
|
32
|
+
onLeave,
|
|
33
|
+
};
|
|
34
|
+
const route2 = {
|
|
35
|
+
url: '/route-b{/:id}?',
|
|
36
|
+
component: ({ match }) => createComponent("div", { id: "content" },
|
|
37
|
+
"route-b",
|
|
38
|
+
match.params.id),
|
|
39
|
+
};
|
|
40
|
+
const route3 = {
|
|
41
|
+
url: '/route-c',
|
|
42
|
+
component: () => createComponent("div", { id: "content" }, "route-c"),
|
|
43
|
+
onLeave: onLastLeave,
|
|
44
|
+
};
|
|
45
|
+
const route4 = { url: '/', component: () => createComponent("div", { id: "content" }, "home") };
|
|
28
46
|
initializeShadeRoot({
|
|
29
47
|
injector,
|
|
30
48
|
rootElement,
|
|
@@ -35,18 +53,7 @@ describe('Router', () => {
|
|
|
35
53
|
createComponent(RouteLink, { id: "b-with-id", href: "/route-b/123" }, "b-with-id"),
|
|
36
54
|
createComponent(RouteLink, { id: "c", href: "/route-c" }, "c"),
|
|
37
55
|
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") }))),
|
|
56
|
+
createComponent(Router, { routes: [route1, route2, route3, route4], notFound: createComponent("div", { id: "content" }, "not found") }))),
|
|
50
57
|
});
|
|
51
58
|
const getContent = () => document.getElementById('content')?.innerHTML;
|
|
52
59
|
const getLocation = () => location.pathname;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.spec.js","sourceRoot":"","sources":["../../src/components/router.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,
|
|
1
|
+
{"version":3,"file":"router.spec.js","sourceRoot":"","sources":["../../src/components/router.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,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAA;AAEhD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,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,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QAEhC,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACvB,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACvB,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAE3B,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,MAAM,MAAM,GAAU;YACpB,GAAG,EAAE,UAAU;YACf,SAAS,EAAE,GAAG,EAAE,CAAC,yBAAK,EAAE,EAAC,SAAS,cAAc;YAChD,OAAO;YACP,OAAO;SACR,CAAA;QAED,MAAM,MAAM,GAA0B;YACpC,GAAG,EAAE,iBAAiB;YACtB,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,yBAAK,EAAE,EAAC,SAAS;;gBAAS,KAAK,CAAC,MAAM,CAAC,EAAE,CAAO;SAC3E,CAAA;QAED,MAAM,MAAM,GAAU;YACpB,GAAG,EAAE,UAAU;YACf,SAAS,EAAE,GAAG,EAAE,CAAC,yBAAK,EAAE,EAAC,SAAS,cAAc;YAChD,OAAO,EAAE,WAAW;SACrB,CAAA;QAED,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,yBAAK,EAAE,EAAC,SAAS,WAAW,EAAE,CAAA;QAE1E,mBAAmB,CAAC;YAClB,QAAQ;YACR,WAAW;YACX,UAAU,EAAE,CACV;gBACE,gBAAC,SAAS,IAAC,EAAE,EAAC,MAAM,EAAC,IAAI,EAAC,GAAG,WAEjB;gBACZ,gBAAC,SAAS,IAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,UAAU,QAErB;gBACZ,gBAAC,SAAS,IAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,UAAU,QAErB;gBACZ,gBAAC,SAAS,IAAC,EAAE,EAAC,WAAW,EAAC,IAAI,EAAC,cAAc,gBAEjC;gBACZ,gBAAC,SAAS,IAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,UAAU,QAErB;gBACZ,gBAAC,SAAS,IAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,UAAU,QAErB;gBACZ,gBAAC,MAAM,IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,yBAAK,EAAE,EAAC,SAAS,gBAAgB,GAAI,CAC7F,CACP;SACF,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,SAAS,CAAA;QACtE,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAA;QAE3C,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAA;QAExE,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QAErB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAEjC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;QAEhC,OAAO,CAAC,GAAG,CAAC,CAAA;QACZ,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACpC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACtC,MAAM,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAElC,OAAO,CAAC,GAAG,CAAC,CAAA;QACZ,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;QAEhC,OAAO,CAAC,GAAG,CAAC,CAAA;QACZ,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAElC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACpC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAEtC,OAAO,CAAC,WAAW,CAAC,CAAA;QACpB,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACvC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAE1C,OAAO,CAAC,GAAG,CAAC,CAAA;QACZ,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACpC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAEtC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,CAAA;QACZ,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;QACrB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACtC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACtC,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/shades",
|
|
3
|
-
"version": "11.0.
|
|
3
|
+
"version": "11.0.3",
|
|
4
4
|
"description": "Google Authentication Provider for FuryStack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -38,14 +38,14 @@
|
|
|
38
38
|
"homepage": "https://github.com/furystack/furystack",
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/jsdom": "^21.1.7",
|
|
41
|
-
"@types/node": "^22.
|
|
41
|
+
"@types/node": "^22.3.0",
|
|
42
42
|
"jsdom": "^24.1.1",
|
|
43
43
|
"typescript": "^5.5.4",
|
|
44
44
|
"vitest": "^2.0.5"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@furystack/inject": "^12.0.2",
|
|
48
|
-
"@furystack/rest": "^8.0.
|
|
48
|
+
"@furystack/rest": "^8.0.3",
|
|
49
49
|
"@furystack/utils": "^8.0.2",
|
|
50
50
|
"path-to-regexp": "^7.1.0",
|
|
51
51
|
"semaphore-async-await": "^1.5.1"
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TextDecoder, TextEncoder } from 'util'
|
|
2
2
|
|
|
3
3
|
global.TextEncoder = TextEncoder
|
|
4
4
|
global.TextDecoder = TextDecoder as any
|
|
5
5
|
|
|
6
6
|
import { Injector } from '@furystack/inject'
|
|
7
|
-
import { Router } from './router.js'
|
|
8
|
-
import { RouteLink } from './route-link.js'
|
|
9
7
|
import { sleepAsync } from '@furystack/utils'
|
|
10
|
-
import {
|
|
11
|
-
import { LocationService } from '../services/location-service.js'
|
|
8
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
12
9
|
import { initializeShadeRoot } from '../initialize.js'
|
|
10
|
+
import { LocationService } from '../services/location-service.js'
|
|
13
11
|
import { createComponent } from '../shade-component.js'
|
|
12
|
+
import { RouteLink } from './route-link.js'
|
|
13
|
+
import { Router, type Route } from './router.js'
|
|
14
14
|
|
|
15
15
|
describe('Router', () => {
|
|
16
16
|
beforeEach(() => {
|
|
@@ -34,6 +34,26 @@ describe('Router', () => {
|
|
|
34
34
|
|
|
35
35
|
injector.getInstance(LocationService).onLocationPathChanged.subscribe(onRouteChange)
|
|
36
36
|
|
|
37
|
+
const route1: Route = {
|
|
38
|
+
url: '/route-a',
|
|
39
|
+
component: () => <div id="content">route-a</div>,
|
|
40
|
+
onVisit,
|
|
41
|
+
onLeave,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const route2: Route<{ id: string }> = {
|
|
45
|
+
url: '/route-b{/:id}?',
|
|
46
|
+
component: ({ match }) => <div id="content">route-b{match.params.id}</div>,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const route3: Route = {
|
|
50
|
+
url: '/route-c',
|
|
51
|
+
component: () => <div id="content">route-c</div>,
|
|
52
|
+
onLeave: onLastLeave,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const route4 = { url: '/', component: () => <div id="content">home</div> }
|
|
56
|
+
|
|
37
57
|
initializeShadeRoot({
|
|
38
58
|
injector,
|
|
39
59
|
rootElement,
|
|
@@ -57,19 +77,7 @@ describe('Router', () => {
|
|
|
57
77
|
<RouteLink id="x" href="/route-x">
|
|
58
78
|
x
|
|
59
79
|
</RouteLink>
|
|
60
|
-
<Router
|
|
61
|
-
routes={[
|
|
62
|
-
{ url: '/route-a', component: () => <div id="content">route-a</div>, onVisit, onLeave },
|
|
63
|
-
{ url: '/route-b{/:id}?', component: ({ match }) => <div id="content">route-b{match.params.id}</div> },
|
|
64
|
-
{
|
|
65
|
-
url: '/route-c',
|
|
66
|
-
component: () => <div id="content">route-c</div>,
|
|
67
|
-
onLeave: onLastLeave,
|
|
68
|
-
},
|
|
69
|
-
{ url: '/', component: () => <div id="content">home</div> },
|
|
70
|
-
]}
|
|
71
|
-
notFound={<div id="content">not found</div>}
|
|
72
|
-
/>
|
|
80
|
+
<Router routes={[route1, route2, route3, route4]} notFound={<div id="content">not found</div>} />
|
|
73
81
|
</div>
|
|
74
82
|
),
|
|
75
83
|
})
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ObservableAlreadyDisposedError } from '@furystack/utils'
|
|
2
|
-
import type { MatchOptions, MatchResult
|
|
2
|
+
import type { MatchOptions, MatchResult } from 'path-to-regexp'
|
|
3
3
|
import { match } from 'path-to-regexp'
|
|
4
4
|
import { Lock } from 'semaphore-async-await'
|
|
5
5
|
import type { RenderOptions } from '../models/render-options.js'
|
|
@@ -7,9 +7,12 @@ import { LocationService } from '../services/location-service.js'
|
|
|
7
7
|
import { createComponent } from '../shade-component.js'
|
|
8
8
|
import { Shade } from '../shade.js'
|
|
9
9
|
|
|
10
|
-
export interface Route<TMatchResult
|
|
10
|
+
export interface Route<TMatchResult = unknown> {
|
|
11
11
|
url: string
|
|
12
|
-
component: (options: {
|
|
12
|
+
component: (options: {
|
|
13
|
+
currentUrl: string
|
|
14
|
+
match: MatchResult<TMatchResult extends object ? TMatchResult : object>
|
|
15
|
+
}) => JSX.Element
|
|
13
16
|
routingOptions?: MatchOptions
|
|
14
17
|
onVisit?: (options: RenderOptions<unknown>) => Promise<void>
|
|
15
18
|
onLeave?: (options: RenderOptions<unknown>) => Promise<void>
|
|
@@ -17,7 +20,7 @@ export interface Route<TMatchResult extends object> {
|
|
|
17
20
|
|
|
18
21
|
export interface RouterProps {
|
|
19
22
|
style?: CSSStyleDeclaration
|
|
20
|
-
routes: Array<Route<
|
|
23
|
+
routes: Array<Route<any>>
|
|
21
24
|
notFound?: JSX.Element
|
|
22
25
|
}
|
|
23
26
|
|