relations.d.cts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import { type AnyTable, type InferModelFromColumns, Table } from "./table.cjs";
  2. import { type AnyColumn, Column } from "./column.cjs";
  3. import { entityKind } from "./entity.cjs";
  4. import { and, asc, between, desc, exists, ilike, inArray, isNotNull, isNull, like, not, notBetween, notExists, notIlike, notInArray, notLike, or } from "./sql/expressions/index.cjs";
  5. import { type Placeholder, SQL, sql } from "./sql/sql.cjs";
  6. import type { Assume, ColumnsWithTable, Equal, Simplify, ValueOrArray } from "./utils.cjs";
  7. export declare abstract class Relation<TTableName extends string = string> {
  8. readonly sourceTable: Table;
  9. readonly referencedTable: AnyTable<{
  10. name: TTableName;
  11. }>;
  12. readonly relationName: string | undefined;
  13. static readonly [entityKind]: string;
  14. readonly $brand: 'Relation';
  15. readonly referencedTableName: TTableName;
  16. fieldName: string;
  17. constructor(sourceTable: Table, referencedTable: AnyTable<{
  18. name: TTableName;
  19. }>, relationName: string | undefined);
  20. abstract withFieldName(fieldName: string): Relation<TTableName>;
  21. }
  22. export declare class Relations<TTableName extends string = string, TConfig extends Record<string, Relation> = Record<string, Relation>> {
  23. readonly table: AnyTable<{
  24. name: TTableName;
  25. }>;
  26. readonly config: (helpers: TableRelationsHelpers<TTableName>) => TConfig;
  27. static readonly [entityKind]: string;
  28. readonly $brand: 'Relations';
  29. constructor(table: AnyTable<{
  30. name: TTableName;
  31. }>, config: (helpers: TableRelationsHelpers<TTableName>) => TConfig);
  32. }
  33. export declare class One<TTableName extends string = string, TIsNullable extends boolean = boolean> extends Relation<TTableName> {
  34. readonly config: RelationConfig<TTableName, string, AnyColumn<{
  35. tableName: TTableName;
  36. }>[]> | undefined;
  37. readonly isNullable: TIsNullable;
  38. static readonly [entityKind]: string;
  39. protected $relationBrand: 'One';
  40. constructor(sourceTable: Table, referencedTable: AnyTable<{
  41. name: TTableName;
  42. }>, config: RelationConfig<TTableName, string, AnyColumn<{
  43. tableName: TTableName;
  44. }>[]> | undefined, isNullable: TIsNullable);
  45. withFieldName(fieldName: string): One<TTableName>;
  46. }
  47. export declare class Many<TTableName extends string> extends Relation<TTableName> {
  48. readonly config: {
  49. relationName: string;
  50. } | undefined;
  51. static readonly [entityKind]: string;
  52. protected $relationBrand: 'Many';
  53. constructor(sourceTable: Table, referencedTable: AnyTable<{
  54. name: TTableName;
  55. }>, config: {
  56. relationName: string;
  57. } | undefined);
  58. withFieldName(fieldName: string): Many<TTableName>;
  59. }
  60. export type TableRelationsKeysOnly<TSchema extends Record<string, unknown>, TTableName extends string, K extends keyof TSchema> = TSchema[K] extends Relations<TTableName> ? K : never;
  61. export type ExtractTableRelationsFromSchema<TSchema extends Record<string, unknown>, TTableName extends string> = ExtractObjectValues<{
  62. [K in keyof TSchema as TableRelationsKeysOnly<TSchema, TTableName, K>]: TSchema[K] extends Relations<TTableName, infer TConfig> ? TConfig : never;
  63. }>;
  64. export type ExtractObjectValues<T> = T[keyof T];
  65. export type ExtractRelationsFromTableExtraConfigSchema<TConfig extends unknown[]> = ExtractObjectValues<{
  66. [K in keyof TConfig as TConfig[K] extends Relations<any> ? K : never]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig : never;
  67. }>;
  68. export declare function getOperators(): {
  69. and: typeof and;
  70. between: typeof between;
  71. eq: import("./index.ts").BinaryOperator;
  72. exists: typeof exists;
  73. gt: import("./index.ts").BinaryOperator;
  74. gte: import("./index.ts").BinaryOperator;
  75. ilike: typeof ilike;
  76. inArray: typeof inArray;
  77. isNull: typeof isNull;
  78. isNotNull: typeof isNotNull;
  79. like: typeof like;
  80. lt: import("./index.ts").BinaryOperator;
  81. lte: import("./index.ts").BinaryOperator;
  82. ne: import("./index.ts").BinaryOperator;
  83. not: typeof not;
  84. notBetween: typeof notBetween;
  85. notExists: typeof notExists;
  86. notLike: typeof notLike;
  87. notIlike: typeof notIlike;
  88. notInArray: typeof notInArray;
  89. or: typeof or;
  90. sql: typeof sql;
  91. };
  92. export type Operators = ReturnType<typeof getOperators>;
  93. export declare function getOrderByOperators(): {
  94. sql: typeof sql;
  95. asc: typeof asc;
  96. desc: typeof desc;
  97. };
  98. export type OrderByOperators = ReturnType<typeof getOrderByOperators>;
  99. export type FindTableByDBName<TSchema extends TablesRelationalConfig, TTableName extends string> = ExtractObjectValues<{
  100. [K in keyof TSchema as TSchema[K]['dbName'] extends TTableName ? K : never]: TSchema[K];
  101. }>;
  102. export type DBQueryConfig<TRelationType extends 'one' | 'many' = 'one' | 'many', TIsRoot extends boolean = boolean, TSchema extends TablesRelationalConfig = TablesRelationalConfig, TTableConfig extends TableRelationalConfig = TableRelationalConfig> = {
  103. columns?: {
  104. [K in keyof TTableConfig['columns']]?: boolean;
  105. } | undefined;
  106. with?: {
  107. [K in keyof TTableConfig['relations']]?: true | DBQueryConfig<TTableConfig['relations'][K] extends One ? 'one' : 'many', false, TSchema, FindTableByDBName<TSchema, TTableConfig['relations'][K]['referencedTableName']>> | undefined;
  108. } | undefined;
  109. extras?: Record<string, SQL.Aliased> | ((fields: Simplify<[
  110. TTableConfig['columns']
  111. ] extends [never] ? {} : TTableConfig['columns']>, operators: {
  112. sql: Operators['sql'];
  113. }) => Record<string, SQL.Aliased>) | undefined;
  114. } & (TRelationType extends 'many' ? {
  115. where?: SQL | undefined | ((fields: Simplify<[
  116. TTableConfig['columns']
  117. ] extends [never] ? {} : TTableConfig['columns']>, operators: Operators) => SQL | undefined);
  118. orderBy?: ValueOrArray<AnyColumn | SQL> | ((fields: Simplify<[
  119. TTableConfig['columns']
  120. ] extends [never] ? {} : TTableConfig['columns']>, operators: OrderByOperators) => ValueOrArray<AnyColumn | SQL>) | undefined;
  121. limit?: number | Placeholder | undefined;
  122. } & (TIsRoot extends true ? {
  123. offset?: number | Placeholder | undefined;
  124. } : {}) : {});
  125. export interface TableRelationalConfig {
  126. tsName: string;
  127. dbName: string;
  128. columns: Record<string, Column>;
  129. relations: Record<string, Relation>;
  130. primaryKey: AnyColumn[];
  131. schema?: string;
  132. }
  133. export type TablesRelationalConfig = Record<string, TableRelationalConfig>;
  134. export interface RelationalSchemaConfig<TSchema extends TablesRelationalConfig> {
  135. fullSchema: Record<string, unknown>;
  136. schema: TSchema;
  137. tableNamesMap: Record<string, string>;
  138. }
  139. export type ExtractTablesWithRelations<TSchema extends Record<string, unknown>> = {
  140. [K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K] extends Table ? {
  141. tsName: K & string;
  142. dbName: TSchema[K]['_']['name'];
  143. columns: TSchema[K]['_']['columns'];
  144. relations: ExtractTableRelationsFromSchema<TSchema, TSchema[K]['_']['name']>;
  145. primaryKey: AnyColumn[];
  146. } : never;
  147. };
  148. export type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R : T;
  149. export type BuildRelationResult<TSchema extends TablesRelationalConfig, TInclude, TRelations extends Record<string, Relation>> = {
  150. [K in NonUndefinedKeysOnly<TInclude> & keyof TRelations]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<TSchema, FindTableByDBName<TSchema, TRel['referencedTableName']>, Assume<TInclude[K], true | Record<string, unknown>>> extends infer TResult ? TRel extends One ? TResult | (Equal<TRel['isNullable'], false> extends true ? null : never) : TResult[] : never : never;
  151. };
  152. export type NonUndefinedKeysOnly<T> = ExtractObjectValues<{
  153. [K in keyof T as T[K] extends undefined ? never : K]: K;
  154. }> & keyof T;
  155. export type BuildQueryResult<TSchema extends TablesRelationalConfig, TTableConfig extends TableRelationalConfig, TFullSelection extends true | Record<string, unknown>> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']> : TFullSelection extends Record<string, unknown> ? Simplify<(TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<{
  156. [K in Equal<Exclude<TFullSelection['columns'][keyof TFullSelection['columns'] & keyof TTableConfig['columns']], undefined>, false> extends true ? Exclude<keyof TTableConfig['columns'], NonUndefinedKeysOnly<TFullSelection['columns']>> : {
  157. [K in keyof TFullSelection['columns']]: Equal<TFullSelection['columns'][K], true> extends true ? K : never;
  158. }[keyof TFullSelection['columns']] & keyof TTableConfig['columns']]: TTableConfig['columns'][K];
  159. }> : InferModelFromColumns<TTableConfig['columns']>) & (TFullSelection['extras'] extends Record<string, unknown> | ((...args: any[]) => Record<string, unknown>) ? {
  160. [K in NonUndefinedKeysOnly<ReturnTypeOrValue<TFullSelection['extras']>>]: Assume<ReturnTypeOrValue<TFullSelection['extras']>[K], SQL.Aliased>['_']['type'];
  161. } : {}) & (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<TSchema, TFullSelection['with'], TTableConfig['relations']> : {})> : never;
  162. export interface RelationConfig<TTableName extends string, TForeignTableName extends string, TColumns extends AnyColumn<{
  163. tableName: TTableName;
  164. }>[]> {
  165. relationName?: string;
  166. fields: TColumns;
  167. references: ColumnsWithTable<TTableName, TForeignTableName, TColumns>;
  168. }
  169. export declare function extractTablesRelationalConfig<TTables extends TablesRelationalConfig>(schema: Record<string, unknown>, configHelpers: (table: Table) => any): {
  170. tables: TTables;
  171. tableNamesMap: Record<string, string>;
  172. };
  173. export declare function relations<TTableName extends string, TRelations extends Record<string, Relation<any>>>(table: AnyTable<{
  174. name: TTableName;
  175. }>, relations: (helpers: TableRelationsHelpers<TTableName>) => TRelations): Relations<TTableName, TRelations>;
  176. export declare function createOne<TTableName extends string>(sourceTable: Table): <TForeignTable extends Table, TColumns extends [AnyColumn<{
  177. tableName: TTableName;
  178. }>, ...AnyColumn<{
  179. tableName: TTableName;
  180. }>[]]>(table: TForeignTable, config?: RelationConfig<TTableName, TForeignTable["_"]["name"], TColumns>) => One<TForeignTable["_"]["name"], Equal<TColumns[number]["_"]["notNull"], true>>;
  181. export declare function createMany(sourceTable: Table): <TForeignTable extends Table>(referencedTable: TForeignTable, config?: {
  182. relationName: string;
  183. }) => Many<TForeignTable["_"]["name"]>;
  184. export interface NormalizedRelation {
  185. fields: AnyColumn[];
  186. references: AnyColumn[];
  187. }
  188. export declare function normalizeRelation(schema: TablesRelationalConfig, tableNamesMap: Record<string, string>, relation: Relation): NormalizedRelation;
  189. export declare function createTableRelationsHelpers<TTableName extends string>(sourceTable: AnyTable<{
  190. name: TTableName;
  191. }>): {
  192. one: <TForeignTable extends Table, TColumns extends [AnyColumn<{
  193. tableName: TTableName;
  194. }>, ...AnyColumn<{
  195. tableName: TTableName;
  196. }>[]]>(table: TForeignTable, config?: RelationConfig<TTableName, TForeignTable["_"]["name"], TColumns> | undefined) => One<TForeignTable["_"]["name"], Equal<TColumns[number]["_"]["notNull"], true>>;
  197. many: <TForeignTable extends Table>(referencedTable: TForeignTable, config?: {
  198. relationName: string;
  199. }) => Many<TForeignTable["_"]["name"]>;
  200. };
  201. export type TableRelationsHelpers<TTableName extends string> = ReturnType<typeof createTableRelationsHelpers<TTableName>>;
  202. export interface BuildRelationalQueryResult<TTable extends Table = Table, TColumn extends Column = Column> {
  203. tableTsKey: string;
  204. selection: {
  205. dbKey: string;
  206. tsKey: string;
  207. field: TColumn | SQL | SQL.Aliased;
  208. relationTableTsKey: string | undefined;
  209. isJson: boolean;
  210. isExtra?: boolean;
  211. selection: BuildRelationalQueryResult<TTable>['selection'];
  212. }[];
  213. sql: TTable | SQL;
  214. }
  215. export declare function mapRelationalRow(tablesConfig: TablesRelationalConfig, tableConfig: TableRelationalConfig, row: unknown[], buildQueryResultSelection: BuildRelationalQueryResult['selection'], mapColumnValue?: (value: unknown) => unknown): Record<string, unknown>;