{"version":3,"sources":["../src/autocast.plugin.ts"],"names":["api","FlatfileClient","autocast","sheetSlug","fieldFilters","options","listener","bulkRecordHook","records","event","sheetId","sheet","logInfo","castableFields","field","record","originalValue","caster","CASTING_FUNCTIONS","e","castString","castNumber","castBoolean","castDate","value","strippedValue","num","TRUTHY_VALUES","FALSY_VALUES","normValue","numericTimestamp","finalValue","date"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { FlatfileClient } from '@flatfile/api'\nimport type { TRecordValue } from '@flatfile/hooks'\nimport type { FlatfileEvent, FlatfileListener } from '@flatfile/listener'\nimport type { FlatfileRecord } from '@flatfile/plugin-record-hook'\nimport { bulkRecordHook } from '@flatfile/plugin-record-hook'\nimport { logInfo } from '@flatfile/util-common'\n\nconst api = new FlatfileClient()\n\nexport function autocast(\n  sheetSlug: string,\n  fieldFilters?: string[],\n  options?: {\n    chunkSize?: number\n    parallel?: number\n    debug?: boolean\n  }\n) {\n  return (listener: FlatfileListener) => {\n    listener.use(\n      bulkRecordHook(\n        sheetSlug,\n        async (records: FlatfileRecord[], event: FlatfileEvent) => {\n          const sheetId = event.context.sheetId\n          const sheet = await api.sheets.get(sheetId)\n          if (!sheet) {\n            logInfo('@flatfile/plugin-autocast', 'Failed to fetch sheet')\n            return\n          }\n\n          const castableFields = sheet.data.config.fields.filter((field) =>\n            fieldFilters\n              ? fieldFilters.includes(field.key)\n              : field.type !== 'string'\n          )\n          records.forEach((record) => {\n            castableFields.forEach((field) => {\n              const originalValue = record.get(field.key)\n              const caster = CASTING_FUNCTIONS[field.type]\n\n              if (\n                originalValue &&\n                caster &&\n                typeof originalValue !== field.type\n              ) {\n                try {\n                  record.computeIfPresent(field.key, caster)\n                } catch (e) {\n                  record.addError(\n                    field.key,\n                    e.message || 'Failed to cast value'\n                  )\n                }\n              }\n            })\n          })\n        },\n        options\n      )\n    )\n  }\n}\n\nconst CASTING_FUNCTIONS: {\n  [key: string]: (value: TRecordValue) => TRecordValue\n} = {\n  string: castString,\n  number: castNumber,\n  boolean: castBoolean,\n  date: castDate,\n}\n\nexport function castString(value: TRecordValue): TRecordValue {\n  if (typeof value === 'string') {\n    return value\n  } else if (typeof value === 'number') {\n    return value.toString()\n  } else if (typeof value === 'boolean') {\n    return value ? 'true' : 'false'\n  }\n  throw new Error(`Failed to cast '${value}' to 'string'`)\n}\n\nexport function castNumber(value: TRecordValue): TRecordValue {\n  if (typeof value === 'number') {\n    return value\n  } else if (typeof value === 'string') {\n    const strippedValue = value.replace(/,/g, '')\n    if (!isNaN(Number(strippedValue))) {\n      const num = Number(strippedValue)\n      if (isFinite(num)) {\n        return num\n      }\n    }\n  }\n  throw new Error('Invalid number')\n}\n\nexport const TRUTHY_VALUES = ['1', 'yes', 'true', 'on', 't', 'y', 1]\nexport const FALSY_VALUES = ['-1', '0', 'no', 'false', 'off', 'f', 'n', 0, -1]\nexport function castBoolean(value: TRecordValue): TRecordValue {\n  if (typeof value === 'boolean') {\n    return value\n  } else if (typeof value === 'string' || typeof value === 'number') {\n    if (value === '') {\n      return null\n    }\n    const normValue = typeof value === 'string' ? value.toLowerCase() : value\n    if (TRUTHY_VALUES.includes(normValue)) {\n      return true\n    }\n    if (FALSY_VALUES.includes(normValue)) {\n      return false\n    }\n  }\n  throw new Error('Invalid boolean')\n}\n\nexport function castDate(value: TRecordValue): TRecordValue {\n  // Check if value is a number and if so use the numeric value instead of a string\n  const numericTimestamp = Number(value)\n  let finalValue = !isNaN(numericTimestamp) ? numericTimestamp : value\n\n  if (typeof finalValue === 'string' || typeof finalValue === 'number') {\n    const date = new Date(finalValue)\n    if (!isNaN(date.getTime())) {\n      return date.toUTCString()\n    }\n  }\n  throw new Error('Invalid date')\n}\n"]}