UNPKG

@voiceflow/common

Version:

Junk drawer of utility functions

85 lines (84 loc) 2.71 kB
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, });