@esportsplus/routing 0.0.32 → 0.0.33
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/build/browser.d.ts +2 -9
- package/build/browser.js +50 -37
- package/build/router/route.d.ts +2 -2
- package/build/types.d.ts +4 -3
- package/package.json +3 -3
- package/src/browser.ts +64 -47
- package/src/router/route.ts +2 -2
- package/src/types.ts +4 -3
package/build/browser.d.ts
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Router } from './types';
|
|
2
2
|
declare function back(): void;
|
|
3
3
|
declare function forward(): void;
|
|
4
4
|
declare const _default: <T>(instance?: Router<T> | undefined) => {
|
|
5
5
|
back: typeof back;
|
|
6
6
|
forward: typeof forward;
|
|
7
|
-
|
|
8
|
-
(subdomain?: string): {
|
|
9
|
-
parameters?: Record<PropertyKey, unknown> | undefined;
|
|
10
|
-
route?: import("./router/route").Route<T> | undefined;
|
|
11
|
-
};
|
|
12
|
-
middleware(subdomain?: string): (request: Request<T>, next: Next<T>) => import("@esportsplus/template/build/types").Template;
|
|
13
|
-
};
|
|
14
|
-
middleware: (...middleware: Middleware<T>[]) => () => T;
|
|
7
|
+
middleware: void;
|
|
15
8
|
redirect: (path: string, values?: unknown[]) => void;
|
|
16
9
|
router: Router<T>;
|
|
17
10
|
uri: (path: string, values?: unknown[]) => string;
|
package/build/browser.js
CHANGED
|
@@ -23,69 +23,82 @@ function href() {
|
|
|
23
23
|
query: path[1] ? Object.fromEntries((new URLSearchParams(path[1])).entries()) : {},
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
-
function
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
for (let i = 0, n = cache.length; i < n; i++) {
|
|
35
|
-
let state = cache[i];
|
|
36
|
-
for (let key in values) {
|
|
37
|
-
state[key] = values[key];
|
|
26
|
+
function match(request, router, subdomain) {
|
|
27
|
+
if (router.subdomains !== null) {
|
|
28
|
+
for (let i = 0, n = router.subdomains.length; i < n; i++) {
|
|
29
|
+
if (!request.hostname.startsWith(router.subdomains[i])) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
subdomain = router.subdomains[i];
|
|
33
|
+
break;
|
|
38
34
|
}
|
|
39
35
|
}
|
|
36
|
+
return router.match(request.method, request.path, subdomain || '');
|
|
40
37
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
function middleware(request, router) {
|
|
39
|
+
function host(...middleware) {
|
|
40
|
+
let instance = pipeline(...middleware);
|
|
41
|
+
return () => instance(request);
|
|
45
42
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
subdomain = router.subdomains[i];
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
43
|
+
;
|
|
44
|
+
host.dispatch = (request) => {
|
|
45
|
+
let { route } = request.data;
|
|
46
|
+
if (route === undefined) {
|
|
47
|
+
throw new Error(`Middleware: route is undefined!`);
|
|
55
48
|
}
|
|
56
|
-
return
|
|
57
|
-
}
|
|
58
|
-
match
|
|
49
|
+
return route.dispatch(request);
|
|
50
|
+
};
|
|
51
|
+
host.match = (fallback, scheduler, subdomain) => {
|
|
59
52
|
let state = reactive({
|
|
60
53
|
parameters: undefined,
|
|
61
54
|
route: undefined
|
|
62
55
|
});
|
|
56
|
+
if (fallback === undefined) {
|
|
57
|
+
throw new Error('Middleware: fallback route does not exist');
|
|
58
|
+
}
|
|
63
59
|
effect(() => {
|
|
64
|
-
let { parameters, route } = match(subdomain);
|
|
60
|
+
let { parameters, route } = match(request, router, subdomain);
|
|
65
61
|
state.parameters = parameters;
|
|
66
|
-
state.route = route;
|
|
62
|
+
state.route = route || fallback;
|
|
67
63
|
});
|
|
68
64
|
return (request, next) => {
|
|
69
65
|
return html `${() => {
|
|
70
66
|
if (state.route === undefined) {
|
|
71
|
-
throw new Error(
|
|
67
|
+
throw new Error('Routing: route is undefined');
|
|
72
68
|
}
|
|
73
69
|
return root(() => {
|
|
74
70
|
request.data.parameters = state.parameters;
|
|
75
71
|
request.data.route = state.route;
|
|
76
72
|
return next(request);
|
|
77
|
-
});
|
|
73
|
+
}, { scheduler });
|
|
78
74
|
}}`;
|
|
79
75
|
};
|
|
80
76
|
};
|
|
77
|
+
}
|
|
78
|
+
function normalize(uri) {
|
|
79
|
+
if (uri[0] === '/') {
|
|
80
|
+
return '#' + uri;
|
|
81
|
+
}
|
|
82
|
+
return uri;
|
|
83
|
+
}
|
|
84
|
+
function onpopstate() {
|
|
85
|
+
let values = href();
|
|
86
|
+
for (let i = 0, n = cache.length; i < n; i++) {
|
|
87
|
+
let state = cache[i];
|
|
88
|
+
for (let key in values) {
|
|
89
|
+
state[key] = values[key];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export default (instance) => {
|
|
94
|
+
let request = reactive(href()), router = instance || factory();
|
|
95
|
+
if (cache.push(request) === 1) {
|
|
96
|
+
window.addEventListener('hashchange', onpopstate);
|
|
97
|
+
}
|
|
81
98
|
return {
|
|
82
99
|
back,
|
|
83
100
|
forward,
|
|
84
|
-
|
|
85
|
-
middleware: (...middleware) => {
|
|
86
|
-
let instance = pipeline(...middleware);
|
|
87
|
-
return () => instance(request);
|
|
88
|
-
},
|
|
101
|
+
middleware: middleware(request, router),
|
|
89
102
|
redirect: (path, values = []) => {
|
|
90
103
|
if (path.indexOf('://') !== -1) {
|
|
91
104
|
return window.location.replace(path);
|
package/build/router/route.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Middleware, Next, Request } from '../types';
|
|
1
|
+
import { Middleware, Next, NeverAsync, Request } from '../types';
|
|
2
2
|
declare class Route<T> {
|
|
3
3
|
middleware: Middleware<T>[] | null;
|
|
4
4
|
name: string | null;
|
|
@@ -6,6 +6,6 @@ declare class Route<T> {
|
|
|
6
6
|
responder: Next<T>;
|
|
7
7
|
subdomain: string | null;
|
|
8
8
|
constructor(responder: Next<T>);
|
|
9
|
-
dispatch(request: Request<T>): T
|
|
9
|
+
dispatch(request: Request<T>): NeverAsync<T>;
|
|
10
10
|
}
|
|
11
11
|
export { Route };
|
package/build/types.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { NeverAsync } from '@esportsplus/typescript';
|
|
1
2
|
import { Next as N, Stage } from '@esportsplus/pipeline';
|
|
2
3
|
import { Route, Router } from './router';
|
|
3
|
-
type Middleware<T> = Stage<Request<T>, T
|
|
4
|
-
type Next<T> = N<Request<T>, T
|
|
4
|
+
type Middleware<T> = Stage<Request<T>, NeverAsync<T>>;
|
|
5
|
+
type Next<T> = N<Request<T>, NeverAsync<T>>;
|
|
5
6
|
type Options<T> = {
|
|
6
7
|
middleware?: Middleware<T>[];
|
|
7
8
|
name?: string;
|
|
@@ -21,4 +22,4 @@ type Request<T> = {
|
|
|
21
22
|
query: Record<string, unknown>;
|
|
22
23
|
subdomain?: string;
|
|
23
24
|
};
|
|
24
|
-
export { Middleware, Next, Options, Request, Route, Router };
|
|
25
|
+
export { Middleware, Next, NeverAsync, Options, Request, Route, Router };
|
package/package.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"author": "ICJR",
|
|
3
3
|
"dependencies": {
|
|
4
4
|
"@esportsplus/pipeline": "^0.0.5",
|
|
5
|
-
"@esportsplus/reactivity": "^0.1.
|
|
5
|
+
"@esportsplus/reactivity": "^0.1.7",
|
|
6
6
|
"@esportsplus/template": "^0.1.5"
|
|
7
7
|
},
|
|
8
8
|
"devDependencies": {
|
|
9
|
-
"@esportsplus/typescript": "^0.0.
|
|
9
|
+
"@esportsplus/typescript": "^0.0.7"
|
|
10
10
|
},
|
|
11
11
|
"main": "./build/index.js",
|
|
12
12
|
"name": "@esportsplus/routing",
|
|
@@ -18,5 +18,5 @@
|
|
|
18
18
|
"prepublishOnly": "npm run build"
|
|
19
19
|
},
|
|
20
20
|
"types": "./build/index.d.ts",
|
|
21
|
-
"version": "0.0.
|
|
21
|
+
"version": "0.0.33"
|
|
22
22
|
}
|
package/src/browser.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { effect, reactive, root } from '@esportsplus/reactivity';
|
|
1
|
+
import { effect, reactive, root, Scheduler } from '@esportsplus/reactivity';
|
|
2
2
|
import { html } from '@esportsplus/template';
|
|
3
|
-
import { Middleware, Next, Request, Router } from './types';
|
|
3
|
+
import { Middleware, Next, Request, Route, Router } from './types';
|
|
4
4
|
import pipeline from '@esportsplus/pipeline';
|
|
5
5
|
import factory from './router';
|
|
6
6
|
|
|
@@ -33,68 +33,59 @@ function href<T>(): Request<T> {
|
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
function
|
|
37
|
-
if (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function onpopstate() {
|
|
45
|
-
let values = href();
|
|
46
|
-
|
|
47
|
-
for (let i = 0, n = cache.length; i < n; i++) {
|
|
48
|
-
let state = cache[i];
|
|
36
|
+
function match<T>(request: Request<T>, router: Router<T>, subdomain?: string) {
|
|
37
|
+
if (router.subdomains !== null) {
|
|
38
|
+
for (let i = 0, n = router.subdomains.length; i < n; i++) {
|
|
39
|
+
if (!request.hostname.startsWith(router.subdomains[i])) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
49
42
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
state[key] = values[key];
|
|
43
|
+
subdomain = router.subdomains[i];
|
|
44
|
+
break;
|
|
53
45
|
}
|
|
54
46
|
}
|
|
55
|
-
}
|
|
56
47
|
|
|
48
|
+
return router.match(request.method, request.path, subdomain || '');
|
|
49
|
+
}
|
|
57
50
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
51
|
+
function middleware<T>(request: Request<T>, router: Router<T>) {
|
|
52
|
+
function host(...middleware: Middleware<T>[]) {
|
|
53
|
+
let instance = pipeline(...middleware);
|
|
61
54
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
55
|
+
return () => instance(request);
|
|
56
|
+
};
|
|
65
57
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
for (let i = 0, n = router.subdomains.length; i < n; i++) {
|
|
69
|
-
if (!request.hostname.startsWith(router.subdomains[i])) {
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
58
|
+
host.dispatch = (request: Request<T>) => {
|
|
59
|
+
let { route } = request.data;
|
|
72
60
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
61
|
+
if (route === undefined) {
|
|
62
|
+
throw new Error(`Middleware: route is undefined!`);
|
|
76
63
|
}
|
|
77
64
|
|
|
78
|
-
return
|
|
79
|
-
}
|
|
65
|
+
return route.dispatch(request);
|
|
66
|
+
};
|
|
80
67
|
|
|
81
|
-
match
|
|
68
|
+
host.match = (fallback: Route<T>, scheduler: Scheduler, subdomain?: string) => {
|
|
82
69
|
let state = reactive<ReturnType<typeof router.match>>({
|
|
83
70
|
parameters: undefined,
|
|
84
71
|
route: undefined
|
|
85
72
|
});
|
|
86
73
|
|
|
74
|
+
if (fallback === undefined) {
|
|
75
|
+
throw new Error('Middleware: fallback route does not exist');
|
|
76
|
+
}
|
|
77
|
+
|
|
87
78
|
effect(() => {
|
|
88
|
-
let { parameters, route } = match(subdomain);
|
|
79
|
+
let { parameters, route } = match(request, router, subdomain);
|
|
89
80
|
|
|
90
81
|
state.parameters = parameters;
|
|
91
|
-
state.route = route;
|
|
82
|
+
state.route = route || fallback;
|
|
92
83
|
});
|
|
93
84
|
|
|
94
85
|
return (request: Request<T>, next: Next<T>) => {
|
|
95
86
|
return html`${() => {
|
|
96
87
|
if (state.route === undefined) {
|
|
97
|
-
throw new Error(
|
|
88
|
+
throw new Error('Routing: route is undefined');
|
|
98
89
|
}
|
|
99
90
|
|
|
100
91
|
return root(() => {
|
|
@@ -102,20 +93,46 @@ export default <T>(instance?: Router<T>) => {
|
|
|
102
93
|
request.data.route = state.route;
|
|
103
94
|
|
|
104
95
|
return next(request);
|
|
105
|
-
});
|
|
96
|
+
}, { scheduler });
|
|
106
97
|
}}`;
|
|
107
98
|
};
|
|
108
99
|
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function normalize(uri: string) {
|
|
103
|
+
if (uri[0] === '/') {
|
|
104
|
+
return '#' + uri;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return uri;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function onpopstate() {
|
|
111
|
+
let values = href();
|
|
112
|
+
|
|
113
|
+
for (let i = 0, n = cache.length; i < n; i++) {
|
|
114
|
+
let state = cache[i];
|
|
115
|
+
|
|
116
|
+
for (let key in values) {
|
|
117
|
+
// @ts-ignore
|
|
118
|
+
state[key] = values[key];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
export default <T>(instance?: Router<T>) => {
|
|
125
|
+
let request = reactive( href<T>() ),
|
|
126
|
+
router = instance || factory<T>();
|
|
127
|
+
|
|
128
|
+
if (cache.push(request) === 1) {
|
|
129
|
+
window.addEventListener('hashchange', onpopstate);
|
|
130
|
+
}
|
|
109
131
|
|
|
110
132
|
return {
|
|
111
133
|
back,
|
|
112
134
|
forward,
|
|
113
|
-
|
|
114
|
-
middleware: (...middleware: Middleware<T>[]) => {
|
|
115
|
-
let instance = pipeline(...middleware);
|
|
116
|
-
|
|
117
|
-
return () => instance(request);
|
|
118
|
-
},
|
|
135
|
+
middleware: middleware(request, router),
|
|
119
136
|
redirect: (path: string, values: unknown[] = []) => {
|
|
120
137
|
if (path.indexOf('://') !== -1) {
|
|
121
138
|
return window.location.replace(path);
|
package/src/router/route.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Middleware, Next, Request } from '~/types';
|
|
1
|
+
import { Middleware, Next, NeverAsync, Request } from '~/types';
|
|
2
2
|
import pipeline from '@esportsplus/pipeline';
|
|
3
3
|
|
|
4
4
|
|
|
@@ -15,7 +15,7 @@ class Route<T> {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
dispatch(request: Request<T>) {
|
|
18
|
+
dispatch(request: Request<T>): NeverAsync<T> {
|
|
19
19
|
if (this.middleware === null) {
|
|
20
20
|
return this.responder(request);
|
|
21
21
|
}
|
package/src/types.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { NeverAsync } from '@esportsplus/typescript';
|
|
1
2
|
import { Next as N, Stage } from '@esportsplus/pipeline';
|
|
2
3
|
import { Route, Router } from './router';
|
|
3
4
|
|
|
4
5
|
|
|
5
|
-
type Middleware<T> = Stage<Request<T>, T
|
|
6
|
+
type Middleware<T> = Stage<Request<T>, NeverAsync<T>>;
|
|
6
7
|
|
|
7
|
-
type Next<T> = N<Request<T>, T
|
|
8
|
+
type Next<T> = N<Request<T>, NeverAsync<T>>;
|
|
8
9
|
|
|
9
10
|
type Options<T> = {
|
|
10
11
|
middleware?: Middleware<T>[];
|
|
@@ -28,4 +29,4 @@ type Request<T> = {
|
|
|
28
29
|
};
|
|
29
30
|
|
|
30
31
|
|
|
31
|
-
export { Middleware, Next, Options, Request, Route, Router };
|
|
32
|
+
export { Middleware, Next, NeverAsync, Options, Request, Route, Router };
|