@mikro-orm/knex 6.0.0-dev.27 → 6.0.0-dev.270

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 (44) hide show
  1. package/AbstractSqlConnection.d.ts +22 -4
  2. package/AbstractSqlConnection.js +48 -18
  3. package/AbstractSqlDriver.d.ts +32 -24
  4. package/AbstractSqlDriver.js +578 -270
  5. package/AbstractSqlPlatform.d.ts +9 -4
  6. package/AbstractSqlPlatform.js +40 -5
  7. package/MonkeyPatchable.d.ts +1 -0
  8. package/MonkeyPatchable.js +3 -0
  9. package/PivotCollectionPersister.d.ts +17 -0
  10. package/PivotCollectionPersister.js +128 -0
  11. package/README.md +64 -107
  12. package/SqlEntityManager.d.ts +4 -8
  13. package/SqlEntityManager.js +8 -12
  14. package/SqlEntityRepository.d.ts +7 -6
  15. package/SqlEntityRepository.js +11 -8
  16. package/index.mjs +22 -3
  17. package/package.json +8 -8
  18. package/query/ArrayCriteriaNode.d.ts +5 -4
  19. package/query/ArrayCriteriaNode.js +7 -2
  20. package/query/CriteriaNode.d.ts +12 -10
  21. package/query/CriteriaNode.js +22 -9
  22. package/query/CriteriaNodeFactory.d.ts +6 -6
  23. package/query/CriteriaNodeFactory.js +32 -16
  24. package/query/ObjectCriteriaNode.d.ts +5 -4
  25. package/query/ObjectCriteriaNode.js +72 -28
  26. package/query/QueryBuilder.d.ts +58 -26
  27. package/query/QueryBuilder.js +438 -142
  28. package/query/QueryBuilderHelper.d.ts +13 -18
  29. package/query/QueryBuilderHelper.js +191 -164
  30. package/query/ScalarCriteriaNode.d.ts +4 -3
  31. package/query/ScalarCriteriaNode.js +14 -4
  32. package/query/enums.d.ts +7 -0
  33. package/query/enums.js +10 -2
  34. package/schema/DatabaseSchema.d.ts +5 -2
  35. package/schema/DatabaseSchema.js +26 -8
  36. package/schema/DatabaseTable.d.ts +12 -4
  37. package/schema/DatabaseTable.js +371 -46
  38. package/schema/SchemaComparator.d.ts +7 -5
  39. package/schema/SchemaComparator.js +68 -35
  40. package/schema/SchemaHelper.d.ts +7 -5
  41. package/schema/SchemaHelper.js +25 -11
  42. package/schema/SqlSchemaGenerator.d.ts +3 -4
  43. package/schema/SqlSchemaGenerator.js +71 -28
  44. package/typings.d.ts +30 -11
@@ -10,23 +10,15 @@ class SqlEntityManager extends core_1.EntityManager {
10
10
  /**
11
11
  * Creates a QueryBuilder instance
12
12
  */
13
- createQueryBuilder(entityName, alias, type) {
13
+ createQueryBuilder(entityName, alias, type, loggerContext) {
14
14
  const context = this.getContext();
15
- return new query_1.QueryBuilder(entityName, this.getMetadata(), this.getDriver(), context.getTransactionContext(), alias, type, context);
15
+ return new query_1.QueryBuilder(entityName, this.getMetadata(), this.getDriver(), context.getTransactionContext(), alias, type, context, loggerContext ?? context.loggerContext);
16
16
  }
17
17
  /**
18
18
  * Shortcut for `createQueryBuilder()`
19
19
  */
20
- qb(entityName, alias, type) {
21
- return this.createQueryBuilder(entityName, alias, type);
22
- }
23
- /**
24
- * Creates raw SQL query that won't be escaped when used as a parameter.
25
- */
26
- raw(sql, bindings = []) {
27
- const raw = this.getKnex().raw(sql, bindings);
28
- raw.__raw = true; // tag it as there is now way to check via `instanceof`
29
- return raw;
20
+ qb(entityName, alias, type, loggerContext) {
21
+ return this.createQueryBuilder(entityName, alias, type, loggerContext);
30
22
  }
31
23
  /**
32
24
  * Returns configured knex instance.
@@ -40,5 +32,9 @@ class SqlEntityManager extends core_1.EntityManager {
40
32
  getRepository(entityName) {
41
33
  return super.getRepository(entityName);
42
34
  }
35
+ applyDiscriminatorCondition(entityName, where) {
36
+ // this is handled in QueryBuilder now for SQL drivers
37
+ return where;
38
+ }
43
39
  }
44
40
  exports.SqlEntityManager = SqlEntityManager;
@@ -1,12 +1,10 @@
1
1
  import type { Knex } from 'knex';
2
- import type { ConnectionType, EntityName } from '@mikro-orm/core';
3
- import { EntityRepository } from '@mikro-orm/core';
2
+ import { EntityRepository, type ConnectionType, type EntityName } from '@mikro-orm/core';
4
3
  import type { SqlEntityManager } from './SqlEntityManager';
5
4
  import type { QueryBuilder } from './query';
6
5
  export declare class SqlEntityRepository<T extends object> extends EntityRepository<T> {
7
- protected readonly _em: SqlEntityManager;
8
- protected readonly entityName: EntityName<T>;
9
- constructor(_em: SqlEntityManager, entityName: EntityName<T>);
6
+ protected readonly em: SqlEntityManager;
7
+ constructor(em: SqlEntityManager, entityName: EntityName<T>);
10
8
  /**
11
9
  * Creates a QueryBuilder instance
12
10
  */
@@ -19,5 +17,8 @@ export declare class SqlEntityRepository<T extends object> extends EntityReposit
19
17
  * Returns configured knex instance.
20
18
  */
21
19
  getKnex(type?: ConnectionType): Knex;
22
- protected get em(): SqlEntityManager;
20
+ /**
21
+ * @inheritDoc
22
+ */
23
+ getEntityManager(): SqlEntityManager;
23
24
  }
@@ -3,16 +3,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SqlEntityRepository = void 0;
4
4
  const core_1 = require("@mikro-orm/core");
5
5
  class SqlEntityRepository extends core_1.EntityRepository {
6
- constructor(_em, entityName) {
7
- super(_em, entityName);
8
- this._em = _em;
9
- this.entityName = entityName;
6
+ em;
7
+ constructor(em, entityName) {
8
+ super(em, entityName);
9
+ this.em = em;
10
10
  }
11
11
  /**
12
12
  * Creates a QueryBuilder instance
13
13
  */
14
14
  createQueryBuilder(alias) {
15
- return this.em.createQueryBuilder(this.entityName, alias);
15
+ return this.getEntityManager().createQueryBuilder(this.entityName, alias);
16
16
  }
17
17
  /**
18
18
  * Shortcut for `createQueryBuilder()`
@@ -24,10 +24,13 @@ class SqlEntityRepository extends core_1.EntityRepository {
24
24
  * Returns configured knex instance.
25
25
  */
26
26
  getKnex(type) {
27
- return this.em.getConnection(type).getKnex();
27
+ return this.getEntityManager().getKnex(type);
28
28
  }
29
- get em() {
30
- return this._em.getContext(false);
29
+ /**
30
+ * @inheritDoc
31
+ */
32
+ getEntityManager() {
33
+ return this.em;
31
34
  }
32
35
  }
33
36
  exports.SqlEntityRepository = SqlEntityRepository;
package/index.mjs CHANGED
@@ -1,6 +1,8 @@
1
1
  import mod from "./index.js";
2
2
 
3
3
  export default mod;
4
+ export const ALIAS_REPLACEMENT = mod.ALIAS_REPLACEMENT;
5
+ export const ALIAS_REPLACEMENT_RE = mod.ALIAS_REPLACEMENT_RE;
4
6
  export const ARRAY_OPERATORS = mod.ARRAY_OPERATORS;
5
7
  export const AbstractNamingStrategy = mod.AbstractNamingStrategy;
6
8
  export const AbstractSchemaGenerator = mod.AbstractSchemaGenerator;
@@ -10,6 +12,7 @@ export const AbstractSqlPlatform = mod.AbstractSqlPlatform;
10
12
  export const AfterCreate = mod.AfterCreate;
11
13
  export const AfterDelete = mod.AfterDelete;
12
14
  export const AfterUpdate = mod.AfterUpdate;
15
+ export const AfterUpsert = mod.AfterUpsert;
13
16
  export const ArrayCollection = mod.ArrayCollection;
14
17
  export const ArrayCriteriaNode = mod.ArrayCriteriaNode;
15
18
  export const ArrayType = mod.ArrayType;
@@ -17,6 +20,7 @@ export const BaseEntity = mod.BaseEntity;
17
20
  export const BeforeCreate = mod.BeforeCreate;
18
21
  export const BeforeDelete = mod.BeforeDelete;
19
22
  export const BeforeUpdate = mod.BeforeUpdate;
23
+ export const BeforeUpsert = mod.BeforeUpsert;
20
24
  export const BigIntType = mod.BigIntType;
21
25
  export const BlobType = mod.BlobType;
22
26
  export const BooleanType = mod.BooleanType;
@@ -34,6 +38,7 @@ export const ConfigurationLoader = mod.ConfigurationLoader;
34
38
  export const Connection = mod.Connection;
35
39
  export const ConnectionException = mod.ConnectionException;
36
40
  export const ConstraintViolationException = mod.ConstraintViolationException;
41
+ export const CreateRequestContext = mod.CreateRequestContext;
37
42
  export const CriteriaNode = mod.CriteriaNode;
38
43
  export const CriteriaNodeFactory = mod.CriteriaNodeFactory;
39
44
  export const Cursor = mod.Cursor;
@@ -42,6 +47,8 @@ export const DatabaseObjectExistsException = mod.DatabaseObjectExistsException;
42
47
  export const DatabaseObjectNotFoundException = mod.DatabaseObjectNotFoundException;
43
48
  export const DatabaseSchema = mod.DatabaseSchema;
44
49
  export const DatabaseTable = mod.DatabaseTable;
50
+ export const DataloaderType = mod.DataloaderType;
51
+ export const DataloaderUtils = mod.DataloaderUtils;
45
52
  export const DateTimeType = mod.DateTimeType;
46
53
  export const DateType = mod.DateType;
47
54
  export const DeadlockException = mod.DeadlockException;
@@ -49,8 +56,10 @@ export const DecimalType = mod.DecimalType;
49
56
  export const DefaultLogger = mod.DefaultLogger;
50
57
  export const DoubleType = mod.DoubleType;
51
58
  export const DriverException = mod.DriverException;
59
+ export const EagerProps = mod.EagerProps;
52
60
  export const Embeddable = mod.Embeddable;
53
61
  export const Embedded = mod.Embedded;
62
+ export const EnsureRequestContext = mod.EnsureRequestContext;
54
63
  export const Entity = mod.Entity;
55
64
  export const EntityAssigner = mod.EntityAssigner;
56
65
  export const EntityCaseNamingStrategy = mod.EntityCaseNamingStrategy;
@@ -73,6 +82,7 @@ export const EnumArrayType = mod.EnumArrayType;
73
82
  export const EnumType = mod.EnumType;
74
83
  export const EventManager = mod.EventManager;
75
84
  export const EventType = mod.EventType;
85
+ export const EventTypeMap = mod.EventTypeMap;
76
86
  export const ExceptionConverter = mod.ExceptionConverter;
77
87
  export const FileCacheAdapter = mod.FileCacheAdapter;
78
88
  export const Filter = mod.Filter;
@@ -80,13 +90,16 @@ export const FloatType = mod.FloatType;
80
90
  export const FlushMode = mod.FlushMode;
81
91
  export const ForeignKeyConstraintViolationException = mod.ForeignKeyConstraintViolationException;
82
92
  export const Formula = mod.Formula;
93
+ export const GeneratedCacheAdapter = mod.GeneratedCacheAdapter;
83
94
  export const GroupOperator = mod.GroupOperator;
95
+ export const HiddenProps = mod.HiddenProps;
84
96
  export const Hydrator = mod.Hydrator;
85
97
  export const IdentityMap = mod.IdentityMap;
86
98
  export const Index = mod.Index;
87
99
  export const IntegerType = mod.IntegerType;
88
100
  export const InvalidFieldNameException = mod.InvalidFieldNameException;
89
101
  export const IsolationLevel = mod.IsolationLevel;
102
+ export const JoinType = mod.JoinType;
90
103
  export const JsonProperty = mod.JsonProperty;
91
104
  export const JsonType = mod.JsonType;
92
105
  export const Knex = mod.Knex;
@@ -134,13 +147,16 @@ export const QueryOperator = mod.QueryOperator;
134
147
  export const QueryOrder = mod.QueryOrder;
135
148
  export const QueryOrderNumeric = mod.QueryOrderNumeric;
136
149
  export const QueryType = mod.QueryType;
150
+ export const RawQueryFragment = mod.RawQueryFragment;
137
151
  export const ReadOnlyException = mod.ReadOnlyException;
152
+ export const Ref = mod.Ref;
138
153
  export const Reference = mod.Reference;
139
154
  export const ReferenceKind = mod.ReferenceKind;
140
155
  export const ReflectMetadataProvider = mod.ReflectMetadataProvider;
141
156
  export const RequestContext = mod.RequestContext;
142
157
  export const SCALAR_TYPES = mod.SCALAR_TYPES;
143
158
  export const ScalarCriteriaNode = mod.ScalarCriteriaNode;
159
+ export const ScalarReference = mod.ScalarReference;
144
160
  export const SchemaComparator = mod.SchemaComparator;
145
161
  export const SchemaGenerator = mod.SchemaGenerator;
146
162
  export const SchemaHelper = mod.SchemaHelper;
@@ -153,7 +169,6 @@ export const SqlEntityManager = mod.SqlEntityManager;
153
169
  export const SqlEntityRepository = mod.SqlEntityRepository;
154
170
  export const SqlSchemaGenerator = mod.SqlSchemaGenerator;
155
171
  export const StringType = mod.StringType;
156
- export const Subscriber = mod.Subscriber;
157
172
  export const SyntaxErrorException = mod.SyntaxErrorException;
158
173
  export const TableExistsException = mod.TableExistsException;
159
174
  export const TableNotFoundException = mod.TableNotFoundException;
@@ -163,12 +178,12 @@ export const TinyIntType = mod.TinyIntType;
163
178
  export const TransactionContext = mod.TransactionContext;
164
179
  export const TransactionEventBroadcaster = mod.TransactionEventBroadcaster;
165
180
  export const Type = mod.Type;
181
+ export const Uint8ArrayType = mod.Uint8ArrayType;
166
182
  export const UnderscoreNamingStrategy = mod.UnderscoreNamingStrategy;
167
183
  export const Unique = mod.Unique;
168
184
  export const UniqueConstraintViolationException = mod.UniqueConstraintViolationException;
169
185
  export const UnitOfWork = mod.UnitOfWork;
170
186
  export const UnknownType = mod.UnknownType;
171
- export const UseRequestContext = mod.UseRequestContext;
172
187
  export const Utils = mod.Utils;
173
188
  export const UuidType = mod.UuidType;
174
189
  export const ValidationError = mod.ValidationError;
@@ -181,12 +196,16 @@ export const compareBuffers = mod.compareBuffers;
181
196
  export const compareObjects = mod.compareObjects;
182
197
  export const defineConfig = mod.defineConfig;
183
198
  export const equals = mod.equals;
184
- export const expr = mod.expr;
199
+ export const getOnConflictFields = mod.getOnConflictFields;
200
+ export const getOnConflictReturningFields = mod.getOnConflictReturningFields;
185
201
  export const helper = mod.helper;
186
202
  export const knex = mod.knex;
203
+ export const parseJsonSafe = mod.parseJsonSafe;
204
+ export const raw = mod.raw;
187
205
  export const ref = mod.ref;
188
206
  export const rel = mod.rel;
189
207
  export const serialize = mod.serialize;
208
+ export const sql = mod.sql;
190
209
  export const t = mod.t;
191
210
  export const types = mod.types;
192
211
  export const wrap = mod.wrap;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikro-orm/knex",
3
- "version": "6.0.0-dev.27",
3
+ "version": "6.0.0-dev.270",
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",
@@ -46,26 +46,26 @@
46
46
  },
47
47
  "homepage": "https://mikro-orm.io",
48
48
  "engines": {
49
- "node": ">= 16.0.0"
49
+ "node": ">= 18.12.0"
50
50
  },
51
51
  "scripts": {
52
52
  "build": "yarn clean && yarn compile && yarn copy && yarn run -T gen-esm-wrapper index.js index.mjs",
53
- "clean": "rimraf ./dist",
54
- "compile": "tsc -p tsconfig.build.json",
53
+ "clean": "yarn run -T rimraf ./dist",
54
+ "compile": "yarn run -T tsc -p tsconfig.build.json",
55
55
  "copy": "node ../../scripts/copy.mjs"
56
56
  },
57
57
  "publishConfig": {
58
58
  "access": "public"
59
59
  },
60
60
  "dependencies": {
61
- "fs-extra": "11.1.0",
62
- "knex": "2.4.2",
61
+ "fs-extra": "11.2.0",
62
+ "knex": "3.1.0",
63
63
  "sqlstring": "2.3.3"
64
64
  },
65
65
  "devDependencies": {
66
- "@mikro-orm/core": "^5.6.8"
66
+ "@mikro-orm/core": "^5.9.2"
67
67
  },
68
68
  "peerDependencies": {
69
- "@mikro-orm/core": "~6.0.0-dev.27"
69
+ "@mikro-orm/core": "6.0.0-dev.270"
70
70
  }
71
71
  }
@@ -1,9 +1,10 @@
1
1
  import { CriteriaNode } from './CriteriaNode';
2
- import type { IQueryBuilder } from '../typings';
2
+ import type { IQueryBuilder, ICriteriaNodeProcessOptions } from '../typings';
3
3
  /**
4
4
  * @internal
5
5
  */
6
- export declare class ArrayCriteriaNode extends CriteriaNode {
7
- process<T>(qb: IQueryBuilder<T>, alias?: string): any;
8
- willAutoJoin<T>(qb: IQueryBuilder<T>, alias?: string): any;
6
+ export declare class ArrayCriteriaNode<T extends object> extends CriteriaNode<T> {
7
+ process(qb: IQueryBuilder<T>, options?: ICriteriaNodeProcessOptions): any;
8
+ unwrap(): any;
9
+ willAutoJoin(qb: IQueryBuilder<T>, alias?: string): any;
9
10
  }
@@ -6,9 +6,14 @@ const CriteriaNode_1 = require("./CriteriaNode");
6
6
  * @internal
7
7
  */
8
8
  class ArrayCriteriaNode extends CriteriaNode_1.CriteriaNode {
9
- process(qb, alias) {
9
+ process(qb, options) {
10
10
  return this.payload.map((node) => {
11
- return node.process(qb, alias);
11
+ return node.process(qb, options);
12
+ });
13
+ }
14
+ unwrap() {
15
+ return this.payload.map((node) => {
16
+ return node.unwrap();
12
17
  });
13
18
  }
14
19
  willAutoJoin(qb, alias) {
@@ -1,29 +1,31 @@
1
1
  /// <reference types="node" />
2
2
  import { inspect } from 'util';
3
- import type { EntityProperty, MetadataStorage } from '@mikro-orm/core';
4
- import type { ICriteriaNode, IQueryBuilder } from '../typings';
3
+ import { type EntityKey, type EntityProperty, type MetadataStorage } from '@mikro-orm/core';
4
+ import type { ICriteriaNode, ICriteriaNodeProcessOptions, IQueryBuilder } from '../typings';
5
5
  /**
6
6
  * Helper for working with deeply nested where/orderBy/having criteria. Uses composite pattern to build tree from the payload.
7
7
  * Auto-joins relations and converts payload from { books: { publisher: { name: '...' } } } to { 'publisher_alias.name': '...' }
8
8
  * @internal
9
9
  */
10
- export declare class CriteriaNode implements ICriteriaNode {
10
+ export declare class CriteriaNode<T extends object> implements ICriteriaNode<T> {
11
11
  protected readonly metadata: MetadataStorage;
12
12
  readonly entityName: string;
13
- readonly parent?: ICriteriaNode | undefined;
14
- readonly key?: string | undefined;
13
+ readonly parent?: ICriteriaNode<T> | undefined;
14
+ readonly key?: EntityKey<T> | undefined;
15
15
  payload: any;
16
- prop?: EntityProperty;
16
+ prop?: EntityProperty<T>;
17
17
  index?: number;
18
- constructor(metadata: MetadataStorage, entityName: string, parent?: ICriteriaNode | undefined, key?: string | undefined, validate?: boolean);
19
- process<T>(qb: IQueryBuilder<T>, alias?: string): any;
18
+ constructor(metadata: MetadataStorage, entityName: string, parent?: ICriteriaNode<T> | undefined, key?: EntityKey<T> | undefined, validate?: boolean);
19
+ process(qb: IQueryBuilder<T>, options?: ICriteriaNodeProcessOptions): any;
20
+ unwrap(): any;
20
21
  shouldInline(payload: any): boolean;
21
- willAutoJoin<T>(qb: IQueryBuilder<T>, alias?: string): boolean;
22
+ willAutoJoin(qb: IQueryBuilder<T>, alias?: string): boolean;
22
23
  shouldRename(payload: any): boolean;
23
24
  renameFieldToPK<T>(qb: IQueryBuilder<T>): string;
24
25
  getPath(addIndex?: boolean): string;
25
26
  private isPivotJoin;
26
27
  getPivotPath(path: string): string;
28
+ aliased(field: string, alias?: string): string;
29
+ /** @ignore */
27
30
  [inspect.custom](): string;
28
- static isCustomExpression(field: string): boolean;
29
31
  }
@@ -9,6 +9,13 @@ const core_1 = require("@mikro-orm/core");
9
9
  * @internal
10
10
  */
11
11
  class CriteriaNode {
12
+ metadata;
13
+ entityName;
14
+ parent;
15
+ key;
16
+ payload;
17
+ prop;
18
+ index;
12
19
  constructor(metadata, entityName, parent, key, validate = true) {
13
20
  this.metadata = metadata;
14
21
  this.entityName = entityName;
@@ -24,13 +31,16 @@ class CriteriaNode {
24
31
  this.prop = meta.props.find(prop => prop.name === k || (prop.fieldNames?.length === 1 && prop.fieldNames[0] === k));
25
32
  const isProp = this.prop || meta.props.find(prop => (prop.fieldNames || []).includes(k));
26
33
  // do not validate if the key is prefixed or type casted (e.g. `k::text`)
27
- if (validate && !isProp && !k.includes('.') && !k.includes('::') && !core_1.Utils.isOperator(k) && !CriteriaNode.isCustomExpression(k)) {
34
+ if (validate && !isProp && !k.includes('.') && !k.includes('::') && !core_1.Utils.isOperator(k) && !core_1.RawQueryFragment.isKnownFragment(k)) {
28
35
  throw new Error(`Trying to query by not existing property ${entityName}.${k}`);
29
36
  }
30
37
  });
31
38
  }
32
39
  }
33
- process(qb, alias) {
40
+ process(qb, options) {
41
+ return this.payload;
42
+ }
43
+ unwrap() {
34
44
  return this.payload;
35
45
  }
36
46
  shouldInline(payload) {
@@ -42,9 +52,11 @@ class CriteriaNode {
42
52
  shouldRename(payload) {
43
53
  const type = this.prop ? this.prop.kind : null;
44
54
  const composite = this.prop?.joinColumns ? this.prop.joinColumns.length > 1 : false;
45
- const customExpression = CriteriaNode.isCustomExpression(this.key);
55
+ const customExpression = core_1.RawQueryFragment.isKnownFragment(this.key);
46
56
  const scalar = payload === null || core_1.Utils.isPrimaryKey(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
47
- const operator = core_1.Utils.isPlainObject(payload) && Object.keys(payload).every(k => core_1.Utils.isOperator(k, false));
57
+ const plainObject = core_1.Utils.isPlainObject(payload);
58
+ const keys = plainObject ? Object.keys(payload) : [];
59
+ const operator = plainObject && keys.every(k => core_1.Utils.isOperator(k, false));
48
60
  if (composite) {
49
61
  return true;
50
62
  }
@@ -86,7 +98,7 @@ class CriteriaNode {
86
98
  if (!this.key || !this.prop) {
87
99
  return false;
88
100
  }
89
- const customExpression = CriteriaNode.isCustomExpression(this.key);
101
+ const customExpression = core_1.RawQueryFragment.isKnownFragment(this.key);
90
102
  const scalar = this.payload === null || core_1.Utils.isPrimaryKey(this.payload) || this.payload instanceof RegExp || this.payload instanceof Date || customExpression;
91
103
  const operator = core_1.Utils.isObject(this.payload) && Object.keys(this.payload).every(k => core_1.Utils.isOperator(k, false));
92
104
  return this.prop.kind === core_1.ReferenceKind.MANY_TO_MANY && (scalar || operator);
@@ -94,15 +106,16 @@ class CriteriaNode {
94
106
  getPivotPath(path) {
95
107
  return `${path}[pivot]`;
96
108
  }
109
+ aliased(field, alias) {
110
+ return alias ? `${alias}.${field}` : field;
111
+ }
112
+ /** @ignore */
97
113
  [util_1.inspect.custom]() {
98
114
  const o = {};
99
115
  ['entityName', 'key', 'index', 'payload']
100
- .filter(k => this[k] != null)
116
+ .filter(k => this[k] !== undefined)
101
117
  .forEach(k => o[k] = this[k]);
102
118
  return `${this.constructor.name} ${(0, util_1.inspect)(o)}`;
103
119
  }
104
- static isCustomExpression(field) {
105
- return !!field.match(/[ ?<>=()]|^\d/);
106
- }
107
120
  }
108
121
  exports.CriteriaNode = CriteriaNode;
@@ -1,12 +1,12 @@
1
- import type { Dictionary, EntityMetadata, MetadataStorage } from '@mikro-orm/core';
1
+ import { type Dictionary, type EntityKey, type EntityMetadata, type MetadataStorage } from '@mikro-orm/core';
2
2
  import type { ICriteriaNode } from '../typings';
3
3
  /**
4
4
  * @internal
5
5
  */
6
6
  export declare class CriteriaNodeFactory {
7
- static createNode(metadata: MetadataStorage, entityName: string, payload: any, parent?: ICriteriaNode, key?: string): ICriteriaNode;
8
- static createScalarNode(metadata: MetadataStorage, entityName: string, payload: any, parent?: ICriteriaNode, key?: string): ICriteriaNode;
9
- static createArrayNode(metadata: MetadataStorage, entityName: string, payload: any[], parent?: ICriteriaNode, key?: string): ICriteriaNode;
10
- static createObjectNode(metadata: MetadataStorage, entityName: string, payload: Dictionary, parent?: ICriteriaNode, key?: string): ICriteriaNode;
11
- static createObjectItemNode(metadata: MetadataStorage, entityName: string, node: ICriteriaNode, payload: Dictionary, item: string, meta?: EntityMetadata): ICriteriaNode;
7
+ static createNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: any, parent?: ICriteriaNode<T>, key?: EntityKey<T>): ICriteriaNode<T>;
8
+ static createScalarNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: any, parent?: ICriteriaNode<T>, key?: EntityKey<T>): ICriteriaNode<T>;
9
+ static createArrayNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: any[], parent?: ICriteriaNode<T>, key?: EntityKey<T>): ICriteriaNode<T>;
10
+ static createObjectNode<T extends object>(metadata: MetadataStorage, entityName: string, payload: Dictionary, parent?: ICriteriaNode<T>, key?: EntityKey<T>): ICriteriaNode<T>;
11
+ static createObjectItemNode<T extends object>(metadata: MetadataStorage, entityName: string, node: ICriteriaNode<T>, payload: Dictionary, key: EntityKey<T>, meta?: EntityMetadata<T>): ICriteriaNode<T>;
12
12
  }
@@ -5,14 +5,13 @@ const core_1 = require("@mikro-orm/core");
5
5
  const ObjectCriteriaNode_1 = require("./ObjectCriteriaNode");
6
6
  const ArrayCriteriaNode_1 = require("./ArrayCriteriaNode");
7
7
  const ScalarCriteriaNode_1 = require("./ScalarCriteriaNode");
8
- const CriteriaNode_1 = require("./CriteriaNode");
9
8
  /**
10
9
  * @internal
11
10
  */
12
11
  class CriteriaNodeFactory {
13
12
  static createNode(metadata, entityName, payload, parent, key) {
14
- const customExpression = CriteriaNode_1.CriteriaNode.isCustomExpression(key || '');
15
- const scalar = core_1.Utils.isPrimaryKey(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
13
+ const customExpression = core_1.RawQueryFragment.isKnownFragment(key || '');
14
+ const scalar = core_1.Utils.isPrimaryKey(payload) || core_1.Utils.isRawSql(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
16
15
  if (Array.isArray(payload) && !scalar) {
17
16
  return this.createArrayNode(metadata, entityName, payload, parent, key);
18
17
  }
@@ -30,16 +29,16 @@ class CriteriaNodeFactory {
30
29
  const node = new ArrayCriteriaNode_1.ArrayCriteriaNode(metadata, entityName, parent, key);
31
30
  node.payload = payload.map((item, index) => {
32
31
  const n = this.createNode(metadata, entityName, item, node);
33
- n.index = key === '$and' ? index : undefined; // we care about branching only for $and
32
+ // we care about branching only for $and
33
+ if (key === '$and' && payload.length > 1) {
34
+ n.index = index;
35
+ }
34
36
  return n;
35
37
  });
36
38
  return node;
37
39
  }
38
40
  static createObjectNode(metadata, entityName, payload, parent, key) {
39
41
  const meta = metadata.find(entityName);
40
- if (!parent && Object.keys(payload).every(k => meta?.properties[k]?.kind === core_1.ReferenceKind.SCALAR)) {
41
- return this.createScalarNode(metadata, entityName, payload, parent, key);
42
- }
43
42
  const node = new ObjectCriteriaNode_1.ObjectCriteriaNode(metadata, entityName, parent, key);
44
43
  node.payload = Object.keys(payload).reduce((o, item) => {
45
44
  o[item] = this.createObjectItemNode(metadata, entityName, node, payload, item, meta);
@@ -47,24 +46,41 @@ class CriteriaNodeFactory {
47
46
  }, {});
48
47
  return node;
49
48
  }
50
- static createObjectItemNode(metadata, entityName, node, payload, item, meta) {
51
- const prop = meta?.properties[item];
49
+ static createObjectItemNode(metadata, entityName, node, payload, key, meta) {
50
+ const prop = meta?.properties[key];
51
+ const childEntity = prop && prop.kind !== core_1.ReferenceKind.SCALAR ? prop.type : entityName;
52
52
  if (prop?.kind !== core_1.ReferenceKind.EMBEDDED) {
53
- const childEntity = prop && prop.kind !== core_1.ReferenceKind.SCALAR ? prop.type : entityName;
54
- return this.createNode(metadata, childEntity, payload[item], node, item);
53
+ return this.createNode(metadata, childEntity, payload[key], node, key);
54
+ }
55
+ if (payload[key] == null) {
56
+ const map = Object.keys(prop.embeddedProps).reduce((oo, k) => {
57
+ oo[prop.embeddedProps[k].name] = null;
58
+ return oo;
59
+ }, {});
60
+ return this.createNode(metadata, entityName, map, node, key);
55
61
  }
56
- const operator = Object.keys(payload[item]).some(f => core_1.Utils.isOperator(f));
62
+ // array operators can be used on embedded properties
63
+ const allowedOperators = ['$contains', '$contained', '$overlap'];
64
+ const operator = Object.keys(payload[key]).some(f => core_1.Utils.isOperator(f) && !allowedOperators.includes(f));
57
65
  if (operator) {
58
66
  throw core_1.ValidationError.cannotUseOperatorsInsideEmbeddables(entityName, prop.name, payload);
59
67
  }
60
- const map = Object.keys(payload[item]).reduce((oo, k) => {
61
- if (!prop.embeddedProps[k]) {
68
+ const map = Object.keys(payload[key]).reduce((oo, k) => {
69
+ if (!prop.embeddedProps[k] && !allowedOperators.includes(k)) {
62
70
  throw core_1.ValidationError.invalidEmbeddableQuery(entityName, k, prop.type);
63
71
  }
64
- oo[prop.embeddedProps[k].name] = payload[item][k];
72
+ if (prop.embeddedProps[k]) {
73
+ oo[prop.embeddedProps[k].name] = payload[key][k];
74
+ }
75
+ else if (typeof payload[key][k] === 'object') {
76
+ oo[k] = JSON.stringify(payload[key][k]);
77
+ }
78
+ else {
79
+ oo[k] = payload[key][k];
80
+ }
65
81
  return oo;
66
82
  }, {});
67
- return this.createNode(metadata, entityName, map, node, item);
83
+ return this.createNode(metadata, entityName, map, node, key);
68
84
  }
69
85
  }
70
86
  exports.CriteriaNodeFactory = CriteriaNodeFactory;
@@ -1,11 +1,12 @@
1
1
  import { CriteriaNode } from './CriteriaNode';
2
- import type { IQueryBuilder } from '../typings';
2
+ import type { ICriteriaNodeProcessOptions, IQueryBuilder } from '../typings';
3
3
  /**
4
4
  * @internal
5
5
  */
6
- export declare class ObjectCriteriaNode extends CriteriaNode {
7
- process<T>(qb: IQueryBuilder<T>, alias?: string): any;
8
- willAutoJoin<T>(qb: IQueryBuilder<T>, alias?: string): boolean;
6
+ export declare class ObjectCriteriaNode<T extends object> extends CriteriaNode<T> {
7
+ process(qb: IQueryBuilder<T>, options?: ICriteriaNodeProcessOptions): any;
8
+ unwrap(): any;
9
+ willAutoJoin(qb: IQueryBuilder<T>, alias?: string): boolean;
9
10
  shouldInline(payload: any): boolean;
10
11
  private inlineChildPayload;
11
12
  private shouldAutoJoin;