{"version":3,"file":"index.modern.mjs","sources":["../src/index.ts"],"sourcesContent":["export type isDefaultableValueInputType = {\n  defaultableValue: boolean;\n  key: PropertyKey;\n  value: unknown;\n};\n\nexport type isDefaultableValueType = ({\n  defaultableValue,\n  key,\n  value,\n}: isDefaultableValueInputType) => boolean;\n\nexport type Config = {\n  isDefaultableValue?: isDefaultableValueType;\n  mergeArrays?: boolean;\n};\n\nlet config: Config = {};\n\nexport function setConfig(newConfig: Config): void {\n  config = newConfig;\n}\n\nexport function defaultComposer<T>(...args: Partial<T>[]): T {\n  return args.reduce(compose, args[0]) as T;\n}\n\nfunction compose<T>(defaults: Partial<T>, obj: Partial<T>): Partial<T> {\n  const result: Partial<T> = {};\n  const allKeys = new Set([defaults, obj].flatMap(getAllKeys));\n\n  for (let key of allKeys) {\n    const defaultsValue = defaults[key];\n    const originalObjectValue = hasOwn(obj, key) ? obj[key] : undefined;\n    const hasDefault = hasOwn(defaults, key);\n    const checkOptions = { key, value: originalObjectValue };\n    const defaultableValue = checkDefaultableValue(checkOptions);\n    const defaultableValueFromConfig =\n      config.isDefaultableValue?.({ ...checkOptions, defaultableValue }) ??\n      defaultableValue;\n\n    const shouldTakeDefault = hasDefault && defaultableValueFromConfig;\n\n    if (\n      shouldTakeDefault &&\n      config.mergeArrays &&\n      Array.isArray(defaultsValue) &&\n      Array.isArray(originalObjectValue)\n    ) {\n      if (!defaultsValue.some(isObject)) {\n        result[key] = [...new Set([...defaultsValue, ...originalObjectValue])];\n        continue;\n      }\n\n      const maxLength = Math.max(\n        defaultsValue.length,\n        originalObjectValue.length,\n      );\n      const setOfObjects = new Set();\n\n      for (let i = 0; i < maxLength; i++) {\n        setOfObjects.add(compose(defaultsValue[i] ?? {}, originalObjectValue[i] ?? {}));\n      }\n\n      result[key] = [...setOfObjects];\n\n      continue;\n    }\n\n    if (shouldTakeDefault) {\n      result[key] = defaultsValue;\n      continue;\n    }\n\n    if (isObject(defaultsValue) && isObject(originalObjectValue)) {\n      result[key] = compose(defaultsValue, originalObjectValue);\n      continue;\n    }\n\n    result[key] = originalObjectValue;\n  }\n\n  return result;\n}\n\nfunction isObject(value: any): boolean {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    value.constructor === Object &&\n    !Array.isArray(value)\n  );\n}\n\nfunction isEmptyObjectOrArray<T>(object: T): boolean {\n  if (typeof object !== \"object\" || object === null || object instanceof Date)\n    return false;\n  return getAllKeys(object).length === 0;\n}\n\nfunction checkDefaultableValue({ value }: { value: unknown }): boolean {\n  return (\n    value === undefined ||\n    value === \"\" ||\n    value === null ||\n    isEmptyObjectOrArray(value) ||\n    (Boolean(config.mergeArrays) && Array.isArray(value))\n  );\n}\n\nfunction hasOwn<T extends PropertyKey>(\n  obj: Partial<Record<T, unknown>>,\n  key: unknown,\n): key is T {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction getAllKeys(object: {}): PropertyKey[] {\n  return [\n    ...Object.keys(object),\n    ...Object.getOwnPropertySymbols(object).filter(\n      (key) => Object.getOwnPropertyDescriptor(object, key)?.enumerable,\n    ),\n  ];\n}\n"],"names":["config","setConfig","newConfig","defaultComposer","args","reduce","compose","defaults","obj","result","allKeys","Set","flatMap","getAllKeys","key","_config$isDefaultable","defaultsValue","originalObjectValue","hasOwn","undefined","hasDefault","checkOptions","value","defaultableValue","checkDefaultableValue","defaultableValueFromConfig","isDefaultableValue","_extends","shouldTakeDefault","mergeArrays","Array","isArray","some","isObject","maxLength","Math","max","length","setOfObjects","i","_defaultsValue$i","_originalObjectValue$","add","constructor","Object","object","Date","Boolean","prototype","hasOwnProperty","call","keys","getOwnPropertySymbols","filter","_Object$getOwnPropert","getOwnPropertyDescriptor","enumerable"],"mappings":"oOAiBA,IAAIA,EAAiB,CAAE,EAEjB,SAAUC,EAAUC,GACxBF,EAASE,CACX,CAEgB,SAAAC,KAAsBC,GACpC,OAAOA,EAAKC,OAAOC,EAASF,EAAK,GACnC,CAEA,SAASE,EAAWC,EAAsBC,GACxC,MAAMC,EAAqB,CAAA,EACrBC,EAAU,IAAIC,IAAI,CAACJ,EAAUC,GAAKI,QAAQC,IAEhD,IAAK,IAAIC,KAAOJ,EAAS,CAAA,IAAAK,EACvB,MAAMC,EAAgBT,EAASO,GACzBG,EAAsBC,EAAOV,EAAKM,GAAON,EAAIM,QAAOK,EACpDC,EAAaF,EAAOX,EAAUO,GAC9BO,EAAe,CAAEP,MAAKQ,MAAOL,GAC7BM,EAAmBC,EAAsBH,GACzCI,EAC8D,OADpCV,EAC9Bf,MAAAA,EAAO0B,wBAAP1B,EAAAA,EAAO0B,mBAAkBC,EAAA,CAAA,EAAQN,EAAY,CAAEE,uBAAmBR,EAClEQ,EAEIK,EAAoBR,GAAcK,EAExC,GACEG,GACA5B,EAAO6B,aACPC,MAAMC,QAAQf,IACdc,MAAMC,QAAQd,GAJhB,CAME,IAAKD,EAAcgB,KAAKC,GAAW,CACjCxB,EAAOK,GAAO,IAAI,IAAIH,IAAI,IAAIK,KAAkBC,KAChD,QACD,CAED,MAAMiB,EAAYC,KAAKC,IACrBpB,EAAcqB,OACdpB,EAAoBoB,QAEhBC,EAAe,IAAI3B,IAEzB,IAAK,IAAI4B,EAAI,EAAGA,EAAIL,EAAWK,IAAK,CAAAC,IAAAA,EAAAC,EAClCH,EAAaI,IAAIpC,EAAwBkC,OAAjBA,EAACxB,EAAcuB,IAAEC,EAAI,GAA0B,OAAxBC,EAAExB,EAAoBsB,IAAEE,EAAI,CAAA,GAC5E,CAEDhC,EAAOK,GAAO,IAAIwB,EAGnB,MAGC7B,EAAOK,GADLc,EACYZ,EAIZiB,EAASjB,IAAkBiB,EAAShB,GACxBX,EAAQU,EAAeC,GAIzBA,CACf,CAED,OAAOR,CACT,CAEA,SAASwB,EAASX,GAChB,MACmB,iBAAVA,GACG,OAAVA,GACAA,EAAMqB,cAAgBC,SACrBd,MAAMC,QAAQT,EAEnB,CAQA,SAASE,GAAsBF,MAAEA,IAC/B,YACYH,IAAVG,GACU,KAAVA,GACU,OAAVA,KAToB,iBADSuB,EAWRvB,IAVsB,OAAXuB,GAAmBA,aAAkBC,OAElC,IAA9BjC,EAAWgC,GAAQR,QASvBU,QAAQ/C,EAAO6B,cAAgBC,MAAMC,QAAQT,GAZlD,IAAiCuB,CAcjC,CAEA,SAAS3B,EACPV,EACAM,GAEA,OAAO8B,OAAOI,UAAUC,eAAeC,KAAK1C,EAAKM,EACnD,CAEA,SAASD,EAAWgC,GAClB,MAAO,IACFD,OAAOO,KAAKN,MACZD,OAAOQ,sBAAsBP,GAAQQ,OACrCvC,IAAGwC,IAAAA,EAAAA,OAAKA,OAALA,EAAKV,OAAOW,yBAAyBV,EAAQ/B,SAAxCwC,EAAAA,EAA8CE,aAG7D"}