@flatfile/plugin-autocast
Version:
A plugin for automatically casting values in Flatfile.
1 lines • 7.18 kB
Source Map (JSON)
{"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"]}