@mikro-orm/knex 6.0.0-dev.2 → 6.0.0-dev.200

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 (69) hide show
  1. package/{dist/AbstractSqlConnection.d.ts → AbstractSqlConnection.d.ts} +8 -4
  2. package/{dist/AbstractSqlConnection.js → AbstractSqlConnection.js} +35 -18
  3. package/AbstractSqlDriver.d.ts +73 -0
  4. package/AbstractSqlDriver.js +1085 -0
  5. package/AbstractSqlPlatform.d.ts +22 -0
  6. package/{dist/AbstractSqlPlatform.js → AbstractSqlPlatform.js} +46 -19
  7. package/{dist/MonkeyPatchable.d.ts → MonkeyPatchable.d.ts} +1 -0
  8. package/{dist/MonkeyPatchable.js → MonkeyPatchable.js} +3 -0
  9. package/PivotCollectionPersister.d.ts +17 -0
  10. package/PivotCollectionPersister.js +128 -0
  11. package/{dist/README.md → README.md} +66 -109
  12. package/{dist/SqlEntityManager.d.ts → SqlEntityManager.d.ts} +6 -10
  13. package/{dist/SqlEntityManager.js → SqlEntityManager.js} +5 -10
  14. package/SqlEntityRepository.d.ts +24 -0
  15. package/{dist/SqlEntityRepository.js → SqlEntityRepository.js} +11 -8
  16. package/{dist/index.d.ts → index.d.ts} +1 -0
  17. package/{dist/index.js → index.js} +6 -1
  18. package/index.mjs +211 -0
  19. package/package.json +20 -49
  20. package/query/ArrayCriteriaNode.d.ts +10 -0
  21. package/{dist/query → query}/ArrayCriteriaNode.js +7 -2
  22. package/{dist/query → query}/CriteriaNode.d.ts +11 -9
  23. package/{dist/query → query}/CriteriaNode.js +31 -15
  24. package/query/CriteriaNodeFactory.d.ts +12 -0
  25. package/{dist/query → query}/CriteriaNodeFactory.js +32 -15
  26. package/query/ObjectCriteriaNode.d.ts +15 -0
  27. package/{dist/query → query}/ObjectCriteriaNode.js +68 -21
  28. package/query/QueryBuilder.d.ts +284 -0
  29. package/query/QueryBuilder.js +1218 -0
  30. package/{dist/query → query}/QueryBuilderHelper.d.ts +26 -23
  31. package/query/QueryBuilderHelper.js +661 -0
  32. package/query/ScalarCriteriaNode.d.ts +10 -0
  33. package/{dist/query → query}/ScalarCriteriaNode.js +12 -8
  34. package/query/enums.d.ts +15 -0
  35. package/query/enums.js +20 -0
  36. package/{dist/query → query}/index.js +5 -1
  37. package/{dist/schema → schema}/DatabaseSchema.d.ts +6 -3
  38. package/{dist/schema → schema}/DatabaseSchema.js +35 -25
  39. package/{dist/schema → schema}/DatabaseTable.d.ts +21 -13
  40. package/schema/DatabaseTable.js +645 -0
  41. package/{dist/schema → schema}/SchemaComparator.d.ts +9 -7
  42. package/{dist/schema → schema}/SchemaComparator.js +99 -25
  43. package/{dist/schema → schema}/SchemaHelper.d.ts +20 -13
  44. package/{dist/schema → schema}/SchemaHelper.js +70 -18
  45. package/{dist/schema/SchemaGenerator.d.ts → schema/SqlSchemaGenerator.d.ts} +11 -14
  46. package/{dist/schema/SchemaGenerator.js → schema/SqlSchemaGenerator.js} +149 -63
  47. package/{dist/schema → schema}/index.d.ts +1 -1
  48. package/{dist/schema → schema}/index.js +6 -2
  49. package/{dist/typings.d.ts → typings.d.ts} +45 -22
  50. package/CHANGELOG.md +0 -661
  51. package/dist/AbstractSqlDriver.d.ts +0 -55
  52. package/dist/AbstractSqlDriver.js +0 -644
  53. package/dist/AbstractSqlPlatform.d.ts +0 -21
  54. package/dist/LICENSE +0 -21
  55. package/dist/SqlEntityRepository.d.ts +0 -23
  56. package/dist/index.mjs +0 -26
  57. package/dist/package.json +0 -99
  58. package/dist/query/ArrayCriteriaNode.d.ts +0 -9
  59. package/dist/query/CriteriaNodeFactory.d.ts +0 -12
  60. package/dist/query/ObjectCriteriaNode.d.ts +0 -14
  61. package/dist/query/QueryBuilder.d.ts +0 -211
  62. package/dist/query/QueryBuilder.js +0 -688
  63. package/dist/query/QueryBuilderHelper.js +0 -523
  64. package/dist/query/ScalarCriteriaNode.d.ts +0 -9
  65. package/dist/query/enums.d.ts +0 -8
  66. package/dist/query/enums.js +0 -12
  67. package/dist/schema/DatabaseTable.js +0 -319
  68. /package/{dist/query → query}/index.d.ts +0 -0
  69. /package/{dist/typings.js → typings.js} +0 -0
@@ -1,28 +1,32 @@
1
- import type { Knex } from 'knex';
2
- import type { AnyEntity, Configuration, ConnectionOptions, EntityData, IsolationLevel, QueryResult, Transaction, TransactionEventBroadcaster } from '@mikro-orm/core';
3
- import { Connection } from '@mikro-orm/core';
1
+ import { type Knex } from 'knex';
2
+ import { Connection, type AnyEntity, type Configuration, type ConnectionOptions, type EntityData, type IsolationLevel, type QueryResult, type Transaction, type TransactionEventBroadcaster, type LoggingOptions } from '@mikro-orm/core';
4
3
  import type { AbstractSqlPlatform } from './AbstractSqlPlatform';
5
4
  export declare abstract class AbstractSqlConnection extends Connection {
6
5
  private static __patched;
7
6
  protected platform: AbstractSqlPlatform;
8
7
  protected client: Knex;
9
8
  constructor(config: Configuration, options?: ConnectionOptions, type?: 'read' | 'write');
9
+ abstract createKnex(): void;
10
+ /** @inheritDoc */
11
+ connect(): void | Promise<void>;
10
12
  getKnex(): Knex;
11
13
  close(force?: boolean): Promise<void>;
12
14
  isConnected(): Promise<boolean>;
13
15
  transactional<T>(cb: (trx: Transaction<Knex.Transaction>) => Promise<T>, options?: {
14
16
  isolationLevel?: IsolationLevel;
17
+ readOnly?: boolean;
15
18
  ctx?: Knex.Transaction;
16
19
  eventBroadcaster?: TransactionEventBroadcaster;
17
20
  }): Promise<T>;
18
21
  begin(options?: {
19
22
  isolationLevel?: IsolationLevel;
23
+ readOnly?: boolean;
20
24
  ctx?: Knex.Transaction;
21
25
  eventBroadcaster?: TransactionEventBroadcaster;
22
26
  }): Promise<Knex.Transaction>;
23
27
  commit(ctx: Knex.Transaction, eventBroadcaster?: TransactionEventBroadcaster): Promise<void>;
24
28
  rollback(ctx: Knex.Transaction, eventBroadcaster?: TransactionEventBroadcaster): Promise<void>;
25
- execute<T extends QueryResult | EntityData<AnyEntity> | EntityData<AnyEntity>[] = EntityData<AnyEntity>[]>(queryOrKnex: string | Knex.QueryBuilder | Knex.Raw, params?: unknown[], method?: 'all' | 'get' | 'run', ctx?: Transaction): Promise<T>;
29
+ execute<T extends QueryResult | EntityData<AnyEntity> | EntityData<AnyEntity>[] = EntityData<AnyEntity>[]>(queryOrKnex: string | Knex.QueryBuilder | Knex.Raw, params?: unknown[], method?: 'all' | 'get' | 'run', ctx?: Transaction, logging?: LoggingOptions): Promise<T>;
26
30
  /**
27
31
  * Execute raw SQL queries from file
28
32
  */
@@ -10,20 +10,29 @@ function isRootTransaction(trx) {
10
10
  return !Object.getOwnPropertySymbols(trx).includes(parentTransactionSymbol);
11
11
  }
12
12
  class AbstractSqlConnection extends core_1.Connection {
13
+ static __patched = false;
14
+ client;
13
15
  constructor(config, options, type) {
14
16
  super(config, options, type);
15
17
  this.patchKnexClient();
16
18
  }
19
+ /** @inheritDoc */
20
+ connect() {
21
+ this.createKnex();
22
+ }
17
23
  getKnex() {
24
+ if (!this.client) {
25
+ this.createKnex();
26
+ }
18
27
  return this.client;
19
28
  }
20
29
  async close(force) {
21
30
  await super.close(force);
22
- await this.client.destroy();
31
+ await this.getKnex().destroy();
23
32
  }
24
33
  async isConnected() {
25
34
  try {
26
- await this.client.raw('select 1');
35
+ await this.getKnex().raw('select 1');
27
36
  return true;
28
37
  }
29
38
  catch {
@@ -46,7 +55,10 @@ class AbstractSqlConnection extends core_1.Connection {
46
55
  if (!options.ctx) {
47
56
  await options.eventBroadcaster?.dispatchEvent(core_1.EventType.beforeTransactionStart);
48
57
  }
49
- const trx = await (options.ctx || this.client).transaction(null, { isolationLevel: options.isolationLevel });
58
+ const trx = await (options.ctx || this.getKnex()).transaction(null, {
59
+ isolationLevel: options.isolationLevel,
60
+ readOnly: options.readOnly,
61
+ });
50
62
  if (!options.ctx) {
51
63
  await options.eventBroadcaster?.dispatchEvent(core_1.EventType.afterTransactionStart, trx);
52
64
  }
@@ -76,32 +88,38 @@ class AbstractSqlConnection extends core_1.Connection {
76
88
  await eventBroadcaster?.dispatchEvent(core_1.EventType.afterTransactionRollback, ctx);
77
89
  }
78
90
  }
79
- async execute(queryOrKnex, params = [], method = 'all', ctx) {
91
+ async execute(queryOrKnex, params = [], method = 'all', ctx, logging) {
92
+ await this.ensureConnection();
80
93
  if (core_1.Utils.isObject(queryOrKnex)) {
81
- ctx ?? (ctx = queryOrKnex.client.transacting ? queryOrKnex : null);
94
+ ctx ??= (queryOrKnex.client.transacting ? queryOrKnex : null);
82
95
  const q = queryOrKnex.toSQL();
83
96
  queryOrKnex = q.sql;
84
97
  params = q.bindings;
85
98
  }
86
99
  const formatted = this.platform.formatQuery(queryOrKnex, params);
87
- const sql = this.getSql(queryOrKnex, formatted);
88
- const res = await this.executeQuery(sql, () => {
89
- const query = this.client.raw(formatted);
100
+ const sql = this.getSql(queryOrKnex, formatted, logging);
101
+ return this.executeQuery(sql, async () => {
102
+ const query = this.getKnex().raw(formatted);
90
103
  if (ctx) {
91
104
  query.transacting(ctx);
92
105
  }
93
- return query;
94
- }, { query: queryOrKnex, params });
95
- return this.transformRawResult(res, method);
106
+ const res = await query;
107
+ return this.transformRawResult(res, method);
108
+ }, { query: queryOrKnex, params, ...logging });
96
109
  }
97
110
  /**
98
111
  * Execute raw SQL queries from file
99
112
  */
100
113
  async loadFile(path) {
101
114
  const buf = await (0, fs_extra_1.readFile)(path);
102
- await this.client.raw(buf.toString());
115
+ await this.getKnex().raw(buf.toString());
103
116
  }
104
117
  createKnexClient(type) {
118
+ const driverOptions = this.config.get('driverOptions');
119
+ if (driverOptions.context?.client instanceof knex_1.knex.Client) {
120
+ this.logger.log('info', 'Reusing knex client provided via `driverOptions`');
121
+ return driverOptions;
122
+ }
105
123
  return (0, knex_1.knex)(this.getKnexOptions(type))
106
124
  .on('query', data => {
107
125
  if (!data.__knexQueryUid) {
@@ -110,7 +128,7 @@ class AbstractSqlConnection extends core_1.Connection {
110
128
  });
111
129
  }
112
130
  getKnexOptions(type) {
113
- const config = core_1.Utils.merge({
131
+ const config = core_1.Utils.mergeConfig({
114
132
  client: type,
115
133
  connection: this.getConnectionOptions(),
116
134
  pool: this.config.get('pool'),
@@ -133,15 +151,15 @@ class AbstractSqlConnection extends core_1.Connection {
133
151
  };
134
152
  return config;
135
153
  }
136
- getSql(query, formatted) {
154
+ getSql(query, formatted, context) {
137
155
  const logger = this.config.getLogger();
138
- if (!logger.isEnabled('query')) {
156
+ if (!logger.isEnabled('query', context)) {
139
157
  return query;
140
158
  }
141
- if (logger.isEnabled('query-params')) {
159
+ if (logger.isEnabled('query-params', context)) {
142
160
  return formatted;
143
161
  }
144
- return this.client.client.positionBindings(query);
162
+ return this.getKnex().client.positionBindings(query);
145
163
  }
146
164
  /**
147
165
  * do not call `positionBindings` when there are no bindings - it was messing up with
@@ -173,4 +191,3 @@ class AbstractSqlConnection extends core_1.Connection {
173
191
  }
174
192
  }
175
193
  exports.AbstractSqlConnection = AbstractSqlConnection;
176
- AbstractSqlConnection.__patched = false;
@@ -0,0 +1,73 @@
1
+ import type { Knex } from 'knex';
2
+ import { type AnyEntity, type Collection, type Configuration, type ConnectionType, type Constructor, type CountOptions, DatabaseDriver, type DeleteOptions, type Dictionary, type DriverMethodOptions, type EntityData, type EntityDictionary, type EntityField, EntityManagerType, type EntityMetadata, type EntityName, type EntityProperty, type FilterQuery, type FindOneOptions, type FindOptions, type IDatabaseDriver, type LockOptions, type LoggingOptions, type NativeInsertUpdateManyOptions, type NativeInsertUpdateOptions, type Options, type OrderDefinition, type PopulateOptions, type Primary, type QueryOrderMap, type QueryResult, type Transaction, type UpsertManyOptions, type UpsertOptions } from '@mikro-orm/core';
3
+ import type { AbstractSqlConnection } from './AbstractSqlConnection';
4
+ import type { AbstractSqlPlatform } from './AbstractSqlPlatform';
5
+ import { QueryBuilder, QueryType } from './query';
6
+ import { SqlEntityManager } from './SqlEntityManager';
7
+ import type { Field } from './typings';
8
+ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlConnection = AbstractSqlConnection, Platform extends AbstractSqlPlatform = AbstractSqlPlatform> extends DatabaseDriver<Connection> {
9
+ [EntityManagerType]: SqlEntityManager<this>;
10
+ protected readonly connection: Connection;
11
+ protected readonly replicas: Connection[];
12
+ protected readonly platform: Platform;
13
+ protected constructor(config: Configuration, platform: Platform, connection: Constructor<Connection>, connector: string[]);
14
+ getPlatform(): Platform;
15
+ createEntityManager<D extends IDatabaseDriver = IDatabaseDriver>(useContext?: boolean): D[typeof EntityManagerType];
16
+ find<T extends object, P extends string = never, F extends string = '*'>(entityName: string, where: FilterQuery<T>, options?: FindOptions<T, P, F>): Promise<EntityData<T>[]>;
17
+ findOne<T extends object, P extends string = never, F extends string = '*'>(entityName: string, where: FilterQuery<T>, options?: FindOneOptions<T, P, F>): Promise<EntityData<T> | null>;
18
+ findVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: FindOptions<T, any, any>): Promise<EntityData<T>[]>;
19
+ countVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: CountOptions<T, any>): Promise<number>;
20
+ protected findFromVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: FindOptions<T, any> | CountOptions<T, any>, type: QueryType): Promise<EntityData<T>[] | number>;
21
+ protected wrapVirtualExpressionInSubquery<T extends object>(meta: EntityMetadata<T>, expression: string, where: FilterQuery<T>, options: FindOptions<T, any>, type: QueryType): Promise<T[] | number>;
22
+ mapResult<T extends object>(result: EntityData<T>, meta: EntityMetadata<T>, populate?: PopulateOptions<T>[], qb?: QueryBuilder<T>, map?: Dictionary): EntityData<T> | null;
23
+ private mapJoinedProps;
24
+ count<T extends object>(entityName: string, where: any, options?: CountOptions<T>): Promise<number>;
25
+ nativeInsert<T extends object>(entityName: string, data: EntityDictionary<T>, options?: NativeInsertUpdateOptions<T>): Promise<QueryResult<T>>;
26
+ nativeInsertMany<T extends object>(entityName: string, data: EntityDictionary<T>[], options?: NativeInsertUpdateManyOptions<T>): Promise<QueryResult<T>>;
27
+ nativeUpdate<T extends object>(entityName: string, where: FilterQuery<T>, data: EntityDictionary<T>, options?: NativeInsertUpdateOptions<T> & UpsertOptions<T>): Promise<QueryResult<T>>;
28
+ nativeUpdateMany<T extends object>(entityName: string, where: FilterQuery<T>[], data: EntityDictionary<T>[], options?: NativeInsertUpdateManyOptions<T> & UpsertManyOptions<T>): Promise<QueryResult<T>>;
29
+ nativeDelete<T extends object>(entityName: string, where: FilterQuery<T> | string | any, options?: DeleteOptions<T>): Promise<QueryResult<T>>;
30
+ syncCollections<T extends object, O extends object>(collections: Iterable<Collection<T, O>>, options?: DriverMethodOptions): Promise<void>;
31
+ loadFromPivotTable<T extends object, O extends object>(prop: EntityProperty, owners: Primary<O>[][], where?: FilterQuery<any>, orderBy?: OrderDefinition<T>, ctx?: Transaction, options?: FindOptions<T, any, any>, pivotJoin?: boolean): Promise<Dictionary<T[]>>;
32
+ private getPivotOrderBy;
33
+ execute<T extends QueryResult | EntityData<AnyEntity> | EntityData<AnyEntity>[] = EntityData<AnyEntity>[]>(queryOrKnex: string | Knex.QueryBuilder | Knex.Raw, params?: any[], method?: 'all' | 'get' | 'run', ctx?: Transaction): Promise<T>;
34
+ /**
35
+ * 1:1 owner side needs to be marked for population so QB auto-joins the owner id
36
+ */
37
+ protected autoJoinOneToOneOwner<T extends object, P extends string = never>(meta: EntityMetadata<T>, populate: PopulateOptions<T>[], fields?: readonly EntityField<T, P>[]): PopulateOptions<T>[];
38
+ /**
39
+ * @internal
40
+ */
41
+ joinedProps<T>(meta: EntityMetadata, populate: PopulateOptions<T>[], options?: {
42
+ strategy?: Options['loadStrategy'];
43
+ }): PopulateOptions<T>[];
44
+ /**
45
+ * @internal
46
+ */
47
+ mergeJoinedResult<T extends object>(rawResults: EntityData<T>[], meta: EntityMetadata<T>, joinedProps: PopulateOptions<T>[]): EntityData<T>[];
48
+ protected getFieldsForJoinedLoad<T extends object>(qb: QueryBuilder<T>, meta: EntityMetadata<T>, explicitFields?: Field<T>[], populate?: PopulateOptions<T>[], options?: {
49
+ strategy?: Options['loadStrategy'];
50
+ populateWhere?: FindOptions<any>['populateWhere'];
51
+ }, parentTableAlias?: string, parentJoinPath?: string): Field<T>[];
52
+ /**
53
+ * @internal
54
+ */
55
+ mapPropToFieldNames<T extends object>(qb: QueryBuilder<T>, prop: EntityProperty<T>, tableAlias?: string): Field<T>[];
56
+ /** @internal */
57
+ createQueryBuilder<T extends object>(entityName: EntityName<T> | QueryBuilder<T>, ctx?: Transaction<Knex.Transaction>, preferredConnectionType?: ConnectionType, convertCustomTypes?: boolean, logging?: LoggingOptions): QueryBuilder<T>;
58
+ protected resolveConnectionType(args: {
59
+ ctx?: Transaction<Knex.Transaction>;
60
+ connectionType?: ConnectionType;
61
+ }): ConnectionType;
62
+ protected extractManyToMany<T>(entityName: string, data: EntityDictionary<T>): EntityData<T>;
63
+ protected processManyToMany<T extends object>(meta: EntityMetadata<T> | undefined, pks: Primary<T>[], collections: EntityData<T>, clear: boolean, options?: DriverMethodOptions): Promise<void>;
64
+ lockPessimistic<T extends object>(entity: T, options: LockOptions): Promise<void>;
65
+ protected buildOrderBy<T extends object>(qb: QueryBuilder<T>, meta: EntityMetadata<T>, populate: PopulateOptions<T>[], options: Pick<FindOptions<any>, 'strategy' | 'orderBy' | 'populateOrderBy'>): QueryOrderMap<T>[];
66
+ protected buildPopulateOrderBy<T extends object>(qb: QueryBuilder<T>, meta: EntityMetadata<T>, populateOrderBy: QueryOrderMap<T>[], parentPath: string, parentAlias?: string): QueryOrderMap<T>[];
67
+ protected buildJoinedPropsOrderBy<T extends object>(qb: QueryBuilder<T>, meta: EntityMetadata<T>, populate: PopulateOptions<T>[], options?: Pick<FindOptions<any>, 'strategy' | 'orderBy' | 'populateOrderBy'>, parentPath?: string): QueryOrderMap<T>[];
68
+ protected normalizeFields<T extends object>(fields: Field<T>[], prefix?: string): string[];
69
+ 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>): void;
70
+ protected buildFields<T extends object>(meta: EntityMetadata<T>, populate: PopulateOptions<T>[], joinedProps: PopulateOptions<T>[], qb: QueryBuilder<T>, alias: string, fields?: Field<T>[], options?: {
71
+ strategy?: Options['loadStrategy'];
72
+ }): Field<T>[];
73
+ }