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.
- package/README.md +45 -468
- package/dist/__tests__/type-narrowing-compile.d.ts +1 -0
- package/dist/__tests__/type-narrowing.test.d.ts +1 -0
- package/dist/actions/benchmark.d.ts +1 -1
- package/dist/actions/cache.d.ts +1 -1
- package/dist/actions/console.d.ts +1 -1
- package/dist/actions/data.d.ts +2 -1
- package/dist/actions/db-info.d.ts +1 -1
- package/dist/actions/db-optimize.d.ts +1 -1
- package/dist/actions/db-wipe.d.ts +1 -1
- package/dist/actions/explain.d.ts +1 -1
- package/dist/actions/file.d.ts +1 -1
- package/dist/actions/index.d.ts +1 -1
- package/dist/actions/inspect.d.ts +1 -1
- package/dist/actions/introspect.d.ts +1 -1
- package/dist/actions/make-model.d.ts +1 -1
- package/dist/actions/migrate-generate.d.ts +1 -1
- package/dist/actions/migrate-rollback.d.ts +1 -1
- package/dist/actions/migrate-status.d.ts +1 -1
- package/dist/actions/migrate.d.ts +1 -1
- package/dist/actions/model-show.d.ts +1 -1
- package/dist/actions/ping.d.ts +1 -1
- package/dist/actions/query-explain-all.d.ts +1 -1
- package/dist/actions/relation-diagram.d.ts +1 -1
- package/dist/actions/seed.d.ts +1 -1
- package/dist/actions/sql.d.ts +1 -1
- package/dist/actions/unsafe.d.ts +1 -1
- package/dist/actions/validate.d.ts +1 -1
- package/dist/actions/wait-ready.d.ts +1 -1
- package/dist/bin/cli.js +25785 -0
- package/dist/browser.d.ts +118 -44
- package/dist/client.d.ts +22 -56
- package/dist/config.d.ts +16 -3
- package/dist/db.d.ts +5 -4
- package/dist/drivers/dynamodb.d.ts +3 -13
- package/dist/drivers/index.d.ts +2 -1
- package/dist/drivers/mysql.d.ts +3 -9
- package/dist/drivers/postgres.d.ts +3 -9
- package/dist/drivers/sqlite.d.ts +3 -9
- package/dist/dynamodb/client.d.ts +1 -5
- package/dist/dynamodb/index.d.ts +7 -28
- package/dist/dynamodb/migration-driver.d.ts +2 -23
- package/dist/dynamodb/migration-tracker.d.ts +4 -6
- package/dist/dynamodb/migrations.d.ts +4 -1
- package/dist/dynamodb/model.d.ts +5 -13
- package/dist/dynamodb-client.d.ts +3 -23
- package/dist/dynamodb-single-table.d.ts +22 -26
- package/dist/dynamodb-tooling-adapter.d.ts +2 -33
- package/dist/factory.d.ts +3 -3
- package/dist/index.d.ts +24 -1
- package/dist/loader.d.ts +1 -1
- package/dist/meta.d.ts +1 -1
- package/dist/migrations.d.ts +4 -4
- package/dist/model.d.ts +61 -3
- package/dist/orm.d.ts +130 -82
- package/dist/schema.d.ts +32 -25
- package/dist/seeder.d.ts +3 -1
- package/dist/src/browser.js +824 -0
- package/dist/src/dynamodb/index.js +2301 -0
- package/dist/{index.js → src/index.js} +21466 -20710
- package/dist/type-inference.d.ts +326 -0
- package/dist/types.d.ts +1 -5
- 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?:
|
|
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:
|
|
104
|
-
readonly afterCreate?: (model:
|
|
105
|
-
readonly beforeUpdate?: (model:
|
|
106
|
-
readonly afterUpdate?: (model:
|
|
107
|
-
readonly beforeDelete?: (model:
|
|
108
|
-
readonly afterDelete?: (model:
|
|
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 {
|
|
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
|
-
//
|
|
158
|
-
declare type
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
declare type
|
|
163
|
-
? R extends string ? Lowercase<R> : never : never
|
|
164
|
-
|
|
165
|
-
?
|
|
166
|
-
declare type
|
|
167
|
-
? R extends string ? Lowercase<R> :
|
|
168
|
-
|
|
169
|
-
?
|
|
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
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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,
|
|
213
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
239
|
-
min<K extends
|
|
240
|
-
avg<K extends
|
|
241
|
-
sum<K extends
|
|
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
|
+
}
|