@e22m4u/js-trie-router 0.5.3 → 0.5.4

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/README.md CHANGED
@@ -11,6 +11,7 @@ HTTP маршрутизатор для Node.js на основе
11
11
  - Парсинг строки запроса и заголовка `Cookie`.
12
12
  - Поддержка `preHandler` и `postHandler` хуков.
13
13
  - Позволяет использовать асинхронные обработчики.
14
+ - Поддержка ветвления маршрутов с общим префиксом.
14
15
 
15
16
  ## Содержание
16
17
 
@@ -1045,63 +1045,50 @@ var HttpMethod = {
1045
1045
  };
1046
1046
  var _Route = class _Route extends import_js_debug.Debuggable {
1047
1047
  /**
1048
- * Method.
1048
+ * Route definition.
1049
1049
  *
1050
- * @type {string}
1051
- * @private
1050
+ * @type {RouteDefinition}
1052
1051
  */
1053
- _method;
1052
+ _definition;
1054
1053
  /**
1055
- * Getter of the method.
1054
+ * Getter of the route definition.
1056
1055
  *
1057
- * @returns {string}
1056
+ * @returns {RouteDefinition}
1058
1057
  */
1059
- get method() {
1060
- return this._method;
1058
+ get definition() {
1059
+ return this._definition;
1061
1060
  }
1062
1061
  /**
1063
- * Path template.
1062
+ * Getter of the method.
1064
1063
  *
1065
- * @type {string}
1066
- * @private
1064
+ * @returns {string}
1067
1065
  */
1068
- _path;
1066
+ get method() {
1067
+ return this._definition.method;
1068
+ }
1069
1069
  /**
1070
1070
  * Getter of the path.
1071
1071
  *
1072
1072
  * @returns {string}
1073
1073
  */
1074
1074
  get path() {
1075
- return this._path;
1075
+ return this._definition.path;
1076
1076
  }
1077
- /**
1078
- * Meta.
1079
- *
1080
- * @type {object}
1081
- */
1082
- _meta = {};
1083
1077
  /**
1084
1078
  * Getter of the meta.
1085
1079
  *
1086
1080
  * @returns {object}
1087
1081
  */
1088
1082
  get meta() {
1089
- return this._meta;
1083
+ return this._definition.meta;
1090
1084
  }
1091
- /**
1092
- * Handler.
1093
- *
1094
- * @type {RouteHandler}
1095
- * @private
1096
- */
1097
- _handler;
1098
1085
  /**
1099
1086
  * Getter of the handler.
1100
1087
  *
1101
1088
  * @returns {*}
1102
1089
  */
1103
1090
  get handler() {
1104
- return this._handler;
1091
+ return this._definition.handler;
1105
1092
  }
1106
1093
  /**
1107
1094
  * Hook registry.
@@ -1130,25 +1117,22 @@ var _Route = class _Route extends import_js_debug.Debuggable {
1130
1117
  noInstantiationMessage: true
1131
1118
  });
1132
1119
  validateRouteDefinition(routeDef);
1133
- this._method = routeDef.method.toUpperCase();
1134
- this._path = routeDef.path;
1135
- if (routeDef.meta !== void 0) {
1136
- this._meta = cloneDeep(routeDef.meta);
1137
- }
1138
- this._handler = routeDef.handler;
1120
+ this._definition = cloneDeep(routeDef);
1121
+ this._definition.method = this._definition.method.toUpperCase();
1122
+ this._definition.meta = this._definition.meta || {};
1139
1123
  if (routeDef.preHandler !== void 0) {
1140
- const preHandlerHooks = Array.isArray(routeDef.preHandler) ? routeDef.preHandler : [routeDef.preHandler];
1124
+ const preHandlerHooks = [routeDef.preHandler].flat().filter(Boolean);
1141
1125
  preHandlerHooks.forEach((hook) => {
1142
1126
  this._hookRegistry.addHook(RouterHookType.PRE_HANDLER, hook);
1143
1127
  });
1144
1128
  }
1145
1129
  if (routeDef.postHandler !== void 0) {
1146
- const postHandlerHooks = Array.isArray(routeDef.postHandler) ? routeDef.postHandler : [routeDef.postHandler];
1130
+ const postHandlerHooks = [routeDef.postHandler].flat().filter(Boolean);
1147
1131
  postHandlerHooks.forEach((hook) => {
1148
1132
  this._hookRegistry.addHook(RouterHookType.POST_HANDLER, hook);
1149
1133
  });
1150
1134
  }
1151
- this.ctorDebug("A new route %s %v was created.", this._method, this._path);
1135
+ this.ctorDebug("A new route %s %v was created.", this.method, this.path);
1152
1136
  }
1153
1137
  /**
1154
1138
  * Handle request.
@@ -1161,10 +1145,10 @@ var _Route = class _Route extends import_js_debug.Debuggable {
1161
1145
  const requestPath = getRequestPathname(context.request);
1162
1146
  debug(
1163
1147
  "Invoking the Route handler for the request %s %v.",
1164
- this.method.toUpperCase(),
1148
+ this.method,
1165
1149
  requestPath
1166
1150
  );
1167
- return this._handler(context);
1151
+ return this.handler(context);
1168
1152
  }
1169
1153
  };
1170
1154
  __name(_Route, "Route");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e22m4u/js-trie-router",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "description": "HTTP маршрутизатор для Node.js на основе префиксного дерева",
5
5
  "author": "Mikhail Evstropov <e22m4u@yandex.ru>",
6
6
  "license": "MIT",
@@ -59,6 +59,11 @@ export type RouteDefinition = {
59
59
  * Route.
60
60
  */
61
61
  export declare class Route {
62
+ /**
63
+ * Route definition.
64
+ */
65
+ get definition(): RouteDefinition;
66
+
62
67
  /**
63
68
  * Method.
64
69
  */
@@ -43,29 +43,29 @@ export const HttpMethod = {
43
43
  */
44
44
  export class Route extends Debuggable {
45
45
  /**
46
- * Method.
46
+ * Route definition.
47
47
  *
48
- * @type {string}
49
- * @private
48
+ * @type {RouteDefinition}
50
49
  */
51
- _method;
50
+ _definition;
52
51
 
53
52
  /**
54
- * Getter of the method.
53
+ * Getter of the route definition.
55
54
  *
56
- * @returns {string}
55
+ * @returns {RouteDefinition}
57
56
  */
58
- get method() {
59
- return this._method;
57
+ get definition() {
58
+ return this._definition;
60
59
  }
61
60
 
62
61
  /**
63
- * Path template.
62
+ * Getter of the method.
64
63
  *
65
- * @type {string}
66
- * @private
64
+ * @returns {string}
67
65
  */
68
- _path;
66
+ get method() {
67
+ return this._definition.method;
68
+ }
69
69
 
70
70
  /**
71
71
  * Getter of the path.
@@ -73,40 +73,25 @@ export class Route extends Debuggable {
73
73
  * @returns {string}
74
74
  */
75
75
  get path() {
76
- return this._path;
76
+ return this._definition.path;
77
77
  }
78
78
 
79
- /**
80
- * Meta.
81
- *
82
- * @type {object}
83
- */
84
- _meta = {};
85
-
86
79
  /**
87
80
  * Getter of the meta.
88
81
  *
89
82
  * @returns {object}
90
83
  */
91
84
  get meta() {
92
- return this._meta;
85
+ return this._definition.meta;
93
86
  }
94
87
 
95
- /**
96
- * Handler.
97
- *
98
- * @type {RouteHandler}
99
- * @private
100
- */
101
- _handler;
102
-
103
88
  /**
104
89
  * Getter of the handler.
105
90
  *
106
91
  * @returns {*}
107
92
  */
108
93
  get handler() {
109
- return this._handler;
94
+ return this._definition.handler;
110
95
  }
111
96
 
112
97
  /**
@@ -138,29 +123,28 @@ export class Route extends Debuggable {
138
123
  noInstantiationMessage: true,
139
124
  });
140
125
  validateRouteDefinition(routeDef);
141
- this._method = routeDef.method.toUpperCase();
142
- this._path = routeDef.path;
143
- if (routeDef.meta !== undefined) {
144
- this._meta = cloneDeep(routeDef.meta);
145
- }
146
- this._handler = routeDef.handler;
126
+ // установка копии определения
127
+ // в свойство экземпляра
128
+ this._definition = cloneDeep(routeDef);
129
+ // нормализация метода и метаданных
130
+ // выполняется в конструкторе единожды
131
+ this._definition.method = this._definition.method.toUpperCase();
132
+ this._definition.meta = this._definition.meta || {};
133
+ // регистрация хуков маршрута
134
+ // в экземпляре реестра
147
135
  if (routeDef.preHandler !== undefined) {
148
- const preHandlerHooks = Array.isArray(routeDef.preHandler)
149
- ? routeDef.preHandler
150
- : [routeDef.preHandler];
136
+ const preHandlerHooks = [routeDef.preHandler].flat().filter(Boolean);
151
137
  preHandlerHooks.forEach(hook => {
152
138
  this._hookRegistry.addHook(RouterHookType.PRE_HANDLER, hook);
153
139
  });
154
140
  }
155
141
  if (routeDef.postHandler !== undefined) {
156
- const postHandlerHooks = Array.isArray(routeDef.postHandler)
157
- ? routeDef.postHandler
158
- : [routeDef.postHandler];
142
+ const postHandlerHooks = [routeDef.postHandler].flat().filter(Boolean);
159
143
  postHandlerHooks.forEach(hook => {
160
144
  this._hookRegistry.addHook(RouterHookType.POST_HANDLER, hook);
161
145
  });
162
146
  }
163
- this.ctorDebug('A new route %s %v was created.', this._method, this._path);
147
+ this.ctorDebug('A new route %s %v was created.', this.method, this.path);
164
148
  }
165
149
 
166
150
  /**
@@ -174,9 +158,9 @@ export class Route extends Debuggable {
174
158
  const requestPath = getRequestPathname(context.request);
175
159
  debug(
176
160
  'Invoking the Route handler for the request %s %v.',
177
- this.method.toUpperCase(),
161
+ this.method,
178
162
  requestPath,
179
163
  );
180
- return this._handler(context);
164
+ return this.handler(context);
181
165
  }
182
166
  }
@@ -30,6 +30,17 @@ describe('Route', function () {
30
30
  })();
31
31
  });
32
32
 
33
+ it('should set a given definition to the "definition" property', function () {
34
+ const definition = {
35
+ method: HttpMethod.GET,
36
+ path: ROOT_PATH,
37
+ handler: () => undefined,
38
+ meta: {foo: 'bar'},
39
+ };
40
+ const route = new Route(definition);
41
+ expect(route.definition).to.be.eql(definition);
42
+ });
43
+
33
44
  describe('the "method" option', function () {
34
45
  it('should require the "method" option to be a non-empty String', function () {
35
46
  const throwable = v => () =>