UNPKG

feedsmith

Version:

Fast, all‑in‑one feed parser and generator for RSS, Atom, RDF, and JSON Feed, with support for Podcast, iTunes, Dublin Core, and OPML files.

89 lines (88 loc) 4.03 kB
import { isNonEmptyStringOrNumber, isObject, parseArrayOf, parseBoolean, parseDate, parseJsonString, parseNumber, parseSingularOf, trimObject } from "../../../common/utils.js"; //#region src/feeds/json/parse/utils.ts const createCaseInsensitiveGetter = (value) => { return (requestedKey) => { if (requestedKey in value) return value[requestedKey]; const lowerKey = requestedKey.toLowerCase(); for (const key in value) if (key.toLowerCase() === lowerKey) return value[key]; }; }; const parseAuthor = (value) => { if (isObject(value)) { const get = createCaseInsensitiveGetter(value); return trimObject({ name: parseSingularOf(get("name"), parseJsonString), url: parseSingularOf(get("url"), parseJsonString), avatar: parseSingularOf(get("avatar"), parseJsonString) }); } if (isNonEmptyStringOrNumber(value)) return trimObject({ name: parseJsonString(value) }); }; const retrieveAuthors = (value) => { if (!isObject(value)) return; const get = createCaseInsensitiveGetter(value); const parsedAuthors = parseArrayOf(get("authors"), parseAuthor); const parsedAuthor = parseArrayOf(get("author"), parseAuthor); return parsedAuthors?.length ? parsedAuthors : parsedAuthor; }; const parseAttachment = (value) => { if (!isObject(value)) return; const get = createCaseInsensitiveGetter(value); return trimObject({ url: parseSingularOf(get("url"), parseJsonString), mime_type: parseSingularOf(get("mime_type"), parseJsonString), title: parseSingularOf(get("title"), parseJsonString), size_in_bytes: parseSingularOf(get("size_in_bytes"), parseNumber), duration_in_seconds: parseSingularOf(get("duration_in_seconds"), parseNumber) }); }; const parseItem = (value) => { if (!isObject(value)) return; const get = createCaseInsensitiveGetter(value); return trimObject({ id: parseSingularOf(get("id"), parseJsonString), url: parseSingularOf(get("url"), parseJsonString), external_url: parseSingularOf(get("external_url"), parseJsonString), title: parseSingularOf(get("title"), parseJsonString), content_html: parseSingularOf(get("content_html"), parseJsonString), content_text: parseSingularOf(get("content_text"), parseJsonString), summary: parseSingularOf(get("summary"), parseJsonString), image: parseSingularOf(get("image"), parseJsonString), banner_image: parseSingularOf(get("banner_image"), parseJsonString), date_published: parseSingularOf(get("date_published"), parseDate), date_modified: parseSingularOf(get("date_modified"), parseDate), tags: parseArrayOf(get("tags"), parseJsonString), authors: retrieveAuthors(value), language: parseSingularOf(get("language"), parseJsonString), attachments: parseArrayOf(get("attachments"), parseAttachment) }); }; const parseHub = (value) => { if (!isObject(value)) return; const get = createCaseInsensitiveGetter(value); return trimObject({ type: parseSingularOf(get("type"), parseJsonString), url: parseSingularOf(get("url"), parseJsonString) }); }; const parseFeed = (value, options) => { if (!isObject(value)) return; const get = createCaseInsensitiveGetter(value); return trimObject({ title: parseSingularOf(get("title"), parseJsonString), home_page_url: parseSingularOf(get("home_page_url"), parseJsonString), feed_url: parseSingularOf(get("feed_url"), parseJsonString), description: parseSingularOf(get("description"), parseJsonString), user_comment: parseSingularOf(get("user_comment"), parseJsonString), next_url: parseSingularOf(get("next_url"), parseJsonString), icon: parseSingularOf(get("icon"), parseJsonString), favicon: parseSingularOf(get("favicon"), parseJsonString), language: parseSingularOf(get("language"), parseJsonString), expired: parseSingularOf(get("expired"), parseBoolean), hubs: parseArrayOf(get("hubs"), parseHub), authors: retrieveAuthors(value), items: parseArrayOf(get("items"), parseItem, options?.maxItems) }); }; //#endregion export { createCaseInsensitiveGetter, parseAttachment, parseAuthor, parseFeed, parseHub, parseItem, retrieveAuthors };