UNPKG

@bliztek/feed-generator

Version:

A simple and lightweight Node.js library for generating RSS 2.0, Atom, and JSON Feed formats.

70 lines (69 loc) 3.14 kB
import { validateFeed } from "./validate.js"; import { renderRSS } from "./renderers/rss.js"; import { renderAtom } from "./renderers/atom.js"; import { renderJSON } from "./renderers/json.js"; import { sanitizeHtml } from "./sanitize.js"; const deriveUpdated = (feed) => { var _a; if (feed.updated) return feed.updated; if (feed.items.length === 0) return undefined; let latest; for (const item of feed.items) { const d = (_a = item.updated) !== null && _a !== void 0 ? _a : item.date; if (d) { const parsed = new Date(d); if (!latest || parsed > latest) latest = parsed; } } return latest === null || latest === void 0 ? void 0 : latest.toISOString(); }; const sanitizeFeed = (feed) => (Object.assign(Object.assign({}, feed), { items: feed.items.map((item) => (Object.assign(Object.assign({}, item), { content: item.content ? sanitizeHtml(item.content) : item.content, summary: item.summary ? sanitizeHtml(item.summary) : item.summary }))) })); const prepareFeed = (feed, options) => { let prepared = Object.assign(Object.assign({}, feed), { updated: deriveUpdated(feed) }); if (options === null || options === void 0 ? void 0 : options.sanitize) { prepared = sanitizeFeed(prepared); } return prepared; }; /** * Generate a feed in a single format. * * @param feed - Feed data. Must include `title`, `link`, and `items`. RSS also requires `description`. * @param format - Output format: `"rss"`, `"atom"`, or `"json"`. * @param options - Optional settings: `sanitize` strips dangerous HTML; `pretty` (default `true`) toggles indentation. * @returns XML string (RSS/Atom) or JSON string. * @throws {FeedValidationError} If the feed data is invalid for the given format. */ export const generateFeed = (feed, format, options) => { validateFeed(feed, format); const prepared = prepareFeed(feed, options); const compact = (options === null || options === void 0 ? void 0 : options.pretty) === false; const xmlOpts = { compact, stylesheet: options === null || options === void 0 ? void 0 : options.stylesheet }; switch (format) { case "rss": return renderRSS(prepared, xmlOpts); case "atom": return renderAtom(prepared, xmlOpts); case "json": return renderJSON(prepared, compact); } }; /** * Generate RSS, Atom, and JSON Feed output in a single call. * * @param feed - Feed data. Must include `title`, `link`, `description`, and `items`. * @param options - Optional settings: `sanitize` strips dangerous HTML; `pretty` (default `true`) toggles indentation. * @returns An object with `rss`, `atom`, and `json` string properties. * @throws {FeedValidationError} If the feed data is invalid. */ export const generateFeeds = (feed, options) => ({ rss: generateFeed(feed, "rss", options), atom: generateFeed(feed, "atom", options), json: generateFeed(feed, "json", options), }); export { FeedValidationError } from "./validate.js"; export { FeedBuilder } from "./builder.js"; export * from "./types.js";