UNPKG

@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
"use strict"; 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);