table.d.ts 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import type { Column, GetColumnData } from "./column.js";
  2. import { entityKind } from "./entity.js";
  3. import type { OptionalKeyOnly, RequiredKeyOnly } from "./operations.js";
  4. import type { SQLWrapper } from "./sql/sql.js";
  5. import type { Simplify, Update } from "./utils.js";
  6. export interface TableConfig<TColumn extends Column = Column<any>> {
  7. name: string;
  8. schema: string | undefined;
  9. columns: Record<string, TColumn>;
  10. dialect: string;
  11. }
  12. export type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<Update<T, TUpdate>>;
  13. export interface Table<T extends TableConfig = TableConfig> extends SQLWrapper {
  14. }
  15. export declare class Table<T extends TableConfig = TableConfig> implements SQLWrapper {
  16. static readonly [entityKind]: string;
  17. readonly _: {
  18. readonly brand: 'Table';
  19. readonly config: T;
  20. readonly name: T['name'];
  21. readonly schema: T['schema'];
  22. readonly columns: T['columns'];
  23. readonly inferSelect: InferSelectModel<Table<T>>;
  24. readonly inferInsert: InferInsertModel<Table<T>>;
  25. };
  26. readonly $inferSelect: InferSelectModel<Table<T>>;
  27. readonly $inferInsert: InferInsertModel<Table<T>>;
  28. constructor(name: string, schema: string | undefined, baseName: string);
  29. }
  30. export declare function isTable(table: unknown): table is Table;
  31. /**
  32. * Any table with a specified boundary.
  33. *
  34. * @example
  35. ```ts
  36. // Any table with a specific name
  37. type AnyUsersTable = AnyTable<{ name: 'users' }>;
  38. ```
  39. *
  40. * To describe any table with any config, simply use `Table` without any type arguments, like this:
  41. *
  42. ```ts
  43. function needsTable(table: Table) {
  44. ...
  45. }
  46. ```
  47. */
  48. export type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;
  49. export declare function getTableName<T extends Table>(table: T): T['_']['name'];
  50. export declare function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}`;
  51. export type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> = TDBColumNames extends true ? TColumn['_']['name'] : TName;
  52. export type InferModelFromColumns<TColumns extends Record<string, Column>, TInferMode extends 'select' | 'insert' = 'select', TConfig extends {
  53. dbColumnNames: boolean;
  54. override?: boolean;
  55. } = {
  56. dbColumnNames: false;
  57. override: false;
  58. }> = Simplify<TInferMode extends 'insert' ? {
  59. [Key in keyof TColumns & string as RequiredKeyOnly<MapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>, TColumns[Key]>]: GetColumnData<TColumns[Key], 'query'>;
  60. } & {
  61. [Key in keyof TColumns & string as OptionalKeyOnly<MapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>, TColumns[Key], TConfig['override']>]?: GetColumnData<TColumns[Key], 'query'> | undefined;
  62. } : {
  63. [Key in keyof TColumns & string as MapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>]: GetColumnData<TColumns[Key], 'query'>;
  64. }>;
  65. /** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`
  66. */
  67. export type InferModel<TTable extends Table, TInferMode extends 'select' | 'insert' = 'select', TConfig extends {
  68. dbColumnNames: boolean;
  69. } = {
  70. dbColumnNames: false;
  71. }> = InferModelFromColumns<TTable['_']['columns'], TInferMode, TConfig>;
  72. export type InferSelectModel<TTable extends Table, TConfig extends {
  73. dbColumnNames: boolean;
  74. } = {
  75. dbColumnNames: false;
  76. }> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>;
  77. export type InferInsertModel<TTable extends Table, TConfig extends {
  78. dbColumnNames: boolean;
  79. override?: boolean;
  80. } = {
  81. dbColumnNames: false;
  82. override: false;
  83. }> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;
  84. export type InferEnum<T> = T extends {
  85. enumValues: readonly (infer U)[];
  86. } ? U : never;