@e22m4u/js-trie-router 0.4.0 → 0.4.2

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 (68) hide show
  1. package/.mocharc.cjs +1 -0
  2. package/README.md +49 -36
  3. package/dist/cjs/index.cjs +216 -157
  4. package/mocha-setup.js +4 -0
  5. package/package.json +2 -2
  6. package/src/debuggable-service.spec.js +1 -1
  7. package/src/hooks/hook-invoker.spec.js +1 -1
  8. package/src/hooks/hook-registry.spec.js +1 -1
  9. package/src/parsers/body-parser.d.ts +2 -2
  10. package/src/parsers/body-parser.js +6 -6
  11. package/src/parsers/body-parser.spec.js +2 -2
  12. package/src/parsers/cookies-parser.d.ts +2 -2
  13. package/src/parsers/cookies-parser.js +5 -5
  14. package/src/parsers/cookies-parser.spec.js +1 -1
  15. package/src/parsers/query-parser.d.ts +2 -2
  16. package/src/parsers/query-parser.js +5 -5
  17. package/src/parsers/query-parser.spec.js +1 -1
  18. package/src/parsers/request-parser.d.ts +2 -2
  19. package/src/parsers/request-parser.js +8 -8
  20. package/src/parsers/request-parser.spec.js +1 -1
  21. package/src/request-context.d.ts +13 -9
  22. package/src/request-context.js +75 -18
  23. package/src/request-context.spec.js +46 -18
  24. package/src/route-registry.d.ts +2 -2
  25. package/src/route-registry.js +7 -7
  26. package/src/route-registry.spec.js +1 -1
  27. package/src/route.js +1 -1
  28. package/src/route.spec.js +2 -2
  29. package/src/router-options.spec.js +1 -1
  30. package/src/senders/data-sender.d.ts +2 -2
  31. package/src/senders/data-sender.js +11 -11
  32. package/src/senders/data-sender.spec.js +1 -1
  33. package/src/senders/error-sender.d.ts +11 -6
  34. package/src/senders/error-sender.js +19 -19
  35. package/src/senders/error-sender.spec.js +6 -3
  36. package/src/trie-router.js +20 -24
  37. package/src/trie-router.spec.js +37 -25
  38. package/src/utils/clone-deep.js +1 -1
  39. package/src/utils/clone-deep.spec.js +1 -1
  40. package/src/utils/create-cookies-string.spec.js +1 -1
  41. package/src/utils/create-debugger.spec.js +1 -1
  42. package/src/utils/create-error.spec.js +1 -1
  43. package/src/utils/create-request-mock.js +11 -11
  44. package/src/utils/create-request-mock.spec.js +1 -1
  45. package/src/utils/create-response-mock.d.ts +2 -1
  46. package/src/utils/create-response-mock.js +30 -30
  47. package/src/utils/create-response-mock.spec.js +1 -1
  48. package/src/utils/create-route-mock.d.ts +19 -0
  49. package/src/utils/create-route-mock.js +22 -0
  50. package/src/utils/create-route-mock.spec.js +28 -0
  51. package/src/utils/fetch-request-body.d.ts +2 -2
  52. package/src/utils/fetch-request-body.js +16 -13
  53. package/src/utils/fetch-request-body.spec.js +1 -1
  54. package/src/utils/get-request-pathname.d.ts +2 -2
  55. package/src/utils/get-request-pathname.js +8 -8
  56. package/src/utils/get-request-pathname.spec.js +1 -1
  57. package/src/utils/index.d.ts +1 -0
  58. package/src/utils/index.js +1 -0
  59. package/src/utils/is-promise.spec.js +1 -1
  60. package/src/utils/is-readable-stream.spec.js +1 -1
  61. package/src/utils/is-response-sent.d.ts +2 -2
  62. package/src/utils/is-response-sent.js +8 -8
  63. package/src/utils/is-response-sent.spec.js +1 -1
  64. package/src/utils/is-writable-stream.spec.js +1 -1
  65. package/src/utils/parse-content-type.spec.js +1 -1
  66. package/src/utils/parse-cookies.spec.js +1 -1
  67. package/src/utils/to-camel-case.spec.js +1 -1
  68. package/src/chai.js +0 -7
package/.mocharc.cjs CHANGED
@@ -1,4 +1,5 @@
1
1
  module.exports = {
2
2
  extension: ['js'],
3
3
  spec: 'src/**/*.spec.js',
4
+ require: ['./mocha-setup.js'],
4
5
  }
package/README.md CHANGED
@@ -53,15 +53,15 @@ const {TrieRouter} = require('@e22m4u/js-trie-router');
53
53
 
54
54
  ```js
55
55
  import http from 'http';
56
- import {TrieRouter} from '@e22m4u/js-trie-router';
56
+ import {TrieRouter, HttpMethod} from '@e22m4u/js-trie-router';
57
57
 
58
58
  const server = new http.Server(); // создание экземпляра HTTP сервера
59
59
  const router = new TrieRouter(); // создание экземпляра роутера
60
60
 
61
61
  router.defineRoute({
62
- method: 'GET', // метод запроса "GET", "POST" и т.д.
63
- path: '/', // шаблон пути, пример "/user/:id"
64
- handler(ctx) { // обработчик маршрута
62
+ method: HttpMethod.GET, // метод запроса "GET", "POST" и т.д.
63
+ path: '/', // шаблон пути, пример "/user/:id"
64
+ handler(ctx) { // обработчик маршрута
65
65
  return 'Hello world!';
66
66
  },
67
67
  });
@@ -72,46 +72,55 @@ server.listen(3000, 'localhost'); // прослушивание за
72
72
  // Open in browser http://localhost:3000
73
73
  ```
74
74
 
75
+ *i. Для указания метода запроса рекомендуется использовать
76
+ константу `HttpMethod`, чтобы избежать опечаток.*
77
+
75
78
  ### Контекст запроса
76
79
 
77
80
  Первый параметр обработчика маршрута принимает экземпляр класса
78
81
  `RequestContext` с набором свойств, содержащих разобранные
79
82
  данные входящего запроса.
80
83
 
81
- - `cont: ServiceContainer` экземпляр [сервис-контейнера](https://npmjs.com/package/@e22m4u/js-service)
82
- - `req: IncomingMessage` нативный поток входящего запроса
83
- - `res: ServerResponse` нативный поток ответа сервера
84
- - `params: ParsedParams` объект ключ-значение с параметрами пути
85
- - `query: ParsedQuery` объект ключ-значение с параметрами строки запроса
86
- - `headers: ParsedHeaders` объект ключ-значение с заголовками запроса
87
- - `cookies: ParsedCookies` объект ключ-значение разобранного заголовка `Cookie`
88
- - `method: string` метод запроса в верхнем регистре, например `GET`, `POST` и т.д.
89
- - `path: string` путь включающий строку запроса, например `/myPath?foo=bar`
90
- - `pathname: string` путь запроса, например `/myPath`
91
- - `body: unknown` тело запроса
92
- - `meta: object` мета-данные из определения маршрута
84
+ - `params: ParsedParams` объект ключ-значение с параметрами пути;
85
+ - `query: ParsedQuery` объект ключ-значение с параметрами строки запроса;
86
+ - `headers: ParsedHeaders` объект ключ-значение с заголовками запроса;
87
+ - `cookies: ParsedCookies` объект ключ-значение разобранного заголовка `Cookie`;
88
+ - `method: HttpMethod` метод запроса в верхнем регистре, например `GET`, `POST` и т.д.;
89
+ - `path: string` путь включающий строку запроса, например `/myPath?foo=bar`;
90
+ - `pathname: string` путь запроса, например `/myPath`;
91
+ - `body: unknown` тело запроса;
92
+
93
+ Дополнительные свойства:
94
+
95
+ - `container: ServiceContainer` экземпляр [сервис-контейнера](https://npmjs.com/package/@e22m4u/js-service);
96
+ - `request: IncomingMessage` нативный поток входящего запроса;
97
+ - `response: ServerResponse` нативный поток ответа сервера;
98
+ - `route: Route` экземпляр текущего маршрута;
99
+ - `meta: object` геттер для доступа к метаданным маршрута (`route.meta`);
93
100
 
94
101
  Пример доступа к контексту из обработчика маршрута.
95
102
 
96
103
  ```js
97
104
  router.defineRoute({
98
- method: 'GET',
105
+ method: HttpMethod.GET,
99
106
  path: '/users/:id',
100
107
  meta: {prop: 'value'},
101
108
  handler(ctx) {
102
109
  // GET /users/10?include=city
103
110
  // Cookie: foo=bar; baz=qux;
104
- console.log(ctx.req); // IncomingMessage
105
- console.log(ctx.res); // ServerResponse
106
- console.log(ctx.params); // {id: 10}
107
- console.log(ctx.query); // {include: 'city'}
108
- console.log(ctx.headers); // {cookie: 'foo=bar; baz=qux;'}
109
- console.log(ctx.cookies); // {foo: 'bar', baz: 'qux'}
110
- console.log(ctx.method); // "GET"
111
- console.log(ctx.path); // "/users/10?include=city"
112
- console.log(ctx.pathname); // "/users/10"
113
- console.log(ctx.meta); // {prop: 'value'}
114
- console.log(ctx.cont); // ServiceContainer
111
+ console.log(ctx.params); // {id: 10}
112
+ console.log(ctx.query); // {include: 'city'}
113
+ console.log(ctx.headers); // {cookie: 'foo=bar; baz=qux;'}
114
+ console.log(ctx.cookies); // {foo: 'bar', baz: 'qux'}
115
+ console.log(ctx.method); // "GET"
116
+ console.log(ctx.path); // "/users/10?include=city"
117
+ console.log(ctx.pathname); // "/users/10"
118
+ // дополнительные свойства
119
+ console.log(ctx.container); // ServiceContainer
120
+ console.log(ctx.request); // IncomingMessage
121
+ console.log(ctx.response); // ServerResponse
122
+ console.log(ctx.route); // Route
123
+ console.log(ctx.meta); // {prop: 'value'}
115
124
  // ...
116
125
  },
117
126
  });
@@ -150,10 +159,13 @@ router.defineRoute({ // регистрация маршрута
150
159
  ```js
151
160
  router.defineRoute({
152
161
  // ...
153
- handler(ctx) {
154
- ctx.res.statusCode = 404;
155
- ctx.res.setHeader('content-type', 'text/plain; charset=utf-8');
156
- ctx.res.end('404 Not Found', 'utf-8');
162
+ // для доступа к свойству `response` (ServerResponse)
163
+ // используется деструктуризация контекста запроса,
164
+ // что аналогично записи handler(ctx) { ctx.response ...
165
+ handler({response}) {
166
+ response.statusCode = 404;
167
+ response.setHeader('content-type', 'text/plain; charset=utf-8');
168
+ response.end('404 Not Found', 'utf-8');
157
169
  },
158
170
  });
159
171
  ```
@@ -257,12 +269,13 @@ router.addPostHandler((ctx, data) => {
257
269
  быть схемы для валидации данных, правила доступа или настройки кэширования.
258
270
  Для этой цели определение маршрута поддерживает необязательное свойство `meta`.
259
271
 
260
- Маршрутизатор лишь обеспечивает передачу мета-данных в контекст запроса,
261
- откуда его могут прочитать обработчики или хуки.
272
+ Маршрутизатор передает в контекст запроса найденный маршрут. Контекст,
273
+ в свою очередь, предоставляет доступ к мета-данным этого маршрута через
274
+ свойство `meta`, откуда их могут прочитать обработчики или хуки.
262
275
 
263
276
  ```js
264
277
  import http from 'http';
265
- import {TrieRouter} from '@e22m4u/js-trie-router';
278
+ import {TrieRouter, HttpMethod} from '@e22m4u/js-trie-router';
266
279
 
267
280
  const server = new http.Server();
268
281
  const router = new TrieRouter();
@@ -275,7 +288,7 @@ router.addPreHandler((ctx) => {
275
288
  });
276
289
 
277
290
  router.defineRoute({
278
- method: 'GET',
291
+ method: HttpMethod.GET,
279
292
  path: '/',
280
293
  meta: {foo: 'bar'}, // <= мета-данные
281
294
  handler(ctx) {