feat: add the support for chained route and pass-through addition methods

This commit is contained in:
Dorian Niemiec 2025-01-01 20:22:49 +01:00
parent 80ec67d096
commit 1af92e8281
3 changed files with 77 additions and 40 deletions

View file

@ -51,6 +51,8 @@ Parameters:
- _path_ - the route path, for which the route applies. The route paths are process via the [`path-to-regexp` library](https://www.npmjs.com/package/path-to-regexp) (_String_) - _path_ - the route path, for which the route applies. The route paths are process via the [`path-to-regexp` library](https://www.npmjs.com/package/path-to-regexp) (_String_)
- _callback_ - the SVR.JS mod callback applied for the route (_Function_) - _callback_ - the SVR.JS mod callback applied for the route (_Function_)
Returns: the SVRouter router (so that you can chain the methods for adding routes or pass-throughs)
The function adds a route to the SVRouter router. The function adds a route to the SVRouter router.
If the _method_ parameter is `"*"`, the route will apply to all the methods If the _method_ parameter is `"*"`, the route will apply to all the methods
@ -72,6 +74,8 @@ Parameters:
- _path_ - the path, for which the route applies. (optional, _String_) - _path_ - the path, for which the route applies. (optional, _String_)
- _callback_ - the SVR.JS mod callback, which the SVRouter router will pass to (_Function_) - _callback_ - the SVR.JS mod callback, which the SVRouter router will pass to (_Function_)
Returns: the SVRouter router (so that you can chain the methods for routes or pass-throughs)
The function adds middleware to the SVRouter router. The middleware can be an another SVRouter router (the absolute request URLs need to be provided for the _router.route_ function in the SVRouter router). The function adds middleware to the SVRouter router. The middleware can be an another SVRouter router (the absolute request URLs need to be provided for the _router.route_ function in the SVRouter router).
The _callback_ parameter has these arguments of the SVR.JS mod callback: The _callback_ parameter has these arguments of the SVR.JS mod callback:

View file

@ -4,46 +4,6 @@ const http = require("http");
function svrouter() { function svrouter() {
const routes = []; const routes = [];
const addRoute = (method, path, callback) => {
if (typeof method !== "string") {
throw new Error("The HTTP method must be a string.");
} else if (typeof path !== "string") {
throw new Error("The route path must be a string.");
} else if (typeof callback !== "function") {
throw new Error("The route callback must be a function.");
}
routes.push({
method: method === "*" ? null : method.toUpperCase(),
pathFunction: match(path),
callback: callback
});
};
const passRoute = (path, callback) => {
const realCallback = callback ? callback : path;
if (typeof realCallback !== "function") {
throw new Error("The passed callback must be a function.");
} else if (callback && typeof path !== "string") {
throw new Error("The path must be a function");
}
routes.push({
method: null,
pathFunction: callback
? (checkedPath) =>
checkedPath == path ||
checkedPath.substring(0, path.length + 1) == path + "/"
? {
path: checkedPath,
params: null
}
: false
: () => true,
callback: realCallback
});
};
const router = (req, res, logFacilities, config, next) => { const router = (req, res, logFacilities, config, next) => {
let index = 0; let index = 0;
let previousReqParams = req.params; let previousReqParams = req.params;
@ -87,6 +47,50 @@ function svrouter() {
nextRoute(); nextRoute();
}; };
const addRoute = (method, path, callback) => {
if (typeof method !== "string") {
throw new Error("The HTTP method must be a string.");
} else if (typeof path !== "string") {
throw new Error("The route path must be a string.");
} else if (typeof callback !== "function") {
throw new Error("The route callback must be a function.");
}
routes.push({
method: method === "*" ? null : method.toUpperCase(),
pathFunction: match(path),
callback: callback
});
return router;
};
const passRoute = (path, callback) => {
const realCallback = callback ? callback : path;
if (typeof realCallback !== "function") {
throw new Error("The passed callback must be a function.");
} else if (callback && typeof path !== "string") {
throw new Error("The path must be a function");
}
routes.push({
method: null,
pathFunction: callback
? (checkedPath) =>
checkedPath == path ||
checkedPath.substring(0, path.length + 1) == path + "/"
? {
path: checkedPath,
params: null
}
: false
: () => true,
callback: realCallback
});
return router;
};
const methods = http.METHODS const methods = http.METHODS
? http.METHODS ? http.METHODS
: ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"]; : ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"];

View file

@ -150,6 +150,35 @@ describe("SVRouter", () => {
expect(res.end).toHaveBeenCalledWith("Pass-through matched"); expect(res.end).toHaveBeenCalledWith("Pass-through matched");
}); });
test("should work with chained adding of routes and pass-throughs", () => {
const req = {
method: "GET",
parsedURL: { pathname: "/anything" },
params: null
};
const res = {};
router
.get("/anything", (req, res, logFacilities, config, next) => {
res.passedThroughGet = true;
next();
})
.pass((req, res, logFacilities, config, next) => {
res.passedThroughPass = true;
next();
})
.pass((req, res, logFacilities, config, next) => {
res.passedThroughPass2 = true;
next();
});
router(req, res, null, null, () => {});
expect(res.passedThroughGet).toBe(true);
expect(res.passedThroughPass).toBe(true);
expect(res.passedThroughPass2).toBe(true);
});
test("should throw an error if method is not a string in route", () => { test("should throw an error if method is not a string in route", () => {
expect(() => { expect(() => {
router.route(123, "/path", () => {}); router.route(123, "/path", () => {});