@esportsplus/routing 0.0.32 → 0.0.34
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 +6 -8
- package/build/browser.js +51 -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 +66 -47
- package/src/router/route.ts +2 -2
- package/src/types.ts +4 -3
package/build/browser.d.ts
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Scheduler } from '@esportsplus/reactivity';
|
|
2
|
+
import { Middleware, Next, NeverAsync, Request, Route, Router } from './types';
|
|
2
3
|
declare function back(): void;
|
|
3
4
|
declare function forward(): void;
|
|
4
5
|
declare const _default: <T>(instance?: Router<T> | undefined) => {
|
|
5
6
|
back: typeof back;
|
|
6
7
|
forward: typeof forward;
|
|
7
|
-
|
|
8
|
-
(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
-
middleware(subdomain?: string): (request: Request<T>, next: Next<T>) => import("@esportsplus/template/build/types").Template;
|
|
8
|
+
middleware: {
|
|
9
|
+
(...middleware: Middleware<T>[]): () => NeverAsync<T>;
|
|
10
|
+
dispatch(request: Request<T>): NeverAsync<T>;
|
|
11
|
+
match(fallback: Route<T>, scheduler: Scheduler, subdomain?: string | undefined): (request: Request<T>, next: Next<T>) => import("@esportsplus/template/build/types").Template;
|
|
13
12
|
};
|
|
14
|
-
middleware: (...middleware: Middleware<T>[]) => () => T;
|
|
15
13
|
redirect: (path: string, values?: unknown[]) => void;
|
|
16
14
|
router: Router<T>;
|
|
17
15
|
uri: (path: string, values?: unknown[]) => string;
|
package/build/browser.js
CHANGED
|
@@ -23,69 +23,83 @@ 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
|
+
return host;
|
|
78
|
+
}
|
|
79
|
+
function normalize(uri) {
|
|
80
|
+
if (uri[0] === '/') {
|
|
81
|
+
return '#' + uri;
|
|
82
|
+
}
|
|
83
|
+
return uri;
|
|
84
|
+
}
|
|
85
|
+
function onpopstate() {
|
|
86
|
+
let values = href();
|
|
87
|
+
for (let i = 0, n = cache.length; i < n; i++) {
|
|
88
|
+
let state = cache[i];
|
|
89
|
+
for (let key in values) {
|
|
90
|
+
state[key] = values[key];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export default (instance) => {
|
|
95
|
+
let request = reactive(href()), router = instance || factory();
|
|
96
|
+
if (cache.push(request) === 1) {
|
|
97
|
+
window.addEventListener('hashchange', onpopstate);
|
|
98
|
+
}
|
|
81
99
|
return {
|
|
82
100
|
back,
|
|
83
101
|
forward,
|
|
84
|
-
|
|
85
|
-
middleware: (...middleware) => {
|
|
86
|
-
let instance = pipeline(...middleware);
|
|
87
|
-
return () => instance(request);
|
|
88
|
-
},
|
|
102
|
+
middleware: middleware(request, router),
|
|
89
103
|
redirect: (path, values = []) => {
|
|
90
104
|
if (path.indexOf('://') !== -1) {
|
|
91
105
|
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.34"
|
|
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, NeverAsync, 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>): NeverAsync<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,48 @@ 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
|
};
|
|
109
100
|
|
|
101
|
+
return host;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function normalize(uri: string) {
|
|
105
|
+
if (uri[0] === '/') {
|
|
106
|
+
return '#' + uri;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return uri;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function onpopstate() {
|
|
113
|
+
let values = href();
|
|
114
|
+
|
|
115
|
+
for (let i = 0, n = cache.length; i < n; i++) {
|
|
116
|
+
let state = cache[i];
|
|
117
|
+
|
|
118
|
+
for (let key in values) {
|
|
119
|
+
// @ts-ignore
|
|
120
|
+
state[key] = values[key];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
export default <T>(instance?: Router<T>) => {
|
|
127
|
+
let request = reactive( href<T>() ),
|
|
128
|
+
router = instance || factory<T>();
|
|
129
|
+
|
|
130
|
+
if (cache.push(request) === 1) {
|
|
131
|
+
window.addEventListener('hashchange', onpopstate);
|
|
132
|
+
}
|
|
133
|
+
|
|
110
134
|
return {
|
|
111
135
|
back,
|
|
112
136
|
forward,
|
|
113
|
-
|
|
114
|
-
middleware: (...middleware: Middleware<T>[]) => {
|
|
115
|
-
let instance = pipeline(...middleware);
|
|
116
|
-
|
|
117
|
-
return () => instance(request);
|
|
118
|
-
},
|
|
137
|
+
middleware: middleware(request, router),
|
|
119
138
|
redirect: (path: string, values: unknown[] = []) => {
|
|
120
139
|
if (path.indexOf('://') !== -1) {
|
|
121
140
|
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 };
|