column-builder.d.cts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. import { entityKind } from "./entity.cjs";
  2. import type { Column } from "./column.cjs";
  3. import type { GelColumn, GelExtraConfigColumn } from "./gel-core/index.cjs";
  4. import type { MySqlColumn } from "./mysql-core/index.cjs";
  5. import type { ExtraConfigColumn, PgColumn, PgSequenceOptions } from "./pg-core/index.cjs";
  6. import type { SingleStoreColumn } from "./singlestore-core/index.cjs";
  7. import type { SQL } from "./sql/sql.cjs";
  8. import type { SQLiteColumn } from "./sqlite-core/index.cjs";
  9. import type { Assume, Simplify } from "./utils.cjs";
  10. export type ColumnDataType = 'string' | 'number' | 'boolean' | 'array' | 'json' | 'date' | 'bigint' | 'custom' | 'buffer' | 'dateDuration' | 'duration' | 'relDuration' | 'localTime' | 'localDate' | 'localDateTime';
  11. export type Dialect = 'pg' | 'mysql' | 'sqlite' | 'singlestore' | 'common' | 'gel';
  12. export type GeneratedStorageMode = 'virtual' | 'stored';
  13. export type GeneratedType = 'always' | 'byDefault';
  14. export type GeneratedColumnConfig<TDataType> = {
  15. as: TDataType | SQL | (() => SQL);
  16. type?: GeneratedType;
  17. mode?: GeneratedStorageMode;
  18. };
  19. export type GeneratedIdentityConfig = {
  20. sequenceName?: string;
  21. sequenceOptions?: PgSequenceOptions;
  22. type: 'always' | 'byDefault';
  23. };
  24. export interface ColumnBuilderBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> {
  25. name: string;
  26. dataType: TDataType;
  27. columnType: TColumnType;
  28. data: unknown;
  29. driverParam: unknown;
  30. enumValues: string[] | undefined;
  31. }
  32. export type MakeColumnConfig<T extends ColumnBuilderBaseConfig<ColumnDataType, string>, TTableName extends string, TData = T extends {
  33. $type: infer U;
  34. } ? U : T['data']> = {
  35. name: T['name'];
  36. tableName: TTableName;
  37. dataType: T['dataType'];
  38. columnType: T['columnType'];
  39. data: TData;
  40. driverParam: T['driverParam'];
  41. notNull: T extends {
  42. notNull: true;
  43. } ? true : false;
  44. hasDefault: T extends {
  45. hasDefault: true;
  46. } ? true : false;
  47. isPrimaryKey: T extends {
  48. isPrimaryKey: true;
  49. } ? true : false;
  50. isAutoincrement: T extends {
  51. isAutoincrement: true;
  52. } ? true : false;
  53. hasRuntimeDefault: T extends {
  54. hasRuntimeDefault: true;
  55. } ? true : false;
  56. enumValues: T['enumValues'];
  57. baseColumn: T extends {
  58. baseBuilder: infer U extends ColumnBuilderBase;
  59. } ? BuildColumn<TTableName, U, 'common'> : never;
  60. identity: T extends {
  61. identity: 'always';
  62. } ? 'always' : T extends {
  63. identity: 'byDefault';
  64. } ? 'byDefault' : undefined;
  65. generated: T extends {
  66. generated: infer G;
  67. } ? unknown extends G ? undefined : G extends undefined ? undefined : G : undefined;
  68. } & {};
  69. export type ColumnBuilderTypeConfig<T extends ColumnBuilderBaseConfig<ColumnDataType, string>, TTypeConfig extends object = object> = Simplify<{
  70. brand: 'ColumnBuilder';
  71. name: T['name'];
  72. dataType: T['dataType'];
  73. columnType: T['columnType'];
  74. data: T['data'];
  75. driverParam: T['driverParam'];
  76. notNull: T extends {
  77. notNull: infer U;
  78. } ? U : boolean;
  79. hasDefault: T extends {
  80. hasDefault: infer U;
  81. } ? U : boolean;
  82. enumValues: T['enumValues'];
  83. identity: T extends {
  84. identity: infer U;
  85. } ? U : unknown;
  86. generated: T extends {
  87. generated: infer G;
  88. } ? G extends undefined ? unknown : G : unknown;
  89. } & TTypeConfig>;
  90. export type ColumnBuilderRuntimeConfig<TData, TRuntimeConfig extends object = object> = {
  91. name: string;
  92. keyAsName: boolean;
  93. notNull: boolean;
  94. default: TData | SQL | undefined;
  95. defaultFn: (() => TData | SQL) | undefined;
  96. onUpdateFn: (() => TData | SQL) | undefined;
  97. hasDefault: boolean;
  98. primaryKey: boolean;
  99. isUnique: boolean;
  100. uniqueName: string | undefined;
  101. uniqueType: string | undefined;
  102. dataType: string;
  103. columnType: string;
  104. generated: GeneratedColumnConfig<TData> | undefined;
  105. generatedIdentity: GeneratedIdentityConfig | undefined;
  106. } & TRuntimeConfig;
  107. export interface ColumnBuilderExtraConfig {
  108. primaryKeyHasDefault?: boolean;
  109. }
  110. export type NotNull<T extends ColumnBuilderBase> = T & {
  111. _: {
  112. notNull: true;
  113. };
  114. };
  115. export type HasDefault<T extends ColumnBuilderBase> = T & {
  116. _: {
  117. hasDefault: true;
  118. };
  119. };
  120. export type IsPrimaryKey<T extends ColumnBuilderBase> = T & {
  121. _: {
  122. isPrimaryKey: true;
  123. };
  124. };
  125. export type IsAutoincrement<T extends ColumnBuilderBase> = T & {
  126. _: {
  127. isAutoincrement: true;
  128. };
  129. };
  130. export type HasRuntimeDefault<T extends ColumnBuilderBase> = T & {
  131. _: {
  132. hasRuntimeDefault: true;
  133. };
  134. };
  135. export type $Type<T extends ColumnBuilderBase, TType> = T & {
  136. _: {
  137. $type: TType;
  138. };
  139. };
  140. export type HasGenerated<T extends ColumnBuilderBase, TGenerated extends {} = {}> = T & {
  141. _: {
  142. hasDefault: true;
  143. generated: TGenerated;
  144. };
  145. };
  146. export type IsIdentity<T extends ColumnBuilderBase, TType extends 'always' | 'byDefault'> = T & {
  147. _: {
  148. notNull: true;
  149. hasDefault: true;
  150. identity: TType;
  151. };
  152. };
  153. export interface ColumnBuilderBase<T extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>, TTypeConfig extends object = object> {
  154. _: ColumnBuilderTypeConfig<T, TTypeConfig>;
  155. }
  156. export declare abstract class ColumnBuilder<T extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>, TRuntimeConfig extends object = object, TTypeConfig extends object = object, TExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig> implements ColumnBuilderBase<T, TTypeConfig> {
  157. static readonly [entityKind]: string;
  158. _: ColumnBuilderTypeConfig<T, TTypeConfig>;
  159. protected config: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;
  160. constructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']);
  161. /**
  162. * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.
  163. *
  164. * @example
  165. * ```ts
  166. * const users = pgTable('users', {
  167. * id: integer('id').$type<UserId>().primaryKey(),
  168. * details: json('details').$type<UserDetails>().notNull(),
  169. * });
  170. * ```
  171. */
  172. $type<TType>(): $Type<this, TType>;
  173. /**
  174. * Adds a `not null` clause to the column definition.
  175. *
  176. * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.
  177. */
  178. notNull(): NotNull<this>;
  179. /**
  180. * Adds a `default <value>` clause to the column definition.
  181. *
  182. * Affects the `insert` model of the table - columns *with* `default` are optional on insert.
  183. *
  184. * If you need to set a dynamic default value, use {@link $defaultFn} instead.
  185. */
  186. default(value: (this['_'] extends {
  187. $type: infer U;
  188. } ? U : this['_']['data']) | SQL): HasDefault<this>;
  189. /**
  190. * Adds a dynamic default value to the column.
  191. * The function will be called when the row is inserted, and the returned value will be used as the column value.
  192. *
  193. * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.
  194. */
  195. $defaultFn(fn: () => (this['_'] extends {
  196. $type: infer U;
  197. } ? U : this['_']['data']) | SQL): HasRuntimeDefault<HasDefault<this>>;
  198. /**
  199. * Alias for {@link $defaultFn}.
  200. */
  201. $default: (fn: () => (this["_"] extends {
  202. $type: infer U;
  203. } ? U : this["_"]["data"]) | SQL) => HasRuntimeDefault<HasDefault<this>>;
  204. /**
  205. * Adds a dynamic update value to the column.
  206. * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.
  207. * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.
  208. *
  209. * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.
  210. */
  211. $onUpdateFn(fn: () => (this['_'] extends {
  212. $type: infer U;
  213. } ? U : this['_']['data']) | SQL): HasDefault<this>;
  214. /**
  215. * Alias for {@link $onUpdateFn}.
  216. */
  217. $onUpdate: (fn: () => (this["_"] extends {
  218. $type: infer U;
  219. } ? U : this["_"]["data"]) | SQL) => HasDefault<this>;
  220. /**
  221. * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.
  222. *
  223. * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.
  224. */
  225. primaryKey(): TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>> : IsPrimaryKey<NotNull<this>>;
  226. abstract generatedAlwaysAs(as: SQL | T['data'] | (() => SQL), config?: Partial<GeneratedColumnConfig<unknown>>): HasGenerated<this, {
  227. type: 'always';
  228. }>;
  229. }
  230. export type BuildColumn<TTableName extends string, TBuilder extends ColumnBuilderBase, TDialect extends Dialect> = TDialect extends 'pg' ? PgColumn<MakeColumnConfig<TBuilder['_'], TTableName>, {}, Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>> : TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TBuilder['_'], TTableName>, {}, Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect' | 'primaryKeyHasDefault' | 'mysqlColumnBuilderBrand'>>> : TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TBuilder['_'], TTableName>, {}, Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>> : TDialect extends 'common' ? Column<MakeColumnConfig<TBuilder['_'], TTableName>, {}, Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>> : TDialect extends 'singlestore' ? SingleStoreColumn<MakeColumnConfig<TBuilder['_'], TTableName>, {}, Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect' | 'primaryKeyHasDefault' | 'singlestoreColumnBuilderBrand'>>> : TDialect extends 'gel' ? GelColumn<MakeColumnConfig<TBuilder['_'], TTableName>, {}, Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>> : never;
  231. export type BuildIndexColumn<TDialect extends Dialect> = TDialect extends 'pg' ? ExtraConfigColumn : TDialect extends 'gel' ? GelExtraConfigColumn : never;
  232. export type BuildColumns<TTableName extends string, TConfigMap extends Record<string, ColumnBuilderBase>, TDialect extends Dialect> = {
  233. [Key in keyof TConfigMap]: BuildColumn<TTableName, {
  234. _: Omit<TConfigMap[Key]['_'], 'name'> & {
  235. name: TConfigMap[Key]['_']['name'] extends '' ? Assume<Key, string> : TConfigMap[Key]['_']['name'];
  236. };
  237. }, TDialect>;
  238. } & {};
  239. export type BuildExtraConfigColumns<_TTableName extends string, TConfigMap extends Record<string, ColumnBuilderBase>, TDialect extends Dialect> = {
  240. [Key in keyof TConfigMap]: BuildIndexColumn<TDialect>;
  241. } & {};
  242. export type ChangeColumnTableName<TColumn extends Column, TAlias extends string, TDialect extends Dialect> = TDialect extends 'pg' ? PgColumn<MakeColumnConfig<TColumn['_'], TAlias>> : TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TColumn['_'], TAlias>> : TDialect extends 'singlestore' ? SingleStoreColumn<MakeColumnConfig<TColumn['_'], TAlias>> : TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TColumn['_'], TAlias>> : TDialect extends 'gel' ? GelColumn<MakeColumnConfig<TColumn['_'], TAlias>> : never;