diff options
author | Madeline <46743919+MaddyUnderStars@users.noreply.github.com> | 2023-01-06 19:30:03 +1100 |
---|---|---|
committer | Madeline <46743919+MaddyUnderStars@users.noreply.github.com> | 2023-01-06 19:30:03 +1100 |
commit | 98d318fd88cc42d290add88a81b2d5d5915de019 (patch) | |
tree | bbf740cd8154144956f17a0c0251428efb569949 /scripts/util | |
parent | Don't allow BaseClass props through schema (diff) | |
download | server-98d318fd88cc42d290add88a81b2d5d5915de019.tar.xz |
add back openapi generation. todo: find way to keep route text descriptions in code, and find way to get usages of right/permission .hasThrow
Diffstat (limited to 'scripts/util')
-rw-r--r-- | scripts/util/getRouteDescriptions.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/scripts/util/getRouteDescriptions.js b/scripts/util/getRouteDescriptions.js new file mode 100644 index 00000000..21c36ca7 --- /dev/null +++ b/scripts/util/getRouteDescriptions.js @@ -0,0 +1,63 @@ +const { traverseDirectory } = require("lambert-server"); +const path = require("path"); +const express = require("express"); +const RouteUtility = require("../../dist/api/util/handlers/route.js"); +const Router = express.Router; + +const routes = new Map(); +let currentPath = ""; +let currentFile = ""; +const methods = ["get", "post", "put", "delete", "patch"]; + +function registerPath(file, method, prefix, path, ...args) { + const urlPath = prefix + path; + const sourceFile = file.replace("/dist/", "/src/").replace(".js", ".ts"); + const opts = args.find((x) => typeof x === "object"); + if (opts) { + routes.set(urlPath + "|" + method, opts); // @ts-ignore + opts.file = sourceFile; + // console.log(method, urlPath, opts); + } else { + console.log( + `${sourceFile}\nrouter.${method}("${path}") is missing the "route()" description middleware\n`, + ); + } +} + +function routeOptions(opts) { + return opts; +} + +// @ts-ignore +RouteUtility.route = routeOptions; + +express.Router = (opts) => { + const path = currentPath; + const file = currentFile; + const router = Router(opts); + + for (const method of methods) { + router[method] = registerPath.bind(null, file, method, path); + } + + return router; +}; + +module.exports = function getRouteDescriptions() { + const root = path.join(__dirname, "..", "..", "dist", "api", "routes", "/"); + traverseDirectory({ dirname: root, recursive: true }, (file) => { + currentFile = file; + let path = file.replace(root.slice(0, -1), ""); + path = path.split(".").slice(0, -1).join("."); // trancate .js/.ts file extension of path + path = path.replaceAll("#", ":").replaceAll("\\", "/"); // replace # with : for path parameters and windows paths with slashes + if (path.endsWith("/index")) path = path.slice(0, "/index".length * -1); // delete index from path + currentPath = path; + + try { + require(file); + } catch (error) { + console.error("error loading file " + file, error); + } + }); + return routes; +}; |