@dsottimano/trendspy-js
Version:
ALPHA VERSION: JavaScript port of trendspy - A library for analyzing Google Trends data
237 lines (224 loc) • 7.85 kB
JavaScript
;
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;