@goatlab/fluent 0.7.21 → 0.7.22

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 (260) hide show
  1. package/dist/BaseConnector.d.ts +43 -0
  2. package/dist/BaseConnector.js +258 -0
  3. package/dist/Fluent.d.ts +7 -0
  4. package/dist/Fluent.js +22 -0
  5. package/dist/FluentConnectorInterface.d.ts +17 -0
  6. package/dist/FluentConnectorInterface.js +2 -0
  7. package/dist/FluentEntity.d.ts +7 -0
  8. package/dist/FluentEntity.js +28 -0
  9. package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +38 -0
  10. package/dist/TypeOrmConnector/TypeOrmConnector.js +370 -0
  11. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.d.ts +7 -0
  12. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js +148 -0
  13. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.d.ts +6 -0
  14. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js +45 -0
  15. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoOrderBy.d.ts +4 -0
  16. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoOrderBy.js +19 -0
  17. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.d.ts +4 -0
  18. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js +12 -0
  19. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.d.ts +6 -0
  20. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js +166 -0
  21. package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.d.ts +8 -0
  22. package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js +200 -0
  23. package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.d.ts +6 -0
  24. package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js +207 -0
  25. package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.d.ts +1 -0
  26. package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.js +256 -0
  27. package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.d.ts +116 -0
  28. package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.js +74 -0
  29. package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.d.ts +5 -0
  30. package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.js +17 -0
  31. package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.d.ts +5 -0
  32. package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.js +17 -0
  33. package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.d.ts +5 -0
  34. package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.js +17 -0
  35. package/dist/TypeOrmConnector/test/basic/basicTestSuite.d.ts +1 -0
  36. package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +193 -0
  37. package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +53 -0
  38. package/dist/TypeOrmConnector/test/basic/goat.entity.js +53 -0
  39. package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.d.ts +5 -0
  40. package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.js +16 -0
  41. package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.d.ts +5 -0
  42. package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.js +16 -0
  43. package/dist/TypeOrmConnector/test/basic/goat.repository.d.ts +5 -0
  44. package/dist/TypeOrmConnector/test/basic/goat.repository.js +16 -0
  45. package/dist/TypeOrmConnector/test/dbEntities.d.ts +6 -0
  46. package/dist/TypeOrmConnector/test/dbEntities.js +17 -0
  47. package/dist/TypeOrmConnector/test/docker/docker.d.ts +35 -0
  48. package/dist/TypeOrmConnector/test/docker/docker.js +148 -0
  49. package/dist/TypeOrmConnector/test/docker/mongo.d.ts +16 -0
  50. package/dist/TypeOrmConnector/test/docker/mongo.js +93 -0
  51. package/dist/TypeOrmConnector/test/docker/mysql.d.ts +17 -0
  52. package/dist/TypeOrmConnector/test/docker/mysql.js +132 -0
  53. package/dist/TypeOrmConnector/test/flock.d.ts +4 -0
  54. package/dist/TypeOrmConnector/test/flock.js +25 -0
  55. package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +10 -0
  56. package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +28 -0
  57. package/dist/TypeOrmConnector/test/mongo/mongoDatasource.d.ts +2 -0
  58. package/dist/TypeOrmConnector/test/mongo/mongoDatasource.js +12 -0
  59. package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +9 -0
  60. package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +25 -0
  61. package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.d.ts +6 -0
  62. package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.js +17 -0
  63. package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +10 -0
  64. package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +32 -0
  65. package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +10 -0
  66. package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +26 -0
  67. package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.d.ts +2 -0
  68. package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +16 -0
  69. package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +9 -0
  70. package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +25 -0
  71. package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.d.ts +6 -0
  72. package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.js +17 -0
  73. package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +10 -0
  74. package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +33 -0
  75. package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +7 -0
  76. package/dist/TypeOrmConnector/test/relations/car/car.entity.js +32 -0
  77. package/dist/TypeOrmConnector/test/relations/car/car.output.schema.d.ts +511 -0
  78. package/dist/TypeOrmConnector/test/relations/car/car.output.schema.js +8 -0
  79. package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +10 -0
  80. package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +26 -0
  81. package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +15 -0
  82. package/dist/TypeOrmConnector/test/relations/car/car.schema.js +9 -0
  83. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +1 -0
  84. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +548 -0
  85. package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.d.ts +152 -0
  86. package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.js +14 -0
  87. package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +12 -0
  88. package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +8 -0
  89. package/dist/TypeOrmConnector/test/relations/roles/roles.entity.d.ts +6 -0
  90. package/dist/TypeOrmConnector/test/relations/roles/roles.entity.js +29 -0
  91. package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +9 -0
  92. package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +25 -0
  93. package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.d.ts +5 -0
  94. package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.js +23 -0
  95. package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.d.ts +15 -0
  96. package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.js +9 -0
  97. package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.d.ts +6 -0
  98. package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.js +17 -0
  99. package/dist/TypeOrmConnector/test/relations/user/user.entity.d.ts +14 -0
  100. package/dist/TypeOrmConnector/test/relations/user/user.entity.js +56 -0
  101. package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +10 -0
  102. package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +30 -0
  103. package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +546 -0
  104. package/dist/TypeOrmConnector/test/relations/user/user.schema.js +67 -0
  105. package/dist/TypeOrmConnector/test/sqlite/memoryDataSource.d.ts +2 -0
  106. package/dist/TypeOrmConnector/test/sqlite/memoryDataSource.js +12 -0
  107. package/dist/TypeOrmConnector/util/clearEmpties.d.ts +1 -0
  108. package/dist/TypeOrmConnector/util/clearEmpties.js +25 -0
  109. package/dist/TypeOrmConnector/util/extractConditions.d.ts +6 -0
  110. package/dist/TypeOrmConnector/util/extractConditions.js +80 -0
  111. package/dist/TypeOrmConnector/util/extractInclude.d.ts +2 -0
  112. package/dist/TypeOrmConnector/util/extractInclude.js +25 -0
  113. package/dist/TypeOrmConnector/util/extractMetadataFromKeys.d.ts +12 -0
  114. package/dist/TypeOrmConnector/util/extractMetadataFromKeys.js +42 -0
  115. package/dist/TypeOrmConnector/util/extractOrderBy.d.ts +4 -0
  116. package/dist/TypeOrmConnector/util/extractOrderBy.js +18 -0
  117. package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.d.ts +19 -0
  118. package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.js +26 -0
  119. package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.d.ts +1 -0
  120. package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.js +20 -0
  121. package/dist/TypeOrmConnector/util/isAnyObject.d.ts +1 -0
  122. package/dist/TypeOrmConnector/util/isAnyObject.js +7 -0
  123. package/dist/TypeOrmConnector/util/nestQueryResults.d.ts +2 -0
  124. package/dist/TypeOrmConnector/util/nestQueryResults.js +31 -0
  125. package/dist/cache.d.ts +9 -0
  126. package/dist/cache.js +43 -0
  127. package/dist/core/Loopback/build-schema.d.ts +31 -0
  128. package/dist/core/Loopback/build-schema.js +333 -0
  129. package/dist/core/Loopback/common-types.d.ts +36 -0
  130. package/dist/core/Loopback/common-types.js +13 -0
  131. package/dist/core/Loopback/json-to-schema.d.ts +6 -0
  132. package/dist/core/Loopback/json-to-schema.js +96 -0
  133. package/dist/core/Loopback/mapValues.d.ts +2 -0
  134. package/dist/core/Loopback/mapValues.js +835 -0
  135. package/dist/core/Loopback/metadata.d.ts +9 -0
  136. package/dist/core/Loopback/metadata.js +28 -0
  137. package/dist/core/Loopback/model.d.ts +87 -0
  138. package/dist/core/Loopback/model.js +244 -0
  139. package/dist/core/Loopback/query.d.ts +97 -0
  140. package/dist/core/Loopback/query.js +292 -0
  141. package/dist/core/Loopback/relation.types.d.ts +45 -0
  142. package/dist/core/Loopback/relation.types.js +13 -0
  143. package/dist/core/Loopback/type-resolver.d.ts +7 -0
  144. package/dist/core/Loopback/type-resolver.js +34 -0
  145. package/dist/core/Loopback/type.d.ts +9 -0
  146. package/dist/core/Loopback/type.js +2 -0
  147. package/dist/core/Nestjs/applyDecorators.d.ts +1 -0
  148. package/dist/core/Nestjs/applyDecorators.js +17 -0
  149. package/dist/core/Nestjs/types/common.d.ts +16 -0
  150. package/dist/core/Nestjs/types/common.js +37 -0
  151. package/dist/core/Nestjs/types/decorators/api-hide-property.decorator.d.ts +1 -0
  152. package/dist/core/Nestjs/types/decorators/api-hide-property.decorator.js +7 -0
  153. package/dist/core/Nestjs/types/decorators/api-property.decorator.d.ts +27 -0
  154. package/dist/core/Nestjs/types/decorators/api-property.decorator.js +65 -0
  155. package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.d.ts +5 -0
  156. package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.js +131 -0
  157. package/dist/core/Nestjs/types/decorators/args-type.decorator.d.ts +1 -0
  158. package/dist/core/Nestjs/types/decorators/args-type.decorator.js +19 -0
  159. package/dist/core/Nestjs/types/decorators/create-property.decorator.d.ts +2 -0
  160. package/dist/core/Nestjs/types/decorators/create-property.decorator.js +55 -0
  161. package/dist/core/Nestjs/types/decorators/directive.decorator.d.ts +1 -0
  162. package/dist/core/Nestjs/types/decorators/directive.decorator.js +36 -0
  163. package/dist/core/Nestjs/types/decorators/extensions.decorator.d.ts +1 -0
  164. package/dist/core/Nestjs/types/decorators/extensions.decorator.js +25 -0
  165. package/dist/core/Nestjs/types/decorators/field.decorator.d.ts +15 -0
  166. package/dist/core/Nestjs/types/decorators/field.decorator.js +56 -0
  167. package/dist/core/Nestjs/types/decorators/input-type.decorator.d.ts +7 -0
  168. package/dist/core/Nestjs/types/decorators/input-type.decorator.js +23 -0
  169. package/dist/core/Nestjs/types/decorators/interface-type.decorator.d.ts +9 -0
  170. package/dist/core/Nestjs/types/decorators/interface-type.decorator.js +27 -0
  171. package/dist/core/Nestjs/types/decorators/partial-type.helper.d.ts +3 -0
  172. package/dist/core/Nestjs/types/decorators/partial-type.helper.js +42 -0
  173. package/dist/core/Nestjs/types/errors/cannot-determine-host-type.error.d.ts +3 -0
  174. package/dist/core/Nestjs/types/errors/cannot-determine-host-type.error.js +9 -0
  175. package/dist/core/Nestjs/types/errors/directive-parsing.error.d.ts +3 -0
  176. package/dist/core/Nestjs/types/errors/directive-parsing.error.js +9 -0
  177. package/dist/core/Nestjs/types/errors/unable-to-find-fields.error.d.ts +3 -0
  178. package/dist/core/Nestjs/types/errors/unable-to-find-fields.error.js +9 -0
  179. package/dist/core/Nestjs/types/errors/undefined-type.error.d.ts +3 -0
  180. package/dist/core/Nestjs/types/errors/undefined-type.error.js +10 -0
  181. package/dist/core/Nestjs/types/interfaces/add-class-type-metadata.util.d.ts +3 -0
  182. package/dist/core/Nestjs/types/interfaces/add-class-type-metadata.util.js +10 -0
  183. package/dist/core/Nestjs/types/interfaces/base-type-options.interface.d.ts +5 -0
  184. package/dist/core/Nestjs/types/interfaces/base-type-options.interface.js +2 -0
  185. package/dist/core/Nestjs/types/interfaces/class-decorator-factory.interface.d.ts +5 -0
  186. package/dist/core/Nestjs/types/interfaces/class-decorator-factory.interface.js +2 -0
  187. package/dist/core/Nestjs/types/interfaces/complexity.interface.d.ts +11 -0
  188. package/dist/core/Nestjs/types/interfaces/complexity.interface.js +2 -0
  189. package/dist/core/Nestjs/types/interfaces/field-middleware.interface.d.ts +15 -0
  190. package/dist/core/Nestjs/types/interfaces/field-middleware.interface.js +2 -0
  191. package/dist/core/Nestjs/types/interfaces/open-api-spec.interface.d.ts +235 -0
  192. package/dist/core/Nestjs/types/interfaces/open-api-spec.interface.js +2 -0
  193. package/dist/core/Nestjs/types/interfaces/resolve-type-fn.interface.d.ts +2 -0
  194. package/dist/core/Nestjs/types/interfaces/resolve-type-fn.interface.js +2 -0
  195. package/dist/core/Nestjs/types/interfaces/return-type-func.interface.d.ts +5 -0
  196. package/dist/core/Nestjs/types/interfaces/return-type-func.interface.js +2 -0
  197. package/dist/core/Nestjs/types/interfaces/schema-object-metadata.interface.d.ts +9 -0
  198. package/dist/core/Nestjs/types/interfaces/schema-object-metadata.interface.js +2 -0
  199. package/dist/core/Nestjs/types/interfaces/type-options.interface.d.ts +5 -0
  200. package/dist/core/Nestjs/types/interfaces/type-options.interface.js +2 -0
  201. package/dist/core/Nestjs/types/lazy-metadata.storage.d.ts +15 -0
  202. package/dist/core/Nestjs/types/lazy-metadata.storage.js +67 -0
  203. package/dist/core/Nestjs/types/metadata/class.metadata.d.ts +11 -0
  204. package/dist/core/Nestjs/types/metadata/class.metadata.js +2 -0
  205. package/dist/core/Nestjs/types/metadata/directive.metadata.d.ts +8 -0
  206. package/dist/core/Nestjs/types/metadata/directive.metadata.js +2 -0
  207. package/dist/core/Nestjs/types/metadata/enum.metadata.d.ts +11 -0
  208. package/dist/core/Nestjs/types/metadata/enum.metadata.js +2 -0
  209. package/dist/core/Nestjs/types/metadata/extensions.metadata.d.ts +8 -0
  210. package/dist/core/Nestjs/types/metadata/extensions.metadata.js +2 -0
  211. package/dist/core/Nestjs/types/metadata/index.d.ts +8 -0
  212. package/dist/core/Nestjs/types/metadata/index.js +11 -0
  213. package/dist/core/Nestjs/types/metadata/interface.metadata.d.ts +6 -0
  214. package/dist/core/Nestjs/types/metadata/interface.metadata.js +2 -0
  215. package/dist/core/Nestjs/types/metadata/object-type.metadata.d.ts +4 -0
  216. package/dist/core/Nestjs/types/metadata/object-type.metadata.js +2 -0
  217. package/dist/core/Nestjs/types/metadata/param.metadata.d.ts +18 -0
  218. package/dist/core/Nestjs/types/metadata/param.metadata.js +2 -0
  219. package/dist/core/Nestjs/types/metadata/property.metadata.d.ts +20 -0
  220. package/dist/core/Nestjs/types/metadata/property.metadata.js +2 -0
  221. package/dist/core/Nestjs/types/metadata/resolver.metadata.d.ts +34 -0
  222. package/dist/core/Nestjs/types/metadata/resolver.metadata.js +2 -0
  223. package/dist/core/Nestjs/types/metadata/union.metadata.d.ts +9 -0
  224. package/dist/core/Nestjs/types/metadata/union.metadata.js +2 -0
  225. package/dist/core/Nestjs/types/object-type.decorator.d.ts +8 -0
  226. package/dist/core/Nestjs/types/object-type.decorator.js +25 -0
  227. package/dist/core/Nestjs/types/omit-type.d.ts +2 -0
  228. package/dist/core/Nestjs/types/omit-type.js +34 -0
  229. package/dist/core/Nestjs/types/reflection.utils.d.ts +15 -0
  230. package/dist/core/Nestjs/types/reflection.utils.js +65 -0
  231. package/dist/core/Nestjs/types/set-metadata.decorator.d.ts +4 -0
  232. package/dist/core/Nestjs/types/set-metadata.decorator.js +16 -0
  233. package/dist/core/Nestjs/types/type-metadata.storage.d.ts +69 -0
  234. package/dist/core/Nestjs/types/type-metadata.storage.js +342 -0
  235. package/dist/core/Nestjs/types/utils/enum.utils.d.ts +3 -0
  236. package/dist/core/Nestjs/types/utils/enum.utils.js +29 -0
  237. package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.d.ts +3 -0
  238. package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.js +72 -0
  239. package/dist/core/Nestjs/types/utils/mapped-types.utils.d.ts +2 -0
  240. package/dist/core/Nestjs/types/utils/mapped-types.utils.js +38 -0
  241. package/dist/core/Nestjs/types/utils/model-properties-accessor.d.ts +6 -0
  242. package/dist/core/Nestjs/types/utils/model-properties-accessor.js +36 -0
  243. package/dist/core/Nestjs/types/utils/type-helpers.utils.d.ts +2 -0
  244. package/dist/core/Nestjs/types/utils/type-helpers.utils.js +16 -0
  245. package/dist/core/types.d.ts +23 -0
  246. package/dist/core/types.js +29 -0
  247. package/dist/decorators.d.ts +47 -0
  248. package/dist/decorators.js +104 -0
  249. package/dist/generatorDatasource.d.ts +2 -0
  250. package/dist/generatorDatasource.js +12 -0
  251. package/dist/index.d.ts +29 -0
  252. package/dist/index.js +49 -0
  253. package/dist/loadRelations.d.ts +12 -0
  254. package/dist/loadRelations.js +133 -0
  255. package/dist/outputKeys.d.ts +2 -0
  256. package/dist/outputKeys.js +17 -0
  257. package/dist/tsconfig.tsbuildinfo +1 -0
  258. package/dist/types.d.ts +141 -0
  259. package/dist/types.js +22 -0
  260. package/package.json +1 -1
@@ -0,0 +1,548 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.relationsTestSuite = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ let User;
6
+ let Car;
7
+ let Role;
8
+ const relationsTestSuite = (UserRepo, BelongsToModelF, ManyToManyModelF) => {
9
+ beforeAll(() => {
10
+ User = new UserRepo();
11
+ Car = new BelongsToModelF();
12
+ Role = new ManyToManyModelF();
13
+ });
14
+ const insertRelatedData = async () => {
15
+ const insertedUser = await User.insert({
16
+ name: 'testUser1',
17
+ age: 20
18
+ });
19
+ await User.insert({
20
+ name: 'anotherUser 2',
21
+ age: 24
22
+ });
23
+ const adminRole = await Role.insert({
24
+ name: 'Administrator'
25
+ });
26
+ const user = await User.loadById(insertedUser.id);
27
+ const attachedRole = await user.roles().attach(adminRole.id);
28
+ const associatedCar1 = await user.cars().associate({ name: 'My' });
29
+ const associatedCar2 = await user.cars().associate({ name: 'My new car 2' });
30
+ const associatedCar3 = await user.cars().associate({ name: 'My new car 4' });
31
+ const associatedCar4 = await user.cars().associate({ name: 'My new car 4' });
32
+ return { insertedUser, adminRole };
33
+ };
34
+ test('requireById - Should return valid Object', async () => {
35
+ const insertedUser = await User.insert({
36
+ name: 'testUser',
37
+ age: 20
38
+ });
39
+ expect(typeof insertedUser.id).toBe('string');
40
+ const findById = await User.requireById(insertedUser.id);
41
+ expect(findById.id).toBe(insertedUser.id);
42
+ });
43
+ test('requireById - Should fail if not found', async () => {
44
+ const insertedUser = await User.insert({
45
+ name: 'testUser',
46
+ age: 20
47
+ });
48
+ const [error, found] = await js_utils_1.Promises.try(User.requireById('62ed01e4219a6ab760ae5c50'));
49
+ expect(error?.message).toBe('Object 62ed01e4219a6ab760ae5c50 not found');
50
+ });
51
+ test('loadFirst - Should return a cloned class', async () => {
52
+ const insertedUser = await User.insert({
53
+ name: 'testUser',
54
+ age: 20
55
+ });
56
+ expect(typeof insertedUser.id).toBe('string');
57
+ const user = User.loadFirst({
58
+ where: {
59
+ id: insertedUser.id
60
+ }
61
+ });
62
+ expect(Array.isArray(user)).toBe(false);
63
+ expect(typeof user).toBe('object');
64
+ expect(user).toHaveProperty('associate');
65
+ });
66
+ test('Associate - OneToMany - Should insert data', async () => {
67
+ const insertedUser = await User.insert({
68
+ name: 'testUser',
69
+ age: 20
70
+ });
71
+ expect(typeof insertedUser.id).toBe('string');
72
+ const user = await User.loadById(insertedUser.id);
73
+ const cars = await user.cars().associate({ name: 'Another new car' });
74
+ expect(Array.isArray(cars)).toBe(true);
75
+ expect(cars[0].name).toBe('Another new car');
76
+ expect(cars[0].userId).toBe(insertedUser.id);
77
+ });
78
+ test('Query related model - OneToMany (belongsToMany)', async () => {
79
+ const insertedUser = await User.insert({
80
+ name: 'testUser',
81
+ age: 20
82
+ });
83
+ expect(typeof insertedUser.id).toBe('string');
84
+ const user1 = await User.loadById(insertedUser.id);
85
+ const cars = await user1.cars().associate({ name: 'My new car' });
86
+ expect(Array.isArray(cars)).toBe(true);
87
+ const searchUserWithRelation = await User.findMany({
88
+ where: { id: insertedUser.id },
89
+ include: {
90
+ cars: true
91
+ }
92
+ });
93
+ const firstResult = searchUserWithRelation[0];
94
+ expect(Array.isArray(searchUserWithRelation)).toBe(true);
95
+ expect(Array.isArray(firstResult.cars)).toBe(true);
96
+ expect(firstResult.cars.length > 0).toBe(true);
97
+ expect(firstResult.cars[0].userId).toBe(insertedUser.id);
98
+ const searchCar = await user1.cars().findMany({
99
+ where: { name: 'My new car' },
100
+ include: { user: true }
101
+ });
102
+ expect(Array.isArray(searchCar)).toBe(true);
103
+ expect(searchCar.length > 0).toBe(true);
104
+ expect(searchCar[0].user?.id).toBe(insertedUser.id);
105
+ const searchCar2 = await user1
106
+ .cars()
107
+ .findMany({ where: { name: 'My.......' } });
108
+ expect(Array.isArray(searchCar2)).toBe(true);
109
+ expect(searchCar2.length === 0).toBe(true);
110
+ });
111
+ test('Query related model - ManyToOne (BelongsTo)', async () => {
112
+ const insertedUser = await User.insert({
113
+ name: 'testUser',
114
+ age: 20
115
+ });
116
+ expect(typeof insertedUser.id).toBe('string');
117
+ const user1 = await User.loadById(insertedUser.id);
118
+ await user1.cars().associate({ name: 'My new car' });
119
+ const results = await Car.findMany({
120
+ where: {
121
+ userId: insertedUser.id
122
+ },
123
+ include: {
124
+ user: true
125
+ }
126
+ });
127
+ expect(Array.isArray(results)).toBe(true);
128
+ expect(results.length > 0).toBe(true);
129
+ expect(typeof results[0].user?.name).toBe('string');
130
+ expect(results[0].user['id']).toBe(insertedUser.id);
131
+ });
132
+ test('Include - can load cyclical relations', async () => {
133
+ const { insertedUser } = await insertRelatedData();
134
+ const searchUserWithRelations = await User.findMany({
135
+ where: {
136
+ id: insertedUser.id
137
+ },
138
+ include: {
139
+ cars: {
140
+ include: {
141
+ user: {
142
+ include: {
143
+ cars: {
144
+ include: {
145
+ user: true
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ });
154
+ expect(searchUserWithRelations.length).toBe(1);
155
+ expect(searchUserWithRelations[0].cars?.length).toBe(4);
156
+ expect(searchUserWithRelations[0].cars[0].user?.id).toBe(insertedUser.id);
157
+ expect(searchUserWithRelations[0].cars[0].user?.name).toBe(insertedUser.name);
158
+ expect(searchUserWithRelations[0].cars[0].user?.id).toBe(searchUserWithRelations[0].id);
159
+ expect(searchUserWithRelations[0].cars[0].user?.name).toBe(searchUserWithRelations[0].name);
160
+ expect(searchUserWithRelations[0].cars[0].user?.cars?.length).toBe(4);
161
+ expect(searchUserWithRelations[0].cars[0].user?.cars[0].user?.id).toBe(searchUserWithRelations[0].id);
162
+ });
163
+ test('Include - can filter related models', async () => {
164
+ const { insertedUser } = await insertRelatedData();
165
+ const searchUserWithRelations = await User.findMany({
166
+ where: {
167
+ id: insertedUser.id
168
+ },
169
+ include: {
170
+ cars: {
171
+ select: {
172
+ name: true,
173
+ id: true
174
+ },
175
+ where: {
176
+ name: 'My new car 4'
177
+ },
178
+ include: {
179
+ user: {
180
+ include: {
181
+ cars: {
182
+ where: {
183
+ name: 'My new car XXXxX'
184
+ },
185
+ include: {
186
+ user: true
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
193
+ }
194
+ });
195
+ expect(searchUserWithRelations[0].cars?.length).toBe(2);
196
+ expect(searchUserWithRelations[0].cars[0].name).toBe('My new car 4');
197
+ expect(searchUserWithRelations[0].cars[0].user?.cars?.length).toBe(0);
198
+ });
199
+ test('Include - (One to Many) Should display [] if not found', async () => {
200
+ const { insertedUser } = await insertRelatedData();
201
+ const searchUserWithRelations = await User.findMany({
202
+ where: {
203
+ id: insertedUser.id
204
+ },
205
+ include: {
206
+ cars: {
207
+ where: {
208
+ name: 'My new car XX'
209
+ }
210
+ }
211
+ }
212
+ });
213
+ expect(Array.isArray(searchUserWithRelations[0].cars)).toBe(true);
214
+ expect(searchUserWithRelations[0].cars?.length).toBe(0);
215
+ });
216
+ test('Include - (Many to One) Should display null if not found', async () => {
217
+ const { insertedUser } = await insertRelatedData();
218
+ const insertedCars = await Car.findMany({
219
+ where: {
220
+ userId: insertedUser.id
221
+ },
222
+ select: {
223
+ id: true,
224
+ name: true,
225
+ userId: true,
226
+ user: true
227
+ },
228
+ include: {
229
+ user: {
230
+ where: {
231
+ name: 'JOHN'
232
+ }
233
+ }
234
+ }
235
+ });
236
+ expect(insertedCars[0].user === null || insertedCars[0].user === undefined).toBe(true);
237
+ expect(insertedCars.length).toBe(4);
238
+ });
239
+ test('Include - Should pull info from the main search object if no related data', async () => {
240
+ const { insertedUser } = await insertRelatedData();
241
+ const searchUserWithRelations = await User.findMany({
242
+ select: {
243
+ id: true,
244
+ name: true,
245
+ cars: {
246
+ name: true,
247
+ user: {
248
+ id: true,
249
+ name: true,
250
+ cars: {
251
+ id: true,
252
+ user: true,
253
+ name: true
254
+ }
255
+ }
256
+ }
257
+ },
258
+ where: {
259
+ id: insertedUser.id
260
+ },
261
+ include: {
262
+ cars: {
263
+ select: {
264
+ name: true,
265
+ id: true
266
+ },
267
+ where: {
268
+ name: 'My new car XXX'
269
+ },
270
+ include: {
271
+ user: {
272
+ include: {
273
+ cars: {
274
+ where: {
275
+ name: 'My new car XXXxX'
276
+ },
277
+ include: {
278
+ user: true
279
+ }
280
+ }
281
+ }
282
+ }
283
+ }
284
+ }
285
+ }
286
+ });
287
+ expect(searchUserWithRelations[0].id).toBe(insertedUser.id);
288
+ expect(searchUserWithRelations[0].name).toBe(insertedUser.name);
289
+ expect(searchUserWithRelations[0].cars?.length).toBe(0);
290
+ });
291
+ test('Include - Can filter and select specific keys', async () => {
292
+ const { insertedUser } = await insertRelatedData();
293
+ const searchUserWithRelations = await User.findMany({
294
+ select: {
295
+ id: true,
296
+ name: true,
297
+ age: true,
298
+ cars: {
299
+ name: true,
300
+ user: {
301
+ id: true,
302
+ name: true,
303
+ cars: {
304
+ id: true,
305
+ user: true,
306
+ name: true
307
+ }
308
+ }
309
+ }
310
+ },
311
+ where: {
312
+ id: insertedUser.id
313
+ },
314
+ include: {
315
+ cars: {
316
+ select: {
317
+ name: true,
318
+ id: true
319
+ },
320
+ where: {
321
+ name: 'My new car 4'
322
+ },
323
+ include: {
324
+ user: {
325
+ include: {
326
+ cars: {
327
+ where: {
328
+ name: 'My new car XXXxX'
329
+ },
330
+ include: {
331
+ user: true
332
+ }
333
+ }
334
+ }
335
+ }
336
+ }
337
+ }
338
+ }
339
+ });
340
+ expect(searchUserWithRelations[0]).toHaveProperty('age');
341
+ expect(searchUserWithRelations[0].age).toBe(insertedUser.age);
342
+ expect(searchUserWithRelations[0]).not.toHaveProperty('breed');
343
+ });
344
+ test('Include - Should filter keys from nested objects', async () => {
345
+ const { insertedUser } = await insertRelatedData();
346
+ const searchUserWithRelations = await User.findMany({
347
+ select: {
348
+ id: true,
349
+ name: true,
350
+ cars: {
351
+ name: true,
352
+ user: {
353
+ id: true,
354
+ name: true,
355
+ cars: {
356
+ id: true,
357
+ user: true,
358
+ name: true
359
+ }
360
+ }
361
+ }
362
+ },
363
+ where: {
364
+ id: insertedUser.id
365
+ },
366
+ include: {
367
+ cars: {
368
+ select: {
369
+ name: true
370
+ },
371
+ where: {
372
+ name: 'My new car 4'
373
+ },
374
+ include: {
375
+ user: {
376
+ select: {
377
+ id: true,
378
+ name: true
379
+ },
380
+ include: {
381
+ cars: {
382
+ where: {
383
+ name: 'My new car XXXxX'
384
+ },
385
+ include: {
386
+ user: true
387
+ }
388
+ }
389
+ }
390
+ }
391
+ }
392
+ }
393
+ }
394
+ });
395
+ expect(searchUserWithRelations[0].cars[0]).not.toHaveProperty('id');
396
+ expect(searchUserWithRelations[0].cars[0]).not.toHaveProperty('userId');
397
+ expect(searchUserWithRelations[0].cars[0]).toHaveProperty('user');
398
+ expect(searchUserWithRelations[0].cars[0].name).toBe('My new car 4');
399
+ expect(searchUserWithRelations[0].cars[0].user).not.toHaveProperty('age');
400
+ expect(searchUserWithRelations[0].cars[0].user).not.toHaveProperty('breed');
401
+ expect(searchUserWithRelations[0].cars[0].user?.id).toBe(insertedUser.id);
402
+ });
403
+ test('Include - Can select keys using main select or nested selects', async () => {
404
+ const { insertedUser } = await insertRelatedData();
405
+ await User.findMany({
406
+ select: {
407
+ id: true,
408
+ name: true,
409
+ cars: {
410
+ name: true,
411
+ user: {
412
+ id: true,
413
+ name: true,
414
+ cars: {
415
+ id: true,
416
+ user: true,
417
+ name: true
418
+ }
419
+ }
420
+ }
421
+ },
422
+ where: {
423
+ id: insertedUser.id
424
+ },
425
+ include: {
426
+ cars: {
427
+ select: {
428
+ name: true,
429
+ id: true
430
+ },
431
+ where: {
432
+ name: 'My new car 4'
433
+ },
434
+ include: {
435
+ user: {
436
+ include: {
437
+ cars: {
438
+ where: {
439
+ name: 'My new car XXXxX'
440
+ },
441
+ include: {
442
+ user: true
443
+ }
444
+ }
445
+ }
446
+ }
447
+ }
448
+ }
449
+ }
450
+ });
451
+ });
452
+ test('Include - (Many to Many) should display [] if not found', async () => {
453
+ const { insertedUser } = await insertRelatedData();
454
+ await User.findMany({
455
+ select: {
456
+ id: true,
457
+ name: true,
458
+ cars: {
459
+ name: true,
460
+ user: {
461
+ id: true,
462
+ name: true,
463
+ cars: {
464
+ id: true,
465
+ user: true,
466
+ name: true
467
+ }
468
+ }
469
+ }
470
+ },
471
+ where: {
472
+ id: insertedUser.id
473
+ },
474
+ include: {
475
+ cars: {
476
+ select: {
477
+ name: true,
478
+ id: true
479
+ },
480
+ where: {
481
+ name: 'My new car 4'
482
+ },
483
+ include: {
484
+ user: {
485
+ include: {
486
+ cars: {
487
+ where: {
488
+ name: 'My new car XXXxX'
489
+ },
490
+ include: {
491
+ user: true
492
+ }
493
+ }
494
+ }
495
+ }
496
+ }
497
+ }
498
+ }
499
+ });
500
+ });
501
+ test('Query related model - ManyToMany', async () => {
502
+ const insertedUser = await User.insert({
503
+ name: 'testUser',
504
+ age: 20
505
+ });
506
+ expect(typeof insertedUser.id).toBe('string');
507
+ const adminRole = await Role.insert({
508
+ name: 'Administrator'
509
+ });
510
+ const user = await User.loadById(insertedUser.id);
511
+ const attached = await user.roles().attach(adminRole.id);
512
+ expect(attached[0].userId).toBe(insertedUser.id);
513
+ expect(attached[0].roleId).toBe(adminRole.id);
514
+ const searchUserWithRelation = await User.findMany({
515
+ where: {
516
+ id: insertedUser.id
517
+ },
518
+ include: {
519
+ roles: {
520
+ withPivot: true
521
+ }
522
+ }
523
+ });
524
+ expect(Array.isArray(searchUserWithRelation[0].roles)).toBe(true);
525
+ expect(searchUserWithRelation[0].roles.length > 0).toBe(true);
526
+ expect(typeof searchUserWithRelation[0].roles[0].name).toBe('string');
527
+ expect(searchUserWithRelation[0].roles[0].id).toBe(adminRole.id);
528
+ expect(searchUserWithRelation[0].roles[0].pivot.id).toBe(attached[0].id);
529
+ const roles = await Role.findMany({
530
+ where: {
531
+ name: 'Administrator'
532
+ },
533
+ include: {
534
+ users: { withPivot: true }
535
+ }
536
+ });
537
+ expect(Array.isArray(roles)).toBe(true);
538
+ expect(roles.length > 0).toBe(true);
539
+ expect(typeof roles[0].users[0].name).toBe('string');
540
+ expect(typeof roles[0].users[0].age).toBe('number');
541
+ expect(roles[0].users[0].pivot).toBeDefined();
542
+ expect(roles[0].users[0].id).toBe(roles[0].users[0].pivot.userId);
543
+ expect(roles.some(r => {
544
+ return r.users.some(u => u.id === insertedUser.id);
545
+ })).toBe(true);
546
+ });
547
+ };
548
+ exports.relationsTestSuite = relationsTestSuite;
@@ -0,0 +1,152 @@
1
+ import { z } from 'zod';
2
+ export declare const userWithPivot: z.ZodObject<z.extendShape<{
3
+ id: z.ZodOptional<z.ZodString>;
4
+ name: z.ZodString;
5
+ age: z.ZodOptional<z.ZodNumber>;
6
+ breed: z.ZodOptional<z.ZodObject<{
7
+ family: z.ZodOptional<z.ZodString>;
8
+ members: z.ZodOptional<z.ZodNumber>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ family?: string | undefined;
11
+ members?: number | undefined;
12
+ }, {
13
+ family?: string | undefined;
14
+ members?: number | undefined;
15
+ }>>;
16
+ }, {
17
+ pivot: z.ZodOptional<z.ZodObject<{
18
+ id: z.ZodOptional<z.ZodString>;
19
+ userId: z.ZodString;
20
+ roleId: z.ZodString;
21
+ }, "strip", z.ZodTypeAny, {
22
+ id?: string | undefined;
23
+ roleId: string;
24
+ userId: string;
25
+ }, {
26
+ id?: string | undefined;
27
+ roleId: string;
28
+ userId: string;
29
+ }>>;
30
+ }>, "strip", z.ZodTypeAny, {
31
+ pivot?: {
32
+ id?: string | undefined;
33
+ roleId: string;
34
+ userId: string;
35
+ } | undefined;
36
+ id?: string | undefined;
37
+ age?: number | undefined;
38
+ breed?: {
39
+ family?: string | undefined;
40
+ members?: number | undefined;
41
+ } | undefined;
42
+ name: string;
43
+ }, {
44
+ pivot?: {
45
+ id?: string | undefined;
46
+ roleId: string;
47
+ userId: string;
48
+ } | undefined;
49
+ id?: string | undefined;
50
+ age?: number | undefined;
51
+ breed?: {
52
+ family?: string | undefined;
53
+ members?: number | undefined;
54
+ } | undefined;
55
+ name: string;
56
+ }>;
57
+ export declare const RoleOuputSchema: z.ZodObject<z.extendShape<{
58
+ id: z.ZodOptional<z.ZodString>;
59
+ name: z.ZodString;
60
+ }, {
61
+ id: z.ZodString;
62
+ users: z.ZodOptional<z.ZodArray<z.ZodObject<z.extendShape<{
63
+ id: z.ZodOptional<z.ZodString>;
64
+ name: z.ZodString;
65
+ age: z.ZodOptional<z.ZodNumber>;
66
+ breed: z.ZodOptional<z.ZodObject<{
67
+ family: z.ZodOptional<z.ZodString>;
68
+ members: z.ZodOptional<z.ZodNumber>;
69
+ }, "strip", z.ZodTypeAny, {
70
+ family?: string | undefined;
71
+ members?: number | undefined;
72
+ }, {
73
+ family?: string | undefined;
74
+ members?: number | undefined;
75
+ }>>;
76
+ }, {
77
+ pivot: z.ZodOptional<z.ZodObject<{
78
+ id: z.ZodOptional<z.ZodString>;
79
+ userId: z.ZodString;
80
+ roleId: z.ZodString;
81
+ }, "strip", z.ZodTypeAny, {
82
+ id?: string | undefined;
83
+ roleId: string;
84
+ userId: string;
85
+ }, {
86
+ id?: string | undefined;
87
+ roleId: string;
88
+ userId: string;
89
+ }>>;
90
+ }>, "strip", z.ZodTypeAny, {
91
+ pivot?: {
92
+ id?: string | undefined;
93
+ roleId: string;
94
+ userId: string;
95
+ } | undefined;
96
+ id?: string | undefined;
97
+ age?: number | undefined;
98
+ breed?: {
99
+ family?: string | undefined;
100
+ members?: number | undefined;
101
+ } | undefined;
102
+ name: string;
103
+ }, {
104
+ pivot?: {
105
+ id?: string | undefined;
106
+ roleId: string;
107
+ userId: string;
108
+ } | undefined;
109
+ id?: string | undefined;
110
+ age?: number | undefined;
111
+ breed?: {
112
+ family?: string | undefined;
113
+ members?: number | undefined;
114
+ } | undefined;
115
+ name: string;
116
+ }>, "many">>;
117
+ }>, "strip", z.ZodTypeAny, {
118
+ users?: {
119
+ pivot?: {
120
+ id?: string | undefined;
121
+ roleId: string;
122
+ userId: string;
123
+ } | undefined;
124
+ id?: string | undefined;
125
+ age?: number | undefined;
126
+ breed?: {
127
+ family?: string | undefined;
128
+ members?: number | undefined;
129
+ } | undefined;
130
+ name: string;
131
+ }[] | undefined;
132
+ id: string;
133
+ name: string;
134
+ }, {
135
+ users?: {
136
+ pivot?: {
137
+ id?: string | undefined;
138
+ roleId: string;
139
+ userId: string;
140
+ } | undefined;
141
+ id?: string | undefined;
142
+ age?: number | undefined;
143
+ breed?: {
144
+ family?: string | undefined;
145
+ members?: number | undefined;
146
+ } | undefined;
147
+ name: string;
148
+ }[] | undefined;
149
+ id: string;
150
+ name: string;
151
+ }>;
152
+ export declare type RoleDtoOut = z.infer<typeof RoleOuputSchema>;