@mikro-orm/knex 7.0.0-dev.5 → 7.0.0-dev.50
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/AbstractSqlConnection.d.ts +11 -5
- package/AbstractSqlConnection.js +79 -32
- package/AbstractSqlDriver.d.ts +14 -9
- package/AbstractSqlDriver.js +273 -213
- package/AbstractSqlPlatform.js +3 -3
- package/PivotCollectionPersister.d.ts +3 -2
- package/PivotCollectionPersister.js +6 -2
- package/README.md +3 -2
- package/SqlEntityManager.d.ts +9 -2
- package/SqlEntityManager.js +2 -2
- package/dialects/mssql/MsSqlNativeQueryBuilder.d.ts +2 -0
- package/dialects/mssql/MsSqlNativeQueryBuilder.js +43 -2
- package/dialects/mysql/MySqlPlatform.js +2 -1
- package/dialects/postgresql/PostgreSqlTableCompiler.d.ts +1 -0
- package/dialects/postgresql/PostgreSqlTableCompiler.js +1 -0
- package/dialects/sqlite/BaseSqliteConnection.d.ts +4 -2
- package/dialects/sqlite/BaseSqliteConnection.js +8 -5
- package/dialects/sqlite/SqliteSchemaHelper.js +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/package.json +4 -4
- package/query/ArrayCriteriaNode.d.ts +1 -0
- package/query/ArrayCriteriaNode.js +3 -0
- package/query/CriteriaNode.d.ts +4 -2
- package/query/CriteriaNode.js +11 -6
- package/query/CriteriaNodeFactory.js +11 -6
- package/query/NativeQueryBuilder.js +1 -1
- package/query/ObjectCriteriaNode.d.ts +1 -0
- package/query/ObjectCriteriaNode.js +38 -7
- package/query/QueryBuilder.d.ts +67 -6
- package/query/QueryBuilder.js +195 -43
- package/query/QueryBuilderHelper.d.ts +1 -1
- package/query/QueryBuilderHelper.js +13 -6
- package/query/ScalarCriteriaNode.d.ts +3 -3
- package/query/ScalarCriteriaNode.js +7 -5
- package/query/index.d.ts +1 -0
- package/query/index.js +1 -0
- package/query/raw.d.ts +59 -0
- package/query/raw.js +68 -0
- package/query/rawKnex.d.ts +58 -0
- package/query/rawKnex.js +72 -0
- package/schema/DatabaseSchema.js +25 -4
- package/schema/DatabaseTable.d.ts +5 -4
- package/schema/DatabaseTable.js +80 -34
- package/schema/SchemaComparator.js +2 -2
- package/schema/SchemaHelper.d.ts +2 -0
- package/schema/SchemaHelper.js +8 -4
- package/schema/SqlSchemaGenerator.d.ts +9 -2
- package/schema/SqlSchemaGenerator.js +31 -11
- package/typings.d.ts +86 -3
|
@@ -17,6 +17,7 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
17
17
|
* Returns true if the database was created.
|
|
18
18
|
*/
|
|
19
19
|
async ensureDatabase(options) {
|
|
20
|
+
await this.connection.ensureConnection();
|
|
20
21
|
const dbName = this.config.get('dbName');
|
|
21
22
|
if (this.lastEnsuredDatabase === dbName && !options?.forceCheck) {
|
|
22
23
|
return true;
|
|
@@ -27,10 +28,8 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
27
28
|
const managementDbName = this.helper.getManagementDbName();
|
|
28
29
|
if (managementDbName) {
|
|
29
30
|
this.config.set('dbName', managementDbName);
|
|
30
|
-
await this.driver.reconnect();
|
|
31
|
-
await this.createDatabase(dbName);
|
|
32
|
-
this.config.set('dbName', dbName);
|
|
33
|
-
await this.driver.reconnect();
|
|
31
|
+
await this.driver.reconnect({ skipOnConnect: true });
|
|
32
|
+
await this.createDatabase(dbName, { skipOnConnect: true });
|
|
34
33
|
}
|
|
35
34
|
if (options?.create) {
|
|
36
35
|
await this.createSchema(options);
|
|
@@ -38,7 +37,7 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
38
37
|
return true;
|
|
39
38
|
}
|
|
40
39
|
if (options?.clear) {
|
|
41
|
-
await this.clearDatabase(options);
|
|
40
|
+
await this.clearDatabase({ ...options, clearIdentityMap: false });
|
|
42
41
|
}
|
|
43
42
|
return false;
|
|
44
43
|
}
|
|
@@ -47,6 +46,15 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
47
46
|
const schemaName = schema ?? this.config.get('schema') ?? this.platform.getDefaultSchemaName();
|
|
48
47
|
return DatabaseSchema.fromMetadata(metadata, this.platform, this.config, schemaName);
|
|
49
48
|
}
|
|
49
|
+
getOrderedMetadata(schema) {
|
|
50
|
+
const metadata = super.getOrderedMetadata(schema);
|
|
51
|
+
// Filter out skipped tables
|
|
52
|
+
return metadata.filter(meta => {
|
|
53
|
+
const tableName = meta.tableName;
|
|
54
|
+
const tableSchema = meta.schema ?? schema ?? this.config.get('schema');
|
|
55
|
+
return !this.isTableSkipped(tableName, tableSchema);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
50
58
|
async getCreateSchemaSQL(options = {}) {
|
|
51
59
|
const toSchema = this.getTargetSchema(options.schema);
|
|
52
60
|
const ret = [];
|
|
@@ -111,7 +119,9 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
111
119
|
.execute();
|
|
112
120
|
}
|
|
113
121
|
await this.execute(this.helper.enableForeignKeysSQL());
|
|
114
|
-
|
|
122
|
+
if (options?.clearIdentityMap ?? true) {
|
|
123
|
+
this.clearIdentityMap();
|
|
124
|
+
}
|
|
115
125
|
}
|
|
116
126
|
async getDropSchemaSQL(options = {}) {
|
|
117
127
|
await this.ensureDatabase();
|
|
@@ -280,15 +290,14 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
280
290
|
/**
|
|
281
291
|
* creates new database and connects to it
|
|
282
292
|
*/
|
|
283
|
-
async createDatabase(name) {
|
|
293
|
+
async createDatabase(name, options) {
|
|
284
294
|
name ??= this.config.get('dbName');
|
|
285
295
|
const sql = this.helper.getCreateDatabaseSQL('' + this.platform.quoteIdentifier(name));
|
|
286
296
|
if (sql) {
|
|
287
|
-
// console.log(sql);
|
|
288
297
|
await this.execute(sql);
|
|
289
298
|
}
|
|
290
299
|
this.config.set('dbName', name);
|
|
291
|
-
await this.driver.reconnect();
|
|
300
|
+
await this.driver.reconnect(options);
|
|
292
301
|
}
|
|
293
302
|
async dropDatabase(name) {
|
|
294
303
|
name ??= this.config.get('dbName');
|
|
@@ -318,12 +327,10 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
318
327
|
if (this.platform.supportsMultipleStatements()) {
|
|
319
328
|
for (const group of groups) {
|
|
320
329
|
const query = group.join('\n');
|
|
321
|
-
// console.log(query);
|
|
322
330
|
await this.driver.execute(query);
|
|
323
331
|
}
|
|
324
332
|
return;
|
|
325
333
|
}
|
|
326
|
-
// console.log(groups);
|
|
327
334
|
await Utils.runSerial(groups.flat(), line => this.driver.execute(line));
|
|
328
335
|
}
|
|
329
336
|
async dropTableIfExists(name, schema) {
|
|
@@ -349,6 +356,19 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
349
356
|
append(array, sql, pad) {
|
|
350
357
|
return this.helper.append(array, sql, pad);
|
|
351
358
|
}
|
|
359
|
+
matchName(name, nameToMatch) {
|
|
360
|
+
return typeof nameToMatch === 'string'
|
|
361
|
+
? name.toLocaleLowerCase() === nameToMatch.toLocaleLowerCase()
|
|
362
|
+
: nameToMatch.test(name);
|
|
363
|
+
}
|
|
364
|
+
isTableSkipped(tableName, schemaName) {
|
|
365
|
+
const skipTables = this.options.skipTables;
|
|
366
|
+
if (!skipTables || skipTables.length === 0) {
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
const fullTableName = schemaName ? `${schemaName}.${tableName}` : tableName;
|
|
370
|
+
return skipTables.some(pattern => this.matchName(tableName, pattern) || this.matchName(fullTableName, pattern));
|
|
371
|
+
}
|
|
352
372
|
}
|
|
353
373
|
// for back compatibility
|
|
354
374
|
export { SqlSchemaGenerator as SchemaGenerator };
|
package/typings.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Generated, Kysely } from 'kysely';
|
|
2
|
+
import type { DeferMode, CheckCallback, Dictionary, EntityProperty, GroupOperator, RawQueryFragment, QBFilterQuery, QueryOrderMap, Type, QueryFlag, AnyEntity, EntityName, EntitySchemaWithMeta, Primary, PrimaryProperty, Opt } from '@mikro-orm/core';
|
|
2
3
|
import type { JoinType, QueryType } from './query/enums.js';
|
|
3
4
|
import type { DatabaseSchema } from './schema/DatabaseSchema.js';
|
|
4
5
|
import type { DatabaseTable } from './schema/DatabaseTable.js';
|
|
@@ -27,6 +28,7 @@ export interface JoinOptions {
|
|
|
27
28
|
cond_?: Dictionary;
|
|
28
29
|
subquery?: string;
|
|
29
30
|
nested?: Set<JoinOptions>;
|
|
31
|
+
parent?: JoinOptions;
|
|
30
32
|
}
|
|
31
33
|
export interface Column {
|
|
32
34
|
name: string;
|
|
@@ -74,7 +76,7 @@ export interface IndexDef {
|
|
|
74
76
|
storageEngineIndexType?: 'hash' | 'btree';
|
|
75
77
|
predicate?: string;
|
|
76
78
|
}>;
|
|
77
|
-
deferMode?: DeferMode
|
|
79
|
+
deferMode?: DeferMode | `${DeferMode}`;
|
|
78
80
|
}
|
|
79
81
|
export interface CheckDef<T = unknown> {
|
|
80
82
|
name: string;
|
|
@@ -163,17 +165,21 @@ export interface IQueryBuilder<T> {
|
|
|
163
165
|
setFlag(flag: QueryFlag): this;
|
|
164
166
|
unsetFlag(flag: QueryFlag): this;
|
|
165
167
|
hasFlag(flag: QueryFlag): boolean;
|
|
168
|
+
scheduleFilterCheck(path: string): void;
|
|
166
169
|
}
|
|
167
170
|
export interface ICriteriaNodeProcessOptions {
|
|
168
171
|
alias?: string;
|
|
169
172
|
matchPopulateJoins?: boolean;
|
|
170
173
|
ignoreBranching?: boolean;
|
|
171
174
|
preferNoBranch?: boolean;
|
|
175
|
+
type?: 'orderBy';
|
|
176
|
+
filter?: boolean;
|
|
172
177
|
}
|
|
173
178
|
export interface ICriteriaNode<T extends object> {
|
|
174
179
|
readonly entityName: string;
|
|
175
180
|
readonly parent?: ICriteriaNode<T> | undefined;
|
|
176
181
|
readonly key?: string | undefined;
|
|
182
|
+
readonly strict?: boolean;
|
|
177
183
|
payload: any;
|
|
178
184
|
prop?: EntityProperty;
|
|
179
185
|
index?: number;
|
|
@@ -181,8 +187,85 @@ export interface ICriteriaNode<T extends object> {
|
|
|
181
187
|
shouldInline(payload: any): boolean;
|
|
182
188
|
willAutoJoin(qb: IQueryBuilder<T>, alias?: string, options?: ICriteriaNodeProcessOptions): boolean;
|
|
183
189
|
shouldRename(payload: any): boolean;
|
|
184
|
-
renameFieldToPK<T>(qb: IQueryBuilder<T
|
|
190
|
+
renameFieldToPK<T>(qb: IQueryBuilder<T>, ownerAlias?: string): string;
|
|
185
191
|
getPath(addIndex?: boolean): string;
|
|
186
192
|
getPivotPath(path: string): string;
|
|
187
193
|
}
|
|
194
|
+
export type MaybeReturnType<T> = T extends (...args: any[]) => infer R ? R : T;
|
|
195
|
+
export type InferEntityProperties<Schema> = Schema extends EntitySchemaWithMeta<any, any, any, any, infer Properties> ? Properties : never;
|
|
196
|
+
export type InferKyselyDB<TEntities extends {
|
|
197
|
+
name: string;
|
|
198
|
+
}, TOptions = {}> = MapValueAsTable<MapByName<TEntities>, TOptions>;
|
|
199
|
+
export type InferDBFromKysely<TKysely extends Kysely<any>> = TKysely extends Kysely<infer TDB> ? TDB : never;
|
|
200
|
+
type PreferStringLiteral<TCandidate, TFallback> = [
|
|
201
|
+
TCandidate
|
|
202
|
+
] extends [never] ? TFallback : string extends TCandidate ? TFallback : TCandidate extends string ? TCandidate : TFallback;
|
|
203
|
+
export type MapByName<T extends {
|
|
204
|
+
name: string;
|
|
205
|
+
tableName?: string;
|
|
206
|
+
}> = {
|
|
207
|
+
[P in T as PreferStringLiteral<NonNullable<P['tableName']>, P['name']>]: P;
|
|
208
|
+
};
|
|
209
|
+
export type MapValueAsTable<TMap extends Record<string, any>, TOptions = {}> = {
|
|
210
|
+
[K in keyof TMap as TransformName<K, 'underscore'>]: InferKyselyTable<TMap[K], 'underscore'>;
|
|
211
|
+
};
|
|
212
|
+
export type InferKyselyTable<TSchema extends EntitySchemaWithMeta, TNamingStrategy extends 'underscore' | 'entity' = 'underscore', TProcessOnCreate extends boolean = false> = ExcludeNever<{
|
|
213
|
+
-readonly [K in keyof InferEntityProperties<TSchema> as TransformColumnName<K, TNamingStrategy, MaybeReturnType<InferEntityProperties<TSchema>[K]>>]: InferColumnValue<MaybeReturnType<InferEntityProperties<TSchema>[K]>, TProcessOnCreate>;
|
|
214
|
+
}>;
|
|
215
|
+
type TransformName<TName, TNamingStrategy extends 'underscore' | 'entity'> = TNamingStrategy extends 'underscore' ? TName extends string ? SnakeCase<TName> : TName : TName;
|
|
216
|
+
type TransformColumnName<TName, TNamingStrategy extends 'underscore' | 'entity', TBuilder> = TNamingStrategy extends 'entity' ? TName : TBuilder extends {
|
|
217
|
+
'~options': {
|
|
218
|
+
fieldName: string;
|
|
219
|
+
};
|
|
220
|
+
} ? TBuilder['~options']['fieldName'] : TName extends string ? MaybeJoinColumnName<SnakeCase<TName>, TBuilder> : never;
|
|
221
|
+
type MaybeJoinColumnName<TName extends string, TBuilder> = TBuilder extends {
|
|
222
|
+
'~type'?: {
|
|
223
|
+
value: infer Value;
|
|
224
|
+
};
|
|
225
|
+
'~options': {
|
|
226
|
+
kind: 'm:1';
|
|
227
|
+
};
|
|
228
|
+
} ? PrimaryProperty<Value> extends string ? `${TName}_${SnakeCase<PrimaryProperty<Value>>}` : never : TBuilder extends {
|
|
229
|
+
'~type'?: {
|
|
230
|
+
value: infer Value;
|
|
231
|
+
};
|
|
232
|
+
'~options': {
|
|
233
|
+
kind: '1:1';
|
|
234
|
+
owner: true;
|
|
235
|
+
};
|
|
236
|
+
} ? PrimaryProperty<Value> extends string ? `${TName}_${SnakeCase<PrimaryProperty<Value>>}` : never : TName;
|
|
237
|
+
export type SnakeCase<TName extends string> = TName extends `${infer P1}${infer P2}` ? P2 extends Uncapitalize<P2> ? `${Uncapitalize<P1>}${SnakeCase<P2>}` : `${Uncapitalize<P1>}_${SnakeCase<Uncapitalize<P2>>}` : TName;
|
|
238
|
+
type InferColumnValue<TBuilder, TProcessOnCreate extends boolean> = TBuilder extends {
|
|
239
|
+
'~type'?: {
|
|
240
|
+
value: infer Value;
|
|
241
|
+
};
|
|
242
|
+
'~options': infer TOptions;
|
|
243
|
+
} ? MaybeNever<MaybeGenerated<MaybeJoinKey<Value, TOptions>, TOptions, TProcessOnCreate>, TOptions> : never;
|
|
244
|
+
type MaybeGenerated<TValue, TOptions, TProcessOnCreate extends boolean> = TOptions extends {
|
|
245
|
+
nullable: true;
|
|
246
|
+
} ? (TValue | null) : TOptions extends {
|
|
247
|
+
autoincrement: true;
|
|
248
|
+
} ? Generated<TValue> : TOptions extends {
|
|
249
|
+
default: true;
|
|
250
|
+
} ? Generated<TValue> : TOptions extends {
|
|
251
|
+
defaultRaw: true;
|
|
252
|
+
} ? Generated<TValue> : TProcessOnCreate extends false ? TValue : TOptions extends {
|
|
253
|
+
onCreate: Function;
|
|
254
|
+
} ? Generated<TValue> : TValue;
|
|
255
|
+
type MaybeJoinKey<TValue, TOptions> = TOptions extends {
|
|
256
|
+
kind: 'm:1';
|
|
257
|
+
} ? UnwrapOpt<Primary<TValue>> : TOptions extends {
|
|
258
|
+
kind: '1:1';
|
|
259
|
+
} ? TOptions extends {
|
|
260
|
+
owner: true;
|
|
261
|
+
} ? UnwrapOpt<Primary<TValue>> : never : TValue;
|
|
262
|
+
type UnwrapOpt<TValue> = TValue extends Opt<infer OriginalValue> ? OriginalValue : TValue;
|
|
263
|
+
type MaybeNever<TValue, TOptions> = TOptions extends {
|
|
264
|
+
persist: true;
|
|
265
|
+
} ? never : TOptions extends {
|
|
266
|
+
kind: 'm:n';
|
|
267
|
+
} ? never : TValue;
|
|
268
|
+
type ExcludeNever<TMap extends Record<string, any>> = {
|
|
269
|
+
[K in keyof TMap as TMap[K] extends never ? never : K]: TMap[K];
|
|
270
|
+
};
|
|
188
271
|
export {};
|