@mikro-orm/knex 6.0.0-dev.27 → 6.0.0-dev.28
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/AbstractSqlDriver.d.ts +1 -1
- package/AbstractSqlDriver.js +8 -7
- package/package.json +2 -2
- package/query/ArrayCriteriaNode.d.ts +3 -3
- package/query/CriteriaNode.d.ts +8 -8
- package/query/CriteriaNodeFactory.d.ts +6 -6
- package/query/CriteriaNodeFactory.js +7 -7
- package/query/ObjectCriteriaNode.d.ts +3 -3
- package/query/QueryBuilder.d.ts +1 -1
- package/query/QueryBuilderHelper.d.ts +2 -2
- package/query/QueryBuilderHelper.js +1 -1
- package/query/ScalarCriteriaNode.d.ts +2 -2
- package/schema/DatabaseTable.js +2 -2
- package/typings.d.ts +4 -4
package/AbstractSqlDriver.d.ts
CHANGED
|
@@ -36,7 +36,7 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
|
|
|
36
36
|
/**
|
|
37
37
|
* 1:1 owner side needs to be marked for population so QB auto-joins the owner id
|
|
38
38
|
*/
|
|
39
|
-
protected autoJoinOneToOneOwner<T extends object, P extends string = never>(meta: EntityMetadata
|
|
39
|
+
protected autoJoinOneToOneOwner<T extends object, P extends string = never>(meta: EntityMetadata<T>, populate: PopulateOptions<T>[], fields?: readonly EntityField<T, P>[]): PopulateOptions<T>[];
|
|
40
40
|
protected joinedProps<T>(meta: EntityMetadata, populate: PopulateOptions<T>[]): PopulateOptions<T>[];
|
|
41
41
|
/**
|
|
42
42
|
* @internal
|
package/AbstractSqlDriver.js
CHANGED
|
@@ -150,6 +150,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
|
|
|
150
150
|
mapJoinedProps(result, meta, populate, qb, root, map, parentJoinPath) {
|
|
151
151
|
const joinedProps = this.joinedProps(meta, populate);
|
|
152
152
|
joinedProps.forEach(p => {
|
|
153
|
+
var _a, _b;
|
|
153
154
|
const relation = meta.properties[p.field];
|
|
154
155
|
/* istanbul ignore next */
|
|
155
156
|
if (!relation) {
|
|
@@ -167,7 +168,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
|
|
|
167
168
|
if (!hasPK) {
|
|
168
169
|
// initialize empty collections
|
|
169
170
|
if ([core_1.ReferenceKind.MANY_TO_MANY, core_1.ReferenceKind.ONE_TO_MANY].includes(relation.kind)) {
|
|
170
|
-
result[relation.name]
|
|
171
|
+
result[_a = relation.name] ?? (result[_a] = []);
|
|
171
172
|
}
|
|
172
173
|
return;
|
|
173
174
|
}
|
|
@@ -192,7 +193,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
|
|
|
192
193
|
map[key] = result;
|
|
193
194
|
}
|
|
194
195
|
if ([core_1.ReferenceKind.MANY_TO_MANY, core_1.ReferenceKind.ONE_TO_MANY].includes(relation.kind)) {
|
|
195
|
-
result[relation.name]
|
|
196
|
+
result[_b = relation.name] ?? (result[_b] = []);
|
|
196
197
|
this.appendToCollection(meta2, result[relation.name], relationPojo);
|
|
197
198
|
}
|
|
198
199
|
else {
|
|
@@ -253,7 +254,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
|
|
|
253
254
|
const collections = options.processCollections ? data.map(d => this.extractManyToMany(entityName, d)) : [];
|
|
254
255
|
const pks = this.getPrimaryKeyFields(entityName);
|
|
255
256
|
const set = new Set();
|
|
256
|
-
data.forEach(row =>
|
|
257
|
+
data.forEach(row => core_1.Utils.keys(row).forEach(k => set.add(k)));
|
|
257
258
|
const props = [...set].map(name => meta?.properties[name] ?? { name, fieldNames: [name] });
|
|
258
259
|
const fields = core_1.Utils.flatten(props.map(prop => prop.fieldNames));
|
|
259
260
|
const params = [];
|
|
@@ -326,11 +327,11 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
|
|
|
326
327
|
.withSchema(this.getSchemaName(meta, options));
|
|
327
328
|
if (options.upsert) {
|
|
328
329
|
/* istanbul ignore next */
|
|
329
|
-
const uniqueFields = core_1.Utils.isPlainObject(where) ?
|
|
330
|
+
const uniqueFields = core_1.Utils.isPlainObject(where) ? core_1.Utils.keys(where) : meta.primaryKeys;
|
|
330
331
|
/* istanbul ignore next */
|
|
331
332
|
qb.insert(data)
|
|
332
333
|
.onConflict(uniqueFields.map(p => meta?.properties[p]?.fieldNames[0] ?? p))
|
|
333
|
-
.merge(
|
|
334
|
+
.merge(core_1.Utils.keys(data).filter(f => !uniqueFields.includes(f)));
|
|
334
335
|
}
|
|
335
336
|
else {
|
|
336
337
|
qb.update(data).where(where);
|
|
@@ -356,7 +357,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
|
|
|
356
357
|
}
|
|
357
358
|
const collections = options.processCollections ? data.map(d => this.extractManyToMany(entityName, d)) : [];
|
|
358
359
|
const keys = new Set();
|
|
359
|
-
data.forEach(row =>
|
|
360
|
+
data.forEach(row => core_1.Utils.keys(row).forEach(k => keys.add(k)));
|
|
360
361
|
const pkCond = core_1.Utils.flatten(meta.primaryKeys.map(pk => meta.properties[pk].fieldNames)).map(pk => `${this.platform.quoteIdentifier(pk)} = ?`).join(' and ');
|
|
361
362
|
const params = [];
|
|
362
363
|
let sql = `update ${this.getTableName(meta, options)} set `;
|
|
@@ -718,7 +719,7 @@ class AbstractSqlDriver extends core_1.DatabaseDriver {
|
|
|
718
719
|
const path = `${parentPath ? parentPath : entityName}.${relation.field}`;
|
|
719
720
|
const propAlias = qb.getAliasForJoinPath(path);
|
|
720
721
|
if (propOrderBy) {
|
|
721
|
-
|
|
722
|
+
core_1.Utils.keys(propOrderBy).forEach(field => {
|
|
722
723
|
orderBy.push({ [`${propAlias}.${field}`]: propOrderBy[field] });
|
|
723
724
|
});
|
|
724
725
|
}
|
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.28",
|
|
4
4
|
"description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "index.mjs",
|
|
@@ -66,6 +66,6 @@
|
|
|
66
66
|
"@mikro-orm/core": "^5.6.8"
|
|
67
67
|
},
|
|
68
68
|
"peerDependencies": {
|
|
69
|
-
"@mikro-orm/core": "~6.0.0-dev.
|
|
69
|
+
"@mikro-orm/core": "~6.0.0-dev.28"
|
|
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
|
|
8
|
-
willAutoJoin
|
|
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
|
}
|
package/query/CriteriaNode.d.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { inspect } from 'util';
|
|
3
|
-
import type { EntityProperty, MetadataStorage } from '@mikro-orm/core';
|
|
3
|
+
import type { EntityKey, EntityProperty, MetadataStorage } 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?:
|
|
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>, alias?: string): any;
|
|
20
20
|
shouldInline(payload: any): boolean;
|
|
21
|
-
willAutoJoin
|
|
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;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type { Dictionary, EntityMetadata, MetadataStorage } from '@mikro-orm/core';
|
|
1
|
+
import type { Dictionary, EntityKey, EntityMetadata, 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
|
}
|
|
@@ -47,24 +47,24 @@ class CriteriaNodeFactory {
|
|
|
47
47
|
}, {});
|
|
48
48
|
return node;
|
|
49
49
|
}
|
|
50
|
-
static createObjectItemNode(metadata, entityName, node, payload,
|
|
51
|
-
const prop = meta?.properties[
|
|
50
|
+
static createObjectItemNode(metadata, entityName, node, payload, key, meta) {
|
|
51
|
+
const prop = meta?.properties[key];
|
|
52
52
|
if (prop?.kind !== core_1.ReferenceKind.EMBEDDED) {
|
|
53
53
|
const childEntity = prop && prop.kind !== core_1.ReferenceKind.SCALAR ? prop.type : entityName;
|
|
54
|
-
return this.createNode(metadata, childEntity, payload[
|
|
54
|
+
return this.createNode(metadata, childEntity, payload[key], node, key);
|
|
55
55
|
}
|
|
56
|
-
const operator = Object.keys(payload[
|
|
56
|
+
const operator = Object.keys(payload[key]).some(f => core_1.Utils.isOperator(f));
|
|
57
57
|
if (operator) {
|
|
58
58
|
throw core_1.ValidationError.cannotUseOperatorsInsideEmbeddables(entityName, prop.name, payload);
|
|
59
59
|
}
|
|
60
|
-
const map = Object.keys(payload[
|
|
60
|
+
const map = Object.keys(payload[key]).reduce((oo, k) => {
|
|
61
61
|
if (!prop.embeddedProps[k]) {
|
|
62
62
|
throw core_1.ValidationError.invalidEmbeddableQuery(entityName, k, prop.type);
|
|
63
63
|
}
|
|
64
|
-
oo[prop.embeddedProps[k].name] = payload[
|
|
64
|
+
oo[prop.embeddedProps[k].name] = payload[key][k];
|
|
65
65
|
return oo;
|
|
66
66
|
}, {});
|
|
67
|
-
return this.createNode(metadata, entityName, map, node,
|
|
67
|
+
return this.createNode(metadata, entityName, map, node, key);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
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
|
|
8
|
-
willAutoJoin
|
|
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;
|
package/query/QueryBuilder.d.ts
CHANGED
|
@@ -92,7 +92,7 @@ export declare class QueryBuilder<T extends object = AnyEntity> {
|
|
|
92
92
|
leftJoin(field: string, alias: string, cond?: QBFilterQuery): this;
|
|
93
93
|
joinAndSelect(field: string, alias: string, cond?: QBFilterQuery, type?: 'leftJoin' | 'innerJoin' | 'pivotJoin', path?: string): SelectQueryBuilder<T>;
|
|
94
94
|
leftJoinAndSelect(field: string, alias: string, cond?: QBFilterQuery): SelectQueryBuilder<T>;
|
|
95
|
-
protected getFieldsForJoinedLoad
|
|
95
|
+
protected getFieldsForJoinedLoad(prop: EntityProperty<T>, alias: string): Field<T>[];
|
|
96
96
|
withSubQuery(subQuery: Knex.QueryBuilder, alias: string): this;
|
|
97
97
|
where(cond: QBFilterQuery<T>, operator?: keyof typeof GroupOperator): this;
|
|
98
98
|
where(cond: string, params?: any[], operator?: keyof typeof GroupOperator): this;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Knex } from 'knex';
|
|
2
|
-
import type { Dictionary, EntityData, EntityMetadata, EntityProperty, FlatQueryOrderMap, QBFilterQuery } from '@mikro-orm/core';
|
|
2
|
+
import type { Dictionary, EntityData, EntityKey, EntityMetadata, EntityProperty, FlatQueryOrderMap, QBFilterQuery } from '@mikro-orm/core';
|
|
3
3
|
import { LockMode } from '@mikro-orm/core';
|
|
4
4
|
import { QueryType } from './enums';
|
|
5
5
|
import type { Field, JoinOptions } from '../typings';
|
|
@@ -49,7 +49,7 @@ export declare class QueryBuilderHelper {
|
|
|
49
49
|
getQueryOrder(type: QueryType, orderBy: FlatQueryOrderMap | FlatQueryOrderMap[], populate: Dictionary<string>): string;
|
|
50
50
|
getQueryOrderFromObject(type: QueryType, orderBy: FlatQueryOrderMap, populate: Dictionary<string>): string;
|
|
51
51
|
finalize(type: QueryType, qb: Knex.QueryBuilder, meta?: EntityMetadata): void;
|
|
52
|
-
splitField(field:
|
|
52
|
+
splitField<T>(field: EntityKey<T>, greedyAlias?: boolean): [string, EntityKey<T>];
|
|
53
53
|
getLockSQL(qb: Knex.QueryBuilder, lockMode: LockMode, lockTables?: string[]): void;
|
|
54
54
|
updateVersionProperty(qb: Knex.QueryBuilder, data: Dictionary): void;
|
|
55
55
|
static isCustomExpression(field: string, hasAlias?: boolean): boolean;
|
|
@@ -311,7 +311,7 @@ class QueryBuilderHelper {
|
|
|
311
311
|
let mergeParam = item.merge;
|
|
312
312
|
if (core_1.Utils.isObject(item.merge)) {
|
|
313
313
|
mergeParam = {};
|
|
314
|
-
|
|
314
|
+
core_1.Utils.keys(item.merge).forEach(key => {
|
|
315
315
|
const k = this.mapper(key, type);
|
|
316
316
|
mergeParam[k] = item.merge[key];
|
|
317
317
|
});
|
|
@@ -3,7 +3,7 @@ import type { IQueryBuilder } from '../typings';
|
|
|
3
3
|
/**
|
|
4
4
|
* @internal
|
|
5
5
|
*/
|
|
6
|
-
export declare class ScalarCriteriaNode extends CriteriaNode {
|
|
7
|
-
process
|
|
6
|
+
export declare class ScalarCriteriaNode<T extends object> extends CriteriaNode<T> {
|
|
7
|
+
process(qb: IQueryBuilder<T>, alias?: string): any;
|
|
8
8
|
shouldJoin(): boolean;
|
|
9
9
|
}
|
package/schema/DatabaseTable.js
CHANGED
|
@@ -308,10 +308,10 @@ class DatabaseTable {
|
|
|
308
308
|
}
|
|
309
309
|
toJSON() {
|
|
310
310
|
const { platform, columns, ...rest } = this;
|
|
311
|
-
const columnsMapped =
|
|
311
|
+
const columnsMapped = core_1.Utils.keys(columns).reduce((o, col) => {
|
|
312
312
|
const { mappedType, ...restCol } = columns[col];
|
|
313
313
|
o[col] = restCol;
|
|
314
|
-
o[col].mappedType =
|
|
314
|
+
o[col].mappedType = core_1.Utils.keys(core_1.t).find(k => core_1.t[k] === mappedType.constructor);
|
|
315
315
|
return o;
|
|
316
316
|
}, {});
|
|
317
317
|
return { columns: columnsMapped, ...rest };
|
package/typings.d.ts
CHANGED
|
@@ -136,16 +136,16 @@ export interface IQueryBuilder<T> {
|
|
|
136
136
|
getAliasForJoinPath(path: string): string | undefined;
|
|
137
137
|
getNextAlias(entityName?: string): string;
|
|
138
138
|
}
|
|
139
|
-
export interface ICriteriaNode {
|
|
139
|
+
export interface ICriteriaNode<T extends object> {
|
|
140
140
|
readonly entityName: string;
|
|
141
|
-
readonly parent?: ICriteriaNode | undefined;
|
|
141
|
+
readonly parent?: ICriteriaNode<T> | undefined;
|
|
142
142
|
readonly key?: string | undefined;
|
|
143
143
|
payload: any;
|
|
144
144
|
prop?: EntityProperty;
|
|
145
145
|
index?: number;
|
|
146
|
-
process
|
|
146
|
+
process(qb: IQueryBuilder<T>, alias?: string): any;
|
|
147
147
|
shouldInline(payload: any): boolean;
|
|
148
|
-
willAutoJoin
|
|
148
|
+
willAutoJoin(qb: IQueryBuilder<T>, alias?: string): boolean;
|
|
149
149
|
shouldRename(payload: any): boolean;
|
|
150
150
|
renameFieldToPK<T>(qb: IQueryBuilder<T>): string;
|
|
151
151
|
getPath(addIndex?: boolean): string;
|