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.

95 lines (94 loc) 5.26 kB
const require_utils = require("../../../common/utils.cjs"); //#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 (require_utils.isObject(value)) { const get = createCaseInsensitiveGetter(value); return require_utils.trimObject({ name: require_utils.parseSingularOf(get("name"), require_utils.parseJsonString), url: require_utils.parseSingularOf(get("url"), require_utils.parseJsonString), avatar: require_utils.parseSingularOf(get("avatar"), require_utils.parseJsonString) }); } if (require_utils.isNonEmptyStringOrNumber(value)) return require_utils.trimObject({ name: require_utils.parseJsonString(value) }); }; const retrieveAuthors = (value) => { if (!require_utils.isObject(value)) return; const get = createCaseInsensitiveGetter(value); const parsedAuthors = require_utils.parseArrayOf(get("authors"), parseAuthor); const parsedAuthor = require_utils.parseArrayOf(get("author"), parseAuthor); return parsedAuthors?.length ? parsedAuthors : parsedAuthor; }; const parseAttachment = (value) => { if (!require_utils.isObject(value)) return; const get = createCaseInsensitiveGetter(value); return require_utils.trimObject({ url: require_utils.parseSingularOf(get("url"), require_utils.parseJsonString), mime_type: require_utils.parseSingularOf(get("mime_type"), require_utils.parseJsonString), title: require_utils.parseSingularOf(get("title"), require_utils.parseJsonString), size_in_bytes: require_utils.parseSingularOf(get("size_in_bytes"), require_utils.parseNumber), duration_in_seconds: require_utils.parseSingularOf(get("duration_in_seconds"), require_utils.parseNumber) }); }; const parseItem = (value) => { if (!require_utils.isObject(value)) return; const get = createCaseInsensitiveGetter(value); return require_utils.trimObject({ id: require_utils.parseSingularOf(get("id"), require_utils.parseJsonString), url: require_utils.parseSingularOf(get("url"), require_utils.parseJsonString), external_url: require_utils.parseSingularOf(get("external_url"), require_utils.parseJsonString), title: require_utils.parseSingularOf(get("title"), require_utils.parseJsonString), content_html: require_utils.parseSingularOf(get("content_html"), require_utils.parseJsonString), content_text: require_utils.parseSingularOf(get("content_text"), require_utils.parseJsonString), summary: require_utils.parseSingularOf(get("summary"), require_utils.parseJsonString), image: require_utils.parseSingularOf(get("image"), require_utils.parseJsonString), banner_image: require_utils.parseSingularOf(get("banner_image"), require_utils.parseJsonString), date_published: require_utils.parseSingularOf(get("date_published"), require_utils.parseDate), date_modified: require_utils.parseSingularOf(get("date_modified"), require_utils.parseDate), tags: require_utils.parseArrayOf(get("tags"), require_utils.parseJsonString), authors: retrieveAuthors(value), language: require_utils.parseSingularOf(get("language"), require_utils.parseJsonString), attachments: require_utils.parseArrayOf(get("attachments"), parseAttachment) }); }; const parseHub = (value) => { if (!require_utils.isObject(value)) return; const get = createCaseInsensitiveGetter(value); return require_utils.trimObject({ type: require_utils.parseSingularOf(get("type"), require_utils.parseJsonString), url: require_utils.parseSingularOf(get("url"), require_utils.parseJsonString) }); }; const parseFeed = (value, options) => { if (!require_utils.isObject(value)) return; const get = createCaseInsensitiveGetter(value); return require_utils.trimObject({ title: require_utils.parseSingularOf(get("title"), require_utils.parseJsonString), home_page_url: require_utils.parseSingularOf(get("home_page_url"), require_utils.parseJsonString), feed_url: require_utils.parseSingularOf(get("feed_url"), require_utils.parseJsonString), description: require_utils.parseSingularOf(get("description"), require_utils.parseJsonString), user_comment: require_utils.parseSingularOf(get("user_comment"), require_utils.parseJsonString), next_url: require_utils.parseSingularOf(get("next_url"), require_utils.parseJsonString), icon: require_utils.parseSingularOf(get("icon"), require_utils.parseJsonString), favicon: require_utils.parseSingularOf(get("favicon"), require_utils.parseJsonString), language: require_utils.parseSingularOf(get("language"), require_utils.parseJsonString), expired: require_utils.parseSingularOf(get("expired"), require_utils.parseBoolean), hubs: require_utils.parseArrayOf(get("hubs"), parseHub), authors: retrieveAuthors(value), items: require_utils.parseArrayOf(get("items"), parseItem, options?.maxItems) }); }; //#endregion exports.createCaseInsensitiveGetter = createCaseInsensitiveGetter; exports.parseAttachment = parseAttachment; exports.parseAuthor = parseAuthor; exports.parseFeed = parseFeed; exports.parseHub = parseHub; exports.parseItem = parseItem; exports.retrieveAuthors = retrieveAuthors;