{"version":3,"file":"index.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"],"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"],"names":[],"mappings":"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"}