UNPKG

@tencentcloud/call-uikit-vue

Version:

An Open-source Voice & Video Calling UI Component Based on Tencent Cloud Service.

78 lines (70 loc) 2.04 kB
const MAX_MEMOIZE_SIZE = 500; function memoize(func, resolver) { // eslint-disable-next-line eqeqeq if (typeof func !== 'function' || (resolver != null && typeof resolver !== 'function')) { throw new TypeError('Expected a function'); } const memoized = function (...args) { const key = resolver ? resolver.apply(this, args) : args[0]; const cache = memoized.cache; if (cache.has(key)) { return cache.get(key); } const result = func.apply(this, args); memoized.cache = cache.set(key, result) || cache; return result; }; memoized.cache = new (memoize.Cache || Map)(); return memoized; } memoize.Cache = Map; function memoizeCapped(func) { const result = memoize(func, (key) => { const { cache } = result; if (cache.size === MAX_MEMOIZE_SIZE) { cache.clear(); } return key; }); return result; } const charCodeOfDot = '.'.charCodeAt(0); const reEscapeChar = /\\(\\)?/g; const rePropName = RegExp( // Match anything that isn't a dot or bracket. '[^.[\\]]+' + '|' + // Or match property names within brackets. '\\[(?:' + // Match a non-string expression. '([^"\'][^[]*)' + '|' + // Or match strings (supports escaping characters). '(["\'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2' + ')\\]' + '|' + // Or match "" as the space between consecutive dots or empty brackets. '(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))' , 'g'); /** * Converts `string` to a property path array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the property path array. */ const stringToPath = memoizeCapped((string) => { const result = []; if (string.charCodeAt(0) === charCodeOfDot) { result.push(''); } string.replace(rePropName, (match, expression, quote, subString) => { let key = match; if (quote) { key = subString.replace(reEscapeChar, '$1'); } else if (expression) { key = expression.trim(); } result.push(key); }); return result; }); export default stringToPath;