hono 1.2.0 → 1.3.0

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.
Files changed (81) hide show
  1. package/README.md +92 -21
  2. package/dist/compose.test.d.ts +1 -0
  3. package/dist/compose.test.js +511 -0
  4. package/dist/context.d.ts +4 -1
  5. package/dist/context.js +31 -6
  6. package/dist/context.test.d.ts +1 -0
  7. package/dist/context.test.js +127 -0
  8. package/dist/hono.d.ts +21 -29
  9. package/dist/hono.js +27 -65
  10. package/dist/hono.test.d.ts +1 -0
  11. package/dist/hono.test.js +656 -0
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.js +1 -2
  14. package/dist/middleware/basic-auth/index.js +7 -8
  15. package/dist/middleware/basic-auth/index.test.d.ts +1 -0
  16. package/dist/middleware/basic-auth/index.test.js +119 -0
  17. package/dist/middleware/body-parse/index.test.d.ts +1 -0
  18. package/dist/middleware/body-parse/index.test.js +59 -0
  19. package/dist/middleware/cookie/index.d.ts +5 -2
  20. package/dist/middleware/cookie/index.js +9 -4
  21. package/dist/middleware/cookie/index.test.d.ts +1 -0
  22. package/dist/middleware/cookie/index.test.js +78 -0
  23. package/dist/middleware/cors/index.test.d.ts +1 -0
  24. package/dist/middleware/cors/index.test.js +59 -0
  25. package/dist/middleware/etag/index.test.d.ts +1 -0
  26. package/dist/middleware/etag/index.test.js +45 -0
  27. package/dist/middleware/graphql-server/index.js +1 -1
  28. package/dist/middleware/graphql-server/index.test.d.ts +1 -0
  29. package/dist/middleware/graphql-server/index.test.js +480 -0
  30. package/dist/middleware/graphql-server/parse-body.test.d.ts +1 -0
  31. package/dist/middleware/graphql-server/parse-body.test.js +57 -0
  32. package/dist/middleware/jwt/index.test.d.ts +1 -0
  33. package/dist/middleware/jwt/index.test.js +51 -0
  34. package/dist/middleware/logger/index.test.d.ts +1 -0
  35. package/dist/middleware/logger/index.test.js +49 -0
  36. package/dist/middleware/mustache/index.test.d.ts +1 -0
  37. package/dist/middleware/mustache/index.test.js +49 -0
  38. package/dist/middleware/powered-by/index.test.d.ts +1 -0
  39. package/dist/middleware/powered-by/index.test.js +15 -0
  40. package/dist/middleware/pretty-json/index.test.d.ts +1 -0
  41. package/dist/middleware/pretty-json/index.test.js +28 -0
  42. package/dist/middleware/serve-static/index.test.d.ts +1 -0
  43. package/dist/middleware/serve-static/index.test.js +58 -0
  44. package/dist/router/reg-exp-router/index.d.ts +1 -1
  45. package/dist/router/reg-exp-router/index.js +1 -1
  46. package/dist/router/reg-exp-router/router.js +1 -1
  47. package/dist/router/reg-exp-router/router.test.d.ts +1 -0
  48. package/dist/router/reg-exp-router/router.test.js +212 -0
  49. package/dist/router/reg-exp-router/trie.d.ts +3 -3
  50. package/dist/router/reg-exp-router/trie.js +1 -1
  51. package/dist/router/trie-router/index.d.ts +1 -1
  52. package/dist/router/trie-router/index.js +1 -1
  53. package/dist/router/trie-router/node.test.d.ts +1 -0
  54. package/dist/router/trie-router/node.test.js +351 -0
  55. package/dist/router/trie-router/router.d.ts +1 -1
  56. package/dist/router/trie-router/router.js +1 -1
  57. package/dist/router/trie-router/router.test.d.ts +1 -0
  58. package/dist/router/trie-router/router.test.js +98 -0
  59. package/dist/utils/body.test.d.ts +1 -0
  60. package/dist/utils/body.test.js +45 -0
  61. package/dist/utils/buffer.js +1 -1
  62. package/dist/utils/buffer.test.d.ts +1 -0
  63. package/dist/utils/buffer.test.js +36 -0
  64. package/dist/utils/cloudflare.test.d.ts +1 -0
  65. package/dist/utils/cloudflare.test.js +42 -0
  66. package/dist/utils/crypto.test.d.ts +1 -0
  67. package/dist/utils/crypto.test.js +15 -0
  68. package/dist/utils/encode.test.d.ts +1 -0
  69. package/dist/utils/encode.test.js +54 -0
  70. package/dist/utils/http-status.test.d.ts +1 -0
  71. package/dist/utils/http-status.test.js +8 -0
  72. package/dist/utils/jwt/jwt.test.d.ts +1 -0
  73. package/dist/utils/jwt/jwt.test.js +171 -0
  74. package/dist/utils/jwt/types.test.d.ts +1 -0
  75. package/dist/utils/jwt/types.test.js +12 -0
  76. package/dist/utils/mime.test.d.ts +1 -0
  77. package/dist/utils/mime.test.js +13 -0
  78. package/dist/utils/url.js +4 -0
  79. package/dist/utils/url.test.d.ts +1 -0
  80. package/dist/utils/url.test.js +96 -0
  81. package/package.json +3 -4
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const hono_1 = require("../../hono");
4
+ const _1 = require(".");
5
+ // Mock
6
+ const store = {
7
+ 'index.abcdef.mustache': '{{> header}}Title: {{ title }}{{> footer}}',
8
+ 'header.abcdef.mustache': '<html><body>',
9
+ 'footer.abcdef.mustache': '</body></html>',
10
+ 'view/index.abcdef.mustache': '<h1>With Root</h1>',
11
+ };
12
+ const manifest = JSON.stringify({
13
+ 'index.mustache': 'index.abcdef.mustache',
14
+ 'header.mustache': 'header.abcdef.mustache',
15
+ 'footer.mustache': 'footer.abcdef.mustache',
16
+ 'view/index.mustache': 'view/index.abcdef.mustache',
17
+ });
18
+ Object.assign(global, { __STATIC_CONTENT_MANIFEST: manifest });
19
+ Object.assign(global, {
20
+ __STATIC_CONTENT: {
21
+ get: (path) => {
22
+ return store[path];
23
+ },
24
+ },
25
+ });
26
+ describe('Mustache by Middleware', () => {
27
+ const app = new hono_1.Hono();
28
+ app.use('/foo', (0, _1.mustache)());
29
+ app.get('/foo', (c) => {
30
+ return c.render('index', { title: 'Hono!' }, {
31
+ header: 'header',
32
+ footer: 'footer',
33
+ });
34
+ });
35
+ app.use('/bar', (0, _1.mustache)({ root: 'view' }));
36
+ app.get('/bar', (c) => {
37
+ return c.render('index');
38
+ });
39
+ it('Mustache template rendering', async () => {
40
+ const res = await app.request('http://localhost/foo');
41
+ expect(res.status).toBe(200);
42
+ expect(await res.text()).toBe('<html><body>Title: Hono!</body></html>');
43
+ });
44
+ it('Mustache template rendering with root', async () => {
45
+ const res = await app.request('http://localhost/bar');
46
+ expect(res.status).toBe(200);
47
+ expect(await res.text()).toBe('<h1>With Root</h1>');
48
+ });
49
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const hono_1 = require("../../hono");
4
+ const _1 = require(".");
5
+ describe('Powered by Middleware', () => {
6
+ const app = new hono_1.Hono();
7
+ app.use('*', (0, _1.poweredBy)());
8
+ app.get('/', (c) => c.text('root'));
9
+ it('Should return with X-Powered-By header', async () => {
10
+ const res = await app.request('http://localhost/');
11
+ expect(res).not.toBeNull();
12
+ expect(res.status).toBe(200);
13
+ expect(res.headers.get('X-Powered-By')).toBe('Hono');
14
+ });
15
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const hono_1 = require("../../hono");
4
+ const _1 = require(".");
5
+ describe('JSON pretty by Middleware', () => {
6
+ const app = new hono_1.Hono();
7
+ app.get('/', (c) => {
8
+ return c.json({ message: 'Hono!' });
9
+ });
10
+ it('Should return pretty JSON output', async () => {
11
+ app.use('*', (0, _1.prettyJSON)());
12
+ const res = await app.request('http://localhost/?pretty');
13
+ expect(res).not.toBeNull();
14
+ expect(res.status).toBe(200);
15
+ expect(await res.text()).toBe(`{
16
+ "message": "Hono!"
17
+ }`);
18
+ });
19
+ it('Should return pretty JSON output with 4 spaces', async () => {
20
+ app.use('*', (0, _1.prettyJSON)({ space: 4 }));
21
+ const res = await app.request('http://localhost/?pretty');
22
+ expect(res).not.toBeNull();
23
+ expect(res.status).toBe(200);
24
+ expect(await res.text()).toBe(`{
25
+ "message": "Hono!"
26
+ }`);
27
+ });
28
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const hono_1 = require("../../hono");
4
+ const _1 = require(".");
5
+ // Mock
6
+ const store = {
7
+ 'assets/static/plain.abcdef.txt': 'This is plain.txt',
8
+ 'assets/static/hono.abcdef.html': '<h1>Hono!</h1>',
9
+ 'assets/static/top/index.abcdef.html': '<h1>Top</h1>',
10
+ 'static-no-root/plain.abcdef.txt': 'That is plain.txt',
11
+ };
12
+ const manifest = JSON.stringify({
13
+ 'assets/static/plain.txt': 'assets/static/plain.abcdef.txt',
14
+ 'assets/static/hono.html': 'assets/static/hono.abcdef.html',
15
+ 'assets/static/top/index.html': 'assets/static/top/index.abcdef.html',
16
+ 'static-no-root/plain.txt': 'static-no-root/plain.abcdef.txt',
17
+ });
18
+ Object.assign(global, { __STATIC_CONTENT_MANIFEST: manifest });
19
+ Object.assign(global, {
20
+ __STATIC_CONTENT: {
21
+ get: (path) => {
22
+ return store[path];
23
+ },
24
+ },
25
+ });
26
+ describe('ServeStatic Middleware', () => {
27
+ const app = new hono_1.Hono();
28
+ app.use('/static/*', (0, _1.serveStatic)({ root: './assets' }));
29
+ app.use('/static-no-root/*', (0, _1.serveStatic)());
30
+ it('Should return plain.txt', async () => {
31
+ const res = await app.request('http://localhost/static/plain.txt');
32
+ expect(res.status).toBe(200);
33
+ expect(await res.text()).toBe('This is plain.txt');
34
+ expect(res.headers.get('Content-Type')).toBe('text/plain; charset=utf-8');
35
+ });
36
+ it('Should return hono.html', async () => {
37
+ const res = await app.request('http://localhost/static/hono.html');
38
+ expect(res.status).toBe(200);
39
+ expect(await res.text()).toBe('<h1>Hono!</h1>');
40
+ expect(res.headers.get('Content-Type')).toBe('text/html; charset=utf-8');
41
+ });
42
+ it('Should return 404 response', async () => {
43
+ const res = await app.request('http://localhost/static/not-found.html');
44
+ expect(res.status).toBe(404);
45
+ });
46
+ it('Should return plan.txt', async () => {
47
+ const res = await app.request('http://localhost/static-no-root/plain.txt');
48
+ expect(res.status).toBe(200);
49
+ expect(await res.text()).toBe('That is plain.txt');
50
+ expect(res.headers.get('Content-Type')).toBe('text/plain; charset=utf-8');
51
+ });
52
+ it('Should return index.html', async () => {
53
+ const res = await app.request('http://localhost/static/top');
54
+ expect(res.status).toBe(200);
55
+ expect(await res.text()).toBe('<h1>Top</h1>');
56
+ expect(res.headers.get('Content-Type')).toBe('text/html; charset=utf-8');
57
+ });
58
+ });
@@ -1 +1 @@
1
- export { RegExpRouter } from '../../router/reg-exp-router/router';
1
+ export { RegExpRouter } from './router';
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RegExpRouter = void 0;
4
- var router_1 = require("../../router/reg-exp-router/router");
4
+ var router_1 = require("./router");
5
5
  Object.defineProperty(exports, "RegExpRouter", { enumerable: true, get: function () { return router_1.RegExpRouter; } });
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RegExpRouter = void 0;
4
4
  const router_1 = require("../../router");
5
- const trie_1 = require("../../router/reg-exp-router/trie");
5
+ const trie_1 = require("./trie");
6
6
  const emptyParam = {};
7
7
  const nullMatcher = [/^$/, []];
8
8
  function initHint(path) {
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const router_1 = require("../../router");
4
+ const router_2 = require("./router");
5
+ describe('Basic Usage', () => {
6
+ const router = new router_2.RegExpRouter();
7
+ router.add('GET', '/hello', 'get hello');
8
+ router.add('POST', '/hello', 'post hello');
9
+ it('get, post hello', async () => {
10
+ let res = router.match('GET', '/hello');
11
+ expect(res).not.toBeNull();
12
+ expect(res.handlers).toEqual(['get hello']);
13
+ res = router.match('POST', '/hello');
14
+ expect(res).not.toBeNull();
15
+ expect(res.handlers).toEqual(['post hello']);
16
+ res = router.match('PUT', '/hello');
17
+ expect(res).toBeNull();
18
+ res = router.match('GET', '/');
19
+ expect(res).toBeNull();
20
+ });
21
+ });
22
+ describe('Complex', () => {
23
+ let router;
24
+ beforeEach(() => {
25
+ router = new router_2.RegExpRouter();
26
+ });
27
+ it('Named Param', async () => {
28
+ router.add('GET', '/entry/:id', 'get entry');
29
+ const res = router.match('GET', '/entry/123');
30
+ expect(res).not.toBeNull();
31
+ expect(res.handlers).toEqual(['get entry']);
32
+ expect(res.params['id']).toBe('123');
33
+ });
34
+ it('Wildcard', async () => {
35
+ router.add('GET', '/wild/*/card', 'get wildcard');
36
+ const res = router.match('GET', '/wild/xxx/card');
37
+ expect(res).not.toBeNull();
38
+ expect(res.handlers).toEqual(['get wildcard']);
39
+ });
40
+ it('Default', async () => {
41
+ router.add('GET', '/api/abc', 'get api');
42
+ router.add('GET', '/api/*', 'fallback');
43
+ let res = router.match('GET', '/api/abc');
44
+ expect(res).not.toBeNull();
45
+ expect(res.handlers).toEqual(['fallback', 'get api']);
46
+ res = router.match('GET', '/api/def');
47
+ expect(res).not.toBeNull();
48
+ expect(res.handlers).toEqual(['fallback']);
49
+ });
50
+ it('Regexp', async () => {
51
+ router.add('GET', '/post/:date{[0-9]+}/:title{[a-z]+}', 'get post');
52
+ let res = router.match('GET', '/post/20210101/hello');
53
+ expect(res).not.toBeNull();
54
+ expect(res.handlers).toEqual(['get post']);
55
+ expect(res.params['date']).toBe('20210101');
56
+ expect(res.params['title']).toBe('hello');
57
+ res = router.match('GET', '/post/onetwothree');
58
+ expect(res).toBeNull();
59
+ res = router.match('GET', '/post/123/123');
60
+ expect(res).toBeNull();
61
+ });
62
+ });
63
+ describe('Order independent', () => {
64
+ let router;
65
+ beforeEach(() => {
66
+ router = new router_2.RegExpRouter();
67
+ });
68
+ it('abstract -> concrete', async () => {
69
+ router.add('GET', '/:type/:action', 'foo');
70
+ router.add('GET', '/posts/:id', 'bar');
71
+ const res = router.match('GET', '/posts/123');
72
+ expect(res).not.toBeNull();
73
+ expect(res.handlers).toEqual(['foo', 'bar']);
74
+ });
75
+ it('concrete -> abstract', async () => {
76
+ router.add('GET', '/posts/:id', 'bar');
77
+ router.add('GET', '/:type/:action', 'foo');
78
+ const res = router.match('GET', '/posts/123');
79
+ expect(res).not.toBeNull();
80
+ expect(res.handlers).toEqual(['foo', 'bar']);
81
+ });
82
+ });
83
+ describe('Optimization for METHOD_NAME_OF_ALL', () => {
84
+ let router;
85
+ beforeEach(() => {
86
+ router = new router_2.RegExpRouter();
87
+ });
88
+ it('Apply to all requests', async () => {
89
+ router.add(router_1.METHOD_NAME_ALL, '*', 'OK');
90
+ const res = router.match('GET', '/entry/123');
91
+ expect(res).not.toBeNull();
92
+ expect(res.handlers).toEqual(['OK']);
93
+ expect(res.params).toMatchObject({});
94
+ });
95
+ it('Apply to all requests under a specific path', async () => {
96
+ router.add(router_1.METHOD_NAME_ALL, '/path/to/*', 'OK');
97
+ let res = router.match('GET', '/entry/123');
98
+ expect(res).toBeNull();
99
+ res = router.match('GET', '/path/to/entry/123');
100
+ expect(res).not.toBeNull();
101
+ expect(res.handlers).toEqual(['OK']);
102
+ expect(res.params).toMatchObject({});
103
+ });
104
+ });
105
+ describe('Multi match', () => {
106
+ describe('Blog', () => {
107
+ const router = new router_2.RegExpRouter();
108
+ router.add('ALL', '*', 'middleware a');
109
+ router.add('GET', '*', 'middleware b');
110
+ router.add('GET', '/entry', 'get entries');
111
+ router.add('POST', '/entry/*', 'middleware c');
112
+ router.add('POST', '/entry', 'post entry');
113
+ router.add('GET', '/entry/:id', 'get entry');
114
+ router.add('GET', '/entry/:id/comment/:comment_id', 'get comment');
115
+ it('GET /', async () => {
116
+ const res = router.match('GET', '/');
117
+ expect(res).not.toBeNull();
118
+ expect(res.handlers).toEqual(['middleware a', 'middleware b']);
119
+ });
120
+ it('GET /entry/123', async () => {
121
+ const res = router.match('GET', '/entry/123');
122
+ expect(res).not.toBeNull();
123
+ expect(res.handlers).toEqual(['middleware a', 'middleware b', 'get entry']);
124
+ expect(res.params['id']).toBe('123');
125
+ });
126
+ it('GET /entry/123/comment/456', async () => {
127
+ const res = router.match('GET', '/entry/123/comment/456');
128
+ expect(res).not.toBeNull();
129
+ expect(res.handlers).toEqual(['middleware a', 'middleware b', 'get comment']);
130
+ expect(res.params['id']).toBe('123');
131
+ expect(res.params['comment_id']).toBe('456');
132
+ });
133
+ it('POST /entry', async () => {
134
+ const res = router.match('POST', '/entry');
135
+ expect(res).not.toBeNull();
136
+ expect(res.handlers).toEqual(['middleware a', 'middleware c', 'post entry']);
137
+ });
138
+ it('DELETE /entry', async () => {
139
+ const res = router.match('DELETE', '/entry');
140
+ expect(res).not.toBeNull();
141
+ expect(res.handlers).toEqual(['middleware a']);
142
+ });
143
+ });
144
+ describe('Ambiguous', () => {
145
+ const router = new router_2.RegExpRouter();
146
+ router.add('GET', '/:user/entries', 'get user entries');
147
+ router.add('GET', '/entry/:name', 'get entry');
148
+ it('GET /entry/entry', async () => {
149
+ const res = router.match('GET', '/entry/entries');
150
+ expect(res).not.toBeNull();
151
+ expect(res.handlers).toEqual(['get user entries', 'get entry']);
152
+ expect(res.params['user']).toBe('entry');
153
+ expect(res.params['name']).toBe('entries');
154
+ });
155
+ });
156
+ describe('Multiple handlers', () => {
157
+ const router = new router_2.RegExpRouter();
158
+ router.add('GET', '/:type/:id', ':type');
159
+ router.add('GET', '/:class/:id', ':class');
160
+ router.add('GET', '/:model/:id', ':model');
161
+ router.add('GET', '/entry/:id', 'entry');
162
+ it('GET /entry/123', async () => {
163
+ const res = router.match('GET', '/entry/123');
164
+ expect(res).not.toBeNull();
165
+ expect(res.handlers).toEqual([':type', ':class', ':model', 'entry']);
166
+ expect(res.params['type']).toBe('entry');
167
+ expect(res.params['class']).toBe('entry');
168
+ expect(res.params['model']).toBe('entry');
169
+ });
170
+ });
171
+ });
172
+ describe('Check for duplicate parameter names', () => {
173
+ it('self', () => {
174
+ const router = new router_2.RegExpRouter();
175
+ router.add('GET', '/:id/:id', 'get');
176
+ expect(() => {
177
+ router.match('GET', '/'); // check parameter names on the first `match` call
178
+ }).toThrowError(/Duplicate param name/);
179
+ });
180
+ it('parent', () => {
181
+ const router = new router_2.RegExpRouter();
182
+ router.add('GET', '/:id/:action', 'foo');
183
+ router.add('GET', '/posts/:id', 'bar');
184
+ expect(() => {
185
+ router.match('GET', '/');
186
+ }).toThrowError(/Duplicate param name/);
187
+ });
188
+ it('child', () => {
189
+ const router = new router_2.RegExpRouter();
190
+ router.add('GET', '/posts/:id', 'foo');
191
+ router.add('GET', '/:id/:action', 'bar');
192
+ expect(() => {
193
+ router.match('GET', '/');
194
+ }).toThrowError(/Duplicate param name/);
195
+ });
196
+ it('hierarchy', () => {
197
+ const router = new router_2.RegExpRouter();
198
+ router.add('GET', '/posts/:id/comments/:comment_id', 'foo');
199
+ router.add('GET', '/posts/:id', 'bar');
200
+ expect(() => {
201
+ router.match('GET', '/');
202
+ }).not.toThrow();
203
+ });
204
+ it('different regular expression', () => {
205
+ const router = new router_2.RegExpRouter();
206
+ router.add('GET', '/:id/:action{create|update}', 'foo');
207
+ router.add('GET', '/:id/:action{delete}', 'bar');
208
+ expect(() => {
209
+ router.match('GET', '/');
210
+ }).not.toThrow();
211
+ });
212
+ });
@@ -1,6 +1,6 @@
1
- import type { ParamMap, Context } from '../../router/reg-exp-router/node';
2
- import { Node } from '../../router/reg-exp-router/node';
3
- export type { ParamMap } from '../../router/reg-exp-router/node';
1
+ import type { ParamMap, Context } from './node';
2
+ import { Node } from './node';
3
+ export type { ParamMap } from './node';
4
4
  export declare type ReplacementMap = number[];
5
5
  interface InitOptions {
6
6
  reverse: boolean;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Trie = void 0;
4
- const node_1 = require("../../router/reg-exp-router/node");
4
+ const node_1 = require("./node");
5
5
  class Trie {
6
6
  constructor({ reverse } = { reverse: false }) {
7
7
  this.context = { varIndex: 0 };
@@ -1 +1 @@
1
- export { TrieRouter } from '../../router/trie-router/router';
1
+ export { TrieRouter } from './router';
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TrieRouter = void 0;
4
- var router_1 = require("../../router/trie-router/router");
4
+ var router_1 = require("./router");
5
5
  Object.defineProperty(exports, "TrieRouter", { enumerable: true, get: function () { return router_1.TrieRouter; } });
@@ -0,0 +1 @@
1
+ export {};