import type { RecordCamelKeys, RecordPascalKeys, RecordSnakeKeys } from './template-literal.js' export enum CaseType { camel = 'camel', pascal = 'pascal', snake = 'snake', none = 'none', } export type JoinTableWithCaseConvert< T1 extends object, T2 extends object, Prefix extends string, CaseConvert extends CaseType> = CaseConvertTable, CaseConvert> export type CaseConvertTable = CaseConvert extends CaseType.camel ? RecordCamelKeys : CaseConvert extends CaseType.snake ? RecordSnakeKeys : CaseConvert extends CaseType.pascal ? RecordPascalKeys : T export type JoinTable = T1 & _JoinCover & _JoinDiff type _JoinCover = { [K in keyof Pick as K extends string ? `${Prefix}_${K}` : K]: T2[K] } type _JoinDiff = { [K in keyof Omit]: T2[K] } /** * Create scoped column name from all tables of D, * filter by Tb name like 'tb_user' | 'tb_order' */ export type DbScopedColsByKey = D extends Record ? F extends unknown ? `${F}.${StrKey}` : never : never /** * Create scoped column name from all tables of D, * filter by Tb Type */ export type DbScopedColsByTableType = T extends undefined ? DbScopedColsByKey : D extends Record ? F extends unknown ? T extends D[F] ? keyof D[F] extends string ? `${F}.${keyof D[F]}` : never : never : never : never export type UnwrapArrayMember = T extends (infer M)[] ? M : T export type StrKey = keyof T & string /** * Splite `tb_user_bar.foo_id` to `tb_user_bar` and `foo_id` */ export type SplitScopedColumn = SCol extends `${infer Tb extends StrKey}.${infer Col}` ? [Tb, Col] : never