@voiceflow/common
Version:
Junk drawer of utility functions
85 lines (84 loc) • 2.71 kB
JavaScript
import { stringify } from './functional.js';
import { hasProperty } from './object/index.js';
const createEmptyNormalized = () => ({ byKey: {}, allKeys: [] });
export const EMPTY = createEmptyNormalized();
export const defaultGetKey = (obj) => stringify(obj.id);
/**
* @deprecated prefer `normal-store`
*/
export const safeAdd = (items, obj) => (items.includes(obj) ? items : [...items, obj]);
const safeAddToStart = (items, obj) => (items.includes(obj) ? items : [obj, ...items]);
export const getByIndex = (items) => (_, index) => items[index];
export const getByKey = (lookup) => (key) => lookup[key];
export const buildLookup = (allKeys, getValue) => allKeys.reduce((acc, key, index) => {
acc[key] = getValue(key, index);
return acc;
}, {});
/**
* @deprecated prefer `normal-store`
*/
export const normalize = (items, getKey) => {
const allKeys = items.map(getKey ?? defaultGetKey);
return {
byKey: buildLookup(allKeys, getByIndex(items)),
allKeys,
};
};
/**
* @deprecated prefer `normal-store`
*/
export const denormalize = ({ allKeys, byKey }) => allKeys.map((key) => byKey[key]);
/**
* @deprecated prefer `normal-store`
*/
export const getNormalizedByKey = ({ byKey }, key) => byKey[key];
/**
* @deprecated prefer `normal-store`
*/
export const safeGetNormalizedByKey = ({ byKey }, key) => hasProperty(byKey, key) ? byKey[key] : null;
/**
* @deprecated prefer `normal-store`
*/
export const getAllNormalizedByKeys = ({ byKey }, keys) => keys.map((key) => byKey[key]);
/**
* @deprecated prefer `normal-store`
*/
export const updateNormalizedByKey = ({ byKey, ...rest }, key, obj) => ({
...rest,
byKey: { ...byKey, [key]: obj },
});
/**
* @deprecated prefer `normal-store`
*/
export const addNormalizedByKey = (normalized, key, obj) => ({
...updateNormalizedByKey(normalized, key, obj),
allKeys: safeAdd(normalized.allKeys, key),
});
/**
* @deprecated prefer `normal-store`
*/
export const addToStartNormalizedByKey = (normalized, key, obj) => ({
...updateNormalizedByKey(normalized, key, obj),
allKeys: safeAddToStart(normalized.allKeys, key),
});
/**
* @deprecated prefer `normal-store`
*/
export const addAllNormalizedByKeys = (normalized, objs, getKey) => {
const keyGetter = getKey ?? defaultGetKey;
const keys = objs.map(keyGetter);
return {
byKey: {
...normalized.byKey,
...objs.reduce((acc, obj) => Object.assign(acc, { [keyGetter(obj)]: obj }), {}),
},
allKeys: keys.reduce(safeAdd, normalized.allKeys),
};
};
/**
* @deprecated prefer `normal-store`
*/
export const reorderKeys = (newKeyArray, byKey) => ({
allKeys: newKeyArray,
byKey,
});