UNPKG

@extractus/feed-extractor

Version:

To read and normalize RSS/ATOM/JSON feed data

8 lines (7 loc) 37.2 kB
{ "version": 3, "sources": ["src/cjs-entry.js", "src/utils/linker.js", "src/utils/retrieve.js", "src/utils/xmlparser.js", "src/utils/parseJsonFeed.js", "src/utils/normalizer.js", "src/utils/parseRssFeed.js", "src/utils/parseAtomFeed.js", "src/utils/parseRdfFeed.js", "src/main.js"], "sourcesContent": ["function warnCjsUsage () {\n if (process.env.FEED_EXTRACTOR_CJS_IGNORE_WARNING?.toLowerCase() === 'true') return\n const yellow = (str) => `\\u001b[33m${str}\\u001b[39m`\n const log = process.env.FEED_EXTRACTOR_CJS_TRACE_WARNING?.toLowerCase() === 'true' ? console.trace : console.warn\n log(\n yellow(\n 'The CJS build of @extractus/feed-extractor is deprecated. See https://github.com/extractus/feed-extractor#cjs-deprecated for details.'\n )\n )\n}\n\nwarnCjsUsage()\n\nexport * from './main'\n", "// utils -> linker\n\nexport const isValid = (url = '') => {\n try {\n const ourl = new URL(url)\n return ourl !== null && ourl.protocol.startsWith('http')\n } catch {\n return false\n }\n}\n\nexport const absolutify = (fullUrl = '', relativeUrl = '') => {\n try {\n const result = new URL(relativeUrl, fullUrl)\n return result.toString()\n } catch {\n return ''\n }\n}\n\nconst blacklistKeys = [\n 'CNDID',\n '__twitter_impression',\n '_hsenc',\n '_openstat',\n 'action_object_map',\n 'action_ref_map',\n 'action_type_map',\n 'amp',\n 'fb_action_ids',\n 'fb_action_types',\n 'fb_ref',\n 'fb_source',\n 'fbclid',\n 'ga_campaign',\n 'ga_content',\n 'ga_medium',\n 'ga_place',\n 'ga_source',\n 'ga_term',\n 'gs_l',\n 'hmb_campaign',\n 'hmb_medium',\n 'hmb_source',\n 'mbid',\n 'mc_cid',\n 'mc_eid',\n 'mkt_tok',\n 'referrer',\n 'spJobID',\n 'spMailingID',\n 'spReportId',\n 'spUserID',\n 'utm_brand',\n 'utm_campaign',\n 'utm_cid',\n 'utm_content',\n 'utm_int',\n 'utm_mailing',\n 'utm_medium',\n 'utm_name',\n 'utm_place',\n 'utm_pubreferrer',\n 'utm_reader',\n 'utm_social',\n 'utm_source',\n 'utm_swu',\n 'utm_term',\n 'utm_userid',\n 'utm_viz_id',\n 'wt_mc_o',\n 'yclid',\n 'WT.mc_id',\n 'WT.mc_ev',\n 'WT.srch',\n 'pk_source',\n 'pk_medium',\n 'pk_campaign',\n]\n\nexport const purify = (url) => {\n try {\n const pureUrl = new URL(url)\n\n blacklistKeys.forEach((key) => {\n pureUrl.searchParams.delete(key)\n })\n\n return pureUrl.toString().replace(pureUrl.hash, '')\n } catch {\n return null\n }\n}\n", "// utils -> retrieve\n\nimport fetch from 'cross-fetch'\nimport { XMLParser } from 'fast-xml-parser'\n\nconst profetch = async (url, options = {}) => {\n const { proxy = {}, signal = null } = options\n const {\n target,\n headers = {},\n } = proxy\n const res = await fetch(target + encodeURIComponent(url), {\n headers,\n signal,\n })\n return res\n}\n\nconst getCharsetFromText = (text) => {\n try {\n const firstLine = text.split('\\n')[0].trim().replace('<?', '<').replace('?>', '>')\n const parser = new XMLParser({\n ignoreAttributes: false,\n })\n let obj = parser.parse(firstLine)\n const { xml: root = {} } = obj\n return root['@_encoding'] || 'utf8'\n } catch {\n return 'utf8'\n }\n}\n\nexport default async (url, options = {}) => {\n const {\n headers = {\n 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0',\n },\n proxy = null,\n agent = null,\n signal = null,\n } = options\n\n const res = proxy ? await profetch(url, { proxy, signal }) : await fetch(url, { headers, agent, signal })\n\n const status = res.status\n if (status >= 400) {\n throw new Error(`Request failed with error code ${status}`)\n }\n const contentType = res.headers.get('content-type')\n const buffer = await res.arrayBuffer()\n const text = buffer ? Buffer.from(buffer).toString().trim() : ''\n\n if (/(\\+|\\/)(xml|html)/.test(contentType)) {\n const arr = contentType.split('charset=')\n let charset = arr.length === 2 ? arr[1].trim() : getCharsetFromText(text)\n const decoder = new TextDecoder(charset)\n const xml = decoder.decode(buffer)\n return { type: 'xml', text: xml.trim(), status, contentType }\n }\n\n if (/(\\+|\\/)json/.test(contentType)) {\n try {\n const data = JSON.parse(text)\n return { type: 'json', json: data, status, contentType }\n } catch {\n throw new Error('Failed to convert data to JSON object')\n }\n }\n throw new Error(`Invalid content type: ${contentType}`)\n}\n", "// utils / xmlparser\n\nimport { hasProperty, isString } from '@ndaidong/bellajs'\n\nimport { XMLValidator, XMLParser } from 'fast-xml-parser'\n\nexport const isRSS = (data = {}) => {\n return hasProperty(data, 'rss') && hasProperty(data.rss, 'channel')\n}\n\nexport const isAtom = (data = {}) => {\n return hasProperty(data, 'feed') && hasProperty(data.feed, 'entry')\n}\n\nexport const isRdf = (data = {}) => {\n return hasProperty(data, 'rdf:RDF') && hasProperty(data['rdf:RDF'], 'channel')\n}\n\nexport const validate = (xml) => {\n return (!isString(xml) || !xml.length) ? false : XMLValidator.validate(xml) === true\n}\n\nexport const xml2obj = (xml = '', extraOptions = {}) => {\n const options = {\n attributeNamePrefix: '@_',\n ignoreAttributes: false,\n ...extraOptions,\n }\n const parser = new XMLParser(options)\n const jsonObj = parser.parse(xml)\n return jsonObj\n}\n", "// parseJsonFeed.js\n\n// specs: https://www.jsonfeed.org/version/1.1/\n\nimport { isArray } from '@ndaidong/bellajs'\n\nimport {\n toISODateString,\n buildDescription,\n getEntryId,\n getPureUrl\n} from './normalizer.js'\n\nimport { absolutify, purify as purifyUrl } from './linker.js'\n\nconst transform = (item, options) => {\n const {\n useISODateFormat,\n descriptionMaxLen,\n baseUrl,\n getExtraEntryFields,\n } = options\n\n const {\n id = '',\n title = '',\n url: link = '',\n date_published: pubDate = '',\n summary = '',\n content_html: htmlContent = '',\n content_text: textContent = '',\n } = item\n\n const published = useISODateFormat ? toISODateString(pubDate) : pubDate\n const extraFields = getExtraEntryFields(item)\n\n const entry = {\n id: getEntryId(id, link, pubDate),\n title,\n link: getPureUrl(link, '', baseUrl),\n published,\n description: buildDescription(textContent || htmlContent || summary, descriptionMaxLen),\n }\n\n return {\n ...entry,\n ...extraFields,\n }\n}\n\nconst parseJson = (data, options) => {\n const {\n normalization,\n baseUrl,\n getExtraFeedFields,\n } = options\n\n if (!normalization) {\n return data\n }\n\n const {\n title = '',\n home_page_url: homepageUrl = '',\n description = '',\n language = '',\n items: item = [],\n } = data\n\n const extraFields = getExtraFeedFields(data)\n\n const items = isArray(item) ? item : [item]\n\n return {\n title,\n link: purifyUrl(homepageUrl) || absolutify(baseUrl, homepageUrl),\n description,\n language,\n published: '',\n generator: '',\n ...extraFields,\n entries: items.map((item) => {\n return transform(item, options)\n }),\n }\n}\n\nexport default (data, options = {}) => {\n return parseJson(data, options)\n}\n", "// normalizer\n\nimport {\n isString,\n isObject,\n isArray,\n hasProperty,\n stripTags,\n truncate\n} from '@ndaidong/bellajs'\n\nimport { decode } from 'html-entities'\n\nimport { absolutify, isValid as isValidUrl, purify as purifyUrl } from './linker.js'\n\nexport const toISODateString = (dstr) => {\n try {\n return dstr ? (new Date(dstr)).toISOString() : ''\n } catch {\n return ''\n }\n}\n\nexport const buildDescription = (val, maxlen = 0) => {\n const stripped = stripTags(String(val).trim().replace(/^<!\\[CDATA\\[|\\]\\]>$/g, ''))\n const text = maxlen > 0 ? truncate(stripped, maxlen) : stripped\n return text.replace(/\\n+/g, ' ')\n}\n\nexport const getText = (val) => {\n const txt = isObject(val) ? (val._text || val['#text'] || val._cdata || val.$t) : val\n return txt ? decode(String(txt).trim()) : ''\n}\n\nexport const getLink = (val = [], id = '') => {\n if (isObject(id) && hasProperty(id, '@_isPermaLink') && id['@_isPermaLink'] === 'true') {\n return getText(id)\n }\n const getEntryLink = (links) => {\n const items = links.map((item) => {\n return getLink(item)\n })\n return items.length > 0 ? items[0] : ''\n }\n const url = isString(val)\n ? getText(val)\n : isObject(val) && hasProperty(val, 'href')\n ? getText(val.href)\n : isObject(val) && hasProperty(val, '@_href')\n ? getText(val['@_href'])\n : isObject(val) && hasProperty(val, '@_url')\n ? getText(val['@_url'])\n : isObject(val) && hasProperty(val, '_attributes')\n ? getText(val._attributes.href)\n : isArray(val) ? getEntryLink(val) : ''\n\n return url ? url : isValidUrl(id) ? id : ''\n}\n\nexport const getPureUrl = (url, id = '', baseUrl) => {\n const link = getLink(url, id)\n const pu = purifyUrl(link)\n\n return link\n ? pu\n ? pu\n : absolutify(baseUrl, link)\n : ''\n}\n\nconst hash = (str) => Math.abs(str.split('').reduce((s, c) => Math.imul(31, s) + c.charCodeAt(0) | 0, 0)).toString(36)\n\nexport const getEntryId = (id, url, pubDate) => {\n return id ? getText(id) : hash(getPureUrl(url)) + '-' + (new Date(pubDate)).getTime()\n}\n\nexport const getEnclosure = (val) => {\n const url = hasProperty(val, '@_url') ? val['@_url'] : ''\n const type = hasProperty(val, '@_type') ? val['@_type'] : ''\n const length = Number(hasProperty(val, '@_length') ? val['@_length'] : 0)\n return !url || !type\n ? null\n : {\n url,\n type,\n length,\n }\n}\n\nconst getCategory = (v) => {\n return isObject(v)\n ? {\n text: getText(v),\n domain: v['@_domain'],\n }\n : v\n}\n\nexport const getOptionalTags = (val, key) => {\n if (key === 'source') {\n return {\n text: getText(val),\n url: getLink(val),\n }\n }\n if (key === 'category') {\n return isArray(val) ? val.map(getCategory) : getCategory(val)\n }\n if (key === 'enclosure') {\n return getEnclosure(val)\n }\n return val\n}\n", "// parseRssFeed.js\n\n// specs: https://www.rssboard.org/rss-specification\n\nimport { isArray, hasProperty } from '@ndaidong/bellajs'\n\nimport {\n getText,\n toISODateString,\n buildDescription,\n getPureUrl,\n getOptionalTags,\n getEntryId\n} from './normalizer.js'\n\nconst transform = (item, options) => {\n const {\n useISODateFormat,\n descriptionMaxLen,\n baseUrl,\n getExtraEntryFields,\n } = options\n\n const {\n guid = '',\n title = '',\n link = '',\n pubDate = '',\n description = '',\n 'content:encoded': content = '',\n } = item\n\n const published = useISODateFormat ? toISODateString(pubDate) : pubDate\n const htmlContent = getText(description || content)\n const entry = {\n id: getEntryId(guid, link, pubDate),\n title: getText(title),\n link: getPureUrl(link, guid, baseUrl),\n published,\n description: buildDescription(htmlContent, descriptionMaxLen),\n }\n\n const extraFields = getExtraEntryFields(item)\n\n return {\n ...entry,\n ...extraFields,\n }\n}\n\nconst flatten = (feed, baseUrl) => {\n const {\n title = '',\n link = '',\n item,\n } = feed\n\n const items = isArray(item) ? item : [item]\n const entries = items.map((entry) => {\n const {\n id,\n title = '',\n link = '',\n } = entry\n\n const item = {\n ...entry,\n title: getText(title),\n link: getPureUrl(link, id, baseUrl),\n }\n\n const txtTags = 'guid description source'.split(' ')\n\n txtTags.forEach((key) => {\n if (hasProperty(entry, key)) {\n item[key] = getText(entry[key])\n }\n })\n\n const optionalProps = 'source category enclosure author image'.split(' ')\n optionalProps.forEach((key) => {\n if (hasProperty(item, key)) {\n entry[key] = getOptionalTags(item[key], key)\n }\n })\n\n return item\n })\n\n const output = {\n ...feed,\n title: getText(title),\n link: getPureUrl(link, baseUrl),\n item: isArray(item) ? entries : entries[0],\n }\n return output\n}\n\nconst parseRss = (data, options = {}) => {\n const {\n normalization,\n baseUrl,\n getExtraFeedFields,\n } = options\n\n const feedData = data.rss.channel\n\n if (!normalization) {\n return flatten(feedData, baseUrl)\n }\n\n const {\n title = '',\n link = '',\n description = '',\n generator = '',\n language = '',\n lastBuildDate = '',\n item = [],\n } = feedData\n\n const extraFields = getExtraFeedFields(feedData)\n\n const items = isArray(item) ? item : [item]\n\n const published = options.useISODateFormat ? toISODateString(lastBuildDate) : lastBuildDate\n\n return {\n title: getText(title),\n link: getPureUrl(link, '', baseUrl),\n description,\n language,\n generator,\n published,\n ...extraFields,\n entries: items.map((item) => {\n return transform(item, options)\n }),\n }\n}\n\nexport default (data, options = {}) => {\n return parseRss(data, options)\n}\n", "// parseAtomFeed.js\n\n// specs: https://datatracker.ietf.org/doc/html/rfc5023\n// refer: https://validator.w3.org/feed/docs/atom.html\n\nimport { isArray, hasProperty } from '@ndaidong/bellajs'\n\nimport {\n getText,\n toISODateString,\n buildDescription,\n getPureUrl,\n getEntryId\n} from './normalizer.js'\n\nconst transform = (item, options) => {\n const {\n useISODateFormat,\n descriptionMaxLen,\n baseUrl,\n getExtraEntryFields,\n } = options\n\n const {\n id = '',\n title = '',\n issued = '',\n modified = '',\n updated = '',\n published = '',\n link = '',\n summary = '',\n content = '',\n } = item\n\n const pubDate = updated || modified || published || issued\n const htmlContent = getText(summary || content)\n const entry = {\n id: getEntryId(id, link, pubDate),\n title: getText(title),\n link: getPureUrl(link, id, baseUrl),\n published: useISODateFormat ? toISODateString(pubDate) : pubDate,\n description: buildDescription(htmlContent, descriptionMaxLen),\n }\n\n const extraFields = getExtraEntryFields(item)\n\n return {\n ...entry,\n ...extraFields,\n }\n}\n\nconst flatten = (feed, baseUrl) => {\n const {\n id,\n title = '',\n link = '',\n entry,\n } = feed\n\n const entries = isArray(entry) ? entry : [entry]\n const items = entries.map((entry) => {\n const {\n id,\n title = '',\n link = '',\n summary = '',\n content = '',\n } = entry\n const item = {\n ...entry,\n title: getText(title),\n link: getPureUrl(link, id, baseUrl),\n }\n if (hasProperty(item, 'summary')) {\n item.summary = getText(summary)\n }\n if (hasProperty(item, 'content')) {\n item.content = getText(content)\n }\n return item\n })\n\n const output = {\n ...feed,\n title: getText(title),\n link: getPureUrl(link, id, baseUrl),\n entry: isArray(entry) ? items : items[0],\n }\n return output\n}\n\nconst parseAtom = (data, options = {}) => {\n const {\n normalization,\n baseUrl,\n getExtraFeedFields,\n } = options\n\n const feedData = data.feed\n\n if (!normalization) {\n return flatten(feedData, baseUrl)\n }\n\n const {\n id = '',\n title = '',\n link = '',\n subtitle = '',\n generator = '',\n language = '',\n updated = '',\n entry: item = [],\n } = feedData\n\n const extraFields = getExtraFeedFields(feedData)\n\n const items = isArray(item) ? item : [item]\n\n const published = options.useISODateFormat ? toISODateString(updated) : updated\n\n return {\n title: getText(title),\n link: getPureUrl(link, id, baseUrl),\n description: subtitle,\n language,\n generator,\n published,\n ...extraFields,\n entries: items.map((item) => {\n return transform(item, options)\n }),\n }\n}\n\nexport default (data, options = {}) => {\n return parseAtom(data, options)\n}\n", "// parseRssFeed.js\n\n// specs: https://www.rssboard.org/rss-specification\n\nimport { isArray } from '@ndaidong/bellajs'\n\nimport {\n getText,\n toISODateString,\n buildDescription,\n getPureUrl,\n getEntryId\n} from './normalizer.js'\n\nconst transform = (item, options) => {\n const {\n useISODateFormat,\n descriptionMaxLen,\n baseUrl,\n getExtraEntryFields,\n } = options\n\n const {\n guid = '',\n title = '',\n link = '',\n 'dc:date': pubDate = '',\n description = '',\n 'content:encoded': content = '',\n } = item\n\n const published = useISODateFormat ? toISODateString(pubDate) : pubDate\n const htmlContent = getText(description || content)\n const entry = {\n id: getEntryId(guid, link, pubDate),\n title: getText(title),\n link: getPureUrl(link, guid, baseUrl),\n published,\n description: buildDescription(htmlContent, descriptionMaxLen),\n }\n\n const extraFields = getExtraEntryFields(item)\n\n return {\n ...entry,\n ...extraFields,\n }\n}\n\nconst flatten = (feed, baseUrl) => {\n const {\n title = '',\n link = '',\n item,\n } = feed\n\n const items = isArray(item) ? item : [item]\n const entries = items.map((entry) => {\n const {\n id,\n title = '',\n link = '',\n } = entry\n\n const item = {\n ...entry,\n title: getText(title),\n link: getPureUrl(link, id, baseUrl),\n }\n\n return item\n })\n\n const output = {\n ...feed,\n title: getText(title),\n link: getPureUrl(link, baseUrl),\n item: isArray(item) ? entries : entries[0],\n }\n return output\n}\n\nconst parseRdf = (data, options = {}) => {\n const {\n normalization,\n baseUrl,\n getExtraFeedFields,\n } = options\n\n const feedData = data['rdf:RDF']\n\n if (!normalization) {\n return flatten(feedData, baseUrl)\n }\n\n const {\n title = '',\n link = '',\n description = '',\n generator = '',\n 'dc:language': language = '',\n 'dc:date': lastBuildDate = '',\n } = feedData.channel\n\n const { item } = feedData\n\n const extraFields = getExtraFeedFields(feedData)\n\n const items = isArray(item) ? item : [item]\n\n const published = options.useISODateFormat ? toISODateString(lastBuildDate) : lastBuildDate\n\n return {\n title: getText(title),\n link: getPureUrl(link, '', baseUrl),\n description,\n language,\n generator,\n published,\n ...extraFields,\n entries: items.map((item) => {\n return transform(item, options)\n }),\n }\n}\n\nexport default (data, options = {}) => {\n return parseRdf(data, options)\n}\n", "// main.js\n\nimport { isValid as isValidUrl } from './utils/linker.js'\n\nimport retrieve from './utils/retrieve.js'\nimport { validate, xml2obj, isRSS, isAtom, isRdf } from './utils/xmlparser.js'\nimport parseJsonFeed from './utils/parseJsonFeed.js'\nimport parseRssFeed from './utils/parseRssFeed.js'\nimport parseAtomFeed from './utils/parseAtomFeed.js'\nimport parseRdfFeed from './utils/parseRdfFeed.js'\n\nconst getopt = (options = {}) => {\n const {\n normalization = true,\n descriptionMaxLen = 250,\n useISODateFormat = true,\n xmlParserOptions = {},\n baseUrl = '',\n getExtraFeedFields = () => ({}),\n getExtraEntryFields = () => ({}),\n } = options\n\n return {\n normalization,\n descriptionMaxLen,\n useISODateFormat,\n xmlParserOptions,\n baseUrl,\n getExtraFeedFields,\n getExtraEntryFields,\n }\n}\n\nexport const extractFromJson = (json, options = {}) => {\n return parseJsonFeed(json, getopt(options))\n}\n\nexport const extractFromXml = (xml, options = {}) => {\n if (!validate(xml)) {\n throw new Error('The XML document is not well-formed')\n }\n\n const opts = getopt(options)\n\n const data = xml2obj(xml, opts.xmlParserOptions)\n\n return isRSS(data)\n ? parseRssFeed(data, opts)\n : isAtom(data)\n ? parseAtomFeed(data, opts)\n : isRdf(data)\n ? parseRdfFeed(data, opts)\n : null\n}\n\nexport const extract = async (url, options = {}, fetchOptions = {}) => {\n if (!isValidUrl(url)) {\n throw new Error('Input param must be a valid URL')\n }\n\n const data = await retrieve(url, fetchOptions)\n if (!data.text && !data.json) {\n throw new Error(`Failed to load content from \"${url}\"`)\n }\n\n const { type, json, text } = data\n\n return type === 'json' ? extractFromJson(json, options) : extractFromXml(text, options)\n}\n\nexport const read = async (url, options, fetchOptions) => {\n console.warn('WARNING: read() is deprecated. Please use extract() instead!')\n return extract(url, options, fetchOptions)\n}\n"], "mappings": "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", "names": ["cjs_entry_exports", "__export", "extract", "extractFromJson", "extractFromXml", "read", "__toCommonJS", "isValid", "url", "ourl", "absolutify", "fullUrl", "relativeUrl", "blacklistKeys", "purify", "pureUrl", "key", "import_cross_fetch", "import_fast_xml_parser", "profetch", "url", "options", "proxy", "signal", "target", "headers", "fetch", "getCharsetFromText", "text", "firstLine", "obj", "root", "retrieve_default", "agent", "res", "status", "contentType", "buffer", "arr", "charset", "import_bellajs", "import_fast_xml_parser", "isRSS", "data", "isAtom", "isRdf", "validate", "xml", "xml2obj", "extraOptions", "options", "import_bellajs", "import_bellajs", "import_html_entities", "toISODateString", "dstr", "buildDescription", "val", "maxlen", "stripped", "getText", "txt", "getLink", "id", "getEntryLink", "links", "items", "item", "url", "isValid", "getPureUrl", "baseUrl", "link", "pu", "purify", "absolutify", "hash", "str", "s", "c", "getEntryId", "pubDate", "getEnclosure", "type", "length", "getCategory", "v", "getOptionalTags", "key", "transform", "item", "options", "useISODateFormat", "descriptionMaxLen", "baseUrl", "getExtraEntryFields", "id", "title", "link", "pubDate", "summary", "htmlContent", "textContent", "published", "toISODateString", "extraFields", "getEntryId", "getPureUrl", "buildDescription", "parseJson", "data", "normalization", "getExtraFeedFields", "homepageUrl", "description", "language", "items", "purify", "absolutify", "parseJsonFeed_default", "import_bellajs", "transform", "item", "options", "useISODateFormat", "descriptionMaxLen", "baseUrl", "getExtraEntryFields", "guid", "title", "link", "pubDate", "description", "content", "published", "toISODateString", "htmlContent", "getText", "entry", "getEntryId", "getPureUrl", "buildDescription", "extraFields", "flatten", "feed", "entries", "id", "key", "getOptionalTags", "parseRss", "data", "normalization", "getExtraFeedFields", "feedData", "generator", "language", "lastBuildDate", "items", "parseRssFeed_default", "import_bellajs", "transform", "item", "options", "useISODateFormat", "descriptionMaxLen", "baseUrl", "getExtraEntryFields", "id", "title", "issued", "modified", "updated", "published", "link", "summary", "content", "pubDate", "htmlContent", "getText", "entry", "getEntryId", "getPureUrl", "toISODateString", "buildDescription", "extraFields", "flatten", "feed", "items", "parseAtom", "data", "normalization", "getExtraFeedFields", "feedData", "subtitle", "generator", "language", "parseAtomFeed_default", "import_bellajs", "transform", "item", "options", "useISODateFormat", "descriptionMaxLen", "baseUrl", "getExtraEntryFields", "guid", "title", "link", "pubDate", "description", "content", "published", "toISODateString", "htmlContent", "getText", "entry", "getEntryId", "getPureUrl", "buildDescription", "extraFields", "flatten", "feed", "entries", "id", "parseRdf", "data", "normalization", "getExtraFeedFields", "feedData", "generator", "language", "lastBuildDate", "items", "parseRdfFeed_default", "getopt", "options", "normalization", "descriptionMaxLen", "useISODateFormat", "xmlParserOptions", "baseUrl", "getExtraFeedFields", "getExtraEntryFields", "extractFromJson", "json", "parseJsonFeed_default", "extractFromXml", "xml", "validate", "opts", "data", "xml2obj", "isRSS", "parseRssFeed_default", "isAtom", "parseAtomFeed_default", "isRdf", "parseRdfFeed_default", "extract", "url", "fetchOptions", "isValid", "retrieve_default", "type", "text", "read", "warnCjsUsage", "_a", "_b", "yellow", "str"] }