UNPKG

@routejs/router

Version:

Fast and lightweight http routing engine for nodejs

100 lines (92 loc) 2.89 kB
import nodePath from "node:path"; import Route from "./route.mjs"; import Router from "./router.mjs"; import supportedMethod from "./supported-method.mjs"; export function use(...callbacks) { if (typeof callbacks[0] === "string" || callbacks[0] instanceof String) { if (callbacks.length < 2) { throw new TypeError( "Error: use function callback accepts function or router as an argument" ); } return mergeRoute({ group: callbacks[0], callbacks: callbacks.slice(1), }); } else { return mergeRoute({ callbacks: callbacks }); } } export function path(method, path, ...callbacks) { return setRoute({ method, path, callbacks }); } export function all(path, ...callbacks) { return setRoute({ method: supportedMethod, path, callbacks }); } export function domain(host, routes) { if (!(typeof host === "string" || host instanceof String)) { throw new TypeError( "Error: domain host accepts only string as an argument" ); } if (typeof routes === "function") { const router = new Router(); routes(router); return mergeRoute({ host, callbacks: router }); } else { return mergeRoute({ host, callbacks: routes }); } } function setRoute({ host, method, path, callbacks, group, name }) { return new Route({ host, method, path, callbacks, group, name }); } function mergeRoute({ host, method, group, callbacks }) { const routes = []; if (callbacks instanceof Router) { callbacks.routes().forEach((route) => { routes.push( setRoute({ host: host ?? route.host, method: method ?? route.method, path: group ? route.path ? nodePath.join(group, route.path) : null : route.path, callbacks: route.callbacks, group: group ? nodePath.join(group, route.group ?? "") : route.group, name: route.name, }) ); }); } else if (Array.isArray(callbacks)) { for (const route of callbacks) { if (route instanceof Route) { routes.push( setRoute({ host: host ?? route.host, method: method ?? route.method, path: group ? route.path ? nodePath.join(group, route.path) : null : route.path, callbacks: route.callbacks, group: group ? nodePath.join(group, route.group ?? "") : route.group, name: route.name, }) ); } else if (Array.isArray(route) || route instanceof Router) { routes.push(mergeRoute({ host, method, group, callbacks: route })); } else { routes.push(setRoute({ host, method, group, callbacks })); break; } } } else { routes.push(setRoute({ host, method, group, callbacks })); } return routes; }