0

Am creating a vite plugin which will enable me to generate a sitemap for my website but am not finding how to make a fetch request using one of their many hooks. Am using simplecrawler module to run the fetch inside the plugin but it doesn't seem to work.

import type { Plugin, ResolvedConfig } from "vite";
import crawler from "simplecrawler";

const crawl = async (port:number): Promise<string[]> => {
    return new Promise((resolve)=> {
        const links: Set<string> = new Set();
        const Crawler = new crawler(`http://localhost:${port}`);
        Crawler.on("fetchcomplete", (queueItem, _responseBody, response) => {
            if (response.headers["content-type"] === "text/html") {
                links.add(queueItem.url);
            }
        });

        Crawler.on("complete", () => {
            const paths = [...links].map((link) => {
                return new URL(link).pathname;
            });
            resolve(paths);
        });

        Crawler.start()
    });
};

const plugin = ():Plugin =>{
    const moduleId = `virtual:sitemap`;
    const resolvedModuleId = `\0${moduleId}`;
    let config: ResolvedConfig;
    
    return {
        name: "vite-plugin-svelte-sitemap",
        resolveId: id => {
            if (id === moduleId){
                return resolvedModuleId
            }
            return id
        },
        configResolved: resolvedConfig => {
            config = resolvedConfig;
            
        },
        buildStart: ()=>{
            return async ()=>{
                let port = config.server.port !== undefined ? config.server.port : (config.mode === "development" ? 5173 : 4173);
                let urls = await crawl(port);
                console.log(urls);
            }
        }


    }
}

export default plugin; 

So far, this is what I have been able to come up with

Lucretius
  • 13
  • 1
  • 4

0 Answers0