@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.
@@ -1,17 +1,10 @@
1
- import { Middleware, Next, Request, Router } from './types';
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
- match: {
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 normalize(uri) {
27
- if (uri[0] === '/') {
28
- return '#' + uri;
29
- }
30
- return uri;
31
- }
32
- function onpopstate() {
33
- let values = href();
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
- export default (instance) => {
42
- let request = reactive(href()), router = instance || factory();
43
- if (cache.push(request) === 1) {
44
- window.addEventListener('hashchange', onpopstate);
38
+ function middleware(request, router) {
39
+ function host(...middleware) {
40
+ let instance = pipeline(...middleware);
41
+ return () => instance(request);
45
42
  }
46
- function match(subdomain) {
47
- if (router.subdomains !== null) {
48
- for (let i = 0, n = router.subdomains.length; i < n; i++) {
49
- if (!request.hostname.startsWith(router.subdomains[i])) {
50
- continue;
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 router.match(request.method, request.path, subdomain || '');
57
- }
58
- match.middleware = (subdomain) => {
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(`Routing: route is undefined!`);
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
- match,
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);
@@ -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.3",
5
+ "@esportsplus/reactivity": "^0.1.7",
6
6
  "@esportsplus/template": "^0.1.5"
7
7
  },
8
8
  "devDependencies": {
9
- "@esportsplus/typescript": "^0.0.3"
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.32"
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 normalize(uri: string) {
37
- if (uri[0] === '/') {
38
- return '#' + uri;
39
- }
40
-
41
- return uri;
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
- for (let key in values) {
51
- // @ts-ignore
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
- export default <T>(instance?: Router<T>) => {
59
- let request = reactive( href<T>() ),
60
- router = instance || factory<T>();
51
+ function middleware<T>(request: Request<T>, router: Router<T>) {
52
+ function host(...middleware: Middleware<T>[]) {
53
+ let instance = pipeline(...middleware);
61
54
 
62
- if (cache.push(request) === 1) {
63
- window.addEventListener('hashchange', onpopstate);
64
- }
55
+ return () => instance(request);
56
+ };
65
57
 
66
- function match(subdomain?: string) {
67
- if (router.subdomains !== null) {
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
- subdomain = router.subdomains[i];
74
- break;
75
- }
61
+ if (route === undefined) {
62
+ throw new Error(`Middleware: route is undefined!`);
76
63
  }
77
64
 
78
- return router.match(request.method, request.path, subdomain || '');
79
- }
65
+ return route.dispatch(request);
66
+ };
80
67
 
81
- match.middleware = (subdomain?: string) => {
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(`Routing: route is undefined!`);
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
- match,
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);
@@ -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 };