From b438f2b071dbaa82371016168ab843f24be5063e Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Sun, 16 Apr 2023 01:51:52 +1000 Subject: Rewrite getRouteDescriptions, fix message route not appearing in openapi spec --- scripts/util/getRouteDescriptions.js | 98 +++++++++++++++--------------------- 1 file changed, 41 insertions(+), 57 deletions(-) (limited to 'scripts') diff --git a/scripts/util/getRouteDescriptions.js b/scripts/util/getRouteDescriptions.js index fe36c238..a79dac96 100644 --- a/scripts/util/getRouteDescriptions.js +++ b/scripts/util/getRouteDescriptions.js @@ -1,80 +1,64 @@ -/* - Spacebar: A FOSS re-implementation and extension of the Discord.com backend. - Copyright (C) 2023 Spacebar and Spacebar Contributors - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -const { traverseDirectory } = require("lambert-server"); -const path = require("path"); const express = require("express"); +const path = require("path"); +const { traverseDirectory } = require("lambert-server"); const RouteUtility = require("../../dist/api/util/handlers/route.js"); -const Router = express.Router; +const methods = ["get", "post", "put", "delete", "patch"]; 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); - opts.file = sourceFile; - // console.log(method, urlPath, opts); - } else { - console.log( - `${sourceFile}\nrouter.${method}("${path}") is missing the "route()" description middleware\n`, - ); - } -} +let currentPath = ""; -function routeOptions(opts) { - return opts; -} +/* + For some reason, if a route exports multiple functions, it won't be registered here! + If someone could fix that I'd really appreciate it, but for now just, don't do that :p +*/ -RouteUtility.route = routeOptions; +const proxy = (file, method, prefix, path, ...args) => { + const opts = args.find((x) => x?.prototype?.OPTS_MARKER == true); + if (!opts) + return console.error( + `${file} has route without route() description middleware`, + ); -express.Router = (opts) => { - const path = currentPath; - const file = currentFile; - const router = Router(opts); + console.log(prefix + path + " - " + method); + opts.file = file.replace("/dist/", "/src/").replace(".js", ".ts"); + routes.set(prefix + path + "|" + method, opts()); +}; - for (const method of methods) { - router[method] = registerPath.bind(null, file, method, path); - } +express.Router = () => { + return Object.fromEntries( + methods.map((method) => [ + method, + proxy.bind(null, currentFile, method, currentPath), + ]), + ); +}; - return router; +RouteUtility.route = (opts) => { + const func = function () { + return opts; + }; + func.prototype.OPTS_MARKER = true; + return func; }; 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; + + currentPath = file.replace(root.slice(0, -1), ""); + currentPath = currentPath.split(".").slice(0, -1).join("."); // trancate .js/.ts file extension of path + currentPath = currentPath.replaceAll("#", ":").replaceAll("\\", "/"); // replace # with : for path parameters and windows paths with slashes + if (currentPath.endsWith("/index")) + currentPath = currentPath.slice(0, "/index".length * -1); // delete index from path try { require(file); - } catch (error) { - console.error("error loading file " + file, error); + } catch (e) { + console.error(e); } }); + return routes; }; -- cgit 1.4.1