@strapi/database 5.12.1 → 5.12.2

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 (321) hide show
  1. package/dist/connection.js +43 -0
  2. package/dist/connection.js.map +1 -0
  3. package/dist/connection.mjs +41 -0
  4. package/dist/connection.mjs.map +1 -0
  5. package/dist/dialects/dialect.js +54 -0
  6. package/dist/dialects/dialect.js.map +1 -0
  7. package/dist/dialects/dialect.mjs +52 -0
  8. package/dist/dialects/dialect.mjs.map +1 -0
  9. package/dist/dialects/index.js +44 -0
  10. package/dist/dialects/index.js.map +1 -0
  11. package/dist/dialects/index.mjs +42 -0
  12. package/dist/dialects/index.mjs.map +1 -0
  13. package/dist/dialects/mysql/constants.js +8 -0
  14. package/dist/dialects/mysql/constants.js.map +1 -0
  15. package/dist/dialects/mysql/constants.mjs +5 -0
  16. package/dist/dialects/mysql/constants.mjs.map +1 -0
  17. package/dist/dialects/mysql/database-inspector.js +35 -0
  18. package/dist/dialects/mysql/database-inspector.js.map +1 -0
  19. package/dist/dialects/mysql/database-inspector.mjs +33 -0
  20. package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
  21. package/dist/dialects/mysql/index.js +75 -0
  22. package/dist/dialects/mysql/index.js.map +1 -0
  23. package/dist/dialects/mysql/index.mjs +73 -0
  24. package/dist/dialects/mysql/index.mjs.map +1 -0
  25. package/dist/dialects/mysql/schema-inspector.js +297 -0
  26. package/dist/dialects/mysql/schema-inspector.js.map +1 -0
  27. package/dist/dialects/mysql/schema-inspector.mjs +295 -0
  28. package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
  29. package/dist/dialects/postgresql/index.js +62 -0
  30. package/dist/dialects/postgresql/index.js.map +1 -0
  31. package/dist/dialects/postgresql/index.mjs +60 -0
  32. package/dist/dialects/postgresql/index.mjs.map +1 -0
  33. package/dist/dialects/postgresql/schema-inspector.js +316 -0
  34. package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
  35. package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
  36. package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
  37. package/dist/dialects/sqlite/index.js +82 -0
  38. package/dist/dialects/sqlite/index.js.map +1 -0
  39. package/dist/dialects/sqlite/index.mjs +80 -0
  40. package/dist/dialects/sqlite/index.mjs.map +1 -0
  41. package/dist/dialects/sqlite/schema-inspector.js +211 -0
  42. package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
  43. package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
  44. package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
  45. package/dist/entity-manager/entity-repository.js +139 -0
  46. package/dist/entity-manager/entity-repository.js.map +1 -0
  47. package/dist/entity-manager/entity-repository.mjs +137 -0
  48. package/dist/entity-manager/entity-repository.mjs.map +1 -0
  49. package/dist/entity-manager/index.js +1186 -0
  50. package/dist/entity-manager/index.js.map +1 -0
  51. package/dist/entity-manager/index.mjs +1184 -0
  52. package/dist/entity-manager/index.mjs.map +1 -0
  53. package/dist/entity-manager/morph-relations.js +73 -0
  54. package/dist/entity-manager/morph-relations.js.map +1 -0
  55. package/dist/entity-manager/morph-relations.mjs +69 -0
  56. package/dist/entity-manager/morph-relations.mjs.map +1 -0
  57. package/dist/entity-manager/regular-relations.js +247 -0
  58. package/dist/entity-manager/regular-relations.js.map +1 -0
  59. package/dist/entity-manager/regular-relations.mjs +242 -0
  60. package/dist/entity-manager/regular-relations.mjs.map +1 -0
  61. package/dist/entity-manager/relations-orderer.js +221 -0
  62. package/dist/entity-manager/relations-orderer.js.map +1 -0
  63. package/dist/entity-manager/relations-orderer.mjs +218 -0
  64. package/dist/entity-manager/relations-orderer.mjs.map +1 -0
  65. package/dist/errors/database.js +13 -0
  66. package/dist/errors/database.js.map +1 -0
  67. package/dist/errors/database.mjs +11 -0
  68. package/dist/errors/database.mjs.map +1 -0
  69. package/dist/errors/index.js +18 -0
  70. package/dist/errors/index.js.map +1 -0
  71. package/dist/errors/index.mjs +7 -0
  72. package/dist/errors/index.mjs.map +1 -0
  73. package/dist/errors/invalid-date.js +13 -0
  74. package/dist/errors/invalid-date.js.map +1 -0
  75. package/dist/errors/invalid-date.mjs +11 -0
  76. package/dist/errors/invalid-date.mjs.map +1 -0
  77. package/dist/errors/invalid-datetime.js +13 -0
  78. package/dist/errors/invalid-datetime.js.map +1 -0
  79. package/dist/errors/invalid-datetime.mjs +11 -0
  80. package/dist/errors/invalid-datetime.mjs.map +1 -0
  81. package/dist/errors/invalid-relation.js +13 -0
  82. package/dist/errors/invalid-relation.js.map +1 -0
  83. package/dist/errors/invalid-relation.mjs +11 -0
  84. package/dist/errors/invalid-relation.mjs.map +1 -0
  85. package/dist/errors/invalid-time.js +13 -0
  86. package/dist/errors/invalid-time.js.map +1 -0
  87. package/dist/errors/invalid-time.mjs +11 -0
  88. package/dist/errors/invalid-time.mjs.map +1 -0
  89. package/dist/errors/not-null.js +17 -0
  90. package/dist/errors/not-null.js.map +1 -0
  91. package/dist/errors/not-null.mjs +15 -0
  92. package/dist/errors/not-null.mjs.map +1 -0
  93. package/dist/fields/biginteger.js +9 -0
  94. package/dist/fields/biginteger.js.map +1 -0
  95. package/dist/fields/biginteger.mjs +7 -0
  96. package/dist/fields/biginteger.mjs.map +1 -0
  97. package/dist/fields/boolean.js +48 -0
  98. package/dist/fields/boolean.js.map +1 -0
  99. package/dist/fields/boolean.mjs +46 -0
  100. package/dist/fields/boolean.mjs.map +1 -0
  101. package/dist/fields/date.js +16 -0
  102. package/dist/fields/date.js.map +1 -0
  103. package/dist/fields/date.mjs +14 -0
  104. package/dist/fields/date.mjs.map +1 -0
  105. package/dist/fields/datetime.js +37 -0
  106. package/dist/fields/datetime.js.map +1 -0
  107. package/dist/fields/datetime.mjs +16 -0
  108. package/dist/fields/datetime.mjs.map +1 -0
  109. package/dist/fields/field.js +16 -0
  110. package/dist/fields/field.js.map +1 -0
  111. package/dist/fields/field.mjs +14 -0
  112. package/dist/fields/field.mjs.map +1 -0
  113. package/dist/fields/index.js +45 -0
  114. package/dist/fields/index.js.map +1 -0
  115. package/dist/fields/index.mjs +43 -0
  116. package/dist/fields/index.mjs.map +1 -0
  117. package/dist/fields/json.js +36 -0
  118. package/dist/fields/json.js.map +1 -0
  119. package/dist/fields/json.mjs +34 -0
  120. package/dist/fields/json.mjs.map +1 -0
  121. package/dist/fields/number.js +20 -0
  122. package/dist/fields/number.js.map +1 -0
  123. package/dist/fields/number.mjs +18 -0
  124. package/dist/fields/number.mjs.map +1 -0
  125. package/dist/fields/shared/parsers.js +91 -0
  126. package/dist/fields/shared/parsers.js.map +1 -0
  127. package/dist/fields/shared/parsers.mjs +68 -0
  128. package/dist/fields/shared/parsers.mjs.map +1 -0
  129. package/dist/fields/string.js +16 -0
  130. package/dist/fields/string.js.map +1 -0
  131. package/dist/fields/string.mjs +14 -0
  132. package/dist/fields/string.mjs.map +1 -0
  133. package/dist/fields/time.js +17 -0
  134. package/dist/fields/time.js.map +1 -0
  135. package/dist/fields/time.mjs +15 -0
  136. package/dist/fields/time.mjs.map +1 -0
  137. package/dist/fields/timestamp.js +37 -0
  138. package/dist/fields/timestamp.js.map +1 -0
  139. package/dist/fields/timestamp.mjs +16 -0
  140. package/dist/fields/timestamp.mjs.map +1 -0
  141. package/dist/index.js +33 -8569
  142. package/dist/index.js.map +1 -1
  143. package/dist/index.mjs +16 -8532
  144. package/dist/index.mjs.map +1 -1
  145. package/dist/lifecycles/index.js +73 -0
  146. package/dist/lifecycles/index.js.map +1 -0
  147. package/dist/lifecycles/index.mjs +71 -0
  148. package/dist/lifecycles/index.mjs.map +1 -0
  149. package/dist/lifecycles/subscribers/index.js +10 -0
  150. package/dist/lifecycles/subscribers/index.js.map +1 -0
  151. package/dist/lifecycles/subscribers/index.mjs +8 -0
  152. package/dist/lifecycles/subscribers/index.mjs.map +1 -0
  153. package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
  154. package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
  155. package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
  156. package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
  157. package/dist/lifecycles/subscribers/timestamps.js +55 -0
  158. package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
  159. package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
  160. package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
  161. package/dist/metadata/index.js +24 -0
  162. package/dist/metadata/index.js.map +1 -0
  163. package/dist/metadata/index.mjs +16 -0
  164. package/dist/metadata/index.mjs.map +1 -0
  165. package/dist/metadata/metadata.js +100 -0
  166. package/dist/metadata/metadata.js.map +1 -0
  167. package/dist/metadata/metadata.mjs +98 -0
  168. package/dist/metadata/metadata.mjs.map +1 -0
  169. package/dist/metadata/relations.js +545 -0
  170. package/dist/metadata/relations.js.map +1 -0
  171. package/dist/metadata/relations.mjs +536 -0
  172. package/dist/metadata/relations.mjs.map +1 -0
  173. package/dist/migrations/common.js +8 -0
  174. package/dist/migrations/common.js.map +1 -0
  175. package/dist/migrations/common.mjs +6 -0
  176. package/dist/migrations/common.mjs.map +1 -0
  177. package/dist/migrations/index.js +39 -0
  178. package/dist/migrations/index.js.map +1 -0
  179. package/dist/migrations/index.mjs +37 -0
  180. package/dist/migrations/index.mjs.map +1 -0
  181. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
  182. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
  183. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
  184. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
  185. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
  186. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
  187. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
  188. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
  189. package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
  190. package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
  191. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
  192. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
  193. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
  194. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
  195. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
  196. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
  197. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
  198. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
  199. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
  200. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
  201. package/dist/migrations/internal-migrations/index.js +26 -0
  202. package/dist/migrations/internal-migrations/index.js.map +1 -0
  203. package/dist/migrations/internal-migrations/index.mjs +24 -0
  204. package/dist/migrations/internal-migrations/index.mjs.map +1 -0
  205. package/dist/migrations/internal.js +63 -0
  206. package/dist/migrations/internal.js.map +1 -0
  207. package/dist/migrations/internal.mjs +61 -0
  208. package/dist/migrations/internal.mjs.map +1 -0
  209. package/dist/migrations/logger.js +24 -0
  210. package/dist/migrations/logger.js.map +1 -0
  211. package/dist/migrations/logger.mjs +22 -0
  212. package/dist/migrations/logger.mjs.map +1 -0
  213. package/dist/migrations/storage.js +39 -0
  214. package/dist/migrations/storage.js.map +1 -0
  215. package/dist/migrations/storage.mjs +37 -0
  216. package/dist/migrations/storage.mjs.map +1 -0
  217. package/dist/migrations/users.js +87 -0
  218. package/dist/migrations/users.js.map +1 -0
  219. package/dist/migrations/users.mjs +85 -0
  220. package/dist/migrations/users.mjs.map +1 -0
  221. package/dist/query/helpers/join.js +127 -0
  222. package/dist/query/helpers/join.js.map +1 -0
  223. package/dist/query/helpers/join.mjs +122 -0
  224. package/dist/query/helpers/join.mjs.map +1 -0
  225. package/dist/query/helpers/order-by.js +167 -0
  226. package/dist/query/helpers/order-by.js.map +1 -0
  227. package/dist/query/helpers/order-by.mjs +163 -0
  228. package/dist/query/helpers/order-by.mjs.map +1 -0
  229. package/dist/query/helpers/populate/apply.js +592 -0
  230. package/dist/query/helpers/populate/apply.js.map +1 -0
  231. package/dist/query/helpers/populate/apply.mjs +590 -0
  232. package/dist/query/helpers/populate/apply.mjs.map +1 -0
  233. package/dist/query/helpers/populate/process.js +92 -0
  234. package/dist/query/helpers/populate/process.js.map +1 -0
  235. package/dist/query/helpers/populate/process.mjs +90 -0
  236. package/dist/query/helpers/populate/process.mjs.map +1 -0
  237. package/dist/query/helpers/search.js +67 -0
  238. package/dist/query/helpers/search.js.map +1 -0
  239. package/dist/query/helpers/search.mjs +65 -0
  240. package/dist/query/helpers/search.mjs.map +1 -0
  241. package/dist/query/helpers/streams/readable.js +131 -0
  242. package/dist/query/helpers/streams/readable.js.map +1 -0
  243. package/dist/query/helpers/streams/readable.mjs +129 -0
  244. package/dist/query/helpers/streams/readable.mjs.map +1 -0
  245. package/dist/query/helpers/transform.js +77 -0
  246. package/dist/query/helpers/transform.js.map +1 -0
  247. package/dist/query/helpers/transform.mjs +73 -0
  248. package/dist/query/helpers/transform.mjs.map +1 -0
  249. package/dist/query/helpers/where.js +372 -0
  250. package/dist/query/helpers/where.js.map +1 -0
  251. package/dist/query/helpers/where.mjs +369 -0
  252. package/dist/query/helpers/where.mjs.map +1 -0
  253. package/dist/query/query-builder.js +507 -0
  254. package/dist/query/query-builder.js.map +1 -0
  255. package/dist/query/query-builder.mjs +505 -0
  256. package/dist/query/query-builder.mjs.map +1 -0
  257. package/dist/repairs/index.js +13 -0
  258. package/dist/repairs/index.js.map +1 -0
  259. package/dist/repairs/index.mjs +11 -0
  260. package/dist/repairs/index.mjs.map +1 -0
  261. package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
  262. package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
  263. package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
  264. package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
  265. package/dist/schema/builder.js +354 -0
  266. package/dist/schema/builder.js.map +1 -0
  267. package/dist/schema/builder.mjs +352 -0
  268. package/dist/schema/builder.mjs.map +1 -0
  269. package/dist/schema/diff.js +379 -0
  270. package/dist/schema/diff.js.map +1 -0
  271. package/dist/schema/diff.mjs +377 -0
  272. package/dist/schema/diff.mjs.map +1 -0
  273. package/dist/schema/index.js +93 -0
  274. package/dist/schema/index.js.map +1 -0
  275. package/dist/schema/index.mjs +91 -0
  276. package/dist/schema/index.mjs.map +1 -0
  277. package/dist/schema/schema.js +266 -0
  278. package/dist/schema/schema.js.map +1 -0
  279. package/dist/schema/schema.mjs +264 -0
  280. package/dist/schema/schema.mjs.map +1 -0
  281. package/dist/schema/storage.js +58 -0
  282. package/dist/schema/storage.js.map +1 -0
  283. package/dist/schema/storage.mjs +56 -0
  284. package/dist/schema/storage.mjs.map +1 -0
  285. package/dist/transaction-context.js +65 -0
  286. package/dist/transaction-context.js.map +1 -0
  287. package/dist/transaction-context.mjs +63 -0
  288. package/dist/transaction-context.mjs.map +1 -0
  289. package/dist/utils/async-curry.js +19 -0
  290. package/dist/utils/async-curry.js.map +1 -0
  291. package/dist/utils/async-curry.mjs +17 -0
  292. package/dist/utils/async-curry.mjs.map +1 -0
  293. package/dist/utils/identifiers/hash.js +30 -0
  294. package/dist/utils/identifiers/hash.js.map +1 -0
  295. package/dist/utils/identifiers/hash.mjs +28 -0
  296. package/dist/utils/identifiers/hash.mjs.map +1 -0
  297. package/dist/utils/identifiers/index.js +414 -0
  298. package/dist/utils/identifiers/index.js.map +1 -0
  299. package/dist/utils/identifiers/index.mjs +411 -0
  300. package/dist/utils/identifiers/index.mjs.map +1 -0
  301. package/dist/utils/knex.js +21 -0
  302. package/dist/utils/knex.js.map +1 -0
  303. package/dist/utils/knex.mjs +18 -0
  304. package/dist/utils/knex.mjs.map +1 -0
  305. package/dist/utils/types.js +51 -0
  306. package/dist/utils/types.js.map +1 -0
  307. package/dist/utils/types.mjs +44 -0
  308. package/dist/utils/types.mjs.map +1 -0
  309. package/dist/validations/index.js +12 -0
  310. package/dist/validations/index.js.map +1 -0
  311. package/dist/validations/index.mjs +10 -0
  312. package/dist/validations/index.mjs.map +1 -0
  313. package/dist/validations/relations/bidirectional.js +64 -0
  314. package/dist/validations/relations/bidirectional.js.map +1 -0
  315. package/dist/validations/relations/bidirectional.mjs +62 -0
  316. package/dist/validations/relations/bidirectional.mjs.map +1 -0
  317. package/dist/validations/relations/index.js +13 -0
  318. package/dist/validations/relations/index.js.map +1 -0
  319. package/dist/validations/relations/index.mjs +11 -0
  320. package/dist/validations/relations/index.mjs.map +1 -0
  321. package/package.json +4 -4
@@ -0,0 +1,592 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash/fp');
4
+ var transform = require('../transform.js');
5
+
6
+ // We must select the join column id, however whatever it is named will overwrite an attribute of the same name
7
+ // Therefore, we will prefix with something unlikely to conflict with a user attribute
8
+ // TODO: ...and completely restrict the strapi_ prefix for an attribute name in the future
9
+ const joinColPrefix = '__strapi';
10
+ /**
11
+ * Populate oneToOne and manyToOne relation
12
+ * @param {*} input
13
+ * @param {*} ctx
14
+ * @returns
15
+ */ const XtoOne = async (input, ctx)=>{
16
+ const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;
17
+ const { db, qb } = ctx;
18
+ const fromTargetRow = (rowOrRows)=>transform.fromRow(targetMeta, rowOrRows);
19
+ if ('joinColumn' in attribute && attribute.joinColumn) {
20
+ const { name: joinColumnName, referencedColumn: referencedColumnName } = attribute.joinColumn;
21
+ const referencedValues = _.uniq(results.map((r)=>r[joinColumnName]).filter((value)=>!_.isNil(value)));
22
+ if (_.isEmpty(referencedValues)) {
23
+ results.forEach((result)=>{
24
+ result[attributeName] = null;
25
+ });
26
+ return;
27
+ }
28
+ const rows = await db.entityManager.createQueryBuilder(targetMeta.uid).init(populateValue).addSelect(`${qb.alias}.${referencedColumnName}`).where({
29
+ [referencedColumnName]: referencedValues
30
+ }).execute({
31
+ mapResults: false
32
+ });
33
+ const map = _.groupBy(referencedColumnName)(rows);
34
+ results.forEach((result)=>{
35
+ result[attributeName] = fromTargetRow(_.first(map[result[joinColumnName]]));
36
+ });
37
+ return;
38
+ }
39
+ if ('joinTable' in attribute && attribute.joinTable) {
40
+ const { joinTable } = attribute;
41
+ const qb = db.entityManager.createQueryBuilder(targetMeta.uid);
42
+ const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;
43
+ const alias = qb.getAlias();
44
+ const joinColAlias = `${alias}.${joinColumnName}`;
45
+ const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;
46
+ const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;
47
+ const referencedValues = _.uniq(results.map((r)=>r[referencedColumnName]).filter((value)=>!_.isNil(value)));
48
+ if (isCount) {
49
+ if (_.isEmpty(referencedValues)) {
50
+ results.forEach((result)=>{
51
+ result[attributeName] = {
52
+ count: 0
53
+ };
54
+ });
55
+ return;
56
+ }
57
+ const rows = await qb.init(populateValue).join({
58
+ alias,
59
+ referencedTable: joinTable.name,
60
+ referencedColumn: joinTable.inverseJoinColumn.name,
61
+ rootColumn: joinTable.inverseJoinColumn.referencedColumn,
62
+ rootTable: qb.alias,
63
+ on: joinTable.on
64
+ }).select([
65
+ joinColAlias,
66
+ qb.raw('count(*) AS count')
67
+ ]).where({
68
+ [joinColAlias]: referencedValues
69
+ }).groupBy(joinColAlias).execute({
70
+ mapResults: false
71
+ });
72
+ const map = rows.reduce((map, row)=>{
73
+ map[row[joinColumnName]] = {
74
+ count: Number(row.count)
75
+ };
76
+ return map;
77
+ }, {});
78
+ results.forEach((result)=>{
79
+ result[attributeName] = map[result[referencedColumnName]] || {
80
+ count: 0
81
+ };
82
+ });
83
+ return;
84
+ }
85
+ if (_.isEmpty(referencedValues)) {
86
+ results.forEach((result)=>{
87
+ result[attributeName] = null;
88
+ });
89
+ return;
90
+ }
91
+ const rows = await qb.init(populateValue).join({
92
+ alias,
93
+ referencedTable: joinTable.name,
94
+ referencedColumn: joinTable.inverseJoinColumn.name,
95
+ rootColumn: joinTable.inverseJoinColumn.referencedColumn,
96
+ rootTable: qb.alias,
97
+ on: joinTable.on,
98
+ orderBy: joinTable.orderBy
99
+ }).addSelect(joinColSelect).where({
100
+ [joinColAlias]: referencedValues
101
+ }).execute({
102
+ mapResults: false
103
+ });
104
+ const map = _.groupBy(joinColRenameAs)(rows);
105
+ results.forEach((result)=>{
106
+ result[attributeName] = fromTargetRow(_.first(map[result[referencedColumnName]]));
107
+ });
108
+ }
109
+ };
110
+ const oneToMany = async (input, ctx)=>{
111
+ const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;
112
+ const { db, qb } = ctx;
113
+ const fromTargetRow = (rowOrRows)=>transform.fromRow(targetMeta, rowOrRows);
114
+ if ('joinColumn' in attribute && attribute.joinColumn) {
115
+ const { name: joinColumnName, referencedColumn: referencedColumnName, on } = attribute.joinColumn;
116
+ const referencedValues = _.uniq(results.map((r)=>r[joinColumnName]).filter((value)=>!_.isNil(value)));
117
+ if (_.isEmpty(referencedValues)) {
118
+ results.forEach((result)=>{
119
+ result[attributeName] = null;
120
+ });
121
+ return;
122
+ }
123
+ const rows = await db.entityManager.createQueryBuilder(targetMeta.uid).init(populateValue).addSelect(`${qb.alias}.${referencedColumnName}`).where({
124
+ [referencedColumnName]: referencedValues,
125
+ ...on && typeof on === 'function' ? on({
126
+ populateValue,
127
+ results
128
+ }) : {}
129
+ }).execute({
130
+ mapResults: false
131
+ });
132
+ const map = _.groupBy(referencedColumnName)(rows);
133
+ results.forEach((result)=>{
134
+ result[attributeName] = fromTargetRow(map[result[joinColumnName]] || []);
135
+ });
136
+ return;
137
+ }
138
+ if ('joinTable' in attribute && attribute.joinTable) {
139
+ const { joinTable } = attribute;
140
+ const qb = db.entityManager.createQueryBuilder(targetMeta.uid);
141
+ const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;
142
+ const alias = qb.getAlias();
143
+ const joinColAlias = `${alias}.${joinColumnName}`;
144
+ const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;
145
+ const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;
146
+ const referencedValues = _.uniq(results.map((r)=>r[referencedColumnName]).filter((value)=>!_.isNil(value)));
147
+ if (isCount) {
148
+ if (_.isEmpty(referencedValues)) {
149
+ results.forEach((result)=>{
150
+ result[attributeName] = {
151
+ count: 0
152
+ };
153
+ });
154
+ return;
155
+ }
156
+ const rows = await qb.init(populateValue).join({
157
+ alias,
158
+ referencedTable: joinTable.name,
159
+ referencedColumn: joinTable.inverseJoinColumn.name,
160
+ rootColumn: joinTable.inverseJoinColumn.referencedColumn,
161
+ rootTable: qb.alias,
162
+ on: joinTable.on
163
+ }).select([
164
+ joinColSelect,
165
+ qb.raw('count(*) AS count')
166
+ ]).where({
167
+ [joinColAlias]: referencedValues
168
+ }).groupBy(joinColAlias).execute({
169
+ mapResults: false
170
+ });
171
+ const map = rows.reduce((map, row)=>{
172
+ map[row[joinColRenameAs]] = {
173
+ count: Number(row.count)
174
+ };
175
+ return map;
176
+ }, {});
177
+ results.forEach((result)=>{
178
+ result[attributeName] = map[result[referencedColumnName]] || {
179
+ count: 0
180
+ };
181
+ });
182
+ return;
183
+ }
184
+ if (_.isEmpty(referencedValues)) {
185
+ results.forEach((result)=>{
186
+ result[attributeName] = [];
187
+ });
188
+ return;
189
+ }
190
+ const rows = await qb.init(populateValue).join({
191
+ alias,
192
+ referencedTable: joinTable.name,
193
+ referencedColumn: joinTable.inverseJoinColumn.name,
194
+ rootColumn: joinTable.inverseJoinColumn.referencedColumn,
195
+ rootTable: qb.alias,
196
+ on: joinTable.on,
197
+ orderBy: _.mapValues((v)=>populateValue.ordering || v, joinTable.orderBy)
198
+ }).addSelect(joinColSelect).where({
199
+ [joinColAlias]: referencedValues
200
+ }).execute({
201
+ mapResults: false
202
+ });
203
+ const map = _.groupBy(joinColRenameAs)(rows);
204
+ results.forEach((r)=>{
205
+ r[attributeName] = fromTargetRow(map[r[referencedColumnName]] || []);
206
+ });
207
+ }
208
+ };
209
+ const manyToMany = async (input, ctx)=>{
210
+ const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;
211
+ const { db } = ctx;
212
+ const fromTargetRow = (rowOrRows)=>transform.fromRow(targetMeta, rowOrRows);
213
+ const { joinTable } = attribute;
214
+ const populateQb = db.entityManager.createQueryBuilder(targetMeta.uid);
215
+ const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;
216
+ const alias = populateQb.getAlias();
217
+ const joinColAlias = `${alias}.${joinColumnName}`;
218
+ const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;
219
+ const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;
220
+ const referencedValues = _.uniq(results.map((r)=>r[referencedColumnName]).filter((value)=>!_.isNil(value)));
221
+ if (isCount) {
222
+ if (_.isEmpty(referencedValues)) {
223
+ results.forEach((result)=>{
224
+ result[attributeName] = {
225
+ count: 0
226
+ };
227
+ });
228
+ return;
229
+ }
230
+ const rows = await populateQb.init(populateValue).join({
231
+ alias,
232
+ referencedTable: joinTable.name,
233
+ referencedColumn: joinTable.inverseJoinColumn.name,
234
+ rootColumn: joinTable.inverseJoinColumn.referencedColumn,
235
+ rootTable: populateQb.alias,
236
+ on: joinTable.on
237
+ }).select([
238
+ joinColAlias,
239
+ populateQb.raw('count(*) AS count')
240
+ ]).where({
241
+ [joinColAlias]: referencedValues
242
+ }).groupBy(joinColAlias).execute({
243
+ mapResults: false
244
+ });
245
+ const map = rows.reduce((map, row)=>{
246
+ map[row[joinColumnName]] = {
247
+ count: Number(row.count)
248
+ };
249
+ return map;
250
+ }, {});
251
+ results.forEach((result)=>{
252
+ result[attributeName] = map[result[referencedColumnName]] || {
253
+ count: 0
254
+ };
255
+ });
256
+ return;
257
+ }
258
+ if (_.isEmpty(referencedValues)) {
259
+ results.forEach((result)=>{
260
+ result[attributeName] = [];
261
+ });
262
+ return;
263
+ }
264
+ const rows = await populateQb.init(populateValue).join({
265
+ alias,
266
+ referencedTable: joinTable.name,
267
+ referencedColumn: joinTable.inverseJoinColumn.name,
268
+ rootColumn: joinTable.inverseJoinColumn.referencedColumn,
269
+ rootTable: populateQb.alias,
270
+ on: joinTable.on,
271
+ orderBy: _.mapValues((v)=>populateValue.ordering || v, joinTable.orderBy)
272
+ }).addSelect(joinColSelect).where({
273
+ [joinColAlias]: referencedValues
274
+ }).execute({
275
+ mapResults: false
276
+ });
277
+ const map = _.groupBy(joinColRenameAs)(rows);
278
+ results.forEach((result)=>{
279
+ result[attributeName] = fromTargetRow(map[result[referencedColumnName]] || []);
280
+ });
281
+ };
282
+ const morphX = async (input, ctx)=>{
283
+ const { attribute, attributeName, results, populateValue, targetMeta } = input;
284
+ const { db, uid } = ctx;
285
+ const fromTargetRow = (rowOrRows)=>transform.fromRow(targetMeta, rowOrRows);
286
+ const { target, morphBy } = attribute;
287
+ const targetAttribute = db.metadata.get(target).attributes[morphBy];
288
+ if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {
289
+ const { idColumn, typeColumn } = targetAttribute.morphColumn;
290
+ const referencedValues = _.uniq(results.map((r)=>r[idColumn.referencedColumn]).filter((value)=>!_.isNil(value)));
291
+ if (_.isEmpty(referencedValues)) {
292
+ results.forEach((result)=>{
293
+ result[attributeName] = null;
294
+ });
295
+ return;
296
+ }
297
+ const rows = await db.entityManager.createQueryBuilder(target).init(populateValue)// .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)
298
+ .where({
299
+ [idColumn.name]: referencedValues,
300
+ [typeColumn.name]: uid
301
+ }).execute({
302
+ mapResults: false
303
+ });
304
+ const map = _.groupBy(idColumn.name)(rows);
305
+ results.forEach((result)=>{
306
+ const matchingRows = map[result[idColumn.referencedColumn]];
307
+ const matchingValue = attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;
308
+ result[attributeName] = fromTargetRow(matchingValue);
309
+ });
310
+ } else if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToMany') {
311
+ const { joinTable } = targetAttribute;
312
+ const { joinColumn, morphColumn } = joinTable;
313
+ const { idColumn, typeColumn } = morphColumn;
314
+ const referencedValues = _.uniq(results.map((r)=>r[idColumn.referencedColumn]).filter((value)=>!_.isNil(value)));
315
+ if (_.isEmpty(referencedValues)) {
316
+ results.forEach((result)=>{
317
+ result[attributeName] = attribute.relation === 'morphOne' ? null : [];
318
+ });
319
+ return;
320
+ }
321
+ // find with join table
322
+ const qb = db.entityManager.createQueryBuilder(target);
323
+ const alias = qb.getAlias();
324
+ const rows = await qb.init(populateValue).join({
325
+ alias,
326
+ referencedTable: joinTable.name,
327
+ referencedColumn: joinColumn.name,
328
+ rootColumn: joinColumn.referencedColumn,
329
+ rootTable: qb.alias,
330
+ on: {
331
+ ...joinTable.on || {},
332
+ field: attributeName
333
+ },
334
+ orderBy: _.mapValues((v)=>populateValue.ordering || v, joinTable.orderBy)
335
+ }).addSelect([
336
+ `${alias}.${idColumn.name}`,
337
+ `${alias}.${typeColumn.name}`
338
+ ]).where({
339
+ [`${alias}.${idColumn.name}`]: referencedValues,
340
+ [`${alias}.${typeColumn.name}`]: uid
341
+ }).execute({
342
+ mapResults: false
343
+ });
344
+ const map = _.groupBy(idColumn.name)(rows);
345
+ results.forEach((result)=>{
346
+ const matchingRows = map[result[idColumn.referencedColumn]];
347
+ const matchingValue = attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;
348
+ result[attributeName] = fromTargetRow(matchingValue);
349
+ });
350
+ }
351
+ };
352
+ const morphToMany = async (input, ctx)=>{
353
+ const { attribute, attributeName, results, populateValue } = input;
354
+ const { db } = ctx;
355
+ // find with join table
356
+ const { joinTable } = attribute;
357
+ const { joinColumn, morphColumn } = joinTable;
358
+ const { idColumn, typeColumn, typeField = '__type' } = morphColumn;
359
+ // fetch join table to create the ids map then do the same as morphToOne without the first
360
+ const referencedValues = _.uniq(results.map((r)=>r[joinColumn.referencedColumn]).filter((value)=>!_.isNil(value)));
361
+ const qb = db.entityManager.createQueryBuilder(joinTable.name);
362
+ const joinRows = await qb.where({
363
+ [joinColumn.name]: referencedValues,
364
+ ...joinTable.on || {},
365
+ // If the populateValue contains an "on" property,
366
+ // only populate the types defined in it
367
+ ...'on' in populateValue ? {
368
+ [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {})
369
+ } : {}
370
+ }).orderBy([
371
+ joinColumn.name,
372
+ 'order'
373
+ ]).execute({
374
+ mapResults: false
375
+ });
376
+ const joinMap = _.groupBy(joinColumn.name, joinRows);
377
+ const idsByType = joinRows.reduce((acc, result)=>{
378
+ const idValue = result[morphColumn.idColumn.name];
379
+ const typeValue = result[morphColumn.typeColumn.name];
380
+ if (!idValue || !typeValue) {
381
+ return acc;
382
+ }
383
+ if (!_.has(typeValue, acc)) {
384
+ acc[typeValue] = [];
385
+ }
386
+ acc[typeValue].push(idValue);
387
+ return acc;
388
+ }, {});
389
+ const map = {};
390
+ const { on, ...typePopulate } = populateValue;
391
+ for (const type of Object.keys(idsByType)){
392
+ const ids = idsByType[type];
393
+ // type was removed but still in morph relation
394
+ if (!db.metadata.get(type)) {
395
+ map[type] = {};
396
+ continue;
397
+ }
398
+ const qb = db.entityManager.createQueryBuilder(type);
399
+ const rows = await qb.init(on?.[type] ?? typePopulate).addSelect(`${qb.alias}.${idColumn.referencedColumn}`).where({
400
+ [idColumn.referencedColumn]: ids
401
+ }).execute({
402
+ mapResults: false
403
+ });
404
+ map[type] = _.groupBy(idColumn.referencedColumn)(rows);
405
+ }
406
+ results.forEach((result)=>{
407
+ const joinResults = joinMap[result[joinColumn.referencedColumn]] || [];
408
+ const matchingRows = joinResults.flatMap((joinResult)=>{
409
+ const id = joinResult[idColumn.name];
410
+ const type = joinResult[typeColumn.name];
411
+ const targetMeta = db.metadata.get(type);
412
+ const fromTargetRow = (rowOrRows)=>transform.fromRow(targetMeta, rowOrRows);
413
+ return (map[type][id] || []).map((row)=>{
414
+ return {
415
+ [typeField]: type,
416
+ ...fromTargetRow(row)
417
+ };
418
+ });
419
+ });
420
+ result[attributeName] = matchingRows;
421
+ });
422
+ };
423
+ const morphToOne = async (input, ctx)=>{
424
+ const { attribute, attributeName, results, populateValue } = input;
425
+ const { db } = ctx;
426
+ const { morphColumn } = attribute;
427
+ const { idColumn, typeColumn } = morphColumn;
428
+ // make a map for each type what ids to return
429
+ // make a nested map per id
430
+ const idsByType = results.reduce((acc, result)=>{
431
+ const idValue = result[morphColumn.idColumn.name];
432
+ const typeValue = result[morphColumn.typeColumn.name];
433
+ if (!idValue || !typeValue) {
434
+ return acc;
435
+ }
436
+ if (!(typeValue in acc)) {
437
+ acc[typeValue] = [];
438
+ }
439
+ acc[typeValue].push(idValue);
440
+ return acc;
441
+ }, {});
442
+ const map = {};
443
+ const { on, ...typePopulate } = populateValue;
444
+ for (const type of Object.keys(idsByType)){
445
+ const ids = idsByType[type];
446
+ // type was removed but still in morph relation
447
+ if (!db.metadata.get(type)) {
448
+ map[type] = {};
449
+ return;
450
+ }
451
+ const qb = db.entityManager.createQueryBuilder(type);
452
+ const rows = await qb.init(on?.[type] ?? typePopulate).addSelect(`${qb.alias}.${idColumn.referencedColumn}`).where({
453
+ [idColumn.referencedColumn]: ids
454
+ }).execute({
455
+ mapResults: false
456
+ });
457
+ map[type] = _.groupBy(idColumn.referencedColumn)(rows);
458
+ }
459
+ results.forEach((result)=>{
460
+ const id = result[idColumn.name];
461
+ const type = result[typeColumn.name];
462
+ if (!type || !id) {
463
+ result[attributeName] = null;
464
+ return;
465
+ }
466
+ const matchingRows = map[type][id];
467
+ const fromTargetRow = (rowOrRows)=>transform.fromRow(db.metadata.get(type), rowOrRows);
468
+ result[attributeName] = fromTargetRow(_.first(matchingRows));
469
+ });
470
+ };
471
+ // TODO: Omit limit & offset to avoid needing a query per result to avoid making too many queries
472
+ const pickPopulateParams = (populate)=>{
473
+ const fieldsToPick = [
474
+ 'select',
475
+ 'count',
476
+ 'where',
477
+ 'populate',
478
+ 'orderBy',
479
+ 'filters',
480
+ 'ordering',
481
+ 'on'
482
+ ];
483
+ if (populate.count !== true) {
484
+ fieldsToPick.push('limit', 'offset');
485
+ }
486
+ return _.pick(fieldsToPick, populate);
487
+ };
488
+ const applyPopulate = async (results, populate, ctx)=>{
489
+ const { db, uid, qb } = ctx;
490
+ const meta = db.metadata.get(uid);
491
+ if (_.isEmpty(results)) {
492
+ return results;
493
+ }
494
+ for (const attributeName of Object.keys(populate)){
495
+ const attribute = meta.attributes[attributeName];
496
+ if (attribute.type !== 'relation') {
497
+ throw new Error(`Invalid populate attribute ${attributeName}`);
498
+ }
499
+ const populateValue = {
500
+ filters: qb.state.filters,
501
+ ...pickPopulateParams(populate[attributeName])
502
+ };
503
+ const isCount = 'count' in populateValue && populateValue.count === true;
504
+ switch(attribute.relation){
505
+ case 'oneToOne':
506
+ case 'manyToOne':
507
+ {
508
+ const targetMeta = db.metadata.get(attribute.target);
509
+ const input = {
510
+ attribute,
511
+ attributeName,
512
+ results,
513
+ populateValue,
514
+ targetMeta,
515
+ isCount
516
+ };
517
+ await XtoOne(input, ctx);
518
+ break;
519
+ }
520
+ case 'oneToMany':
521
+ {
522
+ const targetMeta = db.metadata.get(attribute.target);
523
+ const input = {
524
+ attribute,
525
+ attributeName,
526
+ results,
527
+ populateValue,
528
+ targetMeta,
529
+ isCount
530
+ };
531
+ await oneToMany(input, ctx);
532
+ break;
533
+ }
534
+ case 'manyToMany':
535
+ {
536
+ const targetMeta = db.metadata.get(attribute.target);
537
+ const input = {
538
+ attribute,
539
+ attributeName,
540
+ results,
541
+ populateValue,
542
+ targetMeta,
543
+ isCount
544
+ };
545
+ await manyToMany(input, ctx);
546
+ break;
547
+ }
548
+ case 'morphOne':
549
+ case 'morphMany':
550
+ {
551
+ const targetMeta = db.metadata.get(attribute.target);
552
+ const input = {
553
+ attribute,
554
+ attributeName,
555
+ results,
556
+ populateValue,
557
+ targetMeta,
558
+ isCount
559
+ };
560
+ await morphX(input, ctx);
561
+ break;
562
+ }
563
+ case 'morphToMany':
564
+ {
565
+ const input = {
566
+ attribute,
567
+ attributeName,
568
+ results,
569
+ populateValue,
570
+ isCount
571
+ };
572
+ await morphToMany(input, ctx);
573
+ break;
574
+ }
575
+ case 'morphToOne':
576
+ {
577
+ const input = {
578
+ attribute,
579
+ attributeName,
580
+ results,
581
+ populateValue,
582
+ isCount
583
+ };
584
+ await morphToOne(input, ctx);
585
+ break;
586
+ }
587
+ }
588
+ }
589
+ };
590
+
591
+ module.exports = applyPopulate;
592
+ //# sourceMappingURL=apply.js.map