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