@goatlab/fluent 0.6.24 → 0.7.1
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/README.md +17 -136
- package/dist/BaseConnector.d.ts +45 -75
- package/dist/BaseConnector.js +218 -317
- package/dist/Fluent.d.ts +2 -21
- package/dist/Fluent.js +0 -33
- package/dist/FluentEntity.d.ts +7 -0
- package/dist/FluentEntity.js +28 -0
- package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +31 -24
- package/dist/TypeOrmConnector/TypeOrmConnector.js +599 -343
- package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.js +182 -48
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.d.ts +103 -3
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.js +30 -13
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.js +17 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.js +17 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.d.ts +3 -3
- package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.js +8 -3
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.d.ts +1 -1
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +42 -16
- package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +43 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.js +19 -8
- package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.js +16 -0
- package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.js +16 -0
- package/dist/TypeOrmConnector/test/basic/goat.repository.d.ts +3 -4
- package/dist/TypeOrmConnector/test/basic/goat.repository.js +7 -3
- package/dist/TypeOrmConnector/test/dbEntities.d.ts +6 -6
- package/dist/TypeOrmConnector/test/docker/docker.d.ts +35 -0
- package/dist/TypeOrmConnector/test/docker/docker.js +149 -0
- package/dist/TypeOrmConnector/test/docker/mysql.d.ts +17 -0
- package/dist/TypeOrmConnector/test/docker/mysql.js +132 -0
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +8 -0
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +23 -0
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +4 -0
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +43 -0
- package/dist/TypeOrmConnector/test/mongo/mongoDatasource.d.ts +2 -0
- package/dist/TypeOrmConnector/test/mongo/mongoDatasource.js +12 -0
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +8 -0
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +23 -0
- package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.d.ts +6 -0
- package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.js +17 -0
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +10 -0
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +31 -0
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +6 -0
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +17 -0
- package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.d.ts +2 -0
- package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +16 -0
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +8 -0
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +23 -0
- package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.d.ts +6 -0
- package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.js +17 -0
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +10 -0
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +32 -0
- package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +1 -0
- package/dist/TypeOrmConnector/test/relations/car/car.entity.js +13 -5
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +11 -4
- package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +38 -0
- package/dist/TypeOrmConnector/test/relations/car/car.schema.js +14 -0
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +85 -32
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +35 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +16 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles.entity.js +4 -4
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +12 -4
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.d.ts +2 -2
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.js +4 -4
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.d.ts +15 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.js +9 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.js +8 -3
- package/dist/TypeOrmConnector/test/relations/user/user.entity.js +10 -10
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +17 -5
- package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +150 -0
- package/dist/TypeOrmConnector/test/relations/user/user.schema.js +18 -0
- package/dist/TypeOrmConnector/test/{memoryDataSource.d.ts → sqlite/memoryDataSource.d.ts} +0 -0
- package/dist/TypeOrmConnector/test/{memoryDataSource.js → sqlite/memoryDataSource.js} +1 -1
- package/dist/core/Loopback/build-schema.js +1 -3
- package/dist/core/Loopback/json-to-schema.js +6 -6
- package/dist/core/Loopback/mapValues.d.ts +2 -0
- package/dist/core/Loopback/mapValues.js +835 -0
- package/dist/core/Loopback/query.js +6 -4
- package/dist/core/Loopback/type-resolver.d.ts +1 -1
- package/dist/core/Nestjs/applyDecorators.d.ts +1 -1
- package/dist/core/Nestjs/types/common.js +3 -1
- package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.d.ts +1 -1
- package/dist/core/Nestjs/types/decorators/create-property.decorator.js +9 -4
- package/dist/core/Nestjs/types/decorators/field.decorator.d.ts +1 -1
- package/dist/core/Nestjs/types/decorators/field.decorator.js +6 -6
- package/dist/core/Nestjs/types/lazy-metadata.storage.js +3 -3
- package/dist/core/Nestjs/types/omit-type.js +6 -2
- package/dist/core/Nestjs/types/reflection.utils.d.ts +1 -1
- package/dist/core/Nestjs/types/reflection.utils.js +9 -2
- package/dist/core/Nestjs/types/type-metadata.storage.js +4 -4
- package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.d.ts +1 -11
- package/dist/core/Nestjs/types/utils/mapped-types.utils.js +2 -2
- package/dist/decorators.d.ts +25 -21
- package/dist/decorators.js +76 -70
- package/dist/index.d.ts +6 -7
- package/dist/index.js +5 -7
- package/dist/loadRelations.js +108 -68
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +104 -55
- package/dist/types.js +20 -0
- package/package.json +11 -102
- package/dist/TypeOrmConnector/TypeOrmMongoConnector._bypass.d.ts +0 -1
- package/dist/TypeOrmConnector/TypeOrmMongoConnector._bypass.js +0 -52
- package/dist/TypeOrmConnector/TypeOrmMysqlConnector._bypass.d.ts +0 -1
- package/dist/TypeOrmConnector/TypeOrmMysqlConnector._bypass.js +0 -55
- package/dist/TypeOrmConnector/test/basic/goat.dto.d.ts +0 -8
- package/dist/TypeOrmConnector/test/basic/goat.dto.js +0 -18
- package/dist/TypeOrmConnector/test/relations/car/car.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/car/car.dto.js +0 -12
- package/dist/TypeOrmConnector/test/relations/roles/role.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/roles/role.dto.js +0 -12
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.js +0 -12
- package/dist/TypeOrmConnector/test/relations/user/user.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/user/user.dto.js +0 -12
- package/dist/core/dtos/access.dto.d.ts +0 -4
- package/dist/core/dtos/access.dto.js +0 -21
- package/dist/core/dtos/pagination.dto.d.ts +0 -13
- package/dist/core/dtos/pagination.dto.js +0 -62
package/dist/loadRelations.js
CHANGED
|
@@ -8,86 +8,126 @@ const loadRelations = async ({ data, relations, modelRelations, provider, self,
|
|
|
8
8
|
}
|
|
9
9
|
const chunkSize = provider === 'typeorm' ? 100 : 10;
|
|
10
10
|
for (const relation of Object.keys(relations)) {
|
|
11
|
-
if (modelRelations[relation]) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
11
|
+
if (!modelRelations[relation]) {
|
|
12
|
+
throw new Error(`Relationship does not exist: ${relation}. Did you create it in your DB entity?`);
|
|
13
|
+
}
|
|
14
|
+
if (!self[relation]) {
|
|
15
|
+
throw new Error(`Relationship does not exist: ${relation}. Did you create it in your Repository?`);
|
|
16
|
+
}
|
|
17
|
+
const relationModel = modelRelations[relation];
|
|
18
|
+
const Repository = self[relation]();
|
|
19
|
+
if (relationModel.isOneToMany) {
|
|
20
|
+
const ids = new Set(data.map(d => d.id));
|
|
21
|
+
const chunks = js_utils_1.Arrays.chunk(Array.from(ids), chunkSize);
|
|
22
|
+
const promises = [];
|
|
23
|
+
for (const relatedIds of chunks) {
|
|
24
|
+
const results = await Repository.findMany({
|
|
25
|
+
where: {
|
|
26
|
+
[relationModel.inverseSidePropertyPath]: {
|
|
27
|
+
in: relatedIds
|
|
28
|
+
}
|
|
27
29
|
}
|
|
28
30
|
});
|
|
31
|
+
promises.push(results);
|
|
29
32
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const results = await Model.andWhere(keys => keys.id, 'in', relatedIds).get();
|
|
36
|
-
promises.push(results);
|
|
33
|
+
const relatedResults = js_utils_1.Arrays.collapse(await Promise.all(promises));
|
|
34
|
+
const grouped = js_utils_1.Arrays.groupBy(relatedResults, r => r[relationModel.inverseSidePropertyPath]);
|
|
35
|
+
data.map(d => {
|
|
36
|
+
if (grouped[d.id]) {
|
|
37
|
+
d[relationModel.propertyName] = grouped[d.id];
|
|
37
38
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
return d;
|
|
40
|
+
});
|
|
41
|
+
return data;
|
|
42
|
+
}
|
|
43
|
+
if (relationModel.isManyToOne) {
|
|
44
|
+
const ids = js_utils_1.Arrays.deDuplicate(data.map(d => d[relationModel.joinColumns[0].propertyPath]));
|
|
45
|
+
const chunks = js_utils_1.Arrays.chunk(ids, chunkSize);
|
|
46
|
+
const promises = [];
|
|
47
|
+
for (const relatedIds of chunks) {
|
|
48
|
+
const results = await Repository.findMany({
|
|
49
|
+
where: {
|
|
50
|
+
id: {
|
|
51
|
+
in: relatedIds
|
|
52
|
+
}
|
|
44
53
|
}
|
|
45
54
|
});
|
|
55
|
+
promises.push(results);
|
|
46
56
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (relationModel.joinColumns.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const pivotRepository = self[relationModel.propertyPath]().relationQuery.pivot;
|
|
54
|
-
const promises = [];
|
|
55
|
-
for (const pivotIds of chunks) {
|
|
56
|
-
const results = await pivotRepository
|
|
57
|
-
.where(k => k[relationModel.joinColumns[0].propertyName], 'in', pivotIds)
|
|
58
|
-
.get();
|
|
59
|
-
promises.push(results);
|
|
57
|
+
const relatedResults = js_utils_1.Arrays.collapse(await Promise.all(promises));
|
|
58
|
+
const grouped = js_utils_1.Arrays.groupBy(relatedResults, r => r.id);
|
|
59
|
+
data.map(d => {
|
|
60
|
+
if (grouped[d[relationModel.joinColumns[0].propertyPath]]) {
|
|
61
|
+
d[relationModel.propertyName] =
|
|
62
|
+
grouped[d[relationModel.joinColumns[0].propertyPath]][0];
|
|
60
63
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
64
|
+
});
|
|
65
|
+
return data;
|
|
66
|
+
}
|
|
67
|
+
if (relationModel.isManyToMany) {
|
|
68
|
+
const ids = js_utils_1.Arrays.deDuplicate(data.map(d => d.id));
|
|
69
|
+
const chunks = js_utils_1.Arrays.chunk(ids, chunkSize);
|
|
70
|
+
if (relationModel.joinColumns.length === 0) {
|
|
71
|
+
return data;
|
|
72
|
+
}
|
|
73
|
+
const pivotForeignField = self.modelRelations[relationModel.propertyName].joinColumns[0]
|
|
74
|
+
.propertyPath;
|
|
75
|
+
const inverseForeignField = self.modelRelations[relationModel.propertyName].inverseJoinColumns[0]
|
|
76
|
+
.propertyPath;
|
|
77
|
+
const pivotRepository = Repository?.relatedQuery.pivot;
|
|
78
|
+
const calleeKey = Repository?.relatedQuery.key;
|
|
79
|
+
if (!pivotForeignField ||
|
|
80
|
+
!inverseForeignField ||
|
|
81
|
+
!pivotRepository ||
|
|
82
|
+
!calleeKey) {
|
|
83
|
+
throw new Error('The Many-to-Many relationship is not properly defined.Please check both your Model and Repository');
|
|
84
|
+
}
|
|
85
|
+
const promises = [];
|
|
86
|
+
for (const pivotIds of chunks) {
|
|
87
|
+
const results = await pivotRepository.findMany({
|
|
88
|
+
where: {
|
|
89
|
+
[pivotForeignField]: {
|
|
90
|
+
in: pivotIds
|
|
91
|
+
}
|
|
92
|
+
}
|
|
76
93
|
});
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
94
|
+
promises.push(results);
|
|
95
|
+
}
|
|
96
|
+
const pivotResults = js_utils_1.Arrays.collapse(await Promise.all(promises));
|
|
97
|
+
const uniquePivotIds = pivotResults.map(p => p[inverseForeignField]);
|
|
98
|
+
const relationChunks = js_utils_1.Arrays.chunk(uniquePivotIds, chunkSize);
|
|
99
|
+
const relationPromises = [];
|
|
100
|
+
for (const relatedIds of relationChunks) {
|
|
101
|
+
const results = await Repository.findMany({
|
|
102
|
+
where: {
|
|
103
|
+
id: {
|
|
104
|
+
in: relatedIds
|
|
83
105
|
}
|
|
84
|
-
|
|
85
|
-
...d[relationModel.propertyPath],
|
|
86
|
-
...groupedRelated[gp[relationModel.inverseJoinColumns[0].propertyName]]
|
|
87
|
-
];
|
|
88
|
-
});
|
|
106
|
+
}
|
|
89
107
|
});
|
|
108
|
+
relationPromises.push(results);
|
|
90
109
|
}
|
|
110
|
+
let relatedResults = js_utils_1.Arrays.collapse(await Promise.all(relationPromises));
|
|
111
|
+
relatedResults = relatedResults.map(r => {
|
|
112
|
+
return {
|
|
113
|
+
...r,
|
|
114
|
+
pivot: pivotResults.find(p => p[inverseForeignField] === r.id)
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
const groupedPivot = js_utils_1.Arrays.groupBy(pivotResults, r => r[relationModel.joinColumns[0].propertyName]);
|
|
118
|
+
const groupedRelated = js_utils_1.Arrays.groupBy(relatedResults, r => r.id);
|
|
119
|
+
data.map(d => {
|
|
120
|
+
groupedPivot[d.id]?.forEach(gp => {
|
|
121
|
+
if (!d[calleeKey]) {
|
|
122
|
+
d[calleeKey] = [];
|
|
123
|
+
}
|
|
124
|
+
d[calleeKey] = [
|
|
125
|
+
...d[calleeKey],
|
|
126
|
+
...groupedRelated[gp[relationModel.inverseJoinColumns[0].propertyName]]
|
|
127
|
+
];
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
return data;
|
|
91
131
|
}
|
|
92
132
|
}
|
|
93
133
|
return data;
|