UNPKG

mattermost-redux

Version:

Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client

109 lines (108 loc) 4.78 kB
"use strict"; // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.isMinimumServerVersion = exports.createShallowSelector = exports.createIdsSelector = void 0; exports.memoizeResult = memoizeResult; exports.generateId = generateId; exports.isEmail = isEmail; exports.getInputTypeFromValueType = getInputTypeFromValueType; const shallow_equals_1 = __importDefault(require("shallow-equals")); const create_selector_1 = require("mattermost-redux/selectors/create_selector"); // eslint-disable-next-line @typescript-eslint/ban-types function memoizeResult(func, measure = undefined) { let lastArgs = null; let lastResult = null; // we reference arguments instead of spreading them for performance reasons return function memoizedFunc() { if (!(0, shallow_equals_1.default)(lastArgs, arguments)) { //eslint-disable-line prefer-rest-params //eslint-disable-line prefer-rest-params // apply arguments instead of spreading for performance. const result = Reflect.apply(func, null, arguments); //eslint-disable-line prefer-rest-params if (!(0, shallow_equals_1.default)(lastResult, result)) { lastResult = result; } } if (measure) { measure(); } lastArgs = arguments; //eslint-disable-line prefer-rest-params return lastResult; }; } // Use this selector when you want a shallow comparison of the arguments and you want to memoize the result // try and use this only when your selector returns an array of ids exports.createIdsSelector = (0, create_selector_1.createSelectorCreator)(memoizeResult); // Use this selector when you want a shallow comparison of the arguments and you don't need to memoize the result exports.createShallowSelector = (0, create_selector_1.createSelectorCreator)(create_selector_1.defaultMemoize, shallow_equals_1.default); // isMinimumServerVersion will return true if currentVersion is equal to higher or than the // the provided minimum version. A non-equal major version will ignore minor and dot // versions, and a non-equal minor version will ignore dot version. // currentVersion is a string, e.g '4.6.0' // minMajorVersion, minMinorVersion, minDotVersion are integers const isMinimumServerVersion = (currentVersion, minMajorVersion = 0, minMinorVersion = 0, minDotVersion = 0) => { if (!currentVersion || typeof currentVersion !== 'string') { return false; } const split = currentVersion.split('.'); const major = parseInt(split[0], 10); const minor = parseInt(split[1] || '0', 10); const dot = parseInt(split[2] || '0', 10); if (major > minMajorVersion) { return true; } if (major < minMajorVersion) { return false; } // Major version is equal, check minor if (minor > minMinorVersion) { return true; } if (minor < minMinorVersion) { return false; } // Minor version is equal, check dot if (dot > minDotVersion) { return true; } if (dot < minDotVersion) { return false; } // Dot version is equal return true; }; exports.isMinimumServerVersion = isMinimumServerVersion; // Generates a RFC-4122 version 4 compliant globally unique identifier. function generateId() { // implementation taken from http://stackoverflow.com/a/2117523 let id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'; id = id.replace(/[xy]/g, (c) => { const r = Math.floor(Math.random() * 16); let v; if (c === 'x') { v = r; } else { // eslint-disable-next-line no-mixed-operators v = r & 0x3 | 0x8; } return v.toString(16); }); return id; } function isEmail(email) { // writing a regex to match all valid email addresses is really, really hard. (see http://stackoverflow.com/a/201378) // this regex ensures: // - at least one character that is not a space, comma, or @ symbol // - followed by a single @ symbol // - followed by at least one character that is not a space, comma, or @ symbol // this prevents <Outlook Style> outlook.style@domain.com addresses and multiple comma-separated addresses from being accepted return (/^[^ ,@]+@[^ ,@]+$/).test(email); } // maps Custom Profile Attribute value types to appropriate HTML schemes (only different for phone -> tel) function getInputTypeFromValueType(valueType) { return valueType === 'phone' ? 'tel' : String(valueType); }