import dayjs from 'dayjs' import { UITypes } from 'nocodb-sdk' export default function convertCellData(args: { from: UITypes; to: UITypes; value: any }, isMysql = false) { const { from, to, value } = args if (from === to && ![UITypes.Attachment, UITypes.Date, UITypes.DateTime, UITypes.Time, UITypes.Year].includes(to)) { return value } const dateFormat = isMysql ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD HH:mm:ssZ' switch (to) { case UITypes.Number: { const parsedNumber = Number(value) if (isNaN(parsedNumber)) { throw new TypeError(`Cannot convert '${value}' to number`) } return parsedNumber } case UITypes.Rating: { const parsedNumber = Number(value ?? 0) if (isNaN(parsedNumber)) { throw new TypeError(`Cannot convert '${value}' to rating`) } return parsedNumber } case UITypes.Checkbox: return Boolean(value) case UITypes.Date: { const parsedDate = dayjs(value) if (!parsedDate.isValid()) throw new Error('Not a valid date') return parsedDate.format('YYYY-MM-DD') } case UITypes.DateTime: { const parsedDateTime = dayjs(value) if (!parsedDateTime.isValid()) { throw new Error('Not a valid datetime value') } return parsedDateTime.format(dateFormat) } case UITypes.Time: { let parsedTime = dayjs(value) if (!parsedTime.isValid()) { parsedTime = dayjs(value, 'HH:mm:ss') } if (!parsedTime.isValid()) { parsedTime = dayjs(`1999-01-01 ${value}`) } if (!parsedTime.isValid()) { throw new Error('Not a valid time value') } return parsedTime.format(dateFormat) } case UITypes.Year: { if (/^\d+$/.test(value)) { return +value } const parsedDate = dayjs(value) if (parsedDate.isValid()) { return parsedDate.format('YYYY') } throw new Error('Not a valid year value') } case UITypes.Attachment: { let parsedVal try { parsedVal = typeof value === 'string' ? JSON.parse(value) : value parsedVal = Array.isArray(parsedVal) ? parsedVal : [parsedVal] } catch (e) { throw new Error('Invalid attachment data') } if (parsedVal.some((v: any) => v && !(v.url || v.data))) { throw new Error('Invalid attachment data') } return JSON.stringify(parsedVal) } case UITypes.LinkToAnotherRecord: case UITypes.Lookup: case UITypes.Rollup: case UITypes.Formula: case UITypes.QrCode: throw new Error(`Unsupported conversion from ${from} to ${to}`) default: return value } }