Files
hoppscotch/packages/hoppscotch-app/helpers/functional/object.ts
2022-05-03 17:54:47 +05:30

64 lines
1.7 KiB
TypeScript

import { pipe } from "fp-ts/function"
import cloneDeep from "lodash/cloneDeep"
import isEqual from "lodash/isEqual"
import { JSPrimitive, TypeFromPrimitive } from "./primtive"
export const objRemoveKey =
<T, K extends keyof T>(key: K) =>
(obj: T): Omit<T, K> =>
pipe(cloneDeep(obj), (e) => {
delete e[key]
return e
})
export const objFieldMatches =
<T, K extends keyof T, V extends T[K]>(
fieldName: K,
matches: ReadonlyArray<V>
) =>
// eslint-disable-next-line no-unused-vars
(obj: T): obj is T & { [_ in K]: V } =>
matches.findIndex((x) => isEqual(obj[fieldName], x)) !== -1
export const objHasProperty =
<O extends object, K extends string, P extends JSPrimitive | undefined>(
prop: K,
type?: P
) =>
// eslint-disable-next-line
(obj: O): obj is O & { [_ in K]: TypeFromPrimitive<P> } =>
// eslint-disable-next-line
prop in obj && (type === undefined || typeof (obj as any)[prop] === type)
type TypeFromPrimitiveArray<P extends JSPrimitive | undefined> =
P extends "undefined"
? undefined
: P extends "object"
? object[] | null
: P extends "boolean"
? boolean[]
: P extends "number"
? number[]
: P extends "bigint"
? BigInt[]
: P extends "string"
? string[]
: P extends "symbol"
? Symbol[]
: P extends "function"
? Function[]
: unknown[]
export const objHasArrayProperty =
<O extends object, K extends string, P extends JSPrimitive>(
prop: K,
type: P
) =>
// eslint-disable-next-line
(obj: O): obj is O & { [_ in K]: TypeFromPrimitiveArray<P> } =>
prop in obj &&
Array.isArray((obj as any)[prop]) &&
(obj as any)[prop].every(
(val: unknown) => typeof val === type // eslint-disable-line
)