UNPKG

feedsmith

Version:

Robust and fast parser and generator for RSS, Atom, JSON Feed, and RDF feeds, with support for Podcast, iTunes, Dublin Core, and OPML files.

110 lines 4.66 kB
import { createCaseInsensitiveGetter, isNonEmptyStringOrNumber, isObject, isPresent, parseArrayOf, parseBoolean, parseNumber, parseSingularOf, parseString, trimObject, } from '../../../common/utils.js'; export const parseAuthor = (value) => { if (isObject(value)) { const get = createCaseInsensitiveGetter(value); const author = trimObject({ name: parseSingularOf(get('name'), parseString), url: parseSingularOf(get('url'), parseString), avatar: parseSingularOf(get('avatar'), parseString), }); return author; } if (isNonEmptyStringOrNumber(value)) { return { name: parseString(value), }; } }; export const retrieveAuthors = (value) => { if (!isObject(value)) { return; } // Regardless of the JSON Feed version, the 'authors' property is returned in the item/feed. // Some feeds use author/authors incorrectly based on the feed version, so this function helps // to unify those into one value. const get = createCaseInsensitiveGetter(value); const parsedAuthors = parseArrayOf(get('authors'), parseAuthor); const parsedAuthor = parseArrayOf(get('author'), parseAuthor); return parsedAuthors?.length ? parsedAuthors : parsedAuthor; }; export const parseHub = (value) => { if (!isObject(value)) { return; } const get = createCaseInsensitiveGetter(value); const hub = { type: parseSingularOf(get('type'), parseString), url: parseSingularOf(get('url'), parseString), }; if (isPresent(hub.type) || isPresent(hub.url)) { return trimObject(hub); } }; export const parseAttachment = (value) => { if (!isObject(value)) { return; } const get = createCaseInsensitiveGetter(value); const attachment = { url: parseSingularOf(get('url'), parseString), mime_type: parseSingularOf(get('mime_type'), parseString), title: parseSingularOf(get('title'), parseString), size_in_bytes: parseSingularOf(get('size_in_bytes'), parseNumber), duration_in_seconds: parseSingularOf(get('duration_in_seconds'), parseNumber), }; if (isPresent(attachment.url)) { return trimObject(attachment); } }; export const parseItem = (value) => { if (!isObject(value)) { return; } const get = createCaseInsensitiveGetter(value); const item = { id: parseSingularOf(get('id'), parseString), url: parseSingularOf(get('url'), parseString), external_url: parseSingularOf(get('external_url'), parseString), title: parseSingularOf(get('title'), parseString), content_html: parseSingularOf(get('content_html'), parseString), content_text: parseSingularOf(get('content_text'), parseString), summary: parseSingularOf(get('summary'), parseString), image: parseSingularOf(get('image'), parseString), banner_image: parseSingularOf(get('banner_image'), parseString), date_published: parseSingularOf(get('date_published'), parseString), date_modified: parseSingularOf(get('date_modified'), parseString), tags: parseArrayOf(get('tags'), parseString), authors: retrieveAuthors(value), language: parseSingularOf(get('language'), parseString), attachments: parseArrayOf(get('attachments'), parseAttachment), }; if (isPresent(item.id)) { return trimObject(item); } }; export const parseFeed = (value) => { if (!isObject(value)) { return; } const get = createCaseInsensitiveGetter(value); const feed = { version: parseSingularOf(get('version'), parseString), title: parseSingularOf(get('title'), parseString), home_page_url: parseSingularOf(get('home_page_url'), parseString), feed_url: parseSingularOf(get('feed_url'), parseString), description: parseSingularOf(get('description'), parseString), user_comment: parseSingularOf(get('user_comment'), parseString), next_url: parseSingularOf(get('next_url'), parseString), icon: parseSingularOf(get('icon'), parseString), favicon: parseSingularOf(get('favicon'), parseString), language: parseSingularOf(get('language'), parseString), expired: parseSingularOf(get('expired'), parseBoolean), hubs: parseArrayOf(get('hubs'), parseHub), authors: retrieveAuthors(value), items: parseArrayOf(get('items'), parseItem), }; if (isPresent(feed.version) && isPresent(feed.title) && isPresent(feed.items)) { return trimObject(feed); } }; //# sourceMappingURL=utils.js.map