express-route-versioning-middleware
Version:
Middleware for versioning functions for express routers. Use 'accept-version' header on request. Does not dictate express.Request, express.Response, or express.NextFunction types
64 lines (63 loc) • 2.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.exportsForTesting = void 0;
exports.routeVersionHandler = routeVersionHandler;
/**
* Find the highest function version
*/
function getLatestFunctionVersion(args) {
let versions = Object.keys(args);
if (versions.length === 0) {
return null;
}
return args[versions[versions.length - 1]];
}
/**
* Run the highest version function where requester's version is >= function version
*/
function pickFunctionByVersion(req, args) {
let versionFromClient = req.headers['accept-version'];
if (!versionFromClient || Array.isArray(versionFromClient)) {
let latestFunc = getLatestFunctionVersion(args);
if (!latestFunc) {
throw new Error(`No function defined for ${req.originalUrl}`);
}
return latestFunc;
}
let [clientMajor, clientMinor, clientSub] = versionFromClient.split(/\./g);
let functionToRun = Object.values(args)[0]; //set default as the earliest
for (let version of Object.keys(args)) {
let [major, minor, sub] = version.split(/\./g);
if (Number(clientMajor) > Number(major)) {
functionToRun = args[version];
continue;
}
else if (Number(clientMajor) < Number(major)) {
break;
}
if (Number(clientMinor) > Number(minor)) {
functionToRun = args[version];
continue;
}
else if (Number(clientMinor) < Number(minor)) {
break;
}
if (Number(clientSub) >= Number(sub)) {
functionToRun = args[version];
}
}
return functionToRun;
}
/**
* Return the correct function to run
*/
function routeVersionHandler(args) {
return function (req, res, next) {
let functionToRun = pickFunctionByVersion(req, args);
return functionToRun(req, res, next);
};
}
exports.exportsForTesting = {
getLatestFunctionVersion,
pickFunctionByVersion
};