Просмотр исходного кода

refactor: adds definition property to route instance

e22m4u 3 недель назад
Родитель
Сommit
c9f72ba321
4 измененных файлов с 68 добавлено и 84 удалено
  1. 23 39
      dist/cjs/index.cjs
  2. 5 0
      src/route/route.d.ts
  3. 29 45
      src/route/route.js
  4. 11 0
      src/route/route.spec.js

+ 23 - 39
dist/cjs/index.cjs

@@ -1045,63 +1045,50 @@ var HttpMethod = {
 };
 };
 var _Route = class _Route extends import_js_debug.Debuggable {
 var _Route = class _Route extends import_js_debug.Debuggable {
   /**
   /**
-   * Method.
+   * Route definition.
    *
    *
-   * @type {string}
-   * @private
+   * @type {RouteDefinition}
    */
    */
-  _method;
+  _definition;
   /**
   /**
-   * Getter of the method.
+   * Getter of the route definition.
    *
    *
-   * @returns {string}
+   * @returns {RouteDefinition}
    */
    */
-  get method() {
-    return this._method;
+  get definition() {
+    return this._definition;
   }
   }
   /**
   /**
-   * Path template.
+   * Getter of the method.
    *
    *
-   * @type {string}
-   * @private
+   * @returns {string}
    */
    */
-  _path;
+  get method() {
+    return this._definition.method;
+  }
   /**
   /**
    * Getter of the path.
    * Getter of the path.
    *
    *
    * @returns {string}
    * @returns {string}
    */
    */
   get path() {
   get path() {
-    return this._path;
+    return this._definition.path;
   }
   }
-  /**
-   * Meta.
-   *
-   * @type {object}
-   */
-  _meta = {};
   /**
   /**
    * Getter of the meta.
    * Getter of the meta.
    *
    *
    * @returns {object}
    * @returns {object}
    */
    */
   get meta() {
   get meta() {
-    return this._meta;
+    return this._definition.meta;
   }
   }
-  /**
-   * Handler.
-   *
-   * @type {RouteHandler}
-   * @private
-   */
-  _handler;
   /**
   /**
    * Getter of the handler.
    * Getter of the handler.
    *
    *
    * @returns {*}
    * @returns {*}
    */
    */
   get handler() {
   get handler() {
-    return this._handler;
+    return this._definition.handler;
   }
   }
   /**
   /**
    * Hook registry.
    * Hook registry.
@@ -1130,25 +1117,22 @@ var _Route = class _Route extends import_js_debug.Debuggable {
       noInstantiationMessage: true
       noInstantiationMessage: true
     });
     });
     validateRouteDefinition(routeDef);
     validateRouteDefinition(routeDef);
-    this._method = routeDef.method.toUpperCase();
-    this._path = routeDef.path;
-    if (routeDef.meta !== void 0) {
-      this._meta = cloneDeep(routeDef.meta);
-    }
-    this._handler = routeDef.handler;
+    this._definition = cloneDeep(routeDef);
+    this._definition.method = this._definition.method.toUpperCase();
+    this._definition.meta = this._definition.meta || {};
     if (routeDef.preHandler !== void 0) {
     if (routeDef.preHandler !== void 0) {
-      const preHandlerHooks = Array.isArray(routeDef.preHandler) ? routeDef.preHandler : [routeDef.preHandler];
+      const preHandlerHooks = [routeDef.preHandler].flat().filter(Boolean);
       preHandlerHooks.forEach((hook) => {
       preHandlerHooks.forEach((hook) => {
         this._hookRegistry.addHook(RouterHookType.PRE_HANDLER, hook);
         this._hookRegistry.addHook(RouterHookType.PRE_HANDLER, hook);
       });
       });
     }
     }
     if (routeDef.postHandler !== void 0) {
     if (routeDef.postHandler !== void 0) {
-      const postHandlerHooks = Array.isArray(routeDef.postHandler) ? routeDef.postHandler : [routeDef.postHandler];
+      const postHandlerHooks = [routeDef.postHandler].flat().filter(Boolean);
       postHandlerHooks.forEach((hook) => {
       postHandlerHooks.forEach((hook) => {
         this._hookRegistry.addHook(RouterHookType.POST_HANDLER, hook);
         this._hookRegistry.addHook(RouterHookType.POST_HANDLER, hook);
       });
       });
     }
     }
-    this.ctorDebug("A new route %s %v was created.", this._method, this._path);
+    this.ctorDebug("A new route %s %v was created.", this.method, this.path);
   }
   }
   /**
   /**
    * Handle request.
    * Handle request.
@@ -1161,10 +1145,10 @@ var _Route = class _Route extends import_js_debug.Debuggable {
     const requestPath = getRequestPathname(context.request);
     const requestPath = getRequestPathname(context.request);
     debug(
     debug(
       "Invoking the Route handler for the request %s %v.",
       "Invoking the Route handler for the request %s %v.",
-      this.method.toUpperCase(),
+      this.method,
       requestPath
       requestPath
     );
     );
-    return this._handler(context);
+    return this.handler(context);
   }
   }
 };
 };
 __name(_Route, "Route");
 __name(_Route, "Route");

+ 5 - 0
src/route/route.d.ts

@@ -59,6 +59,11 @@ export type RouteDefinition = {
  * Route.
  * Route.
  */
  */
 export declare class Route {
 export declare class Route {
+  /**
+   * Route definition.
+   */
+  get definition(): RouteDefinition;
+
   /**
   /**
    * Method.
    * Method.
    */
    */

+ 29 - 45
src/route/route.js

@@ -43,29 +43,29 @@ export const HttpMethod = {
  */
  */
 export class Route extends Debuggable {
 export class Route extends Debuggable {
   /**
   /**
-   * Method.
+   * Route definition.
    *
    *
-   * @type {string}
-   * @private
+   * @type {RouteDefinition}
    */
    */
-  _method;
+  _definition;
 
 
   /**
   /**
-   * Getter of the method.
+   * Getter of the route definition.
    *
    *
-   * @returns {string}
+   * @returns {RouteDefinition}
    */
    */
-  get method() {
-    return this._method;
+  get definition() {
+    return this._definition;
   }
   }
 
 
   /**
   /**
-   * Path template.
+   * Getter of the method.
    *
    *
-   * @type {string}
-   * @private
+   * @returns {string}
    */
    */
-  _path;
+  get method() {
+    return this._definition.method;
+  }
 
 
   /**
   /**
    * Getter of the path.
    * Getter of the path.
@@ -73,40 +73,25 @@ export class Route extends Debuggable {
    * @returns {string}
    * @returns {string}
    */
    */
   get path() {
   get path() {
-    return this._path;
+    return this._definition.path;
   }
   }
 
 
-  /**
-   * Meta.
-   *
-   * @type {object}
-   */
-  _meta = {};
-
   /**
   /**
    * Getter of the meta.
    * Getter of the meta.
    *
    *
    * @returns {object}
    * @returns {object}
    */
    */
   get meta() {
   get meta() {
-    return this._meta;
+    return this._definition.meta;
   }
   }
 
 
-  /**
-   * Handler.
-   *
-   * @type {RouteHandler}
-   * @private
-   */
-  _handler;
-
   /**
   /**
    * Getter of the handler.
    * Getter of the handler.
    *
    *
    * @returns {*}
    * @returns {*}
    */
    */
   get handler() {
   get handler() {
-    return this._handler;
+    return this._definition.handler;
   }
   }
 
 
   /**
   /**
@@ -138,29 +123,28 @@ export class Route extends Debuggable {
       noInstantiationMessage: true,
       noInstantiationMessage: true,
     });
     });
     validateRouteDefinition(routeDef);
     validateRouteDefinition(routeDef);
-    this._method = routeDef.method.toUpperCase();
-    this._path = routeDef.path;
-    if (routeDef.meta !== undefined) {
-      this._meta = cloneDeep(routeDef.meta);
-    }
-    this._handler = routeDef.handler;
+    // установка копии определения
+    // в свойство экземпляра
+    this._definition = cloneDeep(routeDef);
+    // нормализация метода и метаданных
+    // выполняется в конструкторе единожды
+    this._definition.method = this._definition.method.toUpperCase();
+    this._definition.meta = this._definition.meta || {};
+    // регистрация хуков маршрута
+    // в экземпляре реестра
     if (routeDef.preHandler !== undefined) {
     if (routeDef.preHandler !== undefined) {
-      const preHandlerHooks = Array.isArray(routeDef.preHandler)
-        ? routeDef.preHandler
-        : [routeDef.preHandler];
+      const preHandlerHooks = [routeDef.preHandler].flat().filter(Boolean);
       preHandlerHooks.forEach(hook => {
       preHandlerHooks.forEach(hook => {
         this._hookRegistry.addHook(RouterHookType.PRE_HANDLER, hook);
         this._hookRegistry.addHook(RouterHookType.PRE_HANDLER, hook);
       });
       });
     }
     }
     if (routeDef.postHandler !== undefined) {
     if (routeDef.postHandler !== undefined) {
-      const postHandlerHooks = Array.isArray(routeDef.postHandler)
-        ? routeDef.postHandler
-        : [routeDef.postHandler];
+      const postHandlerHooks = [routeDef.postHandler].flat().filter(Boolean);
       postHandlerHooks.forEach(hook => {
       postHandlerHooks.forEach(hook => {
         this._hookRegistry.addHook(RouterHookType.POST_HANDLER, hook);
         this._hookRegistry.addHook(RouterHookType.POST_HANDLER, hook);
       });
       });
     }
     }
-    this.ctorDebug('A new route %s %v was created.', this._method, this._path);
+    this.ctorDebug('A new route %s %v was created.', this.method, this.path);
   }
   }
 
 
   /**
   /**
@@ -174,9 +158,9 @@ export class Route extends Debuggable {
     const requestPath = getRequestPathname(context.request);
     const requestPath = getRequestPathname(context.request);
     debug(
     debug(
       'Invoking the Route handler for the request %s %v.',
       'Invoking the Route handler for the request %s %v.',
-      this.method.toUpperCase(),
+      this.method,
       requestPath,
       requestPath,
     );
     );
-    return this._handler(context);
+    return this.handler(context);
   }
   }
 }
 }

+ 11 - 0
src/route/route.spec.js

@@ -30,6 +30,17 @@ describe('Route', function () {
       })();
       })();
     });
     });
 
 
+    it('should set a given definition to the "definition" property', function () {
+      const definition = {
+        method: HttpMethod.GET,
+        path: ROOT_PATH,
+        handler: () => undefined,
+        meta: {foo: 'bar'},
+      };
+      const route = new Route(definition);
+      expect(route.definition).to.be.eql(definition);
+    });
+
     describe('the "method" option', function () {
     describe('the "method" option', function () {
       it('should require the "method" option to be a non-empty String', function () {
       it('should require the "method" option to be a non-empty String', function () {
         const throwable = v => () =>
         const throwable = v => () =>