@bliztek/feed-generator
Version:
A simple and lightweight Node.js library for generating RSS 2.0, Atom, and JSON Feed formats.
91 lines (90 loc) • 4.48 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FeedBuilder = exports.FeedValidationError = exports.generateFeeds = exports.generateFeed = void 0;
const validate_js_1 = require("./validate.js");
const rss_js_1 = require("./renderers/rss.js");
const atom_js_1 = require("./renderers/atom.js");
const json_js_1 = require("./renderers/json.js");
const sanitize_js_1 = require("./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 ? (0, sanitize_js_1.sanitizeHtml)(item.content) : item.content, summary: item.summary ? (0, sanitize_js_1.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.
*/
const generateFeed = (feed, format, options) => {
(0, validate_js_1.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 (0, rss_js_1.renderRSS)(prepared, xmlOpts);
case "atom":
return (0, atom_js_1.renderAtom)(prepared, xmlOpts);
case "json":
return (0, json_js_1.renderJSON)(prepared, compact);
}
};
exports.generateFeed = generateFeed;
/**
* 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.
*/
const generateFeeds = (feed, options) => ({
rss: (0, exports.generateFeed)(feed, "rss", options),
atom: (0, exports.generateFeed)(feed, "atom", options),
json: (0, exports.generateFeed)(feed, "json", options),
});
exports.generateFeeds = generateFeeds;
var validate_js_2 = require("./validate.js");
Object.defineProperty(exports, "FeedValidationError", { enumerable: true, get: function () { return validate_js_2.FeedValidationError; } });
var builder_js_1 = require("./builder.js");
Object.defineProperty(exports, "FeedBuilder", { enumerable: true, get: function () { return builder_js_1.FeedBuilder; } });
__exportStar(require("./types.js"), exports);