@goatlab/fluent 0.7.6 → 0.7.9

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 (274) hide show
  1. package/dist/{BaseConnector.d.ts → fluent/src/BaseConnector.d.ts} +8 -31
  2. package/dist/{BaseConnector.js → fluent/src/BaseConnector.js} +11 -104
  3. package/dist/{Fluent.d.ts → fluent/src/Fluent.d.ts} +0 -0
  4. package/dist/{Fluent.js → fluent/src/Fluent.js} +0 -0
  5. package/dist/fluent/src/FluentConnectorInterface.d.ts +17 -0
  6. package/dist/{core/Loopback/type.js → fluent/src/FluentConnectorInterface.js} +0 -0
  7. package/dist/{FluentEntity.d.ts → fluent/src/FluentEntity.d.ts} +0 -0
  8. package/dist/{FluentEntity.js → fluent/src/FluentEntity.js} +0 -0
  9. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/TypeOrmConnector.d.ts +8 -12
  10. package/dist/fluent/src/TypeOrmConnector/TypeOrmConnector.js +397 -0
  11. package/dist/fluent/src/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.d.ts +7 -0
  12. package/dist/fluent/src/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js +148 -0
  13. package/dist/fluent/src/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.d.ts +6 -0
  14. package/dist/fluent/src/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js +34 -0
  15. package/dist/fluent/src/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.d.ts +4 -0
  16. package/dist/fluent/src/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js +12 -0
  17. package/dist/fluent/src/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.d.ts +6 -0
  18. package/dist/fluent/src/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js +166 -0
  19. package/dist/fluent/src/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.d.ts +8 -0
  20. package/dist/fluent/src/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js +200 -0
  21. package/dist/fluent/src/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.d.ts +6 -0
  22. package/dist/fluent/src/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js +207 -0
  23. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/advancedTestSuite.d.ts +0 -0
  24. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/advancedTestSuite.js +0 -0
  25. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/typeOrm.entity.d.ts +0 -0
  26. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/typeOrm.entity.js +0 -0
  27. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/typeOrm.mongo.repository.d.ts +0 -0
  28. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/typeOrm.mongo.repository.js +0 -0
  29. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/typeOrm.mysql.repository.d.ts +0 -0
  30. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/typeOrm.mysql.repository.js +0 -0
  31. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/typeOrm.repository.d.ts +0 -0
  32. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/advanced/typeOrm.repository.js +0 -0
  33. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/basic/basicTestSuite.d.ts +0 -0
  34. package/dist/fluent/src/TypeOrmConnector/test/basic/basicTestSuite.js +183 -0
  35. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/basic/goat.entity.d.ts +3 -3
  36. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/basic/goat.entity.js +1 -1
  37. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/basic/goat.mongo.repository.d.ts +0 -0
  38. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/basic/goat.mongo.repository.js +0 -0
  39. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/basic/goat.mysql.repository.d.ts +0 -0
  40. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/basic/goat.mysql.repository.js +0 -0
  41. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/basic/goat.repository.d.ts +0 -0
  42. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/basic/goat.repository.js +0 -0
  43. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/dbEntities.d.ts +0 -0
  44. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/dbEntities.js +0 -0
  45. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/docker/docker.d.ts +1 -1
  46. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/docker/docker.js +3 -4
  47. package/dist/fluent/src/TypeOrmConnector/test/docker/mongo.d.ts +16 -0
  48. package/dist/fluent/src/TypeOrmConnector/test/docker/mongo.js +93 -0
  49. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/docker/mysql.d.ts +0 -0
  50. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/docker/mysql.js +1 -1
  51. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/flock.d.ts +0 -0
  52. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/flock.js +0 -0
  53. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/car.mongo.repository.d.ts +4 -2
  54. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/car.mongo.repository.js +6 -1
  55. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/mongoDatasource.d.ts +0 -0
  56. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/mongoDatasource.js +0 -0
  57. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/roles.mongo.repository.d.ts +3 -2
  58. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/roles.mongo.repository.js +3 -1
  59. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/roles_user.mongo.repository.d.ts +0 -0
  60. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/roles_user.mongo.repository.js +0 -0
  61. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/user.mongo.repository.d.ts +2 -2
  62. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mongo/user.mongo.repository.js +2 -1
  63. package/dist/fluent/src/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +10 -0
  64. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mysql/car.mysql.repository.js +10 -1
  65. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mysql/mysqlDataSource.d.ts +0 -0
  66. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mysql/mysqlDataSource.js +1 -1
  67. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mysql/roles.mysql.repository.d.ts +3 -2
  68. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mysql/roles.mysql.repository.js +3 -1
  69. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mysql/roles_user.mysql.repository.d.ts +0 -0
  70. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mysql/roles_user.mysql.repository.js +0 -0
  71. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mysql/user.mysql.repository.d.ts +2 -2
  72. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/mysql/user.mysql.repository.js +2 -1
  73. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/car/car.entity.d.ts +0 -1
  74. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/car/car.entity.js +0 -8
  75. package/dist/fluent/src/TypeOrmConnector/test/relations/car/car.output.schema.d.ts +511 -0
  76. package/dist/fluent/src/TypeOrmConnector/test/relations/car/car.output.schema.js +8 -0
  77. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/car/car.repositoryTypeOrm.d.ts +4 -2
  78. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/car/car.repositoryTypeOrm.js +6 -1
  79. package/dist/fluent/src/TypeOrmConnector/test/relations/car/car.schema.d.ts +15 -0
  80. package/dist/fluent/src/TypeOrmConnector/test/relations/car/car.schema.js +9 -0
  81. package/dist/fluent/src/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +1 -0
  82. package/dist/fluent/src/TypeOrmConnector/test/relations/relationsTestsSuite.js +549 -0
  83. package/dist/fluent/src/TypeOrmConnector/test/relations/roles/role.output.schema.d.ts +152 -0
  84. package/dist/fluent/src/TypeOrmConnector/test/relations/roles/role.output.schema.js +14 -0
  85. package/dist/fluent/src/TypeOrmConnector/test/relations/roles/role.schema.d.ts +12 -0
  86. package/dist/fluent/src/TypeOrmConnector/test/relations/roles/role.schema.js +8 -0
  87. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles.entity.d.ts +0 -0
  88. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles.entity.js +0 -0
  89. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -2
  90. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles.repositoryTypeOrm.js +3 -1
  91. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles_user.entity.d.ts +0 -0
  92. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles_user.entity.js +0 -0
  93. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles_user.schema.d.ts +0 -0
  94. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles_user.schema.js +0 -0
  95. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles_users.repositoryTypeOrm.d.ts +0 -0
  96. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/roles/roles_users.repositoryTypeOrm.js +0 -0
  97. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/user/user.entity.d.ts +0 -0
  98. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/user/user.entity.js +0 -0
  99. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/user/user.repositoryTypeOrm.d.ts +2 -2
  100. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/relations/user/user.repositoryTypeOrm.js +2 -1
  101. package/dist/fluent/src/TypeOrmConnector/test/relations/user/user.schema.d.ts +546 -0
  102. package/dist/fluent/src/TypeOrmConnector/test/relations/user/user.schema.js +67 -0
  103. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/sqlite/memoryDataSource.d.ts +0 -0
  104. package/dist/{TypeOrmConnector → fluent/src/TypeOrmConnector}/test/sqlite/memoryDataSource.js +0 -0
  105. package/dist/fluent/src/TypeOrmConnector/util/clearEmpties.d.ts +1 -0
  106. package/dist/fluent/src/TypeOrmConnector/util/clearEmpties.js +25 -0
  107. package/dist/fluent/src/TypeOrmConnector/util/extractConditions.d.ts +6 -0
  108. package/dist/fluent/src/TypeOrmConnector/util/extractConditions.js +80 -0
  109. package/dist/fluent/src/TypeOrmConnector/util/extractInclude.d.ts +2 -0
  110. package/dist/fluent/src/TypeOrmConnector/util/extractInclude.js +25 -0
  111. package/dist/fluent/src/TypeOrmConnector/util/extractMetadataFromKeys.d.ts +12 -0
  112. package/dist/fluent/src/TypeOrmConnector/util/extractMetadataFromKeys.js +42 -0
  113. package/dist/fluent/src/TypeOrmConnector/util/extractOrderBy.d.ts +4 -0
  114. package/dist/fluent/src/TypeOrmConnector/util/extractOrderBy.js +18 -0
  115. package/dist/fluent/src/TypeOrmConnector/util/getRelationsFromModelGenerator.d.ts +19 -0
  116. package/dist/fluent/src/TypeOrmConnector/util/getRelationsFromModelGenerator.js +26 -0
  117. package/dist/fluent/src/TypeOrmConnector/util/getSelectedKeysFromRawSql.d.ts +1 -0
  118. package/dist/fluent/src/TypeOrmConnector/util/getSelectedKeysFromRawSql.js +20 -0
  119. package/dist/fluent/src/TypeOrmConnector/util/isAnyObject.d.ts +1 -0
  120. package/dist/fluent/src/TypeOrmConnector/util/isAnyObject.js +7 -0
  121. package/dist/fluent/src/TypeOrmConnector/util/nestQueryResults.d.ts +2 -0
  122. package/dist/fluent/src/TypeOrmConnector/util/nestQueryResults.js +31 -0
  123. package/dist/{cache.d.ts → fluent/src/cache.d.ts} +0 -0
  124. package/dist/{cache.js → fluent/src/cache.js} +0 -0
  125. package/dist/{core → fluent/src/core}/Loopback/build-schema.d.ts +0 -0
  126. package/dist/{core → fluent/src/core}/Loopback/build-schema.js +0 -0
  127. package/dist/{core → fluent/src/core}/Loopback/common-types.d.ts +0 -0
  128. package/dist/{core → fluent/src/core}/Loopback/common-types.js +0 -0
  129. package/dist/{core → fluent/src/core}/Loopback/json-to-schema.d.ts +0 -0
  130. package/dist/{core → fluent/src/core}/Loopback/json-to-schema.js +0 -0
  131. package/dist/{core → fluent/src/core}/Loopback/mapValues.d.ts +0 -0
  132. package/dist/{core → fluent/src/core}/Loopback/mapValues.js +0 -0
  133. package/dist/{core → fluent/src/core}/Loopback/metadata.d.ts +0 -0
  134. package/dist/{core → fluent/src/core}/Loopback/metadata.js +0 -0
  135. package/dist/{core → fluent/src/core}/Loopback/model.d.ts +0 -0
  136. package/dist/{core → fluent/src/core}/Loopback/model.js +0 -0
  137. package/dist/{core → fluent/src/core}/Loopback/query.d.ts +0 -0
  138. package/dist/{core → fluent/src/core}/Loopback/query.js +0 -0
  139. package/dist/{core → fluent/src/core}/Loopback/relation.types.d.ts +0 -0
  140. package/dist/{core → fluent/src/core}/Loopback/relation.types.js +0 -0
  141. package/dist/{core → fluent/src/core}/Loopback/type-resolver.d.ts +0 -0
  142. package/dist/{core → fluent/src/core}/Loopback/type-resolver.js +0 -0
  143. package/dist/{core → fluent/src/core}/Loopback/type.d.ts +0 -0
  144. package/dist/{core/Nestjs/types/interfaces/base-type-options.interface.js → fluent/src/core/Loopback/type.js} +0 -0
  145. package/dist/{core → fluent/src/core}/Nestjs/applyDecorators.d.ts +0 -0
  146. package/dist/{core → fluent/src/core}/Nestjs/applyDecorators.js +0 -0
  147. package/dist/{core → fluent/src/core}/Nestjs/types/common.d.ts +0 -0
  148. package/dist/{core → fluent/src/core}/Nestjs/types/common.js +0 -0
  149. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/api-hide-property.decorator.d.ts +0 -0
  150. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/api-hide-property.decorator.js +0 -0
  151. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/api-property.decorator.d.ts +0 -0
  152. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/api-property.decorator.js +0 -0
  153. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/apply-is-optional.decorator.d.ts +0 -0
  154. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/apply-is-optional.decorator.js +0 -0
  155. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/args-type.decorator.d.ts +0 -0
  156. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/args-type.decorator.js +0 -0
  157. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/create-property.decorator.d.ts +0 -0
  158. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/create-property.decorator.js +0 -0
  159. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/directive.decorator.d.ts +0 -0
  160. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/directive.decorator.js +0 -0
  161. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/extensions.decorator.d.ts +0 -0
  162. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/extensions.decorator.js +0 -0
  163. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/field.decorator.d.ts +0 -0
  164. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/field.decorator.js +0 -0
  165. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/input-type.decorator.d.ts +0 -0
  166. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/input-type.decorator.js +0 -0
  167. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/interface-type.decorator.d.ts +0 -0
  168. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/interface-type.decorator.js +0 -0
  169. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/partial-type.helper.d.ts +0 -0
  170. package/dist/{core → fluent/src/core}/Nestjs/types/decorators/partial-type.helper.js +0 -0
  171. package/dist/{core → fluent/src/core}/Nestjs/types/errors/cannot-determine-host-type.error.d.ts +0 -0
  172. package/dist/{core → fluent/src/core}/Nestjs/types/errors/cannot-determine-host-type.error.js +0 -0
  173. package/dist/{core → fluent/src/core}/Nestjs/types/errors/directive-parsing.error.d.ts +0 -0
  174. package/dist/{core → fluent/src/core}/Nestjs/types/errors/directive-parsing.error.js +0 -0
  175. package/dist/{core → fluent/src/core}/Nestjs/types/errors/unable-to-find-fields.error.d.ts +0 -0
  176. package/dist/{core → fluent/src/core}/Nestjs/types/errors/unable-to-find-fields.error.js +0 -0
  177. package/dist/{core → fluent/src/core}/Nestjs/types/errors/undefined-type.error.d.ts +0 -0
  178. package/dist/{core → fluent/src/core}/Nestjs/types/errors/undefined-type.error.js +0 -0
  179. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/add-class-type-metadata.util.d.ts +0 -0
  180. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/add-class-type-metadata.util.js +0 -0
  181. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/base-type-options.interface.d.ts +0 -0
  182. package/dist/{core/Nestjs/types/interfaces/class-decorator-factory.interface.js → fluent/src/core/Nestjs/types/interfaces/base-type-options.interface.js} +0 -0
  183. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/class-decorator-factory.interface.d.ts +0 -0
  184. package/dist/{core/Nestjs/types/interfaces/complexity.interface.js → fluent/src/core/Nestjs/types/interfaces/class-decorator-factory.interface.js} +0 -0
  185. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/complexity.interface.d.ts +0 -0
  186. package/dist/{core/Nestjs/types/interfaces/field-middleware.interface.js → fluent/src/core/Nestjs/types/interfaces/complexity.interface.js} +0 -0
  187. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/field-middleware.interface.d.ts +0 -0
  188. package/dist/{core/Nestjs/types/interfaces/open-api-spec.interface.js → fluent/src/core/Nestjs/types/interfaces/field-middleware.interface.js} +0 -0
  189. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/open-api-spec.interface.d.ts +0 -0
  190. package/dist/{core/Nestjs/types/interfaces/resolve-type-fn.interface.js → fluent/src/core/Nestjs/types/interfaces/open-api-spec.interface.js} +0 -0
  191. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/resolve-type-fn.interface.d.ts +0 -0
  192. package/dist/{core/Nestjs/types/interfaces/return-type-func.interface.js → fluent/src/core/Nestjs/types/interfaces/resolve-type-fn.interface.js} +0 -0
  193. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/return-type-func.interface.d.ts +0 -0
  194. package/dist/{core/Nestjs/types/interfaces/schema-object-metadata.interface.js → fluent/src/core/Nestjs/types/interfaces/return-type-func.interface.js} +0 -0
  195. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/schema-object-metadata.interface.d.ts +0 -0
  196. package/dist/{core/Nestjs/types/interfaces/type-options.interface.js → fluent/src/core/Nestjs/types/interfaces/schema-object-metadata.interface.js} +0 -0
  197. package/dist/{core → fluent/src/core}/Nestjs/types/interfaces/type-options.interface.d.ts +0 -0
  198. package/dist/{core/Nestjs/types/metadata/class.metadata.js → fluent/src/core/Nestjs/types/interfaces/type-options.interface.js} +0 -0
  199. package/dist/{core → fluent/src/core}/Nestjs/types/lazy-metadata.storage.d.ts +0 -0
  200. package/dist/{core → fluent/src/core}/Nestjs/types/lazy-metadata.storage.js +0 -0
  201. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/class.metadata.d.ts +0 -0
  202. package/dist/{core/Nestjs/types/metadata/directive.metadata.js → fluent/src/core/Nestjs/types/metadata/class.metadata.js} +0 -0
  203. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/directive.metadata.d.ts +0 -0
  204. package/dist/{core/Nestjs/types/metadata/enum.metadata.js → fluent/src/core/Nestjs/types/metadata/directive.metadata.js} +0 -0
  205. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/enum.metadata.d.ts +0 -0
  206. package/dist/{core/Nestjs/types/metadata/extensions.metadata.js → fluent/src/core/Nestjs/types/metadata/enum.metadata.js} +0 -0
  207. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/extensions.metadata.d.ts +0 -0
  208. package/dist/{core/Nestjs/types/metadata/interface.metadata.js → fluent/src/core/Nestjs/types/metadata/extensions.metadata.js} +0 -0
  209. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/index.d.ts +0 -0
  210. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/index.js +0 -0
  211. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/interface.metadata.d.ts +0 -0
  212. package/dist/{core/Nestjs/types/metadata/object-type.metadata.js → fluent/src/core/Nestjs/types/metadata/interface.metadata.js} +0 -0
  213. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/object-type.metadata.d.ts +0 -0
  214. package/dist/{core/Nestjs/types/metadata/param.metadata.js → fluent/src/core/Nestjs/types/metadata/object-type.metadata.js} +0 -0
  215. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/param.metadata.d.ts +0 -0
  216. package/dist/{core/Nestjs/types/metadata/property.metadata.js → fluent/src/core/Nestjs/types/metadata/param.metadata.js} +0 -0
  217. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/property.metadata.d.ts +0 -0
  218. package/dist/{core/Nestjs/types/metadata/resolver.metadata.js → fluent/src/core/Nestjs/types/metadata/property.metadata.js} +0 -0
  219. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/resolver.metadata.d.ts +0 -0
  220. package/dist/{core/Nestjs/types/metadata/union.metadata.js → fluent/src/core/Nestjs/types/metadata/resolver.metadata.js} +0 -0
  221. package/dist/{core → fluent/src/core}/Nestjs/types/metadata/union.metadata.d.ts +0 -0
  222. package/dist/fluent/src/core/Nestjs/types/metadata/union.metadata.js +2 -0
  223. package/dist/{core → fluent/src/core}/Nestjs/types/object-type.decorator.d.ts +0 -0
  224. package/dist/{core → fluent/src/core}/Nestjs/types/object-type.decorator.js +0 -0
  225. package/dist/{core → fluent/src/core}/Nestjs/types/omit-type.d.ts +0 -0
  226. package/dist/{core → fluent/src/core}/Nestjs/types/omit-type.js +0 -0
  227. package/dist/{core → fluent/src/core}/Nestjs/types/reflection.utils.d.ts +0 -0
  228. package/dist/{core → fluent/src/core}/Nestjs/types/reflection.utils.js +0 -0
  229. package/dist/{core → fluent/src/core}/Nestjs/types/set-metadata.decorator.d.ts +0 -0
  230. package/dist/{core → fluent/src/core}/Nestjs/types/set-metadata.decorator.js +0 -0
  231. package/dist/{core → fluent/src/core}/Nestjs/types/type-metadata.storage.d.ts +0 -0
  232. package/dist/{core → fluent/src/core}/Nestjs/types/type-metadata.storage.js +0 -0
  233. package/dist/{core → fluent/src/core}/Nestjs/types/utils/enum.utils.d.ts +0 -0
  234. package/dist/{core → fluent/src/core}/Nestjs/types/utils/enum.utils.js +0 -0
  235. package/dist/{core → fluent/src/core}/Nestjs/types/utils/get-fields-and-decorator.util.d.ts +0 -0
  236. package/dist/{core → fluent/src/core}/Nestjs/types/utils/get-fields-and-decorator.util.js +0 -0
  237. package/dist/{core → fluent/src/core}/Nestjs/types/utils/mapped-types.utils.d.ts +0 -0
  238. package/dist/{core → fluent/src/core}/Nestjs/types/utils/mapped-types.utils.js +0 -0
  239. package/dist/{core → fluent/src/core}/Nestjs/types/utils/model-properties-accessor.d.ts +0 -0
  240. package/dist/{core → fluent/src/core}/Nestjs/types/utils/model-properties-accessor.js +0 -0
  241. package/dist/{core → fluent/src/core}/Nestjs/types/utils/type-helpers.utils.d.ts +0 -0
  242. package/dist/{core → fluent/src/core}/Nestjs/types/utils/type-helpers.utils.js +0 -0
  243. package/dist/{core → fluent/src/core}/types.d.ts +0 -0
  244. package/dist/{core → fluent/src/core}/types.js +0 -0
  245. package/dist/{decorators.d.ts → fluent/src/decorators.d.ts} +0 -0
  246. package/dist/{decorators.js → fluent/src/decorators.js} +0 -0
  247. package/dist/{generatorDatasource.d.ts → fluent/src/generatorDatasource.d.ts} +0 -0
  248. package/dist/{generatorDatasource.js → fluent/src/generatorDatasource.js} +0 -0
  249. package/dist/{index.d.ts → fluent/src/index.d.ts} +5 -4
  250. package/dist/{index.js → fluent/src/index.js} +2 -1
  251. package/dist/{loadRelations.d.ts → fluent/src/loadRelations.d.ts} +0 -0
  252. package/dist/{loadRelations.js → fluent/src/loadRelations.js} +8 -10
  253. package/dist/{outputKeys.d.ts → fluent/src/outputKeys.d.ts} +0 -0
  254. package/dist/{outputKeys.js → fluent/src/outputKeys.js} +0 -0
  255. package/dist/{types.d.ts → fluent/src/types.d.ts} +37 -20
  256. package/dist/{types.js → fluent/src/types.js} +0 -0
  257. package/dist/fluent-firebase/src/test/firebase.d.ts +16 -0
  258. package/dist/fluent-firebase/src/test/firebase.js +93 -0
  259. package/dist/tsconfig.tsbuildinfo +1 -1
  260. package/package.json +4 -3
  261. package/CHANGELOG.md +0 -1072
  262. package/dist/TypeOrmConnector/TypeOrmConnector.js +0 -760
  263. package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +0 -19
  264. package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +0 -4
  265. package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +0 -43
  266. package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +0 -6
  267. package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +0 -38
  268. package/dist/TypeOrmConnector/test/relations/car/car.schema.js +0 -14
  269. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +0 -1
  270. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +0 -149
  271. package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +0 -35
  272. package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +0 -16
  273. package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +0 -150
  274. package/dist/TypeOrmConnector/test/relations/user/user.schema.js +0 -18
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeOrmConnector = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const BaseConnector_1 = require("../BaseConnector");
6
+ const outputKeys_1 = require("../outputKeys");
7
+ const generatorDatasource_1 = require("../generatorDatasource");
8
+ const getMongoWhere_1 = require("./queryBuilder/mongodb/getMongoWhere");
9
+ const getRelationsFromModelGenerator_1 = require("./util/getRelationsFromModelGenerator");
10
+ const getMongoFindAggregatedQuery_1 = require("./queryBuilder/mongodb/getMongoFindAggregatedQuery");
11
+ const extractInclude_1 = require("./util/extractInclude");
12
+ const extractOrderBy_1 = require("./util/extractOrderBy");
13
+ const getTypeOrmWhere_1 = require("./queryBuilder/sql/getTypeOrmWhere");
14
+ const getQueryBuilderWhere_1 = require("./queryBuilder/sql/getQueryBuilderWhere");
15
+ const clearEmpties_1 = require("./util/clearEmpties");
16
+ class TypeOrmConnector extends BaseConnector_1.BaseConnector {
17
+ constructor({ entity, dataSource, inputSchema, outputSchema }) {
18
+ super();
19
+ this.dataSource = dataSource;
20
+ this.inputSchema = inputSchema;
21
+ this.outputSchema =
22
+ outputSchema || inputSchema;
23
+ this.entity = entity;
24
+ this.repository = this.dataSource.getRepository(entity);
25
+ this.isMongoDB =
26
+ this.repository.metadata.connection.driver.options.type === 'mongodb';
27
+ if (this.isMongoDB) {
28
+ this.repository = this.dataSource.getMongoRepository(entity);
29
+ }
30
+ const relationShipBuilder = generatorDatasource_1.modelGeneratorDataSource.getRepository(entity);
31
+ const { relations } = (0, getRelationsFromModelGenerator_1.getRelationsFromModelGenerator)(relationShipBuilder);
32
+ this.modelRelations = relations;
33
+ this.outputKeys = (0, outputKeys_1.getOutputKeys)(relationShipBuilder) || [];
34
+ }
35
+ async insert(data) {
36
+ const validatedData = this.inputSchema.parse(data);
37
+ let datum = await this.repository.save(validatedData);
38
+ if (this.isMongoDB) {
39
+ datum['id'] = datum['id'].toString();
40
+ }
41
+ return this.outputSchema.parse((0, clearEmpties_1.clearEmpties)(js_utils_1.Objects.deleteNulls(datum)));
42
+ }
43
+ async insertMany(data) {
44
+ const validatedData = this.inputSchema.array().parse(data);
45
+ const inserted = await this.repository.save(validatedData, {
46
+ chunk: data.length / 300
47
+ });
48
+ return this.outputSchema.array().parse(inserted.map(d => {
49
+ if (this.isMongoDB) {
50
+ d['id'] = d['id'].toString();
51
+ }
52
+ return (0, clearEmpties_1.clearEmpties)(js_utils_1.Objects.deleteNulls(d));
53
+ }));
54
+ }
55
+ async findMany(query) {
56
+ const requiresCustomQuery = query?.include && Object.keys(query.include).length;
57
+ if (this.isMongoDB && requiresCustomQuery) {
58
+ const results = await this.customMongoRelatedFind(query);
59
+ return results;
60
+ }
61
+ if (requiresCustomQuery) {
62
+ const { queryBuilder: customQuery, selectedKeys } = this.customTypeOrmRelatedFind({
63
+ fluentQuery: query
64
+ });
65
+ customQuery.select(selectedKeys);
66
+ let [result, count] = await customQuery.getManyAndCount();
67
+ return result;
68
+ }
69
+ const generatedQuery = this.generateTypeOrmQuery(query);
70
+ let [found, count] = await this.repository.findAndCount(generatedQuery);
71
+ found.map(d => {
72
+ if (this.isMongoDB) {
73
+ d['id'] = d['id'].toString();
74
+ }
75
+ (0, clearEmpties_1.clearEmpties)(js_utils_1.Objects.deleteNulls(d));
76
+ });
77
+ if (query?.paginated) {
78
+ const paginationInfo = {
79
+ total: count,
80
+ perPage: query.paginated.perPage,
81
+ currentPage: query.paginated.page,
82
+ nextPage: query.paginated.page + 1,
83
+ firstPage: 1,
84
+ lastPage: Math.ceil(count / query.paginated.perPage),
85
+ prevPage: query.paginated.page === 1 ? null : query.paginated.page - 1,
86
+ from: (query.paginated.page - 1) * query.paginated.perPage + 1,
87
+ to: query.paginated.perPage * query.paginated.page,
88
+ data: found
89
+ };
90
+ return paginationInfo;
91
+ }
92
+ if (query?.select) {
93
+ return found;
94
+ }
95
+ return this.outputSchema?.array().parse(found);
96
+ }
97
+ async updateById(id, data) {
98
+ const parsedId = this.isMongoDB
99
+ ? js_utils_1.Ids.objectID(id)
100
+ : id;
101
+ const idFieldName = this.isMongoDB ? '_id' : 'id';
102
+ const dataToInsert = this.outputKeys.includes('updated')
103
+ ? {
104
+ ...data,
105
+ ...{ updated: new Date() }
106
+ }
107
+ : data;
108
+ const validatedData = this.inputSchema.parse(dataToInsert);
109
+ const updateResults = await this.repository.update(id, validatedData);
110
+ if (updateResults.affected === 0) {
111
+ throw new Error('No rows where affected');
112
+ }
113
+ const dbResult = await this.repository.findOneOrFail({
114
+ where: {
115
+ [idFieldName]: parsedId
116
+ }
117
+ });
118
+ if (this.isMongoDB) {
119
+ dbResult['id'] = dbResult['id'].toString();
120
+ }
121
+ return this.outputSchema?.parse((0, clearEmpties_1.clearEmpties)(js_utils_1.Objects.deleteNulls(dbResult)));
122
+ }
123
+ async replaceById(id, data) {
124
+ const parsedId = this.isMongoDB
125
+ ? js_utils_1.Ids.objectID(id)
126
+ : id;
127
+ const idFieldName = this.isMongoDB ? '_id' : 'id';
128
+ const value = await this.repository.findOneOrFail({
129
+ where: {
130
+ [idFieldName]: parsedId
131
+ }
132
+ });
133
+ const flatValue = js_utils_1.Objects.flatten(JSON.parse(JSON.stringify(value)));
134
+ Object.keys(flatValue).forEach(key => {
135
+ flatValue[key] = null;
136
+ });
137
+ const nullObject = js_utils_1.Objects.nest(flatValue);
138
+ const newValue = { ...nullObject, ...data };
139
+ delete newValue._id;
140
+ delete newValue.id;
141
+ delete newValue.created;
142
+ delete newValue.updated;
143
+ const dataToInsert = this.outputKeys.includes('updated')
144
+ ? {
145
+ ...data,
146
+ ...{ updated: new Date() }
147
+ }
148
+ : data;
149
+ const validatedData = this.inputSchema.parse(dataToInsert);
150
+ const updateResults = await this.repository.update(id, validatedData);
151
+ if (updateResults.affected === 0) {
152
+ throw new Error('No rows where affected');
153
+ }
154
+ const val = await this.repository.findOneOrFail({
155
+ where: {
156
+ [idFieldName]: parsedId
157
+ }
158
+ });
159
+ if (this.isMongoDB) {
160
+ val['id'] = val['id'].toString();
161
+ }
162
+ return this.outputSchema.parse((0, clearEmpties_1.clearEmpties)(js_utils_1.Objects.deleteNulls(val)));
163
+ }
164
+ async deleteById(id) {
165
+ const parsedId = this.isMongoDB
166
+ ? js_utils_1.Ids.objectID(id)
167
+ : id;
168
+ await this.repository.delete(parsedId);
169
+ return id;
170
+ }
171
+ async clear() {
172
+ await this.repository.clear();
173
+ return true;
174
+ }
175
+ loadFirst(query) {
176
+ const newInstance = this.clone();
177
+ newInstance.setRelatedQuery({
178
+ entity: this.entity,
179
+ repository: this,
180
+ query: {
181
+ ...query,
182
+ limit: 1
183
+ }
184
+ });
185
+ return newInstance;
186
+ }
187
+ loadById(id) {
188
+ const newInstance = this.clone();
189
+ newInstance.setRelatedQuery({
190
+ entity: this.entity,
191
+ repository: this,
192
+ query: {
193
+ where: {
194
+ id
195
+ }
196
+ }
197
+ });
198
+ return newInstance;
199
+ }
200
+ raw() {
201
+ return this.repository;
202
+ }
203
+ mongoRaw() {
204
+ return this.repository;
205
+ }
206
+ clone() {
207
+ return new this.constructor();
208
+ }
209
+ generateTypeOrmQuery(query) {
210
+ let filter = {};
211
+ filter.where = this.isMongoDB
212
+ ? (0, getMongoWhere_1.getMongoWhere)({
213
+ where: query?.where
214
+ })
215
+ : (0, getTypeOrmWhere_1.getTypeOrmWhere)({
216
+ where: query?.where
217
+ });
218
+ filter.take = query?.limit;
219
+ filter.skip = query?.offset;
220
+ if (query?.paginated) {
221
+ filter.take = query.paginated.perPage;
222
+ filter.skip = (query.paginated?.page - 1) * query?.paginated.perPage;
223
+ }
224
+ if (query?.select) {
225
+ const selectQuery = js_utils_1.Objects.flatten(query?.select || {});
226
+ filter.select = selectQuery;
227
+ if (this.isMongoDB) {
228
+ filter.select = Object.keys(selectQuery);
229
+ }
230
+ }
231
+ if (query?.orderBy) {
232
+ filter.order = (0, extractOrderBy_1.extractOrderBy)(query.orderBy);
233
+ }
234
+ if (query?.include) {
235
+ filter.relations = (0, extractInclude_1.extractInclude)(query.include);
236
+ }
237
+ return filter;
238
+ }
239
+ customTypeOrmRelatedFind({ fluentQuery: query, queryBuilder, targetFluentRepository, alias, isLeftJoin }) {
240
+ const queryAlias = alias || queryBuilder?.alias || `${this.repository.metadata.tableName}`;
241
+ let customQuery = queryBuilder || this.raw().createQueryBuilder(queryAlias);
242
+ const self = targetFluentRepository || this;
243
+ if (!isLeftJoin) {
244
+ customQuery = (0, getQueryBuilderWhere_1.getQueryBuilderWhere)({
245
+ queryBuilder: customQuery,
246
+ queryAlias,
247
+ where: query?.where
248
+ });
249
+ }
250
+ const { queryBuilder: qb, selectedKeys } = this.getTypeOrmQueryBuilderSubqueries({
251
+ queryBuilder: customQuery,
252
+ selfReference: targetFluentRepository,
253
+ include: query?.include,
254
+ leftTableAlias: alias
255
+ });
256
+ customQuery = qb;
257
+ const extraKeys = this.getTypeOrmQueryBuilderSelect(queryAlias, self, query?.select);
258
+ const keySet = new Set([...selectedKeys, ...extraKeys]);
259
+ return {
260
+ queryBuilder: customQuery,
261
+ selectedKeys: Array.from(keySet)
262
+ };
263
+ }
264
+ getTypeOrmQueryBuilderSelect(queryAlias, self, select) {
265
+ const selected = js_utils_1.Objects.flatten(select || {});
266
+ const selectedKeys = [];
267
+ const iterableKeys = Object.keys(selected).length
268
+ ? Object.keys(selected)
269
+ : self.outputKeys || [];
270
+ const baseNestedKeys = new Set();
271
+ for (const key of iterableKeys) {
272
+ const keyArray = key.split('.');
273
+ if (keyArray.length <= 1) {
274
+ continue;
275
+ }
276
+ const total = keyArray.length;
277
+ for (const [index, val] of keyArray.entries()) {
278
+ if (total === index + 1) {
279
+ continue;
280
+ }
281
+ let excludedField = '';
282
+ if (excludedField) {
283
+ excludedField = `${excludedField}.${excludedField}${val}`;
284
+ }
285
+ excludedField = `${excludedField}${val}`;
286
+ baseNestedKeys.add(excludedField);
287
+ }
288
+ }
289
+ for (const k of iterableKeys) {
290
+ const field = k.includes('.') ? js_utils_1.Strings.camel(`${k}`) : k;
291
+ const search = `${queryAlias}.${field}`;
292
+ let isNestedRelation = false;
293
+ for (const item of k.split('.')) {
294
+ if (!!self[item]) {
295
+ isNestedRelation = true;
296
+ break;
297
+ }
298
+ }
299
+ if (!!self[field] || !!self[queryAlias] || isNestedRelation) {
300
+ continue;
301
+ }
302
+ if (baseNestedKeys.has(field)) {
303
+ continue;
304
+ }
305
+ selectedKeys.push(search);
306
+ }
307
+ return selectedKeys;
308
+ }
309
+ getTypeOrmQueryBuilderSubqueries({ queryBuilder, selfReference, include, leftTableAlias }) {
310
+ const selectedKeys = [];
311
+ if (!include) {
312
+ return { queryBuilder, selectedKeys };
313
+ }
314
+ for (const relation of Object.keys(include)) {
315
+ const self = selfReference || this;
316
+ const dbRelation = self.modelRelations[relation];
317
+ const newSelf = self[relation]();
318
+ const fluentRelatedQuery = include[relation] === true ? {} : include[relation];
319
+ if (!dbRelation) {
320
+ throw new Error(`The relation ${relation} is not properly defined. Check your entity and repository`);
321
+ }
322
+ const selectedKeysArray = fluentRelatedQuery.select
323
+ ? Object.keys(js_utils_1.Objects.flatten(fluentRelatedQuery.select))
324
+ : [];
325
+ if (dbRelation.isManyToOne) {
326
+ const leftSideTableName = leftTableAlias || queryBuilder.alias;
327
+ const leftSideForeignKey = `${leftSideTableName}.${dbRelation.joinColumns[0].propertyPath}`;
328
+ const rightSideTableName = `${leftSideTableName}_${relation}`;
329
+ const rightSidePrimaryKey = `${rightSideTableName}.id`;
330
+ const keys = new Set(selectedKeysArray.map(k => `${rightSideTableName}.${k}`));
331
+ selectedKeys.push(...Array.from(keys));
332
+ const shallowQuery = { ...fluentRelatedQuery };
333
+ delete shallowQuery['include'];
334
+ const { queryBuilder: leftJoinBuilder, selectedKeys: deepkeys } = this.customTypeOrmRelatedFind({
335
+ queryBuilder: this.raw().createQueryBuilder(rightSideTableName),
336
+ fluentQuery: shallowQuery,
337
+ targetFluentRepository: newSelf,
338
+ alias: rightSideTableName
339
+ });
340
+ selectedKeys.push(...deepkeys);
341
+ const joinQuery = leftJoinBuilder.getQuery().split('WHERE');
342
+ const customLeftJoin = joinQuery && joinQuery[1] ? joinQuery[1].trim() : '1=1';
343
+ const leftJoinParams = leftJoinBuilder.getParameters();
344
+ queryBuilder.leftJoinAndMapOne(`${leftSideTableName}.${relation}`, dbRelation.targetClass, rightSideTableName, `(${leftSideForeignKey} = ${rightSidePrimaryKey} AND ${customLeftJoin} )`, leftJoinParams);
345
+ const { queryBuilder: qb, selectedKeys: k } = this.customTypeOrmRelatedFind({
346
+ queryBuilder,
347
+ fluentQuery: fluentRelatedQuery,
348
+ targetFluentRepository: newSelf,
349
+ alias: rightSideTableName,
350
+ isLeftJoin: true
351
+ });
352
+ selectedKeys.push(...k);
353
+ queryBuilder = qb;
354
+ }
355
+ if (dbRelation.isOneToMany) {
356
+ const leftSideTableName = leftTableAlias || queryBuilder.alias;
357
+ const leftSidePrimaryKey = `${leftSideTableName}.id`;
358
+ const rightSideTableName = `${leftSideTableName}_${relation}`;
359
+ const rightSideForeignKey = `${rightSideTableName}.${dbRelation.inverseSidePropertyPath}`;
360
+ const keys = new Set(selectedKeysArray.map(k => `${rightSideTableName}.${k}`));
361
+ selectedKeys.push(...Array.from(keys));
362
+ const shallowQuery = { ...fluentRelatedQuery };
363
+ delete shallowQuery['include'];
364
+ const { queryBuilder: leftJoinBuilder, selectedKeys: deepKeys } = this.customTypeOrmRelatedFind({
365
+ queryBuilder: this.raw().createQueryBuilder(rightSideTableName),
366
+ fluentQuery: shallowQuery,
367
+ targetFluentRepository: newSelf,
368
+ alias: rightSideTableName
369
+ });
370
+ selectedKeys.push(...deepKeys);
371
+ const joinQuery = leftJoinBuilder.getQuery().split('WHERE');
372
+ const customLeftJoin = joinQuery && joinQuery[1] ? joinQuery[1].trim() : '1=1';
373
+ const leftJoinParams = leftJoinBuilder.getParameters();
374
+ queryBuilder.leftJoinAndMapMany(`${leftSideTableName}.${relation}`, dbRelation.targetClass, rightSideTableName, `(${leftSidePrimaryKey} = ${rightSideForeignKey} AND ${customLeftJoin} )`, leftJoinParams);
375
+ const { queryBuilder: q, selectedKeys: k } = this.customTypeOrmRelatedFind({
376
+ queryBuilder,
377
+ fluentQuery: fluentRelatedQuery,
378
+ targetFluentRepository: newSelf,
379
+ alias: rightSideTableName,
380
+ isLeftJoin: true
381
+ });
382
+ selectedKeys.push(...k);
383
+ queryBuilder = q;
384
+ }
385
+ }
386
+ return { queryBuilder, selectedKeys };
387
+ }
388
+ async customMongoRelatedFind(query) {
389
+ const aggregate = (0, getMongoFindAggregatedQuery_1.getMongoFindAggregatedQuery)({
390
+ query,
391
+ self: this
392
+ });
393
+ const raw = await this.mongoRaw().aggregate(aggregate).toArray();
394
+ return this.outputSchema?.array().parse(raw);
395
+ }
396
+ }
397
+ exports.TypeOrmConnector = TypeOrmConnector;
@@ -0,0 +1,7 @@
1
+ import { AnyObject, FluentQuery } from '../../../types';
2
+ export interface getMongoBaseAggregationParams {
3
+ include: FluentQuery<AnyObject>['include'];
4
+ self: any;
5
+ alias?: string;
6
+ }
7
+ export declare const getMongoBaseAggregation: ({ include, self }: getMongoBaseAggregationParams) => any[];
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMongoBaseAggregation = void 0;
4
+ const getMongoWhere_1 = require("./getMongoWhere");
5
+ const getMongoBaseAggregation = ({ include, self }) => {
6
+ if (!include) {
7
+ return [];
8
+ }
9
+ const modelRelations = self.modelRelations;
10
+ const aggregations = [];
11
+ for (const relation of Object.keys(include)) {
12
+ if (!modelRelations[relation]) {
13
+ continue;
14
+ }
15
+ const innerLookups = [];
16
+ const dbRelation = modelRelations[relation];
17
+ if (include[relation]['include']) {
18
+ const newSelf = self[relation] && self[relation]();
19
+ const innerRelations = (0, exports.getMongoBaseAggregation)({
20
+ include: include[relation]['include'],
21
+ self: newSelf
22
+ });
23
+ innerLookups.push(...innerRelations);
24
+ }
25
+ const where = (0, getMongoWhere_1.getMongoWhere)({
26
+ where: include[relation]['where']
27
+ });
28
+ if (dbRelation.isManyToOne) {
29
+ const localField = dbRelation.joinColumns[0].propertyPath;
30
+ aggregations.push({
31
+ $addFields: {
32
+ [`${localField}_object`]: { $toObjectId: `$${localField}` }
33
+ }
34
+ });
35
+ aggregations.push({ $addFields: { id: { $toString: '$_id' } } });
36
+ aggregations.push({
37
+ $lookup: {
38
+ from: dbRelation.tableName,
39
+ localField: `${localField}_object`,
40
+ foreignField: '_id',
41
+ as: dbRelation.propertyName,
42
+ pipeline: [
43
+ {
44
+ $match: where
45
+ },
46
+ { $addFields: { id: { $toString: '$_id' } } },
47
+ ...innerLookups
48
+ ]
49
+ }
50
+ });
51
+ aggregations.push({
52
+ $unwind: {
53
+ path: `$${dbRelation.propertyName}`,
54
+ preserveNullAndEmptyArrays: true
55
+ }
56
+ });
57
+ }
58
+ if (dbRelation.isOneToMany) {
59
+ aggregations.push({ $addFields: { string_id: { $toString: '$_id' } } });
60
+ aggregations.push({ $addFields: { id: { $toString: '$_id' } } });
61
+ aggregations.push({
62
+ $lookup: {
63
+ from: dbRelation.tableName,
64
+ localField: 'string_id',
65
+ foreignField: dbRelation.inverseSidePropertyPath,
66
+ as: dbRelation.propertyName,
67
+ pipeline: [
68
+ {
69
+ $match: where
70
+ },
71
+ { $addFields: { id: { $toString: '$_id' } } },
72
+ ...innerLookups
73
+ ]
74
+ }
75
+ });
76
+ }
77
+ if (dbRelation.isManyToMany) {
78
+ const relatedTableName = dbRelation.tableName;
79
+ const pivotTableName = dbRelation.joinColumns[0].relationMetadata.joinTableName;
80
+ const pivotForeignField = dbRelation.joinColumns[0].propertyPath;
81
+ const inverseForeignField = dbRelation.inverseJoinColumns[0].propertyPath;
82
+ if (!relatedTableName ||
83
+ !pivotTableName ||
84
+ !pivotForeignField ||
85
+ !inverseForeignField) {
86
+ throw new Error(`Your many to many relation is not properly set up. Please check both your models and schema for relation: ${relation}`);
87
+ }
88
+ aggregations.push({ $addFields: { id: { $toString: '$_id' } } });
89
+ aggregations.push({
90
+ $addFields: { parent_string_id: { $toString: '$_id' } }
91
+ });
92
+ aggregations.push({
93
+ $lookup: {
94
+ from: pivotTableName,
95
+ localField: 'parent_string_id',
96
+ foreignField: pivotForeignField,
97
+ as: dbRelation.propertyName,
98
+ pipeline: [
99
+ { $addFields: { id: { $toString: '$_id' } } },
100
+ {
101
+ $addFields: {
102
+ [`${inverseForeignField}_object`]: {
103
+ $toObjectId: `$${inverseForeignField}`
104
+ }
105
+ }
106
+ },
107
+ {
108
+ $lookup: {
109
+ from: relatedTableName,
110
+ localField: `${inverseForeignField}_object`,
111
+ foreignField: '_id',
112
+ pipeline: [
113
+ {
114
+ $match: where
115
+ },
116
+ { $addFields: { id: { $toString: '$_id' } } }
117
+ ],
118
+ as: dbRelation.propertyName
119
+ }
120
+ },
121
+ {
122
+ $unwind: {
123
+ path: `$${dbRelation.propertyName}`,
124
+ preserveNullAndEmptyArrays: true
125
+ }
126
+ },
127
+ {
128
+ $project: {
129
+ [dbRelation.propertyName]: `$${dbRelation.propertyName}`,
130
+ pivot: '$$ROOT'
131
+ }
132
+ },
133
+ {
134
+ $replaceRoot: {
135
+ newRoot: {
136
+ $mergeObjects: ['$$ROOT', `$${dbRelation.propertyName}`]
137
+ }
138
+ }
139
+ },
140
+ { $project: { [dbRelation.propertyName]: 0 } }
141
+ ]
142
+ }
143
+ });
144
+ }
145
+ }
146
+ return aggregations;
147
+ };
148
+ exports.getMongoBaseAggregation = getMongoBaseAggregation;
@@ -0,0 +1,6 @@
1
+ import { FluentQuery } from '../../../types';
2
+ export declare type getFindAggregateQueryParams<T extends FluentQuery<any>> = {
3
+ query?: T;
4
+ self?: any;
5
+ };
6
+ export declare const getMongoFindAggregatedQuery: ({ query, self }: getFindAggregateQueryParams<any>) => any[];
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMongoFindAggregatedQuery = void 0;
4
+ const getMongoBaseAggregations_1 = require("./getMongoBaseAggregations");
5
+ const getMongoSelect_1 = require("./getMongoSelect");
6
+ const getMongoWhere_1 = require("./getMongoWhere");
7
+ const getMongoFindAggregatedQuery = ({ query, self }) => {
8
+ const selected = (0, getMongoSelect_1.getMongoSelect)(query?.select);
9
+ const where = (0, getMongoWhere_1.getMongoWhere)({
10
+ where: query?.where
11
+ });
12
+ const baseAggregations = (0, getMongoBaseAggregations_1.getMongoBaseAggregation)({
13
+ include: query?.include,
14
+ self
15
+ });
16
+ const aggregate = [
17
+ {
18
+ $match: where
19
+ }
20
+ ];
21
+ if (query?.limit) {
22
+ aggregate.push({ $limit: query.limit });
23
+ }
24
+ for (const lookup of baseAggregations) {
25
+ aggregate.push(lookup);
26
+ }
27
+ if (selected && Object.keys(selected).length) {
28
+ aggregate.push({
29
+ $project: selected
30
+ });
31
+ }
32
+ return aggregate;
33
+ };
34
+ exports.getMongoFindAggregatedQuery = getMongoFindAggregatedQuery;
@@ -0,0 +1,4 @@
1
+ import { FluentQuery } from '../../../types';
2
+ export declare const getMongoSelect: (select: FluentQuery<any>['select']) => {
3
+ [key: string]: any;
4
+ };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMongoSelect = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const getMongoSelect = (select) => {
6
+ const selected = js_utils_1.Objects.flatten(select || {});
7
+ for (const k of Object.keys(selected)) {
8
+ selected[k] = 1;
9
+ }
10
+ return selected;
11
+ };
12
+ exports.getMongoSelect = getMongoSelect;
@@ -0,0 +1,6 @@
1
+ import { FindManyOptions } from 'typeorm';
2
+ import { AnyObject, FluentQuery } from '../../../types';
3
+ export interface getTypeOrmMongoWhereParams {
4
+ where?: FluentQuery<AnyObject>['where'];
5
+ }
6
+ export declare const getMongoWhere: ({ where }: getTypeOrmMongoWhereParams) => FindManyOptions['where'];