next-dynamic-sitemap
Version:
A lightweight, zero-touch sitemap generator for any nextjs project
78 lines (77 loc) • 3.56 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateSitemapPublic = generateSitemapPublic;
const node_path_1 = __importDefault(require("node:path"));
const promises_1 = require("fs/promises");
const generate_app_1 = require("./generate-app");
const constants_1 = require("./constants");
const generate_pages_1 = require("./generate-pages");
const util_1 = require("./util");
const PAGES = "pages";
const APP = "app";
const SRC = "src";
function dirExists(page) {
return __awaiter(this, void 0, void 0, function* () {
try {
yield (0, promises_1.stat)(node_path_1.default.join(page));
return true;
}
catch (error) {
return false;
}
});
}
function generateSitemapPublic() {
return __awaiter(this, void 0, void 0, function* () {
yield Promise.all([
(0, promises_1.mkdir)(constants_1.OUTFILE_ROOT, { recursive: true }),
(0, promises_1.mkdir)(constants_1.PUBLIC_DIR, { recursive: true }),
]);
const dir = process.cwd();
const pagesSrcDir = node_path_1.default.join(SRC, PAGES);
const appSrcDir = node_path_1.default.join(SRC, APP);
const pagesDir = node_path_1.default.join(PAGES);
const appDir = node_path_1.default.join(APP);
const pagesSrcDirFull = node_path_1.default.join(dir, pagesSrcDir);
const appSrcDirFull = node_path_1.default.join(dir, appSrcDir);
const pagesDirFull = node_path_1.default.join(dir, pagesDir);
const appDirFull = node_path_1.default.join(dir, appDir);
const urls = [];
const [hasSrcRootPages, hasSrcRootApp, hasNonSrcRootPages, hasNonSrcRootApp] = yield Promise.all([
dirExists(pagesSrcDirFull),
dirExists(appSrcDirFull),
dirExists(pagesDirFull),
dirExists(appDirFull),
]);
if (hasNonSrcRootApp) {
const segmentUrls = yield (0, generate_app_1.recurseAppDir)(appDir);
urls.push(...segmentUrls);
}
if (hasSrcRootApp) {
const segmentUrls = yield (0, generate_app_1.recurseAppDir)(appSrcDir);
urls.push(...segmentUrls);
}
if (hasNonSrcRootPages) {
const segmentUrls = yield (0, generate_pages_1.recursePagesDir)(pagesDir);
urls.push(...segmentUrls);
}
if (hasSrcRootPages) {
const segmentUrls = yield (0, generate_pages_1.recursePagesDir)(pagesSrcDir);
urls.push(...segmentUrls);
}
const xmlMap = (0, util_1.generateXMLSitemap)(urls);
yield (0, promises_1.writeFile)(node_path_1.default.join(dir, "public/sitemap.xml"), xmlMap);
});
}