cibus-industries/scripts/generate-sitemap.js
2025-08-09 13:29:55 +05:30

85 lines
2.2 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const { allBlogs, allProducts } = require(path.resolve(__dirname, "../utlis/constant.utils.js"));
const BASE_URL = "https://cibusindustries.com";
const sitemapPath = path.join(__dirname, "../public/sitemap.xml");
const appDir = path.join(process.cwd(), "app");
const getCurrentDate = () => new Date().toISOString();
const cleanUrl = (url) => {
let cleaned = url
.replace(/\/\([^)]*\)/g, "")
.replace(/\/$/, "");
return cleaned === "" ? "/" : cleaned;
};
const getStaticPages = (dir = appDir, basePath = "") => {
let urls = [];
const files = fs.readdirSync(dir);
files.forEach((file) => {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
const nested = getStaticPages(filePath, `${basePath}/${file}`);
urls = urls.concat(nested);
} else if (file.match(/^(page)\.(js|jsx|ts|tsx)$/)) {
urls.push(basePath || "/");
}
});
return urls;
};
const buildXml = (urls) => {
const xmlUrls = urls
.map(({ loc, priority }) => {
return `
<url>
<loc>${BASE_URL}${cleanUrl(loc)}</loc>
<lastmod>${getCurrentDate()}</lastmod>
<priority>${priority}</priority>
</url>`;
})
.join("");
return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${xmlUrls}
</urlset>`;
};
const generateSitemap = () => {
const staticPages = getStaticPages().map((route) => ({
loc: route,
priority: route === "/" ? "1.0" : "0.8",
}));
const productPages = allProducts.map((p) => ({
loc: `/product-details/${p.slug}`,
priority: "0.6",
}));
const blogPages = allBlogs.map((b) => ({
loc: `/news-details/${b.slug}`,
priority: "0.6",
}));
const seen = new Set();
const allUrls = [...staticPages, ...productPages, ...blogPages].filter((item) => {
const cleaned = cleanUrl(item.loc);
if (seen.has(cleaned)) return false;
seen.add(cleaned);
return true;
});
const sitemapXml = buildXml(allUrls);
fs.writeFileSync(sitemapPath, sitemapXml, "utf8");
console.log(`✅ Sitemap generated at: public/sitemap.xml`);
};
generateSitemap();