@mikro-orm/knex 7.0.0-dev.3 → 7.0.0-dev.31

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 (36) hide show
  1. package/AbstractSqlConnection.d.ts +6 -4
  2. package/AbstractSqlConnection.js +33 -19
  3. package/AbstractSqlDriver.d.ts +7 -7
  4. package/AbstractSqlDriver.js +169 -163
  5. package/AbstractSqlPlatform.js +3 -3
  6. package/PivotCollectionPersister.d.ts +3 -2
  7. package/PivotCollectionPersister.js +6 -2
  8. package/README.md +1 -2
  9. package/dialects/mssql/MsSqlNativeQueryBuilder.d.ts +2 -0
  10. package/dialects/mssql/MsSqlNativeQueryBuilder.js +48 -5
  11. package/dialects/mysql/MySqlPlatform.js +2 -1
  12. package/dialects/sqlite/BaseSqliteConnection.d.ts +1 -1
  13. package/dialects/sqlite/BaseSqliteConnection.js +8 -2
  14. package/dialects/sqlite/BaseSqlitePlatform.d.ts +0 -1
  15. package/dialects/sqlite/BaseSqlitePlatform.js +0 -4
  16. package/dialects/sqlite/SqliteSchemaHelper.js +1 -1
  17. package/package.json +4 -4
  18. package/query/CriteriaNode.d.ts +1 -1
  19. package/query/CriteriaNode.js +5 -9
  20. package/query/CriteriaNodeFactory.js +10 -5
  21. package/query/NativeQueryBuilder.js +1 -1
  22. package/query/ObjectCriteriaNode.js +30 -7
  23. package/query/QueryBuilder.d.ts +15 -1
  24. package/query/QueryBuilder.js +92 -17
  25. package/query/QueryBuilderHelper.js +4 -10
  26. package/query/ScalarCriteriaNode.d.ts +3 -3
  27. package/query/ScalarCriteriaNode.js +7 -5
  28. package/schema/DatabaseSchema.js +18 -2
  29. package/schema/DatabaseTable.d.ts +5 -4
  30. package/schema/DatabaseTable.js +39 -6
  31. package/schema/SchemaComparator.js +1 -1
  32. package/schema/SchemaHelper.d.ts +2 -0
  33. package/schema/SchemaHelper.js +9 -5
  34. package/schema/SqlSchemaGenerator.d.ts +6 -1
  35. package/schema/SqlSchemaGenerator.js +25 -5
  36. package/typings.d.ts +7 -2
@@ -1,11 +1,11 @@
1
1
  import { type ControlledTransaction, type Dialect, Kysely } from 'kysely';
2
- import { type AnyEntity, Connection, type Dictionary, type EntityData, type IsolationLevel, type LoggingOptions, type QueryResult, RawQueryFragment, type Transaction, type TransactionEventBroadcaster } from '@mikro-orm/core';
2
+ import { type AnyEntity, Connection, type Dictionary, type EntityData, type IsolationLevel, type LogContext, type LoggingOptions, type MaybePromise, type QueryResult, RawQueryFragment, type Transaction, type TransactionEventBroadcaster } from '@mikro-orm/core';
3
3
  import type { AbstractSqlPlatform } from './AbstractSqlPlatform.js';
4
4
  import { NativeQueryBuilder } from './query/NativeQueryBuilder.js';
5
5
  export declare abstract class AbstractSqlConnection extends Connection {
6
6
  protected platform: AbstractSqlPlatform;
7
7
  protected client: Kysely<any>;
8
- abstract createKyselyDialect(overrides: Dictionary): Dialect;
8
+ abstract createKyselyDialect(overrides: Dictionary): MaybePromise<Dialect>;
9
9
  connect(): Promise<void>;
10
10
  /**
11
11
  * @inheritDoc
@@ -31,15 +31,17 @@ export declare abstract class AbstractSqlConnection extends Connection {
31
31
  readOnly?: boolean;
32
32
  ctx?: ControlledTransaction<any>;
33
33
  eventBroadcaster?: TransactionEventBroadcaster;
34
+ loggerContext?: LogContext;
34
35
  }): Promise<T>;
35
36
  begin(options?: {
36
37
  isolationLevel?: IsolationLevel;
37
38
  readOnly?: boolean;
38
39
  ctx?: ControlledTransaction<any, any>;
39
40
  eventBroadcaster?: TransactionEventBroadcaster;
41
+ loggerContext?: LogContext;
40
42
  }): Promise<ControlledTransaction<any, any>>;
41
- commit(ctx: ControlledTransaction<any, any>, eventBroadcaster?: TransactionEventBroadcaster): Promise<void>;
42
- rollback(ctx: ControlledTransaction<any, any>, eventBroadcaster?: TransactionEventBroadcaster): Promise<void>;
43
+ commit(ctx: ControlledTransaction<any, any>, eventBroadcaster?: TransactionEventBroadcaster, loggerContext?: LogContext): Promise<void>;
44
+ rollback(ctx: ControlledTransaction<any, any>, eventBroadcaster?: TransactionEventBroadcaster, loggerContext?: LogContext): Promise<void>;
43
45
  execute<T extends QueryResult | EntityData<AnyEntity> | EntityData<AnyEntity>[] = EntityData<AnyEntity>[]>(query: string | NativeQueryBuilder | RawQueryFragment, params?: readonly unknown[], method?: 'all' | 'get' | 'run', ctx?: Transaction, loggerContext?: LoggingOptions): Promise<T>;
44
46
  /**
45
47
  * Execute raw SQL queries from file
@@ -19,8 +19,7 @@ export class AbstractSqlConnection extends Connection {
19
19
  }
20
20
  else {
21
21
  this.client = new Kysely({
22
- dialect: this.createKyselyDialect(driverOptions),
23
- // log: m => console.log(m),
22
+ dialect: await this.createKyselyDialect(driverOptions),
24
23
  });
25
24
  }
26
25
  this.connected = true;
@@ -62,25 +61,28 @@ export class AbstractSqlConnection extends Connection {
62
61
  const trx = await this.begin(options);
63
62
  try {
64
63
  const ret = await cb(trx);
65
- await this.commit(trx, options.eventBroadcaster);
64
+ await this.commit(trx, options.eventBroadcaster, options.loggerContext);
66
65
  return ret;
67
66
  }
68
67
  catch (error) {
69
- await this.rollback(trx, options.eventBroadcaster);
68
+ await this.rollback(trx, options.eventBroadcaster, options.loggerContext);
70
69
  throw error;
71
70
  }
72
71
  }
73
72
  async begin(options = {}) {
74
73
  if (options.ctx) {
75
74
  const ctx = options.ctx;
75
+ await options.eventBroadcaster?.dispatchEvent(EventType.beforeTransactionStart, ctx);
76
76
  ctx.index ??= 0;
77
77
  const savepointName = `trx${ctx.index + 1}`;
78
78
  const trx = await options.ctx.savepoint(savepointName).execute();
79
79
  Reflect.defineProperty(trx, 'index', { value: ctx.index + 1 });
80
80
  Reflect.defineProperty(trx, 'savepointName', { value: savepointName });
81
- this.logQuery(this.platform.getSavepointSQL(savepointName));
81
+ this.logQuery(this.platform.getSavepointSQL(savepointName), options.loggerContext);
82
+ await options.eventBroadcaster?.dispatchEvent(EventType.afterTransactionStart, trx);
82
83
  return trx;
83
84
  }
85
+ await this.ensureConnection();
84
86
  await options.eventBroadcaster?.dispatchEvent(EventType.beforeTransactionStart);
85
87
  let trxBuilder = this.client.startTransaction();
86
88
  if (options.isolationLevel) {
@@ -90,35 +92,47 @@ export class AbstractSqlConnection extends Connection {
90
92
  trxBuilder = trxBuilder.setAccessMode('read only');
91
93
  }
92
94
  const trx = await trxBuilder.execute();
93
- for (const query of this.platform.getBeginTransactionSQL(options)) {
94
- this.logQuery(query);
95
+ if (options.ctx) {
96
+ const ctx = options.ctx;
97
+ ctx.index ??= 0;
98
+ const savepointName = `trx${ctx.index + 1}`;
99
+ Reflect.defineProperty(trx, 'index', { value: ctx.index + 1 });
100
+ Reflect.defineProperty(trx, 'savepointName', { value: savepointName });
101
+ this.logQuery(this.platform.getSavepointSQL(savepointName), options.loggerContext);
102
+ }
103
+ else {
104
+ for (const query of this.platform.getBeginTransactionSQL(options)) {
105
+ this.logQuery(query, options.loggerContext);
106
+ }
95
107
  }
96
108
  await options.eventBroadcaster?.dispatchEvent(EventType.afterTransactionStart, trx);
97
109
  return trx;
98
110
  }
99
- async commit(ctx, eventBroadcaster) {
111
+ async commit(ctx, eventBroadcaster, loggerContext) {
100
112
  if (ctx.isRolledBack) {
101
113
  return;
102
114
  }
115
+ await eventBroadcaster?.dispatchEvent(EventType.beforeTransactionCommit, ctx);
103
116
  if ('savepointName' in ctx) {
104
117
  await ctx.releaseSavepoint(ctx.savepointName).execute();
105
- this.logQuery(this.platform.getReleaseSavepointSQL(ctx.savepointName));
106
- return;
118
+ this.logQuery(this.platform.getReleaseSavepointSQL(ctx.savepointName), loggerContext);
119
+ }
120
+ else {
121
+ await ctx.commit().execute();
122
+ this.logQuery(this.platform.getCommitTransactionSQL(), loggerContext);
107
123
  }
108
- await eventBroadcaster?.dispatchEvent(EventType.beforeTransactionCommit, ctx);
109
- await ctx.commit().execute();
110
- this.logQuery(this.platform.getCommitTransactionSQL());
111
124
  await eventBroadcaster?.dispatchEvent(EventType.afterTransactionCommit, ctx);
112
125
  }
113
- async rollback(ctx, eventBroadcaster) {
126
+ async rollback(ctx, eventBroadcaster, loggerContext) {
127
+ await eventBroadcaster?.dispatchEvent(EventType.beforeTransactionRollback, ctx);
114
128
  if ('savepointName' in ctx) {
115
129
  await ctx.rollbackToSavepoint(ctx.savepointName).execute();
116
- this.logQuery(this.platform.getRollbackToSavepointSQL(ctx.savepointName));
117
- return;
130
+ this.logQuery(this.platform.getRollbackToSavepointSQL(ctx.savepointName), loggerContext);
131
+ }
132
+ else {
133
+ await ctx.rollback().execute();
134
+ this.logQuery(this.platform.getRollbackTransactionSQL(), loggerContext);
118
135
  }
119
- await eventBroadcaster?.dispatchEvent(EventType.beforeTransactionRollback, ctx);
120
- await ctx.rollback().execute();
121
- this.logQuery(this.platform.getRollbackTransactionSQL());
122
136
  await eventBroadcaster?.dispatchEvent(EventType.afterTransactionRollback, ctx);
123
137
  }
124
138
  async execute(query, params = [], method = 'all', ctx, loggerContext) {
@@ -14,12 +14,12 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
14
14
  protected constructor(config: Configuration, platform: Platform, connection: Constructor<Connection>, connector: string[]);
15
15
  getPlatform(): Platform;
16
16
  createEntityManager(useContext?: boolean): this[typeof EntityManagerType];
17
- find<T extends object, P extends string = never, F extends string = PopulatePath.ALL, E extends string = never>(entityName: string, where: FilterQuery<T>, options?: FindOptions<T, P, F, E>): Promise<EntityData<T>[]>;
18
- findOne<T extends object, P extends string = never, F extends string = PopulatePath.ALL, E extends string = never>(entityName: string, where: FilterQuery<T>, options?: FindOneOptions<T, P, F, E>): Promise<EntityData<T> | null>;
17
+ find<T extends object, P extends string = never, F extends string = PopulatePath.ALL, E extends string = never>(entityName: string, where: ObjectQuery<T>, options?: FindOptions<T, P, F, E>): Promise<EntityData<T>[]>;
18
+ findOne<T extends object, P extends string = never, F extends string = PopulatePath.ALL, E extends string = never>(entityName: string, where: ObjectQuery<T>, options?: FindOneOptions<T, P, F, E>): Promise<EntityData<T> | null>;
19
19
  protected hasToManyJoins<T extends object>(hint: PopulateOptions<T>, meta: EntityMetadata<T>): boolean;
20
- findVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: FindOptions<T, any, any, any>): Promise<EntityData<T>[]>;
21
- countVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: CountOptions<T, any>): Promise<number>;
22
- protected findFromVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: FindOptions<T, any> | CountOptions<T, any>, type: QueryType): Promise<EntityData<T>[] | number>;
20
+ findVirtual<T extends object>(entityName: string, where: ObjectQuery<T>, options: FindOptions<T, any, any, any>): Promise<EntityData<T>[]>;
21
+ countVirtual<T extends object>(entityName: string, where: ObjectQuery<T>, options: CountOptions<T, any>): Promise<number>;
22
+ protected findFromVirtual<T extends object>(entityName: string, where: ObjectQuery<T>, options: FindOptions<T, any> | CountOptions<T, any>, type: QueryType): Promise<EntityData<T>[] | number>;
23
23
  protected wrapVirtualExpressionInSubquery<T extends object>(meta: EntityMetadata<T>, expression: string, where: FilterQuery<T>, options: FindOptions<T, any>, type: QueryType): Promise<T[] | number>;
24
24
  mapResult<T extends object>(result: EntityData<T>, meta: EntityMetadata<T>, populate?: PopulateOptions<T>[], qb?: QueryBuilder<T, any, any, any>, map?: Dictionary): EntityData<T> | null;
25
25
  private mapJoinedProps;
@@ -72,9 +72,9 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
72
72
  protected buildPopulateOrderBy<T extends object>(qb: QueryBuilder<T, any, any, any>, meta: EntityMetadata<T>, populateOrderBy: QueryOrderMap<T>[], parentPath: string, explicit: boolean, parentAlias?: string): QueryOrderMap<T>[];
73
73
  protected buildJoinedPropsOrderBy<T extends object>(qb: QueryBuilder<T, any, any, any>, meta: EntityMetadata<T>, populate: PopulateOptions<T>[], options?: Pick<FindOptions<any>, 'strategy' | 'orderBy' | 'populateOrderBy'>, parentPath?: string): QueryOrderMap<T>[];
74
74
  protected normalizeFields<T extends object>(fields: Field<T>[], prefix?: string): string[];
75
- protected processField<T extends object>(meta: EntityMetadata<T>, prop: EntityProperty<T> | undefined, field: string, ret: Field<T>[], populate: PopulateOptions<T>[], joinedProps: PopulateOptions<T>[], qb: QueryBuilder<T, any, any, any>): void;
75
+ protected processField<T extends object>(meta: EntityMetadata<T>, prop: EntityProperty<T> | undefined, field: string, ret: Field<T>[]): void;
76
76
  protected isPopulated<T extends object>(meta: EntityMetadata<T>, prop: EntityProperty<T>, hint: PopulateOptions<T>, name?: string): boolean;
77
- protected buildFields<T extends object>(meta: EntityMetadata<T>, populate: PopulateOptions<T>[], joinedProps: PopulateOptions<T>[], qb: QueryBuilder<T, any, any, any>, alias: string, options: Pick<FindOptions<T, any, any, any>, 'strategy' | 'fields' | 'exclude'>, count?: boolean): Field<T>[];
77
+ protected buildFields<T extends object>(meta: EntityMetadata<T>, populate: PopulateOptions<T>[], joinedProps: PopulateOptions<T>[], qb: QueryBuilder<T, any, any, any>, alias: string, options: Pick<FindOptions<T, any, any, any>, 'strategy' | 'fields' | 'exclude'>): Field<T>[];
78
78
  }
79
79
  interface FieldsForJoinedLoadOptions<T extends object> {
80
80
  explicitFields?: readonly Field<T>[];