stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
50 lines • 1.93 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.resolveTokensTopologically = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var isPlainObject = value => {
return typeof value === 'object' && value !== null && value.constructor === Object;
};
var resolveTokensTopologically = dictionary => {
var resolvedMemo = new Map();
var visiting = new Set();
var resolveValueDeep = value => {
if (typeof value === 'string' && value.startsWith('$')) {
return dfs(value.slice(1), value);
}
if (Array.isArray(value)) return value.map(resolveValueDeep);
if (isPlainObject(value)) {
var out = {};
for (var _i = 0, _Object$entries = Object.entries(value); _i < _Object$entries.length; _i++) {
var _ref = _Object$entries[_i];
var _ref2 = (0, _slicedToArray2.default)(_ref, 2);
var k = _ref2[0];
var v = _ref2[1];
out[k] = resolveValueDeep(v);
}
return out;
}
return value;
};
var dfs = (tokenKeyOrPath, originalRef) => {
var cacheKey = tokenKeyOrPath;
if (resolvedMemo.has(cacheKey)) return resolvedMemo.get(cacheKey);
if (visiting.has(cacheKey)) {
throw new Error(`Cycle detected while topo-evaluating "${originalRef}" (at "${cacheKey}")`);
}
visiting.add(cacheKey);
var raw = dictionary[tokenKeyOrPath];
if (raw === undefined) {
throw new Error(`Unresolved reference: "${originalRef}" (missing "${tokenKeyOrPath}")`);
}
var fullyResolved = resolveValueDeep(raw);
resolvedMemo.set(cacheKey, fullyResolved);
visiting.delete(cacheKey);
return fullyResolved;
};
return resolveValueDeep(dictionary);
};
exports.resolveTokensTopologically = resolveTokensTopologically;
//# sourceMappingURL=topologicalResolution.js.map