From c5a78a2da37fb21e5d8d0f89b1de9599ada57645 Mon Sep 17 00:00:00 2001 From: Vxrtrauter <101264710+Vxrtrauter@users.noreply.github.com> Date: Mon, 6 Jul 2026 23:20:51 +0200 Subject: [PATCH] feat: add VST middleware for dynamic HTML content rewriting --- docs/functions/_middleware.js | 47 +++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 docs/functions/_middleware.js diff --git a/docs/functions/_middleware.js b/docs/functions/_middleware.js new file mode 100644 index 0000000..1c700dc --- /dev/null +++ b/docs/functions/_middleware.js @@ -0,0 +1,47 @@ +const VST = { + title: "VST Search - SoftwareManager", + description: "Search for plugins easily", + url: "https://vstsearch.softwaremanager.xyz/", +}; + +class AttributeSetter { + constructor(attribute, value) { + this.attribute = attribute; + this.value = value; + } + element(element) { + element.setAttribute(this.attribute, this.value); + } +} + +class ContentSetter { + constructor(value) { + this.value = value; + } + element(element) { + element.setInnerContent(this.value); + } +} + +export async function onRequest(context) { + const { request, next } = context; + const response = await next(); + + const onVstDomain = new URL(request.url).hostname.startsWith("vstsearch."); + const contentType = response.headers.get("content-type") || ""; + + // Leave everything untouched on the main domain and for non-HTML responses. + if (!onVstDomain || !contentType.includes("text/html")) { + return response; + } + + return new HTMLRewriter() + .on("title", new ContentSetter(VST.title)) + .on("meta[name='description']", new AttributeSetter("content", VST.description)) + .on("meta[property='og:title']", new AttributeSetter("content", VST.title)) + .on("meta[property='og:description']", new AttributeSetter("content", VST.description)) + .on("meta[property='og:url']", new AttributeSetter("content", VST.url)) + .on("meta[name='twitter:title']", new AttributeSetter("content", VST.title)) + .on("meta[name='twitter:description']", new AttributeSetter("content", VST.description)) + .transform(response); +}