diff --git a/dist/cjs/feed-reader.js b/dist/cjs/feed-reader.js index d0bb8c2..d98e095 100644 --- a/dist/cjs/feed-reader.js +++ b/dist/cjs/feed-reader.js @@ -1,4 +1,4 @@ -// feed-reader@5.0.0rc1, by @ndaidong - built with esbuild at 2022-01-04T03:35:30.889Z - published under MIT license +// feed-reader@5.0.0rc3, by @ndaidong - built with esbuild at 2022-01-29T03:22:04.964Z - published under MIT license var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; @@ -178,12 +178,12 @@ var require_common = __commonJS({ if (!debug2.enabled) { return; } - const self2 = debug2; + const self = debug2; const curr = Number(new Date()); const ms = curr - (prevTime || curr); - self2.diff = ms; - self2.prev = prevTime; - self2.curr = curr; + self.diff = ms; + self.prev = prevTime; + self.curr = curr; prevTime = curr; args[0] = createDebug.coerce(args[0]); if (typeof args[0] !== "string") { @@ -198,15 +198,15 @@ var require_common = __commonJS({ const formatter = createDebug.formatters[format]; if (typeof formatter === "function") { const val = args[index]; - match = formatter.call(self2, val); + match = formatter.call(self, val); args.splice(index, 1); index--; } return match; }); - createDebug.formatArgs.call(self2, args); - const logFn = self2.log || createDebug.log; - logFn.apply(self2, args); + createDebug.formatArgs.call(self, args); + const logFn = self.log || createDebug.log; + logFn.apply(self, args); } debug2.namespace = namespace; debug2.useColors = createDebug.useColors(); @@ -789,14 +789,14 @@ var require_utils = __commonJS({ "use strict"; var bind = require_bind(); var toString = Object.prototype.toString; - function isArray2(val) { + function isArray3(val) { return toString.call(val) === "[object Array]"; } - function isUndefined(val) { + function isUndefined2(val) { return typeof val === "undefined"; } function isBuffer(val) { - return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && typeof val.constructor.isBuffer === "function" && val.constructor.isBuffer(val); + return val !== null && !isUndefined2(val) && val.constructor !== null && !isUndefined2(val.constructor) && typeof val.constructor.isBuffer === "function" && val.constructor.isBuffer(val); } function isArrayBuffer(val) { return toString.call(val) === "[object ArrayBuffer]"; @@ -813,13 +813,13 @@ var require_utils = __commonJS({ } return result; } - function isString2(val) { + function isString3(val) { return typeof val === "string"; } - function isNumber(val) { + function isNumber2(val) { return typeof val === "number"; } - function isObject2(val) { + function isObject3(val) { return val !== null && typeof val === "object"; } function isPlainObject(val) { @@ -829,7 +829,7 @@ var require_utils = __commonJS({ var prototype = Object.getPrototypeOf(val); return prototype === null || prototype === Object.prototype; } - function isDate(val) { + function isDate2(val) { return toString.call(val) === "[object Date]"; } function isFile(val) { @@ -838,11 +838,11 @@ var require_utils = __commonJS({ function isBlob(val) { return toString.call(val) === "[object Blob]"; } - function isFunction(val) { + function isFunction2(val) { return toString.call(val) === "[object Function]"; } function isStream(val) { - return isObject2(val) && isFunction(val.pipe); + return isObject3(val) && isFunction2(val.pipe); } function isURLSearchParams(val) { return typeof URLSearchParams !== "undefined" && val instanceof URLSearchParams; @@ -863,7 +863,7 @@ var require_utils = __commonJS({ if (typeof obj !== "object") { obj = [obj]; } - if (isArray2(obj)) { + if (isArray3(obj)) { for (var i = 0, l = obj.length; i < l; i++) { fn.call(null, obj[i], i, obj); } @@ -882,7 +882,7 @@ var require_utils = __commonJS({ result[key] = merge(result[key], val); } else if (isPlainObject(val)) { result[key] = merge({}, val); - } else if (isArray2(val)) { + } else if (isArray3(val)) { result[key] = val.slice(); } else { result[key] = val; @@ -910,20 +910,20 @@ var require_utils = __commonJS({ return content; } module2.exports = { - isArray: isArray2, + isArray: isArray3, isArrayBuffer, isBuffer, isFormData, isArrayBufferView, - isString: isString2, - isNumber, - isObject: isObject2, + isString: isString3, + isNumber: isNumber2, + isObject: isObject3, isPlainObject, - isUndefined, - isDate, + isUndefined: isUndefined2, + isDate: isDate2, isFile, isBlob, - isFunction, + isFunction: isFunction2, isStream, isURLSearchParams, isStandardBrowserEnv, @@ -1484,9 +1484,9 @@ var require_follow_redirects = __commonJS({ if (responseCallback) { this.on("response", responseCallback); } - var self2 = this; + var self = this; this._onNativeResponse = function(response) { - self2._processResponse(response); + self._processResponse(response); }; this._performRequest(); } @@ -1533,10 +1533,10 @@ var require_follow_redirects = __commonJS({ this._ended = this._ending = true; this._currentRequest.end(null, null, callback); } else { - var self2 = this; + var self = this; var currentRequest = this._currentRequest; this.write(data, encoding, function() { - self2._ended = true; + self._ended = true; currentRequest.end(null, null, callback); }); this._ending = true; @@ -1551,35 +1551,35 @@ var require_follow_redirects = __commonJS({ this._currentRequest.removeHeader(name2); }; RedirectableRequest.prototype.setTimeout = function(msecs, callback) { - var self2 = this; + var self = this; function destroyOnTimeout(socket) { socket.setTimeout(msecs); socket.removeListener("timeout", socket.destroy); socket.addListener("timeout", socket.destroy); } function startTimer(socket) { - if (self2._timeout) { - clearTimeout(self2._timeout); + if (self._timeout) { + clearTimeout(self._timeout); } - self2._timeout = setTimeout(function() { - self2.emit("timeout"); + self._timeout = setTimeout(function() { + self.emit("timeout"); clearTimer(); }, msecs); destroyOnTimeout(socket); } function clearTimer() { - if (self2._timeout) { - clearTimeout(self2._timeout); - self2._timeout = null; + if (self._timeout) { + clearTimeout(self._timeout); + self._timeout = null; } - self2.removeListener("abort", clearTimer); - self2.removeListener("error", clearTimer); - self2.removeListener("response", clearTimer); + self.removeListener("abort", clearTimer); + self.removeListener("error", clearTimer); + self.removeListener("response", clearTimer); if (callback) { - self2.removeListener("timeout", callback); + self.removeListener("timeout", callback); } - if (!self2.socket) { - self2._currentRequest.removeListener("socket", startTimer); + if (!self.socket) { + self._currentRequest.removeListener("socket", startTimer); } } if (callback) { @@ -1652,18 +1652,18 @@ var require_follow_redirects = __commonJS({ } if (this._isRedirect) { var i = 0; - var self2 = this; + var self = this; var buffers = this._requestBodyBuffers; (function writeNext(error2) { - if (request === self2._currentRequest) { + if (request === self._currentRequest) { if (error2) { - self2.emit("error", error2); + self.emit("error", error2); } else if (i < buffers.length) { var buffer = buffers[i++]; if (!request.finished) { request.write(buffer.data, buffer.encoding, writeNext); } - } else if (self2._ended) { + } else if (self._ended) { request.end(); } } @@ -2692,698 +2692,230 @@ var require_axios2 = __commonJS({ } }); -// node_modules/.pnpm/bellajs@10.0.2/node_modules/bellajs/dist/bella.js +// node_modules/.pnpm/bellajs@11.0.0-rc3/node_modules/bellajs/dist/cjs/bella.js var require_bella = __commonJS({ - "node_modules/.pnpm/bellajs@10.0.2/node_modules/bellajs/dist/bella.js"(exports, module2) { - (function(global, factory) { - typeof exports === "object" && typeof module2 !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.bella = {})); - })(exports, function(exports2) { - const ob2Str = (val) => { - return {}.toString.call(val); - }; - const isInteger = (val) => { - return Number.isInteger(val); - }; - const isArray2 = (val) => { - return Array.isArray(val); - }; - const isString2 = (val) => { - return String(val) === val; - }; - const isNumber = (val) => { - return Number(val) === val; - }; - const isBoolean = (val) => { - return Boolean(val) === val; - }; - const isNull = (val) => { - return ob2Str(val) === "[object Null]"; - }; - const isUndefined = (val) => { - return ob2Str(val) === "[object Undefined]"; - }; - const isNil = (val) => { - return isUndefined(val) || isNull(val); - }; - const isFunction = (val) => { - return ob2Str(val) === "[object Function]"; - }; - const isObject2 = (val) => { - return ob2Str(val) === "[object Object]" && !isArray2(val); - }; - const isDate = (val) => { - return val instanceof Date && !isNaN(val.valueOf()); - }; - const isElement = (v) => { - return ob2Str(v).match(/^\[object HTML\w*Element]$/) !== null; - }; - const isLetter = (val) => { - const re = /^[a-z]+$/i; - return isString2(val) && re.test(val); - }; - const isEmail = (val) => { - const re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i; - return isString2(val) && re.test(val); - }; - const isEmpty = (val) => { - return !val || isNil(val) || isString2(val) && val === "" || isArray2(val) && val.length === 0 || isObject2(val) && Object.keys(val).length === 0; - }; - const hasProperty3 = (ob, k) => { - if (!ob || !k) { + "node_modules/.pnpm/bellajs@11.0.0-rc3/node_modules/bellajs/dist/cjs/bella.js"(exports, module2) { + var S = Object.defineProperty; + var U = Object.getOwnPropertyDescriptor; + var q = Object.getOwnPropertyNames; + var F = Object.prototype.hasOwnProperty; + var R = (t) => S(t, "__esModule", { value: true }); + var z = (t, e) => { + for (var r in e) + S(t, r, { get: e[r], enumerable: true }); + }; + var B = (t, e, r, n) => { + if (e && typeof e == "object" || typeof e == "function") + for (let o of q(e)) + !F.call(t, o) && (r || o !== "default") && S(t, o, { get: () => e[o], enumerable: !(n = U(e, o)) || n.enumerable }); + return t; + }; + var H = ((t) => (e, r) => t && t.get(e) || (r = B(R({}), e, 1), t && t.set(e, r), r))(typeof WeakMap != "undefined" ? /* @__PURE__ */ new WeakMap() : 0); + var gt = {}; + z(gt, { clone: () => M, compose: () => it, copies: () => I, curry: () => ct, equals: () => A, escapeHTML: () => Z, formatDateString: () => ot, formatTimeAgo: () => st, genid: () => et, hasProperty: () => a, isArray: () => u, isBoolean: () => V, isDate: () => h, isElement: () => G, isEmail: () => Y, isEmpty: () => d, isFunction: () => X, isInteger: () => $, isLetter: () => W, isNil: () => _, isNull: () => E, isNumber: () => y, isObject: () => l, isString: () => p, isUndefined: () => N, maybe: () => b, pick: () => at, pipe: () => ut, randint: () => O, replaceAll: () => w, shuffle: () => P, slugify: () => rt, sort: () => L, sortBy: () => ft, stripAccent: () => D, stripTags: () => Q, truncate: () => K, ucfirst: () => T, ucwords: () => tt, unescapeHTML: () => v, unique: () => lt }); + var m = (t) => ({}).toString.call(t); + var $ = (t) => Number.isInteger(t); + var u = (t) => Array.isArray(t); + var p = (t) => String(t) === t; + var y = (t) => Number(t) === t; + var V = (t) => Boolean(t) === t; + var E = (t) => m(t) === "[object Null]"; + var N = (t) => m(t) === "[object Undefined]"; + var _ = (t) => N(t) || E(t); + var X = (t) => m(t) === "[object Function]"; + var l = (t) => m(t) === "[object Object]" && !u(t); + var h = (t) => t instanceof Date && !isNaN(t.valueOf()); + var G = (t) => m(t).match(/^\[object HTML\w*Element]$/) !== null; + var W = (t) => { + let e = /^[a-z]+$/i; + return p(t) && e.test(t); + }; + var Y = (t) => { + let e = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i; + return p(t) && e.test(t); + }; + var d = (t) => !t || _(t) || p(t) && t === "" || u(t) && t.length === 0 || l(t) && Object.keys(t).length === 0; + var a = (t, e) => !t || !e ? false : Object.prototype.hasOwnProperty.call(t, e); + var A = (t, e) => { + if (d(t) && d(e)) + return true; + if (h(t) && h(e)) + return t.getTime() === e.getTime(); + if (u(t) && u(e)) { + if (t.length !== e.length) return false; - } - return Object.prototype.hasOwnProperty.call(ob, k); - }; - const equals = (a, b) => { - if (isEmpty(a) && isEmpty(b)) { - return true; - } - if (isDate(a) && isDate(b)) { - return a.getTime() === b.getTime(); - } - if (isArray2(a) && isArray2(b)) { - if (a.length !== b.length) { - return false; - } - let re = true; - for (let i = 0; i < a.length; i++) { - if (!equals(a[i], b[i])) { - re = false; - break; - } - } - return re; - } - if (isObject2(a) && isObject2(b)) { - if (Object.keys(a).length !== Object.keys(b).length) { - return false; - } - let re = true; - for (const k in a) { - if (!hasProperty3(b, k) || !equals(a[k], b[k])) { - re = false; - break; - } - } - return re; - } - return a === b; - }; - const MAX_NUMBER = Number.MAX_SAFE_INTEGER; - const randint = (min, max) => { - if (!min || min < 0) { - min = 0; - } - if (!max) { - max = MAX_NUMBER; - } - if (min === max) { - return max; - } - if (min > max) { - min = Math.min(min, max); - max = Math.max(min, max); - } - const offset = min; - const range = max - min + 1; - return Math.floor(Math.random() * range) + offset; - }; - const toString = (input) => { - const s = isNumber(input) ? String(input) : input; - if (!isString2(s)) { - throw new Error("InvalidInput: String required."); - } - return s; - }; - const truncate2 = (s, l) => { - const o = toString(s); - const t = l || 140; - if (o.length <= t) { - return o; - } - let x = o.substring(0, t); - const a = x.split(" "); - const b = a.length; - let r = ""; - if (b > 1) { - a.pop(); - r += a.join(" "); - if (r.length < o.length) { - r += "..."; + let r = true; + for (let n = 0; n < t.length; n++) + if (!A(t[n], e[n])) { + r = false; + break; } - } else { - x = x.substring(0, t - 3); - r = x + "..."; - } return r; - }; - const stripTags2 = (s) => { - return toString(s).replace(/<.*?>/gi, " ").replace(/\s\s+/g, " ").trim(); - }; - const escapeHTML = (s) => { - const x = toString(s); - return x.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); - }; - const unescapeHTML = (s) => { - const x = toString(s); - return x.replace(/"/g, '"').replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&"); - }; - const ucfirst = (s) => { - const x = toString(s).toLowerCase(); - return x.length > 1 ? x.charAt(0).toUpperCase() + x.slice(1) : x.toUpperCase(); - }; - const ucwords = (s) => { - return toString(s).split(" ").map((w) => { - return ucfirst(w); - }).join(" "); - }; - const replaceAll = (s, a, b) => { - let x = toString(s); - if (isNumber(a)) { - a = String(a); - } - if (isNumber(b)) { - b = String(b); - } - if (isString2(a) && isString2(b)) { - const aa = x.split(a); - x = aa.join(b); - } else if (isArray2(a) && isString2(b)) { - a.forEach((v) => { - x = replaceAll(x, v, b); - }); - } else if (isArray2(a) && isArray2(b) && a.length === b.length) { - const k = a.length; - if (k > 0) { - for (let i = 0; i < k; i++) { - const aaa = a[i]; - const bb = b[i]; - x = replaceAll(x, aaa, bb); - } - } - } - return x; - }; - const stripAccent = (s) => { - let x = toString(s); - const map = { - a: "á|à|ả|ã|ạ|ă|ắ|ặ|ằ|ẳ|ẵ|â|ấ|ầ|ẩ|ẫ|ậ|ä", - A: "Á|À|Ả|Ã|Ạ|Ă|Ắ|Ặ|Ằ|Ẳ|Ẵ|Â|Ấ|Ầ|Ẩ|Ẫ|Ậ|Ä", - c: "ç", - C: "Ç", - d: "đ", - D: "Đ", - e: "é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ|ë", - E: "É|È|Ẻ|Ẽ|Ẹ|Ê|Ế|Ề|Ể|Ễ|Ệ|Ë", - i: "í|ì|ỉ|ĩ|ị|ï|î", - I: "Í|Ì|Ỉ|Ĩ|Ị|Ï|Î", - o: "ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ|ö", - O: "Ó|Ò|Ỏ|Õ|Ọ|Ô|Ố|Ồ|Ổ|Ô|Ộ|Ơ|Ớ|Ờ|Ở|Ỡ|Ợ|Ö", - u: "ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự|û", - U: "Ú|Ù|Ủ|Ũ|Ụ|Ư|Ứ|Ừ|Ử|Ữ|Ự|Û", - y: "ý|ỳ|ỷ|ỹ|ỵ", - Y: "Ý|Ỳ|Ỷ|Ỹ|Ỵ" - }; - const updateS = (ai, key) => { - x = replaceAll(x, ai, key); - }; - for (const key in map) { - if (hasProperty3(map, key)) { - const a = map[key].split("|"); - a.forEach((item) => { - return updateS(item, key); - }); - } - } - return x; - }; - const genid = (leng, prefix = "") => { - const lc = "abcdefghijklmnopqrstuvwxyz"; - const uc = lc.toUpperCase(); - const nb = "0123456789"; - const cand = [ - lc, - uc, - nb - ].join("").split("").sort(() => { - return Math.random() > 0.5; - }).join(""); - const t = cand.length; - const ln = Math.max(leng || 32, prefix.length); - let s = prefix; - while (s.length < ln) { - const k = randint(0, t); - s += cand.charAt(k) || ""; - } - return s; - }; - const slugify = (s, delimiter = "-") => { - return stripAccent(s).trim().toLowerCase().replace(/\W+/g, " ").replace(/\s+/g, " ").replace(/\s/g, delimiter); - }; - const PATTERN = "D, M d, Y h:i:s A"; - const WEEKDAYS = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" - ]; - const MONTHS = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" - ]; - const now = () => { - return new Date(); - }; - const time = () => { - return Date.now(); - }; - const tzone = now().getTimezoneOffset(); - const tz = (() => { - const z = Math.abs(tzone / 60); - const sign = tzone < 0 ? "+" : "-"; - return ["GMT", sign, String(z).padStart(4, "0")].join(""); - })(); - const _num = (n) => { - return String(n < 10 ? "0" + n : n); - }; - const _ord = (day) => { - let s = day + " "; - const x = s.charAt(s.length - 2); - if (x === "1") { - s = "st"; - } else if (x === "2") { - s = "nd"; - } else if (x === "3") { - s = "rd"; - } else { - s = "th"; - } - return s; - }; - const toDateString = (input, output = PATTERN) => { - const d = isDate(input) ? input : new Date(input); - if (!isDate(d)) { - throw new Error("InvalidInput: Number or Date required."); - } - const vchar = /\.*\\?([a-z])/gi; - const meridiem = output.includes("a") || output.includes("A"); - const wn = WEEKDAYS; - const mn = MONTHS; - const f = { - Y() { - return d.getFullYear(); - }, - y() { - return (f.Y() + "").slice(-2); - }, - F() { - return mn[f.n() - 1]; - }, - M() { - return (f.F() + "").slice(0, 3); - }, - m() { - return _num(f.n()); - }, - n() { - return d.getMonth() + 1; - }, - S() { - return _ord(f.j()); - }, - j() { - return d.getDate(); - }, - d() { - return _num(f.j()); - }, - t() { - return new Date(f.Y(), f.n(), 0).getDate(); - }, - w() { - return d.getDay(); - }, - l() { - return wn[f.w()]; - }, - D() { - return (f.l() + "").slice(0, 3); - }, - G() { - return d.getHours(); - }, - g() { - return f.G() % 12 || 12; - }, - h() { - return _num(meridiem ? f.g() : f.G()); - }, - i() { - return _num(d.getMinutes()); - }, - s() { - return _num(d.getSeconds()); - }, - a() { - return f.G() > 11 ? "pm" : "am"; - }, - A() { - return f.a().toUpperCase(); - }, - O() { - return tz; - } - }; - const _term = (t, s) => { - return f[t] ? f[t]() : s; - }; - return output.replace(vchar, _term); - }; - const toRelativeTime = (input = time()) => { - const d = isDate(input) ? input : new Date(input); - if (!isDate(d)) { - throw new Error("InvalidInput: Number or Date required."); - } - let delta = now() - d; - let nowThreshold = parseInt(d, 10); - if (isNaN(nowThreshold)) { - nowThreshold = 0; - } - if (delta <= nowThreshold) { - return "Just now"; - } - let units = null; - const conversions = { - millisecond: 1, - second: 1e3, - minute: 60, - hour: 60, - day: 24, - month: 30, - year: 12 - }; - for (const key in conversions) { - if (delta < conversions[key]) { + } + if (l(t) && l(e)) { + if (Object.keys(t).length !== Object.keys(e).length) + return false; + let r = true; + for (let n in t) + if (!a(e, n) || !A(t[n], e[n])) { + r = false; break; - } else { - units = key; - delta /= conversions[key]; } - } - delta = Math.floor(delta); - if (delta !== 1) { - units += "s"; - } - return [delta, units].join(" ") + " ago"; - }; - const toUTCDateString = (input = time()) => { - const d = isDate(input) ? input : new Date(input); - if (!isDate(d)) { - throw new Error("InvalidInput: Number or Date required."); - } - const dMinutes = d.getMinutes(); - const dClone = new Date(d); - dClone.setMinutes(dMinutes + tzone); - return `${toDateString(dClone, "D, j M Y h:i:s")} GMT+0000`; - }; - const toLocalDateString = (input = time()) => { - const d = isDate(input) ? input : new Date(input); - if (!isDate(d)) { - throw new Error("InvalidInput: Number or Date required."); - } - return toDateString(d, "D, j M Y h:i:s O"); - }; - let md5 = (str) => { - var k = [], y = 0; - for (; y < 64; ) { - k[y] = 0 | Math.abs(Math.sin(++y)) * 4294967296; - } - var b, c, d, j, x = [], str2 = decodeURIComponent(encodeURI(str)), a = str2.length, h = [b = 1732584193, c = -271733879, ~b, ~c], i = 0; - for (; i <= a; ) - x[i >> 2] |= (str2.charCodeAt(i) || 128) << 8 * (i++ % 4); - x[str = (a + 8 >> 6) * 16 + 14] = a * 8; - i = 0; - for (; i < str; i += 16) { - a = h; - j = 0; - for (; j < 64; ) { - a = [ - d = a[3], - (b = a[1] | 0) + ((d = a[0] + [ - b & (c = a[2]) | ~b & d, - d & b | ~d & c, - b ^ c ^ d, - c ^ (b | ~d) - ][a = j >> 4] + (k[j] + (x[[ - j, - 5 * j + 1, - 3 * j + 5, - 7 * j - ][a] % 16 + i] | 0))) << (a = [ - 7, - 12, - 17, - 22, - 5, - 9, - 14, - 20, - 4, - 11, - 16, - 23, - 6, - 10, - 15, - 21 - ][4 * a + j++ % 4]) | d >>> 32 - a), - b, - c - ]; - } - for (j = 4; j; ) - h[--j] = h[j] + a[j]; - } - str = ""; - for (; j < 32; ) - str += (h[j >> 3] >> (1 ^ j++ & 7) * 4 & 15).toString(16); - return str; - }; - const curry = (fn) => { - const totalArguments = fn.length; - const next = (argumentLength, rest) => { - if (argumentLength > 0) { - return (...args) => { - return next(argumentLength - args.length, [...rest, ...args]); - }; - } - return fn(...rest); - }; - return next(totalArguments, []); - }; - const compose = (...fns) => { - return fns.reduce((f, g) => (x) => f(g(x))); - }; - const pipe = (...fns) => { - return fns.reduce((f, g) => (x) => g(f(x))); - }; - const defineProp = (ob, key, val, config = {}) => { - const { - writable = false, - configurable = false, - enumerable = false - } = config; - Object.defineProperty(ob, key, { - value: val, - writable, - configurable, - enumerable + return r; + } + return t === e; + }; + var J = Number.MAX_SAFE_INTEGER; + var O = (t, e) => { + if ((!t || t < 0) && (t = 0), e || (e = J), t === e) + return e; + t > e && (t = Math.min(t, e), e = Math.max(t, e)); + let r = t, n = e - t + 1; + return Math.floor(Math.random() * n) + r; + }; + var g = (t) => { + let e = y(t) ? String(t) : t; + if (!p(e)) + throw new Error("InvalidInput: String required."); + return e; + }; + var K = (t, e) => { + let r = g(t), n = e || 140; + if (r.length <= n) + return r; + let o = r.substring(0, n), s = o.split(" "), i = s.length, c = ""; + return i > 1 ? (s.pop(), c += s.join(" "), c.length < r.length && (c += "...")) : (o = o.substring(0, n - 3), c = o + "..."), c; + }; + var Q = (t) => g(t).replace(/<.*?>/gi, " ").replace(/\s\s+/g, " ").trim(); + var Z = (t) => g(t).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); + var v = (t) => g(t).replace(/"/g, '"').replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&"); + var T = (t) => { + let e = g(t).toLowerCase(); + return e.length > 1 ? e.charAt(0).toUpperCase() + e.slice(1) : e.toUpperCase(); + }; + var tt = (t) => g(t).split(" ").map((e) => T(e)).join(" "); + var w = (t, e, r) => { + let n = g(t); + if (y(e) && (e = String(e)), y(r) && (r = String(r)), p(e) && p(r)) + n = n.split(e).join(r); + else if (u(e) && p(r)) + e.forEach((o) => { + n = w(n, o, r); }); - }; - const maybe = (val) => { - const __val = val; - const isNil2 = () => { - return __val === null || __val === void 0; - }; - const value = () => { - return __val; - }; - const getElse = (fn) => { - return maybe(__val || fn()); - }; - const filter = (fn) => { - return maybe(fn(__val) === true ? __val : null); - }; - const map = (fn) => { - return maybe(isNil2() ? null : fn(__val)); - }; - const output = /* @__PURE__ */ Object.create({}); - defineProp(output, "__value__", __val, { enumerable: true }); - defineProp(output, "__type__", "Maybe", { enumerable: true }); - defineProp(output, "isNil", isNil2); - defineProp(output, "value", value); - defineProp(output, "map", map); - defineProp(output, "if", filter); - defineProp(output, "else", getElse); - return output; - }; - const clone2 = (val, history = null) => { - const stack = history || /* @__PURE__ */ new Set(); - if (stack.has(val)) { - return val; - } - stack.add(val); - if (isDate(val)) { - return new Date(val.valueOf()); - } - const copyObject = (o) => { - const oo = /* @__PURE__ */ Object.create({}); - for (const k in o) { - if (hasProperty3(o, k)) { - oo[k] = clone2(o[k], stack); - } - } - return oo; - }; - const copyArray = (a) => { - return [...a].map((e) => { - if (isArray2(e)) { - return copyArray(e); - } else if (isObject2(e)) { - return copyObject(e); - } - return clone2(e, stack); - }); - }; - if (isArray2(val)) { - return copyArray(val); - } - if (isObject2(val)) { - return copyObject(val); - } - return val; - }; - const copies2 = (source, dest, matched = false, excepts = []) => { - for (const k in source) { - if (excepts.length > 0 && excepts.includes(k)) { - continue; - } - if (!matched || matched && hasProperty3(dest, k)) { - const oa = source[k]; - const ob = dest[k]; - if (isObject2(ob) && isObject2(oa) || isArray2(ob) && isArray2(oa)) { - dest[k] = copies2(oa, dest[k], matched, excepts); - } else { - dest[k] = clone2(oa); - } + else if (u(e) && u(r) && e.length === r.length) { + let o = e.length; + if (o > 0) + for (let s = 0; s < o; s++) { + let i = e[s], c = r[s]; + n = w(n, i, c); } - } - return dest; - }; - const unique = (arr = []) => { - return [...new Set(arr)]; - }; - const fnSort = (a, b) => { - return a > b ? 1 : a < b ? -1 : 0; - }; - const sort = (arr = [], sorting = null) => { - const tmp = [...arr]; - const fn = sorting || fnSort; - tmp.sort(fn); - return tmp; + } + return n; + }; + var D = (t) => { + let e = g(t), r = { a: "á|à|ả|ã|ạ|ă|ắ|ặ|ằ|ẳ|ẵ|â|ấ|ầ|ẩ|ẫ|ậ|ä", A: "Á|À|Ả|Ã|Ạ|Ă|Ắ|Ặ|Ằ|Ẳ|Ẵ|Â|Ấ|Ầ|Ẩ|Ẫ|Ậ|Ä", c: "ç", C: "Ç", d: "đ", D: "Đ", e: "é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ|ë", E: "É|È|Ẻ|Ẽ|Ẹ|Ê|Ế|Ề|Ể|Ễ|Ệ|Ë", i: "í|ì|ỉ|ĩ|ị|ï|î", I: "Í|Ì|Ỉ|Ĩ|Ị|Ï|Î", o: "ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ|ö", O: "Ó|Ò|Ỏ|Õ|Ọ|Ô|Ố|Ồ|Ổ|Ô|Ộ|Ơ|Ớ|Ờ|Ở|Ỡ|Ợ|Ö", u: "ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự|û", U: "Ú|Ù|Ủ|Ũ|Ụ|Ư|Ứ|Ừ|Ử|Ữ|Ự|Û", y: "ý|ỳ|ỷ|ỹ|ỵ", Y: "Ý|Ỳ|Ỷ|Ỹ|Ỵ" }, n = (o, s) => { + e = w(e, o, s); }; - const sortBy = (arr = [], order = 1, key = "") => { - if (!isString2(key) || !hasProperty3(arr[0], key)) { - return arr; + for (let o in r) + a(r, o) && r[o].split("|").forEach((i) => n(i, o)); + return e; + }; + var et = (t, e = "") => { + let r = "abcdefghijklmnopqrstuvwxyz", n = r.toUpperCase(), s = [r, n, "0123456789"].join("").split("").sort(() => Math.random() > 0.5).join(""), i = s.length, c = Math.max(t || 32, e.length), f = e; + for (; f.length < c; ) { + let C = O(0, i); + f += s.charAt(C) || ""; + } + return f; + }; + var rt = (t, e = "-") => D(t).trim().toLowerCase().replace(/\W+/g, " ").replace(/\s+/g, " ").replace(/\s/g, e); + var k = { dateStyle: "medium", timeStyle: "long" }; + var j = { second: 1e3, minute: 60, hour: 60, day: 24, week: 7, month: 4, year: 12 }; + var nt = (t) => { + try { + return new Intl.Locale(t).language !== ""; + } catch { + return false; + } + }; + var ot = (...t) => { + let e = t[0], r = nt(t[1]) ? t[1] : "en", n = t.length >= 3 ? t[2] : t.length === 1 ? k : l(t[1]) ? t[1] : k; + return new Intl.DateTimeFormat(r, n).format(new Date(e)); + }; + var st = (t, e = "en", r = "just now") => { + let n = new Date(t), o = Date.now() - n; + if (o <= j.second) + return r; + let s = "second"; + for (let c in j) { + if (o < j[c]) + break; + s = c, o /= j[c]; + } + return o = Math.floor(o), new Intl.RelativeTimeFormat(e).format(-o, s); + }; + var ct = (t) => { + let e = t.length, r = (n, o) => n > 0 ? (...s) => r(n - s.length, [...o, ...s]) : t(...o); + return r(e, []); + }; + var it = (...t) => t.reduce((e, r) => (n) => e(r(n))); + var ut = (...t) => t.reduce((e, r) => (n) => r(e(n))); + var x = (t, e, r, n = {}) => { + let { writable: o = false, configurable: s = false, enumerable: i = false } = n; + Object.defineProperty(t, e, { value: r, writable: o, configurable: s, enumerable: i }); + }; + var b = (t) => { + let e = t, r = () => e == null, n = () => e, o = (f) => b(e || f()), s = (f) => b(f(e) === true ? e : null), i = (f) => b(r() ? null : f(e)), c = /* @__PURE__ */ Object.create({}); + return x(c, "__value__", e, { enumerable: true }), x(c, "__type__", "Maybe", { enumerable: true }), x(c, "isNil", r), x(c, "value", n), x(c, "map", i), x(c, "if", s), x(c, "else", o), c; + }; + var M = (t, e = null) => { + let r = e || /* @__PURE__ */ new Set(); + if (r.has(t)) + return t; + if (r.add(t), h(t)) + return new Date(t.valueOf()); + let n = (s) => { + let i = /* @__PURE__ */ Object.create({}); + for (let c in s) + a(s, c) && (i[c] = M(s[c], r)); + return i; + }, o = (s) => [...s].map((i) => u(i) ? o(i) : l(i) ? n(i) : M(i, r)); + return u(t) ? o(t) : l(t) ? n(t) : t; + }; + var I = (t, e, r = false, n = []) => { + for (let o in t) + if (!(n.length > 0 && n.includes(o)) && (!r || r && a(e, o))) { + let s = t[o], i = e[o]; + l(i) && l(s) || u(i) && u(s) ? e[o] = I(s, e[o], r, n) : e[o] = M(s); } - return sort(arr, (m, n) => { - return m[key] > n[key] ? order : m[key] < n[key] ? -1 * order : 0; - }); - }; - const shuffle = (arr = []) => { - const input = [...arr]; - const output = []; - let inputLen = input.length; - while (inputLen > 0) { - const index = Math.floor(Math.random() * inputLen); - output.push(input.splice(index, 1)[0]); - inputLen--; - } - return output; - }; - const pick = (arr = [], count = 1) => { - const a = shuffle(arr); - const mc = Math.max(1, count); - const c = Math.min(mc, a.length - 1); - return a.splice(0, c); - }; - exports2.clone = clone2; - exports2.compose = compose; - exports2.copies = copies2; - exports2.curry = curry; - exports2.equals = equals; - exports2.escapeHTML = escapeHTML; - exports2.genid = genid; - exports2.hasProperty = hasProperty3; - exports2.isArray = isArray2; - exports2.isBoolean = isBoolean; - exports2.isDate = isDate; - exports2.isElement = isElement; - exports2.isEmail = isEmail; - exports2.isEmpty = isEmpty; - exports2.isFunction = isFunction; - exports2.isInteger = isInteger; - exports2.isLetter = isLetter; - exports2.isNil = isNil; - exports2.isNull = isNull; - exports2.isNumber = isNumber; - exports2.isObject = isObject2; - exports2.isString = isString2; - exports2.isUndefined = isUndefined; - exports2.maybe = maybe; - exports2.md5 = md5; - exports2.now = now; - exports2.pick = pick; - exports2.pipe = pipe; - exports2.randint = randint; - exports2.replaceAll = replaceAll; - exports2.shuffle = shuffle; - exports2.slugify = slugify; - exports2.sort = sort; - exports2.sortBy = sortBy; - exports2.stripAccent = stripAccent; - exports2.stripTags = stripTags2; - exports2.time = time; - exports2.toDateString = toDateString; - exports2.toLocalDateString = toLocalDateString; - exports2.toRelativeTime = toRelativeTime; - exports2.toUTCDateString = toUTCDateString; - exports2.truncate = truncate2; - exports2.ucfirst = ucfirst; - exports2.ucwords = ucwords; - exports2.unescapeHTML = unescapeHTML; - exports2.unique = unique; - Object.defineProperty(exports2, "__esModule", { value: true }); - }); + return e; + }; + var lt = (t = []) => [...new Set(t)]; + var pt = (t, e) => t > e ? 1 : t < e ? -1 : 0; + var L = (t = [], e = null) => { + let r = [...t], n = e || pt; + return r.sort(n), r; + }; + var ft = (t = [], e = 1, r = "") => !p(r) || !a(t[0], r) ? t : L(t, (n, o) => n[r] > o[r] ? e : n[r] < o[r] ? -1 * e : 0); + var P = (t = []) => { + let e = [...t], r = [], n = e.length; + for (; n > 0; ) { + let o = Math.floor(Math.random() * n); + r.push(e.splice(o, 1)[0]), n--; + } + return r; + }; + var at = (t = [], e = 1) => { + let r = P(t), n = Math.max(1, e), o = Math.min(n, r.length - 1); + return r.splice(0, o); + }; + module2.exports = H(gt); } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/util.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/util.js var require_util = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/util.js"(exports) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/util.js"(exports) { "use strict"; var nameStartChar = ":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; var nameChar = nameStartChar + "\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; @@ -3440,9 +2972,9 @@ var require_util = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/validator.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/validator.js var require_validator2 = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/validator.js"(exports) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/validator.js"(exports) { "use strict"; var util = require_util(); var defaultOptions = { @@ -3746,9 +3278,9 @@ var require_validator2 = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js var require_OptionsBuilder = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js"(exports) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js"(exports) { var defaultOptions = { preserveOrder: false, attributeNamePrefix: "@_", @@ -3787,9 +3319,9 @@ var require_OptionsBuilder = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js var require_xmlNode = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js"(exports, module2) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js"(exports, module2) { "use strict"; var XmlNode = class { constructor(tagname) { @@ -3812,9 +3344,9 @@ var require_xmlNode = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js var require_DocTypeReader = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js"(exports, module2) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js"(exports, module2) { function readDocType(xmlData, i) { const entities = {}; if (xmlData[i + 3] === "O" && xmlData[i + 4] === "C" && xmlData[i + 5] === "T" && xmlData[i + 6] === "Y" && xmlData[i + 7] === "P" && xmlData[i + 8] === "E") { @@ -3975,9 +3507,9 @@ var require_strnum = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js var require_OrderedObjParser = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js"(exports, module2) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js"(exports, module2) { "use strict"; var util = require_util(); var xmlNode = require_xmlNode(); @@ -4382,9 +3914,9 @@ var require_OrderedObjParser = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/node2json.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/node2json.js var require_node2json = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/node2json.js"(exports) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/node2json.js"(exports) { "use strict"; function prettify(node, options) { return compress(node, options); @@ -4473,9 +4005,9 @@ var require_node2json = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js var require_XMLParser = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js"(exports, module2) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js"(exports, module2) { var { buildOptions } = require_OptionsBuilder(); var OrderedObjParser = require_OrderedObjParser(); var { prettify } = require_node2json(); @@ -4522,10 +4054,10 @@ var require_XMLParser = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js var require_orderedJs2Xml = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js"(exports, module2) { - var { EOL } = require("os"); + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js"(exports, module2) { + var EOL = "\n"; function toXml(jArray, options) { return arrToStr(jArray, options, "", 0); } @@ -4620,9 +4152,9 @@ var require_orderedJs2Xml = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlbuilder/json2xml.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlbuilder/json2xml.js var require_json2xml = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/xmlbuilder/json2xml.js"(exports, module2) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/xmlbuilder/json2xml.js"(exports, module2) { "use strict"; var buildFromOrderedJs = require_orderedJs2Xml(); var defaultOptions = { @@ -4809,9 +4341,9 @@ var require_json2xml = __commonJS({ } }); -// node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/fxp.js +// node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/fxp.js var require_fxp = __commonJS({ - "node_modules/.pnpm/fast-xml-parser@4.0.0-beta.8/node_modules/fast-xml-parser/src/fxp.js"(exports, module2) { + "node_modules/.pnpm/fast-xml-parser@4.0.0/node_modules/fast-xml-parser/src/fxp.js"(exports, module2) { "use strict"; var validator = require_validator2(); var XMLParser2 = require_XMLParser(); @@ -5239,7 +4771,7 @@ var parseRSS = (xmldata) => { lastBuildDate = "", item = [] } = channel; - const entries = item.map(nomalizeRssItem); + const entries = (0, import_bellajs2.isArray)(item) ? item.map(nomalizeRssItem) : [nomalizeRssItem(item)]; return { title, link: purifyUrl_default(link), diff --git a/dist/cjs/package.json b/dist/cjs/package.json index d749d33..09aa6a7 100644 --- a/dist/cjs/package.json +++ b/dist/cjs/package.json @@ -1,5 +1,5 @@ { "name": "feed-reader-cjs", - "version": "5.0.0rc1", + "version": "5.0.0rc3", "main": "./feed-reader.js" } \ No newline at end of file diff --git a/package.json b/package.json index e29043a..68f5587 100755 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "5.0.0rc2", + "version": "5.0.0rc3", "name": "feed-reader", "description": "Load and parse ATOM/RSS data from given feed url", "homepage": "https://www.npmjs.com/package/feed-reader", @@ -10,14 +10,13 @@ "author": "@ndaidong", "main": "./dist/cjs/feed-reader.js", "module": "./src/main.js", - "browser": "./dist/feed-reader.min.js", "type": "module", "types": "./index.d.ts", "engines": { "node": ">= 14" }, "scripts": { - "lint": "standard ./src", + "lint": "standard .", "pretest": "npm run lint", "test": "jest --verbose --coverage=true --unhandled-rejections=strict --detectOpenHandles", "build": "node build src/main.js", @@ -25,17 +24,17 @@ "reset": "node reset" }, "dependencies": { - "axios": "^0.24.0", + "axios": "^0.25.0", "bellajs": "^11.0.0rc3", "debug": "^4.3.3", - "fast-xml-parser": "^4.0.0-beta.8", + "fast-xml-parser": "^4.0.1", "html-entities": "^2.3.2" }, "devDependencies": { - "@babel/plugin-transform-modules-commonjs": "^7.16.7", - "esbuild": "^0.14.10", - "jest": "^27.4.5", - "nock": "^13.2.1" + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "esbuild": "^0.14.14", + "jest": "^27.4.7", + "nock": "^13.2.2" }, "babel": { "env": { diff --git a/src/main.test.js b/src/main.test.js index d6a8666..4a6da0d 100755 --- a/src/main.test.js +++ b/src/main.test.js @@ -11,8 +11,6 @@ import { read } from './main.js' const feedAttrs = 'title link description generator language published entries'.split(' ') const entryAttrs = 'title link description published'.split(' ') -const state = {} - const parseUrl = (url) => { const re = new URL(url) return { @@ -57,57 +55,64 @@ test('test read from invalid xml', async () => { expect(fn()).rejects.toThrow(Error) }) -test('test read from good atom source', async () => { - const url = 'https://news.google.com/atom' - const xml = readFileSync('test-data/atom.xml', 'utf8') - const { baseUrl, path } = parseUrl(url) - nock(baseUrl).head(path).reply(200) - nock(baseUrl).get(path).reply(200, xml, { - 'Content-Type': 'application/xml' - }) - const result = await read(url) - expect(result).toBeInstanceOf(Object) - expect(result.entries.length).toEqual(2) - state.atomFeed = result - state.atomFeedEntry = result.entries[0] -}) +const runtest = ({ type, url, file, size }) => { + describe(`test if ${type} parsing works correctly`, () => { + const state = {} + test(`test read from good ${type} source`, async () => { + const xml = readFileSync(file, 'utf8') + const { baseUrl, path } = parseUrl(url) + nock(baseUrl).head(path).reply(200) + nock(baseUrl).get(path).reply(200, xml, { + 'Content-Type': 'application/xml' + }) + const result = await read(url) + expect(result).toBeInstanceOf(Object) + expect(result.entries.length).toEqual(size) + state.data = result + state.firstEntry = result.entries[0] + }) -feedAttrs.forEach((k) => { - test(` test if atom feed has property "${k}"`, () => { - expect(hasProperty(state.atomFeed, k)).toBe(true) - }) -}) -entryAttrs.forEach((k) => { - test(` test if atom feed entry has property "${k}"`, () => { - expect(hasProperty(state.atomFeedEntry, k)).toBe(true) + feedAttrs.forEach((k) => { + test(` test if ${type} feed has property "${k}"`, () => { + expect(hasProperty(state.data, k)).toBe(true) + }) + }) + entryAttrs.forEach((k) => { + test(` test if ${type} feed entry has property "${k}"`, () => { + expect(hasProperty(state.firstEntry, k)).toBe(true) + }) + }) }) -}) +} -test('test read from good rss source', async () => { - const url = 'https://news.google.com/rss' - const xml = readFileSync('test-data/rss.xml', 'utf8') - const { baseUrl, path } = parseUrl(url) - nock(baseUrl).head(path).reply(200) - nock(baseUrl).get(path).reply(200, xml, { - 'Content-Type': 'application/xml' - }) - const result = await read(url) - expect(result).toBeInstanceOf(Object) - expect(result.entries.length).toEqual(2) - state.rssFeed = result - state.rssFeedEntry = result.entries[0] -}) +const sources = [ + { + type: 'atom', + url: 'https://news.google.com/atom', + file: 'test-data/atom.xml', + size: 2 + }, + { + type: 'atom', + url: 'https://news.google.com/atom-with-single-item', + file: 'test-data/atom-with-single-item.xml', + size: 1 + }, + { + type: 'rss', + url: 'https://news.google.com/rss', + file: 'test-data/rss.xml', + size: 2 + }, + { + type: 'rss', + url: 'https://news.google.com/rss-with-single-item', + file: 'test-data/rss-with-single-item.xml', + size: 1 + } +] -feedAttrs.forEach((k) => { - test(` test if rss feed has property "${k}"`, () => { - expect(hasProperty(state.rssFeed, k)).toBe(true) - }) -}) -entryAttrs.forEach((k) => { - test(` test if rss feed entry has property "${k}"`, () => { - expect(hasProperty(state.rssFeedEntry, k)).toBe(true) - }) -}) +sources.forEach(runtest) test('test read from a more complicate atom source', async () => { const url = 'https://headline.com/atom' diff --git a/src/utils/parser.js b/src/utils/parser.js index fc77e8c..dea7e1a 100755 --- a/src/utils/parser.js +++ b/src/utils/parser.js @@ -85,7 +85,7 @@ export const parseRSS = (xmldata) => { item = [] } = channel - const entries = isArray(item) ? item.map(nomalizeRssItem) : [nomalizeAtomItem(item)] + const entries = isArray(item) ? item.map(nomalizeRssItem) : [nomalizeRssItem(item)] return { title, diff --git a/test-data/atom-with-single-item.xml b/test-data/atom-with-single-item.xml new file mode 100644 index 0000000..9694d8f --- /dev/null +++ b/test-data/atom-with-single-item.xml @@ -0,0 +1,24 @@ + + + https://news.google.com/atom?hl=en-US&gl=US&ceid=US:en + NFE/5.0 + Top stories - Google News + Google News + 2021-11-20T10:43:17.000000000Z + + Google Inc. + news-webmaster@google.com + https://news.google.com + + + + 2021 Google Inc. + + https://news.google.com/stories/CAAqNggKIjBDQklTSGpvSmMzUnZjbmt0TXpZd1NoRUtEd2pPLWRxY0JCRVlmT2xQTzh2NmJTZ0FQAQ?oc=5 + Kyle Rittenhouse Breaks Silence After Not Guilty Verdict - NBC Chicago + 2021-11-20T07:25:12.000000000Z + + Something new here + + diff --git a/test-data/rss-with-single-item.xml b/test-data/rss-with-single-item.xml new file mode 100644 index 0000000..e60ead3 --- /dev/null +++ b/test-data/rss-with-single-item.xml @@ -0,0 +1,22 @@ + + + + NFE/5.0 + Top stories - Google News + https://news.google.com/?hl=en-US&gl=US&ceid=US:en + en-US + news-webmaster@google.com + 2021 Google Inc. + Sat, 20 Nov 2021 10:44:20 GMT + Google News + + Biden gets first physical as president, power transferred to VP Harris - ABC News + https://news.google.com/__i/rss/rd/articles/CBMiZmh0dHBzOi8vYWJjbmV3cy5nby5jb20vUG9saXRpY3MvYmlkZW4tcGh5c2ljYWwtcHJlc2lkZW50LXBvd2VyLXRyYW5zZmVycmVkLXZwLWhhcnJpcy9zdG9yeT9pZD04MTI1OTAyMNIBamh0dHBzOi8vYWJjbmV3cy5nby5jb20vYW1wL1BvbGl0aWNzL2JpZGVuLXBoeXNpY2FsLXByZXNpZGVudC1wb3dlci10cmFuc2ZlcnJlZC12cC1oYXJyaXMvc3Rvcnk_aWQ9ODEyNTkwMjA?oc=5 + 1181825440 + Fri, 19 Nov 2021 23:26:15 GMT + Something new here + ABC News + + +