@mikro-orm/knex 6.0.0-dev.273 → 6.0.0-dev.274

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.
@@ -13,10 +13,10 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
13
13
  protected constructor(config: Configuration, platform: Platform, connection: Constructor<Connection>, connector: string[]);
14
14
  getPlatform(): Platform;
15
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>;
16
+ find<T extends object, P extends string = never, F extends string = '*', E extends string = never>(entityName: string, where: FilterQuery<T>, options?: FindOptions<T, P, F, E>): Promise<EntityData<T>[]>;
17
+ findOne<T extends object, P extends string = never, F extends string = '*', E extends string = never>(entityName: string, where: FilterQuery<T>, options?: FindOneOptions<T, P, F, E>): Promise<EntityData<T> | null>;
18
18
  protected hasToManyJoins<T extends object>(hint: PopulateOptions<T>, meta: EntityMetadata<T>): boolean;
19
- findVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: FindOptions<T, any, any>): Promise<EntityData<T>[]>;
19
+ findVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: FindOptions<T, any, any, any>): Promise<EntityData<T>[]>;
20
20
  countVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: CountOptions<T, any>): Promise<number>;
21
21
  protected findFromVirtual<T extends object>(entityName: string, where: FilterQuery<T>, options: FindOptions<T, any> | CountOptions<T, any>, type: QueryType): Promise<EntityData<T>[] | number>;
22
22
  protected wrapVirtualExpressionInSubquery<T extends object>(meta: EntityMetadata<T>, expression: string, where: FilterQuery<T>, options: FindOptions<T, any>, type: QueryType): Promise<T[] | number>;
@@ -29,7 +29,7 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
29
29
  nativeUpdateMany<T extends object>(entityName: string, where: FilterQuery<T>[], data: EntityDictionary<T>[], options?: NativeInsertUpdateManyOptions<T> & UpsertManyOptions<T>): Promise<QueryResult<T>>;
30
30
  nativeDelete<T extends object>(entityName: string, where: FilterQuery<T> | string | any, options?: DeleteOptions<T>): Promise<QueryResult<T>>;
31
31
  syncCollections<T extends object, O extends object>(collections: Iterable<Collection<T, O>>, options?: DriverMethodOptions): Promise<void>;
32
- 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
+ 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, any>, pivotJoin?: boolean): Promise<Dictionary<T[]>>;
33
33
  private getPivotOrderBy;
34
34
  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>;
35
35
  /**
@@ -46,7 +46,7 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
46
46
  * @internal
47
47
  */
48
48
  mergeJoinedResult<T extends object>(rawResults: EntityData<T>[], meta: EntityMetadata<T>, joinedProps: PopulateOptions<T>[]): EntityData<T>[];
49
- protected getFieldsForJoinedLoad<T extends object>(qb: QueryBuilder<T>, meta: EntityMetadata<T>, explicitFields?: Field<T>[], populate?: PopulateOptions<T>[], options?: {
49
+ protected getFieldsForJoinedLoad<T extends object>(qb: QueryBuilder<T>, meta: EntityMetadata<T>, explicitFields?: Field<T>[], exclude?: Field<T>[], populate?: PopulateOptions<T>[], options?: {
50
50
  strategy?: Options['loadStrategy'];
51
51
  populateWhere?: FindOptions<any>['populateWhere'];
52
52
  }, parentTableAlias?: string, parentJoinPath?: string): Field<T>[];
@@ -68,7 +68,5 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
68
68
  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>[];
69
69
  protected normalizeFields<T extends object>(fields: Field<T>[], prefix?: string): string[];
70
70
  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;
71
- protected buildFields<T extends object>(meta: EntityMetadata<T>, populate: PopulateOptions<T>[], joinedProps: PopulateOptions<T>[], qb: QueryBuilder<T>, alias: string, fields?: Field<T>[], options?: {
72
- strategy?: Options['loadStrategy'];
73
- }): Field<T>[];
71
+ protected buildFields<T extends object>(meta: EntityMetadata<T>, populate: PopulateOptions<T>[], joinedProps: PopulateOptions<T>[], qb: QueryBuilder<T>, alias: string, options: Pick<FindOptions<T, any, any, any>, 'strategy' | 'fields' | 'exclude'>): Field<T>[];
74
72
  }
@@ -31,7 +31,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
31
31
  const populate = this.autoJoinOneToOneOwner(meta, options.populate, options.fields);
32
32
  const joinedProps = this.joinedProps(meta, populate, options);
33
33
  const qb = this.createQueryBuilder(entityName, options.ctx, options.connectionType, false, options.logging);
34
- const fields = this.buildFields(meta, populate, joinedProps, qb, qb.alias, options.fields, options);
34
+ const fields = this.buildFields(meta, populate, joinedProps, qb, qb.alias, options);
35
35
  const orderBy = this.buildOrderBy(qb, meta, populate, options);
36
36
  core_1.Utils.asArray(options.flags).forEach(flag => qb.setFlag(flag));
37
37
  if (core_1.Utils.isPrimaryKey(where, meta.compositePK)) {
@@ -690,7 +690,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
690
690
  const targetAlias = qb.getNextAlias(prop.targetMeta.tableName);
691
691
  const targetSchema = this.getSchemaName(prop.targetMeta, options) ?? this.platform.getDefaultSchemaName();
692
692
  qb.innerJoin(pivotProp1.name, targetAlias, {}, targetSchema);
693
- const targetFields = this.buildFields(prop.targetMeta, (options.populate ?? []), [], qb, targetAlias, options.fields, options);
693
+ const targetFields = this.buildFields(prop.targetMeta, (options.populate ?? []), [], qb, targetAlias, options);
694
694
  for (const field of targetFields) {
695
695
  const f = field.toString();
696
696
  fields.unshift(f.includes('.') ? field : `${targetAlias}.${f}`);
@@ -823,14 +823,14 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
823
823
  }
824
824
  return res;
825
825
  }
826
- getFieldsForJoinedLoad(qb, meta, explicitFields, populate = [], options, parentTableAlias, parentJoinPath) {
826
+ getFieldsForJoinedLoad(qb, meta, explicitFields, exclude, populate = [], options, parentTableAlias, parentJoinPath) {
827
827
  const fields = [];
828
828
  const joinedProps = this.joinedProps(meta, populate, options);
829
829
  if (explicitFields?.includes('*')) {
830
830
  fields.push('*');
831
831
  }
832
832
  const shouldHaveColumn = (prop, populate, fields) => {
833
- if (!this.platform.shouldHaveColumn(prop, populate)) {
833
+ if (!this.platform.shouldHaveColumn(prop, populate, exclude)) {
834
834
  return false;
835
835
  }
836
836
  if (!fields || prop.primary) {
@@ -863,7 +863,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
863
863
  fields.push(...prop.joinColumns.map(col => qb.helper.mapper(`${tableAlias}.${col}`, qb.type, undefined, `${tableAlias}__${col}`)), ...prop.inverseJoinColumns.map(col => qb.helper.mapper(`${tableAlias}.${col}`, qb.type, undefined, `${tableAlias}__${col}`)));
864
864
  }
865
865
  if (prop.kind === core_1.ReferenceKind.ONE_TO_MANY && ref) {
866
- fields.push(...this.getFieldsForJoinedLoad(qb, meta2, prop.referencedColumnNames, hint.children, options, tableAlias, path));
866
+ fields.push(...this.getFieldsForJoinedLoad(qb, meta2, prop.referencedColumnNames, undefined, hint.children, options, tableAlias, path));
867
867
  }
868
868
  const childExplicitFields = explicitFields?.filter(f => core_1.Utils.isPlainObject(f)).map(o => o[prop.name])[0] || [];
869
869
  explicitFields?.forEach(f => {
@@ -871,8 +871,9 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
871
871
  childExplicitFields.push(f.substring(prop.name.length + 1));
872
872
  }
873
873
  });
874
+ const childExclude = exclude ? core_1.Utils.extractChildElements(exclude, prop.name) : exclude;
874
875
  if (!ref) {
875
- fields.push(...this.getFieldsForJoinedLoad(qb, meta2, childExplicitFields.length === 0 ? undefined : childExplicitFields, hint.children, options, tableAlias, path));
876
+ fields.push(...this.getFieldsForJoinedLoad(qb, meta2, childExplicitFields.length === 0 ? undefined : childExplicitFields, childExclude, hint.children, options, tableAlias, path));
876
877
  }
877
878
  });
878
879
  return fields;
@@ -1074,16 +1075,16 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
1074
1075
  }
1075
1076
  ret.push(prop.name);
1076
1077
  }
1077
- buildFields(meta, populate, joinedProps, qb, alias, fields, options) {
1078
+ buildFields(meta, populate, joinedProps, qb, alias, options) {
1078
1079
  const lazyProps = meta.props.filter(prop => prop.lazy && !populate.some(p => p.field === prop.name || p.all));
1079
1080
  const hasLazyFormulas = meta.props.some(p => p.lazy && p.formula);
1080
1081
  const requiresSQLConversion = meta.props.some(p => p.customType?.convertToJSValueSQL && p.persist !== false);
1081
- const hasExplicitFields = !!fields;
1082
+ const hasExplicitFields = !!options.fields;
1082
1083
  const ret = [];
1083
1084
  let addFormulas = false;
1084
1085
  // handle root entity properties first, this is used for both strategies in the same way
1085
- if (fields) {
1086
- for (const field of this.normalizeFields(fields)) {
1086
+ if (options.fields) {
1087
+ for (const field of this.normalizeFields(options.fields)) {
1087
1088
  if (field === '*') {
1088
1089
  ret.push('*');
1089
1090
  continue;
@@ -1099,12 +1100,12 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
1099
1100
  });
1100
1101
  this.processField(meta, prop, parts.join('.'), ret, populate, joinedProps, qb);
1101
1102
  }
1102
- if (!fields.includes('*') && !fields.includes(`${qb.alias}.*`)) {
1103
- ret.unshift(...meta.primaryKeys.filter(pk => !fields.includes(pk)));
1103
+ if (!options.fields.includes('*') && !options.fields.includes(`${qb.alias}.*`)) {
1104
+ ret.unshift(...meta.primaryKeys.filter(pk => !options.fields.includes(pk)));
1104
1105
  }
1105
1106
  }
1106
- else if (lazyProps.filter(p => !p.formula).length > 0) {
1107
- const props = meta.props.filter(prop => this.platform.shouldHaveColumn(prop, populate, false));
1107
+ else if (!core_1.Utils.isEmpty(options.exclude) || lazyProps.some(p => !p.formula)) {
1108
+ const props = meta.props.filter(prop => this.platform.shouldHaveColumn(prop, populate, options.exclude, false));
1108
1109
  ret.push(...core_1.Utils.flatten(props.filter(p => !lazyProps.includes(p)).map(p => p.fieldNames)));
1109
1110
  addFormulas = true;
1110
1111
  }
@@ -1129,7 +1130,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
1129
1130
  }
1130
1131
  // add joined relations after the root entity fields
1131
1132
  if (joinedProps.length > 0) {
1132
- ret.push(...this.getFieldsForJoinedLoad(qb, meta, fields, populate, options, alias));
1133
+ ret.push(...this.getFieldsForJoinedLoad(qb, meta, options.fields, options.exclude, populate, options, alias));
1133
1134
  }
1134
1135
  return core_1.Utils.unique(ret);
1135
1136
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikro-orm/knex",
3
- "version": "6.0.0-dev.273",
3
+ "version": "6.0.0-dev.274",
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.0.0"
67
67
  },
68
68
  "peerDependencies": {
69
- "@mikro-orm/core": "6.0.0-dev.273"
69
+ "@mikro-orm/core": "6.0.0-dev.274"
70
70
  }
71
71
  }