export function tryJsonParse(text: string): T | undefined { try { return JSON.parse(text) as T } catch { // ignore } } export function shallowClone(object: T): T & Record { return { ...object } as T & Record } export function objectHasValue(object: T, value: unknown): value is T[keyof T] { return Object.keys(object).some((key) => object[key] === value) } export function isEmptyObject(object: object) { return Object.keys(object).length === 0 } export function mapValues(object: { [key: string]: A }, fn: (arg: A) => B) { const newObject: { [key: string]: B } = {} for (const key of Object.keys(object)) { newObject[key] = fn(object[key]) } return newObject }