import * as plugins from './smartsitemap.plugins.js'; import type * as interfaces from './interfaces/index.js'; import { UrlsetBuilder } from './smartsitemap.classes.urlsetbuilder.js'; import { NewsSitemapBuilder } from './smartsitemap.classes.newsbuilder.js'; import { SitemapIndexBuilder } from './smartsitemap.classes.indexbuilder.js'; import { SitemapParser } from './smartsitemap.classes.sitemapparser.js'; import { FeedImporter } from './smartsitemap.classes.feedimporter.js'; import { YamlImporter } from './smartsitemap.classes.yamlimporter.js'; import { SitemapValidator } from './smartsitemap.classes.validator.js'; /** * Main entry point for @push.rocks/smartsitemap. * Provides static factory methods for creating, parsing, and validating sitemaps. * * @example Simple sitemap * ```typescript * const xml = SmartSitemap.create() * .addUrl('https://example.com/') * .addUrl('https://example.com/about') * .toXml(); * ``` * * @example News sitemap from RSS feed * ```typescript * const builder = SmartSitemap.createNews({ publicationName: 'My Pub' }); * await builder.importFromFeedUrl('https://example.com/rss/'); * const xml = builder.toXml(); * ``` */ export class SmartSitemap { // ────────────────────────────────────────────── // Static Factory Methods // ────────────────────────────────────────────── /** Create a standard sitemap builder */ static create(options?: interfaces.ISitemapOptions): UrlsetBuilder { return new UrlsetBuilder(options); } /** Create a news sitemap builder */ static createNews(options: interfaces.INewsSitemapOptions): NewsSitemapBuilder { return new NewsSitemapBuilder(options); } /** Create a sitemap index builder */ static createIndex(options?: interfaces.ISitemapOptions): SitemapIndexBuilder { return new SitemapIndexBuilder(options); } /** Parse a sitemap XML string into structured data */ static async parse(xml: string): Promise { return SitemapParser.parse(xml); } /** Fetch and parse a sitemap from a URL */ static async parseUrl(url: string): Promise { return SitemapParser.parseUrl(url); } /** Create a UrlsetBuilder populated from an RSS/Atom feed URL */ static async fromFeedUrl( feedUrl: string, options?: interfaces.IFeedImportOptions, ): Promise { const urls = await FeedImporter.fromUrl(feedUrl, options); const builder = new UrlsetBuilder(); builder.addUrls(urls); return builder; } /** Create a UrlsetBuilder populated from an RSS/Atom feed string */ static async fromFeedString( feedXml: string, options?: interfaces.IFeedImportOptions, ): Promise { const urls = await FeedImporter.fromString(feedXml, options); const builder = new UrlsetBuilder(); builder.addUrls(urls); return builder; } /** Create a UrlsetBuilder populated from a YAML config string */ static async fromYaml(yamlString: string): Promise { const urls = await YamlImporter.parseConfig(yamlString); const builder = new UrlsetBuilder(); builder.addUrls(urls); return builder; } /** Create a NewsSitemapBuilder populated from @tsclass/tsclass IArticle array */ static fromArticles( articles: plugins.tsclass.content.IArticle[], options: interfaces.INewsSitemapOptions, ): NewsSitemapBuilder { const builder = new NewsSitemapBuilder(options); builder.importFromArticles(articles); return builder; } /** Create a UrlsetBuilder from a simple URL string array */ static fromUrls(urls: string[], options?: interfaces.ISitemapOptions): UrlsetBuilder { const builder = new UrlsetBuilder(options); builder.addFromArray(urls); return builder; } /** Validate a sitemap XML string */ static async validate(xml: string): Promise { const parsed = await SitemapParser.parse(xml); return SitemapValidator.validateUrlset(parsed.urls); } }