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.
- package/README.md +45 -468
- 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 -9
- 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 +24428 -0
- package/dist/browser.d.ts +109 -44
- package/dist/client.d.ts +22 -56
- package/dist/config.d.ts +16 -3
- package/dist/drivers/dynamodb.d.ts +3 -13
- package/dist/drivers/index.d.ts +2 -1
- package/dist/drivers/mysql.d.ts +3 -21
- package/dist/drivers/postgres.d.ts +3 -21
- package/dist/drivers/sqlite.d.ts +3 -21
- 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 +8 -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 +28 -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 +153 -83
- package/dist/schema.d.ts +32 -25
- package/dist/seeder.d.ts +3 -1
- package/dist/{browser.js → src/browser.js} +32 -6
- package/dist/{dynamodb → src/dynamodb}/index.js +29 -3
- package/dist/{index.js → src/index.js} +11630 -12230
- package/dist/type-inference.d.ts +326 -0
- package/dist/types.d.ts +1 -5
- package/package.json +7 -7
- 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?:
|
|
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:
|
|
104
|
-
readonly afterCreate?: (model:
|
|
105
|
-
readonly beforeUpdate?: (model:
|
|
106
|
-
readonly afterUpdate?: (model:
|
|
107
|
-
readonly beforeDelete?: (model:
|
|
108
|
-
readonly afterDelete?: (model:
|
|
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 {
|
|
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
|
-
//
|
|
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
|
-
?
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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,
|
|
213
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
239
|
-
min<K extends
|
|
240
|
-
avg<K extends
|
|
241
|
-
sum<K extends
|
|
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
|
@@ -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: (
|
|
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: (
|
|
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
|
|
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) {
|