type Params = { sql: string; table: string; data: any | any[]; }; function quoteIdentifier(identifier: string): string { return `\`${identifier.replace(/`/g, "``")}\``; } export default async function ({ sql: passedSql, table, data }: Params) { const config = global.CONFIG; const dbSchema = global.DB_SCHEMA; const tableSchema = dbSchema?.tables.find( (t: { tableName: string }) => t.tableName == table, ); if (!tableSchema?.tableName) { return passedSql; } const dataObject = Array.isArray(data) ? data[0] : data; const dataKeys = Object.keys(dataObject || {}); if (dataKeys.length === 0) { return passedSql; } const hasUniqueField = tableSchema.fields.some( (field: { unique?: boolean }) => field.unique, ) || Boolean(tableSchema.uniqueConstraints?.length); if (!hasUniqueField) { return passedSql; } const setSql = dataKeys .filter((field: string) => field !== "updated_at") .map( (field: string) => `${quoteIdentifier(field)} = VALUES(${quoteIdentifier(field)})`, ); setSql.push(`updated_at = ${Date.now()}`); return `${passedSql} ON DUPLICATE KEY UPDATE ${setSql.join(", ")}`; }