@akala/core
Version:
89 lines • 2.88 kB
JavaScript
import { convertToMiddleware } from '../middlewares/shared.js';
import { MiddlewareComposite } from '../middlewares/composite-sync.js';
import { MiddlewareRoute } from './route.js';
import { each } from '../each.js';
/**
* Use routes.
* @param {Routes<T, TReturnType>} routes - The routes.
* @param {MiddlewareComposite<T> & { route: RouteBuilder<T> }} [parent] - The parent middleware composite.
* @returns {MiddlewareComposite<T>} The middleware composite.
*/
export function useRoutes(routes, parent) {
if (!parent)
parent = Object.assign(new MiddlewareComposite('byroutes'), { route(...args) { return new MiddlewareRoute(...args); } });
each(routes, (route, match) => {
if (typeof match == 'number')
return;
const routed = new MiddlewareRoute(match);
if (typeof (route) == 'object') {
useRoutes(route, routed);
}
else
routed.useMiddleware(convertToMiddleware(route));
parent.useMiddleware(routed);
});
return parent;
}
/**
* Router class.
* @template T
* @extends {MiddlewareComposite<T>}
* @implements {Middleware<T>}
*/
export class Router extends MiddlewareComposite {
/**
* Creates an instance of Router.
* @param {RouterOptions} [options] - The router options.
*/
constructor(options) {
super(options && options.name);
}
/**
* Creates a new route.
* @param {...RouteBuilderArguments} args - The route builder arguments.
* @returns {MiddlewareRoute<T>} The middleware route.
*/
route(...args) {
return new MiddlewareRoute(...args);
}
/**
* Uses routes.
* @param {Routes<T, unknown>} routes - The routes.
* @returns {this} The router instance.
*/
useRoutes(routes) {
useRoutes(routes, this);
return this;
}
useMiddleware(route, ...middlewares) {
if (typeof route === 'string' || Array.isArray(route)) {
const routed = new MiddlewareRoute(route);
routed.useMiddleware(...middlewares);
super.useMiddleware(routed);
}
else
super.useMiddleware(route, ...middlewares);
return this;
}
use(route, ...middlewares) {
if (typeof route === 'string' || Array.isArray(route)) {
const routed = new MiddlewareRoute(route);
routed.use(...middlewares);
super.useMiddleware(routed);
return this;
}
else
return super.use(route, ...middlewares);
}
}
// // create Router#VERB functions
// methods.concat('all').forEach(function (method)
// {
// Router.prototype[method] = function (path)
// {
// var route = this.route(path)
// route[method].apply(route, slice.call(arguments, 1))
// return this
// }
// })
//# sourceMappingURL=router.js.map