{"version":3,"file":"data-pipe.mjs","sources":["../../src/types.ts","../../src/utils/helpers.ts","../../src/utils/dsv-parser.ts","../../src/string/stringUtils.ts","../../src/utils/json-parser.ts","../../src/utils/table.ts","../../src/_internals.ts","../../src/array/utils.ts","../../src/array/stats.ts","../../src/array/joins.ts","../../src/array/transform.ts","../../src/data-pipe.ts","../../src/index.ts"],"sourcesContent":["export type Predicate<T = any> = (p: T) => boolean;\r\nexport type Selector<T = any, V = any> = (p: T) => V;\r\nexport class ParsingOptions {\r\n  delimiter = ',';\r\n  skipRows = 0;\r\n  keepOriginalHeaders = false;\r\n  textFields: string[] = [];\r\n  dateFields: (string | string[])[] = [];\r\n  numberFields: string[] = [];\r\n  booleanFields: string[] = [];\r\n  skipUntil?: (tokens: string[]) => boolean;\r\n  takeWhile?: (tokens: string[]) => boolean;\r\n  parseFields?: {};\r\n  elementSelector?: (fieldDescriptions: FieldDescription[], tokens: string[]) => any;\r\n}\r\n\r\nexport type PrimitiveType = string | number | bigint | boolean | null;\r\n\r\n/**\r\n * ScalarType represent a single value types what includes Date and can be null\r\n */\r\nexport type ScalarType = PrimitiveType | Date;\r\n\r\n/**\r\n * Scalar object is a simple object where key is always string and value could be a ScalarType only\r\n * Scalar type includes Date object\r\n */\r\nexport type ScalarObject = Record<string, ScalarType>;\r\n\r\n/**\r\n * PrimitivesObject is a simple object where key is a string and value can be Primitive\r\n * This object can be transfered with REST call. Doesn'r have a Date\r\n */\r\nexport type PrimitivesObject = Record<string, PrimitiveType>;\r\n\r\n/**\r\n * Commonly used and recognized types\r\n */\r\nexport enum DataTypeName {\r\n  String = 'String',\r\n  LargeString = 'LargeString',\r\n  WholeNumber = 'WholeNumber',\r\n  BigIntNumber = 'BigIntNumber',\r\n  FloatNumber = 'FloatNumber',\r\n  DateTime = 'DateTime',\r\n  Date = 'Date',\r\n  Boolean = 'Boolean'\r\n}\r\n\r\nexport interface Table<T> {\r\n  fieldDataTypes?: DataTypeName[];\r\n  fieldNames: string[];\r\n  rows: T[][];\r\n}\r\n\r\n/**\r\n * A simple data table structure what provides a most efficient way\r\n * to send data across the wire\r\n */\r\nexport type TableDto = Table<PrimitiveType>;\r\n\r\nexport type ScallarTable = Table<ScalarType>;\r\n\r\nexport interface StringsDataTable extends Table<string> {\r\n  fieldDescriptions: FieldDescription[];\r\n}\r\n\r\nexport interface FieldDescription {\r\n  index: number;\r\n  fieldName: string;\r\n  isNullable: boolean;\r\n  isUnique: boolean;\r\n  isObject: boolean;\r\n  maxSize?: number;\r\n  dataTypeName?: DataTypeName;\r\n}\r\n","import { Selector, FieldDescription, DataTypeName, ScalarType, PrimitiveType } from '../types';\r\n\r\n/**\r\n * Formats selected value to number.\r\n * @private\r\n * @param val Primitive or object.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function parseNumber(val: ScalarType, elementSelector?: Selector): number | undefined {\r\n  if (elementSelector && typeof elementSelector === 'function') {\r\n    val = elementSelector(val);\r\n  }\r\n  if (val instanceof Date) {\r\n    return val.getTime();\r\n  }\r\n  switch (typeof val) {\r\n    case 'string': {\r\n      const fV = parseFloat(val);\r\n      if (!isNaN(fV)) {\r\n        return fV;\r\n      }\r\n      break;\r\n    }\r\n    case 'boolean':\r\n      return Number(val);\r\n    case 'number':\r\n      return isNaN(val) ? undefined : val;\r\n  }\r\n}\r\n\r\nexport function parseNumberOrNull(value: string | number): number | null {\r\n  if (typeof value === 'number') {\r\n    return value;\r\n  }\r\n\r\n  if (!value || typeof value !== 'string') {\r\n    return null;\r\n  }\r\n\r\n  value = value.trim();\r\n\r\n  // Just to make sure string contains digits only and '.', ','. Otherwise, parseFloat can incorrectly parse into number\r\n  for (let i = value.length - 1; i >= 0; i--) {\r\n    const d = value.charCodeAt(i);\r\n    if (d < 48 || d > 57) {\r\n      // '.' - 46 ',' - 44 '-' - 45(but only first char)\r\n      if (d !== 46 && d !== 44 && (d !== 45 || i !== 0)) return null;\r\n    }\r\n  }\r\n\r\n  const res = parseFloat(value.replace(/,/g, ''));\r\n  return !isNaN(res) ? res : null;\r\n}\r\n\r\n/**\r\n * More wider datetime parser\r\n * @param value\r\n */\r\nexport function parseDatetimeOrNull(\r\n  value: string | Date | number,\r\n  format: string | null = null\r\n): Date | null {\r\n  format = (format || '').toLowerCase();\r\n  if (!value) {\r\n    return null;\r\n  }\r\n  if (value instanceof Date && !isNaN(value.valueOf())) {\r\n    return value;\r\n  }\r\n\r\n  // only string values can be converted to Date\r\n  const tpOf = typeof value;\r\n  if (tpOf === 'number' || tpOf === 'bigint') {\r\n    return new Date(value);\r\n  } else if (tpOf !== 'string') {\r\n    return null;\r\n  }\r\n\r\n  value = value as string;\r\n\r\n  const strValue = String(value);\r\n  if (!strValue.length) {\r\n    return null;\r\n  }\r\n\r\n  const parseMonth = (mm: string): number => {\r\n    if (!mm || !mm.length) {\r\n      return NaN;\r\n    }\r\n\r\n    const m = parseInt(mm, 10);\r\n    if (!isNaN(m)) {\r\n      return m - 1;\r\n    }\r\n\r\n    // make sure english months are coming through\r\n    if (mm.startsWith('jan')) {\r\n      return 0;\r\n    }\r\n    if (mm.startsWith('feb')) {\r\n      return 1;\r\n    }\r\n    if (mm.startsWith('mar')) {\r\n      return 2;\r\n    }\r\n    if (mm.startsWith('apr')) {\r\n      return 3;\r\n    }\r\n    if (mm.startsWith('may')) {\r\n      return 4;\r\n    }\r\n    if (mm.startsWith('jun')) {\r\n      return 5;\r\n    }\r\n    if (mm.startsWith('jul')) {\r\n      return 6;\r\n    }\r\n    if (mm.startsWith('aug')) {\r\n      return 7;\r\n    }\r\n    if (mm.startsWith('sep')) {\r\n      return 8;\r\n    }\r\n    if (mm.startsWith('oct')) {\r\n      return 9;\r\n    }\r\n    if (mm.startsWith('nov')) {\r\n      return 10;\r\n    }\r\n    if (mm.startsWith('dec')) {\r\n      return 11;\r\n    }\r\n\r\n    return NaN;\r\n  };\r\n\r\n  const correctYear = (yy: number): number => {\r\n    if (yy < 100) {\r\n      return yy < 68 ? yy + 2000 : yy + 1900;\r\n    } else {\r\n      return yy;\r\n    }\r\n  };\r\n\r\n  const validDateOrNull = (\r\n    yyyy: number,\r\n    month: number,\r\n    day: number,\r\n    hours: number,\r\n    mins: number,\r\n    ss: number,\r\n    ms: number\r\n  ): Date | null => {\r\n    if (month > 11 || day > 31 || hours >= 60 || mins >= 60 || ss >= 60) {\r\n      return null;\r\n    }\r\n\r\n    if (ms > 1000) {\r\n      ms = parseInt(String(ms).substring(0, 3));\r\n    }\r\n    const dd = new Date(yyyy, month, day, hours, mins, ss, ms);\r\n    return !isNaN(dd.valueOf()) ? dd : null;\r\n  };\r\n\r\n  const strTokens = strValue\r\n    .replace('T', ' ')\r\n    .replace('Z', ' ')\r\n    .replace('.', ' ')\r\n    .toLowerCase()\r\n    .split(/[: /-]/);\r\n  const dt = strTokens.map(s => parseNumberOrNull(s) ?? Number.NaN);\r\n\r\n  let d: Date | null = null;\r\n\r\n  if (\r\n    format.startsWith('mm/dd/yy') ||\r\n    format.startsWith('mmm/dd/yy') ||\r\n    format.startsWith('mm-dd-yy') ||\r\n    format.startsWith('mmm-dd-yy')\r\n  ) {\r\n    // handle US format\r\n    return validDateOrNull(\r\n      correctYear(dt[2]),\r\n      parseMonth(strTokens[0]),\r\n      dt[1],\r\n      dt[3] || 0,\r\n      dt[4] || 0,\r\n      dt[5] || 0,\r\n      dt[6] || 0\r\n    );\r\n  } else if (format.startsWith('yyyymm')) {\r\n    return validDateOrNull(\r\n      parseInt(value.substring(0, 4)),\r\n      parseInt(value.substring(4, 6)) - 1,\r\n      value.length > 6 ? parseInt(value.substring(6, 8)) : 1,\r\n      0,\r\n      0,\r\n      0,\r\n      0\r\n    );\r\n  } else if (\r\n    format.startsWith('dd/mm/yy') ||\r\n    format.startsWith('dd/mmm/yy') ||\r\n    format.startsWith('dd-mm-yy') ||\r\n    format.startsWith('dd-mmm-yy')\r\n  ) {\r\n    return validDateOrNull(\r\n      correctYear(dt[2]),\r\n      parseMonth(strTokens[1]),\r\n      dt[0],\r\n      dt[3] || 0,\r\n      dt[4] || 0,\r\n      dt[5] || 0,\r\n      dt[6] || 0\r\n    );\r\n  } else if (format.startsWith('yyyy-mm')) {\r\n    return validDateOrNull(\r\n      dt[0],\r\n      parseMonth(strTokens[1]),\r\n      dt[2] || 1,\r\n      dt[3] || 0,\r\n      dt[4] || 0,\r\n      dt[5] || 0,\r\n      dt[6] || 0\r\n    );\r\n  } else if (format.length) {\r\n    throw new Error(`Unrecognized format '${format}'`);\r\n  }\r\n\r\n  // try ISO first\r\n  d = validDateOrNull(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, dt[6] || 0);\r\n  if (d) {\r\n    return d;\r\n  }\r\n\r\n  // then UK\r\n  d = validDateOrNull(\r\n    correctYear(dt[2]),\r\n    parseMonth(strTokens[1]),\r\n    dt[0],\r\n    dt[3] || 0,\r\n    dt[4] || 0,\r\n    dt[5] || 0,\r\n    dt[6] || 0\r\n  );\r\n  if (d) {\r\n    return d;\r\n  }\r\n\r\n  // we can't accept both UK and US format as it is ambiguous\r\n  // for US use format parameter e.g. MM/dd/yyyy\r\n  // // then US guess\r\n  // return validDateOrNull(\r\n  //   correctYear(dt[2]),\r\n  //   parseMonth(strTokens[0]),\r\n  //   dt[1],\r\n  //   dt[3] || 0,\r\n  //   dt[4] || 0,\r\n  //   dt[5] || 0,\r\n  //   dt[6] || 0\r\n  // );\r\n\r\n  return null;\r\n}\r\n\r\nexport function parseBooleanOrNull(val: boolean | string): boolean | null {\r\n  if (!val) {\r\n    return null;\r\n  }\r\n  if (typeof val === 'boolean') {\r\n    return val;\r\n  }\r\n\r\n  const trulyVals = ['1', 'yes', 'true', 'on'];\r\n  const falsyVals = ['0', 'no', 'false', 'off'];\r\n  const checkVal = val.toString().toLowerCase().trim();\r\n\r\n  if (trulyVals.includes(checkVal)) {\r\n    return true;\r\n  }\r\n\r\n  if (falsyVals.includes(checkVal)) {\r\n    return false;\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\nexport function addDays(dt: Date, daysOffset: number): Date {\r\n  if (!dt || !(dt instanceof Date)) {\r\n    throw new Error('First parameter must be Date');\r\n  }\r\n  dt = new Date(dt.valueOf());\r\n  dt.setDate(dt.getDate() + daysOffset);\r\n  return dt;\r\n}\r\n\r\nexport function addBusinessDays(dt: Date, bDaysOffset: number, holidays?: (Date | string)[]): Date {\r\n  const date = parseDatetimeOrNull(dt);\r\n  const holidayDates =\r\n    holidays\r\n      ?.map(d => parseDatetimeOrNull(d))\r\n      ?.filter(d => !!d)\r\n      ?.map(d => d?.toDateString()) || [];\r\n  if (!date) {\r\n    throw new Error(`A first parameter to 'addBusinessdays' must be Date`);\r\n  }\r\n  dt = new Date(date.valueOf());\r\n  dt.setDate(dt.getDate() + bDaysOffset);\r\n\r\n  // skip saturdays and sundays\r\n  if (bDaysOffset < 0) {\r\n    while (dt.getDay() === 0 || dt.getDay() === 6 || holidayDates.includes(dt.toDateString())) {\r\n      dt.setDate(dt.getDate() - 1);\r\n    }\r\n  } else {\r\n    while (dt.getDay() === 0 || dt.getDay() === 6 || holidayDates.includes(dt.toDateString())) {\r\n      dt.setDate(dt.getDate() + 1);\r\n    }\r\n  }\r\n  return dt;\r\n}\r\n\r\nexport function dateToString(d: Date, format?: string): string {\r\n  if (!(d instanceof Date)) {\r\n    throw new Error(`A first parameter to 'dateToString' must be Date`);\r\n  }\r\n\r\n  const date = new Date(d.valueOf());\r\n  date.setMinutes(date.getMinutes() - date.getTimezoneOffset());\r\n  const strDate = date.toISOString().replace('T00:00:00.000Z', '');\r\n\r\n  if (format) {\r\n    // a quick and dirty way to achive a most used formats\r\n    const t = strDate.split(/[.T:Z /-]/);\r\n    const f = {\r\n      yyyy: t[0],\r\n      yy: t[0].slice(2),\r\n      mm: t[1],\r\n      dd: t[2]\r\n    };\r\n\r\n    if (format.toLowerCase() === 'dd/mm/yyyy') {\r\n      return `${f.dd}/${f.mm}/${f.yyyy}`;\r\n    } else if (format.toLowerCase() === 'mm/dd/yyyy') {\r\n      return `${f.mm}/${f.dd}/${f.yyyy}`;\r\n    } else if (format.toLowerCase() === 'dd/mm/yy') {\r\n      return `${f.dd}/${f.mm}/${f.yy}`;\r\n    } else if (format.toLowerCase() === 'yyyymmdd') {\r\n      return `${f.yyyy}${f.mm}${f.dd}`;\r\n    } else if (format.toLowerCase() === 'mm-dd-yyyy') {\r\n      return `${f.mm}-${f.dd}-${f.yyyy}`;\r\n    } else if (format.toLowerCase() === 'mm-dd-yy') {\r\n      return `${f.mm}-${f.dd}-${f.yy}`;\r\n    } else if (format.toLowerCase() === 'dd-mm-yyyy') {\r\n      return `${f.dd}-${f.mm}-${f.yyyy}`;\r\n    } else if (format.toLowerCase() === 'yyyy-mm-dd') {\r\n      return `${f.yyyy}-${f.mm}-${f.dd}`;\r\n    } else {\r\n      throw new Error(`Unsupported format ${format}`);\r\n    }\r\n  }\r\n\r\n  return strDate;\r\n}\r\n\r\nexport function deepClone(obj: any): any {\r\n  if (obj == null || obj == undefined) {\r\n    return obj;\r\n  }\r\n\r\n  if (obj instanceof Date) {\r\n    return new Date(obj.getTime());\r\n  }\r\n\r\n  if (Array.isArray(obj)) {\r\n    return obj.map(v => deepClone(v));\r\n  }\r\n\r\n  if (typeof obj === 'object') {\r\n    const clone = {} as any;\r\n    for (const propName in obj) {\r\n      const propValue = obj[propName];\r\n\r\n      if (propValue == null || propValue == undefined) {\r\n        clone[propName] = propValue;\r\n      } else if (propValue instanceof Date) {\r\n        clone[propName] = new Date(propValue.getTime());\r\n      } else if (Array.isArray(propValue)) {\r\n        clone[propName] = propValue.map(v => deepClone(v));\r\n      } else if (typeof propValue == 'object') {\r\n        clone[propName] = deepClone(propValue);\r\n      } else {\r\n        clone[propName] = propValue;\r\n      }\r\n    }\r\n    return clone;\r\n  }\r\n\r\n  return obj;\r\n}\r\n\r\nexport function workoutDataType(\r\n  value: ScalarType,\r\n  inType: DataTypeName | undefined\r\n): DataTypeName | undefined {\r\n  function getRealType(val: ScalarType): DataTypeName {\r\n    function processNumber(num: number): DataTypeName {\r\n      if (num % 1 === 0) {\r\n        return num > 2147483647 ? DataTypeName.BigIntNumber : DataTypeName.WholeNumber;\r\n      } else {\r\n        return DataTypeName.FloatNumber;\r\n      }\r\n    }\r\n\r\n    let num = null;\r\n    let bl = null;\r\n    let dt = null;\r\n\r\n    switch (typeof val) {\r\n      case 'boolean':\r\n        return DataTypeName.Boolean;\r\n      case 'number':\r\n        return processNumber(val);\r\n      case 'object':\r\n        if (val instanceof Date) {\r\n          const dt = val;\r\n          return dt.getHours() === 0 && dt.getMinutes() === 0 && dt.getSeconds() === 0\r\n            ? DataTypeName.Date\r\n            : DataTypeName.DateTime;\r\n        }\r\n\r\n        return DataTypeName.String;\r\n      case 'string':\r\n        dt = parseDatetimeOrNull(val);\r\n        if (dt) {\r\n          return dt.getHours() === 0 && dt.getMinutes() === 0 && dt.getSeconds() === 0\r\n            ? DataTypeName.Date\r\n            : DataTypeName.DateTime;\r\n        }\r\n\r\n        num = parseNumberOrNull(val);\r\n        if (num !== null) {\r\n          return processNumber(num);\r\n        }\r\n\r\n        bl = parseBooleanOrNull(val);\r\n        if (bl !== null) {\r\n          return DataTypeName.Boolean;\r\n        }\r\n\r\n        return val.length > 4000 ? DataTypeName.LargeString : DataTypeName.String;\r\n\r\n      default:\r\n        return DataTypeName.LargeString;\r\n    }\r\n  }\r\n\r\n  if (value == null || value == undefined) {\r\n    return undefined;\r\n  }\r\n\r\n  // no point to proceed, string is most common type\r\n  if (inType === DataTypeName.LargeString) {\r\n    return DataTypeName.LargeString;\r\n  }\r\n\r\n  const realType = getRealType(value);\r\n\r\n  if (inType === undefined) {\r\n    return realType;\r\n  } else {\r\n    // normal case. Means all values in column are the same\r\n    if (inType === realType) {\r\n      return inType;\r\n    }\r\n\r\n    // date / datetime case\r\n    if (\r\n      (inType === DataTypeName.Date && realType === DataTypeName.DateTime) ||\r\n      (inType === DataTypeName.DateTime && realType === DataTypeName.Date)\r\n    ) {\r\n      return DataTypeName.DateTime;\r\n    }\r\n\r\n    // if any of items are string, then it must be string\r\n    if (realType === DataTypeName.String) {\r\n      return DataTypeName.String;\r\n    }\r\n    if (inType === DataTypeName.String && realType !== DataTypeName.LargeString) {\r\n      return DataTypeName.String;\r\n    }\r\n\r\n    if (inType === DataTypeName.FloatNumber) {\r\n      return DataTypeName.FloatNumber;\r\n    }\r\n    if (realType === DataTypeName.FloatNumber && inType === DataTypeName.WholeNumber) {\r\n      return DataTypeName.FloatNumber;\r\n    }\r\n\r\n    if (realType === DataTypeName.BigIntNumber) {\r\n      return DataTypeName.BigIntNumber;\r\n    }\r\n    if (inType === DataTypeName.BigIntNumber && realType === DataTypeName.WholeNumber) {\r\n      return DataTypeName.BigIntNumber;\r\n    }\r\n\r\n    if (realType !== inType && realType !== DataTypeName.LargeString) {\r\n      return DataTypeName.String;\r\n    }\r\n\r\n    return DataTypeName.LargeString;\r\n  }\r\n\r\n  return undefined;\r\n}\r\n\r\n/**\r\n * generates a field descriptions (first level only) that can be used for relational table definition.\r\n * if any properties are Objects, it would use JSON.stringify to calculate maxSize field.\r\n * @param items\r\n */\r\nexport function getFieldsInfo(\r\n  items: Record<string, ScalarType>[] | ScalarType[]\r\n): FieldDescription[] {\r\n  const resultMap: Record<string, FieldDescription> = Object.create(null);\r\n  const valuesMap: Record<string, Set<string | null>> = Object.create(null);\r\n  let index = 0;\r\n\r\n  function processItem(\r\n    name: string,\r\n    value: string | number | bigint | boolean | Date | null\r\n  ): void {\r\n    let fDesc = resultMap[name];\r\n    let valuesSet = valuesMap[name];\r\n\r\n    if (valuesSet === undefined) {\r\n      valuesSet = valuesMap[name] = new Set<string>();\r\n    }\r\n\r\n    if (fDesc === undefined) {\r\n      fDesc = {\r\n        index: index++,\r\n        fieldName: name,\r\n        isNullable: false,\r\n        isObject: false\r\n      } as FieldDescription;\r\n      resultMap[name] = fDesc;\r\n    }\r\n\r\n    let strValue: PrimitiveType | null = null;\r\n    if (value === null || value === undefined) {\r\n      fDesc.isNullable = true;\r\n    } else {\r\n      strValue =\r\n        value instanceof Date\r\n          ? dateToString(value)\r\n          : typeof value === 'object'\r\n          ? JSON.stringify(value)\r\n          : String(value);\r\n\r\n      if (!fDesc.isObject && !(value instanceof Date)) {\r\n        fDesc.isObject = typeof value === 'object';\r\n      }\r\n\r\n      const newType = workoutDataType(value, fDesc.dataTypeName);\r\n\r\n      if (\r\n        newType !== fDesc.dataTypeName &&\r\n        // special case when datetime can't be date again\r\n        !(fDesc.dataTypeName === DataTypeName.DateTime && newType === DataTypeName.Date)\r\n      ) {\r\n        fDesc.dataTypeName = newType;\r\n      }\r\n\r\n      if (\r\n        (fDesc.dataTypeName == DataTypeName.String ||\r\n          fDesc.dataTypeName == DataTypeName.LargeString) &&\r\n        strValue.length > (fDesc.maxSize || 0)\r\n      ) {\r\n        fDesc.maxSize = strValue.length;\r\n      }\r\n    }\r\n\r\n    if (!valuesSet.has(strValue)) {\r\n      valuesSet.add(strValue);\r\n    }\r\n  }\r\n\r\n  for (let i = 0; i < items.length; i++) {\r\n    const item = items[i];\r\n    if (\r\n      item !== null &&\r\n      item !== undefined &&\r\n      typeof item === 'object' &&\r\n      !(item instanceof Date) &&\r\n      !Array.isArray(item)\r\n    ) {\r\n      for (const [name, value] of Object.entries(item as Record<string, ScalarType>)) {\r\n        processItem(name, value);\r\n      }\r\n    } else {\r\n      processItem('_value_', item as ScalarType);\r\n    }\r\n  }\r\n\r\n  const fields = Object.values(resultMap).sort((a: FieldDescription, b: FieldDescription) =>\r\n    a.index > b.index ? 1 : b.index > a.index ? -1 : 0\r\n  );\r\n\r\n  return fields.map(r => {\r\n    r.isUnique = valuesMap[r.fieldName].size === items.length;\r\n    return r;\r\n  });\r\n}\r\n\r\nexport function processJson(\r\n  jsonString: string,\r\n  handlePathFunc: (path: (string | number)[], row: number, col: number) => boolean\r\n): void {\r\n  if (typeof handlePathFunc !== 'function') {\r\n    throw new Error('handlePathFunc is not provided.');\r\n  }\r\n\r\n  function tokenize(\r\n    json: string,\r\n    tokenFunc: (token: string, row: number, column: number) => boolean\r\n  ): void {\r\n    let line = 1,\r\n      column = 0;\r\n\r\n    let isString = false;\r\n    let currentString = '';\r\n    let previousToken = '';\r\n\r\n    for (let i = 0; i < json.length; i++) {\r\n      column++;\r\n      const currChar = json[i];\r\n      if (currChar === '\\n') {\r\n        line++;\r\n        column = 0;\r\n        continue;\r\n      }\r\n\r\n      if (currChar === '\"' && json[i - 1] !== '\\\\') {\r\n        isString = !isString;\r\n        // skip string value and empty strings\r\n        if (currentString && previousToken !== ':') {\r\n          if (typeof tokenFunc === 'function' && tokenFunc(currentString, line, column)) {\r\n            break;\r\n          }\r\n          previousToken = currentString;\r\n        }\r\n        currentString = '';\r\n        continue;\r\n      }\r\n\r\n      if (isString) {\r\n        currentString += currChar;\r\n      } else if (['[', ']', ':', '{', '}', ','].indexOf(currChar) >= 0) {\r\n        if (typeof tokenFunc === 'function' && tokenFunc(currChar, line, column)) {\r\n          break;\r\n        }\r\n        previousToken = currentString;\r\n      }\r\n    }\r\n  }\r\n\r\n  const currentPath: (string | number)[] = [];\r\n  let isNextTokenAKey = false;\r\n\r\n  function handleToken(token: string, row: number, column: number): boolean {\r\n    const isArrayLevel: () => boolean = () =>\r\n      typeof currentPath[currentPath.length - 1] === 'number';\r\n\r\n    if (token === '{') {\r\n      if (isArrayLevel()) {\r\n        (currentPath[currentPath.length - 1] as number)++;\r\n        if (handlePathFunc([...currentPath], row, column)) {\r\n          return true;\r\n        }\r\n      }\r\n\r\n      isNextTokenAKey = true;\r\n\r\n      return false;\r\n    }\r\n    if (token === '}') {\r\n      if (!isNextTokenAKey) {\r\n        currentPath.pop();\r\n      }\r\n      isNextTokenAKey = false;\r\n      return false;\r\n    }\r\n\r\n    if (token === ',') {\r\n      if (!isArrayLevel()) {\r\n        isNextTokenAKey = true;\r\n        currentPath.pop();\r\n      }\r\n      return false;\r\n    }\r\n\r\n    if (token === '[') {\r\n      currentPath.push(-1);\r\n      return false;\r\n    }\r\n\r\n    if (token === ']') {\r\n      currentPath.pop();\r\n      return false;\r\n    }\r\n\r\n    if (isNextTokenAKey) {\r\n      isNextTokenAKey = false;\r\n      currentPath.push(token);\r\n      if (handlePathFunc([...currentPath], row, column)) {\r\n        return true;\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  tokenize(jsonString, handleToken);\r\n}\r\n","import {\r\n  parseNumberOrNull,\r\n  parseDatetimeOrNull,\r\n  workoutDataType,\r\n  parseBooleanOrNull,\r\n  dateToString\r\n} from './helpers';\r\nimport {\r\n  ParsingOptions,\r\n  ScalarType,\r\n  ScalarObject,\r\n  StringsDataTable,\r\n  FieldDescription,\r\n  DataTypeName\r\n} from '../types';\r\n\r\ntype ParsingContext = {\r\n  content: string;\r\n  currentIndex: number;\r\n};\r\n\r\nconst EmptySymbol = '_#EMPTY#_';\r\n\r\nfunction getObjectElement(\r\n  fieldDescs: FieldDescription[],\r\n  tokens: string[],\r\n  options: ParsingOptions\r\n): ScalarObject {\r\n  const obj = Object.create(null);\r\n  for (let i = 0; i < fieldDescs.length; i++) {\r\n    const fieldDesc = fieldDescs[i];\r\n    const fieldName = fieldDesc.fieldName;\r\n    let value: ScalarType = tokens[i];\r\n    const dateFields = options?.dateFields?.map(r => (Array.isArray(r) ? r[0] : r)) || [];\r\n\r\n    if (options.textFields && options.textFields?.indexOf(fieldName) >= 0) {\r\n      value = tokens[i];\r\n    } else if (\r\n      fieldDesc.dataTypeName === DataTypeName.DateTime ||\r\n      fieldDesc.dataTypeName === DataTypeName.Date ||\r\n      dateFields.indexOf(fieldName) >= 0\r\n    ) {\r\n      const ind = dateFields.indexOf(fieldName);\r\n      const dtField = ind >= 0 ? options?.dateFields[ind] : [];\r\n      const format = Array.isArray(dtField) ? dtField[1] : null;\r\n      value = parseDatetimeOrNull(value as string, format || null);\r\n    } else if (\r\n      fieldDesc.dataTypeName === DataTypeName.WholeNumber ||\r\n      fieldDesc.dataTypeName === DataTypeName.FloatNumber ||\r\n      fieldDesc.dataTypeName === DataTypeName.BigIntNumber ||\r\n      (options.numberFields && options.numberFields.indexOf(fieldName) >= 0)\r\n    ) {\r\n      value = parseNumberOrNull(value as string);\r\n    } else if (\r\n      fieldDesc.dataTypeName === DataTypeName.Boolean ||\r\n      (options.booleanFields && options.booleanFields.indexOf(fieldName) >= 0)\r\n    ) {\r\n      value = parseBooleanOrNull(value as string);\r\n    }\r\n\r\n    obj[fieldName] = value === EmptySymbol ? '' : value;\r\n  }\r\n  return obj;\r\n}\r\n\r\nfunction nextLineTokens(context: ParsingContext, delimiter = ','): string[] {\r\n  const tokens: string[] = [];\r\n  let token = '';\r\n\r\n  function elementAtOrNull(arr: string, index: number): string | null {\r\n    return arr.length > index ? arr[index] : null;\r\n  }\r\n\r\n  do {\r\n    const currentChar = context.content[context.currentIndex];\r\n    if (currentChar === '\\r') {\r\n      continue;\r\n    }\r\n\r\n    if (currentChar === '\\n') {\r\n      if (context.content[context.currentIndex + 1] === '\\r') {\r\n        context.currentIndex++;\r\n      }\r\n      break;\r\n    }\r\n\r\n    if (token.length === 0 && currentChar === '\"') {\r\n      if (\r\n        elementAtOrNull(context.content, context.currentIndex + 1) === '\"' &&\r\n        elementAtOrNull(context.content, context.currentIndex + 2) !== '\"'\r\n      ) {\r\n        // just empty string\r\n        token = EmptySymbol;\r\n        context.currentIndex++;\r\n      } else {\r\n        // enumerate till the end of quote\r\n        while (context.content[++context.currentIndex] !== '\"') {\r\n          token += context.content[context.currentIndex];\r\n\r\n          // check if we need to escape \"\"\r\n          if (\r\n            elementAtOrNull(context.content, context.currentIndex + 1) === '\"' &&\r\n            elementAtOrNull(context.content, context.currentIndex + 2) === '\"'\r\n          ) {\r\n            token += '\"';\r\n            context.currentIndex += 2;\r\n          }\r\n        }\r\n      }\r\n    } else if (currentChar === delimiter) {\r\n      tokens.push(token);\r\n      token = '';\r\n    } else {\r\n      token += currentChar;\r\n    }\r\n  } while (++context.currentIndex < context.content.length);\r\n\r\n  tokens.push(token);\r\n  return tokens;\r\n}\r\n\r\nfunction parseLineTokens(content: string, options: ParsingOptions): StringsDataTable {\r\n  const ctx = {\r\n    content: content,\r\n    currentIndex: 0\r\n  } as ParsingContext;\r\n  content = content || '';\r\n  const delimiter = options.delimiter || ',';\r\n\r\n  const result = {\r\n    fieldDescriptions: [] as FieldDescription[],\r\n    rows: [] as ScalarType[][]\r\n  } as StringsDataTable;\r\n  let lineNumber = 0;\r\n  let fieldNames: string[] | null = null;\r\n  const uniqueValues: string[][] = [];\r\n\r\n  do {\r\n    const rowTokens = nextLineTokens(ctx, delimiter);\r\n\r\n    // skip if all tokens are empty\r\n    if (rowTokens.filter(f => !f || !f.length).length === rowTokens.length) {\r\n      lineNumber++;\r\n      continue;\r\n    }\r\n\r\n    // skip rows based skipRows value\r\n    if (lineNumber < options.skipRows) {\r\n      lineNumber++;\r\n      continue;\r\n    }\r\n\r\n    // skip rows based on skipUntil call back\r\n    if (!fieldNames && typeof options.skipUntil === 'function' && !options.skipUntil(rowTokens)) {\r\n      lineNumber++;\r\n      continue;\r\n    }\r\n\r\n    if (!fieldNames) {\r\n      // fieldName is used as indicator on whether data rows handling started\r\n      fieldNames = [];\r\n      const fieldDescriptions = [];\r\n\r\n      for (let i = 0; i < rowTokens.length; i++) {\r\n        // if empty then _\r\n        let token = rowTokens[i].trim().length ? rowTokens[i].trim() : '_';\r\n\r\n        if (!options.keepOriginalHeaders) {\r\n          token = token.replace(/\\W/g, '_');\r\n        }\r\n\r\n        // just to ensure no dublicated field names\r\n        fieldNames.push(fieldNames.indexOf(token) >= 0 ? `${token}_${i}` : token);\r\n\r\n        fieldDescriptions.push({\r\n          fieldName: fieldNames[fieldNames.length - 1],\r\n          isNullable: false,\r\n          isUnique: true,\r\n          index: i\r\n        } as FieldDescription);\r\n\r\n        uniqueValues.push([]);\r\n      }\r\n\r\n      result.fieldDescriptions = fieldDescriptions;\r\n      result.fieldNames = fieldNames;\r\n\r\n      lineNumber++;\r\n      continue;\r\n    }\r\n\r\n    if (typeof options.takeWhile === 'function' && fieldNames && !options.takeWhile(rowTokens)) {\r\n      break;\r\n    }\r\n    const rowValues: string[] = [];\r\n\r\n    // analyze each cell in a row\r\n    for (let i = 0; i < Math.min(rowTokens.length, result.fieldDescriptions.length); i++) {\r\n      const fDesc = result.fieldDescriptions[i];\r\n      let value: string | null = rowTokens[i];\r\n\r\n      if (value === null || value === undefined || value.length === 0) {\r\n        fDesc.isNullable = true;\r\n      } else if (value !== EmptySymbol) {\r\n        const newType = workoutDataType(value, fDesc.dataTypeName);\r\n        if (newType !== fDesc.dataTypeName) {\r\n          fDesc.dataTypeName = newType;\r\n        }\r\n\r\n        if (\r\n          (fDesc.dataTypeName == DataTypeName.String ||\r\n            fDesc.dataTypeName == DataTypeName.LargeString) &&\r\n          String(value).length > (fDesc.maxSize || 0)\r\n        ) {\r\n          fDesc.maxSize = String(value).length;\r\n        }\r\n      }\r\n\r\n      if (fDesc.isUnique) {\r\n        if (uniqueValues[i].indexOf(value) >= 0) {\r\n          fDesc.isUnique = false;\r\n        } else {\r\n          uniqueValues[i].push(value);\r\n        }\r\n      }\r\n\r\n      if (value === EmptySymbol) {\r\n        value =\r\n          fDesc.dataTypeName === DataTypeName.String ||\r\n          fDesc.dataTypeName === DataTypeName.LargeString\r\n            ? ''\r\n            : null;\r\n      } else if (!value.length) {\r\n        value = null;\r\n      }\r\n      rowValues.push(value as string);\r\n    }\r\n\r\n    // no need for null or empty objects\r\n    result.rows.push(rowValues);\r\n    lineNumber++;\r\n  } while (++ctx.currentIndex < ctx.content.length);\r\n\r\n  result.fieldDataTypes = result.fieldDescriptions.map(f => f.dataTypeName as DataTypeName);\r\n  return result;\r\n}\r\n\r\nexport function parseCsv(content: string, options?: ParsingOptions): ScalarObject[] {\r\n  content = content || '';\r\n  options = Object.assign(new ParsingOptions(), options || {});\r\n  if (!content.length) {\r\n    return [];\r\n  }\r\n\r\n  const table = parseLineTokens(content, options || new ParsingOptions());\r\n\r\n  const result: ScalarObject[] = [];\r\n  for (let i = 0; i < table.rows.length; i++) {\r\n    const obj =\r\n      typeof options.elementSelector === 'function'\r\n        ? options.elementSelector(table.fieldDescriptions, table.rows[i] as string[])\r\n        : getObjectElement(table.fieldDescriptions, table.rows[i] as string[], options);\r\n\r\n    if (obj) {\r\n      // no need for null or empty objects\r\n      result.push(obj);\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nexport function parseCsvToTable(content: string, options?: ParsingOptions): StringsDataTable {\r\n  content = content || '';\r\n\r\n  if (!content.length) {\r\n    return {} as StringsDataTable;\r\n  }\r\n\r\n  return parseLineTokens(content, options || new ParsingOptions());\r\n}\r\n\r\nexport function toCsv(array: ScalarObject[], delimiter = ','): string {\r\n  array = array || [];\r\n\r\n  const headers: string[] = [];\r\n\r\n  // workout all headers\r\n  for (const item of array) {\r\n    for (const name in item) {\r\n      if (headers.indexOf(name) < 0) {\r\n        headers.push(name);\r\n      }\r\n    }\r\n  }\r\n\r\n  // create a csv string\r\n  const lines = array.map(item => {\r\n    const values: string[] = [];\r\n    for (const name of headers) {\r\n      let value: ScalarType = item[name];\r\n      if (value instanceof Date) {\r\n        value = dateToString(value);\r\n      } else if (value && typeof value === 'object') {\r\n        value = `\"${JSON.stringify(value).replace(new RegExp('\"', 'g'), '\"\"')}\"`;\r\n      } else if (\r\n        typeof value === 'string' &&\r\n        (value.indexOf(delimiter) >= 0 || value.indexOf('\"') >= 0)\r\n      ) {\r\n        // excel style csv\r\n        value = value.replace(new RegExp('\"', 'g'), '\"\"');\r\n        value = `\"${value}\"`;\r\n      }\r\n      value = value !== null && value !== undefined ? value : '';\r\n      values.push(String(value));\r\n    }\r\n    return values.join(delimiter);\r\n  });\r\n  lines.unshift(headers.join(delimiter));\r\n\r\n  return lines.join('\\n');\r\n}\r\n","export function formatCamelStr(str = ''): string {\r\n  return str\r\n    .replace(/^\\w/, c => c.toUpperCase())\r\n    .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\r\n    .replace(/_/g, ' ');\r\n}\r\n\r\nexport function replaceAll(text: string, searchValue: string, replaceValue = ''): string {\r\n  return text.replace(new RegExp(searchValue, 'g'), replaceValue || '');\r\n}\r\n\r\n/**\r\n * trims characters from the left\r\n * @param text text to trim\r\n * @param characters character to trim\r\n * @returns trimmed string\r\n */\r\nexport function trimStart(text: string, characters = ' \\n\\t\\r'): string {\r\n  if (!text) {\r\n    return text;\r\n  }\r\n  \r\n  let startIndex = 0;\r\n  while (characters.indexOf(text.charAt(startIndex)) >= 0) {\r\n    startIndex++;\r\n  }\r\n  return text.substring(startIndex);\r\n}\r\n\r\n/**\r\n * trims characters from the right\r\n * @param text text to trim\r\n * @param characters character to trim\r\n * @returns trimmed string\r\n */\r\nexport function trimEnd(text: string, characters = ' \\n\\t\\r'): string {\r\n  if (!text) {\r\n    return text;\r\n  }\r\n\r\n  let endIndex = text.length;\r\n  while (characters.indexOf(text.charAt(endIndex - 1)) >= 0) {\r\n    endIndex--;\r\n  }\r\n  return text.substring(0, endIndex);\r\n}\r\n\r\n/**\r\n * trims characters from both sides\r\n * @param text text to trim\r\n * @param characters character to trim\r\n * @returns trimmed string\r\n */\r\nexport function trim(text: string, characters = ' \\n\\t\\r'): string {\r\n  return trimStart(trimEnd(text, characters), characters);\r\n}\r\n\r\n/**\r\n * Splits string into array of tokens based on a separator(one or many).\r\n * Also, you can define open close brackets.\r\n * e.g. split('field1=func(a,b,c),field2=4', ',', ['()'])\r\n * // result = [\"field1=func(a,b,c)\", \"field2=4\"]\r\n * @param text Text to split\r\n * @param separator\r\n * @param openClose\r\n * @returns\r\n */\r\nexport function split(text: string, separator = ',', openClose?: string[]): string[] {\r\n  const res: string[] = [];\r\n\r\n  if (!text) {\r\n    return res;\r\n  }\r\n\r\n  openClose = openClose || [];\r\n  let index = -1;\r\n\r\n  let token = '';\r\n  while (++index < text.length) {\r\n    let currentChar = text[index];\r\n\r\n    const oIndex = openClose.findIndex(s => s[0] === currentChar);\r\n    if (oIndex >= 0) {\r\n      token += text[index];\r\n      let innerBrackets = 0;\r\n      while (text[++index] !== openClose[oIndex][1] || innerBrackets) {\r\n        currentChar = text[index];\r\n        token += currentChar;\r\n\r\n        if (currentChar === openClose[oIndex][0]) {\r\n          innerBrackets++;\r\n        }\r\n\r\n        if (currentChar === openClose[oIndex][1]) {\r\n          innerBrackets--;\r\n        }\r\n\r\n        if (index + 1 === text.length) {\r\n          throw new Error(`Closing bracket is missing`);\r\n        }\r\n      }\r\n      token += text[index];\r\n      continue;\r\n    }\r\n\r\n    if (separator.includes(currentChar)) {\r\n      res.push(token);\r\n      token = '';\r\n    } else {\r\n      token += currentChar;\r\n    }\r\n  }\r\n\r\n  res.push(token);\r\n\r\n  return res;\r\n}\r\n","import { trim } from '../string';\r\n\r\nexport class JSONParser {\r\n  private readonly whitespaces = ' \\n\\r\\t';\r\n  private ignoreWhiteSpace = false;\r\n  private token = '';\r\n  private openObjectCount = 0;\r\n  private openArrayCount = 0;\r\n  private count = 0;\r\n  private firstChar = '';\r\n\r\n  private isString = false;\r\n  private isKeyCollector = false;\r\n  private prevChar = '';\r\n  private itemKey = '';\r\n  private isObjectMap = false;\r\n\r\n  processJsonItems(ch: string, processCallback: (obj: string, key: string | number) => void): void {\r\n    if (!this.firstChar) {\r\n      // ignore begining whitespaces\r\n      if (!ch.trim().length) {\r\n        return;\r\n      }\r\n      this.firstChar = ch;\r\n      if (this.firstChar === '{') {\r\n        this.isKeyCollector = true;\r\n        this.isObjectMap = true;\r\n      }\r\n      return;\r\n    }\r\n\r\n    if (this.ignoreWhiteSpace && this.whitespaces.indexOf(ch) >= 0) {\r\n      return;\r\n    }\r\n\r\n    if (!this.isString && ch === '{') {\r\n      this.openObjectCount++;\r\n    } else if (!this.isString && ch === '}') {\r\n      this.openObjectCount--;\r\n    } else if (!this.isString && ch === '[') {\r\n      this.openArrayCount++;\r\n    } else if (!this.isString && ch === ']') {\r\n      this.openArrayCount--;\r\n    } else if (!this.isString && this.isKeyCollector && ch === ':') {\r\n      this.itemKey = this.token;\r\n      this.token = '';\r\n      this.isKeyCollector = false;\r\n      return;\r\n    } else if (ch === '\"' && (this.prevChar !== '\\\\' || this.token.endsWith('\\\\\\\\'))) {\r\n      this.isString = !this.isString;\r\n    }\r\n\r\n    const objectDone =\r\n      !this.isKeyCollector && this.openArrayCount === 0 && this.openObjectCount === 0;\r\n\r\n    if (objectDone && ch === ',') {\r\n      return;\r\n    }\r\n\r\n    this.token += ch;\r\n    this.prevChar = ch;\r\n\r\n    if (objectDone && this.token.trim()) {\r\n      const key = this.itemKey ? trim(this.itemKey, `\\n\\t ,\"'`) : this.count;\r\n      processCallback(this.token, key);\r\n\r\n      if (this.isObjectMap) {\r\n        this.isKeyCollector = true;\r\n      }\r\n\r\n      this.count++;\r\n      this.itemKey = '';\r\n      this.token = '';\r\n    }\r\n  }\r\n}\r\n","import { ScalarObject, PrimitiveType, TableDto, DataTypeName } from '../types';\r\nimport { parseDatetimeOrNull, dateToString } from './helpers';\r\n\r\n/**\r\n * Get JSON type array for tabel type array.\r\n * @param rowsOrTable Table data or Array of values .\r\n * @param fieldNames Column names. If not provided then, it will be auto generated\r\n * @param fieldDataTypes Column names\r\n */\r\nexport function fromTable(\r\n  rowsOrTable: PrimitiveType[][] | TableDto,\r\n  fieldNames?: string[],\r\n  fieldDataTypes?: DataTypeName[]\r\n): ScalarObject[] {\r\n  const table = rowsOrTable as TableDto;\r\n  const rows = table?.rows || rowsOrTable || [];\r\n\r\n  if (!rows.length) {\r\n    // return empty array\r\n    return [];\r\n  }\r\n\r\n  fieldNames = table?.fieldNames || fieldNames || rows[0].map((v, i) => `Field${i}`);\r\n  fieldDataTypes = table?.fieldDataTypes || fieldDataTypes || [];\r\n\r\n  const values: ScalarObject[] = [];\r\n  for (const row of rows) {\r\n    const value: ScalarObject = {};\r\n    for (let i = 0, len = fieldNames.length; i < len; i++) {\r\n      const fieldName = fieldNames[i];\r\n      const dataType = fieldDataTypes.length ? fieldDataTypes[i] : null;\r\n      value[fieldName] =\r\n        (dataType === DataTypeName.DateTime || dataType === DataTypeName.Date) && row[i]\r\n          ? parseDatetimeOrNull(row[i] as string | Date)\r\n          : row[i];\r\n    }\r\n    values.push(value);\r\n  }\r\n\r\n  return values;\r\n}\r\n\r\n/**\r\n * Gets table data from JSON type array.\r\n * @param array\r\n * @param rowsFieldName\r\n * @param fieldsFieldName\r\n */\r\nexport function toTable(values: ScalarObject[]): TableDto {\r\n  const tableDto: TableDto = {\r\n    fieldNames: [],\r\n    rows: []\r\n  };\r\n\r\n  if (!values?.length) {\r\n    return tableDto;\r\n  }\r\n\r\n  const fN = new Set<string>();\r\n  values.forEach(v => {\r\n    Object.keys(v).forEach(k => fN.add(k));\r\n  });\r\n\r\n  tableDto.fieldNames = Array.from(fN.values());\r\n  tableDto.rows = values.map(rowValues => {\r\n    return tableDto.fieldNames.reduce((r, field) => {\r\n      const v = rowValues[field];\r\n      const val = v instanceof Date ? dateToString(v) : v;\r\n      r.push(val as PrimitiveType);\r\n      return r;\r\n    }, [] as PrimitiveType[]);\r\n  });\r\n  return tableDto;\r\n}\r\n","import { Selector } from './types';\r\nimport { dateToString } from './utils';\r\n\r\nexport function fieldSelector(\r\n  input: string | string[] | Selector<any, string>\r\n): Selector<any, string> {\r\n  if (typeof input === 'function') {\r\n    return input;\r\n  } else if (typeof input === 'string') {\r\n    return (item): any => (item[input] instanceof Date ? dateToString(item[input]) : item[input]);\r\n  } else if (Array.isArray(input)) {\r\n    return (item): any => input.map(r => item[r]).join('|');\r\n  } else {\r\n    throw Error(`Unknown input. Can't create a fieldSelector`);\r\n  }\r\n}\r\n","import { parseNumber, parseDatetimeOrNull, dateToString } from '../utils';\r\nimport { ScalarType, Selector } from '..';\r\nimport { fieldSelector } from '../_internals';\r\n\r\nfunction compareStrings(a: string, b: any): number {\r\n  return a.localeCompare(b);\r\n}\r\n\r\nfunction compareNumbers(a: number, b: any): number {\r\n  const bNumVal = parseNumber(b);\r\n  if (bNumVal === undefined) {\r\n    return 1;\r\n  }\r\n\r\n  return a - bNumVal;\r\n}\r\n\r\nfunction compareObjects(a: any, b: any): number {\r\n  const aDate = parseDatetimeOrNull(a);\r\n  const bDate = parseDatetimeOrNull(b);\r\n\r\n  if (!aDate && !bDate) {\r\n    return 0;\r\n  }\r\n\r\n  if (!aDate) {\r\n    return -1;\r\n  }\r\n\r\n  if (!bDate) {\r\n    return 1;\r\n  }\r\n\r\n  return aDate.getTime() - bDate.getTime();\r\n}\r\n\r\nfunction compare(a: any, b: any, { field, asc }: any): number {\r\n  const valA = a[field];\r\n  const valB = b[field];\r\n  const order = asc ? 1 : -1;\r\n\r\n  if (valA !== undefined && valB === undefined) {\r\n    return order;\r\n  }\r\n\r\n  switch (typeof valA) {\r\n    case 'number':\r\n      return order * compareNumbers(valA, valB);\r\n    case 'string':\r\n      return order * compareStrings(valA, valB);\r\n    case 'object':\r\n      return order * compareObjects(valA, valB);\r\n    case 'undefined':\r\n      return valB === undefined ? 0 : -1 * order;\r\n  }\r\n  return 0;\r\n}\r\n\r\nfunction comparator(sortFields: any[]): (a: any, b: any) => number {\r\n  if (sortFields.length) {\r\n    return (a: any, b: any): number => {\r\n      for (let i = 0, len = sortFields.length; i < len; i++) {\r\n        const res = compare(a, b, sortFields[i]);\r\n\r\n        if (res !== 0) {\r\n          return res;\r\n        }\r\n      }\r\n      return 0;\r\n    };\r\n  }\r\n\r\n  return (): number => 0;\r\n}\r\n\r\n/**\r\n * Checks if array is empty or null or array at all\r\n * @param array\r\n */\r\nexport function isArrayEmptyOrNull(array: any[]): boolean {\r\n  return !array || !Array.isArray(array) || !array.length;\r\n}\r\n\r\n/**\r\n * A simple sort array function with a convenient interface\r\n * @param array The array to process.\r\n * @param fields sorts order.\r\n * @public\r\n * @example\r\n * sort(array, 'name ASC', 'age DESC');\r\n */\r\nexport function sort(array: any[], ...fields: string[]): any[] {\r\n  if (!array || !Array.isArray(array)) {\r\n    throw Error('Array is not provided');\r\n  }\r\n\r\n  if (!fields?.length) {\r\n    // just a default sort\r\n    return array.sort();\r\n  }\r\n\r\n  const sortFields = fields.map(field => {\r\n    const asc = !field.endsWith(' DESC');\r\n    return {\r\n      asc,\r\n      field: field.replace(asc ? /\\sASC$/ : /\\sDESC$/, '')\r\n    };\r\n  });\r\n\r\n  array.sort(comparator(sortFields));\r\n  return array;\r\n}\r\n/**\r\n * Converts array of items to the object map. Where key selector can be defined.\r\n * @param array to be converted\r\n * @param keyField a selector or field name for a property name\r\n */\r\nexport function toObject(\r\n  array: any[],\r\n  keyField: string | string[] | Selector<any, string>\r\n): Record<string, any> {\r\n  const result = {} as Record<string, any>;\r\n\r\n  for (const item of array) {\r\n    let key = fieldSelector(keyField)(item);\r\n    if ((key as any) instanceof Date) {\r\n      key = dateToString(key as any);\r\n    }\r\n    result[key] = item;\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * Convert array of items to into series array or series record.\r\n * @param array Array to be converted\r\n * @param propertyName optional parameter to define a property to be unpacked.\r\n * If it is string the array with values will be returned, otherwise an object with a list of series map\r\n */\r\nexport function toSeries(\r\n  array: any[],\r\n  propertyName?: string | string[]\r\n): Record<string, ScalarType[]> | ScalarType[] {\r\n  if (!array?.length) {\r\n    return {};\r\n  }\r\n\r\n  // a single property\r\n  if (typeof propertyName == 'string') {\r\n    return array.map(r => (r[propertyName] === undefined ? null : r[propertyName]));\r\n  }\r\n\r\n  const seriesRecord: Record<string, ScalarType[]> = {};\r\n\r\n  const seriesNames =\r\n    Array.isArray(propertyName) && propertyName.length ? propertyName : Object.keys(array[0]);\r\n\r\n  for (let i = 0; i < array.length; i++) {\r\n    for (let j = 0; j < seriesNames.length; j++) {\r\n      const seriesName = seriesNames[j];\r\n      if (!seriesRecord[seriesName]) {\r\n        seriesRecord[seriesName] = [];\r\n      }\r\n      const value = array[i][seriesName];\r\n      seriesRecord[seriesName].push(value === undefined ? null : value);\r\n    }\r\n  }\r\n\r\n  return seriesRecord;\r\n}\r\n","import { Selector, Predicate } from '../types';\r\nimport { parseNumber } from '../utils';\r\nimport { isArrayEmptyOrNull } from './utils';\r\n\r\nfunction fieldSelector(field?: string | Selector): Selector {\r\n  if (!field) {\r\n    return (item: any): any => item;\r\n  }\r\n  return typeof field === 'function'\r\n    ? (field as Selector)\r\n    : (item: any): any => item[String(field)];\r\n}\r\n\r\nfunction fieldComparator(field?: string | Selector): (a: any, b: any) => number {\r\n  return (a: any, b: any): number => {\r\n    const aVal = parseNumber(a, fieldSelector(field));\r\n    const bVal = parseNumber(b, fieldSelector(field));\r\n\r\n    if (bVal === undefined) {\r\n      return 1;\r\n    }\r\n\r\n    if (aVal === undefined) {\r\n      return -1;\r\n    }\r\n\r\n    return aVal - bVal >= 0 ? 1 : -1;\r\n  };\r\n}\r\n\r\nfunction getNumberValuesArray(array: any[], field?: string | Selector): number[] {\r\n  const elementSelector = fieldSelector(field);\r\n  return array\r\n    .map(item => parseNumber(item, elementSelector))\r\n    .filter(v => v !== undefined) as number[];\r\n}\r\n\r\n/**\r\n * Sum of items in array.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n * @returns Sum of array.\r\n * @public\r\n * @example\r\n * sum([1, 2, 5]); // 8\r\n *\r\n * sum([{ val: 1 }, { val: 5 }], i => i.val); // 6\r\n */\r\nexport function sum(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const elementSelector = fieldSelector(field);\r\n\r\n  let sum = 0;\r\n  for (const item of array) {\r\n    const numberVal = parseNumber(item, elementSelector);\r\n    if (numberVal) {\r\n      sum += numberVal;\r\n    }\r\n  }\r\n\r\n  return sum;\r\n}\r\n\r\n/**\r\n * Average of array items.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n * @public\r\n * @example\r\n * avg([1, 5, 3]); // 3\r\n */\r\nexport function avg(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const elementSelector = fieldSelector(field);\r\n\r\n  const s = sum(array, elementSelector);\r\n\r\n  return s ? s / array.length : null;\r\n}\r\n\r\n/**\r\n * Computes the minimum value of array.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function min(array: any[], field?: Selector | string): number | Date | null {\r\n  const elementSelector = fieldSelector(field);\r\n  const numberArray = getNumberValuesArray(array, elementSelector);\r\n  if (isArrayEmptyOrNull(numberArray)) {\r\n    return null;\r\n  }\r\n  const min = Math.min(...numberArray);\r\n  const item = elementSelector ? elementSelector(array[0]) : array[0];\r\n  if (item instanceof Date) {\r\n    return new Date(min);\r\n  }\r\n  return min;\r\n}\r\n\r\n/**\r\n * Computes the maximum value of array.\r\n * @public\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function max(array: any[], field?: Selector | string): number | Date | null {\r\n  const elementSelector = fieldSelector(field);\r\n  const numberArray = getNumberValuesArray(array, elementSelector);\r\n  if (isArrayEmptyOrNull(numberArray)) {\r\n    return null;\r\n  }\r\n  const max = Math.max(...numberArray);\r\n  const item = elementSelector ? elementSelector(array[0]) : array[0];\r\n  if (item instanceof Date) {\r\n    return new Date(max);\r\n  }\r\n  return max;\r\n}\r\n\r\n/**\r\n * Count of elements in array.\r\n * @public\r\n * @param array The array to process.\r\n * @param predicate Predicate function invoked per iteration.\r\n */\r\nexport function count(array: any[], predicate?: Predicate): number | null {\r\n  if (!array || !Array.isArray(array)) return null;\r\n\r\n  if (!predicate || typeof predicate !== 'function') {\r\n    return array.length;\r\n  }\r\n  return array.filter(predicate).length;\r\n}\r\n\r\n/**\r\n * Gets first item in array satisfies predicate.\r\n * @param array The array to process.\r\n * @param predicate Predicate function invoked per iteration.\r\n */\r\nexport function first<T = any>(array: T[], predicate?: Predicate): T | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  if (!predicate) {\r\n    return array[0];\r\n  }\r\n  for (let i = 0; i < array.length; i++) {\r\n    if (predicate(array[i])) {\r\n      return array[i];\r\n    }\r\n  }\r\n  return null;\r\n}\r\n\r\n/**\r\n * Gets last item in array satisfies predicate.\r\n * @param array The array to process.\r\n * @param predicate Predicate function invoked per iteration.\r\n */\r\nexport function last<T = any>(array: T[], predicate?: Predicate): T | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  let lastIndex = array.length - 1;\r\n  if (!predicate) {\r\n    return array[lastIndex];\r\n  }\r\n\r\n  for (; lastIndex >= 0; lastIndex--) {\r\n    if (predicate(array[lastIndex])) {\r\n      return array[lastIndex];\r\n    }\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\n/**\r\n * Gets counts map of values returned by `elementSelector`.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function countBy(array: any[], elementSelector: Selector): Record<string, number> {\r\n  if (!array || !Array.isArray(array)) {\r\n    throw Error('No array provided');\r\n  }\r\n\r\n  const results: Record<string, number> = {};\r\n  const length = array.length;\r\n\r\n  for (let i = 0; i < length; i++) {\r\n    const item = array[i];\r\n    const group = elementSelector(item);\r\n    results[group] = results[group] || 0;\r\n    results[group]++;\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n/**\r\n * Get mean of an array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n */\r\nexport function mean(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  let res = 0;\r\n  for (let i = 0, c = 0, len = array.length; i < len; ++i) {\r\n    const val = parseNumber(array[i], fieldSelector(field));\r\n    if (typeof val === 'number') {\r\n      const delta = val - res;\r\n      res = res + delta / ++c;\r\n    }\r\n  }\r\n  return res;\r\n}\r\n\r\n/**\r\n * Get quantile of a sorted array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n * @param p quantile.\r\n */\r\nexport function quantile(array: any[], p: number, field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const len = (array.length - 1) * p + 1;\r\n  const l = Math.floor(len);\r\n  const elementSelector = fieldSelector(field);\r\n  const val = elementSelector ? elementSelector(array[l - 1]) : array[l - 1];\r\n  const e = len - l;\r\n  return e ? val + e * (array[l] - val) : val;\r\n}\r\n\r\n/**\r\n * Get sample variance of an array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n */\r\nexport function variance(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const elementSelector = fieldSelector(field);\r\n  if (!Array.isArray(array) || array.length < 2) {\r\n    return 0;\r\n  }\r\n  let mean = 0,\r\n    M2 = 0,\r\n    c = 0;\r\n  for (let i = 0; i < array.length; ++i) {\r\n    const val = parseNumber(array[i], elementSelector);\r\n    if (typeof val === 'number') {\r\n      const delta = val - mean;\r\n      mean = mean + delta / ++c;\r\n      M2 = M2 + delta * (val - mean);\r\n    }\r\n  }\r\n  M2 = M2 / (c - 1);\r\n  return M2;\r\n}\r\n\r\n/**\r\n * Get the sample standard deviation of an array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n */\r\nexport function stdev(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  const varr = variance(array, field);\r\n\r\n  if (varr === null) {\r\n    return null;\r\n  }\r\n\r\n  return Math.sqrt(varr);\r\n}\r\n\r\n/**\r\n * Get median of an array.\r\n * @param array The array to process.\r\n * @param field Property name or Selector function invoked per iteration.\r\n */\r\nexport function median(array: any[], field?: Selector | string): number | null {\r\n  if (isArrayEmptyOrNull(array)) {\r\n    return null;\r\n  }\r\n\r\n  array.sort(fieldComparator(field));\r\n  return quantile(getNumberValuesArray(array, field), 0.5);\r\n}\r\n","import { Selector } from '../types';\r\nimport { fieldSelector } from '../_internals';\r\n\r\nfunction verifyJoinArgs(\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKeySelector: (item: any) => string,\r\n  rightKeySelector: (item: any) => string,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): void {\r\n  if (!leftArray || !Array.isArray(leftArray)) {\r\n    throw Error('leftArray is not provided or not a valid');\r\n  }\r\n  if (!rightArray || !Array.isArray(rightArray)) {\r\n    throw Error('rightArray is not provided or not a valid');\r\n  }\r\n\r\n  if (typeof leftKeySelector !== 'function') {\r\n    throw Error('leftKeySelector is not provided or not a valid function');\r\n  }\r\n\r\n  if (typeof rightKeySelector !== 'function') {\r\n    throw Error('rightKeySelector is not provided or not a valid function');\r\n  }\r\n\r\n  if (typeof resultSelector !== 'function') {\r\n    throw Error('resultSelector is not provided or not a valid function');\r\n  }\r\n}\r\n\r\nfunction leftOrInnerJoin(\r\n  isInnerJoin: boolean,\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKey: string | string[] | Selector<any, string>,\r\n  rightKey: string | string[] | Selector<any, string>,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): any[] {\r\n  const leftKeySelector = fieldSelector(leftKey);\r\n  const rightKeySelector = fieldSelector(rightKey);\r\n\r\n  verifyJoinArgs(leftArray, rightArray, leftKeySelector, rightKeySelector, resultSelector);\r\n\r\n  // build a lookup map\r\n  const rightArrayMap = Object.create(null);\r\n  for (const item of rightArray) {\r\n    rightArrayMap[rightKeySelector(item)] = item;\r\n  }\r\n\r\n  const result: any[] = [];\r\n  for (const leftItem of leftArray) {\r\n    const leftKey = leftKeySelector(leftItem);\r\n    const rightItem = rightArrayMap[leftKey] || null;\r\n\r\n    if (isInnerJoin && !rightItem) {\r\n      continue;\r\n    }\r\n\r\n    const resultItem = resultSelector(leftItem, rightItem);\r\n\r\n    // if result is null then probably a left item was modified\r\n    result.push(resultItem || leftItem);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * leftJoin returns all elements from the left array (leftArray), and the matched elements from the right array (rightArray).\r\n * The result is NULL from the right side, if there is no match.\r\n * @param leftArray array for left side in a join\r\n * @param rightArray array for right side in a join\r\n * @param leftKey A key from left side array. What can be as a fieldName, multiple fields or key Selector\r\n * @param rightKey A key from right side array. what can be as a fieldName, multiple fields or key Selector\r\n * @param resultSelector A callback function that returns result value\r\n */\r\nexport function leftJoin(\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKeySelector: string | string[] | Selector<any, string>,\r\n  rightKeySelector: string | string[] | Selector<any, string>,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): any[] {\r\n  return leftOrInnerJoin(\r\n    false,\r\n    leftArray,\r\n    rightArray,\r\n    leftKeySelector,\r\n    rightKeySelector,\r\n    resultSelector\r\n  );\r\n}\r\n\r\n/**\r\n * innerJoin - Joins two arrays together by selecting elements that have matching values in both arrays.\r\n * If there are elements in any array that do not have matches in other array, these elements will not be shown!\r\n * @param leftArray array for left side in a join\r\n * @param rightArray array for right side in a join\r\n * @param leftKey A key from left side array. What can be as a fieldName, multiple fields or key Selector\r\n * @param rightKey A key from right side array. what can be as a fieldName, multiple fields or key Selector\r\n * @param resultSelector A callback function that returns result value\r\n */\r\nexport function innerJoin(\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKey: string | string[] | Selector<any, string>,\r\n  rightKey: string | string[] | Selector<any, string>,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): any[] {\r\n  return leftOrInnerJoin(true, leftArray, rightArray, leftKey, rightKey, resultSelector);\r\n}\r\n\r\n/**\r\n * fullJoin returns all elements from the left array (leftArray), and all elements from the right array (rightArray).\r\n * The result is NULL from the right/left side, if there is no match.\r\n * @param leftArray array for left side in a join\r\n * @param rightArray array for right side in a join\r\n * @param leftKey A key from left side array. What can be as a fieldName, multiple fields or key Selector\r\n * @param rightKey A key from right side array. what can be as a fieldName, multiple fields or key Selector\r\n * @param resultSelector A callback function that returns result value\r\n */\r\nexport function fullJoin(\r\n  leftArray: any[],\r\n  rightArray: any[],\r\n  leftKey: string | string[] | Selector<any, string>,\r\n  rightKey: string | string[] | Selector<any, string>,\r\n  resultSelector: (leftItem: any, rightItem: any) => any\r\n): any[] {\r\n  const leftKeySelector = fieldSelector(leftKey);\r\n  const rightKeySelector = fieldSelector(rightKey);\r\n\r\n  verifyJoinArgs(leftArray, rightArray, leftKeySelector, rightKeySelector, resultSelector);\r\n\r\n  // build a lookup maps for both arrays.\r\n  // so, both of them have to be unique, otherwise it will flattern result\r\n  const leftArrayMap = Object.create(null);\r\n  for (const item of rightArray) {\r\n    leftArrayMap[leftKeySelector(item)] = item;\r\n  }\r\n\r\n  const rightArrayMap = Object.create(null);\r\n  for (const item of rightArray) {\r\n    rightArrayMap[rightKeySelector(item)] = item;\r\n  }\r\n\r\n  const result: any[] = [];\r\n  for (const leftItem of leftArray) {\r\n    const leftKey = leftKeySelector(leftItem);\r\n    const rightItem = rightArrayMap[leftKey] || null;\r\n\r\n    const resultItem = resultSelector(leftItem, rightItem);\r\n\r\n    // if result is null then probably a left item was modified\r\n    result.push(resultItem || leftItem);\r\n    if (rightItem) {\r\n      delete rightArrayMap[leftKey];\r\n    }\r\n  }\r\n\r\n  // add remaining right items\r\n  for (const rightItemKey in rightArrayMap) {\r\n    const rightItem = rightArrayMap[rightItemKey];\r\n    const resultItem = resultSelector(null, rightItem);\r\n\r\n    // if result is null then probably a left item was modified\r\n    result.push(resultItem || rightItem);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * merges elements from two arrays. It appends source element or overrides to target array based on matching keys provided\r\n * @param targetArray target array\r\n * @param sourceArray source array\r\n * @param targetKey tartget key field, arry of fields or field serlector\r\n * @param sourceKey source key field, arry of fields or field serlector\r\n */\r\nexport function merge(\r\n  targetArray: any[],\r\n  sourceArray: any[],\r\n  targetKey: string | string[] | Selector<any, string>,\r\n  sourceKey: string | string[] | Selector<any, string>\r\n): any[] {\r\n  const targetKeySelector = fieldSelector(targetKey);\r\n  const sourceKeySelector = fieldSelector(sourceKey);\r\n  verifyJoinArgs(targetArray, sourceArray, targetKeySelector, sourceKeySelector, () => false);\r\n\r\n  // build a lookup maps for both arrays.\r\n  // so, both of them have to be unique, otherwise it will flattern result\r\n  const targetArrayMap = Object.create(null);\r\n  for (const item of sourceArray) {\r\n    targetArrayMap[targetKeySelector(item)] = item;\r\n  }\r\n\r\n  const sourceArrayMap = Object.create(null);\r\n  for (const item of sourceArray) {\r\n    sourceArrayMap[sourceKeySelector(item)] = item;\r\n  }\r\n\r\n  for (const sourceItemKey of Object.keys(sourceArrayMap)) {\r\n    const sourceItem = sourceArrayMap[sourceItemKey];\r\n    if (!targetArrayMap[sourceItemKey]) {\r\n      targetArray.push(sourceItem);\r\n    } else {\r\n      // merge properties in\r\n      Object.assign(targetArrayMap[sourceItemKey], sourceItem);\r\n    }\r\n  }\r\n\r\n  return targetArray;\r\n}\r\n","import { Selector, Predicate } from '../types';\r\nimport { fieldSelector } from '../_internals';\r\nimport { sum } from './stats';\r\n\r\n/**\r\n * Groups array items based on elementSelector function\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function groupBy(array: any[], groupByFields: string | string[] | Selector): any[] {\r\n  if (!Array.isArray(array)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!array.length) {\r\n    return array;\r\n  }\r\n\r\n  const groups: { [key: string]: any[] } = {};\r\n\r\n  const elementSelector = fieldSelector(groupByFields);\r\n\r\n  for (let i = 0; i < array.length; i++) {\r\n    const item = array[i];\r\n    const group = elementSelector(item);\r\n    groups[group] = groups[group] || [];\r\n    groups[group].push(item);\r\n  }\r\n\r\n  return Object.values(groups);\r\n}\r\n\r\n/**\r\n * Returns a distinct elements from array.\r\n * Optional parameter *elementSelector* will create new array based on a callback function,\r\n * then will eliminate dublicates\r\n * @param array\r\n * @param elementSelector\r\n * @returns\r\n */\r\nexport function distinct(array: any[], elementSelector?: Selector): any[] {\r\n  if (elementSelector) {\r\n    array = array.map(elementSelector);\r\n  }\r\n  return Array.from(new Set(array));\r\n}\r\n/**\r\n * Flatten Object or array of objects\r\n * Object \r\n * [{ a: 1, d:{d1: 22, d2: 33} }, { b: 2, d:{d1:221, d2:331} }]\r\n * will become\r\n * [{ a: 1, d.d1: 22, d.d2: 33 }, { b: 2, d.d1: 221, d.d2: 331 }]\r\n * @param data \r\n * @returns \r\n */\r\n\r\nexport function unflattenObject(data: any): any {\r\n\r\n\r\n  function setProperty(data: any, pName: string, value: any): any {\r\n    const pNames = pName.split('.')\r\n    let parent: any = data\r\n\r\n    for (let i = 0; i < pNames.length - 1; i++) {\r\n      if (pNames[i] in parent) {\r\n        parent = parent[pNames[i]]\r\n      } else {\r\n        parent[pNames[i]] = {}\r\n        parent = parent[pNames[i]]\r\n      }\r\n    }\r\n    parent[pNames[pNames.length - 1]] = value\r\n  }\r\n  \r\n  if (Array.isArray(data)) {\r\n    const arr = [];\r\n    for (let i = 0; i < data.length; i++) {\r\n      const obj = unflattenObject(data[i]);\r\n      arr.push(obj);\r\n    }\r\n    return arr;\r\n  } else {\r\n    const obj: any = {}\r\n    const keys = Object.keys(data);\r\n    for (let i = 0; i < keys.length; i++) {\r\n      setProperty(obj, keys[i], data[keys[i]])\r\n    }\r\n    return obj\r\n  }\r\n}\r\n\r\nexport function flattenObject(data: any): any {\r\n  if (!data || typeof data !== 'object') {\r\n    return data;\r\n  }\r\n\r\n  function iterate(rootData: any, obj: any, prefix: string): void {\r\n    const keys = Object.keys(rootData);\r\n\r\n    for (let i = 0; i < keys.length; i++) {\r\n      const pName = prefix ? `${prefix}.${keys[i]}` : keys[i];\r\n\r\n      const value = rootData[keys[i]];\r\n      if (\r\n        typeof value === 'object' &&\r\n        value !== null &&\r\n        value !== undefined &&\r\n        !(value instanceof Date)\r\n      ) {\r\n        iterate(value, obj, pName);\r\n      } else if (typeof value === 'function') {\r\n        continue;\r\n      } else {\r\n        obj[pName] = value;\r\n      }\r\n    }\r\n  }\r\n\r\n  if (Array.isArray(data)) {\r\n    const arr = [];\r\n    for (let i = 0; i < data.length; i++) {\r\n      const obj = flattenObject(data[i]);\r\n      arr.push(obj);\r\n    }\r\n    return arr;\r\n  } else {\r\n    const obj: any = {};\r\n\r\n    iterate(data, obj, '');\r\n\r\n    return obj;\r\n  }\r\n}\r\n\r\n/**\r\n * Flattens array.\r\n * @param array The array to flatten recursively.\r\n * @example\r\n * flatten([1, 4, [2, [5, 5, [9, 7]], 11], 0]); // length 9\r\n */\r\nexport function flatten(array: any[]): any[] {\r\n  if (!Array.isArray(array)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!array.length) {\r\n    return array;\r\n  }\r\n\r\n  let res: any = [];\r\n  const length = array.length;\r\n\r\n  for (let i = 0; i < length; i++) {\r\n    const value = array[i];\r\n    if (Array.isArray(value)) {\r\n      res = [...res, ...flatten(value)];\r\n    } else {\r\n      res.push(value);\r\n    }\r\n  }\r\n  return res;\r\n}\r\n\r\n/**\r\n * Returns a reshaped array based on unique column values.\r\n * @param array array to pivot\r\n * @param rowFields row fields (or index fields). It can be one or more field names\r\n * @param columnField a field which values will be used to create columns\r\n * @param dataField a dataField which will be aggrated with aggregate function and groupped by rows and columns\r\n * @param aggFunction an aggregation function. Default value is sum. data field will be aggregated by this function\r\n * @param columnValues an optional initial column values. Use it to define a set of columns/values you would expect\r\n */\r\nexport function pivot(\r\n  array: any,\r\n  rowFields: string | string[],\r\n  columnField: string,\r\n  dataField: string,\r\n  aggFunction?: (array: any[]) => any | null,\r\n  columnValues?: string[]\r\n): any[] {\r\n  if (!Array.isArray(array)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!array.length) {\r\n    return array;\r\n  }\r\n\r\n  const groups: { [key: string]: any[] } = Object.create(null);\r\n  columnValues = columnValues || [];\r\n  aggFunction = aggFunction || ((a: any[]): number | null => sum(a));\r\n\r\n  const elementSelector = fieldSelector(rowFields);\r\n\r\n  rowFields = Array.isArray(rowFields) ? rowFields : [rowFields];\r\n\r\n  // group by rows\r\n  for (let i = 0; i < array.length; i++) {\r\n    const item = array[i];\r\n    const group = elementSelector(item);\r\n    groups[group] = groups[group] || [];\r\n    groups[group].push(item);\r\n\r\n    // accumulate column values\r\n    const columnValue = item[columnField];\r\n    if (columnValues.indexOf(columnValue) < 0) {\r\n      columnValues.push(columnValue);\r\n    }\r\n  }\r\n\r\n  const result: any[] = [];\r\n  for (const groupName of Object.keys(groups)) {\r\n    const item = Object.create(null);\r\n    // row fields first\r\n    for (const rowField of rowFields) {\r\n      item[rowField] = groups[groupName][0][rowField];\r\n    }\r\n\r\n    // then aggregated data for each colum value\r\n    for (const columnValue of columnValues) {\r\n      const dataArray = groups[groupName]\r\n        .filter(r => r[columnField] === columnValue)\r\n        .map(r => r[dataField]);\r\n      item[columnValue] = aggFunction(dataArray);\r\n    }\r\n\r\n    result.push(item);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * Transpose rows to columns in an array\r\n * @param data\r\n */\r\nexport function transpose(data: any[]): any[] {\r\n  if (!Array.isArray(data)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!data.length) {\r\n    return data;\r\n  }\r\n\r\n  return Object.keys(data[0]).map(key => {\r\n    const res: { [key: string]: any } = {};\r\n    data.forEach((item, i) => {\r\n      if (i === 0) {\r\n        res.fieldName = key;\r\n      }\r\n\r\n      res['row' + i] = item[key];\r\n    });\r\n    return res;\r\n  });\r\n}\r\n\r\n/**\r\n * Creates new array based on selector.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function select(data: any[], selector: string | string[] | Selector): any[] {\r\n  if (!Array.isArray(data)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  if (!data.length) {\r\n    return data;\r\n  }\r\n  const elementSelector = fieldSelector(selector);\r\n  return data.map(elementSelector);\r\n}\r\n\r\n/**\r\n * Filters array based on predicate function.\r\n * @param array The array to process.\r\n * @param elementSelector Function invoked per iteration.\r\n */\r\nexport function where(data: any[], predicate: Predicate): any[] {\r\n  if (!Array.isArray(data)) {\r\n    throw Error('An array is not provided');\r\n  }\r\n\r\n  return data.filter(predicate);\r\n}\r\n","import {\r\n  sum,\r\n  avg,\r\n  count,\r\n  min,\r\n  max,\r\n  first,\r\n  last,\r\n  mean,\r\n  quantile,\r\n  variance,\r\n  median,\r\n  stdev\r\n} from './array/stats';\r\nimport {\r\n  Selector,\r\n  Predicate,\r\n  ParsingOptions,\r\n  FieldDescription,\r\n  PrimitiveType,\r\n  TableDto,\r\n  DataTypeName,\r\n  ScalarType\r\n} from './types';\r\nimport { parseCsv, fromTable, toTable, getFieldsInfo, toCsv, JSONParser } from './utils';\r\nimport {\r\n  leftJoin,\r\n  innerJoin,\r\n  fullJoin,\r\n  merge,\r\n  groupBy,\r\n  sort,\r\n  pivot,\r\n  transpose,\r\n  toObject,\r\n  toSeries,\r\n  flatten,\r\n  flattenObject,\r\n  unflattenObject\r\n} from './array';\r\n\r\nexport class DataPipe {\r\n  private data: any[];\r\n\r\n  constructor(data: any[] = []) {\r\n    this.data = data || [];\r\n  }\r\n\r\n  // input methods\r\n  fromCsv(content: string, options?: ParsingOptions): DataPipe {\r\n    this.data = parseCsv(content, options);\r\n    return this;\r\n  }\r\n\r\n  parseCsv(content: string, options?: ParsingOptions): DataPipe {\r\n    return this.fromCsv(content, options);\r\n  }\r\n\r\n  /**\r\n   * Loads dataPipe with Table information\r\n   * @param rowsOrTable a datarows with 2 dimentional arrays or entire table. If you provide rows, then you have to specify fieldNames\r\n   * @param fieldNames fieldNames what correspond to the rows\r\n   * @param fieldDataTypes  fieldNames what correspond to the rows\r\n   */\r\n  fromTable(\r\n    rowsOrTable: PrimitiveType[][] | TableDto,\r\n    fieldNames?: string[],\r\n    fieldDataTypes?: DataTypeName[]\r\n  ): DataPipe {\r\n    this.data = fromTable(rowsOrTable, fieldNames, fieldDataTypes);\r\n    return this;\r\n  }\r\n\r\n  // Output methods\r\n  /**\r\n   * Get pipes currrent array data.\r\n   */\r\n  toArray(): any[] {\r\n    return this.data;\r\n  }\r\n\r\n  /**\r\n   * Outputs Pipe value as CSV content\r\n   * @param delimiter\r\n   */\r\n  toCsv(delimiter = ','): string {\r\n    return toCsv(this.data, delimiter);\r\n  }\r\n\r\n  /**\r\n   * Outputs pipe value as JavaScript object.\r\n   * @param keyField a key selector represented as a string (field name) or array of stringa (fieldNames) or custom selectors\r\n   */\r\n  toObject(keyField: string | string[] | Selector<any, string>): Record<string, any> {\r\n    return toObject(this.data, keyField);\r\n  }\r\n\r\n  /**\r\n   * Convert array of items to into series array or series record.\r\n   * @param propertyName optional parameter to define a property to be unpacked.\r\n   * If it is string the array with values will be returned, otherwise an object with a list of series map\r\n   */\r\n  toSeries(propertyName?: string | string[]): Record<string, ScalarType[]> | ScalarType[] {\r\n    return toSeries(this.data, propertyName);\r\n  }\r\n\r\n  /**\r\n   * Gets table data from JSON type array.\r\n   */\r\n  toTable(): TableDto {\r\n    return toTable(this.data);\r\n  }\r\n  // end of output functions\r\n\r\n  /**\r\n   * This method allows you to examine a state of the data during pipe execution.\r\n   * @param dataFunc\r\n   */\r\n  tap(dataFunc: (d: any[]) => void): DataPipe {\r\n    if (typeof dataFunc === 'function') {\r\n      dataFunc(this.data);\r\n    }\r\n    return this;\r\n  }\r\n\r\n  // Aggregation Functions\r\n\r\n  /**\r\n   * Sum of items in array.\r\n   * @param elementSelector Function invoked per iteration.\r\n   * @example\r\n   * dataPipe([1, 2, 5]).sum(); // 8\r\n   *\r\n   * dataPipe([{ val: 1 }, { val: 5 }]).sum(i => i.val); // 6\r\n   */\r\n  sum(elementSelector?: Selector): number | null {\r\n    return sum(this.data, elementSelector);\r\n  }\r\n\r\n  /**\r\n   * Average of array items.\r\n   * @param elementSelector Function invoked per iteration.\r\n   * @example\r\n   * dataPipe([1, 5, 3]).avg(); // 3\r\n   */\r\n  avg(elementSelector?: Selector): number | null {\r\n    return avg(this.data, elementSelector);\r\n  }\r\n\r\n  average = this.avg.bind(this);\r\n\r\n  /**\r\n   * Count of elements in array.\r\n   * @param predicate Predicate function invoked per iteration.\r\n   */\r\n  count(predicate?: Predicate): number | null {\r\n    return count(this.data, predicate);\r\n  }\r\n\r\n  /**\r\n   * Computes the minimum value of array.\r\n   * @param elementSelector Function invoked per iteration.\r\n   */\r\n  min(elementSelector?: Selector): number | Date | null {\r\n    return min(this.data, elementSelector);\r\n  }\r\n\r\n  /**\r\n   * Computes the maximum value of array.\r\n   * @param elementSelector Function invoked per iteration.\r\n   */\r\n  max(elementSelector?: Selector): number | Date | null {\r\n    return max(this.data, elementSelector);\r\n  }\r\n\r\n  /**\r\n   * Gets first item in array satisfies predicate.\r\n   * @param predicate Predicate function invoked per iteration.\r\n   */\r\n  first(predicate?: Predicate): any | undefined {\r\n    return first(this.data, predicate);\r\n  }\r\n\r\n  /**\r\n   * Gets last item in array satisfies predicate.\r\n   * @param array The array to process.\r\n   * @param predicate Predicate function invoked per iteration.\r\n   */\r\n  last(predicate?: Predicate): any | undefined {\r\n    return last(this.data, predicate);\r\n  }\r\n\r\n  /**\r\n   * Get mean.\r\n   * @param field Property name or Selector function invoked per iteration.\r\n   */\r\n  mean(field?: Selector | string): number | null {\r\n    return mean(this.data, field);\r\n  }\r\n\r\n  /**\r\n   * Get quantile of a sorted array.\r\n   * @param field Property name or Selector function invoked per iteration.\r\n   * @param p quantile.\r\n   */\r\n  quantile(p: number, field?: Selector | string): number | null {\r\n    return quantile(this.data, p, field);\r\n  }\r\n\r\n  /**\r\n   * Get variance.\r\n   * @param field Property name or Selector function invoked per iteration.\r\n   */\r\n  variance(field?: Selector | string): number | null {\r\n    return variance(this.data, field);\r\n  }\r\n\r\n  /**\r\n   * Get the standard deviation.\r\n   * @param field Property name or Selector function invoked per iteration.\r\n   */\r\n  stdev(field?: Selector | string): number | null {\r\n    return stdev(this.data, field);\r\n  }\r\n\r\n  /**\r\n   * Get median.\r\n   * @param field Property name or Selector function invoked per iteration.\r\n   */\r\n  median(field?: Selector | string): number | null {\r\n    return median(this.data, field);\r\n  }\r\n\r\n  // Data Transformation functions\r\n  /**\r\n   * Groups array items based on elementSelector function\r\n   * @param elementSelector Function invoked per iteration.\r\n   */\r\n  groupBy(elementSelector: Selector): DataPipe {\r\n    this.data = groupBy(this.data, elementSelector);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Joins two arrays together by selecting elements that have matching values in both arrays\r\n   * @param rightArray array of elements to join\r\n   * @param leftKey left Key\r\n   * @param rightKey\r\n   * @param resultSelector\r\n   */\r\n  innerJoin(\r\n    rightArray: any[],\r\n    leftKey: string | string[] | Selector<any, string>,\r\n    rightKey: string | string[] | Selector<any, string>,\r\n    resultSelector: (leftItem: any, rightItem: any) => any\r\n  ): DataPipe {\r\n    this.data = innerJoin(this.data, rightArray, leftKey, rightKey, resultSelector);\r\n    return this;\r\n  }\r\n\r\n  leftJoin(\r\n    rightArray: any[],\r\n    leftKey: string | string[] | Selector<any, string>,\r\n    rightKey: string | string[] | Selector<any, string>,\r\n    resultSelector: (leftItem: any, rightItem: any) => any\r\n  ): DataPipe {\r\n    this.data = leftJoin(this.data, rightArray, leftKey, rightKey, resultSelector);\r\n    return this;\r\n  }\r\n\r\n  fullJoin(\r\n    rightArray: any[],\r\n    leftKey: string | string[] | Selector<any, string>,\r\n    rightKey: string | string[] | Selector<any, string>,\r\n    resultSelector: (leftItem: any, rightItem: any) => any\r\n  ): DataPipe {\r\n    this.data = fullJoin(this.data, rightArray, leftKey, rightKey, resultSelector);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Select data from array item.\r\n   * @param elementSelector Function invoked per iteration.\r\n   * @example\r\n   *\r\n   * dataPipe([{ val: 1 }, { val: 5 }]).select(i => i.val).toArray(); // [1, 5]\r\n   */\r\n  select(elementSelector: Selector): DataPipe {\r\n    this.data = this.data.map(elementSelector);\r\n    return this;\r\n  }\r\n\r\n  map = this.select.bind(this);\r\n\r\n  merge(\r\n    sourceArray: any[],\r\n    targetKey: string | string[] | Selector<any, string>,\r\n    sourceKey: string | string[] | Selector<any, string>\r\n  ): DataPipe {\r\n    this.data = merge(this.data, sourceArray, targetKey, sourceKey);\r\n    return this;\r\n  }\r\n\r\n  flattenObject(): any {\r\n    return flattenObject(this.data);\r\n  }\r\n\r\n  unflattenObject(): any {\r\n    return unflattenObject(this.data);\r\n  }\r\n\r\n  flatten(): any {\r\n    return flatten(this.data);\r\n  }\r\n\r\n  pivot(\r\n    rowFields: string | string[],\r\n    columnField: string,\r\n    dataField: string,\r\n    aggFunction?: (array: any[]) => any | null,\r\n    columnValues?: string[]\r\n  ): DataPipe {\r\n    this.data = pivot(this.data, rowFields, columnField, dataField, aggFunction, columnValues);\r\n    return this;\r\n  }\r\n\r\n  transpose(): DataPipe {\r\n    this.data = transpose(this.data) || [];\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Filters array of items.\r\n   * @param predicate Predicate function invoked per iteration.\r\n   */\r\n  where(predicate: Predicate): DataPipe {\r\n    this.data = this.data.filter(predicate);\r\n    return this;\r\n  }\r\n\r\n  filter = this.where.bind(this);\r\n\r\n  /**\r\n   * Get unique values\r\n   * @param elementSelector Function invoked per iteration.\r\n   */\r\n  unique(elementSelector?: Selector): DataPipe {\r\n    if (elementSelector) {\r\n      this.select(elementSelector);\r\n    }\r\n    this.data = Array.from(new Set(this.data));\r\n    return this;\r\n  }\r\n\r\n  distinct = this.unique.bind(this);\r\n\r\n  /**\r\n   * Sort array.\r\n   * @param fields sorts order.\r\n   * @example\r\n   * dp.sort('name ASC', 'age DESC');\r\n   */\r\n  sort(...fields: string[]): DataPipe {\r\n    sort(this.data, ...fields);\r\n    return this;\r\n  }\r\n\r\n  // end of transformation functions\r\n\r\n  /**\r\n   * generates a field descriptions (first level only) that can be used for relational table definition.\r\n   * if any properties are Objects, it would use JSON.stringify to calculate maxSize field.\r\n   */\r\n  getFieldsInfo(): FieldDescription[] {\r\n    return getFieldsInfo(this.data);\r\n  }\r\n\r\n  JSONParser(): JSONParser {\r\n    return new JSONParser();\r\n  }\r\n}\r\n","import { DataPipe } from './data-pipe';\r\n\r\nexport * from './types';\r\n\r\n/**\r\n * Data Pipeline factory function what creates DataPipe\r\n * @param data Initial array\r\n *\r\n * @example\r\n * dataPipe([1, 2, 3])\r\n */\r\nexport function dataPipe(data?: any[]): DataPipe {\r\n  data = data || [];\r\n  return new DataPipe(data);\r\n}\r\n"],"names":["fieldSelector"],"mappings":"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"}