@goatlab/fluent 0.7.6 → 0.7.11
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/dist/BaseConnector.d.ts +8 -31
- package/dist/BaseConnector.js +11 -104
- package/dist/FluentConnectorInterface.d.ts +17 -0
- package/dist/FluentConnectorInterface.js +2 -0
- package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +8 -12
- package/dist/TypeOrmConnector/TypeOrmConnector.js +183 -546
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.d.ts +7 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js +148 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js +34 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.d.ts +4 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js +12 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js +166 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.d.ts +8 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js +200 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js +207 -0
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +164 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +3 -3
- package/dist/TypeOrmConnector/test/basic/goat.entity.js +1 -1
- package/dist/TypeOrmConnector/test/docker/docker.d.ts +1 -1
- package/dist/TypeOrmConnector/test/docker/docker.js +3 -4
- package/dist/TypeOrmConnector/test/docker/mongo.d.ts +16 -0
- package/dist/TypeOrmConnector/test/docker/mongo.js +93 -0
- package/dist/TypeOrmConnector/test/docker/mysql.js +1 -1
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +4 -2
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +6 -1
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +3 -2
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +3 -1
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +2 -2
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +2 -1
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +6 -2
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +10 -1
- package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +1 -1
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +3 -2
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +3 -1
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +2 -2
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +2 -1
- package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +0 -1
- package/dist/TypeOrmConnector/test/relations/car/car.entity.js +0 -8
- package/dist/TypeOrmConnector/test/relations/car/car.output.schema.d.ts +511 -0
- package/dist/TypeOrmConnector/test/relations/car/car.output.schema.js +8 -0
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +4 -2
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +6 -1
- package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +2 -25
- package/dist/TypeOrmConnector/test/relations/car/car.schema.js +3 -8
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +1 -1
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +435 -35
- package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.d.ts +152 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.js +14 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +2 -25
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +2 -10
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -2
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +3 -1
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +2 -2
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +2 -1
- package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +465 -69
- package/dist/TypeOrmConnector/test/relations/user/user.schema.js +54 -5
- package/dist/TypeOrmConnector/util/clearEmpties.d.ts +1 -0
- package/dist/TypeOrmConnector/util/clearEmpties.js +25 -0
- package/dist/TypeOrmConnector/util/extractConditions.d.ts +6 -0
- package/dist/TypeOrmConnector/util/extractConditions.js +80 -0
- package/dist/TypeOrmConnector/util/extractInclude.d.ts +2 -0
- package/dist/TypeOrmConnector/util/extractInclude.js +25 -0
- package/dist/TypeOrmConnector/util/extractMetadataFromKeys.d.ts +12 -0
- package/dist/TypeOrmConnector/util/extractMetadataFromKeys.js +42 -0
- package/dist/TypeOrmConnector/util/extractOrderBy.d.ts +4 -0
- package/dist/TypeOrmConnector/util/extractOrderBy.js +18 -0
- package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.d.ts +19 -0
- package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.js +26 -0
- package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.d.ts +1 -0
- package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.js +20 -0
- package/dist/TypeOrmConnector/util/isAnyObject.d.ts +1 -0
- package/dist/TypeOrmConnector/util/isAnyObject.js +7 -0
- package/dist/TypeOrmConnector/util/nestQueryResults.d.ts +2 -0
- package/dist/TypeOrmConnector/util/nestQueryResults.js +31 -0
- package/dist/index.d.ts +12 -5
- package/dist/index.js +15 -2
- package/dist/loadRelations.js +8 -10
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +37 -20
- package/package.json +4 -3
- package/CHANGELOG.md +0 -1072
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +0 -4
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +0 -43
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.clearEmpties = void 0;
|
|
4
|
+
const bson_1 = require("bson");
|
|
5
|
+
const clearEmpties = object => {
|
|
6
|
+
Object.entries(object).forEach(([k, v]) => {
|
|
7
|
+
if (v && typeof v === 'object')
|
|
8
|
+
(0, exports.clearEmpties)(v);
|
|
9
|
+
if ((v && typeof v === 'object' && !Object.keys(v).length) ||
|
|
10
|
+
v === null ||
|
|
11
|
+
v === undefined ||
|
|
12
|
+
v.length === 0) {
|
|
13
|
+
if (Array.isArray(object)) {
|
|
14
|
+
if (!(object[k] instanceof bson_1.ObjectId)) {
|
|
15
|
+
object.splice(k, 1);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else if (!(v instanceof Date) && !(v instanceof bson_1.ObjectId)) {
|
|
19
|
+
delete object[k];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return object;
|
|
24
|
+
};
|
|
25
|
+
exports.clearEmpties = clearEmpties;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractConditions = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
|
+
const types_1 = require("../../types");
|
|
6
|
+
const isAnyObject_1 = require("./isAnyObject");
|
|
7
|
+
const extractConditions = (conditions) => {
|
|
8
|
+
const accumulatedClauses = [];
|
|
9
|
+
if (!conditions) {
|
|
10
|
+
return accumulatedClauses;
|
|
11
|
+
}
|
|
12
|
+
for (const clause of conditions) {
|
|
13
|
+
if (!clause) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
for (const el of Object.keys(clause)) {
|
|
17
|
+
const value = clause[el];
|
|
18
|
+
if ((0, isAnyObject_1.isAnyObject)(value)) {
|
|
19
|
+
const initialKey = el;
|
|
20
|
+
const flatten = js_utils_1.Objects.flatten(value);
|
|
21
|
+
for (const key of Object.keys(flatten)) {
|
|
22
|
+
const transformedKey = key.replace(new RegExp('.[0-9]', 'g'), '');
|
|
23
|
+
if (types_1.LogicOperator[transformedKey]) {
|
|
24
|
+
if (types_1.LogicOperator[transformedKey] === types_1.LogicOperator.in ||
|
|
25
|
+
types_1.LogicOperator[transformedKey] === types_1.LogicOperator.notIn) {
|
|
26
|
+
accumulatedClauses.push({
|
|
27
|
+
operator: types_1.LogicOperator[transformedKey],
|
|
28
|
+
element: `${initialKey}`,
|
|
29
|
+
value: value[transformedKey]
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
accumulatedClauses.push({
|
|
34
|
+
operator: types_1.LogicOperator[transformedKey],
|
|
35
|
+
element: `${initialKey}`,
|
|
36
|
+
value: flatten[key]
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else if (transformedKey.includes('.')) {
|
|
41
|
+
const op = key.split('.').slice(-1).pop();
|
|
42
|
+
if (!op) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (types_1.LogicOperator[op]) {
|
|
46
|
+
accumulatedClauses.push({
|
|
47
|
+
operator: types_1.LogicOperator[op],
|
|
48
|
+
element: `${initialKey}.${key.replace(`.${op}`, '')}`,
|
|
49
|
+
value: flatten[key]
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
accumulatedClauses.push({
|
|
54
|
+
operator: types_1.LogicOperator.equals,
|
|
55
|
+
element: `${initialKey}.${key}`,
|
|
56
|
+
value: flatten[key]
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
accumulatedClauses.push({
|
|
62
|
+
operator: types_1.LogicOperator.equals,
|
|
63
|
+
element: `${initialKey}.${transformedKey}`,
|
|
64
|
+
value: flatten[key]
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
accumulatedClauses.push({
|
|
71
|
+
operator: types_1.LogicOperator.equals,
|
|
72
|
+
element: el,
|
|
73
|
+
value
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return accumulatedClauses.filter((v, i, a) => a.findIndex(v2 => JSON.stringify(v2) === JSON.stringify(v)) === i);
|
|
79
|
+
};
|
|
80
|
+
exports.extractConditions = extractConditions;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractInclude = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
|
+
const extractInclude = (include) => {
|
|
6
|
+
if (!include) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
const flatten = js_utils_1.Objects.flatten(include);
|
|
10
|
+
const extractedInclude = {};
|
|
11
|
+
for (const key of Object.keys(flatten)) {
|
|
12
|
+
if (key.includes('include')) {
|
|
13
|
+
const parsedKey = key.split('.include');
|
|
14
|
+
let acc = '';
|
|
15
|
+
for (const entity of parsedKey) {
|
|
16
|
+
extractedInclude[`${acc}${entity}`] = true;
|
|
17
|
+
acc = acc + entity;
|
|
18
|
+
}
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
extractedInclude[key] = true;
|
|
22
|
+
}
|
|
23
|
+
return extractedInclude;
|
|
24
|
+
};
|
|
25
|
+
exports.extractInclude = extractInclude;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface KeysMetadata {
|
|
2
|
+
keyName: string;
|
|
3
|
+
nestableKey: string;
|
|
4
|
+
relation?: string;
|
|
5
|
+
parentRelation?: string;
|
|
6
|
+
level?: number;
|
|
7
|
+
cardinality?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface KeysMetadataResponse {
|
|
10
|
+
[key: string]: KeysMetadata;
|
|
11
|
+
}
|
|
12
|
+
export declare const extractMetadataFromKeys: (keys: string[]) => KeysMetadataResponse;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractMetadataFromKeys = void 0;
|
|
4
|
+
const extractMetadataFromKeys = (keys) => {
|
|
5
|
+
const keyToNestedKeyMap = {};
|
|
6
|
+
for (const key of keys) {
|
|
7
|
+
const preAttributeIndex = key.lastIndexOf('_');
|
|
8
|
+
const fullTableAlias = key.slice(0, preAttributeIndex).replace('_', '');
|
|
9
|
+
const keyName = key.slice(preAttributeIndex + 1, key.length);
|
|
10
|
+
const flattened = fullTableAlias
|
|
11
|
+
.replace(/___XXManyToOneXX/g, '')
|
|
12
|
+
.replace(/___XXOneToManyXX/g, '')
|
|
13
|
+
.replace(/___/g, '.')
|
|
14
|
+
.replace('__', '.')
|
|
15
|
+
.replace('.XXOneToManyXX', '');
|
|
16
|
+
const possibleCurrentTableKey = key.lastIndexOf('___');
|
|
17
|
+
const relation = possibleCurrentTableKey <= 0
|
|
18
|
+
? undefined
|
|
19
|
+
: key.slice(possibleCurrentTableKey + 3, preAttributeIndex);
|
|
20
|
+
const possibleParentTableKeyInit = key.lastIndexOf('___XX');
|
|
21
|
+
const possibleParentTableKeyEnd = key.lastIndexOf('XX__');
|
|
22
|
+
const cardinality = key.slice(possibleParentTableKeyInit, possibleParentTableKeyEnd) ||
|
|
23
|
+
undefined;
|
|
24
|
+
const parentRelationKey = key
|
|
25
|
+
.substring(0, possibleParentTableKeyInit)
|
|
26
|
+
.lastIndexOf('___');
|
|
27
|
+
const parentRelation = key
|
|
28
|
+
.substring(parentRelationKey, possibleParentTableKeyInit)
|
|
29
|
+
.replace(/___/g, '') || undefined;
|
|
30
|
+
var level = (key.match(/XX___/g) || []).length;
|
|
31
|
+
keyToNestedKeyMap[key] = {
|
|
32
|
+
keyName,
|
|
33
|
+
nestableKey: `${flattened}.${keyName}`,
|
|
34
|
+
relation,
|
|
35
|
+
parentRelation,
|
|
36
|
+
level,
|
|
37
|
+
cardinality: cardinality && cardinality.replace(/XX/g, '').replace(/___/g, '')
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return keyToNestedKeyMap;
|
|
41
|
+
};
|
|
42
|
+
exports.extractMetadataFromKeys = extractMetadataFromKeys;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { FluentQuery } from 'types';
|
|
2
|
+
export declare const extractOrderBy: <T>(orderBy?: Partial<{ [K in keyof import("types").Concrete<T>]: import("types").Concrete<T>[K] extends object ? Partial<Partial<{ [K_1 in keyof import("types").Concrete<import("types").Concrete<T>[K]>]: import("types").Concrete<import("types").Concrete<T>[K]>[K_1] extends object ? Partial<Partial<{ [K_2 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2] extends object ? Partial<Partial<{ [K_3 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3] extends object ? Partial<Partial<{ [K_4 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4] extends object ? Partial<Partial<{ [K_5 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5] extends object ? Partial<Partial<{ [K_6 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6] extends object ? Partial<Partial<{ [K_7 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7] extends object ? Partial<Partial<{ [K_8 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7]>[K_8] extends object ? Partial<Partial<{ [K_9 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7]>[K_8]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7]>[K_8]>[K_9] extends object ? any : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>[] | undefined) => {
|
|
3
|
+
[key: string]: any;
|
|
4
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractOrderBy = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
|
+
const extractOrderBy = (orderBy) => {
|
|
6
|
+
if (!orderBy || !Array.isArray(orderBy) || orderBy.length === 0) {
|
|
7
|
+
return {};
|
|
8
|
+
}
|
|
9
|
+
const order = {};
|
|
10
|
+
for (const orderElement of orderBy) {
|
|
11
|
+
const flattenOrder = js_utils_1.Objects.flatten(orderElement);
|
|
12
|
+
for (const k of Object.keys(flattenOrder)) {
|
|
13
|
+
order[k] = flattenOrder[k];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return js_utils_1.Objects.nest(order);
|
|
17
|
+
};
|
|
18
|
+
exports.extractOrderBy = extractOrderBy;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Repository } from 'typeorm';
|
|
2
|
+
export interface GeneratedModelRelations {
|
|
3
|
+
relations: {
|
|
4
|
+
[key: string]: {
|
|
5
|
+
isOneToMany: boolean;
|
|
6
|
+
isManyToOne: boolean;
|
|
7
|
+
isManyToMany: boolean;
|
|
8
|
+
inverseSidePropertyRelationPath?: string;
|
|
9
|
+
inverseSidePropertyPath?: string;
|
|
10
|
+
propertyName: string;
|
|
11
|
+
entityName: string;
|
|
12
|
+
tableName: string;
|
|
13
|
+
targetClass: string;
|
|
14
|
+
joinColumns: any[];
|
|
15
|
+
inverseJoinColumns: any[];
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare const getRelationsFromModelGenerator: (typeOrmRepo: Repository<any>) => GeneratedModelRelations;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getRelationsFromModelGenerator = void 0;
|
|
4
|
+
const getRelationsFromModelGenerator = (typeOrmRepo) => {
|
|
5
|
+
const relations = {};
|
|
6
|
+
for (const relation of typeOrmRepo.metadata.relations) {
|
|
7
|
+
const pPath = relation.inverseRelation?.joinColumns[0];
|
|
8
|
+
relations[relation.propertyName] = {
|
|
9
|
+
isOneToMany: relation.isOneToMany,
|
|
10
|
+
isManyToOne: relation.isManyToOne,
|
|
11
|
+
isManyToMany: relation.isManyToMany,
|
|
12
|
+
inverseSidePropertyRelationPath: relation.inverseSidePropertyPath,
|
|
13
|
+
inverseSidePropertyPath: pPath?.propertyPath,
|
|
14
|
+
propertyName: relation.propertyName,
|
|
15
|
+
entityName: relation.inverseEntityMetadata.name,
|
|
16
|
+
tableName: relation.inverseEntityMetadata.tableName,
|
|
17
|
+
targetClass: relation.inverseEntityMetadata.target,
|
|
18
|
+
joinColumns: relation.joinColumns,
|
|
19
|
+
inverseJoinColumns: relation.inverseJoinColumns
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
relations
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
exports.getRelationsFromModelGenerator = getRelationsFromModelGenerator;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getSelectedKeysFromRawSql: (sql: string) => string[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSelectedKeysFromRawSql = void 0;
|
|
4
|
+
const getSelectedKeysFromRawSql = (sql) => {
|
|
5
|
+
const possibleKeys = sql.split('AS');
|
|
6
|
+
const keys = new Set([]);
|
|
7
|
+
for (const stringKey of possibleKeys) {
|
|
8
|
+
if (stringKey.includes('SELECT')) {
|
|
9
|
+
const key = stringKey.split('"')[1];
|
|
10
|
+
if (key.includes('___') || !key.includes('_')) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
keys.add(key.replace('_id', 'id').replace('_', '.'));
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
keys.add(stringKey.split('"')[1].replace('_id', 'id').replace('_', '.'));
|
|
17
|
+
}
|
|
18
|
+
return Array.from(keys);
|
|
19
|
+
};
|
|
20
|
+
exports.getSelectedKeysFromRawSql = getSelectedKeysFromRawSql;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isAnyObject: (val: any) => boolean;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nestQueryResults = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
|
+
const nestQueryResults = (results, keyToNestedKeyMap) => {
|
|
6
|
+
let nestableObject = {};
|
|
7
|
+
let currentLevel = 0;
|
|
8
|
+
for (const key of Object.keys(keyToNestedKeyMap)) {
|
|
9
|
+
if (!key.endsWith('_id')) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
const currentLevelMetadata = keyToNestedKeyMap[key];
|
|
13
|
+
currentLevel = currentLevelMetadata.level;
|
|
14
|
+
const grouped = js_utils_1.Arrays.groupBy(results, r => r[key]);
|
|
15
|
+
const resultCount = Object.keys(grouped)?.length || 0;
|
|
16
|
+
for (const [index, k] of Object.keys(grouped).entries()) {
|
|
17
|
+
const prefixindex = currentLevelMetadata.nestableKey.lastIndexOf('.');
|
|
18
|
+
const prefix = currentLevelMetadata.nestableKey.substring(0, prefixindex);
|
|
19
|
+
const currentIndex = `${prefix}.${index}.${currentLevelMetadata.keyName}`;
|
|
20
|
+
const results = grouped[k];
|
|
21
|
+
console.log(currentLevelMetadata);
|
|
22
|
+
if (currentLevelMetadata.level === currentLevel) {
|
|
23
|
+
nestableObject[`${currentIndex}`] = k;
|
|
24
|
+
}
|
|
25
|
+
for (const result of results) {
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return results;
|
|
30
|
+
};
|
|
31
|
+
exports.nestQueryResults = nestQueryResults;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,22 +1,29 @@
|
|
|
1
1
|
import { ApiHideProperty, ApiProperty, Column, HideField, InputType, ObjectType, OmitType, PartialType, getModelSchemaRef } from './core/types';
|
|
2
|
-
import type { AnyObject, Deleted, PaginatedData, Paginator, Primitives, PrimitivesArray, FluentQuery, QueryOutput, LoadedResult, FindByIdFilter
|
|
2
|
+
import type { AnyObject, Deleted, PaginatedData, Paginator, Primitives, PrimitivesArray, FluentQuery, QueryOutput, LoadedResult, FindByIdFilter } from './types';
|
|
3
3
|
import { LogicOperator } from './types';
|
|
4
4
|
import { BaseConnector } from './BaseConnector';
|
|
5
5
|
import { Collection } from '@goatlab/js-utils';
|
|
6
6
|
import { f } from './decorators';
|
|
7
7
|
import { Fluent } from './Fluent';
|
|
8
|
-
import type { FluentConnectorInterface } from './
|
|
8
|
+
import type { FluentConnectorInterface } from './FluentConnectorInterface';
|
|
9
9
|
import type { SchemaObject } from './core/types';
|
|
10
|
-
import {
|
|
10
|
+
import { TypeOrmConnector } from './TypeOrmConnector/TypeOrmConnector';
|
|
11
11
|
import { getOutputKeys } from './outputKeys';
|
|
12
12
|
import { loadRelations } from './loadRelations';
|
|
13
13
|
import { modelGeneratorDataSource } from './generatorDatasource';
|
|
14
14
|
import { Cache } from './cache';
|
|
15
15
|
import { ValidationError } from 'class-validator';
|
|
16
|
+
import { extractConditions } from './TypeOrmConnector/util/extractConditions';
|
|
17
|
+
import { extractInclude } from './TypeOrmConnector/util/extractInclude';
|
|
18
|
+
import { extractMetadataFromKeys } from './TypeOrmConnector/util/extractMetadataFromKeys';
|
|
19
|
+
import { extractOrderBy } from './TypeOrmConnector/util/extractOrderBy';
|
|
20
|
+
import { getRelationsFromModelGenerator } from './TypeOrmConnector/util/getRelationsFromModelGenerator';
|
|
21
|
+
import { getSelectedKeysFromRawSql } from './TypeOrmConnector/util/getSelectedKeysFromRawSql';
|
|
22
|
+
import { nestQueryResults } from './TypeOrmConnector/util/nestQueryResults';
|
|
16
23
|
export { DataSource } from 'typeorm';
|
|
17
|
-
export { ApiHideProperty, ApiProperty, BaseConnector, Collection, Column, f, Fluent, getModelSchemaRef, getOutputKeys, HideField, InputType, loadRelations, modelGeneratorDataSource, ObjectType, OmitType, PartialType, TypeOrmConnector, Cache, getRelationsFromModelGenerator, LogicOperator };
|
|
24
|
+
export { ApiHideProperty, ApiProperty, BaseConnector, Collection, Column, f, Fluent, getModelSchemaRef, getOutputKeys, HideField, InputType, loadRelations, modelGeneratorDataSource, ObjectType, OmitType, PartialType, TypeOrmConnector, Cache, getRelationsFromModelGenerator, LogicOperator, extractConditions, extractInclude, extractMetadataFromKeys, extractOrderBy, getSelectedKeysFromRawSql, nestQueryResults };
|
|
18
25
|
interface ValidatedInput<T> {
|
|
19
26
|
errors: ValidationError[] | null;
|
|
20
27
|
result: Awaited<T>;
|
|
21
28
|
}
|
|
22
|
-
export type { AnyObject, Deleted, FluentConnectorInterface, PaginatedData, Paginator, Primitives, PrimitivesArray, SchemaObject, ValidatedInput, FluentQuery, QueryOutput, LoadedResult, FindByIdFilter
|
|
29
|
+
export type { AnyObject, Deleted, FluentConnectorInterface, PaginatedData, Paginator, Primitives, PrimitivesArray, SchemaObject, ValidatedInput, FluentQuery, QueryOutput, LoadedResult, FindByIdFilter };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LogicOperator = exports.getRelationsFromModelGenerator = exports.Cache = exports.TypeOrmConnector = exports.PartialType = exports.OmitType = exports.ObjectType = exports.modelGeneratorDataSource = exports.loadRelations = exports.InputType = exports.HideField = exports.getOutputKeys = exports.getModelSchemaRef = exports.Fluent = exports.f = exports.Column = exports.Collection = exports.BaseConnector = exports.ApiProperty = exports.ApiHideProperty = exports.DataSource = void 0;
|
|
3
|
+
exports.nestQueryResults = exports.getSelectedKeysFromRawSql = exports.extractOrderBy = exports.extractMetadataFromKeys = exports.extractInclude = exports.extractConditions = exports.LogicOperator = exports.getRelationsFromModelGenerator = exports.Cache = exports.TypeOrmConnector = exports.PartialType = exports.OmitType = exports.ObjectType = exports.modelGeneratorDataSource = exports.loadRelations = exports.InputType = exports.HideField = exports.getOutputKeys = exports.getModelSchemaRef = exports.Fluent = exports.f = exports.Column = exports.Collection = exports.BaseConnector = exports.ApiProperty = exports.ApiHideProperty = exports.DataSource = void 0;
|
|
4
4
|
const types_1 = require("./core/types");
|
|
5
5
|
Object.defineProperty(exports, "ApiHideProperty", { enumerable: true, get: function () { return types_1.ApiHideProperty; } });
|
|
6
6
|
Object.defineProperty(exports, "ApiProperty", { enumerable: true, get: function () { return types_1.ApiProperty; } });
|
|
@@ -22,7 +22,6 @@ Object.defineProperty(exports, "f", { enumerable: true, get: function () { retur
|
|
|
22
22
|
const Fluent_1 = require("./Fluent");
|
|
23
23
|
Object.defineProperty(exports, "Fluent", { enumerable: true, get: function () { return Fluent_1.Fluent; } });
|
|
24
24
|
const TypeOrmConnector_1 = require("./TypeOrmConnector/TypeOrmConnector");
|
|
25
|
-
Object.defineProperty(exports, "getRelationsFromModelGenerator", { enumerable: true, get: function () { return TypeOrmConnector_1.getRelationsFromModelGenerator; } });
|
|
26
25
|
Object.defineProperty(exports, "TypeOrmConnector", { enumerable: true, get: function () { return TypeOrmConnector_1.TypeOrmConnector; } });
|
|
27
26
|
const outputKeys_1 = require("./outputKeys");
|
|
28
27
|
Object.defineProperty(exports, "getOutputKeys", { enumerable: true, get: function () { return outputKeys_1.getOutputKeys; } });
|
|
@@ -32,5 +31,19 @@ const generatorDatasource_1 = require("./generatorDatasource");
|
|
|
32
31
|
Object.defineProperty(exports, "modelGeneratorDataSource", { enumerable: true, get: function () { return generatorDatasource_1.modelGeneratorDataSource; } });
|
|
33
32
|
const cache_1 = require("./cache");
|
|
34
33
|
Object.defineProperty(exports, "Cache", { enumerable: true, get: function () { return cache_1.Cache; } });
|
|
34
|
+
const extractConditions_1 = require("./TypeOrmConnector/util/extractConditions");
|
|
35
|
+
Object.defineProperty(exports, "extractConditions", { enumerable: true, get: function () { return extractConditions_1.extractConditions; } });
|
|
36
|
+
const extractInclude_1 = require("./TypeOrmConnector/util/extractInclude");
|
|
37
|
+
Object.defineProperty(exports, "extractInclude", { enumerable: true, get: function () { return extractInclude_1.extractInclude; } });
|
|
38
|
+
const extractMetadataFromKeys_1 = require("./TypeOrmConnector/util/extractMetadataFromKeys");
|
|
39
|
+
Object.defineProperty(exports, "extractMetadataFromKeys", { enumerable: true, get: function () { return extractMetadataFromKeys_1.extractMetadataFromKeys; } });
|
|
40
|
+
const extractOrderBy_1 = require("./TypeOrmConnector/util/extractOrderBy");
|
|
41
|
+
Object.defineProperty(exports, "extractOrderBy", { enumerable: true, get: function () { return extractOrderBy_1.extractOrderBy; } });
|
|
42
|
+
const getRelationsFromModelGenerator_1 = require("./TypeOrmConnector/util/getRelationsFromModelGenerator");
|
|
43
|
+
Object.defineProperty(exports, "getRelationsFromModelGenerator", { enumerable: true, get: function () { return getRelationsFromModelGenerator_1.getRelationsFromModelGenerator; } });
|
|
44
|
+
const getSelectedKeysFromRawSql_1 = require("./TypeOrmConnector/util/getSelectedKeysFromRawSql");
|
|
45
|
+
Object.defineProperty(exports, "getSelectedKeysFromRawSql", { enumerable: true, get: function () { return getSelectedKeysFromRawSql_1.getSelectedKeysFromRawSql; } });
|
|
46
|
+
const nestQueryResults_1 = require("./TypeOrmConnector/util/nestQueryResults");
|
|
47
|
+
Object.defineProperty(exports, "nestQueryResults", { enumerable: true, get: function () { return nestQueryResults_1.nestQueryResults; } });
|
|
35
48
|
var typeorm_1 = require("typeorm");
|
|
36
49
|
Object.defineProperty(exports, "DataSource", { enumerable: true, get: function () { return typeorm_1.DataSource; } });
|
package/dist/loadRelations.js
CHANGED
|
@@ -21,14 +21,13 @@ const loadRelations = async ({ data, relations, modelRelations, provider, self,
|
|
|
21
21
|
const chunks = js_utils_1.Arrays.chunk(Array.from(ids), chunkSize);
|
|
22
22
|
const promises = [];
|
|
23
23
|
for (const relatedIds of chunks) {
|
|
24
|
-
|
|
24
|
+
promises.push(Repository.findMany({
|
|
25
25
|
where: {
|
|
26
26
|
[relationModel.inverseSidePropertyPath]: {
|
|
27
27
|
in: relatedIds
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
});
|
|
31
|
-
promises.push(results);
|
|
30
|
+
}));
|
|
32
31
|
}
|
|
33
32
|
const relatedResults = js_utils_1.Arrays.collapse(await Promise.all(promises));
|
|
34
33
|
const grouped = js_utils_1.Arrays.groupBy(relatedResults, r => r[relationModel.inverseSidePropertyPath]);
|
|
@@ -45,14 +44,13 @@ const loadRelations = async ({ data, relations, modelRelations, provider, self,
|
|
|
45
44
|
const chunks = js_utils_1.Arrays.chunk(ids, chunkSize);
|
|
46
45
|
const promises = [];
|
|
47
46
|
for (const relatedIds of chunks) {
|
|
48
|
-
|
|
47
|
+
promises.push(Repository.findMany({
|
|
49
48
|
where: {
|
|
50
49
|
id: {
|
|
51
50
|
in: relatedIds
|
|
52
51
|
}
|
|
53
52
|
}
|
|
54
|
-
});
|
|
55
|
-
promises.push(results);
|
|
53
|
+
}));
|
|
56
54
|
}
|
|
57
55
|
const relatedResults = js_utils_1.Arrays.collapse(await Promise.all(promises));
|
|
58
56
|
const grouped = js_utils_1.Arrays.groupBy(relatedResults, r => r.id);
|
|
@@ -121,10 +119,10 @@ const loadRelations = async ({ data, relations, modelRelations, provider, self,
|
|
|
121
119
|
if (!d[calleeKey]) {
|
|
122
120
|
d[calleeKey] = [];
|
|
123
121
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
122
|
+
const mapped = groupedRelated[gp[relationModel.inverseJoinColumns[0].propertyName]];
|
|
123
|
+
if (mapped) {
|
|
124
|
+
d[calleeKey] = [...d[calleeKey], ...mapped];
|
|
125
|
+
}
|
|
128
126
|
});
|
|
129
127
|
});
|
|
130
128
|
return data;
|