UNPKG

@dsottimano/trendspy-js

Version:

ALPHA VERSION: JavaScript port of trendspy - A library for analyzing Google Trends data

237 lines (224 loc) 7.85 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var _require = require('luxon'), DateTime = _require.DateTime; var TrendsDataConverter = /*#__PURE__*/function () { function TrendsDataConverter() { _classCallCheck(this, TrendsDataConverter); } return _createClass(TrendsDataConverter, null, [{ key: "interestOverTime", value: /** * Convert interest over time data to structured format * @param {Object} data Raw API response data * @param {string[]} keywords Keywords used in the request * @returns {Object} Processed data */ function interestOverTime(data, keywords) { if (!data || !data["default"] || !data["default"].timelineData) { return {}; } var timelineData = data["default"].timelineData; var result = { timestamps: [], values: {} }; // Initialize arrays for each keyword keywords.forEach(function (keyword) { result.values[keyword] = []; }); // Process timeline data timelineData.forEach(function (point) { result.timestamps.push(point.time * 1000); // Convert to milliseconds point.value.forEach(function (value, index) { var keyword = keywords[index]; result.values[keyword].push(value); }); }); return result; } /** * Convert related queries data to structured format * @param {Object} data Raw API response data * @returns {Object} Processed data with 'top' and 'rising' queries */ }, { key: "relatedQueries", value: function relatedQueries(data) { if (!data || !data["default"]) { return { top: [], rising: [] }; } var rankedList = data["default"].rankedList; if (!Array.isArray(rankedList) || rankedList.length === 0) { return { top: [], rising: [] }; } var result = { top: [], rising: [] }; // Process top queries if (rankedList[0] && rankedList[0].rankedKeyword) { result.top = rankedList[0].rankedKeyword.map(function (item) { return { query: item.query, value: item.value }; }); } // Process rising queries if (rankedList[1] && rankedList[1].rankedKeyword) { result.rising = rankedList[1].rankedKeyword.map(function (item) { return { query: item.query, value: item.value }; }); } return result; } /** * Convert geographical interest data to structured format * @param {Object} data Raw API response data * @param {Array} bullets Metadata about the request * @returns {Object} Processed geographical data */ }, { key: "geoData", value: function geoData(data, bullets) { if (!data || !data["default"] || !data["default"].geoMapData) { return {}; } var result = { regions: [], values: {} }; // Initialize arrays for each keyword bullets.forEach(function (bullet) { result.values[bullet.text] = []; }); // Process geographical data data["default"].geoMapData.forEach(function (region) { result.regions.push(region.geoCode); region.value.forEach(function (value, index) { var keyword = bullets[index].text; result.values[keyword].push(value); }); }); return result; } /** * Convert suggestions data to structured format * @param {Object} data Raw API response data * @returns {Array} Processed suggestions */ }, { key: "suggestions", value: function suggestions(data) { if (!data || !data["default"] || !Array.isArray(data["default"].topics)) { return []; } return data["default"].topics.map(function (topic) { return { title: topic.title, type: topic.type, mid: topic.mid }; }); } /** * Extract bullets (metadata) from token * @param {Object} token API token containing request metadata * @returns {Array} Extracted bullets */ }, { key: "tokenToBullets", value: function tokenToBullets(token) { if (!token || !token.bullets) { return []; } return token.bullets.map(function (bullet) { return { text: bullet.text, color: bullet.color }; }); } /** * Parse RSS feed items * @param {string} xmlText Raw RSS XML content * @returns {Array} Parsed RSS items */ }, { key: "rssItems", value: function rssItems(xmlText) { // This is a simplified implementation // In a real application, you would want to use a proper XML parser var items = []; var itemRegex = /<item>([\s\S]*?)<\/item>/g; var titleRegex = /<title>(.*?)<\/title>/; var linkRegex = /<link>(.*?)<\/link>/; var pubDateRegex = /<pubDate>(.*?)<\/pubDate>/; var match; while ((match = itemRegex.exec(xmlText)) !== null) { var itemContent = match[1]; var title = titleRegex.exec(itemContent); var link = linkRegex.exec(itemContent); var pubDate = pubDateRegex.exec(itemContent); if (title && link) { items.push({ title: title[1], link: link[1], pubDate: pubDate ? pubDate[1] : null }); } } return items; } /** * Process trending now showcase timeline data * @param {Array} data Raw timeline data * @param {number} requestTimestamp Timestamp of the request * @returns {Object} Processed timeline data */ }, { key: "trendingNowShowcaseTimeline", value: function trendingNowShowcaseTimeline(data, requestTimestamp) { if (!Array.isArray(data)) { return {}; } var result = { timestamps: [], values: {} }; data.forEach(function (series) { var keyword = series[0]; result.values[keyword] = []; series[1].forEach(function (point, index) { if (index === 0) { // First point contains timestamps point.forEach(function (timestamp) { result.timestamps.push(timestamp * 1000); // Convert to milliseconds }); } else { // Subsequent points contain values result.values[keyword] = point; } }); }); return result; } }]); }(); module.exports = TrendsDataConverter;