@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
JavaScript
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";