From 1ccf80474c0d93a691b5e19b200db61f62cfe38f Mon Sep 17 00:00:00 2001 From: creations Date: Fri, 9 Aug 2024 07:10:21 -0400 Subject: [PATCH] Common changes for simplicity Changed fastify handler to handle the actual registration of the rout file with the routeinfo. changed all ' to " instead moves types and interfaces to the respective folders and files --- .gitignore | 2 +- LICENCE | 2 +- README.md | 2 +- bun.lockb | Bin 0 -> 48056 bytes config/environment.ts | 18 +----------- interfaces/environment.ts | 17 +++++++++++ interfaces/routes.ts | 7 +++++ src/fastify/manager.ts | 52 ++++++++++++++++++++++++--------- src/fastify/plugins/favicon.ts | 14 ++++----- src/www/routes/index.ts | 27 ++++++++--------- types/routes.ts | 1 + 11 files changed, 88 insertions(+), 54 deletions(-) create mode 100644 bun.lockb create mode 100644 interfaces/environment.ts create mode 100644 interfaces/routes.ts create mode 100644 types/routes.ts diff --git a/.gitignore b/.gitignore index 0c54702..db81e2f 100644 --- a/.gitignore +++ b/.gitignore @@ -90,7 +90,7 @@ web_modules/ .node_repl_history -# Output of 'npm pack' +# Output of "npm pack" *.tgz diff --git a/LICENCE b/LICENCE index 94d3a0d..80c8258 100644 --- a/LICENCE +++ b/LICENCE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Creation's // [creations@creations.works] +Copyright (c) 2024 Creation"s // [creations@creations.works] Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 414cf33..3791e41 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # TS Fastify Example -This is just an example/template to get you started with Fastify and TypeScript. It starts off using EJS, but you can use something else if you'd like. +This is just an example/template to get you started with Fastify and TypeScript. It starts off using EJS, but you can use something else if you"d like. ## Getting Started diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..1170bf3b08351dfaddf6893ae120f5f8e89efe7a GIT binary patch literal 48056 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 F{{qJ|Kso>b literal 0 HcmV?d00001 diff --git a/config/environment.ts b/config/environment.ts index 5643cb5..8d76e0c 100644 --- a/config/environment.ts +++ b/config/environment.ts @@ -1,23 +1,7 @@ import { dirname, join } from "path"; import { fileURLToPath } from "url"; -export interface IEnvironment { - development: boolean; - - fastify: { - host: string; - port: number; - }; - - paths: { - src: string; - www: { - root: string; - views: string; - public: string; - } - }; -} +import type{ IEnvironment } from "../interfaces/environment"; const __dirname : string = join(dirname(fileURLToPath(import.meta.url)), ".."); diff --git a/interfaces/environment.ts b/interfaces/environment.ts new file mode 100644 index 0000000..8dac31d --- /dev/null +++ b/interfaces/environment.ts @@ -0,0 +1,17 @@ +export interface IEnvironment { + development: boolean; + + fastify: { + host: string; + port: number; + }; + + paths: { + src: string; + www: { + root: string; + views: string; + public: string; + } + }; +} \ No newline at end of file diff --git a/interfaces/routes.ts b/interfaces/routes.ts new file mode 100644 index 0000000..40345cd --- /dev/null +++ b/interfaces/routes.ts @@ -0,0 +1,7 @@ +import type { TMethod } from "../types/routes"; + +export interface IRouteInfo { + enabled: boolean; + path: string; + method: TMethod | TMethod[]; +} \ No newline at end of file diff --git a/src/fastify/manager.ts b/src/fastify/manager.ts index 6790b8e..8210181 100644 --- a/src/fastify/manager.ts +++ b/src/fastify/manager.ts @@ -8,7 +8,7 @@ import { join } from "path"; import { environment } from "../../config/environment"; // types -import type { FastifyInstance, FastifyReply, FastifyRequest, RouteShorthandMethod } from "fastify"; +import type { FastifyInstance } from "fastify"; import type { Stats } from "fs"; import type { AddressInfo } from "net"; @@ -31,8 +31,6 @@ class FastifyManager { }); } private async registerPlugins() : Promise { - console.log(environment.paths.www.views); - // official plugins this.server.register(fastifyView, { engine: { @@ -55,14 +53,13 @@ class FastifyManager { // dynamic route loading private async loadRoutes(): Promise { // you can specify a route path, prefix, and whether to load routes recursively e.g. ["routes", "/", true] will load all routes in the /routes directory with the prefix / and recursively load all routes in subdirectories - const routePaths: [string, string, boolean][] = [ - ["routes", '/', false] + ["routes", "/", false] ]; - + for (const [routePath, prefix, recursive] of routePaths) { const modifiedRoutePath = join(environment.paths.www.root, routePath); - + let files: string[]; try { files = await this.readDirRecursive(modifiedRoutePath, recursive); @@ -70,17 +67,44 @@ class FastifyManager { console.error("Failed to read route directory", modifiedRoutePath, "error:", err); return; } - + for (const file of files) { try { - const route = await import(file); - if (route.default) { - this.server.register(route.default, { prefix }); + const routeModule = await import(file); + const { default: routeData } = routeModule; + + if ( !routeData || !routeData.routeInfo || !routeData.route ) { + console.error(`Failed to load route from ${file}:`, "Route data is missing"); + continue; + } + + if (routeData.routeInfo.enabled && routeData.route) { + const { routeInfo, route } = routeData; + + let routePath = routeInfo.path || "/"; + + // Handle prefix and leading/trailing slashes + if (prefix) { + routePath = routePath === "/" ? prefix : join(prefix, routePath); + } + + // Normalize the path to avoid duplicate slashes + routePath = routePath.replace(/\/+/g, "/"); + + const methods = Array.isArray(routeInfo.method) ? routeInfo.method : [routeInfo.method]; + + for (const method of methods) { + this.server.route({ + method, + url: routePath, + handler: route + }); + } } } catch (err) { - console.error("Failed to load route", file, "error:", err); + console.error(`Failed to load route from ${file}:`, err); } - } + } } } @@ -115,7 +139,7 @@ class FastifyManager { const [_address, _port, scheme]: [string, number, string] = (() : [string, number, string] => { const address: string | AddressInfo | null = this.server.server.address(); - const resolvedAddress: [string, number] = (address && typeof address === 'object') ? [( address.address.startsWith("::") || address.address === "0.0.0.0") ? "localhost" : address.address, address.port] : ["localhost", this.port]; + const resolvedAddress: [string, number] = (address && typeof address === "object") ? [( address.address.startsWith("::") || address.address === "0.0.0.0") ? "localhost" : address.address, address.port] : ["localhost", this.port]; const resolvedScheme: string = resolvedAddress[0] === "localhost" ? "http" : "https"; return [...resolvedAddress, resolvedScheme]; diff --git a/src/fastify/plugins/favicon.ts b/src/fastify/plugins/favicon.ts index f2b6fc8..4e8ae59 100644 --- a/src/fastify/plugins/favicon.ts +++ b/src/fastify/plugins/favicon.ts @@ -1,6 +1,6 @@ -import { readFile } from 'fs/promises'; +import { readFile } from "fs/promises"; -import type { FastifyInstance, FastifyPluginAsync } from 'fastify'; +import type { FastifyInstance, FastifyPluginAsync } from "fastify"; import type { FastifyRequest } from "fastify/types/request"; import type { FastifyReply } from "fastify/types/reply"; @@ -17,16 +17,16 @@ const faviconPlugin: FastifyPluginAsync = async (fastify: Fastif console.error("Error reading favicon:", err); } - fastify.get('/favicon.ico', async (_request: FastifyRequest, reply: FastifyReply): Promise => { + fastify.get("/favicon.ico", async (_request: FastifyRequest, reply: FastifyReply): Promise => { if (faviconData) { - reply.header('Content-Type', 'image/x-icon') - .header('Cache-Control', 'public, max-age=86400') // 1 day + reply.header("Content-Type", "image/x-icon") + .header("Cache-Control", "public, max-age=86400") // 1 day .send(faviconData); } else { reply.status(404).send({ code: 404, - error: 'FILE_NOT_FOUND', - message: 'Favicon not found' + error: "FILE_NOT_FOUND", + message: "Favicon not found" }); } }); diff --git a/src/www/routes/index.ts b/src/www/routes/index.ts index cfe569e..9eee2f6 100644 --- a/src/www/routes/index.ts +++ b/src/www/routes/index.ts @@ -1,17 +1,18 @@ -import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify"; +import type { FastifyReply, FastifyRequest } from "fastify"; +import type { IRouteInfo } from "../../../interfaces/routes"; -const route : (fastify: FastifyInstance) => Promise = async (fastify: FastifyInstance) : Promise => { - const handleRequest: (request : FastifyRequest, reply : FastifyReply) => Promise = async (request : FastifyRequest, reply : FastifyReply) : Promise => { +const routeInfo: IRouteInfo = { + enabled: true, + path: "/", + method: "GET" +}; - return reply.view("index.ejs", { - h1: "Hello, World!", - p: "This is a placeholder page.", - discord: "https://discord.gg/DxFhhbr2pm", - }); - - } - - fastify.get("/", handleRequest); +async function route(request : FastifyRequest, reply : FastifyReply) : Promise { + return reply.viewAsync("index", { + h1: "Hello, World!", + p: "This is a placeholder page.", + discord: "https://discord.gg/DxFhhbr2pm", + }); } -export default route as (fastify: FastifyInstance) => Promise; +export default { routeInfo, route } \ No newline at end of file diff --git a/types/routes.ts b/types/routes.ts new file mode 100644 index 0000000..4c8e533 --- /dev/null +++ b/types/routes.ts @@ -0,0 +1 @@ +export type TMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "HEAD"; \ No newline at end of file