utils.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. "use strict";
  2. var _RESTController = _interopRequireDefault(require("./RESTController"));
  3. function _interopRequireDefault(obj) {
  4. return obj && obj.__esModule ? obj : {
  5. default: obj
  6. };
  7. }
  8. function _wrapRegExp() {
  9. _wrapRegExp = function (re, groups) {
  10. return new BabelRegExp(re, void 0, groups);
  11. };
  12. var _super = RegExp.prototype,
  13. _groups = new WeakMap();
  14. function BabelRegExp(re, flags, groups) {
  15. var _this = new RegExp(re, flags);
  16. return _groups.set(_this, groups || _groups.get(re)), _setPrototypeOf(_this, BabelRegExp.prototype);
  17. }
  18. function buildGroups(result, re) {
  19. var g = _groups.get(re);
  20. return Object.keys(g).reduce(function (groups, name) {
  21. return groups[name] = result[g[name]], groups;
  22. }, Object.create(null));
  23. }
  24. return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (str) {
  25. var result = _super.exec.call(this, str);
  26. return result && (result.groups = buildGroups(result, this)), result;
  27. }, BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {
  28. if ("string" == typeof substitution) {
  29. var groups = _groups.get(this);
  30. return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
  31. return "$" + groups[name];
  32. }));
  33. }
  34. if ("function" == typeof substitution) {
  35. var _this = this;
  36. return _super[Symbol.replace].call(this, str, function () {
  37. var args = arguments;
  38. return "object" != typeof args[args.length - 1] && (args = [].slice.call(args)).push(buildGroups(args, _this)), substitution.apply(this, args);
  39. });
  40. }
  41. return _super[Symbol.replace].call(this, str, substitution);
  42. }, _wrapRegExp.apply(this, arguments);
  43. }
  44. function _inherits(subClass, superClass) {
  45. if (typeof superClass !== "function" && superClass !== null) {
  46. throw new TypeError("Super expression must either be null or a function");
  47. }
  48. subClass.prototype = Object.create(superClass && superClass.prototype, {
  49. constructor: {
  50. value: subClass,
  51. writable: true,
  52. configurable: true
  53. }
  54. });
  55. Object.defineProperty(subClass, "prototype", {
  56. writable: false
  57. });
  58. if (superClass) _setPrototypeOf(subClass, superClass);
  59. }
  60. function _setPrototypeOf(o, p) {
  61. _setPrototypeOf = Object.setPrototypeOf || function (o, p) {
  62. o.__proto__ = p;
  63. return o;
  64. };
  65. return _setPrototypeOf(o, p);
  66. }
  67. const DEEP_INDEX_API_HOST = 'deep-index.moralis.io';
  68. const DEEP_INDEX_SWAGGER_PATH = '/api-docs/v2/swagger.json';
  69. const TrackingEventName = Object.freeze({
  70. START_FUNCTION: 'Moralis SDK start'
  71. });
  72. const fetchSwaggerJson = async () => {
  73. const {
  74. response
  75. } = await _RESTController.default.ajax('GET', `https://${DEEP_INDEX_API_HOST}${DEEP_INDEX_SWAGGER_PATH}`);
  76. return response;
  77. };
  78. const getPathByTag = swaggerJSON => {
  79. const pathByTag = {};
  80. const pathDetails = {};
  81. Object.entries(swaggerJSON.paths).map(([pathName, requestData]) => {
  82. return Object.entries(requestData).forEach(([method, data]) => {
  83. const {
  84. tags
  85. } = data;
  86. if (tags.length > 0) {
  87. if (!pathByTag[tags[0]]) {
  88. pathByTag[tags[0]] = [];
  89. }
  90. pathByTag[tags[0]].push(data.operationId);
  91. pathDetails[data.operationId] = {
  92. method,
  93. pathName,
  94. data
  95. };
  96. }
  97. });
  98. });
  99. return {
  100. pathByTag,
  101. pathDetails
  102. };
  103. };
  104. const fetchEndpoints = async () => {
  105. const swaggerJSON = await fetchSwaggerJson();
  106. const {
  107. pathDetails
  108. } = await getPathByTag(swaggerJSON);
  109. const data = [];
  110. Object.keys(pathDetails).forEach(x => {
  111. const item = pathDetails[x];
  112. const endpoint = {
  113. method: item.method.toUpperCase(),
  114. group: item.data.tags[0],
  115. name: x,
  116. url: item.pathName.split('{').join(':').split('}').join('')
  117. };
  118. data.push(endpoint);
  119. });
  120. return data;
  121. };
  122. /**
  123. * Compares if the semantic version of version1 is larger than version2
  124. */
  125. const isSemanticVersionLarger = (version1, version2) => {
  126. const [version1Main, version1Pre] = version1.split('-');
  127. const version1Arr = version1Main.split('.').map(s => Number(s));
  128. const [version2Main, version2Pre] = version2.split('-');
  129. const version2Arr = version2Main.split('.').map(s => Number(s));
  130. for (let index = 0; index < 3; index++) {
  131. const compare1 = version1Arr[index];
  132. const compare2 = version2Arr[index];
  133. if (compare1 > compare2) return true;
  134. if (compare1 < compare2) return false;
  135. if (!Number.isNaN(compare1) && Number.isNaN(compare2)) return true;
  136. if (Number.isNaN(compare1) && !Number.isNaN(compare2)) return false;
  137. } // Compare pre-releasees if main versions are the same
  138. if (version1Pre && version2Pre) {
  139. var _version1Pre$split$, _version2Pre$split$;
  140. const version1PreNumber = (_version1Pre$split$ = version1Pre.split('.')[1]) !== null && _version1Pre$split$ !== void 0 ? _version1Pre$split$ : 0;
  141. const version2PreNumber = (_version2Pre$split$ = version2Pre.split('.')[1]) !== null && _version2Pre$split$ !== void 0 ? _version2Pre$split$ : 0;
  142. return version1PreNumber > version2PreNumber;
  143. } // If version2 is a pre-release and version1 is not, then version 1 is newer
  144. if (version2Pre) {
  145. return true;
  146. }
  147. return false;
  148. };
  149. const checkForSdkUpdates = async () => {
  150. try {
  151. const {
  152. response
  153. } = await _RESTController.default.ajax('GET', 'https://www.unpkg.com/moralis/package.json');
  154. const latestVersion = response.version;
  155. if (isSemanticVersionLarger(latestVersion, "1.5.9")) // eslint-disable-next-line no-console
  156. console.warn(`You are not using the latest version of the SDK. Please update it as soon as possible to enjoy the newest features. Most recent version: ${latestVersion}`);
  157. } catch (error) {// Cannot verify version, might be network error etc. We don't bother showing anything in that case
  158. }
  159. };
  160. const trackEvent = async (name, subdomain, options) => {
  161. try {
  162. const {
  163. response
  164. } = await _RESTController.default.ajax('POST', 'https://internal-api.moralis.io/api/functions/trackEvent', JSON.stringify({
  165. subdomain,
  166. event: name,
  167. options
  168. }), {
  169. Accept: 'application/json',
  170. 'Content-Type': 'application/json'
  171. });
  172. return response.result;
  173. } catch (error) {//
  174. }
  175. };
  176. /**
  177. * Regex to validate serverUrl, for example: https://xxxxxxxxxxxx.yyyyyyyyyy.zzzzzz:1234/server
  178. * It's very generous and doesn't assume the value of domain, subdomain and port, it only checks if we can extract
  179. * a subddomain
  180. */
  181. const validServerUrlRegex = /*#__PURE__*/_wrapRegExp(/^https?:\/\/([0-9A-Z_a-z]+\.[0-9A-Z_a-z]+\.[0-9A-Z_a-z]+)(:[0-9]{4})?\/server\/?$/, {
  182. subdomain: 1
  183. });
  184. const validateServerUrl = serverUrl => {
  185. return validServerUrlRegex.test(serverUrl);
  186. };
  187. const getSubdomain = serverUrl => {
  188. var _match$groups$subdoma, _match$groups;
  189. const isValidServerUrl = validateServerUrl(serverUrl);
  190. if (!isValidServerUrl) {
  191. return null;
  192. }
  193. const match = validServerUrlRegex.exec(serverUrl);
  194. return (_match$groups$subdoma = match === null || match === void 0 ? void 0 : (_match$groups = match.groups) === null || _match$groups === void 0 ? void 0 : _match$groups.subdomain) !== null && _match$groups$subdoma !== void 0 ? _match$groups$subdoma : null;
  195. };
  196. module.exports = {
  197. fetchSwaggerJson,
  198. getPathByTag,
  199. fetchEndpoints,
  200. checkForSdkUpdates,
  201. trackEvent,
  202. TrackingEventName,
  203. getSubdomain
  204. };