{"version":3,"file":"csv.cjs","sources":["../../../src/utils/csv.ts"],"sourcesContent":["// Libraries\nimport { defaults, isObject } from 'lodash';\nimport Papa, { ParseConfig, Parser, ParseResult } from 'papaparse';\n\n// Types\nimport { MutableDataFrame } from '../dataframe/MutableDataFrame';\nimport { guessFieldTypeFromValue } from '../dataframe/processDataFrame';\nimport { getFieldDisplayName } from '../field/fieldState';\nimport { DataFrame, Field, FieldConfig, FieldType } from '../types/dataFrame';\nimport { formattedValueToString } from '../valueFormats/valueFormats';\n\nexport enum CSVHeaderStyle {\n  full,\n  name,\n  none,\n}\n\n// Subset of all parse options\nexport interface CSVConfig {\n  delimiter?: string; // default: \",\"\n  newline?: string; // default: \"\\r\\n\"\n  quoteChar?: string; // default: '\"'\n  encoding?: string; // default: \"\",\n  useExcelHeader?: boolean; // default: false\n  headerStyle?: CSVHeaderStyle;\n}\n\nexport interface CSVParseCallbacks {\n  /**\n   * Get a callback before any rows are processed\n   * This can return a modified table to force any\n   * Column configurations\n   */\n  onHeader: (fields: Field[]) => void;\n\n  // Called after each row is read\n  onRow: (row: string[]) => void;\n}\n\nexport interface CSVOptions {\n  config?: CSVConfig;\n  callback?: CSVParseCallbacks;\n}\n\nexport function readCSV(csv: string, options?: CSVOptions): DataFrame[] {\n  return new CSVReader(options).readCSV(csv);\n}\n\nenum ParseState {\n  Starting,\n  InHeader,\n  ReadingRows,\n}\n\nexport class CSVReader {\n  config: CSVConfig;\n  callback?: CSVParseCallbacks;\n\n  state: ParseState;\n  data: MutableDataFrame[];\n  current: MutableDataFrame;\n\n  constructor(options?: CSVOptions) {\n    if (!options) {\n      options = {};\n    }\n    this.config = options.config || {};\n    this.callback = options.callback;\n\n    this.current = new MutableDataFrame({ fields: [] });\n    this.state = ParseState.Starting;\n    this.data = [];\n  }\n\n  // PapaParse callback on each line\n  private chunk = (results: ParseResult<string[]>, parser: Parser): void => {\n    for (let i = 0; i < results.data.length; i++) {\n      const line = results.data[i];\n      if (line.length < 1) {\n        continue;\n      }\n      const first = line[0]; // null or value, papaparse does not return ''\n      if (first) {\n        // Comment or header queue\n        if (first.startsWith('#')) {\n          // Look for special header column\n          // #{columkey}#a,b,c\n          const idx = first.indexOf('#', 2);\n          if (idx > 0) {\n            const k = first.slice(1, idx);\n            const isName = 'name' === k;\n\n            // Simple object used to check if headers match\n            const headerKeys: FieldConfig = {\n              unit: '#',\n            };\n\n            // Check if it is a known/supported column\n            if (isName || headerKeys.hasOwnProperty(k)) {\n              // Starting a new table after reading rows\n              if (this.state === ParseState.ReadingRows) {\n                this.current = new MutableDataFrame({ fields: [] });\n                this.data.push(this.current);\n              }\n\n              const v = first.slice(idx + 1);\n              if (isName) {\n                this.current.addFieldFor(undefined, v);\n                for (let j = 1; j < line.length; j++) {\n                  this.current.addFieldFor(undefined, line[j]);\n                }\n              } else {\n                const { fields } = this.current;\n                for (let j = 0; j < fields.length; j++) {\n                  if (!fields[j].config) {\n                    fields[j].config = {};\n                  }\n                  const disp: any = fields[j].config; // any lets name lookup\n                  disp[k] = j === 0 ? v : line[j];\n                }\n              }\n\n              this.state = ParseState.InHeader;\n              continue;\n            }\n          } else if (this.state === ParseState.Starting) {\n            this.state = ParseState.InHeader;\n            continue;\n          }\n          // Ignore comment lines\n          continue;\n        }\n\n        if (this.state === ParseState.Starting) {\n          const type = guessFieldTypeFromValue(first);\n          if (type === FieldType.string) {\n            for (const s of line) {\n              this.current.addFieldFor(undefined, s);\n            }\n            this.state = ParseState.InHeader;\n            continue;\n          }\n          this.state = ParseState.InHeader; // fall through to read rows\n        }\n      }\n\n      // Add the current results to the data\n      if (this.state !== ParseState.ReadingRows) {\n        // anything???\n      }\n\n      this.state = ParseState.ReadingRows;\n\n      // Make sure column structure is valid\n      if (line.length > this.current.fields.length) {\n        const { fields } = this.current;\n        for (let f = fields.length; f < line.length; f++) {\n          this.current.addFieldFor(line[f]);\n        }\n        if (this.callback) {\n          this.callback.onHeader(this.current.fields);\n        }\n      }\n\n      this.current.appendRow(line);\n      if (this.callback) {\n        // // Send the header after we guess the type\n        // if (this.series.rows.length === 0) {\n        //   this.callback.onHeader(this.series);\n        // }\n        this.callback.onRow(line);\n      }\n    }\n  };\n\n  readCSV(text: string): MutableDataFrame[] {\n    this.current = new MutableDataFrame({ fields: [] });\n    this.data = [this.current];\n\n    const papacfg = {\n      ...this.config,\n      dynamicTyping: false,\n      skipEmptyLines: true,\n      comments: false, // Keep comment lines\n      chunk: this.chunk,\n    } as ParseConfig;\n\n    Papa.parse(text, papacfg);\n\n    return this.data;\n  }\n}\n\ntype FieldWriter = (value: unknown) => string;\n\nfunction writeValue(value: unknown, config: CSVConfig): string {\n  if (value === null || value === undefined) {\n    return '';\n  }\n  const str = value.toString();\n  if (str.includes('\"')) {\n    // Escape the double quote characters\n    return config.quoteChar + str.replace(/\"/gi, '\"\"') + config.quoteChar;\n  }\n  if (str.includes('\\n') || (config.delimiter && str.includes(config.delimiter))) {\n    return config.quoteChar + str + config.quoteChar;\n  }\n  return str;\n}\n\nfunction makeFieldWriter(field: Field, config: CSVConfig): FieldWriter {\n  if (field.display) {\n    return (value: unknown) => {\n      const displayValue = field.display!(value);\n      return writeValue(formattedValueToString(displayValue), config);\n    };\n  }\n\n  return (value: unknown) => writeValue(value, config);\n}\n\nfunction getHeaderLine(key: string, fields: Field[], config: CSVConfig): string {\n  const isName = 'name' === key;\n  const isType = 'type' === key;\n\n  for (const f of fields) {\n    const display = f.config;\n    if (isName || isType || (display && display.hasOwnProperty(key))) {\n      let line = '#' + key + '#';\n      for (let i = 0; i < fields.length; i++) {\n        if (i > 0) {\n          line = line + config.delimiter;\n        }\n\n        let v = fields[i].name;\n        if (isType) {\n          v = fields[i].type;\n        } else if (isName) {\n          // already name\n        } else {\n          v = (fields[i].config as any)[key];\n        }\n        if (v) {\n          line = line + writeValue(v, config);\n        }\n      }\n      return line + config.newline;\n    }\n  }\n  return '';\n}\n\nfunction getLocaleDelimiter(): string {\n  const arr = ['x', 'y'];\n  if (arr.toLocaleString) {\n    return arr.toLocaleString().charAt(1);\n  }\n  return ',';\n}\n\nexport function toCSV(data: DataFrame[], config?: CSVConfig): string {\n  if (!data) {\n    return '';\n  }\n\n  data = expandNestedFrames(data);\n\n  config = defaults(config, {\n    delimiter: getLocaleDelimiter(),\n    newline: '\\r\\n',\n    quoteChar: '\"',\n    encoding: '',\n    headerStyle: CSVHeaderStyle.name,\n    useExcelHeader: false,\n  });\n  let csv = config.useExcelHeader ? `sep=${config.delimiter}${config.newline}` : '';\n\n  for (let s = 0; s < data.length; s++) {\n    const series = data[s];\n    const { fields } = series;\n\n    // ignore frames with no fields\n    if (fields.length === 0) {\n      continue;\n    }\n\n    if (config.headerStyle === CSVHeaderStyle.full) {\n      csv =\n        csv +\n        getHeaderLine('name', fields, config) +\n        getHeaderLine('type', fields, config) +\n        getHeaderLine('unit', fields, config) +\n        getHeaderLine('dateFormat', fields, config);\n    } else if (config.headerStyle === CSVHeaderStyle.name) {\n      for (let i = 0; i < fields.length; i++) {\n        if (i > 0) {\n          csv += config.delimiter;\n        }\n        csv += `\"${getFieldDisplayName(fields[i], series).replace(/\"/g, '\"\"')}\"`;\n      }\n      csv += config.newline;\n    }\n\n    const length = fields[0].values.length;\n\n    if (length > 0) {\n      const writers = fields.map((field) => makeFieldWriter(field, config!));\n      for (let i = 0; i < length; i++) {\n        for (let j = 0; j < fields.length; j++) {\n          if (j > 0) {\n            csv += config.delimiter;\n          }\n\n          let v = fields[j].values[i];\n\n          if (v !== null) {\n            // For FieldType frame, use value if it exists to prevent exporting [object object]\n            if (fields[j].type === FieldType.frame && 'value' in v) {\n              v = v.value;\n            }\n\n            if (fields[j].type === FieldType.other && isObject(v)) {\n              v = JSON.stringify(v);\n            }\n\n            csv += writers[j](v);\n          }\n        }\n\n        if (i !== length - 1) {\n          csv += config.newline;\n        }\n      }\n    }\n\n    if (s !== data.length - 1) {\n      csv = csv + config.newline;\n    }\n  }\n\n  return csv;\n}\n\nfunction expandNestedFrames(data: DataFrame[]): DataFrame[] {\n  const expanded: DataFrame[] = [];\n\n  for (const series of data) {\n    const nestedField = series.fields.find((field) => field.type === FieldType.nestedFrames);\n    if (!nestedField) {\n      expanded.push(series);\n      continue;\n    }\n\n    const parentFields = series.fields.filter((field) => field !== nestedField);\n    const childFields = getFirstNestedFields(nestedField.values);\n    const flattenedFields = [...parentFields, ...childFields].map((field) => ({\n      ...field,\n      values: field.values.slice(0, 0),\n    }));\n\n    const parentFieldCount = parentFields.length;\n    const childFieldCount = childFields.length;\n\n    const pushRow = (parentValues: unknown[], childValues: unknown[]) => {\n      for (let i = 0; i < flattenedFields.length; i++) {\n        const value = i < parentFieldCount ? parentValues[i] : childValues[i - parentFieldCount];\n        flattenedFields[i].values.push(value);\n      }\n    };\n\n    for (let rowIndex = 0; rowIndex < series.length; rowIndex++) {\n      const parentValues = parentFields.map((field) => field.values[rowIndex]);\n      const nestedFrames = nestedField.values[rowIndex] ?? [];\n      let addedChildRow = false;\n\n      for (const childFrame of nestedFrames) {\n        if (!childFrame || childFrame.length === 0 || childFieldCount === 0) {\n          continue;\n        }\n\n        const fieldIndexByName = new Map(childFrame.fields.map((field: Field, index: number) => [field.name, index]));\n        for (let childRowIndex = 0; childRowIndex < childFrame.length; childRowIndex++) {\n          const childValues = childFields.map((field) => {\n            const fieldIndex = fieldIndexByName.get(field.name);\n            if (fieldIndex === undefined || typeof fieldIndex !== 'number') {\n              return null;\n            }\n            const fieldValue = childFrame.fields[fieldIndex].values[childRowIndex];\n            if (fieldValue === undefined || fieldValue === null) {\n              return null;\n            }\n            return fieldValue;\n          });\n\n          pushRow(parentValues, childValues);\n          addedChildRow = true;\n        }\n      }\n\n      if (!addedChildRow) {\n        pushRow(parentValues, new Array(childFieldCount).fill(null));\n      }\n    }\n\n    const length = flattenedFields[0]?.values.length ?? 0;\n    expanded.push({\n      ...series,\n      fields: flattenedFields,\n      length,\n    });\n  }\n\n  return expanded;\n}\n\nfunction getFirstNestedFields(values: Array<DataFrame[] | undefined>): Field[] {\n  for (const nestedFrames of values) {\n    for (const nestedFrame of nestedFrames ?? []) {\n      if (nestedFrame.fields.length > 0) {\n        return nestedFrame.fields;\n      }\n    }\n  }\n\n  return [];\n}\n"],"names":["CSVHeaderStyle","ParseState","MutableDataFrame","guessFieldTypeFromValue","FieldType","Papa","formattedValueToString","defaults","getFieldDisplayName","isObject"],"mappings":"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"}