UNPKG

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
"use strict"; 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 };