@mikro-orm/knex 6.0.0-dev.10 → 6.0.0-dev.12

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.
@@ -6,13 +6,13 @@ import type { AbstractSqlPlatform } from './AbstractSqlPlatform';
6
6
  import { QueryBuilder, QueryType } from './query';
7
7
  import { SqlEntityManager } from './SqlEntityManager';
8
8
  import type { Field } from './typings';
9
- export declare abstract class AbstractSqlDriver<C extends AbstractSqlConnection = AbstractSqlConnection> extends DatabaseDriver<C> {
9
+ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlConnection = AbstractSqlConnection, Platform extends AbstractSqlPlatform = AbstractSqlPlatform> extends DatabaseDriver<Connection> {
10
10
  [EntityManagerType]: SqlEntityManager<this>;
11
- protected readonly connection: C;
12
- protected readonly replicas: C[];
13
- protected readonly platform: AbstractSqlPlatform;
14
- protected constructor(config: Configuration, platform: AbstractSqlPlatform, connection: Constructor<C>, connector: string[]);
15
- getPlatform(): AbstractSqlPlatform;
11
+ protected readonly connection: Connection;
12
+ protected readonly replicas: Connection[];
13
+ protected readonly platform: Platform;
14
+ protected constructor(config: Configuration, platform: Platform, connection: Constructor<Connection>, connector: string[]);
15
+ getPlatform(): Platform;
16
16
  createEntityManager<D extends IDatabaseDriver = IDatabaseDriver>(useContext?: boolean): D[typeof EntityManagerType];
17
17
  find<T extends object, P extends string = never>(entityName: string, where: FilterQuery<T>, options?: FindOptions<T, P>): Promise<EntityData<T>[]>;
18
18
  findOne<T extends object, P extends string = never>(entityName: string, where: FilterQuery<T>, options?: FindOneOptions<T, P>): Promise<EntityData<T> | null>;
@@ -334,6 +334,14 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
334
334
  options.processCollections ?? (options.processCollections = true);
335
335
  options.convertCustomTypes ?? (options.convertCustomTypes = true);
336
336
  const meta = this.metadata.get(entityName);
337
+ if (options.upsert) {
338
+ const uniqueFields = core_1.Utils.isPlainObject(where[0]) ? Object.keys(where[0]) : meta.primaryKeys;
339
+ const qb = this.createQueryBuilder(entityName, options.ctx, 'write', options.convertCustomTypes).withSchema(this.getSchemaName(meta, options));
340
+ qb.insert(data)
341
+ .onConflict(uniqueFields.map(p => meta?.properties[p]?.fieldNames[0] ?? p))
342
+ .merge(Object.keys(data[0]).filter(f => !uniqueFields.includes(f)));
343
+ return qb.execute('run', false);
344
+ }
337
345
  const collections = options.processCollections ? data.map(d => this.extractManyToMany(entityName, d)) : [];
338
346
  const keys = new Set();
339
347
  data.forEach(row => Object.keys(row).forEach(k => keys.add(k)));
package/index.mjs CHANGED
@@ -186,6 +186,7 @@ export const expr = mod.expr;
186
186
  export const helper = mod.helper;
187
187
  export const knex = mod.knex;
188
188
  export const ref = mod.ref;
189
+ export const rel = mod.rel;
189
190
  export const serialize = mod.serialize;
190
191
  export const t = mod.t;
191
192
  export const types = mod.types;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikro-orm/knex",
3
- "version": "6.0.0-dev.10",
3
+ "version": "6.0.0-dev.12",
4
4
  "description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
5
5
  "main": "index.js",
6
6
  "module": "index.mjs",
@@ -66,6 +66,6 @@
66
66
  "@mikro-orm/core": "^5.5.3"
67
67
  },
68
68
  "peerDependencies": {
69
- "@mikro-orm/core": "~6.0.0-dev.10"
69
+ "@mikro-orm/core": "~6.0.0-dev.12"
70
70
  }
71
71
  }
@@ -1,3 +1,5 @@
1
+ /// <reference types="node" />
2
+ import { inspect } from 'util';
1
3
  import type { Knex } from 'knex';
2
4
  import type { AnyEntity, ConnectionType, Dictionary, EntityData, EntityName, EntityProperty, FlushMode, GroupOperator, MetadataStorage, ObjectQuery, PopulateOptions, QBFilterQuery, QBQueryOrderMap, QueryResult, RequiredEntityData } from '@mikro-orm/core';
3
5
  import { LockMode, PopulateHint, QueryFlag } from '@mikro-orm/core';
@@ -75,7 +77,7 @@ export declare class QueryBuilder<T extends object = AnyEntity> {
75
77
  /**
76
78
  * @internal
77
79
  */
78
- constructor(entityName: EntityName<T> | QueryBuilder<T>, metadata: MetadataStorage, driver: AbstractSqlDriver, context?: Knex.Transaction<any, any[]> | undefined, alias?: string, connectionType?: ConnectionType | undefined, em?: SqlEntityManager<AbstractSqlDriver<import("../AbstractSqlConnection").AbstractSqlConnection>> | undefined);
80
+ constructor(entityName: EntityName<T> | QueryBuilder<T>, metadata: MetadataStorage, driver: AbstractSqlDriver, context?: Knex.Transaction<any, any[]> | undefined, alias?: string, connectionType?: ConnectionType | undefined, em?: SqlEntityManager<AbstractSqlDriver<import("../AbstractSqlConnection").AbstractSqlConnection, import("../AbstractSqlPlatform").AbstractSqlPlatform>> | undefined);
79
81
  select(fields: Field<T> | Field<T>[], distinct?: boolean): SelectQueryBuilder<T>;
80
82
  addSelect(fields: Field<T> | Field<T>[]): SelectQueryBuilder<T>;
81
83
  distinct(): SelectQueryBuilder<T>;
@@ -207,6 +209,7 @@ export declare class QueryBuilder<T extends object = AnyEntity> {
207
209
  private createQueryBuilderHelper;
208
210
  private ensureFromClause;
209
211
  private ensureNotFinalized;
212
+ [inspect.custom](depth: number): string;
210
213
  }
211
214
  export interface RunQueryBuilder<T extends object> extends Omit<QueryBuilder<T>, 'getResult' | 'getSingleResult' | 'getResultList' | 'where'> {
212
215
  where(cond: QBFilterQuery<T> | string, params?: keyof typeof GroupOperator | any[], operator?: keyof typeof GroupOperator): this;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.QueryBuilder = void 0;
4
+ const util_1 = require("util");
4
5
  const core_1 = require("@mikro-orm/core");
5
6
  const enums_1 = require("./enums");
6
7
  const QueryBuilderHelper_1 = require("./QueryBuilderHelper");
@@ -885,5 +886,27 @@ class QueryBuilder {
885
886
  throw new Error('This QueryBuilder instance is already finalized, clone it first if you want to modify it.');
886
887
  }
887
888
  }
889
+ /* istanbul ignore next */
890
+ [util_1.inspect.custom](depth) {
891
+ const object = { ...this };
892
+ const hidden = ['metadata', 'driver', 'context', 'platform', 'knex', 'type'];
893
+ Object.keys(object).filter(k => k.startsWith('_')).forEach(k => delete object[k]);
894
+ Object.keys(object).filter(k => object[k] == null).forEach(k => delete object[k]);
895
+ hidden.forEach(k => delete object[k]);
896
+ let prefix = this.type ? this.type.substring(0, 1) + this.type.toLowerCase().substring(1) : '';
897
+ if (this._data) {
898
+ object.data = this._data;
899
+ }
900
+ if (!core_1.Utils.isEmpty(this._cond)) {
901
+ object.where = this._cond;
902
+ }
903
+ if (this._onConflict?.[0]) {
904
+ prefix = 'Upsert';
905
+ object.onConflict = this._onConflict[0];
906
+ }
907
+ const name = this._mainAlias ? `${prefix}QueryBuilder<${this._mainAlias?.entityName}>` : 'QueryBuilder';
908
+ const ret = (0, util_1.inspect)(object, { depth });
909
+ return ret === '[Object]' ? `[${name}]` : name + ' ' + ret;
910
+ }
888
911
  }
889
912
  exports.QueryBuilder = QueryBuilder;