import {SelectItem, SelectItemUtil} from "./select-item"; import {ColumnRef, ColumnRefUtil} from "./column-ref"; export namespace SelectItemArrayUtil { export type ToColumnNameUnion = ( { [index in Extract|number] : ( SelectsT[index] extends SelectItem ? Extract< SelectItemUtil.ToColumnNameUnion, string > : never ) }[Extract|number] ); export type ToColumnNameUnionIgnoreIndex< SelectsT extends SelectItem[], IgnoreIndexT extends Extract > = ( { [index in Exclude, IgnoreIndexT>] : ( SelectsT[index] extends SelectItem ? SelectItemUtil.ToColumnNameUnion : never ) }[Exclude, IgnoreIndexT>] ); export type DuplicateColumnName = ( { [index in Extract] : ( SelectsT[index] extends SelectItem ? ( Extract< SelectItemUtil.ToColumnNameUnion, ToColumnNameUnionIgnoreIndex > | ( SelectsT[index] extends ColumnRef ? ColumnRefUtil.DuplicateColumnName : never ) ) : never ) }[Extract] ); export type HasDuplicateColumnName = ( DuplicateColumnName extends never ? false : true ); export function isSelectItemArray (raw : any) : raw is SelectItem[] { if (!(raw instanceof Array)) { return false; } for (let item of raw) { if (!SelectItemUtil.isSelectItem(item)) { return false; } } return true; } export function hasDuplicateColumnName (arr : SelectItem[]) { const seen : string[] = []; for (let item of arr) { for (let name of SelectItemUtil.getColumnNames(item)) { if (seen.indexOf(name) >= 0) { return true; } seen.push(name); } } return false; } export function assertNoDuplicateColumnName (arr : SelectItem[]) { const seen : string[] = []; for (let item of arr) { for (let name of SelectItemUtil.getColumnNames(item)) { if (seen.indexOf(name) >= 0) { throw new Error(`Duplicate column name '${name}' found`); } seen.push(name); } } } }