@mikro-orm/knex 6.0.0-dev.14 → 6.0.0-dev.141

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 (43) hide show
  1. package/AbstractSqlConnection.d.ts +8 -4
  2. package/AbstractSqlConnection.js +30 -18
  3. package/AbstractSqlDriver.d.ts +21 -23
  4. package/AbstractSqlDriver.js +394 -225
  5. package/AbstractSqlPlatform.d.ts +5 -4
  6. package/AbstractSqlPlatform.js +34 -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 +2 -6
  13. package/SqlEntityManager.js +5 -9
  14. package/SqlEntityRepository.d.ts +7 -6
  15. package/SqlEntityRepository.js +11 -8
  16. package/index.mjs +24 -6
  17. package/package.json +8 -8
  18. package/query/ArrayCriteriaNode.d.ts +3 -3
  19. package/query/CriteriaNode.d.ts +9 -8
  20. package/query/CriteriaNode.js +17 -9
  21. package/query/CriteriaNodeFactory.d.ts +6 -6
  22. package/query/CriteriaNodeFactory.js +17 -13
  23. package/query/ObjectCriteriaNode.d.ts +3 -3
  24. package/query/ObjectCriteriaNode.js +14 -10
  25. package/query/QueryBuilder.d.ts +52 -23
  26. package/query/QueryBuilder.js +389 -132
  27. package/query/QueryBuilderHelper.d.ts +11 -16
  28. package/query/QueryBuilderHelper.js +194 -155
  29. package/query/ScalarCriteriaNode.d.ts +3 -2
  30. package/query/ScalarCriteriaNode.js +10 -6
  31. package/query/enums.d.ts +7 -0
  32. package/query/enums.js +10 -2
  33. package/schema/DatabaseSchema.d.ts +5 -2
  34. package/schema/DatabaseSchema.js +27 -9
  35. package/schema/DatabaseTable.d.ts +4 -2
  36. package/schema/DatabaseTable.js +67 -32
  37. package/schema/SchemaComparator.d.ts +3 -3
  38. package/schema/SchemaComparator.js +50 -30
  39. package/schema/SchemaHelper.d.ts +6 -4
  40. package/schema/SchemaHelper.js +18 -7
  41. package/schema/SqlSchemaGenerator.d.ts +3 -6
  42. package/schema/SqlSchemaGenerator.js +69 -34
  43. package/typings.d.ts +17 -10
@@ -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();
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,13 +38,17 @@ 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;
44
+ export const Cursor = mod.Cursor;
39
45
  export const DatabaseDriver = mod.DatabaseDriver;
40
46
  export const DatabaseObjectExistsException = mod.DatabaseObjectExistsException;
41
47
  export const DatabaseObjectNotFoundException = mod.DatabaseObjectNotFoundException;
42
48
  export const DatabaseSchema = mod.DatabaseSchema;
43
49
  export const DatabaseTable = mod.DatabaseTable;
50
+ export const Dataloader = mod.Dataloader;
51
+ export const DataloaderUtils = mod.DataloaderUtils;
44
52
  export const DateTimeType = mod.DateTimeType;
45
53
  export const DateType = mod.DateType;
46
54
  export const DeadlockException = mod.DeadlockException;
@@ -48,8 +56,10 @@ export const DecimalType = mod.DecimalType;
48
56
  export const DefaultLogger = mod.DefaultLogger;
49
57
  export const DoubleType = mod.DoubleType;
50
58
  export const DriverException = mod.DriverException;
59
+ export const EagerProps = mod.EagerProps;
51
60
  export const Embeddable = mod.Embeddable;
52
61
  export const Embedded = mod.Embedded;
62
+ export const EnsureRequestContext = mod.EnsureRequestContext;
53
63
  export const Entity = mod.Entity;
54
64
  export const EntityAssigner = mod.EntityAssigner;
55
65
  export const EntityCaseNamingStrategy = mod.EntityCaseNamingStrategy;
@@ -72,6 +82,7 @@ export const EnumArrayType = mod.EnumArrayType;
72
82
  export const EnumType = mod.EnumType;
73
83
  export const EventManager = mod.EventManager;
74
84
  export const EventType = mod.EventType;
85
+ export const EventTypeMap = mod.EventTypeMap;
75
86
  export const ExceptionConverter = mod.ExceptionConverter;
76
87
  export const FileCacheAdapter = mod.FileCacheAdapter;
77
88
  export const Filter = mod.Filter;
@@ -79,14 +90,16 @@ export const FloatType = mod.FloatType;
79
90
  export const FlushMode = mod.FlushMode;
80
91
  export const ForeignKeyConstraintViolationException = mod.ForeignKeyConstraintViolationException;
81
92
  export const Formula = mod.Formula;
93
+ export const GeneratedCacheAdapter = mod.GeneratedCacheAdapter;
82
94
  export const GroupOperator = mod.GroupOperator;
95
+ export const HiddenProps = mod.HiddenProps;
83
96
  export const Hydrator = mod.Hydrator;
84
97
  export const IdentityMap = mod.IdentityMap;
85
98
  export const Index = mod.Index;
86
99
  export const IntegerType = mod.IntegerType;
87
100
  export const InvalidFieldNameException = mod.InvalidFieldNameException;
88
101
  export const IsolationLevel = mod.IsolationLevel;
89
- export const JavaScriptMetadataProvider = mod.JavaScriptMetadataProvider;
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;
@@ -125,7 +138,6 @@ export const Platform = mod.Platform;
125
138
  export const PopulateHint = mod.PopulateHint;
126
139
  export const PrimaryKey = mod.PrimaryKey;
127
140
  export const PrimaryKeyProp = mod.PrimaryKeyProp;
128
- export const PrimaryKeyType = mod.PrimaryKeyType;
129
141
  export const Property = mod.Property;
130
142
  export const QueryBuilder = mod.QueryBuilder;
131
143
  export const QueryBuilderHelper = mod.QueryBuilderHelper;
@@ -135,13 +147,16 @@ export const QueryOperator = mod.QueryOperator;
135
147
  export const QueryOrder = mod.QueryOrder;
136
148
  export const QueryOrderNumeric = mod.QueryOrderNumeric;
137
149
  export const QueryType = mod.QueryType;
150
+ export const RawQueryFragment = mod.RawQueryFragment;
138
151
  export const ReadOnlyException = mod.ReadOnlyException;
152
+ export const Ref = mod.Ref;
139
153
  export const Reference = mod.Reference;
140
- export const ReferenceType = mod.ReferenceType;
154
+ export const ReferenceKind = mod.ReferenceKind;
141
155
  export const ReflectMetadataProvider = mod.ReflectMetadataProvider;
142
156
  export const RequestContext = mod.RequestContext;
143
157
  export const SCALAR_TYPES = mod.SCALAR_TYPES;
144
158
  export const ScalarCriteriaNode = mod.ScalarCriteriaNode;
159
+ export const ScalarReference = mod.ScalarReference;
145
160
  export const SchemaComparator = mod.SchemaComparator;
146
161
  export const SchemaGenerator = mod.SchemaGenerator;
147
162
  export const SchemaHelper = mod.SchemaHelper;
@@ -154,7 +169,6 @@ export const SqlEntityManager = mod.SqlEntityManager;
154
169
  export const SqlEntityRepository = mod.SqlEntityRepository;
155
170
  export const SqlSchemaGenerator = mod.SqlSchemaGenerator;
156
171
  export const StringType = mod.StringType;
157
- export const Subscriber = mod.Subscriber;
158
172
  export const SyntaxErrorException = mod.SyntaxErrorException;
159
173
  export const TableExistsException = mod.TableExistsException;
160
174
  export const TableNotFoundException = mod.TableNotFoundException;
@@ -164,12 +178,12 @@ export const TinyIntType = mod.TinyIntType;
164
178
  export const TransactionContext = mod.TransactionContext;
165
179
  export const TransactionEventBroadcaster = mod.TransactionEventBroadcaster;
166
180
  export const Type = mod.Type;
181
+ export const Uint8ArrayType = mod.Uint8ArrayType;
167
182
  export const UnderscoreNamingStrategy = mod.UnderscoreNamingStrategy;
168
183
  export const Unique = mod.Unique;
169
184
  export const UniqueConstraintViolationException = mod.UniqueConstraintViolationException;
170
185
  export const UnitOfWork = mod.UnitOfWork;
171
186
  export const UnknownType = mod.UnknownType;
172
- export const UseRequestContext = mod.UseRequestContext;
173
187
  export const Utils = mod.Utils;
174
188
  export const UuidType = mod.UuidType;
175
189
  export const ValidationError = mod.ValidationError;
@@ -182,12 +196,16 @@ export const compareBuffers = mod.compareBuffers;
182
196
  export const compareObjects = mod.compareObjects;
183
197
  export const defineConfig = mod.defineConfig;
184
198
  export const equals = mod.equals;
185
- export const expr = mod.expr;
199
+ export const getOnConflictFields = mod.getOnConflictFields;
200
+ export const getOnConflictReturningFields = mod.getOnConflictReturningFields;
186
201
  export const helper = mod.helper;
187
202
  export const knex = mod.knex;
203
+ export const parseJsonSafe = mod.parseJsonSafe;
204
+ export const raw = mod.raw;
188
205
  export const ref = mod.ref;
189
206
  export const rel = mod.rel;
190
207
  export const serialize = mod.serialize;
208
+ export const sql = mod.sql;
191
209
  export const t = mod.t;
192
210
  export const types = mod.types;
193
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.14",
3
+ "version": "6.0.0-dev.141",
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.3.0",
61
+ "fs-extra": "11.1.1",
62
+ "knex": "3.0.1",
63
63
  "sqlstring": "2.3.3"
64
64
  },
65
65
  "devDependencies": {
66
- "@mikro-orm/core": "^5.6.0"
66
+ "@mikro-orm/core": "^5.9.2"
67
67
  },
68
68
  "peerDependencies": {
69
- "@mikro-orm/core": "~6.0.0-dev.14"
69
+ "@mikro-orm/core": "6.0.0-dev.141"
70
70
  }
71
71
  }
@@ -3,7 +3,7 @@ import type { IQueryBuilder } 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>, alias?: string): any;
8
+ willAutoJoin(qb: IQueryBuilder<T>, alias?: string): any;
9
9
  }
@@ -1,29 +1,30 @@
1
1
  /// <reference types="node" />
2
2
  import { inspect } from 'util';
3
- import type { EntityProperty, MetadataStorage } from '@mikro-orm/core';
3
+ import { type EntityProperty, type MetadataStorage, type EntityKey } from '@mikro-orm/core';
4
4
  import type { ICriteriaNode, 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>, alias?: string): any;
20
20
  shouldInline(payload: any): boolean;
21
- willAutoJoin<T>(qb: IQueryBuilder<T>, alias?: string): boolean;
21
+ willAutoJoin(qb: IQueryBuilder<T>, alias?: string): boolean;
22
22
  shouldRename(payload: any): boolean;
23
23
  renameFieldToPK<T>(qb: IQueryBuilder<T>): string;
24
24
  getPath(addIndex?: boolean): string;
25
25
  private isPivotJoin;
26
26
  getPivotPath(path: string): string;
27
+ /** @ignore */
27
28
  [inspect.custom](): string;
28
29
  static isCustomExpression(field: string): boolean;
29
30
  }
@@ -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;
@@ -40,7 +47,7 @@ class CriteriaNode {
40
47
  return false;
41
48
  }
42
49
  shouldRename(payload) {
43
- const type = this.prop ? this.prop.reference : null;
50
+ const type = this.prop ? this.prop.kind : null;
44
51
  const composite = this.prop?.joinColumns ? this.prop.joinColumns.length > 1 : false;
45
52
  const customExpression = CriteriaNode.isCustomExpression(this.key);
46
53
  const scalar = payload === null || core_1.Utils.isPrimaryKey(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
@@ -49,17 +56,17 @@ class CriteriaNode {
49
56
  return true;
50
57
  }
51
58
  switch (type) {
52
- case core_1.ReferenceType.MANY_TO_ONE: return false;
53
- case core_1.ReferenceType.ONE_TO_ONE: return !this.prop.owner;
54
- case core_1.ReferenceType.ONE_TO_MANY: return scalar || operator;
55
- case core_1.ReferenceType.MANY_TO_MANY: return scalar || operator;
59
+ case core_1.ReferenceKind.MANY_TO_ONE: return false;
60
+ case core_1.ReferenceKind.ONE_TO_ONE: return !this.prop.owner;
61
+ case core_1.ReferenceKind.ONE_TO_MANY: return scalar || operator;
62
+ case core_1.ReferenceKind.MANY_TO_MANY: return scalar || operator;
56
63
  default: return false;
57
64
  }
58
65
  }
59
66
  renameFieldToPK(qb) {
60
67
  const joinAlias = qb.getAliasForJoinPath(this.getPath());
61
68
  const alias = joinAlias ?? qb.alias;
62
- if (this.prop.reference === core_1.ReferenceType.MANY_TO_MANY) {
69
+ if (this.prop.kind === core_1.ReferenceKind.MANY_TO_MANY) {
63
70
  return core_1.Utils.getPrimaryKeyHash(this.prop.inverseJoinColumns.map(col => `${alias}.${col}`));
64
71
  }
65
72
  // if we found a matching join, we need to use the target table column names, as we use that alias instead of the root
@@ -70,7 +77,7 @@ class CriteriaNode {
70
77
  }
71
78
  getPath(addIndex = false) {
72
79
  // use index on parent only if we are processing to-many relation
73
- const addParentIndex = this.prop && [core_1.ReferenceType.ONE_TO_MANY, core_1.ReferenceType.MANY_TO_MANY].includes(this.prop.reference);
80
+ const addParentIndex = this.prop && [core_1.ReferenceKind.ONE_TO_MANY, core_1.ReferenceKind.MANY_TO_MANY].includes(this.prop.kind);
74
81
  const parentPath = this.parent?.getPath(addParentIndex) ?? this.entityName;
75
82
  const index = addIndex && this.index != null ? `[${this.index}]` : '';
76
83
  // ignore group operators to allow easier mapping (e.g. for orderBy)
@@ -89,15 +96,16 @@ class CriteriaNode {
89
96
  const customExpression = CriteriaNode.isCustomExpression(this.key);
90
97
  const scalar = this.payload === null || core_1.Utils.isPrimaryKey(this.payload) || this.payload instanceof RegExp || this.payload instanceof Date || customExpression;
91
98
  const operator = core_1.Utils.isObject(this.payload) && Object.keys(this.payload).every(k => core_1.Utils.isOperator(k, false));
92
- return this.prop.reference === core_1.ReferenceType.MANY_TO_MANY && (scalar || operator);
99
+ return this.prop.kind === core_1.ReferenceKind.MANY_TO_MANY && (scalar || operator);
93
100
  }
94
101
  getPivotPath(path) {
95
102
  return `${path}[pivot]`;
96
103
  }
104
+ /** @ignore */
97
105
  [util_1.inspect.custom]() {
98
106
  const o = {};
99
107
  ['entityName', 'key', 'index', 'payload']
100
- .filter(k => this[k] != null)
108
+ .filter(k => this[k] !== undefined)
101
109
  .forEach(k => o[k] = this[k]);
102
110
  return `${this.constructor.name} ${(0, util_1.inspect)(o)}`;
103
111
  }
@@ -1,12 +1,12 @@
1
- import type { Dictionary, EntityMetadata, MetadataStorage } from '@mikro-orm/core';
1
+ import { type Dictionary, type EntityMetadata, type MetadataStorage, type EntityKey } 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
  }
@@ -12,7 +12,7 @@ const CriteriaNode_1 = require("./CriteriaNode");
12
12
  class CriteriaNodeFactory {
13
13
  static createNode(metadata, entityName, payload, parent, key) {
14
14
  const customExpression = CriteriaNode_1.CriteriaNode.isCustomExpression(key || '');
15
- const scalar = core_1.Utils.isPrimaryKey(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
15
+ const scalar = core_1.Utils.isPrimaryKey(payload) || core_1.Utils.isRawSql(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
16
16
  if (Array.isArray(payload) && !scalar) {
17
17
  return this.createArrayNode(metadata, entityName, payload, parent, key);
18
18
  }
@@ -37,9 +37,6 @@ class CriteriaNodeFactory {
37
37
  }
38
38
  static createObjectNode(metadata, entityName, payload, parent, key) {
39
39
  const meta = metadata.find(entityName);
40
- if (!parent && Object.keys(payload).every(k => meta?.properties[k]?.reference === core_1.ReferenceType.SCALAR)) {
41
- return this.createScalarNode(metadata, entityName, payload, parent, key);
42
- }
43
40
  const node = new ObjectCriteriaNode_1.ObjectCriteriaNode(metadata, entityName, parent, key);
44
41
  node.payload = Object.keys(payload).reduce((o, item) => {
45
42
  o[item] = this.createObjectItemNode(metadata, entityName, node, payload, item, meta);
@@ -47,24 +44,31 @@ class CriteriaNodeFactory {
47
44
  }, {});
48
45
  return node;
49
46
  }
50
- static createObjectItemNode(metadata, entityName, node, payload, item, meta) {
51
- const prop = meta?.properties[item];
52
- if (prop?.reference !== core_1.ReferenceType.EMBEDDED) {
53
- const childEntity = prop && prop.reference !== core_1.ReferenceType.SCALAR ? prop.type : entityName;
54
- return this.createNode(metadata, childEntity, payload[item], node, item);
47
+ static createObjectItemNode(metadata, entityName, node, payload, key, meta) {
48
+ const prop = meta?.properties[key];
49
+ const childEntity = prop && prop.kind !== core_1.ReferenceKind.SCALAR ? prop.type : entityName;
50
+ if (prop?.kind !== core_1.ReferenceKind.EMBEDDED) {
51
+ return this.createNode(metadata, childEntity, payload[key], node, key);
52
+ }
53
+ if (payload[key] == null) {
54
+ const map = Object.keys(prop.embeddedProps).reduce((oo, k) => {
55
+ oo[prop.embeddedProps[k].name] = null;
56
+ return oo;
57
+ }, {});
58
+ return this.createNode(metadata, entityName, map, node, key);
55
59
  }
56
- const operator = Object.keys(payload[item]).some(f => core_1.Utils.isOperator(f));
60
+ const operator = Object.keys(payload[key]).some(f => core_1.Utils.isOperator(f));
57
61
  if (operator) {
58
62
  throw core_1.ValidationError.cannotUseOperatorsInsideEmbeddables(entityName, prop.name, payload);
59
63
  }
60
- const map = Object.keys(payload[item]).reduce((oo, k) => {
64
+ const map = Object.keys(payload[key]).reduce((oo, k) => {
61
65
  if (!prop.embeddedProps[k]) {
62
66
  throw core_1.ValidationError.invalidEmbeddableQuery(entityName, k, prop.type);
63
67
  }
64
- oo[prop.embeddedProps[k].name] = payload[item][k];
68
+ oo[prop.embeddedProps[k].name] = payload[key][k];
65
69
  return oo;
66
70
  }, {});
67
- return this.createNode(metadata, entityName, map, node, item);
71
+ return this.createNode(metadata, entityName, map, node, key);
68
72
  }
69
73
  }
70
74
  exports.CriteriaNodeFactory = CriteriaNodeFactory;
@@ -3,9 +3,9 @@ import type { 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>, alias?: string): any;
8
+ willAutoJoin(qb: IQueryBuilder<T>, alias?: string): boolean;
9
9
  shouldInline(payload: any): boolean;
10
10
  private inlineChildPayload;
11
11
  private shouldAutoJoin;
@@ -21,7 +21,7 @@ class ObjectCriteriaNode extends CriteriaNode_1.CriteriaNode {
21
21
  const childNode = this.payload[field];
22
22
  const payload = childNode.process(qb, this.prop ? alias : ownerAlias);
23
23
  const operator = core_1.Utils.isOperator(field);
24
- const customExpression = ObjectCriteriaNode.isCustomExpression(field);
24
+ const isRawField = core_1.RawQueryFragment.isKnownFragment(field);
25
25
  // we need to keep the prefixing for formulas otherwise we would lose aliasing context when nesting inside group operators
26
26
  const virtual = childNode.prop?.persist === false && !childNode.prop?.formula;
27
27
  // if key is missing, we are inside group operator and we need to prefix with alias
@@ -33,8 +33,12 @@ class ObjectCriteriaNode extends CriteriaNode_1.CriteriaNode {
33
33
  else if (childNode.shouldRename(payload)) {
34
34
  o[childNode.renameFieldToPK(qb)] = payload;
35
35
  }
36
- else if (primaryKey || virtual || operator || customExpression || field.includes('.') || ![enums_1.QueryType.SELECT, enums_1.QueryType.COUNT].includes(qb.type ?? enums_1.QueryType.SELECT)) {
37
- o[field.replace(/\[::alias::]/g, alias)] = payload;
36
+ else if (isRawField) {
37
+ const rawField = core_1.RawQueryFragment.getKnownFragment(field);
38
+ o[(0, core_1.raw)(rawField.sql.replaceAll(core_1.ALIAS_REPLACEMENT, alias), rawField.params)] = payload;
39
+ }
40
+ else if (primaryKey || virtual || operator || field.includes('.') || ![enums_1.QueryType.SELECT, enums_1.QueryType.COUNT].includes(qb.type ?? enums_1.QueryType.SELECT)) {
41
+ o[field.replaceAll(core_1.ALIAS_REPLACEMENT, alias)] = payload;
38
42
  }
39
43
  else {
40
44
  o[`${alias}.${field}`] = payload;
@@ -60,7 +64,7 @@ class ObjectCriteriaNode extends CriteriaNode_1.CriteriaNode {
60
64
  const customExpression = ObjectCriteriaNode.isCustomExpression(this.key);
61
65
  const scalar = core_1.Utils.isPrimaryKey(payload) || payload instanceof RegExp || payload instanceof Date || customExpression;
62
66
  const operator = core_1.Utils.isObject(payload) && Object.keys(payload).every(k => core_1.Utils.isOperator(k, false));
63
- return !!this.prop && this.prop.reference !== core_1.ReferenceType.SCALAR && !scalar && !operator;
67
+ return !!this.prop && this.prop.kind !== core_1.ReferenceKind.SCALAR && !scalar && !operator;
64
68
  }
65
69
  inlineChildPayload(o, payload, field, alias, childAlias) {
66
70
  const prop = this.metadata.find(this.entityName).properties[field];
@@ -104,15 +108,15 @@ class ObjectCriteriaNode extends CriteriaNode_1.CriteriaNode {
104
108
  if (!this.prop || !this.parent) {
105
109
  return false;
106
110
  }
107
- const embeddable = this.prop.reference === core_1.ReferenceType.EMBEDDED;
108
- const knownKey = [core_1.ReferenceType.SCALAR, core_1.ReferenceType.MANY_TO_ONE, core_1.ReferenceType.EMBEDDED].includes(this.prop.reference) || (this.prop.reference === core_1.ReferenceType.ONE_TO_ONE && this.prop.owner);
111
+ const embeddable = this.prop.kind === core_1.ReferenceKind.EMBEDDED;
112
+ const knownKey = [core_1.ReferenceKind.SCALAR, core_1.ReferenceKind.MANY_TO_ONE, core_1.ReferenceKind.EMBEDDED].includes(this.prop.kind) || (this.prop.kind === core_1.ReferenceKind.ONE_TO_ONE && this.prop.owner);
109
113
  const operatorKeys = knownKey && Object.keys(this.payload).every(key => core_1.Utils.isOperator(key, false));
110
114
  const primaryKeys = knownKey && Object.keys(this.payload).every(key => {
111
115
  const meta = this.metadata.find(this.entityName);
112
116
  if (!meta.primaryKeys.includes(key)) {
113
117
  return false;
114
118
  }
115
- if (!core_1.Utils.isPlainObject(this.payload[key].payload) || ![core_1.ReferenceType.ONE_TO_ONE, core_1.ReferenceType.MANY_TO_ONE].includes(meta.properties[key].reference)) {
119
+ if (!core_1.Utils.isPlainObject(this.payload[key].payload) || ![core_1.ReferenceKind.ONE_TO_ONE, core_1.ReferenceKind.MANY_TO_ONE].includes(meta.properties[key].kind)) {
116
120
  return true;
117
121
  }
118
122
  return Object.keys(this.payload[key].payload).every(k => meta.properties[key].targetMeta.primaryKeys.includes(k));
@@ -125,12 +129,12 @@ class ObjectCriteriaNode extends CriteriaNode_1.CriteriaNode {
125
129
  const scalar = core_1.Utils.isPrimaryKey(this.payload) || this.payload instanceof RegExp || this.payload instanceof Date || customExpression;
126
130
  const operator = core_1.Utils.isPlainObject(this.payload) && Object.keys(this.payload).every(k => core_1.Utils.isOperator(k, false));
127
131
  const field = `${alias}.${this.prop.name}`;
128
- if (this.prop.reference === core_1.ReferenceType.MANY_TO_MANY && (scalar || operator)) {
129
- qb.join(field, nestedAlias, undefined, 'pivotJoin', this.getPath());
132
+ if (this.prop.kind === core_1.ReferenceKind.MANY_TO_MANY && (scalar || operator)) {
133
+ qb.join(field, nestedAlias, undefined, enums_1.JoinType.pivotJoin, this.getPath());
130
134
  }
131
135
  else {
132
136
  const prev = qb._fields?.slice();
133
- qb.join(field, nestedAlias, undefined, 'leftJoin', this.getPath());
137
+ qb.join(field, nestedAlias, undefined, enums_1.JoinType.leftJoin, this.getPath());
134
138
  qb._fields = prev;
135
139
  }
136
140
  return nestedAlias;