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

refactor: moves route definition checking to a separated function

e22m4u 3 недель назад
Родитель
Сommit
15946d4a20

+ 49 - 39
dist/cjs/index.cjs

@@ -65,13 +65,13 @@ __export(index_exports, {
   parseContentType: () => parseContentType,
   parseCookieString: () => parseCookieString,
   parseJsonBody: () => parseJsonBody,
-  toCamelCase: () => toCamelCase
+  toCamelCase: () => toCamelCase,
+  validateRouteDefinition: () => validateRouteDefinition
 });
 module.exports = __toCommonJS(index_exports);
 
-// src/route.js
+// src/route/route.js
 var import_js_debug = require("@e22m4u/js-debug");
-var import_js_format12 = require("@e22m4u/js-format");
 
 // src/hooks/hook-invoker.js
 var import_js_format11 = require("@e22m4u/js-format");
@@ -910,7 +910,45 @@ var _HookInvoker = class _HookInvoker extends DebuggableService {
 __name(_HookInvoker, "HookInvoker");
 var HookInvoker = _HookInvoker;
 
-// src/route.js
+// src/route/validate-route-definition.js
+var import_js_format12 = require("@e22m4u/js-format");
+function validateRouteDefinition(routeDef) {
+  if (!routeDef || typeof routeDef !== "object" || Array.isArray(routeDef)) {
+    throw new import_js_format12.InvalidArgumentError(
+      "Route definition must be an Object, but %v was given.",
+      routeDef
+    );
+  }
+  if (!routeDef.method || typeof routeDef.method !== "string") {
+    throw new import_js_format12.InvalidArgumentError(
+      'Option "method" must be a non-empty String, but %v was given.',
+      routeDef.method
+    );
+  }
+  if (typeof routeDef.path !== "string") {
+    throw new import_js_format12.InvalidArgumentError(
+      'Option "path" must be a String, but %v was given.',
+      routeDef.path
+    );
+  }
+  if (typeof routeDef.handler !== "function") {
+    throw new import_js_format12.InvalidArgumentError(
+      'Option "handler" must be a Function, but %v was given.',
+      routeDef.handler
+    );
+  }
+  if (routeDef.meta !== void 0) {
+    if (!routeDef.meta || typeof routeDef.meta !== "object" || Array.isArray(routeDef.meta)) {
+      throw new import_js_format12.InvalidArgumentError(
+        'Option "meta" must be an Object, but %v was given.',
+        routeDef.meta
+      );
+    }
+  }
+}
+__name(validateRouteDefinition, "validateRouteDefinition");
+
+// src/route/route.js
 var HttpMethod = {
   GET: "GET",
   POST: "POST",
@@ -1004,39 +1042,10 @@ var _Route = class _Route extends import_js_debug.Debuggable {
       noEnvironmentNamespace: true,
       noInstantiationMessage: true
     });
-    if (!routeDef || typeof routeDef !== "object" || Array.isArray(routeDef)) {
-      throw new import_js_format12.InvalidArgumentError(
-        "The first parameter of Route.constructor must be an Object, but %v was given.",
-        routeDef
-      );
-    }
-    if (!routeDef.method || typeof routeDef.method !== "string") {
-      throw new import_js_format12.InvalidArgumentError(
-        'The option "method" of the Route must be a non-empty String, but %v was given.',
-        routeDef.method
-      );
-    }
+    validateRouteDefinition(routeDef);
     this._method = routeDef.method.toUpperCase();
-    if (typeof routeDef.path !== "string") {
-      throw new import_js_format12.InvalidArgumentError(
-        'The option "path" of the Route must be a String, but %v was given.',
-        routeDef.path
-      );
-    }
     this._path = routeDef.path;
-    if (typeof routeDef.handler !== "function") {
-      throw new import_js_format12.InvalidArgumentError(
-        'The option "handler" of the Route must be a Function, but %v was given.',
-        routeDef.handler
-      );
-    }
-    if (routeDef.meta != null) {
-      if (typeof routeDef.meta !== "object" || Array.isArray(routeDef.meta)) {
-        throw new import_js_format12.InvalidArgumentError(
-          'The option "meta" of the Route must be a plain Object, but %v was given.',
-          routeDef.meta
-        );
-      }
+    if (routeDef.meta !== void 0) {
       this._meta = cloneDeep(routeDef.meta);
     }
     this._handler = routeDef.handler;
@@ -1380,7 +1389,7 @@ var _RouteRegistry = class _RouteRegistry extends DebuggableService {
   /**
    * Define route.
    *
-   * @param {import('./route.js').RouteDefinition} routeDef
+   * @param {import('./route/index.js').RouteDefinition} routeDef
    * @returns {Route}
    */
   defineRoute(routeDef) {
@@ -1548,7 +1557,7 @@ var _RequestContext = class _RequestContext {
   /**
    * Route meta.
    *
-   * @type {import('./route.js').RouteMeta}
+   * @type {import('./route/index.js').RouteMeta}
    */
   get meta() {
     return this.route.meta;
@@ -1804,7 +1813,7 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
    * ```
    *
    * @param {import('./route-registry.js').RouteDefinition} routeDef
-   * @returns {import('./route.js').Route}
+   * @returns {import('./route/index.js').Route}
    */
   defineRoute(routeDef) {
     return this.getService(RouteRegistry).defineRoute(routeDef);
@@ -1994,5 +2003,6 @@ var TrieRouter = _TrieRouter;
   parseContentType,
   parseCookieString,
   parseJsonBody,
-  toCamelCase
+  toCamelCase,
+  validateRouteDefinition
 });

+ 1 - 1
src/hooks/hook-invoker.d.ts

@@ -1,5 +1,5 @@
-import {Route} from '../route.js';
 import {ServerResponse} from 'http';
+import {Route} from '../route/index.js';
 import {ValueOrPromise} from '../types.js';
 import {RouterHookType} from './hook-registry.js';
 import {DebuggableService} from '../debuggable-service.js';

+ 1 - 1
src/hooks/hook-invoker.js

@@ -1,4 +1,4 @@
-import {Route} from '../route.js';
+import {Route} from '../route/index.js';
 import {InvalidArgumentError} from '@e22m4u/js-format';
 import {DebuggableService} from '../debuggable-service.js';
 import {isPromise, isResponseSent} from '../utils/index.js';

+ 1 - 1
src/hooks/hook-invoker.spec.js

@@ -1,7 +1,7 @@
 import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {HookInvoker} from './hook-invoker.js';
-import {Route, HttpMethod} from '../route.js';
+import {Route, HttpMethod} from '../route/index.js';
 import {createResponseMock} from '../utils/index.js';
 import {HookRegistry, RouterHookType} from './hook-registry.js';
 

+ 1 - 1
src/index.d.ts

@@ -1,4 +1,4 @@
-export * from './route.js';
+export * from './route/index.js';
 export * from './utils/index.js';
 export * from './hooks/index.js';
 export * from './trie-router.js';

+ 1 - 1
src/index.js

@@ -1,4 +1,4 @@
-export * from './route.js';
+export * from './route/index.js';
 export * from './utils/index.js';
 export * from './hooks/index.js';
 export * from './trie-router.js';

+ 1 - 1
src/parsers/body-parser.spec.js

@@ -1,7 +1,7 @@
 import {expect} from 'chai';
 import HttpErrors from 'http-errors';
-import {HttpMethod} from '../route.js';
 import {format} from '@e22m4u/js-format';
+import {HttpMethod} from '../route/index.js';
 import {RouterOptions} from '../router-options.js';
 import {createRequestMock} from '../utils/index.js';
 

+ 1 - 1
src/parsers/request-parser.spec.js

@@ -1,6 +1,6 @@
 import {expect} from 'chai';
-import {HttpMethod} from '../route.js';
 import {format} from '@e22m4u/js-format';
+import {HttpMethod} from '../route/index.js';
 import {RequestParser} from './request-parser.js';
 import {createRequestMock} from '../utils/index.js';
 

+ 1 - 1
src/request-context.d.ts

@@ -1,5 +1,5 @@
-import {Route, RouteMeta} from './route.js';
 import {ParsedCookies} from './utils/index.js';
+import {Route, RouteMeta} from './route/index.js';
 import {ServiceContainer} from '@e22m4u/js-service';
 import {IncomingMessage, ServerResponse} from 'http';
 import {ParsedQuery, ParsedHeaders} from './parsers/index.js';

+ 2 - 2
src/request-context.js

@@ -1,4 +1,4 @@
-import {Route} from './route.js';
+import {Route} from './route/index.js';
 import {InvalidArgumentError} from '@e22m4u/js-format';
 import {ServiceContainer, isServiceContainer} from '@e22m4u/js-service';
 
@@ -121,7 +121,7 @@ export class RequestContext {
   /**
    * Route meta.
    *
-   * @type {import('./route.js').RouteMeta}
+   * @type {import('./route/index.js').RouteMeta}
    */
   get meta() {
     return this.route.meta;

+ 2 - 2
src/route-registry.d.ts

@@ -1,6 +1,6 @@
-import {Route} from './route.js';
 import {IncomingMessage} from 'http';
-import {RouteDefinition} from './route.js';
+import {Route} from './route/index.js';
+import {RouteDefinition} from './route/index.js';
 import {ServiceContainer} from '@e22m4u/js-service';
 import {DebuggableService} from './debuggable-service.js';
 

+ 2 - 2
src/route-registry.js

@@ -1,4 +1,4 @@
-import {Route} from './route.js';
+import {Route} from './route/index.js';
 import {PathTrie} from '@e22m4u/js-path-trie';
 import {ServiceContainer} from '@e22m4u/js-service';
 import {InvalidArgumentError} from '@e22m4u/js-format';
@@ -28,7 +28,7 @@ export class RouteRegistry extends DebuggableService {
   /**
    * Define route.
    *
-   * @param {import('./route.js').RouteDefinition} routeDef
+   * @param {import('./route/index.js').RouteDefinition} routeDef
    * @returns {Route}
    */
   defineRoute(routeDef) {

+ 1 - 1
src/route-registry.spec.js

@@ -1,7 +1,7 @@
 import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
-import {Route, HttpMethod} from './route.js';
 import {RouteRegistry} from './route-registry.js';
+import {Route, HttpMethod} from './route/index.js';
 import {ServiceContainer} from '@e22m4u/js-service';
 
 describe('RouteRegistry', function () {

+ 2 - 0
src/route/index.d.ts

@@ -0,0 +1,2 @@
+export * from './route.js';
+export * from './validate-route-definition.js';

+ 2 - 0
src/route/index.js

@@ -0,0 +1,2 @@
+export * from './route.js';
+export * from './validate-route-definition.js';

+ 3 - 3
src/route.d.ts → src/route/route.d.ts

@@ -1,6 +1,6 @@
-import {ValueOrPromise} from './types.js';
-import {HookRegistry} from './hooks/index.js';
-import {RequestContext} from './request-context.js';
+import {ValueOrPromise} from '../types.js';
+import {HookRegistry} from '../hooks/index.js';
+import {RequestContext} from '../request-context.js';
 
 /**
  * Http method.

+ 6 - 40
src/route.js → src/route/route.js

@@ -1,8 +1,8 @@
 import {Debuggable} from '@e22m4u/js-debug';
-import {InvalidArgumentError} from '@e22m4u/js-format';
-import {HookRegistry, RouterHookType} from './hooks/index.js';
-import {MODULE_DEBUG_NAMESPACE} from './debuggable-service.js';
-import {cloneDeep, getRequestPathname} from './utils/index.js';
+import {HookRegistry, RouterHookType} from '../hooks/index.js';
+import {MODULE_DEBUG_NAMESPACE} from '../debuggable-service.js';
+import {cloneDeep, getRequestPathname} from '../utils/index.js';
+import {validateRouteDefinition} from './validate-route-definition.js';
 
 /**
  * @typedef {import('./request-context.js').RequestContext} RequestContext
@@ -137,44 +137,10 @@ export class Route extends Debuggable {
       noEnvironmentNamespace: true,
       noInstantiationMessage: true,
     });
-    if (!routeDef || typeof routeDef !== 'object' || Array.isArray(routeDef)) {
-      throw new InvalidArgumentError(
-        'The first parameter of Route.constructor ' +
-          'must be an Object, but %v was given.',
-        routeDef,
-      );
-    }
-    if (!routeDef.method || typeof routeDef.method !== 'string') {
-      throw new InvalidArgumentError(
-        'The option "method" of the Route must be ' +
-          'a non-empty String, but %v was given.',
-        routeDef.method,
-      );
-    }
+    validateRouteDefinition(routeDef);
     this._method = routeDef.method.toUpperCase();
-    if (typeof routeDef.path !== 'string') {
-      throw new InvalidArgumentError(
-        'The option "path" of the Route must be ' +
-          'a String, but %v was given.',
-        routeDef.path,
-      );
-    }
     this._path = routeDef.path;
-    if (typeof routeDef.handler !== 'function') {
-      throw new InvalidArgumentError(
-        'The option "handler" of the Route must be ' +
-          'a Function, but %v was given.',
-        routeDef.handler,
-      );
-    }
-    if (routeDef.meta != null) {
-      if (typeof routeDef.meta !== 'object' || Array.isArray(routeDef.meta)) {
-        throw new InvalidArgumentError(
-          'The option "meta" of the Route must be ' +
-            'a plain Object, but %v was given.',
-          routeDef.meta,
-        );
-      }
+    if (routeDef.meta !== undefined) {
       this._meta = cloneDeep(routeDef.meta);
     }
     this._handler = routeDef.handler;

+ 13 - 38
src/route.spec.js → src/route/route.spec.js

@@ -1,21 +1,17 @@
 import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {Route, HttpMethod} from './route.js';
-import {RouterHookType} from './hooks/index.js';
-import {RequestContext} from './request-context.js';
+import {RouterHookType} from '../hooks/index.js';
 import {ServiceContainer} from '@e22m4u/js-service';
-import {createRequestMock, createResponseMock} from './utils/index.js';
+import {RequestContext} from '../request-context.js';
+import {createRequestMock, createResponseMock} from '../utils/index.js';
 
 describe('Route', function () {
   describe('constructor', function () {
-    it('requires the first parameter to be an Object', function () {
+    it('requires the "routeDef" parameter to be an Object', function () {
       const throwable = v => () => new Route(v);
       const error = v =>
-        format(
-          'The first parameter of Route.constructor ' +
-            'must be an Object, but %s was given.',
-          v,
-        );
+        format('Route definition must be an Object, but %s was given.', v);
       expect(throwable('str')).to.throw(error('"str"'));
       expect(throwable('')).to.throw(error('""'));
       expect(throwable(10)).to.throw(error('10'));
@@ -43,8 +39,7 @@ describe('Route', function () {
           });
         const error = v =>
           format(
-            'The option "method" of the Route must be ' +
-              'a non-empty String, but %s was given.',
+            'Option "method" must be a non-empty String, but %s was given.',
             v,
           );
         expect(throwable('')).to.throw(error('""'));
@@ -71,7 +66,7 @@ describe('Route', function () {
     });
 
     describe('the "path" option', function () {
-      it('requires the "path" option to be a non-empty String', function () {
+      it('requires the "path" option to be a String', function () {
         const throwable = v => () =>
           new Route({
             method: HttpMethod.GET,
@@ -79,11 +74,7 @@ describe('Route', function () {
             handler: () => undefined,
           });
         const error = v =>
-          format(
-            'The option "path" of the Route must be ' +
-              'a String, but %s was given.',
-            v,
-          );
+          format('Option "path" must be a String, but %s was given.', v);
         expect(throwable(10)).to.throw(error('10'));
         expect(throwable(0)).to.throw(error('0'));
         expect(throwable(true)).to.throw(error('true'));
@@ -118,20 +109,18 @@ describe('Route', function () {
             meta: v,
           });
         const error = v =>
-          format(
-            'The option "meta" of the Route must be ' +
-              'a plain Object, but %s was given.',
-            v,
-          );
+          format('Option "meta" must be an Object, but %s was given.', v);
+        expect(throwable('str')).to.throw(error('"str"'));
+        expect(throwable('')).to.throw(error('""'));
         expect(throwable(10)).to.throw(error('10'));
         expect(throwable(0)).to.throw(error('0'));
         expect(throwable(true)).to.throw(error('true'));
         expect(throwable(false)).to.throw(error('false'));
         expect(throwable([])).to.throw(error('Array'));
+        expect(throwable(null)).to.throw(error('null'));
         expect(throwable(() => undefined)).to.throw(error('Function'));
         throwable({foo: 'bar'})();
         throwable({})();
-        throwable(null)();
         throwable(undefined)();
       });
 
@@ -169,16 +158,6 @@ describe('Route', function () {
         });
         expect(route.meta).to.be.eql({});
       });
-
-      it('sets an empty object to the "meta" property if the "meta" option is null', function () {
-        const route = new Route({
-          method: 'post',
-          path: '/',
-          handler: () => undefined,
-          meta: null,
-        });
-        expect(route.meta).to.be.eql({});
-      });
     });
 
     describe('the "handler" option', function () {
@@ -190,11 +169,7 @@ describe('Route', function () {
             handler: v,
           });
         const error = v =>
-          format(
-            'The option "handler" of the Route must be ' +
-              'a Function, but %s was given.',
-            v,
-          );
+          format('Option "handler" must be a Function, but %s was given.', v);
         expect(throwable('str')).to.throw(error('"str"'));
         expect(throwable('')).to.throw(error('""'));
         expect(throwable(10)).to.throw(error('10'));

+ 8 - 0
src/route/validate-route-definition.d.ts

@@ -0,0 +1,8 @@
+import {RouteDefinition} from './route.js';
+
+/**
+ * Validate route definition.
+ *
+ * @param routeDef
+ */
+export function validateRouteDefinition(routeDef: RouteDefinition): void;

+ 45 - 0
src/route/validate-route-definition.js

@@ -0,0 +1,45 @@
+import {InvalidArgumentError} from '@e22m4u/js-format';
+
+/**
+ * Validate route definition.
+ *
+ * @param {import('./route.js').RouteDefinition} routeDef
+ */
+export function validateRouteDefinition(routeDef) {
+  if (!routeDef || typeof routeDef !== 'object' || Array.isArray(routeDef)) {
+    throw new InvalidArgumentError(
+      'Route definition must be an Object, but %v was given.',
+      routeDef,
+    );
+  }
+  if (!routeDef.method || typeof routeDef.method !== 'string') {
+    throw new InvalidArgumentError(
+      'Option "method" must be a non-empty String, but %v was given.',
+      routeDef.method,
+    );
+  }
+  if (typeof routeDef.path !== 'string') {
+    throw new InvalidArgumentError(
+      'Option "path" must be a String, but %v was given.',
+      routeDef.path,
+    );
+  }
+  if (typeof routeDef.handler !== 'function') {
+    throw new InvalidArgumentError(
+      'Option "handler" must be a Function, but %v was given.',
+      routeDef.handler,
+    );
+  }
+  if (routeDef.meta !== undefined) {
+    if (
+      !routeDef.meta ||
+      typeof routeDef.meta !== 'object' ||
+      Array.isArray(routeDef.meta)
+    ) {
+      throw new InvalidArgumentError(
+        'Option "meta" must be an Object, but %v was given.',
+        routeDef.meta,
+      );
+    }
+  }
+}

+ 98 - 0
src/route/validate-route-definition.spec.js

@@ -0,0 +1,98 @@
+import {expect} from 'chai';
+import {HttpMethod} from './route.js';
+import {format} from '@e22m4u/js-format';
+import {validateRouteDefinition} from './validate-route-definition.js';
+
+describe('validateRouteDefinition', function () {
+  it('should require the "routeDef" parameter to be an Object', function () {
+    const throwable = v => () => validateRouteDefinition(v);
+    const error = v =>
+      format('Route definition must be an Object, but %s was given.', v);
+    expect(throwable('str')).to.throw(error('"str"'));
+    expect(throwable('')).to.throw(error('""'));
+    expect(throwable(10)).to.throw(error('10'));
+    expect(throwable(0)).to.throw(error('0'));
+    expect(throwable(true)).to.throw(error('true'));
+    expect(throwable(false)).to.throw(error('false'));
+    expect(throwable(null)).to.throw(error('null'));
+    expect(throwable([])).to.throw(error('Array'));
+    expect(throwable(undefined)).to.throw(error('undefined'));
+    expect(throwable(() => undefined)).to.throw(error('Function'));
+    throwable({
+      method: HttpMethod.GET,
+      path: '/',
+      handler: () => undefined,
+    })();
+  });
+
+  it('should require the "method" option to be a non-empty String', function () {
+    const throwable = v => () =>
+      validateRouteDefinition({
+        method: v,
+        path: '/',
+        handler: () => undefined,
+      });
+    const error = v =>
+      format(
+        'Option "method" must be a non-empty String, but %s was given.',
+        v,
+      );
+    expect(throwable('')).to.throw(error('""'));
+    expect(throwable(10)).to.throw(error('10'));
+    expect(throwable(0)).to.throw(error('0'));
+    expect(throwable(true)).to.throw(error('true'));
+    expect(throwable(false)).to.throw(error('false'));
+    expect(throwable(null)).to.throw(error('null'));
+    expect(throwable({})).to.throw(error('Object'));
+    expect(throwable([])).to.throw(error('Array'));
+    expect(throwable(undefined)).to.throw(error('undefined'));
+    expect(throwable(() => undefined)).to.throw(error('Function'));
+    throwable(HttpMethod.GET)();
+  });
+
+  it('should require the "path" option to be a non-empty String', function () {
+    const throwable = v => () =>
+      validateRouteDefinition({
+        method: HttpMethod.GET,
+        path: v,
+        handler: () => undefined,
+      });
+    const error = v =>
+      format('Option "path" must be a String, but %s was given.', v);
+    expect(throwable(10)).to.throw(error('10'));
+    expect(throwable(0)).to.throw(error('0'));
+    expect(throwable(true)).to.throw(error('true'));
+    expect(throwable(false)).to.throw(error('false'));
+    expect(throwable(null)).to.throw(error('null'));
+    expect(throwable({})).to.throw(error('Object'));
+    expect(throwable([])).to.throw(error('Array'));
+    expect(throwable(undefined)).to.throw(error('undefined'));
+    expect(throwable(() => undefined)).to.throw(error('Function'));
+    throwable('str')();
+    throwable('')();
+  });
+
+  it('should require the "meta" option to be a plain Object', function () {
+    const throwable = v => () =>
+      validateRouteDefinition({
+        method: HttpMethod.GET,
+        path: 'path',
+        handler: () => undefined,
+        meta: v,
+      });
+    const error = v =>
+      format('Option "meta" must be an Object, but %s was given.', v);
+    expect(throwable('str')).to.throw(error('"str"'));
+    expect(throwable('')).to.throw(error('""'));
+    expect(throwable(10)).to.throw(error('10'));
+    expect(throwable(0)).to.throw(error('0'));
+    expect(throwable(true)).to.throw(error('true'));
+    expect(throwable(false)).to.throw(error('false'));
+    expect(throwable([])).to.throw(error('Array'));
+    expect(throwable(null)).to.throw(error('null'));
+    expect(throwable(() => undefined)).to.throw(error('Function'));
+    throwable({foo: 'bar'})();
+    throwable({})();
+    throwable(undefined)();
+  });
+});

+ 2 - 2
src/trie-router.d.ts

@@ -1,6 +1,6 @@
-import {Route} from './route.js';
 import {RequestListener} from 'http';
-import {RouteDefinition} from './route.js';
+import {Route} from './route/index.js';
+import {RouteDefinition} from './route/index.js';
 import {DebuggableService} from './debuggable-service.js';
 
 import {

+ 1 - 1
src/trie-router.js

@@ -38,7 +38,7 @@ export class TrieRouter extends DebuggableService {
    * ```
    *
    * @param {import('./route-registry.js').RouteDefinition} routeDef
-   * @returns {import('./route.js').Route}
+   * @returns {import('./route/index.js').Route}
    */
   defineRoute(routeDef) {
     return this.getService(RouteRegistry).defineRoute(routeDef);

+ 1 - 1
src/trie-router.spec.js

@@ -1,6 +1,6 @@
 import {expect} from 'chai';
 import {TrieRouter} from './trie-router.js';
-import {Route, HttpMethod} from './route.js';
+import {Route, HttpMethod} from './route/index.js';
 import {RequestContext} from './request-context.js';
 import {ServerResponse, IncomingMessage} from 'http';
 import {DataSender, ErrorSender} from './senders/index.js';

+ 2 - 2
src/utils/create-route-mock.d.ts

@@ -1,5 +1,5 @@
-import {Route, HttpMethod} from '../route.js';
-import type {RouteHandler} from '../route.js';
+import {Route, HttpMethod} from '../route/index.js';
+import type {RouteHandler} from '../route/index.js';
 
 /**
  * Route mock options.

+ 1 - 1
src/utils/create-route-mock.js

@@ -1,4 +1,4 @@
-import {Route, HttpMethod} from '../route.js';
+import {Route, HttpMethod} from '../route/index.js';
 
 /**
  * @typedef {object} RouteMockOptions

+ 1 - 1
src/utils/create-route-mock.spec.js

@@ -1,5 +1,5 @@
 import {expect} from 'chai';
-import {HttpMethod, Route} from '../route.js';
+import {HttpMethod, Route} from '../route/index.js';
 import {createRouteMock} from './create-route-mock.js';
 
 describe('createRouteMock', function () {