@mikro-orm/knex 6.0.0-dev.24 → 6.0.0-dev.240
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.
- package/AbstractSqlConnection.d.ts +22 -4
- package/AbstractSqlConnection.js +48 -18
- package/AbstractSqlDriver.d.ts +33 -25
- package/AbstractSqlDriver.js +565 -274
- package/AbstractSqlPlatform.d.ts +5 -4
- package/AbstractSqlPlatform.js +34 -5
- package/MonkeyPatchable.d.ts +1 -0
- package/MonkeyPatchable.js +3 -0
- package/PivotCollectionPersister.d.ts +17 -0
- package/PivotCollectionPersister.js +128 -0
- package/README.md +64 -107
- package/SqlEntityManager.d.ts +2 -6
- package/SqlEntityManager.js +4 -8
- package/SqlEntityRepository.d.ts +7 -6
- package/SqlEntityRepository.js +11 -8
- package/index.mjs +23 -5
- package/package.json +8 -8
- package/query/ArrayCriteriaNode.d.ts +5 -4
- package/query/ArrayCriteriaNode.js +7 -2
- package/query/CriteriaNode.d.ts +12 -10
- package/query/CriteriaNode.js +30 -17
- package/query/CriteriaNodeFactory.d.ts +6 -6
- package/query/CriteriaNodeFactory.js +33 -17
- package/query/ObjectCriteriaNode.d.ts +5 -4
- package/query/ObjectCriteriaNode.js +67 -27
- package/query/QueryBuilder.d.ts +58 -26
- package/query/QueryBuilder.js +444 -148
- package/query/QueryBuilderHelper.d.ts +13 -18
- package/query/QueryBuilderHelper.js +194 -167
- package/query/ScalarCriteriaNode.d.ts +4 -3
- package/query/ScalarCriteriaNode.js +18 -8
- package/query/enums.d.ts +7 -0
- package/query/enums.js +10 -2
- package/schema/DatabaseSchema.d.ts +5 -2
- package/schema/DatabaseSchema.js +28 -10
- package/schema/DatabaseTable.d.ts +13 -5
- package/schema/DatabaseTable.js +385 -60
- package/schema/SchemaComparator.d.ts +7 -5
- package/schema/SchemaComparator.js +68 -35
- package/schema/SchemaHelper.d.ts +7 -5
- package/schema/SchemaHelper.js +25 -11
- package/schema/SqlSchemaGenerator.d.ts +3 -6
- package/schema/SqlSchemaGenerator.js +71 -36
- package/typings.d.ts +30 -11
package/SqlEntityRepository.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { Knex } from 'knex';
|
|
2
|
-
import type
|
|
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
|
|
8
|
-
|
|
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
|
-
|
|
20
|
+
/**
|
|
21
|
+
* @inheritDoc
|
|
22
|
+
*/
|
|
23
|
+
getEntityManager(): SqlEntityManager;
|
|
23
24
|
}
|
package/SqlEntityRepository.js
CHANGED
|
@@ -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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
this.
|
|
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.
|
|
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.
|
|
27
|
+
return this.getEntityManager().getKnex(type);
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
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 Dataloader = mod.Dataloader;
|
|
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;
|
|
@@ -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
|
|
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
|
|
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.
|
|
3
|
+
"version": "6.0.0-dev.240",
|
|
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": ">=
|
|
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.
|
|
62
|
-
"knex": "
|
|
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.
|
|
66
|
+
"@mikro-orm/core": "^5.9.2"
|
|
67
67
|
},
|
|
68
68
|
"peerDependencies": {
|
|
69
|
-
"@mikro-orm/core": "
|
|
69
|
+
"@mikro-orm/core": "6.0.0-dev.240"
|
|
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
|
|
8
|
-
|
|
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,
|
|
9
|
+
process(qb, options) {
|
|
10
10
|
return this.payload.map((node) => {
|
|
11
|
-
return node.process(qb,
|
|
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) {
|
package/query/CriteriaNode.d.ts
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { inspect } from 'util';
|
|
3
|
-
import type
|
|
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?:
|
|
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?:
|
|
19
|
-
process
|
|
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
|
|
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
|
}
|
package/query/CriteriaNode.js
CHANGED
|
@@ -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) && !
|
|
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,
|
|
40
|
+
process(qb, options) {
|
|
41
|
+
return this.payload;
|
|
42
|
+
}
|
|
43
|
+
unwrap() {
|
|
34
44
|
return this.payload;
|
|
35
45
|
}
|
|
36
46
|
shouldInline(payload) {
|
|
@@ -40,26 +50,28 @@ class CriteriaNode {
|
|
|
40
50
|
return false;
|
|
41
51
|
}
|
|
42
52
|
shouldRename(payload) {
|
|
43
|
-
const type = this.prop ? this.prop.
|
|
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 =
|
|
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
|
|
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
|
}
|
|
51
63
|
switch (type) {
|
|
52
|
-
case core_1.
|
|
53
|
-
case core_1.
|
|
54
|
-
case core_1.
|
|
55
|
-
case core_1.
|
|
64
|
+
case core_1.ReferenceKind.MANY_TO_ONE: return false;
|
|
65
|
+
case core_1.ReferenceKind.ONE_TO_ONE: return !this.prop.owner;
|
|
66
|
+
case core_1.ReferenceKind.ONE_TO_MANY: return scalar || operator;
|
|
67
|
+
case core_1.ReferenceKind.MANY_TO_MANY: return scalar || operator;
|
|
56
68
|
default: return false;
|
|
57
69
|
}
|
|
58
70
|
}
|
|
59
71
|
renameFieldToPK(qb) {
|
|
60
72
|
const joinAlias = qb.getAliasForJoinPath(this.getPath());
|
|
61
73
|
const alias = joinAlias ?? qb.alias;
|
|
62
|
-
if (this.prop.
|
|
74
|
+
if (this.prop.kind === core_1.ReferenceKind.MANY_TO_MANY) {
|
|
63
75
|
return core_1.Utils.getPrimaryKeyHash(this.prop.inverseJoinColumns.map(col => `${alias}.${col}`));
|
|
64
76
|
}
|
|
65
77
|
// 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 +82,7 @@ class CriteriaNode {
|
|
|
70
82
|
}
|
|
71
83
|
getPath(addIndex = false) {
|
|
72
84
|
// use index on parent only if we are processing to-many relation
|
|
73
|
-
const addParentIndex = this.prop && [core_1.
|
|
85
|
+
const addParentIndex = this.prop && [core_1.ReferenceKind.ONE_TO_MANY, core_1.ReferenceKind.MANY_TO_MANY].includes(this.prop.kind);
|
|
74
86
|
const parentPath = this.parent?.getPath(addParentIndex) ?? this.entityName;
|
|
75
87
|
const index = addIndex && this.index != null ? `[${this.index}]` : '';
|
|
76
88
|
// ignore group operators to allow easier mapping (e.g. for orderBy)
|
|
@@ -86,23 +98,24 @@ class CriteriaNode {
|
|
|
86
98
|
if (!this.key || !this.prop) {
|
|
87
99
|
return false;
|
|
88
100
|
}
|
|
89
|
-
const customExpression =
|
|
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
|
-
return this.prop.
|
|
104
|
+
return this.prop.kind === core_1.ReferenceKind.MANY_TO_MANY && (scalar || operator);
|
|
93
105
|
}
|
|
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]
|
|
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
|
|
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
|
|
8
|
-
static createScalarNode(metadata: MetadataStorage, entityName: string, payload: any, parent?: ICriteriaNode
|
|
9
|
-
static createArrayNode(metadata: MetadataStorage, entityName: string, payload: any[], parent?: ICriteriaNode
|
|
10
|
-
static createObjectNode(metadata: MetadataStorage, entityName: string, payload: Dictionary, parent?: ICriteriaNode
|
|
11
|
-
static createObjectItemNode(metadata: MetadataStorage, entityName: string, node: 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 =
|
|
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
|
-
|
|
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]?.reference === core_1.ReferenceType.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,
|
|
51
|
-
const prop = meta?.properties[
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return this.createNode(metadata, childEntity, payload[
|
|
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
|
+
if (prop?.kind !== core_1.ReferenceKind.EMBEDDED) {
|
|
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
|
-
|
|
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[
|
|
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
|
-
|
|
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,
|
|
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
|
|
8
|
-
|
|
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;
|