@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 +1 -0
- package/dist/cjs/index.cjs +23 -39
- package/package.json +1 -1
- package/src/route/route.d.ts +5 -0
- package/src/route/route.js +29 -45
- package/src/route/route.spec.js +11 -0
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
|
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -1045,63 +1045,50 @@ var HttpMethod = {
|
|
|
1045
1045
|
};
|
|
1046
1046
|
var _Route = class _Route extends import_js_debug.Debuggable {
|
|
1047
1047
|
/**
|
|
1048
|
-
*
|
|
1048
|
+
* Route definition.
|
|
1049
1049
|
*
|
|
1050
|
-
* @type {
|
|
1051
|
-
* @private
|
|
1050
|
+
* @type {RouteDefinition}
|
|
1052
1051
|
*/
|
|
1053
|
-
|
|
1052
|
+
_definition;
|
|
1054
1053
|
/**
|
|
1055
|
-
* Getter of the
|
|
1054
|
+
* Getter of the route definition.
|
|
1056
1055
|
*
|
|
1057
|
-
* @returns {
|
|
1056
|
+
* @returns {RouteDefinition}
|
|
1058
1057
|
*/
|
|
1059
|
-
get
|
|
1060
|
-
return this.
|
|
1058
|
+
get definition() {
|
|
1059
|
+
return this._definition;
|
|
1061
1060
|
}
|
|
1062
1061
|
/**
|
|
1063
|
-
*
|
|
1062
|
+
* Getter of the method.
|
|
1064
1063
|
*
|
|
1065
|
-
* @
|
|
1066
|
-
* @private
|
|
1064
|
+
* @returns {string}
|
|
1067
1065
|
*/
|
|
1068
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1134
|
-
this.
|
|
1135
|
-
|
|
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 =
|
|
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 =
|
|
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.
|
|
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
|
|
1148
|
+
this.method,
|
|
1165
1149
|
requestPath
|
|
1166
1150
|
);
|
|
1167
|
-
return this.
|
|
1151
|
+
return this.handler(context);
|
|
1168
1152
|
}
|
|
1169
1153
|
};
|
|
1170
1154
|
__name(_Route, "Route");
|
package/package.json
CHANGED
package/src/route/route.d.ts
CHANGED
package/src/route/route.js
CHANGED
|
@@ -43,29 +43,29 @@ export const HttpMethod = {
|
|
|
43
43
|
*/
|
|
44
44
|
export class Route extends Debuggable {
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
46
|
+
* Route definition.
|
|
47
47
|
*
|
|
48
|
-
* @type {
|
|
49
|
-
* @private
|
|
48
|
+
* @type {RouteDefinition}
|
|
50
49
|
*/
|
|
51
|
-
|
|
50
|
+
_definition;
|
|
52
51
|
|
|
53
52
|
/**
|
|
54
|
-
* Getter of the
|
|
53
|
+
* Getter of the route definition.
|
|
55
54
|
*
|
|
56
|
-
* @returns {
|
|
55
|
+
* @returns {RouteDefinition}
|
|
57
56
|
*/
|
|
58
|
-
get
|
|
59
|
-
return this.
|
|
57
|
+
get definition() {
|
|
58
|
+
return this._definition;
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
/**
|
|
63
|
-
*
|
|
62
|
+
* Getter of the method.
|
|
64
63
|
*
|
|
65
|
-
* @
|
|
66
|
-
* @private
|
|
64
|
+
* @returns {string}
|
|
67
65
|
*/
|
|
68
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.
|
|
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 =
|
|
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 =
|
|
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.
|
|
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
|
|
161
|
+
this.method,
|
|
178
162
|
requestPath,
|
|
179
163
|
);
|
|
180
|
-
return this.
|
|
164
|
+
return this.handler(context);
|
|
181
165
|
}
|
|
182
166
|
}
|
package/src/route/route.spec.js
CHANGED
|
@@ -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 => () =>
|