mocktail-cli
Version:
**Craft your data cocktail — realistic mock data, shaken not stirred.**
60 lines (50 loc) • 2.02 kB
text/typescript
import type { Field } from '../types';
function escapeSqlValue(val: any): string {
if (val === null || val === undefined) return 'NULL';
if (typeof val === 'number') return String(val);
if (typeof val === 'boolean') return val ? 'TRUE' : 'FALSE';
if (val instanceof Date) return `'${val.toISOString()}'`;
if (typeof val === 'object') return `'${JSON.stringify(val).replace(/'/g, "''")}'`;
return `'${String(val).replace(/'/g, "''")}'`;
}
/**
* Formats records into an SQL INSERT statement.
*
* @param modelName - Table name
* @param records - Array of record objects
* @param fieldsMeta - Optional Prisma model.fields array for filtering relations
*/
export function formatToSQL(modelName: string, records: Record<string, any>[], fieldsMeta: Field[] = []): string {
if (!Array.isArray(records) || records.length === 0) return '';
// Filter out relation fields if fieldsMeta provided
let allowedColumns: string[];
if (fieldsMeta.length > 0) {
allowedColumns = fieldsMeta
.filter(f => !f.isRelation)
.map(f => f.name);
} else {
allowedColumns = Object.keys(records[0] || {});
}
const rows = records
.map(record =>
`(${allowedColumns.map(col => escapeSqlValue(record[col])).join(', ')})`
)
.join(',\n');
return `INSERT INTO "${modelName}" (${allowedColumns.join(', ')}) VALUES\n${rows};`;
}
/**
* Formats many-to-many join table inserts.
*
* @param joinTableName - join table name
* @param records - array of objects with keys 'A' and 'B'
*/
export function formatJoinTableSQL(joinTableName: string, records: Array<{ A: string; B: string }>): string {
if (!Array.isArray(records) || records.length === 0) return '';
const columns = Object.keys(records[0] || {}); // usually ['A', 'B']
const rows = records
.map(record =>
`(${columns.map(col => escapeSqlValue(record[col as keyof typeof record])).join(', ')})`
)
.join(',\n');
return `INSERT INTO "${joinTableName}" (${columns.join(', ')}) VALUES\n${rows};`;
}