@goatlab/fluent 0.7.39 → 0.7.41

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 (276) hide show
  1. package/dist/BaseConnector.d.ts +112 -0
  2. package/dist/BaseConnector.js +347 -0
  3. package/dist/BaseConnector.js.map +1 -0
  4. package/dist/Fluent.d.ts +11 -0
  5. package/dist/Fluent.js +27 -0
  6. package/dist/Fluent.js.map +1 -0
  7. package/dist/FluentConnectorInterface.d.ts +17 -0
  8. package/dist/FluentConnectorInterface.js +3 -0
  9. package/dist/FluentConnectorInterface.js.map +1 -0
  10. package/dist/FluentEntity.d.ts +7 -0
  11. package/dist/FluentEntity.js +34 -0
  12. package/dist/FluentEntity.js.map +1 -0
  13. package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +123 -0
  14. package/dist/TypeOrmConnector/TypeOrmConnector.js +765 -0
  15. package/dist/TypeOrmConnector/TypeOrmConnector.js.map +1 -0
  16. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.d.ts +12 -0
  17. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js +167 -0
  18. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js.map +1 -0
  19. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.d.ts +11 -0
  20. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js +52 -0
  21. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js.map +1 -0
  22. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoOrderBy.d.ts +4 -0
  23. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoOrderBy.js +20 -0
  24. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoOrderBy.js.map +1 -0
  25. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.d.ts +7 -0
  26. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js +19 -0
  27. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js.map +1 -0
  28. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.d.ts +11 -0
  29. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js +173 -0
  30. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js.map +1 -0
  31. package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.d.ts +13 -0
  32. package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js +207 -0
  33. package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js.map +1 -0
  34. package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.d.ts +11 -0
  35. package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js +214 -0
  36. package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js.map +1 -0
  37. package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.d.ts +44 -0
  38. package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.js +87 -0
  39. package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.js.map +1 -0
  40. package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +38 -0
  41. package/dist/TypeOrmConnector/test/basic/goat.entity.js +82 -0
  42. package/dist/TypeOrmConnector/test/basic/goat.entity.js.map +1 -0
  43. package/dist/TypeOrmConnector/test/flock.d.ts +4 -0
  44. package/dist/TypeOrmConnector/test/flock.js +26 -0
  45. package/dist/TypeOrmConnector/test/flock.js.map +1 -0
  46. package/dist/TypeOrmConnector/util/clearEmpties.d.ts +7 -0
  47. package/dist/TypeOrmConnector/util/clearEmpties.js +33 -0
  48. package/dist/TypeOrmConnector/util/clearEmpties.js.map +1 -0
  49. package/dist/TypeOrmConnector/util/extractConditions.d.ts +12 -0
  50. package/dist/TypeOrmConnector/util/extractConditions.js +89 -0
  51. package/dist/TypeOrmConnector/util/extractConditions.js.map +1 -0
  52. package/dist/TypeOrmConnector/util/extractInclude.d.ts +2 -0
  53. package/dist/TypeOrmConnector/util/extractInclude.js +26 -0
  54. package/dist/TypeOrmConnector/util/extractInclude.js.map +1 -0
  55. package/dist/TypeOrmConnector/util/extractMetadataFromKeys.d.ts +12 -0
  56. package/dist/TypeOrmConnector/util/extractMetadataFromKeys.js +49 -0
  57. package/dist/TypeOrmConnector/util/extractMetadataFromKeys.js.map +1 -0
  58. package/dist/TypeOrmConnector/util/extractOrderBy.d.ts +2 -0
  59. package/dist/TypeOrmConnector/util/extractOrderBy.js +24 -0
  60. package/dist/TypeOrmConnector/util/extractOrderBy.js.map +1 -0
  61. package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.d.ts +19 -0
  62. package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.js +27 -0
  63. package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.js.map +1 -0
  64. package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.d.ts +6 -0
  65. package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.js +29 -0
  66. package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.js.map +1 -0
  67. package/dist/TypeOrmConnector/util/isAnyObject.d.ts +1 -0
  68. package/dist/TypeOrmConnector/util/isAnyObject.js +8 -0
  69. package/dist/TypeOrmConnector/util/isAnyObject.js.map +1 -0
  70. package/dist/TypeOrmConnector/util/nestQueryResults.d.ts +2 -0
  71. package/dist/TypeOrmConnector/util/nestQueryResults.js +38 -0
  72. package/dist/TypeOrmConnector/util/nestQueryResults.js.map +1 -0
  73. package/dist/core/Loopback/build-schema.d.ts +148 -0
  74. package/dist/core/Loopback/build-schema.js +443 -0
  75. package/dist/core/Loopback/build-schema.js.map +1 -0
  76. package/dist/core/Loopback/common-types.d.ts +96 -0
  77. package/dist/core/Loopback/common-types.js +24 -0
  78. package/dist/core/Loopback/common-types.js.map +1 -0
  79. package/dist/core/Loopback/json-to-schema.d.ts +41 -0
  80. package/dist/core/Loopback/json-to-schema.js +113 -0
  81. package/dist/core/Loopback/json-to-schema.js.map +1 -0
  82. package/dist/core/Loopback/mapValues.js +2280 -0
  83. package/dist/core/Loopback/metadata.d.ts +16 -0
  84. package/dist/core/Loopback/metadata.js +49 -0
  85. package/dist/core/Loopback/metadata.js.map +1 -0
  86. package/dist/core/Loopback/model.d.ts +233 -0
  87. package/dist/core/Loopback/model.js +394 -0
  88. package/dist/core/Loopback/model.js.map +1 -0
  89. package/dist/core/Loopback/query.d.ts +394 -0
  90. package/dist/core/Loopback/query.js +484 -0
  91. package/dist/core/Loopback/query.js.map +1 -0
  92. package/dist/core/Loopback/relation.types.d.ts +141 -0
  93. package/dist/core/Loopback/relation.types.js +18 -0
  94. package/dist/core/Loopback/relation.types.js.map +1 -0
  95. package/dist/core/Loopback/type-resolver.d.ts +42 -0
  96. package/dist/core/Loopback/type-resolver.js +60 -0
  97. package/dist/core/Loopback/type-resolver.js.map +1 -0
  98. package/dist/core/Loopback/type.d.ts +38 -0
  99. package/dist/core/Loopback/type.js +7 -0
  100. package/dist/core/Loopback/type.js.map +1 -0
  101. package/dist/core/Nestjs/applyDecorators.d.ts +10 -0
  102. package/dist/core/Nestjs/applyDecorators.js +26 -0
  103. package/dist/core/Nestjs/applyDecorators.js.map +1 -0
  104. package/dist/core/Nestjs/types/common.d.ts +16 -0
  105. package/dist/core/Nestjs/types/common.js +38 -0
  106. package/dist/core/Nestjs/types/common.js.map +1 -0
  107. package/dist/core/Nestjs/types/decorators/api-hide-property.decorator.d.ts +1 -0
  108. package/dist/core/Nestjs/types/decorators/api-hide-property.decorator.js +8 -0
  109. package/dist/core/Nestjs/types/decorators/api-hide-property.decorator.js.map +1 -0
  110. package/dist/core/Nestjs/types/decorators/api-property.decorator.d.ts +27 -0
  111. package/dist/core/Nestjs/types/decorators/api-property.decorator.js +66 -0
  112. package/dist/core/Nestjs/types/decorators/api-property.decorator.js.map +1 -0
  113. package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.d.ts +5 -0
  114. package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.js +136 -0
  115. package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.js.map +1 -0
  116. package/dist/core/Nestjs/types/decorators/args-type.decorator.d.ts +4 -0
  117. package/dist/core/Nestjs/types/decorators/args-type.decorator.js +24 -0
  118. package/dist/core/Nestjs/types/decorators/args-type.decorator.js.map +1 -0
  119. package/dist/core/Nestjs/types/decorators/create-property.decorator.d.ts +2 -0
  120. package/dist/core/Nestjs/types/decorators/create-property.decorator.js +55 -0
  121. package/dist/core/Nestjs/types/decorators/create-property.decorator.js.map +1 -0
  122. package/dist/core/Nestjs/types/decorators/directive.decorator.d.ts +4 -0
  123. package/dist/core/Nestjs/types/decorators/directive.decorator.js +39 -0
  124. package/dist/core/Nestjs/types/decorators/directive.decorator.js.map +1 -0
  125. package/dist/core/Nestjs/types/decorators/extensions.decorator.d.ts +4 -0
  126. package/dist/core/Nestjs/types/decorators/extensions.decorator.js +28 -0
  127. package/dist/core/Nestjs/types/decorators/extensions.decorator.js.map +1 -0
  128. package/dist/core/Nestjs/types/decorators/field.decorator.d.ts +48 -0
  129. package/dist/core/Nestjs/types/decorators/field.decorator.js +63 -0
  130. package/dist/core/Nestjs/types/decorators/field.decorator.js.map +1 -0
  131. package/dist/core/Nestjs/types/decorators/input-type.decorator.d.ts +25 -0
  132. package/dist/core/Nestjs/types/decorators/input-type.decorator.js +29 -0
  133. package/dist/core/Nestjs/types/decorators/input-type.decorator.js.map +1 -0
  134. package/dist/core/Nestjs/types/decorators/interface-type.decorator.d.ts +33 -0
  135. package/dist/core/Nestjs/types/decorators/interface-type.decorator.js +35 -0
  136. package/dist/core/Nestjs/types/decorators/interface-type.decorator.js.map +1 -0
  137. package/dist/core/Nestjs/types/decorators/partial-type.helper.d.ts +3 -0
  138. package/dist/core/Nestjs/types/decorators/partial-type.helper.js +46 -0
  139. package/dist/core/Nestjs/types/decorators/partial-type.helper.js.map +1 -0
  140. package/dist/core/Nestjs/types/errors/cannot-determine-host-type.error.d.ts +3 -0
  141. package/dist/core/Nestjs/types/errors/cannot-determine-host-type.error.js +10 -0
  142. package/dist/core/Nestjs/types/errors/cannot-determine-host-type.error.js.map +1 -0
  143. package/dist/core/Nestjs/types/errors/directive-parsing.error.d.ts +3 -0
  144. package/dist/core/Nestjs/types/errors/directive-parsing.error.js +10 -0
  145. package/dist/core/Nestjs/types/errors/directive-parsing.error.js.map +1 -0
  146. package/dist/core/Nestjs/types/errors/unable-to-find-fields.error.d.ts +3 -0
  147. package/dist/core/Nestjs/types/errors/unable-to-find-fields.error.js +10 -0
  148. package/dist/core/Nestjs/types/errors/unable-to-find-fields.error.js.map +1 -0
  149. package/dist/core/Nestjs/types/errors/undefined-type.error.d.ts +3 -0
  150. package/dist/core/Nestjs/types/errors/undefined-type.error.js +11 -0
  151. package/dist/core/Nestjs/types/errors/undefined-type.error.js.map +1 -0
  152. package/dist/core/Nestjs/types/interfaces/add-class-type-metadata.util.d.ts +3 -0
  153. package/dist/core/Nestjs/types/interfaces/add-class-type-metadata.util.js +11 -0
  154. package/dist/core/Nestjs/types/interfaces/add-class-type-metadata.util.js.map +1 -0
  155. package/dist/core/Nestjs/types/interfaces/base-type-options.interface.d.ts +11 -0
  156. package/dist/core/Nestjs/types/interfaces/base-type-options.interface.js +3 -0
  157. package/dist/core/Nestjs/types/interfaces/base-type-options.interface.js.map +1 -0
  158. package/dist/core/Nestjs/types/interfaces/class-decorator-factory.interface.d.ts +5 -0
  159. package/dist/core/Nestjs/types/interfaces/class-decorator-factory.interface.js +3 -0
  160. package/dist/core/Nestjs/types/interfaces/class-decorator-factory.interface.js.map +1 -0
  161. package/dist/core/Nestjs/types/interfaces/complexity.interface.d.ts +11 -0
  162. package/dist/core/Nestjs/types/interfaces/complexity.interface.js +3 -0
  163. package/dist/core/Nestjs/types/interfaces/complexity.interface.js.map +1 -0
  164. package/dist/core/Nestjs/types/interfaces/field-middleware.interface.d.ts +15 -0
  165. package/dist/core/Nestjs/types/interfaces/field-middleware.interface.js +3 -0
  166. package/dist/core/Nestjs/types/interfaces/field-middleware.interface.js.map +1 -0
  167. package/dist/core/Nestjs/types/interfaces/open-api-spec.interface.d.ts +239 -0
  168. package/dist/core/Nestjs/types/interfaces/open-api-spec.interface.js +7 -0
  169. package/dist/core/Nestjs/types/interfaces/open-api-spec.interface.js.map +1 -0
  170. package/dist/core/Nestjs/types/interfaces/resolve-type-fn.interface.d.ts +2 -0
  171. package/dist/core/Nestjs/types/interfaces/resolve-type-fn.interface.js +3 -0
  172. package/dist/core/Nestjs/types/interfaces/resolve-type-fn.interface.js.map +1 -0
  173. package/dist/core/Nestjs/types/interfaces/return-type-func.interface.d.ts +5 -0
  174. package/dist/core/Nestjs/types/interfaces/return-type-func.interface.js +3 -0
  175. package/dist/core/Nestjs/types/interfaces/return-type-func.interface.js.map +1 -0
  176. package/dist/core/Nestjs/types/interfaces/schema-object-metadata.interface.d.ts +9 -0
  177. package/dist/core/Nestjs/types/interfaces/schema-object-metadata.interface.js +3 -0
  178. package/dist/core/Nestjs/types/interfaces/schema-object-metadata.interface.js.map +1 -0
  179. package/dist/core/Nestjs/types/interfaces/type-options.interface.d.ts +5 -0
  180. package/dist/core/Nestjs/types/interfaces/type-options.interface.js +3 -0
  181. package/dist/core/Nestjs/types/interfaces/type-options.interface.js.map +1 -0
  182. package/dist/core/Nestjs/types/lazy-metadata.storage.d.ts +15 -0
  183. package/dist/core/Nestjs/types/lazy-metadata.storage.js +66 -0
  184. package/dist/core/Nestjs/types/lazy-metadata.storage.js.map +1 -0
  185. package/dist/core/Nestjs/types/metadata/class.metadata.d.ts +11 -0
  186. package/dist/core/Nestjs/types/metadata/class.metadata.js +3 -0
  187. package/dist/core/Nestjs/types/metadata/class.metadata.js.map +1 -0
  188. package/dist/core/Nestjs/types/metadata/directive.metadata.d.ts +8 -0
  189. package/dist/core/Nestjs/types/metadata/directive.metadata.js +3 -0
  190. package/dist/core/Nestjs/types/metadata/directive.metadata.js.map +1 -0
  191. package/dist/core/Nestjs/types/metadata/enum.metadata.d.ts +11 -0
  192. package/dist/core/Nestjs/types/metadata/enum.metadata.js +3 -0
  193. package/dist/core/Nestjs/types/metadata/enum.metadata.js.map +1 -0
  194. package/dist/core/Nestjs/types/metadata/extensions.metadata.d.ts +8 -0
  195. package/dist/core/Nestjs/types/metadata/extensions.metadata.js +3 -0
  196. package/dist/core/Nestjs/types/metadata/extensions.metadata.js.map +1 -0
  197. package/dist/core/Nestjs/types/metadata/index.d.ts +8 -0
  198. package/dist/core/Nestjs/types/metadata/index.js +12 -0
  199. package/dist/core/Nestjs/types/metadata/index.js.map +1 -0
  200. package/dist/core/Nestjs/types/metadata/interface.metadata.d.ts +6 -0
  201. package/dist/core/Nestjs/types/metadata/interface.metadata.js +3 -0
  202. package/dist/core/Nestjs/types/metadata/interface.metadata.js.map +1 -0
  203. package/dist/core/Nestjs/types/metadata/object-type.metadata.d.ts +4 -0
  204. package/dist/core/Nestjs/types/metadata/object-type.metadata.js +3 -0
  205. package/dist/core/Nestjs/types/metadata/object-type.metadata.js.map +1 -0
  206. package/dist/core/Nestjs/types/metadata/param.metadata.d.ts +18 -0
  207. package/dist/core/Nestjs/types/metadata/param.metadata.js +3 -0
  208. package/dist/core/Nestjs/types/metadata/param.metadata.js.map +1 -0
  209. package/dist/core/Nestjs/types/metadata/property.metadata.d.ts +20 -0
  210. package/dist/core/Nestjs/types/metadata/property.metadata.js +3 -0
  211. package/dist/core/Nestjs/types/metadata/property.metadata.js.map +1 -0
  212. package/dist/core/Nestjs/types/metadata/resolver.metadata.d.ts +34 -0
  213. package/dist/core/Nestjs/types/metadata/resolver.metadata.js +3 -0
  214. package/dist/core/Nestjs/types/metadata/resolver.metadata.js.map +1 -0
  215. package/dist/core/Nestjs/types/metadata/union.metadata.d.ts +9 -0
  216. package/dist/core/Nestjs/types/metadata/union.metadata.js +3 -0
  217. package/dist/core/Nestjs/types/metadata/union.metadata.js.map +1 -0
  218. package/dist/core/Nestjs/types/object-type.decorator.d.ts +32 -0
  219. package/dist/core/Nestjs/types/object-type.decorator.js +33 -0
  220. package/dist/core/Nestjs/types/object-type.decorator.js.map +1 -0
  221. package/dist/core/Nestjs/types/omit-type.d.ts +2 -0
  222. package/dist/core/Nestjs/types/omit-type.js +34 -0
  223. package/dist/core/Nestjs/types/omit-type.js.map +1 -0
  224. package/dist/core/Nestjs/types/reflection.utils.d.ts +15 -0
  225. package/dist/core/Nestjs/types/reflection.utils.js +65 -0
  226. package/dist/core/Nestjs/types/reflection.utils.js.map +1 -0
  227. package/dist/core/Nestjs/types/set-metadata.decorator.d.ts +20 -0
  228. package/dist/core/Nestjs/types/set-metadata.decorator.js +33 -0
  229. package/dist/core/Nestjs/types/set-metadata.decorator.js.map +1 -0
  230. package/dist/core/Nestjs/types/type-metadata.storage.d.ts +73 -0
  231. package/dist/core/Nestjs/types/type-metadata.storage.js +349 -0
  232. package/dist/core/Nestjs/types/type-metadata.storage.js.map +1 -0
  233. package/dist/core/Nestjs/types/utils/enum.utils.d.ts +3 -0
  234. package/dist/core/Nestjs/types/utils/enum.utils.js +31 -0
  235. package/dist/core/Nestjs/types/utils/enum.utils.js.map +1 -0
  236. package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.d.ts +13 -0
  237. package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.js +72 -0
  238. package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.js.map +1 -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/mapped-types.utils.js.map +1 -0
  242. package/dist/core/Nestjs/types/utils/model-properties-accessor.d.ts +6 -0
  243. package/dist/core/Nestjs/types/utils/model-properties-accessor.js +37 -0
  244. package/dist/core/Nestjs/types/utils/model-properties-accessor.js.map +1 -0
  245. package/dist/core/Nestjs/types/utils/type-helpers.utils.d.ts +2 -0
  246. package/dist/core/Nestjs/types/utils/type-helpers.utils.js +16 -0
  247. package/dist/core/Nestjs/types/utils/type-helpers.utils.js.map +1 -0
  248. package/dist/core/types.d.ts +23 -0
  249. package/dist/core/types.js +31 -0
  250. package/dist/core/types.js.map +1 -0
  251. package/dist/decorators.d.ts +92 -0
  252. package/dist/decorators.js +163 -0
  253. package/dist/decorators.js.map +1 -0
  254. package/dist/generatorDatasource.d.ts +2 -0
  255. package/dist/generatorDatasource.js +13 -0
  256. package/dist/generatorDatasource.js.map +1 -0
  257. package/dist/index.d.ts +34 -0
  258. package/dist/index.js +59 -0
  259. package/dist/index.js.map +1 -0
  260. package/dist/loadRelations.d.ts +12 -0
  261. package/dist/loadRelations.js +139 -0
  262. package/dist/loadRelations.js.map +1 -0
  263. package/dist/outputKeys.d.ts +2 -0
  264. package/dist/outputKeys.js +18 -0
  265. package/dist/outputKeys.js.map +1 -0
  266. package/dist/testing/genericUnifiedTestSuite.d.ts +21 -0
  267. package/dist/testing/genericUnifiedTestSuite.js +256 -0
  268. package/dist/testing/genericUnifiedTestSuite.js.map +1 -0
  269. package/dist/testing/unifiedTestFactory.d.ts +38 -0
  270. package/dist/testing/unifiedTestFactory.js +297 -0
  271. package/dist/testing/unifiedTestFactory.js.map +1 -0
  272. package/dist/tsconfig.tsbuildinfo +1 -0
  273. package/dist/types.d.ts +104 -0
  274. package/dist/types.js +23 -0
  275. package/dist/types.js.map +1 -0
  276. package/package.json +48 -24
@@ -0,0 +1,765 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeOrmConnector = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const js_utils_1 = require("@goatlab/js-utils");
6
+ const bson_1 = require("bson");
7
+ const BaseConnector_1 = require("../BaseConnector");
8
+ const outputKeys_1 = require("../outputKeys");
9
+ const generatorDatasource_1 = require("../generatorDatasource");
10
+ const getMongoWhere_1 = require("./queryBuilder/mongodb/getMongoWhere");
11
+ const getRelationsFromModelGenerator_1 = require("./util/getRelationsFromModelGenerator");
12
+ const getMongoFindAggregatedQuery_1 = require("./queryBuilder/mongodb/getMongoFindAggregatedQuery");
13
+ const extractInclude_1 = require("./util/extractInclude");
14
+ const extractOrderBy_1 = require("./util/extractOrderBy");
15
+ const getTypeOrmWhere_1 = require("./queryBuilder/sql/getTypeOrmWhere");
16
+ const getQueryBuilderWhere_1 = require("./queryBuilder/sql/getQueryBuilderWhere");
17
+ const clearEmpties_1 = require("./util/clearEmpties");
18
+ class TypeOrmConnector extends BaseConnector_1.BaseConnector {
19
+ repository;
20
+ dataSource;
21
+ inputSchema;
22
+ outputSchema;
23
+ entity;
24
+ constructor({ entity, dataSource, inputSchema, outputSchema }) {
25
+ super();
26
+ this.dataSource = dataSource;
27
+ this.inputSchema = inputSchema;
28
+ this.outputSchema =
29
+ outputSchema || inputSchema;
30
+ this.entity = entity;
31
+ }
32
+ initDB() {
33
+ this.repository = this.dataSource.getRepository(this.entity);
34
+ this.isMongoDB =
35
+ this.repository.metadata.connection.driver.options.type === 'mongodb';
36
+ if (this.isMongoDB) {
37
+ this.repository = this.dataSource.getMongoRepository(this.entity);
38
+ }
39
+ const relationShipBuilder = generatorDatasource_1.modelGeneratorDataSource.getRepository(this.entity);
40
+ const { relations } = (0, getRelationsFromModelGenerator_1.getRelationsFromModelGenerator)(relationShipBuilder);
41
+ this.modelRelations = relations;
42
+ this.outputKeys = (0, outputKeys_1.getOutputKeys)(relationShipBuilder) || [];
43
+ return 1;
44
+ }
45
+ // CREATE
46
+ /**
47
+ * Insert the data object into the database.
48
+ * @param data
49
+ */
50
+ async insert(data) {
51
+ this.initDB();
52
+ // Validate Input
53
+ const validatedData = this.inputSchema.parse(data);
54
+ if (this.isMongoDB && validatedData['id']) {
55
+ validatedData['_id'] = new bson_1.ObjectId(validatedData['id']);
56
+ delete validatedData['id'];
57
+ }
58
+ // Only Way to Skip the DeepPartial requirement from TypeORm
59
+ let datum = await this.repository.save(validatedData);
60
+ if (this.isMongoDB) {
61
+ datum['id'] = datum['id'].toString();
62
+ }
63
+ // Validate Output
64
+ return this.outputSchema.parse((0, clearEmpties_1.clearEmpties)(js_utils_1.Objects.deleteNulls(datum)));
65
+ }
66
+ async insertMany(data) {
67
+ this.initDB();
68
+ const validatedData = this.inputSchema.array().parse(data);
69
+ //
70
+ const inserted = await this.repository.save(validatedData, {
71
+ chunk: data.length / 300
72
+ });
73
+ return this.outputSchema.array().parse(inserted.map(d => {
74
+ if (this.isMongoDB && d['id']) {
75
+ d['id'] = d['id'].toString();
76
+ }
77
+ return (0, clearEmpties_1.clearEmpties)(js_utils_1.Objects.deleteNulls(d));
78
+ }));
79
+ }
80
+ // READ
81
+ async findMany(query) {
82
+ this.initDB();
83
+ const requiresCustomQuery = query?.include && Object.keys(query.include).length;
84
+ if (this.isMongoDB) {
85
+ const results = await this.customMongoRelatedFind(query);
86
+ return results;
87
+ }
88
+ if (requiresCustomQuery) {
89
+ const { queryBuilder: customQuery, selectedKeys } = this.customTypeOrmRelatedFind({
90
+ fluentQuery: query
91
+ });
92
+ customQuery.select(selectedKeys);
93
+ // Get the count for pagination
94
+ // TODO: do the pagination
95
+ let [result, count] = await customQuery.getManyAndCount();
96
+ // Apply select filtering if needed
97
+ //TODO: We have to validate the results!
98
+ return result;
99
+ }
100
+ // Generate normal TypeORM Query
101
+ const generatedQuery = this.generateTypeOrmQuery(query);
102
+ let [found, count] = await this.repository.findAndCount(generatedQuery);
103
+ found.map(d => {
104
+ if (this.isMongoDB && d['_id']) {
105
+ d.id = d['_id'].toString();
106
+ }
107
+ (0, clearEmpties_1.clearEmpties)(js_utils_1.Objects.deleteNulls(d));
108
+ });
109
+ if (query?.paginated) {
110
+ const paginationInfo = {
111
+ total: count,
112
+ perPage: query.paginated.perPage,
113
+ currentPage: query.paginated.page,
114
+ nextPage: query.paginated.page + 1,
115
+ firstPage: 1,
116
+ lastPage: Math.ceil(count / query.paginated.perPage),
117
+ prevPage: query.paginated.page === 1 ? null : query.paginated.page - 1,
118
+ from: (query.paginated.page - 1) * query.paginated.perPage + 1,
119
+ to: query.paginated.perPage * query.paginated.page,
120
+ data: found
121
+ };
122
+ return paginationInfo;
123
+ }
124
+ if (query?.select) {
125
+ // Filter out fields that are explicitly set to false
126
+ found = this.applySelectFilter(found, query.select);
127
+ return found;
128
+ }
129
+ // Validate Output against schema
130
+ return this.outputSchema?.array().parse(found);
131
+ }
132
+ // UPDATE
133
+ /**
134
+ * PATCH operation
135
+ * @param data
136
+ */
137
+ async updateById(id, data) {
138
+ this.initDB();
139
+ const dataToInsert = this.outputKeys.includes('updated')
140
+ ? {
141
+ ...data,
142
+ ...{ updated: new Date() }
143
+ }
144
+ : data;
145
+ const validatedData = this.inputSchema.parse(dataToInsert);
146
+ await this.repository.update(id, validatedData);
147
+ // Validate Output
148
+ return (await this.requireById(id));
149
+ }
150
+ /**
151
+ *
152
+ * PUT operation. All fields not included in the data
153
+ * param will be set to null
154
+ *
155
+ * @param id
156
+ * @param data
157
+ */
158
+ async replaceById(id, data) {
159
+ this.initDB();
160
+ const idFieldName = this.isMongoDB ? '_id' : 'id';
161
+ const value = this.requireById(id);
162
+ const flatValue = js_utils_1.Objects.flatten(JSON.parse(JSON.stringify(value)));
163
+ Object.keys(flatValue).forEach(key => {
164
+ flatValue[key] = null;
165
+ });
166
+ const nullObject = js_utils_1.Objects.nest(flatValue);
167
+ const newValue = { ...nullObject, ...data };
168
+ delete newValue._id;
169
+ delete newValue.id;
170
+ delete newValue.created;
171
+ delete newValue.updated;
172
+ const dataToInsert = this.outputKeys.includes('updated')
173
+ ? {
174
+ ...data,
175
+ ...{ updated: new Date() }
176
+ }
177
+ : data;
178
+ const validatedData = this.inputSchema.parse(dataToInsert);
179
+ await this.repository.update(id, validatedData);
180
+ return (await this.requireById(id));
181
+ }
182
+ // DELETE
183
+ /**
184
+ *
185
+ * @param id
186
+ * @returns
187
+ */
188
+ async deleteById(id) {
189
+ this.initDB();
190
+ const parsedId = this.isMongoDB
191
+ ? new bson_1.ObjectId(id)
192
+ : id;
193
+ await this.repository.delete(parsedId);
194
+ return id;
195
+ }
196
+ /**
197
+ *
198
+ * @returns
199
+ */
200
+ async clear() {
201
+ this.initDB();
202
+ await this.repository.clear();
203
+ return true;
204
+ }
205
+ // RELATIONS
206
+ /**
207
+ *
208
+ * @param query
209
+ * @returns
210
+ */
211
+ loadFirst(query) {
212
+ this.initDB();
213
+ // Create a clone of the original class
214
+ // to avoid polluting attributes (relatedQuery)
215
+ const newInstance = this.clone();
216
+ newInstance.setRelatedQuery({
217
+ entity: this.entity,
218
+ repository: this,
219
+ query: {
220
+ ...query,
221
+ limit: 1
222
+ }
223
+ });
224
+ return newInstance;
225
+ }
226
+ /**
227
+ *
228
+ * @param id
229
+ * @returns
230
+ */
231
+ loadById(id) {
232
+ this.initDB();
233
+ // Create a new instance to avoid polluting the original one
234
+ const newInstance = this.clone();
235
+ newInstance.setRelatedQuery({
236
+ entity: this.entity,
237
+ repository: this,
238
+ query: {
239
+ where: {
240
+ id
241
+ }
242
+ }
243
+ });
244
+ return newInstance;
245
+ }
246
+ /**
247
+ *
248
+ * Returns the TypeOrm Repository, you can use it
249
+ * form more complex queries and to get
250
+ * the TypeOrm query builder
251
+ *
252
+ * @param query
253
+ */
254
+ raw() {
255
+ this.initDB();
256
+ return this.repository;
257
+ }
258
+ /**
259
+ *
260
+ * Returns the TypeOrm Repository, you can use it
261
+ * form more complex queries and to get
262
+ * the TypeOrm query builder
263
+ *
264
+ * @param query
265
+ */
266
+ mongoRaw() {
267
+ this.initDB();
268
+ return this.repository;
269
+ }
270
+ /**
271
+ * Creates a Clone of the current instance of the class
272
+ * @returns
273
+ */
274
+ clone() {
275
+ this.initDB();
276
+ return new this.constructor();
277
+ }
278
+ /**
279
+ * Apply select filter to remove fields explicitly set to false
280
+ * @param results The query results
281
+ * @param select The select configuration
282
+ * @returns Filtered results
283
+ */
284
+ applySelectFilter(results, select) {
285
+ if (!select)
286
+ return results;
287
+ const flatSelect = js_utils_1.Objects.flatten(select);
288
+ const fieldsToInclude = new Set();
289
+ const fieldsToExclude = new Set();
290
+ let hasIncludes = false;
291
+ // Separate fields to include and exclude
292
+ for (const [key, value] of Object.entries(flatSelect)) {
293
+ // Convert to string for consistent comparison
294
+ const strValue = String(value);
295
+ if (strValue === 'true' || strValue === '1') {
296
+ fieldsToInclude.add(key);
297
+ hasIncludes = true;
298
+ }
299
+ else if (strValue === 'false' || strValue === '0') {
300
+ fieldsToExclude.add(key);
301
+ }
302
+ }
303
+ return results.map(result => {
304
+ // If there are explicit includes, only include those fields (exclusive selection)
305
+ if (hasIncludes) {
306
+ const filtered = {};
307
+ // For exclusive selection, only copy fields that are explicitly included
308
+ for (const field of fieldsToInclude) {
309
+ if (field.includes('.')) {
310
+ // Handle nested field paths
311
+ const parts = field.split('.');
312
+ let source = result;
313
+ let target = filtered;
314
+ for (let i = 0; i < parts.length - 1; i++) {
315
+ const part = parts[i];
316
+ if (!part || !source[part])
317
+ break;
318
+ source = source[part];
319
+ if (!target[part])
320
+ target[part] = {};
321
+ target = target[part];
322
+ }
323
+ if (source && parts.length > 0) {
324
+ const lastPart = parts[parts.length - 1];
325
+ if (lastPart) {
326
+ target[lastPart] = source[lastPart];
327
+ }
328
+ }
329
+ }
330
+ else if (field in result) {
331
+ filtered[field] = result[field];
332
+ }
333
+ }
334
+ return filtered;
335
+ }
336
+ else {
337
+ // If there are only excludes, include all fields except excluded ones
338
+ const filtered = { ...result };
339
+ for (const field of fieldsToExclude) {
340
+ if (field.includes('.')) {
341
+ const parts = field.split('.');
342
+ let current = filtered;
343
+ for (let i = 0; i < parts.length - 1; i++) {
344
+ const part = parts[i];
345
+ if (!part || !current[part])
346
+ break;
347
+ current = current[part];
348
+ }
349
+ if (current && parts.length > 0) {
350
+ const lastPart = parts[parts.length - 1];
351
+ if (lastPart) {
352
+ delete current[lastPart];
353
+ }
354
+ }
355
+ }
356
+ else {
357
+ delete filtered[field];
358
+ }
359
+ }
360
+ return filtered;
361
+ }
362
+ });
363
+ }
364
+ /**
365
+ *
366
+ * @param query
367
+ * @returns
368
+ */
369
+ generateTypeOrmQuery(query) {
370
+ let filter = {};
371
+ filter.where = this.isMongoDB
372
+ ? (0, getMongoWhere_1.getMongoWhere)({
373
+ where: query?.where
374
+ })
375
+ : (0, getTypeOrmWhere_1.getTypeOrmWhere)({
376
+ where: query?.where
377
+ });
378
+ filter.take = query?.limit;
379
+ filter.skip = query?.offset;
380
+ // Pagination
381
+ if (query?.paginated) {
382
+ filter.take = query.paginated.perPage;
383
+ filter.skip = (query.paginated?.page - 1) * query?.paginated.perPage;
384
+ }
385
+ if (query?.select) {
386
+ const selectQuery = js_utils_1.Objects.flatten(query?.select || {});
387
+ // Filter out fields with false values - TypeORM only accepts fields to include
388
+ const fieldsToSelect = Object.keys(selectQuery).filter(key => {
389
+ const val = selectQuery[key];
390
+ return val !== undefined && (String(val) === 'true' || String(val) === '1');
391
+ });
392
+ if (fieldsToSelect.length > 0) {
393
+ // TypeORM expects select to be an object with field names as keys
394
+ const selectObject = fieldsToSelect.reduce((acc, field) => {
395
+ acc[field] = true;
396
+ return acc;
397
+ }, {});
398
+ filter.select = selectObject;
399
+ }
400
+ }
401
+ if (query?.orderBy) {
402
+ filter.order = (0, extractOrderBy_1.extractOrderBy)(query.orderBy);
403
+ }
404
+ if (query?.include) {
405
+ filter.relations = (0, extractInclude_1.extractInclude)(query.include);
406
+ }
407
+ return filter;
408
+ }
409
+ /**
410
+ *
411
+ * @param query
412
+ * @returns
413
+ */
414
+ customTypeOrmRelatedFind({ fluentQuery: query, queryBuilder, targetFluentRepository, alias, isLeftJoin }) {
415
+ const queryAlias = alias || queryBuilder?.alias || `${this.repository.metadata.tableName}`;
416
+ let customQuery = queryBuilder || this.raw().createQueryBuilder(queryAlias);
417
+ const self = targetFluentRepository || this;
418
+ if (!isLeftJoin) {
419
+ customQuery = (0, getQueryBuilderWhere_1.getQueryBuilderWhere)({
420
+ queryBuilder: customQuery,
421
+ queryAlias,
422
+ where: query?.where
423
+ });
424
+ }
425
+ const { queryBuilder: qb, selectedKeys } = this.getTypeOrmQueryBuilderSubqueries({
426
+ queryBuilder: customQuery,
427
+ selfReference: targetFluentRepository,
428
+ include: query?.include,
429
+ leftTableAlias: alias
430
+ });
431
+ customQuery = qb;
432
+ const extraKeys = this.getTypeOrmQueryBuilderSelect(queryAlias, self, query?.select);
433
+ const keySet = new Set([...selectedKeys, ...extraKeys]);
434
+ // if (query?.limit) {
435
+ // customQuery = customQuery.limit(query?.limit)
436
+ // }
437
+ // if (query?.offset) {
438
+ // customQuery = customQuery.offset(query?.offset)
439
+ // }
440
+ // if (query?.take) {
441
+ // customQuery = customQuery.take(query?.take)
442
+ // }
443
+ return {
444
+ queryBuilder: customQuery,
445
+ selectedKeys: Array.from(keySet)
446
+ };
447
+ }
448
+ getTypeOrmQueryBuilderSelect(queryAlias, self, select) {
449
+ const selected = js_utils_1.Objects.flatten(select || {});
450
+ const selectedKeys = [];
451
+ const iterableKeys = Object.keys(selected).length
452
+ ? Object.keys(selected)
453
+ : self.outputKeys || [];
454
+ const baseNestedKeys = new Set();
455
+ for (const key of iterableKeys) {
456
+ const keyArray = key.split('.');
457
+ // There are no nested objects
458
+ if (keyArray.length <= 1) {
459
+ continue;
460
+ }
461
+ const total = keyArray.length;
462
+ for (const [index, val] of keyArray.entries()) {
463
+ // No need to iterate over the last object
464
+ if (total === index + 1) {
465
+ continue;
466
+ }
467
+ let excludedField = '';
468
+ if (excludedField) {
469
+ excludedField = `${excludedField}.${excludedField}${val}`;
470
+ }
471
+ excludedField = `${excludedField}${val}`;
472
+ baseNestedKeys.add(excludedField);
473
+ }
474
+ }
475
+ for (const k of iterableKeys) {
476
+ const field = k.includes('.') ? js_utils_1.Strings.camel(`${k}`) : k;
477
+ const search = `${queryAlias}.${field}`;
478
+ // isRelatedField: We can tell if the field is a "related model"
479
+ // checking "this" for the name of the relation
480
+ let isNestedRelation = false;
481
+ for (const item of k.split('.')) {
482
+ if (!!self[item]) {
483
+ isNestedRelation = true;
484
+ break;
485
+ }
486
+ }
487
+ if (!!self[field] || !!self[queryAlias] || isNestedRelation) {
488
+ continue;
489
+ }
490
+ // No need to include base keys
491
+ if (baseNestedKeys.has(field)) {
492
+ continue;
493
+ }
494
+ selectedKeys.push(search);
495
+ }
496
+ return selectedKeys;
497
+ }
498
+ getTypeOrmQueryBuilderSubqueries({ queryBuilder, selfReference, include, leftTableAlias }) {
499
+ const selectedKeys = [];
500
+ if (!include) {
501
+ return { queryBuilder, selectedKeys };
502
+ }
503
+ for (const relation of Object.keys(include)) {
504
+ // i.e To make this code more understandable
505
+ // table "users" has many "cars"
506
+ // For a first level query, represents "users"
507
+ const self = selfReference || this;
508
+ // All information about the users[cars] relation
509
+ const dbRelation = self.modelRelations[relation];
510
+ // The "cars" table repository
511
+ // this will be use for possible recursive queries
512
+ const newSelf = self[relation]();
513
+ // Extract new query for this included relationship
514
+ const fluentRelatedQuery = include[relation] === true ? {} : include[relation];
515
+ if (!dbRelation) {
516
+ throw new Error(`The relation ${relation} is not properly defined. Check your entity and repository`);
517
+ }
518
+ // Now we need to decide which properties we want to select from the related model
519
+ // If the query has some {select: [x]: true}
520
+ const selectedKeysArray = fluentRelatedQuery?.select
521
+ ? Object.keys(js_utils_1.Objects.flatten(fluentRelatedQuery.select))
522
+ : [];
523
+ if (dbRelation.isManyToOne) {
524
+ // We now have the opposite "cars" has one "users"
525
+ // "cars"
526
+ // Or users___cars if it comes from a nested relation
527
+ const leftSideTableName = leftTableAlias || queryBuilder.alias;
528
+ // "cars.userId"
529
+ // users___cars.userId (if nested)
530
+ const leftSideForeignKey = `${leftSideTableName}.${dbRelation.joinColumns[0].propertyPath}`;
531
+ // Right side considering nested relations
532
+ // users___cars___cars___user
533
+ const rightSideTableName = `${leftSideTableName}_${relation}`;
534
+ const rightSidePrimaryKey = `${rightSideTableName}.id`;
535
+ const keys = new Set(selectedKeysArray.map(k => `${rightSideTableName}.${k}`));
536
+ selectedKeys.push(...Array.from(keys));
537
+ const shallowQuery = { ...fluentRelatedQuery };
538
+ delete shallowQuery['include'];
539
+ const { queryBuilder: leftJoinBuilder, selectedKeys: deepkeys } = this.customTypeOrmRelatedFind({
540
+ queryBuilder: this.raw().createQueryBuilder(rightSideTableName),
541
+ fluentQuery: shallowQuery,
542
+ targetFluentRepository: newSelf,
543
+ alias: rightSideTableName
544
+ });
545
+ selectedKeys.push(...deepkeys);
546
+ const joinQuery = leftJoinBuilder.getQuery().split('WHERE');
547
+ const customLeftJoin = joinQuery && joinQuery[1] ? joinQuery[1].trim() : '1=1';
548
+ const leftJoinParams = leftJoinBuilder.getParameters();
549
+ // Finally we get to do the LEFT JOIN
550
+ queryBuilder.leftJoinAndMapOne(`${leftSideTableName}.${relation}`, dbRelation.targetClass,
551
+ // Right side of the JOIN table name
552
+ // The name of the table that comes from the query above!
553
+ rightSideTableName,
554
+ // Keys to JOIN ON
555
+ // This must account for all aliases used above
556
+ `(${leftSideForeignKey} = ${rightSidePrimaryKey} AND ${customLeftJoin} )`, leftJoinParams);
557
+ const { queryBuilder: qb, selectedKeys: k } = this.customTypeOrmRelatedFind({
558
+ queryBuilder,
559
+ fluentQuery: fluentRelatedQuery,
560
+ targetFluentRepository: newSelf,
561
+ alias: rightSideTableName,
562
+ isLeftJoin: true
563
+ });
564
+ selectedKeys.push(...k);
565
+ queryBuilder = qb;
566
+ }
567
+ if (dbRelation.isOneToMany) {
568
+ // "users"
569
+ const leftSideTableName = leftTableAlias || queryBuilder.alias;
570
+ // As it is one to many, primary key will always be "id"
571
+ // users.id
572
+ const leftSidePrimaryKey = `${leftSideTableName}.id`;
573
+ // "cars"
574
+ const rightSideTableName = `${leftSideTableName}_${relation}`;
575
+ // "cars".userId
576
+ const rightSideForeignKey = `${rightSideTableName}.${dbRelation.inverseSidePropertyPath}`;
577
+ const keys = new Set(selectedKeysArray.map(k => `${rightSideTableName}.${k}`));
578
+ selectedKeys.push(...Array.from(keys));
579
+ // Left join query, without including any nested tables
580
+ const shallowQuery = { ...fluentRelatedQuery };
581
+ delete shallowQuery['include'];
582
+ const { queryBuilder: leftJoinBuilder, selectedKeys: deepKeys } = this.customTypeOrmRelatedFind({
583
+ queryBuilder: this.raw().createQueryBuilder(rightSideTableName),
584
+ fluentQuery: shallowQuery,
585
+ targetFluentRepository: newSelf,
586
+ alias: rightSideTableName
587
+ });
588
+ selectedKeys.push(...deepKeys);
589
+ const joinQuery = leftJoinBuilder.getQuery().split('WHERE');
590
+ const customLeftJoin = joinQuery && joinQuery[1] ? joinQuery[1].trim() : '1=1';
591
+ const leftJoinParams = leftJoinBuilder.getParameters();
592
+ // Finally we get to do the LEFT JOIN
593
+ queryBuilder.leftJoinAndMapMany(`${leftSideTableName}.${relation}`, dbRelation.targetClass,
594
+ // Right side of the JOIN table name
595
+ rightSideTableName,
596
+ // Keys to JOIN ON
597
+ `(${leftSidePrimaryKey} = ${rightSideForeignKey} AND ${customLeftJoin} )`, leftJoinParams);
598
+ const { queryBuilder: q, selectedKeys: k } = this.customTypeOrmRelatedFind({
599
+ queryBuilder,
600
+ fluentQuery: fluentRelatedQuery,
601
+ targetFluentRepository: newSelf,
602
+ alias: rightSideTableName,
603
+ isLeftJoin: true
604
+ });
605
+ selectedKeys.push(...k);
606
+ queryBuilder = q;
607
+ }
608
+ // if (dbRelation.isManyToMany) {
609
+ // const relatedTableName = dbRelation.tableName
610
+ // const pivotTableName =
611
+ // dbRelation.joinColumns[0].relationMetadata.joinTableName
612
+ // const pivotForeignField = dbRelation.joinColumns[0].propertyPath
613
+ // const inverseForeignField =
614
+ // dbRelation.inverseJoinColumns[0].propertyPath
615
+ // if (
616
+ // !relatedTableName ||
617
+ // !pivotTableName ||
618
+ // !pivotForeignField ||
619
+ // !inverseForeignField
620
+ // ) {
621
+ // throw new Error(
622
+ // `Your many to many relation is not properly set up. Please check both your models and schema for relation: ${relation}`
623
+ // )
624
+ // }
625
+ // // "users"
626
+ // const leftSideTableName = leftTableAlias || queryBuilder.alias
627
+ // // As it is one to many, primary key will always be "id"
628
+ // // users.id
629
+ // const leftSidePrimaryKey = `${leftSideTableName}.id`
630
+ // // "roles_users"
631
+ // const rightSideTableName = `${relatedTableName}`
632
+ // // "roles_users".userId
633
+ // const rightSideForeignKey = `${rightSideTableName}.${pivotForeignField}`
634
+ // const keys = new Set(
635
+ // selectedKeysArray.map(k => `${rightSideTableName}.${k}`)
636
+ // )
637
+ // selectedKeys.push(...Array.from(keys))
638
+ // // Left join query, without including any nested tables
639
+ // const shallowQuery = { ...fluentRelatedQuery }
640
+ // delete shallowQuery['include']
641
+ // const { queryBuilder: leftJoinBuilder, selectedKeys: deepKeys } =
642
+ // this.customTypeOrmRelatedFind({
643
+ // queryBuilder: this.raw().createQueryBuilder(rightSideTableName),
644
+ // fluentQuery: shallowQuery,
645
+ // targetFluentRepository: newSelf,
646
+ // alias: rightSideTableName
647
+ // })
648
+ // selectedKeys.push(...deepKeys)
649
+ // const joinQuery = leftJoinBuilder.getQuery().split('WHERE')
650
+ // const customLeftJoin =
651
+ // joinQuery && joinQuery[1] ? joinQuery[1].trim() : '1=1'
652
+ // const leftJoinParams = leftJoinBuilder.getParameters()
653
+ // // Finally we get to do the LEFT JOIN
654
+ // queryBuilder.leftJoinAndMapMany(
655
+ // `${leftSideTableName}.${relation}`,
656
+ // dbRelation.targetClass,
657
+ // // Right side of the JOIN table name
658
+ // rightSideTableName,
659
+ // // Keys to JOIN ON
660
+ // `(${leftSidePrimaryKey} = ${rightSideForeignKey} AND ${customLeftJoin} )`,
661
+ // leftJoinParams
662
+ // )
663
+ // const { queryBuilder: q, selectedKeys: k } =
664
+ // this.customTypeOrmRelatedFind({
665
+ // queryBuilder,
666
+ // fluentQuery: fluentRelatedQuery,
667
+ // targetFluentRepository: newSelf,
668
+ // alias: rightSideTableName,
669
+ // isLeftJoin: true
670
+ // })
671
+ // selectedKeys.push(...k)
672
+ // queryBuilder = q
673
+ // console.log(
674
+ // relatedTableName,
675
+ // pivotTableName,
676
+ // pivotForeignField,
677
+ // inverseForeignField
678
+ // )
679
+ // continue
680
+ // // lookUps.push({ $addFields: { id: { $toString: '$_id' } } })
681
+ // // lookUps.push({
682
+ // // $addFields: { parent_string_id: { $toString: '$_id' } }
683
+ // // })
684
+ // // lookUps.push({
685
+ // // $lookup: {
686
+ // // from: pivotTableName,
687
+ // // localField: 'parent_string_id',
688
+ // // foreignField: pivotForeignField,
689
+ // // as: dbRelation.propertyName,
690
+ // // pipeline: [
691
+ // // // This is the pivot table
692
+ // // { $addFields: { id: { $toString: '$_id' } } },
693
+ // // {
694
+ // // $addFields: {
695
+ // // [`${inverseForeignField}_object`]: {
696
+ // // $toObjectId: `$${inverseForeignField}`
697
+ // // }
698
+ // // }
699
+ // // },
700
+ // // // The other side of the relationShip
701
+ // // {
702
+ // // $lookup: {
703
+ // // from: relatedTableName,
704
+ // // localField: `${inverseForeignField}_object`,
705
+ // // foreignField: '_id',
706
+ // // pipeline: [
707
+ // // { $addFields: { id: { $toString: '$_id' } } }
708
+ // // // Here we could add more filters like
709
+ // // //{ $limit: 2 }
710
+ // // ],
711
+ // // as: dbRelation.propertyName
712
+ // // }
713
+ // // },
714
+ // // { $unwind: `$${dbRelation.propertyName}` },
715
+ // // // Select (ish)
716
+ // // {
717
+ // // $project: {
718
+ // // [dbRelation.propertyName]: `$${dbRelation.propertyName}`,
719
+ // // pivot: '$$ROOT'
720
+ // // }
721
+ // // },
722
+ // // {
723
+ // // $replaceRoot: {
724
+ // // newRoot: {
725
+ // // $mergeObjects: ['$$ROOT', `$${dbRelation.propertyName}`]
726
+ // // }
727
+ // // }
728
+ // // },
729
+ // // { $project: { [dbRelation.propertyName]: 0 } }
730
+ // // // Here we could add more filters like
731
+ // // //{ $limit: 2 }
732
+ // // ]
733
+ // // }
734
+ // // })
735
+ // }
736
+ }
737
+ return { queryBuilder, selectedKeys };
738
+ }
739
+ /**
740
+ *
741
+ * @param query
742
+ * @returns
743
+ */
744
+ async customMongoRelatedFind(query) {
745
+ const aggregate = (0, getMongoFindAggregatedQuery_1.getMongoFindAggregatedQuery)({
746
+ query,
747
+ self: this
748
+ });
749
+ const raw = await this.mongoRaw().aggregate(aggregate).toArray();
750
+ if (query?.select) {
751
+ // Apply select filtering for MongoDB results
752
+ const filtered = this.applySelectFilter(raw, query.select);
753
+ return filtered;
754
+ }
755
+ return this.outputSchema?.array().parse(raw);
756
+ }
757
+ }
758
+ exports.TypeOrmConnector = TypeOrmConnector;
759
+ tslib_1.__decorate([
760
+ js_utils_1.Memo.syncMethod(),
761
+ tslib_1.__metadata("design:type", Function),
762
+ tslib_1.__metadata("design:paramtypes", []),
763
+ tslib_1.__metadata("design:returntype", void 0)
764
+ ], TypeOrmConnector.prototype, "initDB", null);
765
+ //# sourceMappingURL=TypeOrmConnector.js.map