bun-query-builder 0.1.13 → 0.1.16

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 (61) hide show
  1. package/README.md +45 -468
  2. package/dist/actions/benchmark.d.ts +1 -1
  3. package/dist/actions/cache.d.ts +1 -1
  4. package/dist/actions/console.d.ts +1 -1
  5. package/dist/actions/data.d.ts +2 -9
  6. package/dist/actions/db-info.d.ts +1 -1
  7. package/dist/actions/db-optimize.d.ts +1 -1
  8. package/dist/actions/db-wipe.d.ts +1 -1
  9. package/dist/actions/explain.d.ts +1 -1
  10. package/dist/actions/file.d.ts +1 -1
  11. package/dist/actions/index.d.ts +1 -1
  12. package/dist/actions/inspect.d.ts +1 -1
  13. package/dist/actions/introspect.d.ts +1 -1
  14. package/dist/actions/make-model.d.ts +1 -1
  15. package/dist/actions/migrate-generate.d.ts +1 -1
  16. package/dist/actions/migrate-rollback.d.ts +1 -1
  17. package/dist/actions/migrate-status.d.ts +1 -1
  18. package/dist/actions/migrate.d.ts +1 -1
  19. package/dist/actions/model-show.d.ts +1 -1
  20. package/dist/actions/ping.d.ts +1 -1
  21. package/dist/actions/query-explain-all.d.ts +1 -1
  22. package/dist/actions/relation-diagram.d.ts +1 -1
  23. package/dist/actions/seed.d.ts +1 -1
  24. package/dist/actions/sql.d.ts +1 -1
  25. package/dist/actions/unsafe.d.ts +1 -1
  26. package/dist/actions/validate.d.ts +1 -1
  27. package/dist/actions/wait-ready.d.ts +1 -1
  28. package/dist/bin/cli.js +24428 -0
  29. package/dist/browser.d.ts +109 -44
  30. package/dist/client.d.ts +22 -56
  31. package/dist/config.d.ts +16 -3
  32. package/dist/drivers/dynamodb.d.ts +3 -13
  33. package/dist/drivers/index.d.ts +2 -1
  34. package/dist/drivers/mysql.d.ts +3 -21
  35. package/dist/drivers/postgres.d.ts +3 -21
  36. package/dist/drivers/sqlite.d.ts +3 -21
  37. package/dist/dynamodb/client.d.ts +1 -5
  38. package/dist/dynamodb/index.d.ts +7 -28
  39. package/dist/dynamodb/migration-driver.d.ts +2 -23
  40. package/dist/dynamodb/migration-tracker.d.ts +8 -6
  41. package/dist/dynamodb/migrations.d.ts +4 -1
  42. package/dist/dynamodb/model.d.ts +5 -13
  43. package/dist/dynamodb-client.d.ts +3 -23
  44. package/dist/dynamodb-single-table.d.ts +28 -26
  45. package/dist/dynamodb-tooling-adapter.d.ts +2 -33
  46. package/dist/factory.d.ts +3 -3
  47. package/dist/index.d.ts +24 -1
  48. package/dist/loader.d.ts +1 -1
  49. package/dist/meta.d.ts +1 -1
  50. package/dist/migrations.d.ts +4 -4
  51. package/dist/model.d.ts +61 -3
  52. package/dist/orm.d.ts +153 -83
  53. package/dist/schema.d.ts +32 -25
  54. package/dist/seeder.d.ts +3 -1
  55. package/dist/{browser.js → src/browser.js} +32 -6
  56. package/dist/{dynamodb → src/dynamodb}/index.js +29 -3
  57. package/dist/{index.js → src/index.js} +11630 -12230
  58. package/dist/type-inference.d.ts +326 -0
  59. package/dist/types.d.ts +1 -5
  60. package/package.json +7 -7
  61. package/dist/db.d.ts +0 -30
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,31 @@ 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
+ getAttribute?(key: string): unknown
45
+ getAttributes?(): Record<string, unknown>
46
+ only?(keys: ReadonlyArray<string>): Record<string, unknown>
47
+ except?(keys: ReadonlyArray<string>): Record<string, unknown>
48
+ toArray?(): Record<string, unknown>
49
+ }
39
50
  // Base model definition
40
51
  export declare interface ModelDefinition {
41
- name: string
42
- table: string
43
- primaryKey?: string
44
- autoIncrement?: boolean
45
- connection?: string
46
- traits?: {
52
+ readonly name: string
53
+ readonly table: string
54
+ readonly primaryKey?: string
55
+ readonly autoIncrement?: boolean
56
+ readonly connection?: string
57
+ readonly traits?: {
47
58
  readonly useUuid?: boolean
48
59
  readonly useTimestamps?: boolean | object
49
60
  readonly timestampable?: boolean | object
@@ -80,36 +91,36 @@ export declare interface ModelDefinition {
80
91
  readonly useActivityLog?: boolean | object
81
92
  readonly useSocials?: readonly string[]
82
93
  }
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: {
94
+ readonly belongsTo?: readonly string[] | Readonly<Record<string, string>>
95
+ readonly hasMany?: readonly string[] | Readonly<Record<string, string>>
96
+ readonly hasOne?: readonly string[] | Readonly<Record<string, string>>
97
+ readonly belongsToMany?: readonly (string | object)[] | Readonly<Record<string, string | object>>
98
+ readonly hasOneThrough?: readonly (string | object)[] | Readonly<Record<string, string | object>>
99
+ readonly hasManyThrough?: readonly (string | object)[] | Readonly<Record<string, string | object>>
100
+ readonly morphOne?: string | object | Readonly<Record<string, string>>
101
+ readonly morphMany?: readonly (string | object)[] | Readonly<Record<string, string | object>>
102
+ readonly morphTo?: object
103
+ readonly morphToMany?: readonly string[]
104
+ readonly morphedByMany?: readonly string[]
105
+ readonly attributes: {
95
106
  readonly [key: string]: TypedAttribute<unknown>
96
107
  }
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>
108
+ readonly get?: Record<string, (attributes: Record<string, unknown>) => unknown>
109
+ readonly set?: Record<string, (attributes: Record<string, unknown>) => unknown>
110
+ readonly scopes?: Record<string, (value: unknown) => unknown>
111
+ readonly indexes?: readonly object[]
112
+ readonly dashboard?: { readonly highlight?: boolean | number }
113
+ readonly hooks?: {
114
+ readonly beforeCreate?: (data: Record<string, unknown>) => void | Promise<void>
115
+ readonly afterCreate?: (model: ModelHookInstance) => void | Promise<void>
116
+ readonly beforeUpdate?: (model: ModelHookInstance, data: Record<string, unknown>) => void | Promise<void>
117
+ readonly afterUpdate?: (model: ModelHookInstance) => void | Promise<void>
118
+ readonly beforeDelete?: (model: ModelHookInstance) => void | Promise<void>
119
+ readonly afterDelete?: (model: ModelHookInstance) => void | Promise<void>
109
120
  }
110
121
  }
111
122
  // Binding helper type for SQL queries
112
- declare type Bindings = SQLQueryBindings[]
123
+ declare type Bindings = SQLQueryBindings[];
113
124
  // Primitive type mappings
114
125
  declare type PrimitiveTypeMap = {
115
126
  string: string
@@ -122,13 +133,13 @@ declare type PrimitiveTypeMap = {
122
133
  declare type InferType<T> = T extends keyof PrimitiveTypeMap ? PrimitiveTypeMap[T] :
123
134
  T extends readonly (infer U)[] ? U :
124
135
  T extends (infer U)[] ? U :
125
- unknown
136
+ unknown;
126
137
  // Extract attribute keys from definition
127
- declare type AttributeKeys<TDef extends ModelDefinition> = keyof TDef['attributes'] & string
138
+ declare type AttributeKeys<TDef extends ModelDefinition> = keyof TDef['attributes'] & string;
128
139
  // Infer single attribute type
129
140
  declare type InferAttributeType<TAttr> = TAttr extends { type: infer T } ? InferType<T> :
130
141
  TAttr extends { factory: (faker: Faker) => infer R } ? R :
131
- unknown
142
+ unknown;
132
143
  // Build the full attributes type from definition
133
144
  declare type InferModelAttributes<TDef extends ModelDefinition> = {
134
145
  [K in AttributeKeys<TDef>]: InferAttributeType<TDef['attributes'][K]>
@@ -136,86 +147,130 @@ declare type InferModelAttributes<TDef extends ModelDefinition> = {
136
147
  // System fields added by traits
137
148
  declare type SystemFields<TDef extends ModelDefinition> = { id: number } &
138
149
  (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 } : {})
150
+ (TDef['traits'] extends { useTimestamps: true } ? { created_at: string; updated_at: string | null } : {}) &
151
+ (TDef['traits'] extends { timestampable: true | object } ? { created_at: string; updated_at: string | null } : {}) &
152
+ (TDef['traits'] extends { useSoftDeletes: true } ? { deleted_at: string | null } : {}) &
153
+ (TDef['traits'] extends { softDeletable: true | object } ? { deleted_at: string | null } : {}) &
154
+ (TDef['traits'] extends { useAuth: true | object } ? { two_factor_secret: string | null; public_key: string | null } : {}) &
155
+ (TDef['traits'] extends { billable: true | object } ? { stripe_id: string | null } : {});
141
156
  // Complete model type
142
- declare type ModelAttributes<TDef extends ModelDefinition> = InferModelAttributes<TDef> & SystemFields<TDef>
157
+ declare type ModelAttributes<TDef extends ModelDefinition> = InferModelAttributes<TDef> & SystemFields<TDef>;
143
158
  // All valid column names
144
159
  declare type ColumnName<TDef extends ModelDefinition> = | AttributeKeys<TDef>
145
160
  | 'id'
146
161
  | (TDef['traits'] extends { useUuid: true } ? 'uuid' : never)
147
162
  | (TDef['traits'] extends { useTimestamps: true } ? 'created_at' | 'updated_at' : never)
163
+ | (TDef['traits'] extends { timestampable: true | object } ? 'created_at' | 'updated_at' : never)
148
164
  | (TDef['traits'] extends { useSoftDeletes: true } ? 'deleted_at' : never)
165
+ | (TDef['traits'] extends { softDeletable: true | object } ? 'deleted_at' : never)
166
+ | (TDef['traits'] extends { useAuth: true | object } ? 'two_factor_secret' | 'public_key' : never)
167
+ | (TDef['traits'] extends { billable: true | object } ? 'stripe_id' : never);
149
168
  // Hidden fields
150
169
  declare type HiddenKeys<TDef extends ModelDefinition> = {
151
170
  [K in AttributeKeys<TDef>]: TDef['attributes'][K] extends { hidden: true } ? K : never
152
- }[AttributeKeys<TDef>]
171
+ }[AttributeKeys<TDef>];
153
172
  // Fillable fields
154
173
  declare type FillableKeys<TDef extends ModelDefinition> = {
155
174
  [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
175
+ }[AttributeKeys<TDef>];
176
+ // Numeric attribute columns constrains aggregate methods (sum, avg, etc.)
177
+ declare type NumericColumns<TDef extends ModelDefinition> = {
178
+ [K in AttributeKeys<TDef>]: TDef['attributes'][K] extends { type: 'number' } ? K : never
179
+ }[AttributeKeys<TDef>];
180
+ // Infer relation names from model definition (supports both array and object syntax)
181
+ declare type InferBelongsToNames<TDef> = (TDef extends { belongsTo: readonly (infer R)[] }
182
+ ? R extends string ? Lowercase<R> : never : never)
183
+ | (TDef extends { belongsTo: Readonly<Record<infer K, unknown>> }
184
+ ? K extends string ? K : never : never);
185
+ declare type InferHasManyNames<TDef> = (TDef extends { hasMany: readonly (infer R)[] }
186
+ ? R extends string ? Lowercase<R> : never : never)
187
+ | (TDef extends { hasMany: Readonly<Record<infer K, unknown>> }
188
+ ? K extends string ? K : never : never);
189
+ declare type InferHasOneNames<TDef> = (TDef extends { hasOne: readonly (infer R)[] }
190
+ ? R extends string ? Lowercase<R> : never : never)
191
+ | (TDef extends { hasOne: Readonly<Record<infer K, unknown>> }
192
+ ? K extends string ? K : never : never);
193
+ declare type InferBelongsToManyNames<TDef> = (TDef extends { belongsToMany: readonly (infer R)[] }
194
+ ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never)
195
+ | (TDef extends { belongsToMany: Readonly<Record<infer K, unknown>> }
196
+ ? K extends string ? K : never : never);
197
+ declare type InferHasOneThroughNames<TDef> = (TDef extends { hasOneThrough: readonly (infer R)[] }
198
+ ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never)
199
+ | (TDef extends { hasOneThrough: Readonly<Record<infer K, unknown>> }
200
+ ? K extends string ? K : never : never);
201
+ declare type InferHasManyThroughNames<TDef> = (TDef extends { hasManyThrough: readonly (infer R)[] }
202
+ ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never)
203
+ | (TDef extends { hasManyThrough: Readonly<Record<infer K, unknown>> }
204
+ ? K extends string ? K : never : never);
170
205
  export type InferRelationNames<TDef> = | InferBelongsToNames<TDef>
171
206
  | InferHasManyNames<TDef>
172
207
  | InferHasOneNames<TDef>
173
208
  | InferBelongsToManyNames<TDef>
174
209
  | InferHasOneThroughNames<TDef>
175
- | InferHasManyThroughNames<TDef>
176
- declare type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in'
210
+ | InferHasManyThroughNames<TDef>;
211
+ declare type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in';
177
212
  /**
178
213
  * Model instance - represents a single database record
179
214
  */
180
215
  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
216
  constructor(definition: TDef, attributes?: Partial<ModelAttributes<TDef>>);
186
217
  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];
218
+ getAttribute<K extends TSelected>(key: K): K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown;
219
+ getAttributes(): Pick<ModelAttributes<TDef>, TSelected & keyof ModelAttributes<TDef>>;
220
+ set<K extends ColumnName<TDef>>(key: K, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): void;
221
+ only<K extends TSelected>(keys: ReadonlyArray<K>): Partial<ModelAttributes<TDef>>;
222
+ except<K extends TSelected>(keys: ReadonlyArray<K>): Partial<ModelAttributes<TDef>>;
223
+ toArray(): Record<string, unknown>;
224
+ getRelation(name: string): ModelInstance<any, any>[] | ModelInstance<any, any> | null | undefined;
225
+ setRelation(name: string, data: ModelInstance<any, any>[] | ModelInstance<any, any> | null): void;
226
+ getLoadedRelations(): Record<string, ModelInstance<any, any>[] | ModelInstance<any, any> | null>;
227
+ get attributes(): Pick<ModelAttributes<TDef>, TSelected & keyof ModelAttributes<TDef>>;
228
+ get id(): number;
229
+ isDirty(column?: ColumnName<TDef>): boolean;
230
+ isClean(column?: ColumnName<TDef>): boolean;
231
+ getOriginal<K extends ColumnName<TDef>>(column: K): K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown;
191
232
  getChanges(): Partial<InferModelAttributes<TDef>>;
192
233
  fill(data: Partial<Pick<InferModelAttributes<TDef>, FillableKeys<TDef>>>): this;
193
234
  forceFill(data: Partial<InferModelAttributes<TDef>>): this;
194
235
  save(): this;
195
236
  update(data: Partial<Pick<InferModelAttributes<TDef>, FillableKeys<TDef>>>): this;
237
+ fresh(): ModelInstance<TDef, TSelected> | null;
196
238
  delete(): boolean;
197
- refresh(): this;
239
+ refresh(): this | null;
240
+ replicate(): ModelInstance<TDef, TSelected>;
198
241
  toJSON(): Omit<Pick<ModelAttributes<TDef>, TSelected & keyof ModelAttributes<TDef>>, HiddenKeys<TDef>>;
242
+ toArray(): Omit<Pick<ModelAttributes<TDef>, TSelected & keyof ModelAttributes<TDef>>, HiddenKeys<TDef>>;
199
243
  }
200
244
  /**
201
245
  * Query builder with precise type narrowing
202
246
  */
203
247
  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
248
  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>;
249
+ where<K extends ColumnName<TDef>>(column: K, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
250
+ where<K extends ColumnName<TDef>>(column: K, operator: WhereOperator, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
251
+ where<K extends ColumnName<TDef>>(column: K, operatorOrValue: WhereOperator | unknown, value?: unknown): ModelQueryBuilder<TDef, TSelected>;
252
+ orWhere<K extends ColumnName<TDef>>(column: K, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
253
+ orWhere<K extends ColumnName<TDef>>(column: K, operator: WhereOperator, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): ModelQueryBuilder<TDef, TSelected>;
254
+ orWhere<K extends ColumnName<TDef>>(column: K, operatorOrValue: WhereOperator | unknown, value?: unknown): ModelQueryBuilder<TDef, TSelected>;
214
255
  whereIn<K extends ColumnName<TDef>>(column: K, values: (K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown)[]): ModelQueryBuilder<TDef, TSelected>;
256
+ orWhereIn<K extends ColumnName<TDef>>(column: K, values: (K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown)[]): ModelQueryBuilder<TDef, TSelected>;
215
257
  whereNotIn<K extends ColumnName<TDef>>(column: K, values: (K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown)[]): ModelQueryBuilder<TDef, TSelected>;
258
+ orWhereNotIn<K extends ColumnName<TDef>>(column: K, values: (K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown)[]): ModelQueryBuilder<TDef, TSelected>;
216
259
  whereNull<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
260
+ orWhereNull<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
217
261
  whereNotNull<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
262
+ orWhereNotNull<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
218
263
  whereLike<K extends ColumnName<TDef>>(column: K, pattern: string): ModelQueryBuilder<TDef, TSelected>;
264
+ orWhereLike<K extends ColumnName<TDef>>(column: K, pattern: string): ModelQueryBuilder<TDef, TSelected>;
265
+ whereNotLike<K extends ColumnName<TDef>>(column: K, pattern: string): ModelQueryBuilder<TDef, TSelected>;
266
+ orWhereNotLike<K extends ColumnName<TDef>>(column: K, pattern: string): ModelQueryBuilder<TDef, TSelected>;
267
+ whereRaw(fragment: string, ...params: unknown[]): ModelQueryBuilder<TDef, TSelected>;
268
+ orWhereRaw(fragment: string, ...params: unknown[]): ModelQueryBuilder<TDef, TSelected>;
269
+ whereGroup(callback: (builder: ModelQueryBuilder<TDef, TSelected>) => unknown): ModelQueryBuilder<TDef, TSelected>;
270
+ orWhereGroup(callback: (builder: ModelQueryBuilder<TDef, TSelected>) => unknown): ModelQueryBuilder<TDef, TSelected>;
271
+ 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>;
272
+ 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>;
273
+ when(condition: unknown, callback: (builder: ModelQueryBuilder<TDef, TSelected>) => ModelQueryBuilder<TDef, TSelected>): ModelQueryBuilder<TDef, TSelected>;
219
274
  orderBy<K extends ColumnName<TDef>>(column: K, direction?: 'asc' | 'desc'): ModelQueryBuilder<TDef, TSelected>;
220
275
  orderByDesc<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
221
276
  orderByAsc<K extends ColumnName<TDef>>(column: K): ModelQueryBuilder<TDef, TSelected>;
@@ -223,22 +278,37 @@ declare class ModelQueryBuilder<TDef extends ModelDefinition, TSelected extends
223
278
  take(count: number): ModelQueryBuilder<TDef, TSelected>;
224
279
  offset(count: number): ModelQueryBuilder<TDef, TSelected>;
225
280
  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>;
281
+ select<K extends ColumnName<TDef>>(...columns: K[]): ModelQueryBuilder<TDef, K>;
282
+ with<R extends InferRelationNames<TDef>>(...relations: R[]): ModelQueryBuilder<TDef, TSelected>;
228
283
  getWithRelations(): string[];
229
- private buildQuery(): { sql: string; params: unknown[] };
284
+ toSql(): { sql: string; params: unknown[] };
230
285
  get(): ModelInstance<TDef, TSelected>[];
231
286
  first(): ModelInstance<TDef, TSelected> | undefined;
232
287
  firstOrFail(): ModelInstance<TDef, TSelected>;
233
288
  last(): ModelInstance<TDef, TSelected> | undefined;
234
289
  count(): number;
235
290
  exists(): boolean;
236
- paginate(page?: any, perPage?: any): void;
291
+ doesntExist(): boolean;
292
+ sole(): ModelInstance<TDef, TSelected>;
293
+ increment<K extends NumericColumns<TDef>>(column: K, amount?: number): number;
294
+ decrement<K extends NumericColumns<TDef>>(column: K, amount?: number): number;
295
+ chunk(size: number, callback: (items: ModelInstance<TDef, TSelected>[]) => void | false): void;
296
+ paginate(page?: number, perPage?: number): {
297
+ data: ModelInstance<TDef, TSelected>[]
298
+ total: number
299
+ page: number
300
+ perPage: number
301
+ lastPage: number
302
+ hasMorePages: boolean
303
+ isEmpty: boolean
304
+ from: number | null
305
+ to: number | null
306
+ };
237
307
  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;
308
+ max<K extends ColumnName<TDef>>(column: K): number | null;
309
+ min<K extends ColumnName<TDef>>(column: K): number | null;
310
+ avg<K extends NumericColumns<TDef>>(column: K): number;
311
+ sum<K extends NumericColumns<TDef>>(column: K): number;
242
312
  delete(): number;
243
313
  update(data: Partial<Pick<InferModelAttributes<TDef>, FillableKeys<TDef>>>): number;
244
- }
314
+ }
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
+ }
@@ -1,16 +1,42 @@
1
1
  // @bun
2
2
  var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ function __accessProp(key) {
7
+ return this[key];
8
+ }
9
+ var __toCommonJS = (from) => {
10
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
11
+ if (entry)
12
+ return entry;
13
+ entry = __defProp({}, "__esModule", { value: true });
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (var key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(entry, key))
17
+ __defProp(entry, key, {
18
+ get: __accessProp.bind(from, key),
19
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
20
+ });
21
+ }
22
+ __moduleCache.set(from, entry);
23
+ return entry;
24
+ };
25
+ var __moduleCache;
26
+ var __returnValue = (v) => v;
27
+ function __exportSetter(name, newValue) {
28
+ this[name] = __returnValue.bind(null, newValue);
29
+ }
3
30
  var __export = (target, all) => {
4
31
  for (var name in all)
5
32
  __defProp(target, name, {
6
33
  get: all[name],
7
34
  enumerable: true,
8
35
  configurable: true,
9
- set: (newValue) => all[name] = () => newValue
36
+ set: __exportSetter.bind(all, name)
10
37
  });
11
38
  };
12
39
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
- var __promiseAll = (args) => Promise.all(args);
14
40
  var __require = import.meta.require;
15
41
 
16
42
  // src/browser.ts
@@ -368,7 +394,7 @@ class BrowserModelQueryBuilder {
368
394
  this._definition = definition;
369
395
  }
370
396
  getTablePath() {
371
- return this._definition.traits?.useApi?.uri || this._definition.table;
397
+ return typeof this._definition.traits?.useApi === "object" && this._definition.traits.useApi?.uri || this._definition.table;
372
398
  }
373
399
  where(column, operatorOrValue, value) {
374
400
  if (value === undefined) {
@@ -629,7 +655,7 @@ function createBrowserModel(definition) {
629
655
  return new BrowserModelQueryBuilder(definition).pluck(column);
630
656
  },
631
657
  async create(data) {
632
- const tablePath = definition.traits?.useApi?.uri || definition.table;
658
+ const tablePath = typeof definition.traits?.useApi === "object" && definition.traits.useApi?.uri || definition.table;
633
659
  const url = `${browserConfig.baseUrl}/${tablePath}`;
634
660
  const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
635
661
  const response = await fetch(url, {
@@ -642,7 +668,7 @@ function createBrowserModel(definition) {
642
668
  return new BrowserModelInstance(definition, row);
643
669
  },
644
670
  async update(id, data) {
645
- const tablePath = definition.traits?.useApi?.uri || definition.table;
671
+ const tablePath = typeof definition.traits?.useApi === "object" && definition.traits.useApi?.uri || definition.table;
646
672
  const url = `${browserConfig.baseUrl}/${tablePath}/${id}`;
647
673
  const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
648
674
  const response = await fetch(url, {
@@ -655,7 +681,7 @@ function createBrowserModel(definition) {
655
681
  return new BrowserModelInstance(definition, row);
656
682
  },
657
683
  async delete(id) {
658
- const tablePath = definition.traits?.useApi?.uri || definition.table;
684
+ const tablePath = typeof definition.traits?.useApi === "object" && definition.traits.useApi?.uri || definition.table;
659
685
  const url = `${browserConfig.baseUrl}/${tablePath}/${id}`;
660
686
  const response = await fetch(url, {
661
687
  method: "DELETE",
@@ -1,16 +1,42 @@
1
1
  // @bun
2
2
  var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ function __accessProp(key) {
7
+ return this[key];
8
+ }
9
+ var __toCommonJS = (from) => {
10
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
11
+ if (entry)
12
+ return entry;
13
+ entry = __defProp({}, "__esModule", { value: true });
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (var key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(entry, key))
17
+ __defProp(entry, key, {
18
+ get: __accessProp.bind(from, key),
19
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
20
+ });
21
+ }
22
+ __moduleCache.set(from, entry);
23
+ return entry;
24
+ };
25
+ var __moduleCache;
26
+ var __returnValue = (v) => v;
27
+ function __exportSetter(name, newValue) {
28
+ this[name] = __returnValue.bind(null, newValue);
29
+ }
3
30
  var __export = (target, all) => {
4
31
  for (var name in all)
5
32
  __defProp(target, name, {
6
33
  get: all[name],
7
34
  enumerable: true,
8
35
  configurable: true,
9
- set: (newValue) => all[name] = () => newValue
36
+ set: __exportSetter.bind(all, name)
10
37
  });
11
38
  };
12
39
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
- var __promiseAll = (args) => Promise.all(args);
14
40
  var __require = import.meta.require;
15
41
 
16
42
  // src/drivers/dynamodb.ts
@@ -310,7 +336,7 @@ class DynamoDBDriverImpl {
310
336
  if (value.length === 0) {
311
337
  return { L: [] };
312
338
  }
313
- const firstType = typeof value[0];
339
+ const _firstType = typeof value[0];
314
340
  const isStringSet = value.every((v) => typeof v === "string");
315
341
  const isNumberSet = value.every((v) => typeof v === "number");
316
342
  if (isStringSet) {