@strapi/core 0.0.0-experimental.defd8568ae03ef8d52f86e1f3541979f953c3941 → 0.0.0-experimental.df298029ec6478763dcca7d59fafe8d2ae4ed60a

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 (325) hide show
  1. package/LICENSE +18 -3
  2. package/dist/Strapi.d.ts +3 -1
  3. package/dist/Strapi.d.ts.map +1 -1
  4. package/dist/Strapi.js +59 -15
  5. package/dist/Strapi.js.map +1 -1
  6. package/dist/Strapi.mjs +38 -13
  7. package/dist/Strapi.mjs.map +1 -1
  8. package/dist/configuration/get-dirs.js +2 -2
  9. package/dist/configuration/get-dirs.js.map +1 -1
  10. package/dist/configuration/index.js +2 -2
  11. package/dist/configuration/index.js.map +1 -1
  12. package/dist/core-api/controller/collection-type.d.ts.map +1 -1
  13. package/dist/core-api/controller/collection-type.js +5 -3
  14. package/dist/core-api/controller/collection-type.js.map +1 -1
  15. package/dist/core-api/controller/collection-type.mjs +2 -0
  16. package/dist/core-api/controller/collection-type.mjs.map +1 -1
  17. package/dist/core-api/controller/index.js +2 -2
  18. package/dist/core-api/controller/index.js.map +1 -1
  19. package/dist/core-api/controller/single-type.d.ts.map +1 -1
  20. package/dist/core-api/controller/single-type.js +3 -2
  21. package/dist/core-api/controller/single-type.js.map +1 -1
  22. package/dist/core-api/controller/single-type.mjs +1 -0
  23. package/dist/core-api/controller/single-type.mjs.map +1 -1
  24. package/dist/core-api/controller/transform.js +8 -8
  25. package/dist/core-api/controller/transform.js.map +1 -1
  26. package/dist/core-api/service/collection-type.d.ts +3 -9
  27. package/dist/core-api/service/collection-type.d.ts.map +1 -1
  28. package/dist/core-api/service/collection-type.js +5 -3
  29. package/dist/core-api/service/collection-type.js.map +1 -1
  30. package/dist/core-api/service/collection-type.mjs +6 -4
  31. package/dist/core-api/service/collection-type.mjs.map +1 -1
  32. package/dist/core-api/service/pagination.d.ts +4 -11
  33. package/dist/core-api/service/pagination.d.ts.map +1 -1
  34. package/dist/core-api/service/pagination.js +18 -44
  35. package/dist/core-api/service/pagination.js.map +1 -1
  36. package/dist/core-api/service/pagination.mjs +16 -42
  37. package/dist/core-api/service/pagination.mjs.map +1 -1
  38. package/dist/core-api/service/single-type.d.ts.map +1 -1
  39. package/dist/core-api/service/single-type.js +2 -1
  40. package/dist/core-api/service/single-type.js.map +1 -1
  41. package/dist/core-api/service/single-type.mjs +2 -1
  42. package/dist/core-api/service/single-type.mjs.map +1 -1
  43. package/dist/domain/content-type/index.js +4 -4
  44. package/dist/domain/content-type/index.js.map +1 -1
  45. package/dist/ee/index.d.ts.map +1 -1
  46. package/dist/ee/index.js +9 -4
  47. package/dist/ee/index.js.map +1 -1
  48. package/dist/ee/index.mjs +6 -1
  49. package/dist/ee/index.mjs.map +1 -1
  50. package/dist/factories.js +4 -4
  51. package/dist/factories.js.map +1 -1
  52. package/dist/factories.mjs.map +1 -1
  53. package/dist/index.d.ts +14 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/index.mjs.map +1 -1
  57. package/dist/loaders/apis.d.ts.map +1 -1
  58. package/dist/loaders/apis.js +12 -12
  59. package/dist/loaders/apis.js.map +1 -1
  60. package/dist/loaders/apis.mjs +10 -10
  61. package/dist/loaders/apis.mjs.map +1 -1
  62. package/dist/loaders/plugins/get-enabled-plugins.d.ts.map +1 -1
  63. package/dist/loaders/plugins/get-enabled-plugins.js +45 -17
  64. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  65. package/dist/loaders/plugins/get-enabled-plugins.mjs +15 -9
  66. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  67. package/dist/loaders/plugins/get-user-plugins-config.js +2 -2
  68. package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
  69. package/dist/loaders/plugins/index.d.ts.map +1 -1
  70. package/dist/loaders/plugins/index.js +34 -7
  71. package/dist/loaders/plugins/index.js.map +1 -1
  72. package/dist/loaders/plugins/index.mjs +9 -1
  73. package/dist/loaders/plugins/index.mjs.map +1 -1
  74. package/dist/middlewares/body.js +2 -2
  75. package/dist/middlewares/body.js.map +1 -1
  76. package/dist/middlewares/cors.d.ts.map +1 -1
  77. package/dist/middlewares/cors.js +9 -7
  78. package/dist/middlewares/cors.js.map +1 -1
  79. package/dist/middlewares/cors.mjs +9 -7
  80. package/dist/middlewares/cors.mjs.map +1 -1
  81. package/dist/middlewares/public.js +2 -2
  82. package/dist/middlewares/public.js.map +1 -1
  83. package/dist/middlewares/query.d.ts.map +1 -1
  84. package/dist/middlewares/query.js.map +1 -1
  85. package/dist/middlewares/query.mjs.map +1 -1
  86. package/dist/middlewares/responses.js +2 -2
  87. package/dist/middlewares/responses.js.map +1 -1
  88. package/dist/middlewares/security.d.ts.map +1 -1
  89. package/dist/middlewares/security.js +12 -5
  90. package/dist/middlewares/security.js.map +1 -1
  91. package/dist/middlewares/security.mjs +11 -4
  92. package/dist/middlewares/security.mjs.map +1 -1
  93. package/dist/middlewares/session.js +2 -2
  94. package/dist/middlewares/session.js.map +1 -1
  95. package/dist/migrations/database/5.0.0-discard-drafts.d.ts +27 -6
  96. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
  97. package/dist/migrations/database/5.0.0-discard-drafts.js +67 -10
  98. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  99. package/dist/migrations/database/5.0.0-discard-drafts.mjs +69 -12
  100. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  101. package/dist/migrations/draft-publish.d.ts +1 -1
  102. package/dist/migrations/draft-publish.d.ts.map +1 -1
  103. package/dist/migrations/draft-publish.js +14 -31
  104. package/dist/migrations/draft-publish.js.map +1 -1
  105. package/dist/migrations/draft-publish.mjs +15 -32
  106. package/dist/migrations/draft-publish.mjs.map +1 -1
  107. package/dist/migrations/i18n.d.ts +5 -0
  108. package/dist/migrations/i18n.d.ts.map +1 -0
  109. package/dist/migrations/i18n.js +54 -0
  110. package/dist/migrations/i18n.js.map +1 -0
  111. package/dist/migrations/i18n.mjs +54 -0
  112. package/dist/migrations/i18n.mjs.map +1 -0
  113. package/dist/migrations/index.d.ts +5 -0
  114. package/dist/migrations/index.d.ts.map +1 -0
  115. package/dist/migrations/index.js +15 -0
  116. package/dist/migrations/index.js.map +1 -0
  117. package/dist/migrations/index.mjs +15 -0
  118. package/dist/migrations/index.mjs.map +1 -0
  119. package/dist/providers/admin.d.ts.map +1 -1
  120. package/dist/providers/admin.js.map +1 -1
  121. package/dist/providers/admin.mjs.map +1 -1
  122. package/dist/providers/registries.js +3 -3
  123. package/dist/providers/registries.js.map +1 -1
  124. package/dist/providers/registries.mjs +3 -3
  125. package/dist/providers/registries.mjs.map +1 -1
  126. package/dist/registries/apis.js +2 -2
  127. package/dist/registries/apis.js.map +1 -1
  128. package/dist/registries/components.js +2 -2
  129. package/dist/registries/components.js.map +1 -1
  130. package/dist/registries/content-types.js +3 -3
  131. package/dist/registries/content-types.js.map +1 -1
  132. package/dist/registries/controllers.js +3 -3
  133. package/dist/registries/controllers.js.map +1 -1
  134. package/dist/registries/custom-fields.js +4 -4
  135. package/dist/registries/custom-fields.js.map +1 -1
  136. package/dist/registries/hooks.js +2 -2
  137. package/dist/registries/hooks.js.map +1 -1
  138. package/dist/registries/middlewares.js +3 -3
  139. package/dist/registries/middlewares.js.map +1 -1
  140. package/dist/registries/modules.js +3 -3
  141. package/dist/registries/modules.js.map +1 -1
  142. package/dist/registries/plugins.js +2 -2
  143. package/dist/registries/plugins.js.map +1 -1
  144. package/dist/registries/policies.d.ts +1 -1
  145. package/dist/registries/policies.d.ts.map +1 -1
  146. package/dist/registries/policies.js +5 -5
  147. package/dist/registries/policies.js.map +1 -1
  148. package/dist/registries/policies.mjs +1 -1
  149. package/dist/registries/policies.mjs.map +1 -1
  150. package/dist/registries/services.js +3 -3
  151. package/dist/registries/services.js.map +1 -1
  152. package/dist/services/auth/index.js +3 -3
  153. package/dist/services/auth/index.js.map +1 -1
  154. package/dist/services/content-api/index.d.ts +10 -12
  155. package/dist/services/content-api/index.d.ts.map +1 -1
  156. package/dist/services/content-api/permissions/index.d.ts +10 -12
  157. package/dist/services/content-api/permissions/index.d.ts.map +1 -1
  158. package/dist/services/content-api/permissions/providers/action.d.ts +5 -6
  159. package/dist/services/content-api/permissions/providers/action.d.ts.map +1 -1
  160. package/dist/services/content-api/permissions/providers/condition.d.ts +5 -6
  161. package/dist/services/content-api/permissions/providers/condition.d.ts.map +1 -1
  162. package/dist/services/core-store.js +3 -3
  163. package/dist/services/core-store.js.map +1 -1
  164. package/dist/services/cron.d.ts +3 -3
  165. package/dist/services/cron.d.ts.map +1 -1
  166. package/dist/services/cron.js +12 -7
  167. package/dist/services/cron.js.map +1 -1
  168. package/dist/services/cron.mjs +9 -4
  169. package/dist/services/cron.mjs.map +1 -1
  170. package/dist/services/document-service/attributes/index.js +2 -2
  171. package/dist/services/document-service/attributes/index.js.map +1 -1
  172. package/dist/services/document-service/attributes/transforms.js +3 -3
  173. package/dist/services/document-service/attributes/transforms.js.map +1 -1
  174. package/dist/services/document-service/common.d.ts +1 -1
  175. package/dist/services/document-service/common.d.ts.map +1 -1
  176. package/dist/services/document-service/common.js.map +1 -1
  177. package/dist/services/document-service/common.mjs.map +1 -1
  178. package/dist/services/document-service/components.js +15 -15
  179. package/dist/services/document-service/components.js.map +1 -1
  180. package/dist/services/document-service/draft-and-publish.js +16 -16
  181. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  182. package/dist/services/document-service/entries.d.ts +3 -3
  183. package/dist/services/document-service/entries.d.ts.map +1 -1
  184. package/dist/services/document-service/entries.js +13 -13
  185. package/dist/services/document-service/entries.js.map +1 -1
  186. package/dist/services/document-service/entries.mjs +3 -3
  187. package/dist/services/document-service/entries.mjs.map +1 -1
  188. package/dist/services/document-service/events.d.ts +25 -0
  189. package/dist/services/document-service/events.d.ts.map +1 -0
  190. package/dist/services/document-service/events.js +47 -0
  191. package/dist/services/document-service/events.js.map +1 -0
  192. package/dist/services/document-service/events.mjs +47 -0
  193. package/dist/services/document-service/events.mjs.map +1 -0
  194. package/dist/services/document-service/index.d.ts +2 -1
  195. package/dist/services/document-service/index.d.ts.map +1 -1
  196. package/dist/services/document-service/index.js +3 -2
  197. package/dist/services/document-service/index.js.map +1 -1
  198. package/dist/services/document-service/index.mjs +3 -2
  199. package/dist/services/document-service/index.mjs.map +1 -1
  200. package/dist/services/document-service/internationalization.d.ts.map +1 -1
  201. package/dist/services/document-service/internationalization.js +21 -12
  202. package/dist/services/document-service/internationalization.js.map +1 -1
  203. package/dist/services/document-service/internationalization.mjs +14 -5
  204. package/dist/services/document-service/internationalization.mjs.map +1 -1
  205. package/dist/services/document-service/params.js +2 -2
  206. package/dist/services/document-service/params.js.map +1 -1
  207. package/dist/services/document-service/repository.d.ts.map +1 -1
  208. package/dist/services/document-service/repository.js +131 -52
  209. package/dist/services/document-service/repository.js.map +1 -1
  210. package/dist/services/document-service/repository.mjs +127 -48
  211. package/dist/services/document-service/repository.mjs.map +1 -1
  212. package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
  213. package/dist/services/document-service/transform/id-map.js +13 -4
  214. package/dist/services/document-service/transform/id-map.js.map +1 -1
  215. package/dist/services/document-service/transform/id-map.mjs +14 -5
  216. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  217. package/dist/services/document-service/transform/id-transform.js +2 -2
  218. package/dist/services/document-service/transform/id-transform.js.map +1 -1
  219. package/dist/services/document-service/transform/query.js +3 -3
  220. package/dist/services/document-service/transform/query.js.map +1 -1
  221. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  222. package/dist/services/document-service/transform/relations/extract/data-ids.js +5 -2
  223. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  224. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +3 -0
  225. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  226. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
  227. package/dist/services/document-service/transform/relations/transform/data-ids.js +5 -2
  228. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  229. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +3 -0
  230. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  231. package/dist/services/document-service/transform/relations/utils/dp.js +2 -2
  232. package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -1
  233. package/dist/services/document-service/transform/relations/utils/map-relation.d.ts.map +1 -1
  234. package/dist/services/document-service/transform/relations/utils/map-relation.js +13 -9
  235. package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
  236. package/dist/services/document-service/transform/relations/utils/map-relation.mjs +7 -3
  237. package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
  238. package/dist/services/document-service/utils/populate.d.ts.map +1 -1
  239. package/dist/services/document-service/utils/populate.js +7 -1
  240. package/dist/services/document-service/utils/populate.js.map +1 -1
  241. package/dist/services/document-service/utils/populate.mjs +7 -1
  242. package/dist/services/document-service/utils/populate.mjs.map +1 -1
  243. package/dist/services/document-service/utils/unidirectional-relations.d.ts +36 -0
  244. package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -0
  245. package/dist/services/document-service/utils/unidirectional-relations.js +69 -0
  246. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -0
  247. package/dist/services/document-service/utils/unidirectional-relations.mjs +69 -0
  248. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -0
  249. package/dist/services/entity-validator/blocks-validator.d.ts +1 -2
  250. package/dist/services/entity-validator/blocks-validator.d.ts.map +1 -1
  251. package/dist/services/entity-validator/blocks-validator.js +4 -3
  252. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  253. package/dist/services/entity-validator/blocks-validator.mjs +3 -3
  254. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  255. package/dist/services/entity-validator/index.d.ts +15 -1
  256. package/dist/services/entity-validator/index.d.ts.map +1 -1
  257. package/dist/services/entity-validator/index.js +109 -53
  258. package/dist/services/entity-validator/index.js.map +1 -1
  259. package/dist/services/entity-validator/index.mjs +95 -39
  260. package/dist/services/entity-validator/index.mjs.map +1 -1
  261. package/dist/services/entity-validator/validators.d.ts +36 -25
  262. package/dist/services/entity-validator/validators.d.ts.map +1 -1
  263. package/dist/services/entity-validator/validators.js +148 -33
  264. package/dist/services/entity-validator/validators.js.map +1 -1
  265. package/dist/services/entity-validator/validators.mjs +140 -25
  266. package/dist/services/entity-validator/validators.mjs.map +1 -1
  267. package/dist/services/event-hub.d.ts +1 -0
  268. package/dist/services/event-hub.d.ts.map +1 -1
  269. package/dist/services/event-hub.js +9 -4
  270. package/dist/services/event-hub.js.map +1 -1
  271. package/dist/services/event-hub.mjs +9 -4
  272. package/dist/services/event-hub.mjs.map +1 -1
  273. package/dist/services/server/compose-endpoint.js +7 -7
  274. package/dist/services/server/compose-endpoint.js.map +1 -1
  275. package/dist/services/server/index.js +1 -1
  276. package/dist/services/server/index.js.map +1 -1
  277. package/dist/services/server/index.mjs +1 -1
  278. package/dist/services/server/index.mjs.map +1 -1
  279. package/dist/services/server/koa.d.ts.map +1 -1
  280. package/dist/services/server/koa.js +4 -4
  281. package/dist/services/server/koa.js.map +1 -1
  282. package/dist/services/server/koa.mjs +1 -1
  283. package/dist/services/server/koa.mjs.map +1 -1
  284. package/dist/services/server/middleware.js +3 -3
  285. package/dist/services/server/middleware.js.map +1 -1
  286. package/dist/services/server/routing.js +2 -2
  287. package/dist/services/server/routing.js.map +1 -1
  288. package/dist/services/utils/dynamic-zones.js +5 -5
  289. package/dist/services/utils/dynamic-zones.js.map +1 -1
  290. package/dist/services/webhook-runner.d.ts +2 -1
  291. package/dist/services/webhook-runner.d.ts.map +1 -1
  292. package/dist/services/webhook-runner.js.map +1 -1
  293. package/dist/services/webhook-runner.mjs.map +1 -1
  294. package/dist/services/webhook-store.d.ts +2 -8
  295. package/dist/services/webhook-store.d.ts.map +1 -1
  296. package/dist/services/webhook-store.js +9 -2
  297. package/dist/services/webhook-store.js.map +1 -1
  298. package/dist/services/webhook-store.mjs +9 -2
  299. package/dist/services/webhook-store.mjs.map +1 -1
  300. package/dist/utils/cron.js +3 -3
  301. package/dist/utils/cron.js.map +1 -1
  302. package/dist/utils/fetch.d.ts.map +1 -1
  303. package/dist/utils/fetch.js +4 -3
  304. package/dist/utils/fetch.js.map +1 -1
  305. package/dist/utils/fetch.mjs +4 -3
  306. package/dist/utils/fetch.mjs.map +1 -1
  307. package/dist/utils/filepath-to-prop-path.d.ts +1 -1
  308. package/dist/utils/filepath-to-prop-path.d.ts.map +1 -1
  309. package/dist/utils/filepath-to-prop-path.js +27 -6
  310. package/dist/utils/filepath-to-prop-path.js.map +1 -1
  311. package/dist/utils/filepath-to-prop-path.mjs +25 -5
  312. package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
  313. package/dist/utils/is-initialized.js +3 -3
  314. package/dist/utils/is-initialized.js.map +1 -1
  315. package/dist/utils/startup-logger.js +4 -4
  316. package/dist/utils/startup-logger.js.map +1 -1
  317. package/dist/utils/startup-logger.mjs +3 -3
  318. package/dist/utils/startup-logger.mjs.map +1 -1
  319. package/dist/utils/transform-content-types-to-models.d.ts +355 -23
  320. package/dist/utils/transform-content-types-to-models.d.ts.map +1 -1
  321. package/dist/utils/transform-content-types-to-models.js +17 -4
  322. package/dist/utils/transform-content-types-to-models.js.map +1 -1
  323. package/dist/utils/transform-content-types-to-models.mjs +16 -3
  324. package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
  325. package/package.json +27 -23
@@ -0,0 +1,69 @@
1
+ import { omit, keyBy } from "lodash/fp";
2
+ const load = async (uid, { oldVersions, newVersions }) => {
3
+ const updates = [];
4
+ await strapi.db.transaction(async ({ trx }) => {
5
+ const contentTypes = Object.values(strapi.contentTypes);
6
+ const components = Object.values(strapi.components);
7
+ for (const model of [...contentTypes, ...components]) {
8
+ const dbModel = strapi.db.metadata.get(model.uid);
9
+ for (const attribute of Object.values(dbModel.attributes)) {
10
+ if (attribute.type !== "relation" || attribute.target !== uid || attribute.inversedBy || attribute.mappedBy) {
11
+ continue;
12
+ }
13
+ const joinTable = attribute.joinTable;
14
+ if (!joinTable) {
15
+ continue;
16
+ }
17
+ const { name: sourceColumnName } = joinTable.joinColumn;
18
+ const { name: targetColumnName } = joinTable.inverseJoinColumn;
19
+ const ids = oldVersions.map((entry) => entry.id);
20
+ const oldVersionsRelations = await strapi.db.getConnection().select("*").from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
21
+ if (oldVersionsRelations.length > 0) {
22
+ updates.push({ joinTable, relations: oldVersionsRelations });
23
+ }
24
+ if (!model.options?.draftAndPublish) {
25
+ const ids2 = newVersions.map((entry) => entry.id);
26
+ const newVersionsRelations = await strapi.db.getConnection().select("*").from(joinTable.name).whereIn(targetColumnName, ids2).transacting(trx);
27
+ if (newVersionsRelations.length > 0) {
28
+ const discardToAdd = newVersionsRelations.filter((relation) => {
29
+ const matchingOldVerion = oldVersionsRelations.find((oldRelation) => {
30
+ return oldRelation[sourceColumnName] === relation[sourceColumnName];
31
+ });
32
+ return !matchingOldVerion;
33
+ }).map(omit("id"));
34
+ updates.push({ joinTable, relations: discardToAdd });
35
+ }
36
+ }
37
+ }
38
+ }
39
+ });
40
+ return updates;
41
+ };
42
+ const sync = async (oldEntries, newEntries, oldRelations) => {
43
+ const newEntryByLocale = keyBy("locale", newEntries);
44
+ const oldEntriesMap = oldEntries.reduce(
45
+ (acc, entry) => {
46
+ const newEntry = newEntryByLocale[entry.locale];
47
+ if (!newEntry)
48
+ return acc;
49
+ acc[entry.id] = newEntry.id;
50
+ return acc;
51
+ },
52
+ {}
53
+ );
54
+ await strapi.db.transaction(async ({ trx }) => {
55
+ for (const { joinTable, relations } of oldRelations) {
56
+ const column = joinTable.inverseJoinColumn.name;
57
+ const newRelations = relations.map((relation) => {
58
+ const newId = oldEntriesMap[relation[column]];
59
+ return { ...relation, [column]: newId };
60
+ });
61
+ await trx.batchInsert(joinTable.name, newRelations, 1e3);
62
+ }
63
+ });
64
+ };
65
+ export {
66
+ load,
67
+ sync
68
+ };
69
+ //# sourceMappingURL=unidirectional-relations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unidirectional-relations.mjs","sources":["../../../../src/services/document-service/utils/unidirectional-relations.ts"],"sourcesContent":["/* eslint-disable no-continue */\nimport { keyBy, omit } from 'lodash/fp';\n\nimport { UID, Schema } from '@strapi/types';\n\ninterface LoadContext {\n oldVersions: { id: string; locale: string }[];\n newVersions: { id: string; locale: string }[];\n}\n\n/**\n * Loads lingering relations that need to be updated when overriding a published or draft entry.\n * This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.\n * This is not the case for bi-directional relations, where the target entry is also linked to the source entry.\n */\nconst load = async (uid: UID.ContentType, { oldVersions, newVersions }: LoadContext) => {\n const updates = [] as any;\n\n // Iterate all components and content types to find relations that need to be updated\n await strapi.db.transaction(async ({ trx }) => {\n const contentTypes = Object.values(strapi.contentTypes) as Schema.ContentType[];\n const components = Object.values(strapi.components) as Schema.Component[];\n\n for (const model of [...contentTypes, ...components]) {\n const dbModel = strapi.db.metadata.get(model.uid);\n\n for (const attribute of Object.values(dbModel.attributes) as any) {\n /**\n * Only consider unidirectional relations\n */\n if (\n attribute.type !== 'relation' ||\n attribute.target !== uid ||\n attribute.inversedBy ||\n attribute.mappedBy\n ) {\n continue;\n }\n\n // TODO: joinColumn relations\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n /**\n * Load all relations that need to be updated\n */\n // NOTE: when the model has draft and publish, we can assume relation are only draft to draft & published to published\n const ids = oldVersions.map((entry) => entry.id);\n\n const oldVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n if (oldVersionsRelations.length > 0) {\n updates.push({ joinTable, relations: oldVersionsRelations });\n }\n\n /**\n * if publishing\n * if published version exists\n * updated published versions links\n * else\n * create link to newly published version\n *\n * if discarding\n * if published version link exists & not draft version link\n * create link to new draft version\n */\n\n if (!model.options?.draftAndPublish) {\n const ids = newVersions.map((entry) => entry.id);\n\n const newVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n if (newVersionsRelations.length > 0) {\n // when publishing a draft that doesn't have a published version yet,\n // copy the links to the draft over to the published version\n // when discarding a published version, if no drafts exists\n const discardToAdd = newVersionsRelations\n .filter((relation) => {\n const matchingOldVerion = oldVersionsRelations.find((oldRelation) => {\n return oldRelation[sourceColumnName] === relation[sourceColumnName];\n });\n\n return !matchingOldVerion;\n })\n .map(omit('id'));\n\n updates.push({ joinTable, relations: discardToAdd });\n }\n }\n }\n }\n });\n\n return updates;\n};\n\n/**\n * Updates uni directional relations to target the right entries when overriding published or draft entries.\n *\n * @param oldEntries The old entries that are being overridden\n * @param newEntries The new entries that are overriding the old ones\n * @param oldRelations The relations that were previously loaded with `load` @see load\n */\nconst sync = async (\n oldEntries: { id: string; locale: string }[],\n newEntries: { id: string; locale: string }[],\n oldRelations: { joinTable: any; relations: any[] }[]\n) => {\n /**\n * Create a map of old entry ids to new entry ids\n *\n * Will be used to update the relation target ids\n */\n const newEntryByLocale = keyBy('locale', newEntries);\n const oldEntriesMap = oldEntries.reduce(\n (acc, entry) => {\n const newEntry = newEntryByLocale[entry.locale];\n if (!newEntry) return acc;\n acc[entry.id] = newEntry.id;\n return acc;\n },\n {} as Record<string, string>\n );\n\n await strapi.db.transaction(async ({ trx }) => {\n // Iterate old relations that are deleted and insert the new ones\n for (const { joinTable, relations } of oldRelations) {\n // Update old ids with the new ones\n const column = joinTable.inverseJoinColumn.name;\n\n const newRelations = relations.map((relation) => {\n const newId = oldEntriesMap[relation[column]];\n return { ...relation, [column]: newId };\n });\n\n // Insert those relations into the join table\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n });\n};\n\nexport { load, sync };\n"],"names":["ids"],"mappings":";AAeA,MAAM,OAAO,OAAO,KAAsB,EAAE,aAAa,kBAA+B;AACtF,QAAM,UAAU,CAAA;AAGhB,QAAM,OAAO,GAAG,YAAY,OAAO,EAAE,UAAU;AAC7C,UAAM,eAAe,OAAO,OAAO,OAAO,YAAY;AACtD,UAAM,aAAa,OAAO,OAAO,OAAO,UAAU;AAElD,eAAW,SAAS,CAAC,GAAG,cAAc,GAAG,UAAU,GAAG;AACpD,YAAM,UAAU,OAAO,GAAG,SAAS,IAAI,MAAM,GAAG;AAEhD,iBAAW,aAAa,OAAO,OAAO,QAAQ,UAAU,GAAU;AAK9D,YAAA,UAAU,SAAS,cACnB,UAAU,WAAW,OACrB,UAAU,cACV,UAAU,UACV;AACA;AAAA,QACF;AAGA,cAAM,YAAY,UAAU;AAC5B,YAAI,CAAC,WAAW;AACd;AAAA,QACF;AAEA,cAAM,EAAE,MAAM,qBAAqB,UAAU;AAC7C,cAAM,EAAE,MAAM,qBAAqB,UAAU;AAM7C,cAAM,MAAM,YAAY,IAAI,CAAC,UAAU,MAAM,EAAE;AAE/C,cAAM,uBAAuB,MAAM,OAAO,GACvC,gBACA,OAAO,GAAG,EACV,KAAK,UAAU,IAAI,EACnB,QAAQ,kBAAkB,GAAG,EAC7B,YAAY,GAAG;AAEd,YAAA,qBAAqB,SAAS,GAAG;AACnC,kBAAQ,KAAK,EAAE,WAAW,WAAW,qBAAsB,CAAA;AAAA,QAC7D;AAcI,YAAA,CAAC,MAAM,SAAS,iBAAiB;AACnC,gBAAMA,OAAM,YAAY,IAAI,CAAC,UAAU,MAAM,EAAE;AAE/C,gBAAM,uBAAuB,MAAM,OAAO,GACvC,gBACA,OAAO,GAAG,EACV,KAAK,UAAU,IAAI,EACnB,QAAQ,kBAAkBA,IAAG,EAC7B,YAAY,GAAG;AAEd,cAAA,qBAAqB,SAAS,GAAG;AAInC,kBAAM,eAAe,qBAClB,OAAO,CAAC,aAAa;AACpB,oBAAM,oBAAoB,qBAAqB,KAAK,CAAC,gBAAgB;AACnE,uBAAO,YAAY,gBAAgB,MAAM,SAAS,gBAAgB;AAAA,cAAA,CACnE;AAED,qBAAO,CAAC;AAAA,YACT,CAAA,EACA,IAAI,KAAK,IAAI,CAAC;AAEjB,oBAAQ,KAAK,EAAE,WAAW,WAAW,aAAc,CAAA;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EAAA,CACD;AAEM,SAAA;AACT;AASA,MAAM,OAAO,OACX,YACA,YACA,iBACG;AAMG,QAAA,mBAAmB,MAAM,UAAU,UAAU;AACnD,QAAM,gBAAgB,WAAW;AAAA,IAC/B,CAAC,KAAK,UAAU;AACR,YAAA,WAAW,iBAAiB,MAAM,MAAM;AAC9C,UAAI,CAAC;AAAiB,eAAA;AAClB,UAAA,MAAM,EAAE,IAAI,SAAS;AAClB,aAAA;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EAAA;AAGH,QAAM,OAAO,GAAG,YAAY,OAAO,EAAE,UAAU;AAE7C,eAAW,EAAE,WAAW,UAAU,KAAK,cAAc;AAE7C,YAAA,SAAS,UAAU,kBAAkB;AAE3C,YAAM,eAAe,UAAU,IAAI,CAAC,aAAa;AAC/C,cAAM,QAAQ,cAAc,SAAS,MAAM,CAAC;AAC5C,eAAO,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM;AAAA,MAAA,CACvC;AAGD,YAAM,IAAI,YAAY,UAAU,MAAM,cAAc,GAAI;AAAA,IAC1D;AAAA,EAAA,CACD;AACH;"}
@@ -1,4 +1,3 @@
1
1
  import { yup } from '@strapi/utils';
2
- declare const _default: (metas: any, options: any) => yup.ArraySchema<any, import("yup/lib/types").AnyObject, any[] | undefined, any[] | undefined>;
3
- export default _default;
2
+ export declare const blocksValidator: () => yup.ArraySchema<any, import("yup/lib/types").AnyObject, any[] | undefined, any[] | undefined>;
4
3
  //# sourceMappingURL=blocks-validator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"blocks-validator.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;gCAyKb,GAAG,WAAW,GAAG;AAAxC,wBAA6D"}
1
+ {"version":3,"file":"blocks-validator.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAwKpC,eAAO,MAAM,eAAe,qGAA8B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
3
  const strapiUtils = require("@strapi/utils");
3
4
  const textNodeValidator = strapiUtils.yup.object().shape({
4
5
  type: strapiUtils.yup.string().equals(["text"]).required(),
@@ -121,7 +122,7 @@ const blockNodeValidator = strapiUtils.yup.lazy((value) => {
121
122
  });
122
123
  }
123
124
  });
124
- const blocksValidator = strapiUtils.yup.array().of(blockNodeValidator);
125
- const blocksValidator$1 = (metas, options) => blocksValidator;
126
- module.exports = blocksValidator$1;
125
+ const blocksValidatorSchema = strapiUtils.yup.array().of(blockNodeValidator);
126
+ const blocksValidator = () => blocksValidatorSchema;
127
+ exports.blocksValidator = blocksValidator;
127
128
  //# sourceMappingURL=blocks-validator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().required(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidator = yup.array().of(blockNodeValidator);\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport default (metas: any, options: any) => blocksValidator;\n"],"names":["yup"],"mappings":"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"}
1
+ {"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().required(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["yup"],"mappings":"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"}
@@ -120,9 +120,9 @@ const blockNodeValidator = yup.lazy((value) => {
120
120
  });
121
121
  }
122
122
  });
123
- const blocksValidator = yup.array().of(blockNodeValidator);
124
- const blocksValidator$1 = (metas, options) => blocksValidator;
123
+ const blocksValidatorSchema = yup.array().of(blockNodeValidator);
124
+ const blocksValidator = () => blocksValidatorSchema;
125
125
  export {
126
- blocksValidator$1 as default
126
+ blocksValidator
127
127
  };
128
128
  //# sourceMappingURL=blocks-validator.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"blocks-validator.mjs","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().required(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidator = yup.array().of(blockNodeValidator);\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport default (metas: any, options: any) => blocksValidator;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blocks-validator.mjs","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch (error) {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n syntax: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().required(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,21 @@
2
2
  * Entity validator
3
3
  * Module that will validate input data for entity creation or edition
4
4
  */
5
- import { Modules } from '@strapi/types';
5
+ import { Modules, Struct, Schema } from '@strapi/types';
6
+ export type ComponentContext = {
7
+ parentContent: {
8
+ model: Struct.Schema;
9
+ id?: number;
10
+ options?: ValidatorContext;
11
+ };
12
+ pathToComponent: string[];
13
+ repeatableData: Modules.EntityValidator.Entity[];
14
+ fullDynamicZoneContent?: Schema.Attribute.Value<Schema.Attribute.DynamicZone>;
15
+ };
16
+ interface ValidatorContext {
17
+ isDraft?: boolean;
18
+ locale?: string | null;
19
+ }
6
20
  declare const entityValidator: Modules.EntityValidator.EntityValidator;
7
21
  export default entityValidator;
8
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,OAAO,EAAuB,MAAM,eAAe,CAAC;AAmf7D,QAAA,MAAM,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,eAG9C,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,OAAO,EAAO,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAa7D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE;QAEb,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QAErB,EAAE,CAAC,EAAE,MAAM,CAAC;QAGZ,OAAO,CAAC,EAAE,gBAAgB,CAAC;KAC5B,CAAC;IAEF,eAAe,EAAE,MAAM,EAAE,CAAC;IAG1B,cAAc,EAAE,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;IACjD,sBAAsB,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;CAC/E,CAAC;AAWF,UAAU,gBAAgB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAmhBD,QAAA,MAAM,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,eAG9C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
- const _$1 = require("lodash");
3
- const _ = require("lodash/fp");
2
+ const _ = require("lodash");
3
+ const fp = require("lodash/fp");
4
4
  const strapiUtils = require("@strapi/utils");
5
5
  const validators = require("./validators.js");
6
6
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
@@ -55,7 +55,11 @@ const addDefault = (createOrUpdate) => {
55
55
  };
56
56
  };
57
57
  const preventCast = (validator) => validator.transform((val, originalVal) => originalVal);
58
- const createComponentValidator = (createOrUpdate) => ({ attr, updatedAttribute }, { isDraft }) => {
58
+ const createComponentValidator = (createOrUpdate) => ({
59
+ attr,
60
+ updatedAttribute,
61
+ componentContext
62
+ }, { isDraft }) => {
59
63
  const model = strapi.getModel(attr.component);
60
64
  if (!model) {
61
65
  throw new Error("Validation failed: Model not found");
@@ -63,18 +67,27 @@ const createComponentValidator = (createOrUpdate) => ({ attr, updatedAttribute }
63
67
  if (attr?.repeatable) {
64
68
  let validator2 = yup.array().of(
65
69
  yup.lazy(
66
- (item) => createModelValidator(createOrUpdate)({ model, data: item }, { isDraft }).notNull()
70
+ (item) => createModelValidator(createOrUpdate)(
71
+ { componentContext, model, data: item },
72
+ { isDraft }
73
+ ).notNull()
67
74
  )
68
75
  );
69
76
  validator2 = addRequiredValidation(createOrUpdate)(validator2, {
70
77
  attr: { required: true },
71
78
  updatedAttribute
72
79
  });
73
- validator2 = addMinMax(validator2, { attr, updatedAttribute });
80
+ if (!isDraft) {
81
+ validator2 = addMinMax(validator2, { attr, updatedAttribute });
82
+ }
74
83
  return validator2;
75
84
  }
76
85
  let validator = createModelValidator(createOrUpdate)(
77
- { model, data: updatedAttribute.value },
86
+ {
87
+ model,
88
+ data: updatedAttribute.value,
89
+ componentContext
90
+ },
78
91
  { isDraft }
79
92
  );
80
93
  validator = addRequiredValidation(createOrUpdate)(validator, {
@@ -83,15 +96,20 @@ const createComponentValidator = (createOrUpdate) => ({ attr, updatedAttribute }
83
96
  });
84
97
  return validator;
85
98
  };
86
- const createDzValidator = (createOrUpdate) => ({ attr, updatedAttribute }, { isDraft }) => {
99
+ const createDzValidator = (createOrUpdate) => ({ attr, updatedAttribute, componentContext }, { isDraft }) => {
87
100
  let validator;
88
101
  validator = yup.array().of(
89
102
  yup.lazy((item) => {
90
- const model = strapi.getModel(_.prop("__component", item));
103
+ const model = strapi.getModel(fp.prop("__component", item));
91
104
  const schema = yup.object().shape({
92
105
  __component: yup.string().required().oneOf(Object.keys(strapi.components))
93
106
  }).notNull();
94
- return model ? schema.concat(createModelValidator(createOrUpdate)({ model, data: item }, { isDraft })) : schema;
107
+ return model ? schema.concat(
108
+ createModelValidator(createOrUpdate)(
109
+ { model, data: item, componentContext },
110
+ { isDraft }
111
+ )
112
+ ) : schema;
95
113
  })
96
114
  // FIXME: yup v1
97
115
  );
@@ -99,26 +117,26 @@ const createDzValidator = (createOrUpdate) => ({ attr, updatedAttribute }, { isD
99
117
  attr: { required: true },
100
118
  updatedAttribute
101
119
  });
102
- validator = addMinMax(validator, { attr, updatedAttribute });
120
+ if (!isDraft) {
121
+ validator = addMinMax(validator, { attr, updatedAttribute });
122
+ }
103
123
  return validator;
104
124
  };
105
- const createRelationValidator = (createOrUpdate) => ({ attr, updatedAttribute }, { isDraft }) => {
125
+ const createRelationValidator = ({
126
+ updatedAttribute
127
+ }) => {
106
128
  let validator;
107
129
  if (Array.isArray(updatedAttribute.value)) {
108
130
  validator = yup.array().of(yup.mixed());
109
131
  } else {
110
132
  validator = yup.mixed();
111
133
  }
112
- validator = addRequiredValidation(createOrUpdate)(validator, {
113
- attr: { required: !isDraft && attr.required },
114
- updatedAttribute
115
- });
116
134
  return validator;
117
135
  };
118
136
  const createScalarAttributeValidator = (createOrUpdate) => (metas, options) => {
119
137
  let validator;
120
- if (_.has(metas.attr.type, validators)) {
121
- validator = validators[metas.attr.type](metas, options);
138
+ if (fp.has(metas.attr.type, validators.Validators)) {
139
+ validator = validators.Validators[metas.attr.type](metas, options);
122
140
  } else {
123
141
  validator = yup.mixed();
124
142
  }
@@ -135,36 +153,54 @@ const createAttributeValidator = (createOrUpdate) => (metas, options) => {
135
153
  } else if (isScalarAttribute(metas.attr)) {
136
154
  validator = createScalarAttributeValidator(createOrUpdate)(metas, options);
137
155
  } else {
138
- if (metas.attr.type === "component") {
156
+ if (metas.attr.type === "component" && metas.componentContext) {
157
+ const pathToComponent = [
158
+ ...metas?.componentContext?.pathToComponent ?? [],
159
+ metas.updatedAttribute.name
160
+ ];
161
+ const repeatableData = metas.attr.repeatable && pathToComponent.length === 1 ? metas.updatedAttribute.value : metas.componentContext?.repeatableData;
162
+ const newComponentContext = {
163
+ ...metas.componentContext,
164
+ pathToComponent,
165
+ repeatableData
166
+ };
139
167
  validator = createComponentValidator(createOrUpdate)(
140
- { attr: metas.attr, updatedAttribute: metas.updatedAttribute },
141
- options
142
- );
143
- } else if (metas.attr.type === "dynamiczone") {
144
- validator = createDzValidator(createOrUpdate)(metas, options);
145
- } else if (metas.attr.type === "relation") {
146
- validator = createRelationValidator(createOrUpdate)(
147
168
  {
169
+ componentContext: newComponentContext,
148
170
  attr: metas.attr,
149
171
  updatedAttribute: metas.updatedAttribute
150
172
  },
151
173
  options
152
174
  );
175
+ } else if (metas.attr.type === "dynamiczone" && metas.componentContext) {
176
+ const newComponentContext = {
177
+ ...metas.componentContext,
178
+ fullDynamicZoneContent: metas.updatedAttribute.value,
179
+ pathToComponent: [...metas.componentContext.pathToComponent, metas.updatedAttribute.name]
180
+ };
181
+ Object.assign(metas, { componentContext: newComponentContext });
182
+ validator = createDzValidator(createOrUpdate)(metas, options);
183
+ } else if (metas.attr.type === "relation") {
184
+ validator = createRelationValidator({
185
+ attr: metas.attr,
186
+ updatedAttribute: metas.updatedAttribute
187
+ });
153
188
  }
154
189
  validator = preventCast(validator);
155
190
  }
156
191
  validator = addDefault(createOrUpdate)(validator, metas);
157
192
  return validator;
158
193
  };
159
- const createModelValidator = (createOrUpdate) => ({ model, data, entity }, options) => {
194
+ const createModelValidator = (createOrUpdate) => ({ componentContext, model, data, entity }, options) => {
160
195
  const writableAttributes = model ? getWritableAttributes(model) : [];
161
196
  const schema = writableAttributes.reduce(
162
197
  (validators2, attributeName) => {
163
198
  const metas = {
164
199
  attr: model.attributes[attributeName],
165
- updatedAttribute: { name: attributeName, value: _.prop(attributeName, data) },
200
+ updatedAttribute: { name: attributeName, value: fp.prop(attributeName, data) },
166
201
  model,
167
- entity
202
+ entity,
203
+ componentContext
168
204
  };
169
205
  const validator = createAttributeValidator(createOrUpdate)(metas, options);
170
206
  validators2[attributeName] = validator;
@@ -176,29 +212,49 @@ const createModelValidator = (createOrUpdate) => ({ model, data, entity }, optio
176
212
  };
177
213
  const createValidateEntity = (createOrUpdate) => {
178
214
  return async (model, data, options, entity) => {
179
- if (!_.isObject(data)) {
215
+ if (!fp.isObject(data)) {
180
216
  const { displayName } = model.info;
181
217
  throw new ValidationError(
182
218
  `Invalid payload submitted for the ${createOrUpdate} of an entity of type ${displayName}. Expected an object, but got ${typeof data}`
183
219
  );
184
220
  }
185
221
  const validator = createModelValidator(createOrUpdate)(
186
- { model, data, entity },
222
+ {
223
+ model,
224
+ data,
225
+ entity,
226
+ componentContext: {
227
+ // Set up the initial component context.
228
+ // Keeping track of parent content type context in which a component will be used.
229
+ // This is necessary to validate component field constraints such as uniqueness.
230
+ parentContent: {
231
+ id: entity?.id,
232
+ model,
233
+ options
234
+ },
235
+ pathToComponent: [],
236
+ repeatableData: []
237
+ }
238
+ },
187
239
  {
188
240
  isDraft: options?.isDraft ?? false,
189
241
  locale: options?.locale ?? null
190
242
  }
191
- ).test("relations-test", "check that all relations exist", async function(data2) {
192
- try {
193
- await checkRelationsExist(buildRelationsStore({ uid: model.uid, data: data2 }));
194
- } catch (e) {
195
- return this.createError({
196
- path: this.path,
197
- message: e instanceof ValidationError && e.message || "Invalid relations"
198
- });
243
+ ).test(
244
+ "relations-test",
245
+ "check that all relations exist",
246
+ async function relationsValidation(data2) {
247
+ try {
248
+ await checkRelationsExist(buildRelationsStore({ uid: model.uid, data: data2 }));
249
+ } catch (e) {
250
+ return this.createError({
251
+ path: this.path,
252
+ message: e instanceof ValidationError && e.message || "Invalid relations"
253
+ });
254
+ }
255
+ return true;
199
256
  }
200
- return true;
201
- }).required();
257
+ ).required();
202
258
  return validateYupSchema(validator, {
203
259
  strict: false,
204
260
  abortEarly: false
@@ -212,7 +268,7 @@ const buildRelationsStore = ({
212
268
  if (!uid) {
213
269
  throw new ValidationError(`Cannot build relations store: "uid" is undefined`);
214
270
  }
215
- if (_.isEmpty(data)) {
271
+ if (fp.isEmpty(data)) {
216
272
  return {};
217
273
  }
218
274
  const currentModel = strapi.getModel(uid);
@@ -220,7 +276,7 @@ const buildRelationsStore = ({
220
276
  (result, attributeName) => {
221
277
  const attribute = currentModel.attributes[attributeName];
222
278
  const value = data[attributeName];
223
- if (_$1.isNil(value)) {
279
+ if (_.isNil(value)) {
224
280
  return result;
225
281
  }
226
282
  switch (attribute.type) {
@@ -236,16 +292,16 @@ const buildRelationsStore = ({
236
292
  let source;
237
293
  if (Array.isArray(value)) {
238
294
  source = value;
239
- } else if (_.isObject(value)) {
240
- if ("connect" in value && !_$1.isNil(value.connect)) {
295
+ } else if (fp.isObject(value)) {
296
+ if ("connect" in value && !_.isNil(value.connect)) {
241
297
  source = value.connect;
242
- } else if ("set" in value && !_$1.isNil(value.set)) {
298
+ } else if ("set" in value && !_.isNil(value.set)) {
243
299
  source = value.set;
244
300
  } else {
245
301
  source = [];
246
302
  }
247
303
  } else {
248
- source = _$1.castArray(value);
304
+ source = _.castArray(value);
249
305
  }
250
306
  const idArray = source.map((v) => ({
251
307
  id: typeof v === "object" ? v.id : v
@@ -255,20 +311,20 @@ const buildRelationsStore = ({
255
311
  break;
256
312
  }
257
313
  case "component": {
258
- return _$1.castArray(value).reduce((relationsStore, componentValue) => {
314
+ return _.castArray(value).reduce((relationsStore, componentValue) => {
259
315
  if (!attribute.component) {
260
316
  throw new ValidationError(
261
317
  `Cannot build relations store from component, component identifier is undefined`
262
318
  );
263
319
  }
264
- return _$1.mergeWith(
320
+ return _.mergeWith(
265
321
  relationsStore,
266
322
  buildRelationsStore({
267
323
  uid: attribute.component,
268
324
  data: componentValue
269
325
  }),
270
326
  (objValue, srcValue) => {
271
- if (_$1.isArray(objValue)) {
327
+ if (_.isArray(objValue)) {
272
328
  return objValue.concat(srcValue);
273
329
  }
274
330
  }
@@ -276,21 +332,21 @@ const buildRelationsStore = ({
276
332
  }, result);
277
333
  }
278
334
  case "dynamiczone": {
279
- return _$1.castArray(value).reduce((relationsStore, dzValue) => {
335
+ return _.castArray(value).reduce((relationsStore, dzValue) => {
280
336
  const value2 = dzValue;
281
337
  if (!value2.__component) {
282
338
  throw new ValidationError(
283
339
  `Cannot build relations store from dynamiczone, component identifier is undefined`
284
340
  );
285
341
  }
286
- return _$1.mergeWith(
342
+ return _.mergeWith(
287
343
  relationsStore,
288
344
  buildRelationsStore({
289
345
  uid: value2.__component,
290
346
  data: value2
291
347
  }),
292
348
  (objValue, srcValue) => {
293
- if (_$1.isArray(objValue)) {
349
+ if (_.isArray(objValue)) {
294
350
  return objValue.concat(srcValue);
295
351
  }
296
352
  }
@@ -307,7 +363,7 @@ const checkRelationsExist = async (relationsStore = {}) => {
307
363
  const promises = [];
308
364
  for (const [key, value] of Object.entries(relationsStore)) {
309
365
  const evaluate = async () => {
310
- const uniqueValues = _$1.uniqBy(value, `id`);
366
+ const uniqueValues = _.uniqBy(value, `id`);
311
367
  const count = await strapi.db.query(key).count({
312
368
  where: {
313
369
  id: {