UNPKG

rss-parser

Version:

A lightweight RSS parser, for Node and the browser

1,431 lines (1,376 loc) 435 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("xmlbuilder")); else if(typeof define === 'function' && define.amd) define(["xmlbuilder"], factory); else if(typeof exports === 'object') exports["RSSParser"] = factory(require("xmlbuilder")); else root["RSSParser"] = factory(root["xmlbuilder"]); })(this, function(__WEBPACK_EXTERNAL_MODULE_xmlbuilder__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./index.js": /*!******************!*\ !*** ./index.js ***! \******************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; module.exports = __webpack_require__(/*! ./lib/parser */ "./lib/parser.js"); /***/ }), /***/ "./lib/fields.js": /*!***********************!*\ !*** ./lib/fields.js ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports) { var fields = module.exports = {}; fields.feed = [['author', 'creator'], ['dc:publisher', 'publisher'], ['dc:creator', 'creator'], ['dc:source', 'source'], ['dc:title', 'title'], ['dc:type', 'type'], 'title', 'description', 'author', 'pubDate', 'webMaster', 'managingEditor', 'generator', 'link', 'language', 'copyright', 'lastBuildDate', 'docs', 'generator', 'ttl', 'rating', 'skipHours', 'skipDays']; fields.item = [['author', 'creator'], ['dc:creator', 'creator'], ['dc:date', 'date'], ['dc:language', 'language'], ['dc:rights', 'rights'], ['dc:source', 'source'], ['dc:title', 'title'], 'title', 'link', 'pubDate', 'author', 'summary', ['content:encoded', 'content:encoded', { includeSnippet: true }], 'enclosure', 'dc:creator', 'dc:date', 'comments']; var mapItunesField = function mapItunesField(f) { return ['itunes:' + f, f]; }; fields.podcastFeed = ['author', 'subtitle', 'summary', 'explicit'].map(mapItunesField); fields.podcastItem = ['author', 'subtitle', 'summary', 'explicit', 'duration', 'image', 'episode', 'image', 'season', 'keywords', 'episodeType'].map(mapItunesField); /***/ }), /***/ "./lib/parser.js": /*!***********************!*\ !*** ./lib/parser.js ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } var http = __webpack_require__(/*! http */ "./node_modules/stream-http/index.js"); var https = __webpack_require__(/*! https */ "./node_modules/https-browserify/index.js"); var xml2js = __webpack_require__(/*! xml2js */ "./node_modules/xml2js/lib/xml2js.js"); var url = __webpack_require__(/*! url */ "./node_modules/url/url.js"); var fields = __webpack_require__(/*! ./fields */ "./lib/fields.js"); var utils = __webpack_require__(/*! ./utils */ "./lib/utils.js"); var DEFAULT_HEADERS = { 'User-Agent': 'rss-parser', 'Accept': 'application/rss+xml' }; var DEFAULT_MAX_REDIRECTS = 5; var DEFAULT_TIMEOUT = 60000; var Parser = /*#__PURE__*/function () { function Parser() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Parser); options.headers = options.headers || {}; options.xml2js = options.xml2js || {}; options.customFields = options.customFields || {}; options.customFields.item = options.customFields.item || []; options.customFields.feed = options.customFields.feed || []; options.requestOptions = options.requestOptions || {}; if (!options.maxRedirects) options.maxRedirects = DEFAULT_MAX_REDIRECTS; if (!options.timeout) options.timeout = DEFAULT_TIMEOUT; this.options = options; this.xmlParser = new xml2js.Parser(this.options.xml2js); } _createClass(Parser, [{ key: "parseString", value: function parseString(xml, callback) { var _this = this; var prom = new Promise(function (resolve, reject) { _this.xmlParser.parseString(xml, function (err, result) { if (err) return reject(err); if (!result) { return reject(new Error('Unable to parse XML.')); } var feed = null; if (result.feed) { feed = _this.buildAtomFeed(result); } else if (result.rss && result.rss.$ && result.rss.$.version && result.rss.$.version.match(/^2/)) { feed = _this.buildRSS2(result); } else if (result['rdf:RDF']) { feed = _this.buildRSS1(result); } else if (result.rss && result.rss.$ && result.rss.$.version && result.rss.$.version.match(/0\.9/)) { feed = _this.buildRSS0_9(result); } else if (result.rss && _this.options.defaultRSS) { switch (_this.options.defaultRSS) { case 0.9: feed = _this.buildRSS0_9(result); break; case 1: feed = _this.buildRSS1(result); break; case 2: feed = _this.buildRSS2(result); break; default: return reject(new Error("default RSS version not recognized.")); } } else { return reject(new Error("Feed not recognized as RSS 1 or 2.")); } resolve(feed); }); }); prom = utils.maybePromisify(callback, prom); return prom; } }, { key: "parseURL", value: function parseURL(feedUrl, callback) { var _this2 = this; var redirectCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var xml = ''; var get = feedUrl.indexOf('https') === 0 ? https.get : http.get; var urlParts = url.parse(feedUrl); var headers = Object.assign({}, DEFAULT_HEADERS, this.options.headers); var timeout = null; var prom = new Promise(function (resolve, reject) { var requestOpts = Object.assign({ headers: headers }, urlParts, _this2.options.requestOptions); var req = get(requestOpts, function (res) { if (_this2.options.maxRedirects && res.statusCode >= 300 && res.statusCode < 400 && res.headers['location']) { if (redirectCount === _this2.options.maxRedirects) { return reject(new Error("Too many redirects")); } else { var newLocation = url.resolve(feedUrl, res.headers['location']); return _this2.parseURL(newLocation, null, redirectCount + 1).then(resolve, reject); } } else if (res.statusCode >= 300) { return reject(new Error("Status code " + res.statusCode)); } var encoding = utils.getEncodingFromContentType(res.headers['content-type']); res.setEncoding(encoding); res.on('data', function (chunk) { xml += chunk; }); res.on('end', function () { return _this2.parseString(xml).then(resolve, reject); }); }); req.on('error', reject); timeout = setTimeout(function () { return reject(new Error("Request timed out after " + _this2.options.timeout + "ms")); }, _this2.options.timeout); }).then(function (data) { clearTimeout(timeout); return Promise.resolve(data); }, function (e) { clearTimeout(timeout); return Promise.reject(e); }); prom = utils.maybePromisify(callback, prom); return prom; } }, { key: "buildAtomFeed", value: function buildAtomFeed(xmlObj) { var _this3 = this; var feed = { items: [] }; utils.copyFromXML(xmlObj.feed, feed, this.options.customFields.feed); if (xmlObj.feed.link) { feed.link = utils.getLink(xmlObj.feed.link, 'alternate', 0); feed.feedUrl = utils.getLink(xmlObj.feed.link, 'self', 1); } if (xmlObj.feed.title) { var title = xmlObj.feed.title[0] || ''; if (title._) title = title._; if (title) feed.title = title; } if (xmlObj.feed.updated) { feed.lastBuildDate = xmlObj.feed.updated[0]; } feed.items = (xmlObj.feed.entry || []).map(function (entry) { return _this3.parseItemAtom(entry); }); return feed; } }, { key: "parseItemAtom", value: function parseItemAtom(entry) { var item = {}; utils.copyFromXML(entry, item, this.options.customFields.item); if (entry.title) { var title = entry.title[0] || ''; if (title._) title = title._; if (title) item.title = title; } if (entry.link && entry.link.length) { item.link = utils.getLink(entry.link, 'alternate', 0); } if (entry.published && entry.published.length && entry.published[0].length) item.pubDate = new Date(entry.published[0]).toISOString(); if (!item.pubDate && entry.updated && entry.updated.length && entry.updated[0].length) item.pubDate = new Date(entry.updated[0]).toISOString(); if (entry.author && entry.author.length && entry.author[0].name && entry.author[0].name.length) item.author = entry.author[0].name[0]; if (entry.content && entry.content.length) { item.content = utils.getContent(entry.content[0]); item.contentSnippet = utils.getSnippet(item.content); } if (entry.summary && entry.summary.length) { item.summary = utils.getContent(entry.summary[0]); } if (entry.id) { item.id = entry.id[0]; } this.setISODate(item); return item; } }, { key: "buildRSS0_9", value: function buildRSS0_9(xmlObj) { var channel = xmlObj.rss.channel[0]; var items = channel.item; return this.buildRSS(channel, items); } }, { key: "buildRSS1", value: function buildRSS1(xmlObj) { xmlObj = xmlObj['rdf:RDF']; var channel = xmlObj.channel[0]; var items = xmlObj.item; return this.buildRSS(channel, items); } }, { key: "buildRSS2", value: function buildRSS2(xmlObj) { var channel = xmlObj.rss.channel[0]; var items = channel.item; var feed = this.buildRSS(channel, items); if (xmlObj.rss.$ && xmlObj.rss.$['xmlns:itunes']) { this.decorateItunes(feed, channel); } return feed; } }, { key: "buildRSS", value: function buildRSS(channel, items) { var _this4 = this; items = items || []; var feed = { items: [] }; var feedFields = fields.feed.concat(this.options.customFields.feed); var itemFields = fields.item.concat(this.options.customFields.item); if (channel['atom:link'] && channel['atom:link'][0] && channel['atom:link'][0].$) { feed.feedUrl = channel['atom:link'][0].$.href; } if (channel.image && channel.image[0] && channel.image[0].url) { feed.image = {}; var image = channel.image[0]; if (image.link) feed.image.link = image.link[0]; if (image.url) feed.image.url = image.url[0]; if (image.title) feed.image.title = image.title[0]; if (image.width) feed.image.width = image.width[0]; if (image.height) feed.image.height = image.height[0]; } var paginationLinks = this.generatePaginationLinks(channel); if (Object.keys(paginationLinks).length) { feed.paginationLinks = paginationLinks; } utils.copyFromXML(channel, feed, feedFields); feed.items = items.map(function (xmlItem) { return _this4.parseItemRss(xmlItem, itemFields); }); return feed; } }, { key: "parseItemRss", value: function parseItemRss(xmlItem, itemFields) { var item = {}; utils.copyFromXML(xmlItem, item, itemFields); if (xmlItem.enclosure) { item.enclosure = xmlItem.enclosure[0].$; } if (xmlItem.description) { item.content = utils.getContent(xmlItem.description[0]); item.contentSnippet = utils.getSnippet(item.content); } if (xmlItem.guid) { item.guid = xmlItem.guid[0]; if (item.guid._) item.guid = item.guid._; } if (xmlItem.$ && xmlItem.$['rdf:about']) { item['rdf:about'] = xmlItem.$['rdf:about']; } if (xmlItem.category) item.categories = xmlItem.category; this.setISODate(item); return item; } /** * Add iTunes specific fields from XML to extracted JSON * * @access public * @param {object} feed extracted * @param {object} channel parsed XML */ }, { key: "decorateItunes", value: function decorateItunes(feed, channel) { var items = channel.item || []; var categories = []; feed.itunes = {}; if (channel['itunes:owner']) { var owner = {}; if (channel['itunes:owner'][0]['itunes:name']) { owner.name = channel['itunes:owner'][0]['itunes:name'][0]; } if (channel['itunes:owner'][0]['itunes:email']) { owner.email = channel['itunes:owner'][0]['itunes:email'][0]; } feed.itunes.owner = owner; } if (channel['itunes:image']) { var image; var hasImageHref = channel['itunes:image'][0] && channel['itunes:image'][0].$ && channel['itunes:image'][0].$.href; image = hasImageHref ? channel['itunes:image'][0].$.href : null; if (image) { feed.itunes.image = image; } } if (channel['itunes:category']) { var categoriesWithSubs = channel['itunes:category'].map(function (category) { return { name: category && category.$ && category.$.text, subs: category['itunes:category'] ? category['itunes:category'].map(function (subcategory) { return { name: subcategory && subcategory.$ && subcategory.$.text }; }) : null }; }); feed.itunes.categories = categoriesWithSubs.map(function (category) { return category.name; }); feed.itunes.categoriesWithSubs = categoriesWithSubs; } if (channel['itunes:keywords']) { if (channel['itunes:keywords'].length > 1) { feed.itunes.keywords = channel['itunes:keywords'].map(function (keyword) { return keyword && keyword.$ && keyword.$.text; }); } else { var keywords = channel['itunes:keywords'][0]; if (keywords && typeof keywords._ === 'string') { keywords = keywords._; } if (keywords && keywords.$ && keywords.$.text) { feed.itunes.keywords = keywords.$.text.split(','); } else if (typeof keywords === "string") { feed.itunes.keywords = keywords.split(','); } } } utils.copyFromXML(channel, feed.itunes, fields.podcastFeed); items.forEach(function (item, index) { var entry = feed.items[index]; entry.itunes = {}; utils.copyFromXML(item, entry.itunes, fields.podcastItem); var image = item['itunes:image']; if (image && image[0] && image[0].$ && image[0].$.href) { entry.itunes.image = image[0].$.href; } }); } }, { key: "setISODate", value: function setISODate(item) { var date = item.pubDate || item.date; if (date) { try { item.isoDate = new Date(date.trim()).toISOString(); } catch (e) { // Ignore bad date format } } } /** * Generates a pagination object where the rel attribute is the key and href attribute is the value * { self: 'self-url', first: 'first-url', ... } * * @access private * @param {Object} channel parsed XML * @returns {Object} */ }, { key: "generatePaginationLinks", value: function generatePaginationLinks(channel) { if (!channel['atom:link']) { return {}; } var paginationRelAttributes = ['self', 'first', 'next', 'prev', 'last']; return channel['atom:link'].reduce(function (paginationLinks, link) { if (!link.$ || !paginationRelAttributes.includes(link.$.rel)) { return paginationLinks; } paginationLinks[link.$.rel] = link.$.href; return paginationLinks; }, {}); } }]); return Parser; }(); module.exports = Parser; /***/ }), /***/ "./lib/utils.js": /*!**********************!*\ !*** ./lib/utils.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } var utils = module.exports = {}; var entities = __webpack_require__(/*! entities */ "./node_modules/entities/lib/index.js"); var xml2js = __webpack_require__(/*! xml2js */ "./node_modules/xml2js/lib/xml2js.js"); utils.stripHtml = function (str) { str = str.replace(/([^\n])<\/?(h|br|p|ul|ol|li|blockquote|section|table|tr|div)(?:.|\n)*?>([^\n])/gm, '$1\n$3'); str = str.replace(/<(?:.|\n)*?>/gm, ''); return str; }; utils.getSnippet = function (str) { return entities.decodeHTML(utils.stripHtml(str)).trim(); }; utils.getLink = function (links, rel, fallbackIdx) { if (!links) return; for (var i = 0; i < links.length; ++i) { if (links[i].$.rel === rel) return links[i].$.href; } if (links[fallbackIdx]) return links[fallbackIdx].$.href; }; utils.getContent = function (content) { if (typeof content._ === 'string') { return content._; } else if (_typeof(content) === 'object') { var builder = new xml2js.Builder({ headless: true, explicitRoot: true, rootName: 'div', renderOpts: { pretty: false } }); return builder.buildObject(content); } else { return content; } }; utils.copyFromXML = function (xml, dest, fields) { fields.forEach(function (f) { var from = f; var to = f; var options = {}; if (Array.isArray(f)) { from = f[0]; to = f[1]; if (f.length > 2) { options = f[2]; } } var _options = options, keepArray = _options.keepArray, includeSnippet = _options.includeSnippet; if (xml[from] !== undefined) { dest[to] = keepArray ? xml[from] : xml[from][0]; } if (dest[to] && typeof dest[to]._ === 'string') { dest[to] = dest[to]._; } if (includeSnippet && dest[to] && typeof dest[to] === 'string') { dest[to + 'Snippet'] = utils.getSnippet(dest[to]); } }); }; utils.maybePromisify = function (callback, promise) { if (!callback) return promise; return promise.then(function (data) { return setTimeout(function () { return callback(null, data); }); }, function (err) { return setTimeout(function () { return callback(err); }); }); }; var DEFAULT_ENCODING = 'utf8'; var ENCODING_REGEX = /(encoding|charset)\s*=\s*(\S+)/; var SUPPORTED_ENCODINGS = ['ascii', 'utf8', 'utf16le', 'ucs2', 'base64', 'latin1', 'binary', 'hex']; var ENCODING_ALIASES = { 'utf-8': 'utf8', 'iso-8859-1': 'latin1' }; utils.getEncodingFromContentType = function (contentType) { contentType = contentType || ''; var match = contentType.match(ENCODING_REGEX); var encoding = (match || [])[2] || ''; encoding = encoding.toLowerCase(); encoding = ENCODING_ALIASES[encoding] || encoding; if (!encoding || SUPPORTED_ENCODINGS.indexOf(encoding) === -1) { encoding = DEFAULT_ENCODING; } return encoding; }; /***/ }), /***/ "./node_modules/base64-js/index.js": /*!*****************************************!*\ !*** ./node_modules/base64-js/index.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.byteLength = byteLength; exports.toByteArray = toByteArray; exports.fromByteArray = fromByteArray; var lookup = []; var revLookup = []; var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; for (var i = 0, len = code.length; i < len; ++i) { lookup[i] = code[i]; revLookup[code.charCodeAt(i)] = i; } // Support decoding URL-safe base64 strings, as Node.js does. // See: https://en.wikipedia.org/wiki/Base64#URL_applications revLookup['-'.charCodeAt(0)] = 62; revLookup['_'.charCodeAt(0)] = 63; function getLens(b64) { var len = b64.length; if (len % 4 > 0) { throw new Error('Invalid string. Length must be a multiple of 4'); } // Trim off extra bytes after placeholder bytes are found // See: https://github.com/beatgammit/base64-js/issues/42 var validLen = b64.indexOf('='); if (validLen === -1) validLen = len; var placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4; return [validLen, placeHoldersLen]; } // base64 is 4/3 + up to two characters of the original data function byteLength(b64) { var lens = getLens(b64); var validLen = lens[0]; var placeHoldersLen = lens[1]; return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; } function _byteLength(b64, validLen, placeHoldersLen) { return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; } function toByteArray(b64) { var tmp; var lens = getLens(b64); var validLen = lens[0]; var placeHoldersLen = lens[1]; var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)); var curByte = 0; // if there are placeholders, only get up to the last complete 4 chars var len = placeHoldersLen > 0 ? validLen - 4 : validLen; var i; for (i = 0; i < len; i += 4) { tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)]; arr[curByte++] = tmp >> 16 & 0xFF; arr[curByte++] = tmp >> 8 & 0xFF; arr[curByte++] = tmp & 0xFF; } if (placeHoldersLen === 2) { tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4; arr[curByte++] = tmp & 0xFF; } if (placeHoldersLen === 1) { tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2; arr[curByte++] = tmp >> 8 & 0xFF; arr[curByte++] = tmp & 0xFF; } return arr; } function tripletToBase64(num) { return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]; } function encodeChunk(uint8, start, end) { var tmp; var output = []; for (var i = start; i < end; i += 3) { tmp = (uint8[i] << 16 & 0xFF0000) + (uint8[i + 1] << 8 & 0xFF00) + (uint8[i + 2] & 0xFF); output.push(tripletToBase64(tmp)); } return output.join(''); } function fromByteArray(uint8) { var tmp; var len = uint8.length; var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes var parts = []; var maxChunkLength = 16383; // must be multiple of 3 // go through the array every three bytes, we'll deal with trailing stuff later for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { parts.push(encodeChunk(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength)); } // pad the end with zeros, but make sure to not forget the extra bytes if (extraBytes === 1) { tmp = uint8[len - 1]; parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 0x3F] + '=='); } else if (extraBytes === 2) { tmp = (uint8[len - 2] << 8) + uint8[len - 1]; parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 0x3F] + lookup[tmp << 2 & 0x3F] + '='); } return parts.join(''); } /***/ }), /***/ "./node_modules/buffer/index.js": /*!**************************************!*\ !*** ./node_modules/buffer/index.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org> * @license MIT */ /* eslint-disable no-proto */ var base64 = __webpack_require__(/*! base64-js */ "./node_modules/base64-js/index.js"); var ieee754 = __webpack_require__(/*! ieee754 */ "./node_modules/ieee754/index.js"); var isArray = __webpack_require__(/*! isarray */ "./node_modules/isarray/index.js"); exports.Buffer = Buffer; exports.SlowBuffer = SlowBuffer; exports.INSPECT_MAX_BYTES = 50; /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * Due to various browser bugs, sometimes the Object implementation will be used even * when the browser supports typed arrays. * * Note: * * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of * incorrect length in some situations. * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport(); /* * Export kMaxLength after typed array support is determined. */ exports.kMaxLength = kMaxLength(); function typedArraySupport() { try { var arr = new Uint8Array(1); arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function foo() { return 42; } }; return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0; // ie10 has broken `subarray` } catch (e) { return false; } } function kMaxLength() { return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff; } function createBuffer(that, length) { if (kMaxLength() < length) { throw new RangeError('Invalid typed array length'); } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(length); that.__proto__ = Buffer.prototype; } else { // Fallback: Return an object instance of the Buffer class if (that === null) { that = new Buffer(length); } that.length = length; } return that; } /** * The Buffer constructor returns instances of `Uint8Array` that have their * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of * `Uint8Array`, so the returned instances will have all the node `Buffer` methods * and the `Uint8Array` methods. Square bracket notation works as expected -- it * returns a single octet. * * The `Uint8Array` prototype remains unmodified. */ function Buffer(arg, encodingOrOffset, length) { if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { return new Buffer(arg, encodingOrOffset, length); } // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { throw new Error('If encoding is specified then the first argument must be a string'); } return allocUnsafe(this, arg); } return from(this, arg, encodingOrOffset, length); } Buffer.poolSize = 8192; // not used by this implementation // TODO: Legacy, not needed anymore. Remove in next major version. Buffer._augment = function (arr) { arr.__proto__ = Buffer.prototype; return arr; }; function from(that, value, encodingOrOffset, length) { if (typeof value === 'number') { throw new TypeError('"value" argument must not be a number'); } if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { return fromArrayBuffer(that, value, encodingOrOffset, length); } if (typeof value === 'string') { return fromString(that, value, encodingOrOffset); } return fromObject(that, value); } /** * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError * if value is a number. * Buffer.from(str[, encoding]) * Buffer.from(array) * Buffer.from(buffer) * Buffer.from(arrayBuffer[, byteOffset[, length]]) **/ Buffer.from = function (value, encodingOrOffset, length) { return from(null, value, encodingOrOffset, length); }; if (Buffer.TYPED_ARRAY_SUPPORT) { Buffer.prototype.__proto__ = Uint8Array.prototype; Buffer.__proto__ = Uint8Array; if (typeof Symbol !== 'undefined' && Symbol.species && Buffer[Symbol.species] === Buffer) { // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 Object.defineProperty(Buffer, Symbol.species, { value: null, configurable: true }); } } function assertSize(size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be a number'); } else if (size < 0) { throw new RangeError('"size" argument must not be negative'); } } function alloc(that, size, fill, encoding) { assertSize(size); if (size <= 0) { return createBuffer(that, size); } if (fill !== undefined) { // Only pay attention to encoding if it's a string. This // prevents accidentally sending in a number that would // be interpretted as a start offset. return typeof encoding === 'string' ? createBuffer(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill); } return createBuffer(that, size); } /** * Creates a new filled Buffer instance. * alloc(size[, fill[, encoding]]) **/ Buffer.alloc = function (size, fill, encoding) { return alloc(null, size, fill, encoding); }; function allocUnsafe(that, size) { assertSize(size); that = createBuffer(that, size < 0 ? 0 : checked(size) | 0); if (!Buffer.TYPED_ARRAY_SUPPORT) { for (var i = 0; i < size; ++i) { that[i] = 0; } } return that; } /** * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. * */ Buffer.allocUnsafe = function (size) { return allocUnsafe(null, size); }; /** * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ Buffer.allocUnsafeSlow = function (size) { return allocUnsafe(null, size); }; function fromString(that, string, encoding) { if (typeof encoding !== 'string' || encoding === '') { encoding = 'utf8'; } if (!Buffer.isEncoding(encoding)) { throw new TypeError('"encoding" must be a valid string encoding'); } var length = byteLength(string, encoding) | 0; that = createBuffer(that, length); var actual = that.write(string, encoding); if (actual !== length) { // Writing a hex string, for example, that contains invalid characters will // cause everything after the first invalid character to be ignored. (e.g. // 'abxxcd' will be treated as 'ab') that = that.slice(0, actual); } return that; } function fromArrayLike(that, array) { var length = array.length < 0 ? 0 : checked(array.length) | 0; that = createBuffer(that, length); for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255; } return that; } function fromArrayBuffer(that, array, byteOffset, length) { array.byteLength; // this throws if `array` is not a valid ArrayBuffer if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('\'offset\' is out of bounds'); } if (array.byteLength < byteOffset + (length || 0)) { throw new RangeError('\'length\' is out of bounds'); } if (byteOffset === undefined && length === undefined) { array = new Uint8Array(array); } else if (length === undefined) { array = new Uint8Array(array, byteOffset); } else { array = new Uint8Array(array, byteOffset, length); } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = array; that.__proto__ = Buffer.prototype; } else { // Fallback: Return an object instance of the Buffer class that = fromArrayLike(that, array); } return that; } function fromObject(that, obj) { if (Buffer.isBuffer(obj)) { var len = checked(obj.length) | 0; that = createBuffer(that, len); if (that.length === 0) { return that; } obj.copy(that, 0, 0, len); return that; } if (obj) { if (typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer || 'length' in obj) { if (typeof obj.length !== 'number' || isnan(obj.length)) { return createBuffer(that, 0); } return fromArrayLike(that, obj); } if (obj.type === 'Buffer' && isArray(obj.data)) { return fromArrayLike(that, obj.data); } } throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.'); } function checked(length) { // Note: cannot use `length < kMaxLength()` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= kMaxLength()) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes'); } return length | 0; } function SlowBuffer(length) { if (+length != length) { // eslint-disable-line eqeqeq length = 0; } return Buffer.alloc(+length); } Buffer.isBuffer = function isBuffer(b) { return !!(b != null && b._isBuffer); }; Buffer.compare = function compare(a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers'); } if (a === b) return 0; var x = a.length; var y = b.length; for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i]; y = b[i]; break; } } if (x < y) return -1; if (y < x) return 1; return 0; }; Buffer.isEncoding = function isEncoding(encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'latin1': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return true; default: return false; } }; Buffer.concat = function concat(list, length) { if (!isArray(list)) { throw new TypeError('"list" argument must be an Array of Buffers'); } if (list.length === 0) { return Buffer.alloc(0); } var i; if (length === undefined) { length = 0; for (i = 0; i < list.length; ++i) { length += list[i].length; } } var buffer = Buffer.allocUnsafe(length); var pos = 0; for (i = 0; i < list.length; ++i) { var buf = list[i]; if (!Buffer.isBuffer(buf)) { throw new TypeError('"list" argument must be an Array of Buffers'); } buf.copy(buffer, pos); pos += buf.length; } return buffer; }; function byteLength(string, encoding) { if (Buffer.isBuffer(string)) { return string.length; } if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { return string.byteLength; } if (typeof string !== 'string') { string = '' + string; } var len = string.length; if (len === 0) return 0; // Use a for loop to avoid recursion var loweredCase = false; for (;;) { switch (encoding) { case 'ascii': case 'latin1': case 'binary': return len; case 'utf8': case 'utf-8': case undefined: return utf8ToBytes(string).length; case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return len * 2; case 'hex': return len >>> 1; case 'base64': return base64ToBytes(string).length; default: if (loweredCase) return utf8ToBytes(string).length; // assume utf8 encoding = ('' + encoding).toLowerCase(); loweredCase = true; } } } Buffer.byteLength = byteLength; function slowToString(encoding, start, end) { var loweredCase = false; // No need to verify that "this.length <= MAX_UINT32" since it's a read-only // property of a typed array. // This behaves neither like String nor Uint8Array in that we set start/end // to their upper/lower bounds if the value passed is out of range. // undefined is handled specially as per ECMA-262 6th Edition, // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. if (start === undefined || start < 0) { start = 0; } // Return early if start > this.length. Done here to prevent potential uint32 // coercion fail below. if (start > this.length) { return ''; } if (end === undefined || end > this.length) { end = this.length; } if (end <= 0) { return ''; } // Force coersion to uint32. This will also coerce falsey/NaN values to 0. end >>>= 0; start >>>= 0; if (end <= start) { return ''; } if (!encoding) encoding = 'utf8'; while (true) { switch (encoding) { case 'hex': return hexSlice(this, start, end); case 'utf8': case 'utf-8': return utf8Slice(this, start, end); case 'ascii': return asciiSlice(this, start, end); case 'latin1': case 'binary': return latin1Slice(this, start, end); case 'base64': return base64Slice(this, start, end); case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return utf16leSlice(this, start, end); default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding); encoding = (encoding + '').toLowerCase(); loweredCase = true; } } } // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect // Buffer instances. Buffer.prototype._isBuffer = true; function swap(b, n, m) { var i = b[n]; b[n] = b[m]; b[m] = i; } Buffer.prototype.swap16 = function swap16() { var len = this.length; if (len % 2 !== 0) { throw new RangeError('Buffer size must be a multiple of 16-bits'); } for (var i = 0; i < len; i += 2) { swap(this, i, i + 1); } return this; }; Buffer.prototype.swap32 = function swap32() { var len = this.length; if (len % 4 !== 0) { throw new RangeError('Buffer size must be a multiple of 32-bits'); } for (var i = 0; i < len; i += 4) { swap(this, i, i + 3); swap(this, i + 1, i + 2); } return this; }; Buffer.prototype.swap64 = function swap64() { var len = this.length; if (len % 8 !== 0) { throw new RangeError('Buffer size must be a multiple of 64-bits'); } for (var i = 0; i < len; i += 8) { swap(this, i, i + 7); swap(this, i + 1, i + 6); swap(this, i + 2, i + 5); swap(this, i + 3, i + 4); } return this; }; Buffer.prototype.toString = function toString() { var length = this.length | 0; if (length === 0) return ''; if (arguments.length === 0) return utf8Slice(this, 0, length); return slowToString.apply(this, arguments); }; Buffer.prototype.equals = function equals(b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer'); if (this === b) return true; return Buffer.compare(this, b) === 0; }; Buffer.prototype.inspect = function inspect() { var str = ''; var max = exports.INSPECT_MAX_BYTES; if (this.length > 0) { str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); if (this.length > max) str += ' ... '; } return '<Buffer ' + str + '>'; }; Buffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) { if (!Buffer.isBuffer(target)) { throw new TypeError('Argument must be a Buffer'); } if (start === undefined) { start = 0; } if (end === undefined) { end = target ? target.length : 0; } if (thisStart === undefined) { thisStart = 0; } if (thisEnd === undefined) { thisEnd = this.length; } if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { throw new RangeError('out of range index'); } if (thisStart >= thisEnd && start >= end) { return 0; } if (thisStart >= thisEnd) { return -1; } if (start >= end) { return 1; } start >>>= 0; end >>>= 0; thisStart >>>= 0; thisEnd >>>= 0; if (this === target) return 0; var x = thisEnd - thisStart; var y = end - start; var len = Math.min(x, y); var thisCopy = this.slice(thisStart, thisEnd); var targetCopy = target.slice(start, end); for (var i = 0; i < len; ++i) { if (thisCopy[i] !== targetCopy[i]) { x = thisCopy[i]; y = targetCopy[i]; break; } } if (x < y) return -1; if (y < x) return 1; return 0; }; // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, // OR the last index of `val` in `buffer` at offset <= `byteOffset`. // // Arguments: // - buffer - a Buffer to search // - val - a string, Buffer, or number // - byteOffset - an index into `buffer`; will be clamped to an int32 // - encoding - an optional encoding, relevant is val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { // Empty buffer means no match if (buffer.length === 0) return -1; // Normalize byteOffset if (typeof byteOffset === 'string') { encoding = byteOffset; byteOffset = 0; } else if (byteOffset > 0x7fffffff) { byteOffset = 0x7fffffff; } else if (byteOffset < -0x80000000) { byteOffset = -0x80000000; } byteOffset = +byteOffset; // Coerce to Number. if (isNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : buffer.length - 1; } // Normalize byteOffset: negative offsets start from the end of the buffer if (byteOffset < 0) byteOffset = buffer.length + byteOffset; if (byteOffset >= buffer.length) { if (dir) return -1;else byteOffset = buffer.length - 1; } else if (byteOffset < 0) { if (dir) byteOffset = 0;else return -1; } // Normalize val if (typeof val === 'string') { val = Buffer.from(val, encoding); } // Finally, search either indexOf (if dir is true) or lastIndexOf if (Buffer.isBuffer(val)) { // Special case: looking for empty string/buffer always fails if (val.length === 0) { return -1; } return arrayIndexOf(buffer, val, byteOffset, encoding, dir); } else if (typeof val === 'number') { val = val & 0xFF; // Search for a byte value [0-255] if (Buffer.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') { if (dir) { return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset); } else { return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset); } } return arrayIndexOf(buffer, [val], byteOffset, encoding, dir); } throw new TypeError('val must be string, number or Buffer'); } function arrayIndexOf(arr, val, byteOffset, encoding, dir) { var indexSize = 1; var arrLength = arr.length; var valLength = val.length; if (encoding !== undefined) { encoding = String(encoding).toLowerCase(); if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') { if (arr.length < 2 || val.length < 2) { return -1; } indexSize = 2; arrLength /= 2; valLength /= 2; byteOffset /= 2; } } function read(buf, i) { if (indexSize === 1) { return buf[i]; } else { return buf.readUInt16BE(i * indexSize); } } var i; if (dir) { var foundIndex = -1; for (i = byteOffset; i < arrLength; i++) { if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (foundIndex === -1) foundIndex = i; if (i - foundIndex + 1 === valLength) return foundIndex * indexSize; } else { if (foundIndex !== -1) i -= i - foundIndex; foundIndex = -1; } } } else { if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; for (i = byteOffset; i >= 0; i--) { var found = true; for (var j = 0; j < valLength; j++) { if (read(arr, i + j) !== read(val, j)) { found = false; break; } } if (found) return i; } } return -1; } Buffer.prototype.includes = function includes(val, byteOffset, encoding) { return this.indexOf(val, byteOffset, encoding) !== -1; }; Buffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encod