import { PipelineHandler, WorkflowArguments } from "./pipe" import { isObject } from "@medusajs/utils" /** * Pipe utils that merges data from an object into a new object. * The new object will have a target key with the merged data from the keys if specified. * @param keys * @param target */ export function mergeData< T extends Record = Record, TKeys extends keyof T = keyof T, Target extends "payload" | string = string >(keys: TKeys[] = [], target?: Target): PipelineHandler { return async function ({ data }: WorkflowArguments) { const workingKeys = (keys.length ? keys : Object.keys(data)) as TKeys[] const value = workingKeys.reduce((acc, key) => { let targetAcc = { ...(target ? acc[target as string] : acc) } targetAcc ??= {} if (Array.isArray(data[key as string])) { targetAcc[key as string] = data[key as string] } else if (isObject(data[key as string])) { targetAcc = { ...targetAcc, ...(data[key as string] as object), } } else { targetAcc[key as string] = data[key as string] } if (target) { acc[target as string] = { ...acc[target as string], ...targetAcc, } } else { acc = targetAcc } return acc }, {}) return { alias: target, value: target ? value[target as string] : value, } } }