{"version":3,"sources":["../src/index.ts","../src/Types.ts","../src/utils.ts","../src/date-formatter.ts","../src/float-formatter.ts","../src/integer-formatter.ts","../src/string-formatter.ts","../src/Errors.ts","../src/field-formatter.ts","../src/flat-file-reader.ts","../src/file-append-promise.ts","../src/row-formatter.ts","../src/get-async-flat-file-creator.ts"],"sourcesContent":["import * as Types from './Types.js'\nimport fieldFormatter from './field-formatter.js'\nimport {\n  getAsyncFlatFileReader,\n  linesToData,\n  parseLine,\n} from './flat-file-reader.js'\nimport {\n  dataToLines,\n  getAsyncFlatFileCreator,\n} from './get-async-flat-file-creator.js'\nimport rowFormatter from './row-formatter.js'\n\nexport {\n  Types,\n  dataToLines,\n  fieldFormatter,\n  getAsyncFlatFileCreator,\n  getAsyncFlatFileReader,\n  linesToData,\n  parseLine,\n  rowFormatter,\n}\n","import lodash from 'lodash'\nimport moment from 'moment'\nimport { isNumeric } from './utils.js'\n\ntype Moment = ReturnType<typeof moment>\n// Export Moment type for downstream convenience\nexport { Moment }\n\n// Options to be used to configure the file creator instance as a whole\nexport interface ReadOptions {\n  /**\n   * Defines the terminator character of each line\n   * @default ''\n   */\n  rowEnd?: string\n\n  /**\n   * It's relative to the file encoding provided by the fs node module\n   * @default 'utf8'\n   */\n  encoding?: BufferEncoding\n\n  /**\n   * If true, throw errors when data structure errors are encountered (such as inconsistent line\n   * length or mismatched input or output data). If false errors are simply swallowed.\n   * @default true\n   */\n  throwErrors?: boolean\n}\nexport interface WriteOptions extends ReadOptions {\n  /**\n   * It's relative to the file save mode provided by the fs node module\n   * @default 0o666\n   */\n  mode?: number\n\n  /**\n   * It's relative to the file save flag provided by the fs node module\n   * @default 'a'\n   */\n  flag?: string\n}\n\n// Runtime data representing values to be written to the file\nexport type StringFieldValue = string | null | undefined\nexport type IntegerFieldValue = number | null | undefined\nexport type FloatFieldValue = number | null | undefined\nexport type DateFieldValue = Date | Moment | string | null | undefined\nexport type FieldValue =\n  | StringFieldValue\n  | IntegerFieldValue\n  | FloatFieldValue\n  | DateFieldValue\nexport type RowData<T> = { [fieldName in keyof T]: FieldValue }\n\n// FieldSpec is a discriminated union of all possible field spec types\n// Here, we make 'type' optional since field specs default to string-type\nexport type FieldSpec =\n  | StringFieldSpec\n  | FloatFieldSpec\n  | IntegerFieldSpec\n  | DateFieldSpec\n\n// String field parameters\nexport type StringFieldSpec = CommonSpec & {\n  /**\n   * Type is option for string fields because when type is not specified we default to 'string'\n   */\n  type?: 'string'\n\n  /**\n   * If the field has a set list of values, you can specify them using the 'enum' key. Since\n   * upstream providers may implement various key-value paradigms, this field is an arbitrary map\n   * of string keys to string values, as opposed to an array of fields. For example:\n   *\n   * {\n   *   \"01\": \"received\",\n   *   \"02\": \"fulfilled\",\n   *   \"03\": \"rejected\",\n   * }\n   */\n  enum?: { [serializedKey: string]: string }\n\n  /**\n   * Whether or not to trim whitespace from the value\n   * @default true\n   */\n  preserveEmptySpace?: boolean\n\n  /**\n   * If true, any values that are not string types will throw an exception\n   */\n  straight?: boolean\n\n  /**\n   * If provided, this value is used as the default value when no value is provided in the data.\n   * If not provided, failure to provide a value for this field will result in an exception unless\n   * `options.throwErrors` is set to false.\n   */\n  default?: string | null\n}\n\n// Integer fields - there are no additional parameters\nexport type IntegerFieldSpec = CommonSpec & {\n  type: 'integer'\n\n  /**\n   * If provided, this value is used as the default value when no value is provided in the data.\n   * If not provided, failure to provide a value for this field will result in an exception unless\n   * `options.throwErrors` is set to false.\n   */\n  default?: number | null\n}\n\n// Float field parameters\nexport type FloatFieldSpec = CommonSpec & {\n  type: 'float'\n\n  /**\n   * When `dotNotation` is true, represents the number of digits to the right of the decimal\n   * point. When `dotNotation` is false, defines the multiplication factor used to obtain the\n   * integer value of the number (see `dotNotation` below).\n   */\n  precision?: number\n\n  /**\n   * When false, number is represented as an integer by multiplying by 10^[precision]. For\n   * example, if precision is 4, then the value `156.34235568183` would be represented as\n   * the integer `1563424`.\n   */\n  dotNotation?: boolean\n\n  /**\n   * If provided, this value is used as the default value when no value is provided in the data.\n   * If not provided, failure to provide a value for this field will result in an exception unless\n   * `options.throwErrors` is set to false.\n   */\n  default?: number | null\n}\n\n// Date field parameters\nexport type DateFieldSpec = CommonSpec & {\n  type: 'date'\n  format?: {\n    /**\n     * Use UTC for times\n     * @default false\n     */\n    utc?: boolean\n\n    /**\n     * Specify an arbitrary date format (see [`moment`](https://momentjs.com/docs/#/displaying/))\n     * @default ISO format\n     */\n    dateFormat?: string\n  }\n\n  /**\n   * If provided, this value is used as the default value when no value is provided in the data.\n   * If not provided, failure to provide a value for this field will result in an exception unless\n   * `options.throwErrors` is set to false.\n   */\n  default?: Date | Moment | string | null\n}\n\ndeclare type CommonSpec = {\n  /**\n   * This attribute is the reference to the name of the attribute that must be present in the\n   * dataset that will be passed to the generated function to process the value and position it\n   * in the desired point in the file\n   */\n  name: string\n\n  /**\n   * The total dimension that the field will have in the generated file;\n   */\n  size: number\n\n  /**\n   * Whether padding for this field should be at the beginning or the end\n   * @default 'end' for string and date fields, 'start' for number fields\n   */\n  paddingPosition?: 'start' | 'end'\n\n  /**\n   * What character should be used as padding\n   * @default ' ' (space)\n   */\n  paddingSymbol?: string\n\n  /**\n   * An optional description of the field. This can be used both for in-line\n   * documentation/reference and also to produce better error messages.\n   */\n  desc?: string\n}\n\n// This overloaded method is used to assert that the given field spec is of the given type\nexport function assertFieldSpec(\n  spec: any,\n  type: 'string'\n): asserts spec is StringFieldSpec\nexport function assertFieldSpec(\n  spec: any,\n  type: 'integer'\n): asserts spec is IntegerFieldSpec\nexport function assertFieldSpec(\n  spec: any,\n  type: 'float'\n): asserts spec is FloatFieldSpec\nexport function assertFieldSpec(\n  spec: any,\n  type: 'date'\n): asserts spec is DateFieldSpec\nexport function assertFieldSpec(spec: any): asserts spec is FieldSpec\nexport function assertFieldSpec(\n  spec: any,\n  type?: string\n): asserts spec is FieldSpec {\n  if (!spec) {\n    throw new Error('map is null or undefined')\n  }\n  if (typeof spec !== 'object') {\n    throw new Error('map is not an object')\n  }\n  if (lodash.isEmpty(spec)) {\n    throw new Error('map object is empty')\n  }\n  if (typeof spec.name === 'undefined') {\n    throw new Error('map field name is required')\n  }\n  if (typeof spec.size === 'undefined') {\n    throw new Error('map size is required')\n  }\n  if (spec.size <= 0) {\n    throw new Error('map size must be greater than 0')\n  }\n  if (isNumeric(spec.type)) {\n    throw new Error(`map field [${spec.name}] type not could be numeric`)\n  }\n  if (type) {\n    if (type !== spec.type) {\n      throw new Error(\n        `map field [${spec.name}] is for ${spec.type}, not the required ${type}`\n      )\n    }\n    if (type === 'float' && typeof spec.precision === 'undefined') {\n      throw new Error('float precision must be specified')\n    }\n  }\n}\n","export function isNumeric(n: any): n is number {\n  return !isNaN(parseFloat(n)) && isFinite(n)\n}\n\nexport const checkValidPaddingPosition = (paddingPosition: 'start' | 'end') => {\n  if (!['start', 'end'].includes(paddingPosition)) {\n    throw new Error(`padding position \"${paddingPosition}\" not allowed`)\n  }\n  return paddingPosition\n}\n\nexport const getPaddingPositionOrDef = (\n  paddingPosition: 'start' | 'end' | undefined | null,\n  def: 'start' | 'end'\n) => checkValidPaddingPosition(paddingPosition ? paddingPosition : def)\n\nexport const checkValidSymbol = (sym: string) => {\n  if (sym.length > 1) {\n    throw new Error('paddingSymbol cannot have length > 1')\n  }\n  return sym\n}\n\nexport const getPaddingSymbol = (sym: string | undefined | null) =>\n  checkValidSymbol(sym || ' ')\n\nexport const getFillStringOfSymbol = (sym: string) => (length: number) => {\n  return length > 0 ? sym.repeat(length) : ''\n}\n\nexport const getPadder =\n  (position: 'start' | 'end') => (str: string, fill: string) => {\n    return position === 'start' ? fill + str : str + fill\n  }\n","import _ from 'lodash'\nimport moment from 'moment'\nimport { DateFieldSpec, DateFieldValue, assertFieldSpec } from './Types.js'\nimport {\n  getFillStringOfSymbol,\n  getPadder,\n  getPaddingPositionOrDef,\n  getPaddingSymbol,\n} from './utils.js'\n\nconst paddingDefault = 'end'\nconst defaultFormat = {\n  utc: false,\n}\n\nconst getFormattedDateString = (\n  date: Date | moment.Moment | string,\n  opts: Partial<NonNullable<DateFieldSpec['format']>>\n) => {\n  const base = moment(date)\n  if (!base.isValid()) {\n    throw new Error(`Invalid date ${date}`)\n  }\n  const convention = opts.utc ? base.utc() : base\n  if (!opts.dateFormat) {\n    return convention.toISOString()\n  }\n  return convention.format(opts.dateFormat)\n}\n\nfunction assertDateFieldValue(\n  d: any,\n  fieldName: string\n): asserts d is DateFieldValue {\n  if (\n    d !== null &&\n    typeof d !== 'undefined' &&\n    typeof d !== 'string' &&\n    typeof d.toISOString === 'undefined' &&\n    typeof d.year === 'undefined'\n  ) {\n    throw new Error(\n      `Value for date field ${fieldName} must be a date or a string representation of a date`\n    )\n  }\n}\n\nconst dateFormatter = (map: DateFieldSpec, data: DateFieldValue) => {\n  assertFieldSpec(map)\n\n  // If the data is null or undefined and has a default value defined, use that, otherwise set\n  // to incoming data\n  data = data === undefined || data === null ? map.default : data\n\n  let resDate: string\n\n  if (data === undefined) {\n    throw new Error('No value supplied and no default set')\n  } else if (data === null) {\n    resDate = ''\n  } else {\n    assertDateFieldValue(data, map.name)\n\n    const format = { ...defaultFormat, ...map.format }\n    resDate = data ? getFormattedDateString(data, format) : ''\n\n    if (_.size(resDate) > map.size) {\n      throw new Error(`Date ${resDate} exceed size ${map.size}`)\n    }\n  }\n\n  return getPadder(\n    getPaddingPositionOrDef(map.paddingPosition, paddingDefault)\n  )(\n    resDate,\n    getFillStringOfSymbol(getPaddingSymbol(map.paddingSymbol))(\n      map.size - _.size(resDate)\n    )\n  )\n}\n\nexport default dateFormatter\n","import lodash from 'lodash'\nimport { FloatFieldSpec, FloatFieldValue, assertFieldSpec } from './Types.js'\nimport {\n  getFillStringOfSymbol,\n  getPadder,\n  getPaddingPositionOrDef,\n  getPaddingSymbol,\n  isNumeric,\n} from './utils.js'\n\nconst paddingDefault = 'start'\n\nconst floatFormatter = (map: FloatFieldSpec, data: FloatFieldValue = null) => {\n  assertFieldSpec(map, 'float')\n\n  // If the data is null or undefined and has a default value defined, use that, otherwise set\n  // to incoming data\n  data = data === undefined || data === null ? map.default : data\n\n  let str: string\n\n  if (data === undefined) {\n    throw new Error('No value supplied and no default set')\n  } else if (data === null) {\n    str = ''\n  } else {\n    // Make sure value is numeric and then coerce it into an official Number type\n    if (!isNumeric(data)) {\n      throw new Error(`field [${map.name}] has not compatible type`)\n    }\n    const num = Number(data)\n\n    // Format it according to the options passed\n    const precision = !map.precision ? 0 : map.precision\n    if (map.dotNotation) {\n      str = num.toFixed(precision).toString()\n    } else {\n      str = Math.trunc(num * Math.pow(10, precision)).toString()\n    }\n\n    // Make sure it fits\n    if (lodash.size(str) > map.size) {\n      throw new Error(`Value ${str} exceed size ${map.size}`)\n    }\n  }\n\n  return getPadder(\n    getPaddingPositionOrDef(map.paddingPosition, paddingDefault)\n  )(\n    str,\n    getFillStringOfSymbol(getPaddingSymbol(map.paddingSymbol))(\n      map.size - lodash.size(str)\n    )\n  )\n}\n\nexport default floatFormatter\n","import lodash from 'lodash'\nimport {\n  IntegerFieldSpec,\n  IntegerFieldValue,\n  assertFieldSpec,\n} from './Types.js'\nimport {\n  getFillStringOfSymbol,\n  getPadder,\n  getPaddingPositionOrDef,\n  getPaddingSymbol,\n  isNumeric,\n} from './utils.js'\n\nconst paddingDefault = 'start'\n\nconst integerFormatter = (\n  map: IntegerFieldSpec,\n  data: IntegerFieldValue = null\n) => {\n  assertFieldSpec(map, 'integer')\n\n  // If the data is null or undefined and has a default value defined, use that, otherwise set\n  // to incoming data\n  data = data === undefined || data === null ? map.default : data\n\n  let num: string\n\n  if (data === undefined) {\n    throw new Error('No value supplied and no default set')\n  } else if (data === null) {\n    num = ''\n  } else {\n    if (!isNumeric(data)) {\n      throw new Error('field has not compatible type')\n    }\n    num = Math.round(data).toString()\n    if (lodash.size(num) > map.size) {\n      throw new Error(`Value ${num} exceed size ${map.size}`)\n    }\n  }\n\n  return getPadder(\n    getPaddingPositionOrDef(map.paddingPosition, paddingDefault)\n  )(\n    num,\n    getFillStringOfSymbol(getPaddingSymbol(map.paddingSymbol))(\n      map.size - lodash.size(num)\n    )\n  )\n}\n\nexport default integerFormatter\n","import lodash from 'lodash'\nimport { FlatFileEnumError } from './Errors.js'\nimport { StringFieldSpec, StringFieldValue, assertFieldSpec } from './Types.js'\nimport {\n  getFillStringOfSymbol,\n  getPadder,\n  getPaddingPositionOrDef,\n  getPaddingSymbol,\n  isNumeric,\n} from './utils.js'\n\nconst paddingDefault = 'end'\n\nconst stringFormatter = (map: StringFieldSpec, data: StringFieldValue) => {\n  assertFieldSpec(map, 'string')\n  if (map.straight && isNumeric(data)) {\n    throw new Error('field has not compatible type')\n  }\n\n  // If the data is null or undefined and has a default value defined, use that, otherwise set\n  // to incoming data\n  data = data === undefined || data === null ? map.default : data\n\n  let str: string\n\n  if (data === undefined) {\n    throw new Error('No value supplied and no default set')\n  } else if (data === null) {\n    str = ''\n  } else {\n    str = data\n    // If we don't want to preserve white space, trim it now\n    if (!map.preserveEmptySpace) {\n      str = str.trim()\n    }\n\n    // If this is an enum field, convert the value to serialized form\n    if (map.enum !== undefined) {\n      // If we find the string in the values of the enum, convert it to a key\n      let i = Object.values(map.enum).indexOf(str)\n      if (i > -1) {\n        str = Object.keys(map.enum)[i]\n      } else {\n        // Otherwise, check to see if it's among the keys of the enum\n        i = Object.keys(map.enum).indexOf(str)\n        if (i === -1) {\n          // If not, throw an exception\n          throw new FlatFileEnumError(\n            `Value for field '${\n              map.name\n            }' should have been one of the accepted values [\"${Object.values(\n              map.enum\n            ).join('\", \"')}\"]${\n              typeof map.default !== 'undefined' && map.default === null\n                ? ' or null'\n                : ''\n            }, but you passed '${str}'`,\n            map.name\n          )\n        }\n      }\n    }\n\n    // Make sure it fits\n    if (str.length > map.size) {\n      throw new Error(`Value ${str} exceed size ${map.size}`)\n    }\n  }\n\n  return getPadder(\n    getPaddingPositionOrDef(map.paddingPosition, paddingDefault)\n  )(\n    str.substring(0, map.size),\n    getFillStringOfSymbol(getPaddingSymbol(map.paddingSymbol))(\n      map.size - lodash.size(str)\n    )\n  )\n}\n\nexport default stringFormatter\n","export class FlatFileError extends Error implements NodeJS.ErrnoException {\n  public readonly code: string\n  public constructor(msg: string, code?: string) {\n    super(msg)\n    this.code = 'ER_FLAT_FILE' + (code ? `_${code}` : '')\n  }\n}\n\nexport class FlatFileReadLineError extends FlatFileError {\n  public constructor(\n    msg: string,\n    public readonly lineData: string\n  ) {\n    super(msg, 'READ_LINE')\n  }\n}\n\nexport class FlatFileReadFieldTypeError extends FlatFileError {\n  public constructor(\n    msg: string,\n    public readonly fieldName: string\n  ) {\n    super(msg, 'READ_FIELD_TYPE')\n  }\n}\n\nexport class FlatFileEnumError extends FlatFileError {\n  public constructor(\n    msg: string,\n    public readonly fieldName: string\n  ) {\n    super(msg, 'BAD_ENUM')\n  }\n}\n","import {\n  DateFieldValue,\n  FieldSpec,\n  FloatFieldValue,\n  IntegerFieldValue,\n  RowData,\n  StringFieldSpec,\n  StringFieldValue,\n  assertFieldSpec,\n} from './Types.js'\nimport dateFormatter from './date-formatter.js'\nimport floatFormatter from './float-formatter.js'\nimport integerFormatter from './integer-formatter.js'\nimport stringFormatter from './string-formatter.js'\n\nconst fieldFormatter = <T>(map: FieldSpec, data: RowData<T>) => {\n  try {\n    assertFieldSpec(map)\n    const fieldName = <keyof T>map.name\n    switch (map.type) {\n      case 'string':\n        return stringFormatter(map, <StringFieldValue>data[fieldName])\n      case 'integer':\n        return integerFormatter(map, <IntegerFieldValue>data[fieldName])\n      case 'float':\n        return floatFormatter(map, <FloatFieldValue>data[fieldName])\n      case 'date':\n        return dateFormatter(map, <DateFieldValue>data[fieldName])\n      case undefined:\n        return stringFormatter(\n          { ...(map as StringFieldSpec), type: 'string' },\n          <StringFieldValue>data[fieldName]\n        )\n      default:\n        throw new Error('required field type is not present')\n    }\n  } catch (e) {\n    if (map) {\n      e.message =\n        `Field ${map.name}: ${e.message} ` +\n        `(data: ${data ? `'${data[<keyof T>map.name]}'` : 'unknown'})`\n    }\n    throw e\n  }\n}\n\nexport default fieldFormatter\n","import moment from 'moment'\nimport fs from 'node:fs'\nimport {\n  FlatFileEnumError,\n  FlatFileReadFieldTypeError,\n  FlatFileReadLineError,\n} from './Errors.js'\nimport { FieldSpec, ReadOptions } from './Types.js'\n\n// Return a function that can read a flat based on the given spec\nexport const getAsyncFlatFileReader = <T = unknown>(\n  fields: Array<FieldSpec>,\n  options: Partial<ReadOptions> = {}\n) => {\n  // The returned function is a generic function whose output can be typed by passing a type\n  // argument to the call\n  return (path: string): Promise<Array<T>> => {\n    return new Promise((res, rej) => {\n      // Read the file\n      fs.readFile(\n        path,\n        options,\n        (err: NodeJS.ErrnoException | null, contents: string | Buffer) => {\n          // If there was an error reading, throw\n          if (err) {\n            rej(err)\n          }\n\n          try {\n            // Otherwise, make sure the data is a string\n            const data =\n              typeof contents === 'string'\n                ? contents\n                : contents.toString(options.encoding || 'utf8')\n\n            // Finally, return the results\n            res(linesToData(data, fields, options))\n          } catch (e) {\n            rej(e)\n          }\n        }\n      )\n    })\n  }\n}\n\n/**\n * This function simply takes the lines from the file and parses them into the correct data\n * structure. Note that the `contents` variable should contain the entire string contents of the\n * file.\n */\nexport const linesToData = <T>(\n  contents: string | Array<string>,\n  fields: Array<FieldSpec>,\n  options: { throwErrors?: boolean } = {}\n): Array<T> => {\n  // Determine the size of the final line according to our field specs for later validation\n  const lineLength = fields.reduce((n: number, f: FieldSpec) => n + f.size, 0)\n\n  // Now iterate through each line and parse\n  const results: Array<T> = []\n  const lines = Array.isArray(contents) ? contents : contents.split(/[\\n\\r]+/)\n  for (let i = 0; i < lines.length; i++) {\n    // Parse non-blank lines (but don't trim, since it's possible for there to be lines with all\n    // null values)\n    if (lines[i] !== '') {\n      results.push(\n        parseLine<T>(\n          lines[i],\n          fields,\n          options.throwErrors !== false ? lineLength : undefined\n        )\n      )\n    }\n  }\n  return results\n}\n\n/**\n * Parse a string line into a data structure and validate its type according to the spec.\n *\n * Exporting this function for the purposes of testing. However, this function is not considered\n * a primary library function.\n */\nexport const parseLine = <T = unknown>(\n  line: string,\n  fields: Array<FieldSpec>,\n  expectedLineLength?: number\n): T => {\n  // Throw an exception if any line is not as expected\n  if (\n    typeof expectedLineLength === 'number' &&\n    line.length !== expectedLineLength\n  ) {\n    throw new FlatFileReadLineError(\n      `FlatFileReader: The given line must be ${expectedLineLength} characters long according ` +\n        `to the data specification. The current line is ${line.length} characters long.`,\n      line\n    )\n  }\n\n  const result: any = {}\n  let cursor = 0\n\n  // Iterate through the fields in the spec\n  for (let fieldNum = 0; fieldNum < fields.length; fieldNum++) {\n    const fieldSpec = fields[fieldNum]\n\n    // Extract the value for the given field and bump the cursor\n    const fieldVal = line.slice(cursor, cursor + fieldSpec.size)\n    cursor += fieldSpec.size\n\n    // Trim the value and assign it\n    result[fieldSpec.name] = trim(fieldVal, fieldSpec)\n  }\n\n  // Now interpret and typecheck the runtime values of the result and return\n  return interpret<T>(result, fields)\n}\n\n/**\n * Trim a value according to the field specification\n */\nexport const trim = (val: string, fieldSpec: FieldSpec): string => {\n  const paddingChar = fieldSpec.paddingSymbol || ' '\n  const pattern =\n    fieldSpec.paddingPosition === 'start' ||\n    (typeof fieldSpec.paddingPosition === 'undefined' &&\n      (fieldSpec.type === 'integer' || fieldSpec.type === 'float'))\n      ? new RegExp(`^${paddingChar}+`)\n      : new RegExp(`${paddingChar}+$`)\n  val = val.replace(pattern, '')\n\n  // Now make sure that if it's a number there's no whitespace\n  if (fieldSpec.type === 'integer' || fieldSpec.type === 'float') {\n    val = val.trim()\n  }\n\n  return val\n}\n\n/**\n * Interpret the value according to the given field specification\n */\nexport const interpret = <T = unknown>(\n  result: any,\n  fields: Array<FieldSpec>\n): T => {\n  // Iterate through the fields defined in the spec\n  for (let i = 0; i < fields.length; i++) {\n    const field = fields[i]\n\n    // If the field is a blank string, set it to default, if defined, or throw\n    if (result[field.name] === '') {\n      if (typeof field.default !== 'undefined') {\n        result[field.name] = field.default\n        continue\n      } else {\n        throw new FlatFileReadFieldTypeError(\n          `Field '${field.name}' is required, but not defined`,\n          field.name\n        )\n      }\n    }\n\n    // Otherwise, parse the value\n\n    // We'll use this int function in a couple different places, so make it available here\n    const getInt = (val: string, fieldName: string): number => {\n      if (val.match(/^-?[0-9]+$/) || val.match(/^-?[0-9]+e[0-9]+$/)) {\n        return Number(val)\n      } else {\n        throw new FlatFileReadFieldTypeError(\n          `Field '${fieldName}' is supposed to be an integer but is not. Actual value: ${val}`,\n          fieldName\n        )\n      }\n    }\n\n    switch (field.type) {\n      // Integer\n      case 'integer': {\n        result[field.name] = getInt(result[field.name], field.name)\n        break\n      }\n\n      case 'float': {\n        let val: number | null = null\n\n        // If we're using dot notation....\n        if (field.dotNotation) {\n          if (result[field.name].match(/^-?[0-9]*\\.?[0-9]+$/)) {\n            val = parseFloat(result[field.name])\n          } else if (result[field.name].match(/^-?[0-9]+(\\.[0-9]+)?e[0-9]+$/)) {\n            val = JSON.parse(result[field.name])\n          }\n        } else {\n          val =\n            getInt(result[field.name], field.name) /\n            Math.pow(10, field.precision || 0)\n        }\n\n        if (val === null) {\n          throw new FlatFileReadFieldTypeError(\n            `Field '${field.name}' is supposed to be a float but is not. Actual value: ` +\n              result[field.name],\n            field.name\n          )\n        }\n\n        result[field.name] = val\n        break\n      }\n\n      // TODO: Make sure this parses correctly according to the given options\n      case 'date': {\n        result[field.name] = moment(\n          result[field.name],\n          field.format && field.format.dateFormat\n            ? field.format.dateFormat\n            : undefined\n        )\n        break\n      }\n\n      case 'string':\n      case undefined: {\n        // If this is an enum field, unserialize\n        if (field.enum !== undefined) {\n          if (field.enum[result[field.name]] !== undefined) {\n            result[field.name] = field.enum[result[field.name]]\n          } else {\n            throw new FlatFileEnumError(\n              `Incoming value for field '${field.name}' should have been one of the accepted ` +\n                `enum keys [\"${Object.keys(field.enum).join('\", \"')}\"]${\n                  typeof field.default !== 'undefined' && field.default === null\n                    ? ' or null'\n                    : ''\n                }, but found '${result[field.name]}'`,\n              field.name\n            )\n          }\n        }\n      }\n    }\n  }\n\n  // Now that we've iterated through every field and done all our checking, it's safe to return\n  // `result` as an object of type `T`\n  return <T>result\n}\n","import { ObjectEncodingOptions } from 'node:fs'\nimport fs from 'node:fs/promises'\nimport { WriteOptions } from './Types.js'\n\nconst defaultOptions = {\n  encoding: 'utf8' as const,\n  mode: 0o666,\n  flag: 'a',\n}\n\ntype Options = ObjectEncodingOptions & fs.FlagAndOpenMode\n\nconst prepareOptions = (opts: Partial<WriteOptions>) => {\n  let options: Options = { ...defaultOptions }\n  options = opts.encoding ? { ...options, encoding: opts.encoding } : options\n  options = opts.mode ? { ...options, mode: opts.mode } : options\n  options = opts.flag ? { ...options, flag: opts.flag } : options\n  return { ...options }\n}\n\nconst fileAppendPromise = async (\n  path: string,\n  data: string,\n  options?: Partial<WriteOptions>\n) => {\n  if (options && options.encoding) {\n    fs.appendFile(path, data, prepareOptions(options))\n    return\n  }\n  fs.appendFile(path, data)\n}\n\nexport default fileAppendPromise\n","import lodash from 'lodash'\nimport { FieldSpec, RowData, WriteOptions } from './Types.js'\nimport fieldFormatter from './field-formatter.js'\n\nconst defaultOptions = {\n  rowEnd: '',\n}\n\nconst prepareToConcatData =\n  <T>(data: RowData<T>) =>\n  (acc: string, field: FieldSpec, i: number) => {\n    try {\n      return acc + fieldFormatter<T>(field, data)\n    } catch (e) {\n      e.message = `Row Index ${i}: ${e.message}`\n      throw e\n    }\n  }\n\nconst rowFormatter = <T>(\n  maps: Array<FieldSpec>,\n  data: RowData<T>,\n  options?: Partial<WriteOptions>\n) => {\n  if (typeof maps !== 'object') {\n    throw new Error('mapping is not an array')\n  }\n  if (lodash.isEmpty(maps)) {\n    throw new Error('mapping is empty')\n  }\n  if (!data) {\n    throw new Error('data is null')\n  }\n  if (typeof data !== 'object') {\n    throw new Error('data is not an object')\n  }\n  const opt: WriteOptions = { ...defaultOptions, ...options }\n  return maps.reduce(prepareToConcatData<T>(data), '') + opt.rowEnd\n}\n\nexport default rowFormatter\n","import fileAppendPromise from './file-append-promise.js'\nimport rowFormatter from './row-formatter.js'\nimport { FieldSpec, RowData, WriteOptions } from './Types.js'\n\nconst rowWriterMapper = <T>(\n  maps: Array<FieldSpec>,\n  path: string,\n  options: Partial<WriteOptions>\n) => {\n  return (data: RowData<T>) =>\n    fileAppendPromise(path, rowFormatter<T>(maps, data, options), options)\n}\n\nexport const getAsyncFlatFileCreator = <T>(\n  maps: Array<FieldSpec>,\n  options: Partial<WriteOptions>\n) => {\n  return (data: Array<RowData<T>>, path: string) =>\n    Promise.all(data.map(rowWriterMapper(maps, path, options)))\n}\n\n/**\n * This function simply takes rows of data and serializes them into an array of lines (strings).\n * This is roughly the reverse of the `linesToData` function in `src/flat-file-reader.ts`, except\n * that it's output is an array, rather than a single string. (This allows the user to specify\n * which line ending characters they wish to use.)\n */\nexport const dataToLines = <T>(\n  data: Array<RowData<T>>,\n  fields: Array<FieldSpec>,\n  options?: { throwErrors?: boolean }\n): Array<string> => {\n  return data.map((d) => rowFormatter<T>(fields, d, options || {}))\n}\n"],"mappings":"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","names":["lodash","import_lodash","moment","_","import_lodash","paddingDefault","lodash","import_lodash","paddingDefault","lodash","import_lodash","paddingDefault","lodash","import_moment","fs","moment","fs","import_lodash","defaultOptions","lodash"]}