{"version":3,"file":"object.mjs","names":[],"sources":["../../../src/common/data/object.ts"],"sourcesContent":["import { isArray, isBinaryArray, isObject, isPrimitive, isSymbol } from './is'\n\n/** Like `.map()` for object. Return new key and value or `undefined` to delete. */\nexport function objectMap<T = any>(\n  obj: any,\n  fn: (key: string, value: any) => [key: string, value: T] | T | undefined | null,\n): Record<string, T> {\n  if (!isObject(obj))\n    return {}\n  return Object.fromEntries(\n    Object.entries(obj)\n      .map(([k, v]) => {\n        const r = fn(k, v)\n        if (isArray(r) && r.length === 2)\n          return r\n        return [k, r]\n      })\n      .filter(v => v != null),\n  )\n}\n\n/** Like `.filter()` for object. */\nexport function objectFilter<T = any>(\n  obj: any,\n  fn: (key: string, value: any) => boolean,\n): Partial<T> {\n  if (!isObject(obj))\n    return {}\n  return Object.fromEntries(Object.entries(obj).filter(([k, v]) => fn(k, v))) as any\n}\n\n/** Merge right into left object. If dispose is defined, it will be combined. Left can be a complex object i.e. a insantiated class. */\nexport function objectMergeDisposable<A extends object, B extends object>(\n  a: A,\n  b: B,\n): A & B {\n  // @ts-expect-error xxx\n  if (b.dispose && a.dispose) {\n    // @ts-expect-error xxx\n    b.dispose.add(a.dispose)\n  }\n  return Object.assign(a, b)\n}\n\n// export function objectMerge<A, B>(a: A, b: B): A & B {\n//   return Object.assign({}, a, b)\n// }\n\nexport function objectIsEmpty(obj: object) {\n  return Object.keys(obj).length <= 0\n}\n\n// https://stackoverflow.com/a/56592365/140927\nexport function objectPick<T extends object, K extends keyof T>(obj: T, ...keys: K[]) {\n  return Object.fromEntries(keys.filter(key => key in obj).map(key => [key, obj[key]])) as Pick<T, K>\n}\n\nexport function objectInclusivePick<T extends object, K extends (string | number | symbol)>(obj: T, ...keys: K[]) {\n  return Object.fromEntries(keys.map(key => [key, obj[key as unknown as keyof T]])) as { [key in K]: key extends keyof T ? T[key] : undefined }\n}\n\nexport function objectOmit<T extends object, K extends keyof T>(obj: T, ...keys: K[]) {\n  return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key as K))) as Omit<T, K>\n}\n\n/// Convert object to plain object with max depth.\nexport function objectPlain(obj: any, opt?: {\n  maxDepth?: number\n  maxDepthValue?: any\n  circleValue?: any\n  errorTrace?: boolean\n  filter?: (value: any) => boolean\n  keepAsIs?: (value: any) => boolean\n  transformer?: (value: any) => any | undefined\n}): any {\n  const {\n    maxDepth = 99,\n    circleValue,\n    maxDepthValue,\n    errorTrace = true,\n    filter = () => true,\n    keepAsIs = () => false,\n    transformer = () => undefined,\n  } = opt ?? {}\n\n  const cycle: any = []\n\n  function handleObject(obj: any, depth: number): any {\n    if (depth > maxDepth)\n      return maxDepthValue // '*** MAX DEPTH ***'\n\n    if (keepAsIs(obj))\n      return obj\n\n    if (!isPrimitive(obj)) {\n      if (cycle.includes(obj))\n        return circleValue // '*** CYCLE ***'\n      cycle.push(obj)\n    }\n\n    if (transformer) {\n      const result = transformer(obj)\n      if (result !== undefined)\n        return result\n    }\n\n    if (isSymbol(obj))\n      return String(obj)\n\n    if (isPrimitive(obj))\n      return obj\n\n    if (typeof Date !== 'undefined' && obj instanceof Date) {\n      return {\n        __class: 'Date',\n        value: obj.toISOString(),\n      }\n    }\n\n    if (typeof RegExp !== 'undefined' && obj instanceof RegExp) {\n      return {\n        __class: 'RegExp',\n        source: obj.toString(),\n      }\n    }\n\n    if (typeof Map !== 'undefined' && obj instanceof Map)\n      obj = Object.fromEntries(obj)\n\n    if (typeof Set !== 'undefined' && obj instanceof Set || isBinaryArray(obj))\n      obj = Array.from(obj as any)\n\n    if (typeof ErrorEvent !== 'undefined' && obj instanceof ErrorEvent) {\n      return {\n        __class: 'ErrorEvent',\n        message: obj.message,\n        filename: obj.filename,\n        lineno: obj.lineno,\n        colno: obj.colno,\n        error: obj.error ? handleObject(obj.error, depth + 1) : undefined,\n      }\n    }\n\n    if (typeof Event !== 'undefined' && obj instanceof Event) {\n      return {\n        __class: 'Event',\n        type: obj.type,\n        eventPhase: obj.eventPhase,\n        bubbles: obj.bubbles,\n        cancelable: obj.cancelable,\n        defaultPrevented: obj.defaultPrevented,\n        composed: obj.composed,\n        timeStamp: obj.timeStamp,\n      }\n    }\n\n    if (typeof Error !== 'undefined' && obj instanceof Error) {\n      return {\n        __class: 'Error',\n        name: obj.name,\n        message: obj.message,\n        stack: errorTrace ? obj.stack : undefined,\n        cause: (obj as any).cause ? String((obj as any).cause) : undefined,\n      }\n    }\n    // return `${obj.name || 'Error'}: ${obj.message}${errorTrace ? `\\n${obj.stack}` : ''}`\n\n    /* if (obj instanceof Element) {\n      const attrs = obj.getAttributeNames().map(name => `${name}=\"${String(obj.getAttribute(name))}\"`).join(' ')\n      return `<${[obj.tagName.toLocaleLowerCase(), ...attrs].join(' ')}}>`\n    }  */\n\n    if (Array.isArray(obj)) {\n      return obj\n        .filter(filter)\n        .map(o => handleObject(o, depth + 1))\n    }\n\n    // For class objects just dump the first level of primitives\n    const objName = obj?.constructor?.name\n    if (objName && objName !== 'Object') {\n      const nobj: any = {\n        __class: objName,\n        // __code: obj.toString ? obj.toString() : undefined,\n      }\n      for (const k in obj) {\n        if (obj && obj.hasOwnProperty(k) && isPrimitive(obj[k]))\n          nobj[k] = obj[k]\n      }\n      return nobj\n    }\n\n    // Plain objects are recursively dumped\n    const nobj: any = {}\n    for (const key in obj) {\n      const value = obj[key]\n      if (filter(value))\n        nobj[key] = handleObject(value, depth + 1)\n    }\n    return nobj\n\n    // return undefined\n  }\n\n  return handleObject(obj, 0)\n}\n"],"mappings":"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"}