import type { QueryBuilder } from 'knex' import _ from 'lodash' export function convertToReturning(obj: Record) { return _.map(obj, (value, key) => _.isString(value) && `${value} as ${key}`).filter(_.identity) } export function columnAs(name: string, table: string, transformer = _.snakeCase) { const transformed = transformer(name) if (transformed !== name) { // knex automagically wraps everything in ", so they are not needed around ${name} return `${table ? table + '.' : ''}${transformed} as ${name}` } return table ? `${table}.${name}` : name } export function columnBuilder(builder: QueryBuilder, columns: Record, columnNames: string[]) { for (const columnName of columnNames) { const column = columns[columnName] if (column) { // @ts-ignore builder.column(column) } } return builder } export function where(builder: QueryBuilder, json: Record) { return _.reduce( json, (builder, value, key) => { if (value === null) { // @ts-ignore return builder.whereNull(key) } else if (Array.isArray(value)) { // @ts-ignore return builder.whereIn(key, value) } // @ts-ignore return builder.where(key, value) }, builder, ) } export const one = (result: ANY) => (result.rows ? result.rows[0] : undefined) export const many = (result: ANY) => (result.rows ? result.rows : [])