bun-query-builder 0.1.12 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +45 -468
  2. package/dist/__tests__/type-narrowing-compile.d.ts +1 -0
  3. package/dist/__tests__/type-narrowing.test.d.ts +1 -0
  4. package/dist/actions/benchmark.d.ts +1 -1
  5. package/dist/actions/cache.d.ts +1 -1
  6. package/dist/actions/console.d.ts +1 -1
  7. package/dist/actions/data.d.ts +2 -1
  8. package/dist/actions/db-info.d.ts +1 -1
  9. package/dist/actions/db-optimize.d.ts +1 -1
  10. package/dist/actions/db-wipe.d.ts +1 -1
  11. package/dist/actions/explain.d.ts +1 -1
  12. package/dist/actions/file.d.ts +1 -1
  13. package/dist/actions/index.d.ts +1 -1
  14. package/dist/actions/inspect.d.ts +1 -1
  15. package/dist/actions/introspect.d.ts +1 -1
  16. package/dist/actions/make-model.d.ts +1 -1
  17. package/dist/actions/migrate-generate.d.ts +1 -1
  18. package/dist/actions/migrate-rollback.d.ts +1 -1
  19. package/dist/actions/migrate-status.d.ts +1 -1
  20. package/dist/actions/migrate.d.ts +1 -1
  21. package/dist/actions/model-show.d.ts +1 -1
  22. package/dist/actions/ping.d.ts +1 -1
  23. package/dist/actions/query-explain-all.d.ts +1 -1
  24. package/dist/actions/relation-diagram.d.ts +1 -1
  25. package/dist/actions/seed.d.ts +1 -1
  26. package/dist/actions/sql.d.ts +1 -1
  27. package/dist/actions/unsafe.d.ts +1 -1
  28. package/dist/actions/validate.d.ts +1 -1
  29. package/dist/actions/wait-ready.d.ts +1 -1
  30. package/dist/bin/cli.js +25785 -0
  31. package/dist/browser.d.ts +118 -44
  32. package/dist/client.d.ts +22 -56
  33. package/dist/config.d.ts +16 -3
  34. package/dist/db.d.ts +5 -4
  35. package/dist/drivers/dynamodb.d.ts +3 -13
  36. package/dist/drivers/index.d.ts +2 -1
  37. package/dist/drivers/mysql.d.ts +3 -9
  38. package/dist/drivers/postgres.d.ts +3 -9
  39. package/dist/drivers/sqlite.d.ts +3 -9
  40. package/dist/dynamodb/client.d.ts +1 -5
  41. package/dist/dynamodb/index.d.ts +7 -28
  42. package/dist/dynamodb/migration-driver.d.ts +2 -23
  43. package/dist/dynamodb/migration-tracker.d.ts +4 -6
  44. package/dist/dynamodb/migrations.d.ts +4 -1
  45. package/dist/dynamodb/model.d.ts +5 -13
  46. package/dist/dynamodb-client.d.ts +3 -23
  47. package/dist/dynamodb-single-table.d.ts +22 -26
  48. package/dist/dynamodb-tooling-adapter.d.ts +2 -33
  49. package/dist/factory.d.ts +3 -3
  50. package/dist/index.d.ts +24 -1
  51. package/dist/loader.d.ts +1 -1
  52. package/dist/meta.d.ts +1 -1
  53. package/dist/migrations.d.ts +4 -4
  54. package/dist/model.d.ts +61 -3
  55. package/dist/orm.d.ts +130 -82
  56. package/dist/schema.d.ts +32 -25
  57. package/dist/seeder.d.ts +3 -1
  58. package/dist/src/browser.js +824 -0
  59. package/dist/src/dynamodb/index.js +2301 -0
  60. package/dist/{index.js → src/index.js} +21466 -20710
  61. package/dist/type-inference.d.ts +326 -0
  62. package/dist/types.d.ts +1 -5
  63. package/package.json +3 -7
package/dist/orm.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Database } from 'bun:sqlite';
1
+ import { Database, type SQLQueryBindings } from 'bun:sqlite';
2
2
  import type { Faker } from 'ts-mocker';
3
3
  export type {
4
4
  ModelInstance,
@@ -19,7 +19,7 @@ export declare function getDatabase(): Database;
19
19
  */
20
20
  export declare function createModel<const TDef extends ModelDefinition>(definition: TDef): void;
21
21
  export declare function createTableFromModel(definition: ModelDefinition): void;
22
- export declare function seedModel(definition: ModelDefinition, count?: number, faker?: any): Promise<void>;
22
+ export declare function seedModel(definition: ModelDefinition, count?: number, faker?: Record<string, unknown>): Promise<void>;
23
23
  // Attribute definition with explicit type
24
24
  export declare interface TypedAttribute<T = unknown> {
25
25
  type?: T
@@ -30,20 +30,26 @@ export declare interface TypedAttribute<T = unknown> {
30
30
  guarded?: boolean
31
31
  nullable?: boolean
32
32
  default?: InferType<T>
33
+ foreignKey?: boolean | import('./schema').ForeignKeyConfig
33
34
  validation?: {
34
35
  rule: unknown
35
36
  message?: Record<string, string>
36
37
  }
37
38
  factory?: (faker: Faker) => InferType<T>
38
39
  }
40
+ /** Structural type for model instances passed to lifecycle hooks. */
41
+ // eslint-disable-next-line ts/no-empty-object-type
42
+ export declare interface ModelHookInstance extends Record<string, unknown> {
43
+ get(key: string): unknown
44
+ }
39
45
  // Base model definition
40
46
  export declare interface ModelDefinition {
41
- name: string
42
- table: string
43
- primaryKey?: string
44
- autoIncrement?: boolean
45
- connection?: string
46
- traits?: {
47
+ readonly name: string
48
+ readonly table: string
49
+ readonly primaryKey?: string
50
+ readonly autoIncrement?: boolean
51
+ readonly connection?: string
52
+ readonly traits?: {
47
53
  readonly useUuid?: boolean
48
54
  readonly useTimestamps?: boolean | object
49
55
  readonly timestampable?: boolean | object
@@ -80,36 +86,36 @@ export declare interface ModelDefinition {
80
86
  readonly useActivityLog?: boolean | object
81
87
  readonly useSocials?: readonly string[]
82
88
  }
83
- belongsTo?: readonly string[]
84
- hasMany?: readonly string[]
85
- hasOne?: readonly string[]
86
- belongsToMany?: readonly (string | object)[]
87
- hasOneThrough?: readonly (string | object)[]
88
- hasManyThrough?: readonly (string | object)[]
89
- morphOne?: string | object
90
- morphMany?: readonly (string | object)[]
91
- morphTo?: object
92
- morphToMany?: readonly string[]
93
- morphedByMany?: readonly string[]
94
- attributes: {
89
+ readonly belongsTo?: readonly string[] | Readonly<Record<string, string>>
90
+ readonly hasMany?: readonly string[] | Readonly<Record<string, string>>
91
+ readonly hasOne?: readonly string[] | Readonly<Record<string, string>>
92
+ readonly belongsToMany?: readonly (string | object)[] | Readonly<Record<string, string | object>>
93
+ readonly hasOneThrough?: readonly (string | object)[] | Readonly<Record<string, string | object>>
94
+ readonly hasManyThrough?: readonly (string | object)[] | Readonly<Record<string, string | object>>
95
+ readonly morphOne?: string | object | Readonly<Record<string, string>>
96
+ readonly morphMany?: readonly (string | object)[] | Readonly<Record<string, string | object>>
97
+ readonly morphTo?: object
98
+ readonly morphToMany?: readonly string[]
99
+ readonly morphedByMany?: readonly string[]
100
+ readonly attributes: {
95
101
  readonly [key: string]: TypedAttribute<unknown>
96
102
  }
97
- get?: Record<string, (attributes: Record<string, unknown>) => unknown>
98
- set?: Record<string, (attributes: Record<string, unknown>) => unknown>
99
- scopes?: Record<string, (value: unknown) => unknown>
100
- indexes?: readonly object[]
101
- dashboard?: { readonly highlight?: boolean | number }
102
- hooks?: {
103
- readonly beforeCreate?: (data: any) => void | Promise<void>
104
- readonly afterCreate?: (model: any) => void | Promise<void>
105
- readonly beforeUpdate?: (model: any, data: any) => void | Promise<void>
106
- readonly afterUpdate?: (model: any) => void | Promise<void>
107
- readonly beforeDelete?: (model: any) => void | Promise<void>
108
- readonly afterDelete?: (model: any) => void | Promise<void>
103
+ readonly get?: Record<string, (attributes: Record<string, unknown>) => unknown>
104
+ readonly set?: Record<string, (attributes: Record<string, unknown>) => unknown>
105
+ readonly scopes?: Record<string, (value: unknown) => unknown>
106
+ readonly indexes?: readonly object[]
107
+ readonly dashboard?: { readonly highlight?: boolean | number }
108
+ readonly hooks?: {
109
+ readonly beforeCreate?: (data: Record<string, unknown>) => void | Promise<void>
110
+ readonly afterCreate?: (model: ModelHookInstance) => void | Promise<void>
111
+ readonly beforeUpdate?: (model: ModelHookInstance, data: Record<string, unknown>) => void | Promise<void>
112
+ readonly afterUpdate?: (model: ModelHookInstance) => void | Promise<void>
113
+ readonly beforeDelete?: (model: ModelHookInstance) => void | Promise<void>
114
+ readonly afterDelete?: (model: ModelHookInstance) => void | Promise<void>
109
115
  }
110
116
  }
111
117
  // Binding helper type for SQL queries
112
- declare type Bindings = SQLQueryBindings[]
118
+ declare type Bindings = SQLQueryBindings[];
113
119
  // Primitive type mappings
114
120
  declare type PrimitiveTypeMap = {
115
121
  string: string
@@ -122,13 +128,13 @@ declare type PrimitiveTypeMap = {
122
128
  declare type InferType<T> = T extends keyof PrimitiveTypeMap ? PrimitiveTypeMap[T] :
123
129
  T extends readonly (infer U)[] ? U :
124
130
  T extends (infer U)[] ? U :
125
- unknown
131
+ unknown;
126
132
  // Extract attribute keys from definition
127
- declare type AttributeKeys<TDef extends ModelDefinition> = keyof TDef['attributes'] & string
133
+ declare type AttributeKeys<TDef extends ModelDefinition> = keyof TDef['attributes'] & string;
128
134
  // Infer single attribute type
129
135
  declare type InferAttributeType<TAttr> = TAttr extends { type: infer T } ? InferType<T> :
130
136
  TAttr extends { factory: (faker: Faker) => infer R } ? R :
131
- unknown
137
+ unknown;
132
138
  // Build the full attributes type from definition
133
139
  declare type InferModelAttributes<TDef extends ModelDefinition> = {
134
140
  [K in AttributeKeys<TDef>]: InferAttributeType<TDef['attributes'][K]>
@@ -136,58 +142,83 @@ declare type InferModelAttributes<TDef extends ModelDefinition> = {
136
142
  // System fields added by traits
137
143
  declare type SystemFields<TDef extends ModelDefinition> = { id: number } &
138
144
  (TDef['traits'] extends { useUuid: true } ? { uuid: string } : {}) &
139
- (TDef['traits'] extends { useTimestamps: true } ? { created_at: string; updated_at: string } : {}) &
140
- (TDef['traits'] extends { useSoftDeletes: true } ? { deleted_at: string | null } : {})
145
+ (TDef['traits'] extends { useTimestamps: true } ? { created_at: string; updated_at: string | null } : {}) &
146
+ (TDef['traits'] extends { timestampable: true | object } ? { created_at: string; updated_at: string | null } : {}) &
147
+ (TDef['traits'] extends { useSoftDeletes: true } ? { deleted_at: string | null } : {}) &
148
+ (TDef['traits'] extends { softDeletable: true | object } ? { deleted_at: string | null } : {}) &
149
+ (TDef['traits'] extends { useAuth: true | object } ? { two_factor_secret: string | null; public_key: string | null } : {}) &
150
+ (TDef['traits'] extends { billable: true | object } ? { stripe_id: string | null } : {});
141
151
  // Complete model type
142
- declare type ModelAttributes<TDef extends ModelDefinition> = InferModelAttributes<TDef> & SystemFields<TDef>
152
+ declare type ModelAttributes<TDef extends ModelDefinition> = InferModelAttributes<TDef> & SystemFields<TDef>;
143
153
  // All valid column names
144
154
  declare type ColumnName<TDef extends ModelDefinition> = | AttributeKeys<TDef>
145
155
  | 'id'
146
156
  | (TDef['traits'] extends { useUuid: true } ? 'uuid' : never)
147
157
  | (TDef['traits'] extends { useTimestamps: true } ? 'created_at' | 'updated_at' : never)
158
+ | (TDef['traits'] extends { timestampable: true | object } ? 'created_at' | 'updated_at' : never)
148
159
  | (TDef['traits'] extends { useSoftDeletes: true } ? 'deleted_at' : never)
160
+ | (TDef['traits'] extends { softDeletable: true | object } ? 'deleted_at' : never)
161
+ | (TDef['traits'] extends { useAuth: true | object } ? 'two_factor_secret' | 'public_key' : never)
162
+ | (TDef['traits'] extends { billable: true | object } ? 'stripe_id' : never);
149
163
  // Hidden fields
150
164
  declare type HiddenKeys<TDef extends ModelDefinition> = {
151
165
  [K in AttributeKeys<TDef>]: TDef['attributes'][K] extends { hidden: true } ? K : never
152
- }[AttributeKeys<TDef>]
166
+ }[AttributeKeys<TDef>];
153
167
  // Fillable fields
154
168
  declare type FillableKeys<TDef extends ModelDefinition> = {
155
169
  [K in AttributeKeys<TDef>]: TDef['attributes'][K] extends { fillable: true } ? K : never
156
- }[AttributeKeys<TDef>]
157
- // Infer relation names from model definition
158
- declare type InferBelongsToNames<TDef> = TDef extends { belongsTo: readonly (infer R)[] }
159
- ? R extends string ? Lowercase<R> : never : never
160
- declare type InferHasManyNames<TDef> = TDef extends { hasMany: readonly (infer R)[] }
161
- ? R extends string ? Lowercase<R> : never : never
162
- declare type InferHasOneNames<TDef> = TDef extends { hasOne: readonly (infer R)[] }
163
- ? R extends string ? Lowercase<R> : never : never
164
- declare type InferBelongsToManyNames<TDef> = TDef extends { belongsToMany: readonly (infer R)[] }
165
- ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never
166
- declare type InferHasOneThroughNames<TDef> = TDef extends { hasOneThrough: readonly (infer R)[] }
167
- ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never
168
- declare type InferHasManyThroughNames<TDef> = TDef extends { hasManyThrough: readonly (infer R)[] }
169
- ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never
170
+ }[AttributeKeys<TDef>];
171
+ // Numeric attribute columns constrains aggregate methods (sum, avg, etc.)
172
+ declare type NumericColumns<TDef extends ModelDefinition> = {
173
+ [K in AttributeKeys<TDef>]: TDef['attributes'][K] extends { type: 'number' } ? K : never
174
+ }[AttributeKeys<TDef>];
175
+ // Infer relation names from model definition (supports both array and object syntax)
176
+ declare type InferBelongsToNames<TDef> = (TDef extends { belongsTo: readonly (infer R)[] }
177
+ ? R extends string ? Lowercase<R> : never : never)
178
+ | (TDef extends { belongsTo: Readonly<Record<infer K, unknown>> }
179
+ ? K extends string ? K : never : never);
180
+ declare type InferHasManyNames<TDef> = (TDef extends { hasMany: readonly (infer R)[] }
181
+ ? R extends string ? Lowercase<R> : never : never)
182
+ | (TDef extends { hasMany: Readonly<Record<infer K, unknown>> }
183
+ ? K extends string ? K : never : never);
184
+ declare type InferHasOneNames<TDef> = (TDef extends { hasOne: readonly (infer R)[] }
185
+ ? R extends string ? Lowercase<R> : never : never)
186
+ | (TDef extends { hasOne: Readonly<Record<infer K, unknown>> }
187
+ ? K extends string ? K : never : never);
188
+ declare type InferBelongsToManyNames<TDef> = (TDef extends { belongsToMany: readonly (infer R)[] }
189
+ ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never)
190
+ | (TDef extends { belongsToMany: Readonly<Record<infer K, unknown>> }
191
+ ? K extends string ? K : never : never);
192
+ declare type InferHasOneThroughNames<TDef> = (TDef extends { hasOneThrough: readonly (infer R)[] }
193
+ ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never)
194
+ | (TDef extends { hasOneThrough: Readonly<Record<infer K, unknown>> }
195
+ ? K extends string ? K : never : never);
196
+ declare type InferHasManyThroughNames<TDef> = (TDef extends { hasManyThrough: readonly (infer R)[] }
197
+ ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never)
198
+ | (TDef extends { hasManyThrough: Readonly<Record<infer K, unknown>> }
199
+ ? K extends string ? K : never : never);
170
200
  export type InferRelationNames<TDef> = | InferBelongsToNames<TDef>
171
201
  | InferHasManyNames<TDef>
172
202
  | InferHasOneNames<TDef>
173
203
  | InferBelongsToManyNames<TDef>
174
204
  | InferHasOneThroughNames<TDef>
175
- | InferHasManyThroughNames<TDef>
176
- declare type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in'
205
+ | InferHasManyThroughNames<TDef>;
206
+ declare type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in';
177
207
  /**
178
208
  * Model instance - represents a single database record
179
209
  */
180
210
  declare class ModelInstance<TDef extends ModelDefinition, TSelected extends ColumnName<TDef> = ColumnName<TDef>> {
181
- private _attributes: Record<string, unknown>;
182
- private _original: Record<string, unknown>;
183
- private _definition: TDef;
184
- private _hasSaved: any;
185
211
  constructor(definition: TDef, attributes?: Partial<ModelAttributes<TDef>>);
186
212
  get<K extends TSelected>(key: K): K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : never;
187
- set<K extends AttributeKeys<TDef>>(key: K, value: ModelAttributes<TDef>[K]): void;
188
- isDirty<K extends AttributeKeys<TDef>>(column?: K): boolean;
189
- isClean<K extends AttributeKeys<TDef>>(column?: K): boolean;
190
- getOriginal<K extends AttributeKeys<TDef>>(column: K): ModelAttributes<TDef>[K];
213
+ set<K extends ColumnName<TDef>>(key: K, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): void;
214
+ getRelation(name: string): ModelInstance<any, any>[] | ModelInstance<any, any> | null | undefined;
215
+ setRelation(name: string, data: ModelInstance<any, any>[] | ModelInstance<any, any> | null): void;
216
+ getLoadedRelations(): Record<string, ModelInstance<any, any>[] | ModelInstance<any, any> | null>;
217
+ get attributes(): Pick<ModelAttributes<TDef>, TSelected & keyof ModelAttributes<TDef>>;
218
+ get id(): number;
219
+ isDirty(column?: ColumnName<TDef>): boolean;
220
+ isClean(column?: ColumnName<TDef>): boolean;
221
+ getOriginal<K extends ColumnName<TDef>>(column: K): K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown;
191
222
  getChanges(): Partial<InferModelAttributes<TDef>>;
192
223
  fill(data: Partial<Pick<InferModelAttributes<TDef>, FillableKeys<TDef>>>): this;
193
224
  forceFill(data: Partial<InferModelAttributes<TDef>>): this;
@@ -195,27 +226,29 @@ declare class ModelInstance<TDef extends ModelDefinition, TSelected extends Colu
195
226
  update(data: Partial<Pick<InferModelAttributes<TDef>, FillableKeys<TDef>>>): this;
196
227
  delete(): boolean;
197
228
  refresh(): this;
229
+ replicate(): ModelInstance<TDef, TSelected>;
198
230
  toJSON(): Omit<Pick<ModelAttributes<TDef>, TSelected & keyof ModelAttributes<TDef>>, HiddenKeys<TDef>>;
231
+ toArray(): Omit<Pick<ModelAttributes<TDef>, TSelected & keyof ModelAttributes<TDef>>, HiddenKeys<TDef>>;
199
232
  }
200
233
  /**
201
234
  * Query builder with precise type narrowing
202
235
  */
203
236
  declare class ModelQueryBuilder<TDef extends ModelDefinition, TSelected extends ColumnName<TDef> = ColumnName<TDef>> {
204
- private _definition: TDef;
205
- private _wheres: { column: string; operator: WhereOperator; value: unknown; boolean: 'and' | 'or' }[];
206
- private _orderBy: { column: string; direction: 'asc' | 'desc' }[];
207
- private _limit?: number;
208
- private _offset?: number;
209
- private _select: string[];
210
- private _withRelations: string[];
211
237
  constructor(definition: TDef);
212
- where<K extends ColumnName<TDef>>(column: K, operatorOrValue: WhereOperator | (K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown), value?: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
213
- orWhere<K extends ColumnName<TDef>>(column: K, operatorOrValue: WhereOperator | (K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown), value?: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
238
+ where<K extends ColumnName<TDef>>(column: K, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
239
+ where<K extends ColumnName<TDef>>(column: K, operator: WhereOperator, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
240
+ where<K extends ColumnName<TDef>>(column: K, operatorOrValue: WhereOperator | unknown, value?: unknown): ModelQueryBuilder<TDef, TSelected>;
241
+ orWhere<K extends ColumnName<TDef>>(column: K, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
242
+ orWhere<K extends ColumnName<TDef>>(column: K, operator: WhereOperator, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
243
+ orWhere<K extends ColumnName<TDef>>(column: K, operatorOrValue: WhereOperator | unknown, value?: unknown): ModelQueryBuilder<TDef, TSelected>;
214
244
  whereIn<K extends ColumnName<TDef>>(column: K, values: (K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown)[]): ModelQueryBuilder<TDef, TSelected>;
215
245
  whereNotIn<K extends ColumnName<TDef>>(column: K, values: (K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown)[]): ModelQueryBuilder<TDef, TSelected>;
216
246
  whereNull<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
217
247
  whereNotNull<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
218
248
  whereLike<K extends ColumnName<TDef>>(column: K, pattern: string): ModelQueryBuilder<TDef, TSelected>;
249
+ whereBetween<K extends ColumnName<TDef>>(column: K, range: [min: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown, max: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown]): ModelQueryBuilder<TDef, TSelected>;
250
+ whereNotBetween<K extends ColumnName<TDef>>(column: K, range: [min: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown, max: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown]): ModelQueryBuilder<TDef, TSelected>;
251
+ when(condition: unknown, callback: (builder: ModelQueryBuilder<TDef, TSelected>) => ModelQueryBuilder<TDef, TSelected>): ModelQueryBuilder<TDef, TSelected>;
219
252
  orderBy<K extends ColumnName<TDef>>(column: K, direction?: 'asc' | 'desc'): ModelQueryBuilder<TDef, TSelected>;
220
253
  orderByDesc<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
221
254
  orderByAsc<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
@@ -223,22 +256,37 @@ declare class ModelQueryBuilder<TDef extends ModelDefinition, TSelected extends
223
256
  take(count: number): ModelQueryBuilder<TDef, TSelected>;
224
257
  offset(count: number): ModelQueryBuilder<TDef, TSelected>;
225
258
  skip(count: number): ModelQueryBuilder<TDef, TSelected>;
226
- select<K extends ColumnName<TDef>>(columns: K[]): ModelQueryBuilder<TDef, K>;
227
- with<R extends InferRelationNames<TDef>>(relations: R[]): ModelQueryBuilder<TDef, TSelected>;
259
+ select<K extends ColumnName<TDef>>(...columns: K[]): ModelQueryBuilder<TDef, K>;
260
+ with<R extends InferRelationNames<TDef>>(...relations: R[]): ModelQueryBuilder<TDef, TSelected>;
228
261
  getWithRelations(): string[];
229
- private buildQuery(): { sql: string; params: unknown[] };
262
+ toSql(): { sql: string; params: unknown[] };
230
263
  get(): ModelInstance<TDef, TSelected>[];
231
264
  first(): ModelInstance<TDef, TSelected> | undefined;
232
265
  firstOrFail(): ModelInstance<TDef, TSelected>;
233
266
  last(): ModelInstance<TDef, TSelected> | undefined;
234
267
  count(): number;
235
268
  exists(): boolean;
236
- paginate(page?: any, perPage?: any): void;
269
+ doesntExist(): boolean;
270
+ sole(): ModelInstance<TDef, TSelected>;
271
+ increment<K extends NumericColumns<TDef>>(column: K, amount?: number): number;
272
+ decrement<K extends NumericColumns<TDef>>(column: K, amount?: number): number;
273
+ chunk(size: number, callback: (items: ModelInstance<TDef, TSelected>[]) => void | false): void;
274
+ paginate(page?: number, perPage?: number): {
275
+ data: ModelInstance<TDef, TSelected>[]
276
+ total: number
277
+ page: number
278
+ perPage: number
279
+ lastPage: number
280
+ hasMorePages: boolean
281
+ isEmpty: boolean
282
+ from: number | null
283
+ to: number | null
284
+ };
237
285
  pluck<K extends ColumnName<TDef>>(column: K): (K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown)[];
238
- max<K extends AttributeKeys<TDef>>(column: K): number;
239
- min<K extends AttributeKeys<TDef>>(column: K): number;
240
- avg<K extends AttributeKeys<TDef>>(column: K): number;
241
- sum<K extends AttributeKeys<TDef>>(column: K): number;
286
+ max<K extends ColumnName<TDef>>(column: K): number;
287
+ min<K extends ColumnName<TDef>>(column: K): number;
288
+ avg<K extends NumericColumns<TDef>>(column: K): number;
289
+ sum<K extends NumericColumns<TDef>>(column: K): number;
242
290
  delete(): number;
243
291
  update(data: Partial<Pick<InferModelAttributes<TDef>, FillableKeys<TDef>>>): number;
244
- }
292
+ }
package/dist/schema.d.ts CHANGED
@@ -28,6 +28,13 @@ export declare function defineModel<const T extends ModelDefinition>(model: T):
28
28
  * ```
29
29
  */
30
30
  export declare function defineModels<const T extends ModelRecord>(models: T): T;
31
+ export declare interface ForeignKeyConfig {
32
+ table: string
33
+ column?: string
34
+ onDelete?: OnForeignKeyAction
35
+ onUpdate?: OnForeignKeyAction
36
+ nullable?: boolean
37
+ }
31
38
  /**
32
39
  * # `Attribute`
33
40
  *
@@ -51,6 +58,7 @@ export declare interface Attribute {
51
58
  hidden?: boolean
52
59
  fillable?: boolean
53
60
  guarded?: boolean
61
+ foreignKey?: boolean | ForeignKeyConfig
54
62
  factory?: (faker: Faker) => any
55
63
  validation: {
56
64
  rule: ValidationType
@@ -58,7 +66,7 @@ export declare interface Attribute {
58
66
  }
59
67
  }
60
68
  export declare interface AttributesElements {
61
-
69
+ [key: string]: Attribute
62
70
  }
63
71
  /**
64
72
  * # `CompositeIndex`
@@ -74,9 +82,7 @@ export declare interface CompositeIndex {
74
82
  name: string
75
83
  columns: string[]
76
84
  }
77
- export declare interface Base {
78
-
79
- }
85
+ export declare interface Base {}
80
86
  /**
81
87
  * # `ModelOptions`
82
88
  *
@@ -131,40 +137,41 @@ export declare interface ModelOptions extends Base {
131
137
  *
132
138
  * Map of field identifiers to custom error messages returned by validators.
133
139
  */
134
- export type ValidatorMessage = Record<string, string>
140
+ export type ValidatorMessage = Record<string, string>;
141
+ export type OnForeignKeyAction = 'cascade' | 'set null' | 'restrict' | 'no action';
135
142
  /**
136
143
  * # `ValidationType`
137
144
  *
138
145
  * External validator rule type (compatible with ts-validation). Kept broad to
139
146
  * avoid a hard dependency while still enabling type inference via rule shape.
140
147
  */
141
- export type ValidationType = unknown
142
- export type ModelNames = string
148
+ export type ValidationType = unknown;
149
+ export type ModelNames = string;
143
150
  /**
144
151
  * # Relationship helpers
145
152
  *
146
153
  * Lightweight relationship declarations for model definitions. Each helper is a
147
154
  * record keyed by relation name with the related model name as value.
148
155
  */
149
- export type HasOne<T extends string> = Record<string, T>
150
- export type HasMany<T extends string> = Record<string, T>
151
- export type BelongsTo<T extends string> = Record<string, T>
152
- export type BelongsToMany<T extends string> = Record<string, T>
153
- export type HasOneThrough<T extends string> = Record<string, { through: T, target: T }>
154
- export type HasManyThrough<T extends string> = Record<string, { through: T, target: T }>
155
- export type MorphOne<T extends string> = Record<string, T>
156
- export type MorphMany<T extends string> = Record<string, T>
157
- export type MorphTo = Record<string, unknown>
158
- export type MorphToMany<T extends string> = Record<string, T>
159
- export type MorphedByMany<T extends string> = Record<string, T>
160
- export type ModelDefinition = Readonly<ModelOptions>
156
+ export type HasOne<T extends string> = Record<string, T>;
157
+ export type HasMany<T extends string> = Record<string, T>;
158
+ export type BelongsTo<T extends string> = Record<string, T>;
159
+ export type BelongsToMany<T extends string> = Record<string, T>;
160
+ export type HasOneThrough<T extends string> = Record<string, { through: T, target: T }>;
161
+ export type HasManyThrough<T extends string> = Record<string, { through: T, target: T }>;
162
+ export type MorphOne<T extends string> = Record<string, T>;
163
+ export type MorphMany<T extends string> = Record<string, T>;
164
+ export type MorphTo = Record<string, unknown>;
165
+ export type MorphToMany<T extends string> = Record<string, T>;
166
+ export type MorphedByMany<T extends string> = Record<string, T>;
167
+ export type ModelDefinition = Readonly<ModelOptions>;
161
168
  /**
162
169
  * # `ModelRecord`
163
170
  *
164
171
  * Collection of models keyed by model name. Kept flexible to preserve literal
165
172
  * attribute keys and value types.
166
173
  */
167
- export type ModelRecord = Record<string, any>
174
+ export type ModelRecord = Record<string, any>;
168
175
  /**
169
176
  * # `InferAttributes<M>`
170
177
  *
@@ -177,12 +184,12 @@ declare type ExtractRuleInput<R> = R extends { validate: (value: infer T) => any
177
184
  ? T
178
185
  : R extends { getRules: () => Array<{ test: (value: infer T) => any }> }
179
186
  ? T
180
- : unknown
187
+ : unknown;
181
188
  export type InferAttributes<M extends ModelDefinition> = M extends {
182
189
  attributes: infer A extends Record<string, { validation: { rule: any } }>
183
190
  }
184
191
  ? { [K in keyof A & string]: ExtractRuleInput<A[K]['validation']['rule']> }
185
- : Record<string, unknown>
192
+ : Record<string, unknown>;
186
193
  /**
187
194
  * # `InferPrimaryKey<M>`
188
195
  *
@@ -192,7 +199,7 @@ export type InferPrimaryKey<M extends ModelDefinition> = M extends {
192
199
  primaryKey: infer K extends string
193
200
  }
194
201
  ? K
195
- : 'id'
202
+ : 'id';
196
203
  /**
197
204
  * # `InferTableName<M>`
198
205
  *
@@ -205,7 +212,7 @@ export type InferTableName<M extends ModelDefinition> = M extends {
205
212
  ? T
206
213
  : M extends { name: infer N extends string }
207
214
  ? `${Lowercase<N>}s`
208
- : string
215
+ : string;
209
216
  /**
210
217
  * # `DatabaseSchema<Models>`
211
218
  *
@@ -224,4 +231,4 @@ export type DatabaseSchema<MRecord extends ModelRecord> = {
224
231
  columns: InferAttributes<MRecord[MName]>
225
232
  primaryKey: InferPrimaryKey<MRecord[MName]>
226
233
  };
227
- }
234
+ }
package/dist/seeder.d.ts CHANGED
@@ -23,4 +23,6 @@ export declare interface RunSeederOptions {
23
23
  */
24
24
  export declare abstract class Seeder {
25
25
  abstract run(qb: any): Promise<void>;
26
- }
26
+ get order(): number;
27
+ get description(): string | undefined;
28
+ }