@strapi/core 0.0.0-experimental.eba25ec571b091c6bde1104eb6c753debdf15462 → 0.0.0-experimental.ed76b5e1c1d6fb3b4435c438af7398a06b511d6f

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.

Potentially problematic release.


This version of @strapi/core might be problematic. Click here for more details.

Files changed (790) hide show
  1. package/dist/Strapi.d.ts.map +1 -1
  2. package/dist/Strapi.js +429 -407
  3. package/dist/Strapi.js.map +1 -1
  4. package/dist/Strapi.mjs +428 -405
  5. package/dist/Strapi.mjs.map +1 -1
  6. package/dist/compile.js +23 -14
  7. package/dist/compile.js.map +1 -1
  8. package/dist/compile.mjs +22 -14
  9. package/dist/compile.mjs.map +1 -1
  10. package/dist/configuration/config-loader.js +110 -97
  11. package/dist/configuration/config-loader.js.map +1 -1
  12. package/dist/configuration/config-loader.mjs +109 -96
  13. package/dist/configuration/config-loader.mjs.map +1 -1
  14. package/dist/configuration/get-dirs.js +31 -29
  15. package/dist/configuration/get-dirs.js.map +1 -1
  16. package/dist/configuration/get-dirs.mjs +30 -30
  17. package/dist/configuration/get-dirs.mjs.map +1 -1
  18. package/dist/configuration/index.d.ts +1 -0
  19. package/dist/configuration/index.d.ts.map +1 -1
  20. package/dist/configuration/index.js +85 -73
  21. package/dist/configuration/index.js.map +1 -1
  22. package/dist/configuration/index.mjs +84 -69
  23. package/dist/configuration/index.mjs.map +1 -1
  24. package/dist/configuration/urls.d.ts.map +1 -1
  25. package/dist/configuration/urls.js +74 -61
  26. package/dist/configuration/urls.js.map +1 -1
  27. package/dist/configuration/urls.mjs +73 -62
  28. package/dist/configuration/urls.mjs.map +1 -1
  29. package/dist/container.js +27 -23
  30. package/dist/container.js.map +1 -1
  31. package/dist/container.mjs +26 -24
  32. package/dist/container.mjs.map +1 -1
  33. package/dist/core-api/controller/collection-type.js +77 -76
  34. package/dist/core-api/controller/collection-type.js.map +1 -1
  35. package/dist/core-api/controller/collection-type.mjs +76 -77
  36. package/dist/core-api/controller/collection-type.mjs.map +1 -1
  37. package/dist/core-api/controller/index.js +63 -48
  38. package/dist/core-api/controller/index.js.map +1 -1
  39. package/dist/core-api/controller/index.mjs +62 -49
  40. package/dist/core-api/controller/index.mjs.map +1 -1
  41. package/dist/core-api/controller/single-type.js +41 -40
  42. package/dist/core-api/controller/single-type.js.map +1 -1
  43. package/dist/core-api/controller/single-type.mjs +40 -41
  44. package/dist/core-api/controller/single-type.mjs.map +1 -1
  45. package/dist/core-api/controller/transform.js +72 -63
  46. package/dist/core-api/controller/transform.js.map +1 -1
  47. package/dist/core-api/controller/transform.mjs +71 -64
  48. package/dist/core-api/controller/transform.mjs.map +1 -1
  49. package/dist/core-api/routes/index.d.ts +4 -22
  50. package/dist/core-api/routes/index.d.ts.map +1 -1
  51. package/dist/core-api/routes/index.js +205 -61
  52. package/dist/core-api/routes/index.js.map +1 -1
  53. package/dist/core-api/routes/index.mjs +185 -62
  54. package/dist/core-api/routes/index.mjs.map +1 -1
  55. package/dist/core-api/routes/validation/attributes.d.ts +244 -0
  56. package/dist/core-api/routes/validation/attributes.d.ts.map +1 -0
  57. package/dist/core-api/routes/validation/attributes.js +560 -0
  58. package/dist/core-api/routes/validation/attributes.js.map +1 -0
  59. package/dist/core-api/routes/validation/attributes.mjs +521 -0
  60. package/dist/core-api/routes/validation/attributes.mjs.map +1 -0
  61. package/dist/core-api/routes/validation/common.d.ts +105 -0
  62. package/dist/core-api/routes/validation/common.d.ts.map +1 -0
  63. package/dist/core-api/routes/validation/common.js +116 -0
  64. package/dist/core-api/routes/validation/common.js.map +1 -0
  65. package/dist/core-api/routes/validation/common.mjs +95 -0
  66. package/dist/core-api/routes/validation/common.mjs.map +1 -0
  67. package/dist/core-api/routes/validation/component.d.ts +34 -0
  68. package/dist/core-api/routes/validation/component.d.ts.map +1 -0
  69. package/dist/core-api/routes/validation/component.js +45 -0
  70. package/dist/core-api/routes/validation/component.js.map +1 -0
  71. package/dist/core-api/routes/validation/component.mjs +43 -0
  72. package/dist/core-api/routes/validation/component.mjs.map +1 -0
  73. package/dist/core-api/routes/validation/constants.d.ts +8 -0
  74. package/dist/core-api/routes/validation/constants.d.ts.map +1 -0
  75. package/dist/core-api/routes/validation/constants.js +18 -0
  76. package/dist/core-api/routes/validation/constants.js.map +1 -0
  77. package/dist/core-api/routes/validation/constants.mjs +16 -0
  78. package/dist/core-api/routes/validation/constants.mjs.map +1 -0
  79. package/dist/core-api/routes/validation/content-type.d.ts +128 -0
  80. package/dist/core-api/routes/validation/content-type.d.ts.map +1 -0
  81. package/dist/core-api/routes/validation/content-type.js +201 -0
  82. package/dist/core-api/routes/validation/content-type.js.map +1 -0
  83. package/dist/core-api/routes/validation/content-type.mjs +180 -0
  84. package/dist/core-api/routes/validation/content-type.mjs.map +1 -0
  85. package/dist/core-api/routes/validation/index.d.ts +5 -0
  86. package/dist/core-api/routes/validation/index.d.ts.map +1 -0
  87. package/dist/core-api/routes/validation/mappers.d.ts +105 -0
  88. package/dist/core-api/routes/validation/mappers.d.ts.map +1 -0
  89. package/dist/core-api/routes/validation/mappers.js +238 -0
  90. package/dist/core-api/routes/validation/mappers.js.map +1 -0
  91. package/dist/core-api/routes/validation/mappers.mjs +214 -0
  92. package/dist/core-api/routes/validation/mappers.mjs.map +1 -0
  93. package/dist/core-api/routes/validation/utils.d.ts +47 -0
  94. package/dist/core-api/routes/validation/utils.d.ts.map +1 -0
  95. package/dist/core-api/routes/validation/utils.js +128 -0
  96. package/dist/core-api/routes/validation/utils.js.map +1 -0
  97. package/dist/core-api/routes/validation/utils.mjs +106 -0
  98. package/dist/core-api/routes/validation/utils.mjs.map +1 -0
  99. package/dist/core-api/service/collection-type.js +73 -60
  100. package/dist/core-api/service/collection-type.js.map +1 -1
  101. package/dist/core-api/service/collection-type.mjs +72 -62
  102. package/dist/core-api/service/collection-type.mjs.map +1 -1
  103. package/dist/core-api/service/core-service.js +9 -8
  104. package/dist/core-api/service/core-service.js.map +1 -1
  105. package/dist/core-api/service/core-service.mjs +8 -9
  106. package/dist/core-api/service/core-service.mjs.map +1 -1
  107. package/dist/core-api/service/index.js +13 -13
  108. package/dist/core-api/service/index.js.map +1 -1
  109. package/dist/core-api/service/index.mjs +12 -14
  110. package/dist/core-api/service/index.mjs.map +1 -1
  111. package/dist/core-api/service/pagination.js +69 -43
  112. package/dist/core-api/service/pagination.js.map +1 -1
  113. package/dist/core-api/service/pagination.mjs +68 -47
  114. package/dist/core-api/service/pagination.mjs.map +1 -1
  115. package/dist/core-api/service/single-type.js +43 -39
  116. package/dist/core-api/service/single-type.js.map +1 -1
  117. package/dist/core-api/service/single-type.mjs +42 -41
  118. package/dist/core-api/service/single-type.mjs.map +1 -1
  119. package/dist/domain/content-type/index.d.ts.map +1 -1
  120. package/dist/domain/content-type/index.js +110 -99
  121. package/dist/domain/content-type/index.js.map +1 -1
  122. package/dist/domain/content-type/index.mjs +109 -99
  123. package/dist/domain/content-type/index.mjs.map +1 -1
  124. package/dist/domain/content-type/validator.js +84 -69
  125. package/dist/domain/content-type/validator.js.map +1 -1
  126. package/dist/domain/content-type/validator.mjs +83 -68
  127. package/dist/domain/content-type/validator.mjs.map +1 -1
  128. package/dist/domain/module/index.d.ts.map +1 -1
  129. package/dist/domain/module/index.js +112 -100
  130. package/dist/domain/module/index.js.map +1 -1
  131. package/dist/domain/module/index.mjs +111 -99
  132. package/dist/domain/module/index.mjs.map +1 -1
  133. package/dist/domain/module/validation.js +25 -20
  134. package/dist/domain/module/validation.js.map +1 -1
  135. package/dist/domain/module/validation.mjs +24 -21
  136. package/dist/domain/module/validation.mjs.map +1 -1
  137. package/dist/ee/index.d.ts +7 -0
  138. package/dist/ee/index.d.ts.map +1 -1
  139. package/dist/ee/index.js +197 -137
  140. package/dist/ee/index.js.map +1 -1
  141. package/dist/ee/index.mjs +196 -139
  142. package/dist/ee/index.mjs.map +1 -1
  143. package/dist/ee/license.d.ts +3 -1
  144. package/dist/ee/license.d.ts.map +1 -1
  145. package/dist/ee/license.js +105 -75
  146. package/dist/ee/license.js.map +1 -1
  147. package/dist/ee/license.mjs +103 -76
  148. package/dist/ee/license.mjs.map +1 -1
  149. package/dist/factories.d.ts +3 -1
  150. package/dist/factories.d.ts.map +1 -1
  151. package/dist/factories.js +80 -67
  152. package/dist/factories.js.map +1 -1
  153. package/dist/factories.mjs +77 -70
  154. package/dist/factories.mjs.map +1 -1
  155. package/dist/index.js +29 -26
  156. package/dist/index.js.map +1 -1
  157. package/dist/index.mjs +29 -29
  158. package/dist/index.mjs.map +1 -1
  159. package/dist/loaders/admin.d.ts.map +1 -1
  160. package/dist/loaders/admin.js +21 -20
  161. package/dist/loaders/admin.js.map +1 -1
  162. package/dist/loaders/admin.mjs +20 -20
  163. package/dist/loaders/admin.mjs.map +1 -1
  164. package/dist/loaders/apis.js +143 -120
  165. package/dist/loaders/apis.js.map +1 -1
  166. package/dist/loaders/apis.mjs +142 -119
  167. package/dist/loaders/apis.mjs.map +1 -1
  168. package/dist/loaders/components.js +33 -34
  169. package/dist/loaders/components.js.map +1 -1
  170. package/dist/loaders/components.mjs +32 -34
  171. package/dist/loaders/components.mjs.map +1 -1
  172. package/dist/loaders/index.js +22 -20
  173. package/dist/loaders/index.js.map +1 -1
  174. package/dist/loaders/index.mjs +21 -21
  175. package/dist/loaders/index.mjs.map +1 -1
  176. package/dist/loaders/middlewares.js +29 -25
  177. package/dist/loaders/middlewares.js.map +1 -1
  178. package/dist/loaders/middlewares.mjs +28 -25
  179. package/dist/loaders/middlewares.mjs.map +1 -1
  180. package/dist/loaders/plugins/get-enabled-plugins.js +126 -131
  181. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  182. package/dist/loaders/plugins/get-enabled-plugins.mjs +125 -108
  183. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  184. package/dist/loaders/plugins/get-user-plugins-config.js +25 -24
  185. package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
  186. package/dist/loaders/plugins/get-user-plugins-config.mjs +24 -23
  187. package/dist/loaders/plugins/get-user-plugins-config.mjs.map +1 -1
  188. package/dist/loaders/plugins/index.js +132 -122
  189. package/dist/loaders/plugins/index.js.map +1 -1
  190. package/dist/loaders/plugins/index.mjs +121 -112
  191. package/dist/loaders/plugins/index.mjs.map +1 -1
  192. package/dist/loaders/policies.js +24 -20
  193. package/dist/loaders/policies.js.map +1 -1
  194. package/dist/loaders/policies.mjs +23 -20
  195. package/dist/loaders/policies.mjs.map +1 -1
  196. package/dist/loaders/sanitizers.js +10 -4
  197. package/dist/loaders/sanitizers.js.map +1 -1
  198. package/dist/loaders/sanitizers.mjs +9 -6
  199. package/dist/loaders/sanitizers.mjs.map +1 -1
  200. package/dist/loaders/src-index.js +35 -27
  201. package/dist/loaders/src-index.js.map +1 -1
  202. package/dist/loaders/src-index.mjs +34 -29
  203. package/dist/loaders/src-index.mjs.map +1 -1
  204. package/dist/loaders/validators.js +9 -4
  205. package/dist/loaders/validators.js.map +1 -1
  206. package/dist/loaders/validators.mjs +8 -6
  207. package/dist/loaders/validators.mjs.map +1 -1
  208. package/dist/middlewares/body.d.ts.map +1 -1
  209. package/dist/middlewares/body.js +58 -54
  210. package/dist/middlewares/body.js.map +1 -1
  211. package/dist/middlewares/body.mjs +57 -51
  212. package/dist/middlewares/body.mjs.map +1 -1
  213. package/dist/middlewares/compression.js +6 -6
  214. package/dist/middlewares/compression.js.map +1 -1
  215. package/dist/middlewares/compression.mjs +5 -5
  216. package/dist/middlewares/compression.mjs.map +1 -1
  217. package/dist/middlewares/cors.d.ts +9 -1
  218. package/dist/middlewares/cors.d.ts.map +1 -1
  219. package/dist/middlewares/cors.js +81 -48
  220. package/dist/middlewares/cors.js.map +1 -1
  221. package/dist/middlewares/cors.mjs +78 -46
  222. package/dist/middlewares/cors.mjs.map +1 -1
  223. package/dist/middlewares/errors.js +32 -30
  224. package/dist/middlewares/errors.js.map +1 -1
  225. package/dist/middlewares/errors.mjs +31 -31
  226. package/dist/middlewares/errors.mjs.map +1 -1
  227. package/dist/middlewares/favicon.js +27 -17
  228. package/dist/middlewares/favicon.js.map +1 -1
  229. package/dist/middlewares/favicon.mjs +26 -16
  230. package/dist/middlewares/favicon.mjs.map +1 -1
  231. package/dist/middlewares/index.js +32 -30
  232. package/dist/middlewares/index.js.map +1 -1
  233. package/dist/middlewares/index.mjs +31 -31
  234. package/dist/middlewares/index.mjs.map +1 -1
  235. package/dist/middlewares/ip.js +6 -6
  236. package/dist/middlewares/ip.js.map +1 -1
  237. package/dist/middlewares/ip.mjs +5 -5
  238. package/dist/middlewares/ip.mjs.map +1 -1
  239. package/dist/middlewares/logger.js +10 -9
  240. package/dist/middlewares/logger.js.map +1 -1
  241. package/dist/middlewares/logger.mjs +9 -10
  242. package/dist/middlewares/logger.mjs.map +1 -1
  243. package/dist/middlewares/powered-by.js +13 -9
  244. package/dist/middlewares/powered-by.js.map +1 -1
  245. package/dist/middlewares/powered-by.mjs +12 -10
  246. package/dist/middlewares/powered-by.mjs.map +1 -1
  247. package/dist/middlewares/public.js +33 -29
  248. package/dist/middlewares/public.js.map +1 -1
  249. package/dist/middlewares/public.mjs +32 -28
  250. package/dist/middlewares/public.mjs.map +1 -1
  251. package/dist/middlewares/query.js +35 -32
  252. package/dist/middlewares/query.js.map +1 -1
  253. package/dist/middlewares/query.mjs +34 -31
  254. package/dist/middlewares/query.mjs.map +1 -1
  255. package/dist/middlewares/response-time.js +10 -9
  256. package/dist/middlewares/response-time.js.map +1 -1
  257. package/dist/middlewares/response-time.mjs +9 -10
  258. package/dist/middlewares/response-time.mjs.map +1 -1
  259. package/dist/middlewares/responses.js +14 -12
  260. package/dist/middlewares/responses.js.map +1 -1
  261. package/dist/middlewares/responses.mjs +13 -13
  262. package/dist/middlewares/responses.mjs.map +1 -1
  263. package/dist/middlewares/security.js +109 -71
  264. package/dist/middlewares/security.js.map +1 -1
  265. package/dist/middlewares/security.mjs +108 -70
  266. package/dist/middlewares/security.mjs.map +1 -1
  267. package/dist/middlewares/session.js +26 -25
  268. package/dist/middlewares/session.js.map +1 -1
  269. package/dist/middlewares/session.mjs +25 -24
  270. package/dist/middlewares/session.mjs.map +1 -1
  271. package/dist/migrations/database/5.0.0-discard-drafts.d.ts +2 -2
  272. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
  273. package/dist/migrations/database/5.0.0-discard-drafts.js +152 -90
  274. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  275. package/dist/migrations/database/5.0.0-discard-drafts.mjs +151 -92
  276. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  277. package/dist/migrations/draft-publish.d.ts +1 -1
  278. package/dist/migrations/draft-publish.d.ts.map +1 -1
  279. package/dist/migrations/draft-publish.js +61 -34
  280. package/dist/migrations/draft-publish.js.map +1 -1
  281. package/dist/migrations/draft-publish.mjs +60 -36
  282. package/dist/migrations/draft-publish.mjs.map +1 -1
  283. package/dist/migrations/first-published-at.d.ts +4 -0
  284. package/dist/migrations/first-published-at.d.ts.map +1 -0
  285. package/dist/migrations/first-published-at.js +51 -0
  286. package/dist/migrations/first-published-at.js.map +1 -0
  287. package/dist/migrations/first-published-at.mjs +49 -0
  288. package/dist/migrations/first-published-at.mjs.map +1 -0
  289. package/dist/migrations/i18n.js +62 -45
  290. package/dist/migrations/i18n.js.map +1 -1
  291. package/dist/migrations/i18n.mjs +61 -47
  292. package/dist/migrations/i18n.mjs.map +1 -1
  293. package/dist/migrations/index.d.ts.map +1 -1
  294. package/dist/migrations/index.js +29 -10
  295. package/dist/migrations/index.js.map +1 -1
  296. package/dist/migrations/index.mjs +28 -12
  297. package/dist/migrations/index.mjs.map +1 -1
  298. package/dist/package.json.js +185 -0
  299. package/dist/package.json.js.map +1 -0
  300. package/dist/package.json.mjs +162 -0
  301. package/dist/package.json.mjs.map +1 -0
  302. package/dist/providers/admin.js +27 -17
  303. package/dist/providers/admin.js.map +1 -1
  304. package/dist/providers/admin.mjs +26 -19
  305. package/dist/providers/admin.mjs.map +1 -1
  306. package/dist/providers/coreStore.js +13 -8
  307. package/dist/providers/coreStore.js.map +1 -1
  308. package/dist/providers/coreStore.mjs +12 -10
  309. package/dist/providers/coreStore.mjs.map +1 -1
  310. package/dist/providers/cron.js +19 -16
  311. package/dist/providers/cron.js.map +1 -1
  312. package/dist/providers/cron.mjs +18 -18
  313. package/dist/providers/cron.mjs.map +1 -1
  314. package/dist/providers/index.js +18 -9
  315. package/dist/providers/index.js.map +1 -1
  316. package/dist/providers/index.mjs +17 -10
  317. package/dist/providers/index.mjs.map +1 -1
  318. package/dist/providers/provider.js +4 -3
  319. package/dist/providers/provider.js.map +1 -1
  320. package/dist/providers/provider.mjs +3 -4
  321. package/dist/providers/provider.mjs.map +1 -1
  322. package/dist/providers/registries.js +37 -32
  323. package/dist/providers/registries.js.map +1 -1
  324. package/dist/providers/registries.mjs +36 -34
  325. package/dist/providers/registries.mjs.map +1 -1
  326. package/dist/providers/telemetry.js +19 -16
  327. package/dist/providers/telemetry.js.map +1 -1
  328. package/dist/providers/telemetry.mjs +18 -18
  329. package/dist/providers/telemetry.mjs.map +1 -1
  330. package/dist/providers/webhooks.js +28 -26
  331. package/dist/providers/webhooks.js.map +1 -1
  332. package/dist/providers/webhooks.mjs +27 -28
  333. package/dist/providers/webhooks.mjs.map +1 -1
  334. package/dist/registries/apis.js +23 -20
  335. package/dist/registries/apis.js.map +1 -1
  336. package/dist/registries/apis.mjs +22 -22
  337. package/dist/registries/apis.mjs.map +1 -1
  338. package/dist/registries/components.js +35 -37
  339. package/dist/registries/components.js.map +1 -1
  340. package/dist/registries/components.mjs +34 -39
  341. package/dist/registries/components.mjs.map +1 -1
  342. package/dist/registries/content-types.js +54 -59
  343. package/dist/registries/content-types.js.map +1 -1
  344. package/dist/registries/content-types.mjs +53 -61
  345. package/dist/registries/content-types.mjs.map +1 -1
  346. package/dist/registries/controllers.js +70 -71
  347. package/dist/registries/controllers.js.map +1 -1
  348. package/dist/registries/controllers.mjs +69 -73
  349. package/dist/registries/controllers.mjs.map +1 -1
  350. package/dist/registries/custom-fields.js +75 -65
  351. package/dist/registries/custom-fields.js.map +1 -1
  352. package/dist/registries/custom-fields.mjs +74 -67
  353. package/dist/registries/custom-fields.mjs.map +1 -1
  354. package/dist/registries/hooks.js +46 -49
  355. package/dist/registries/hooks.js.map +1 -1
  356. package/dist/registries/hooks.mjs +45 -51
  357. package/dist/registries/hooks.mjs.map +1 -1
  358. package/dist/registries/middlewares.js +49 -51
  359. package/dist/registries/middlewares.js.map +1 -1
  360. package/dist/registries/middlewares.mjs +48 -53
  361. package/dist/registries/middlewares.mjs.map +1 -1
  362. package/dist/registries/models.js +14 -13
  363. package/dist/registries/models.js.map +1 -1
  364. package/dist/registries/models.mjs +13 -14
  365. package/dist/registries/models.mjs.map +1 -1
  366. package/dist/registries/modules.js +39 -36
  367. package/dist/registries/modules.js.map +1 -1
  368. package/dist/registries/modules.mjs +38 -38
  369. package/dist/registries/modules.mjs.map +1 -1
  370. package/dist/registries/namespace.js +21 -20
  371. package/dist/registries/namespace.js.map +1 -1
  372. package/dist/registries/namespace.mjs +20 -23
  373. package/dist/registries/namespace.mjs.map +1 -1
  374. package/dist/registries/plugins.js +23 -20
  375. package/dist/registries/plugins.js.map +1 -1
  376. package/dist/registries/plugins.mjs +22 -22
  377. package/dist/registries/plugins.mjs.map +1 -1
  378. package/dist/registries/policies.js +103 -96
  379. package/dist/registries/policies.js.map +1 -1
  380. package/dist/registries/policies.mjs +102 -98
  381. package/dist/registries/policies.mjs.map +1 -1
  382. package/dist/registries/sanitizers.js +23 -22
  383. package/dist/registries/sanitizers.js.map +1 -1
  384. package/dist/registries/sanitizers.mjs +22 -22
  385. package/dist/registries/sanitizers.mjs.map +1 -1
  386. package/dist/registries/services.js +71 -71
  387. package/dist/registries/services.js.map +1 -1
  388. package/dist/registries/services.mjs +70 -73
  389. package/dist/registries/services.mjs.map +1 -1
  390. package/dist/registries/validators.js +23 -22
  391. package/dist/registries/validators.js.map +1 -1
  392. package/dist/registries/validators.mjs +22 -22
  393. package/dist/registries/validators.mjs.map +1 -1
  394. package/dist/services/auth/index.js +74 -74
  395. package/dist/services/auth/index.js.map +1 -1
  396. package/dist/services/auth/index.mjs +73 -74
  397. package/dist/services/auth/index.mjs.map +1 -1
  398. package/dist/services/config.js +47 -43
  399. package/dist/services/config.js.map +1 -1
  400. package/dist/services/config.mjs +46 -44
  401. package/dist/services/config.mjs.map +1 -1
  402. package/dist/services/content-api/index.js +80 -79
  403. package/dist/services/content-api/index.js.map +1 -1
  404. package/dist/services/content-api/index.mjs +79 -79
  405. package/dist/services/content-api/index.mjs.map +1 -1
  406. package/dist/services/content-api/permissions/engine.js +8 -5
  407. package/dist/services/content-api/permissions/engine.js.map +1 -1
  408. package/dist/services/content-api/permissions/engine.mjs +7 -5
  409. package/dist/services/content-api/permissions/engine.mjs.map +1 -1
  410. package/dist/services/content-api/permissions/index.js +101 -81
  411. package/dist/services/content-api/permissions/index.js.map +1 -1
  412. package/dist/services/content-api/permissions/index.mjs +100 -81
  413. package/dist/services/content-api/permissions/index.mjs.map +1 -1
  414. package/dist/services/content-api/permissions/providers/action.js +17 -14
  415. package/dist/services/content-api/permissions/providers/action.js.map +1 -1
  416. package/dist/services/content-api/permissions/providers/action.mjs +16 -16
  417. package/dist/services/content-api/permissions/providers/action.mjs.map +1 -1
  418. package/dist/services/content-api/permissions/providers/condition.js +17 -14
  419. package/dist/services/content-api/permissions/providers/condition.js.map +1 -1
  420. package/dist/services/content-api/permissions/providers/condition.mjs +16 -16
  421. package/dist/services/content-api/permissions/providers/condition.mjs.map +1 -1
  422. package/dist/services/core-store.d.ts +2 -2
  423. package/dist/services/core-store.d.ts.map +1 -1
  424. package/dist/services/core-store.js +115 -95
  425. package/dist/services/core-store.js.map +1 -1
  426. package/dist/services/core-store.mjs +114 -97
  427. package/dist/services/core-store.mjs.map +1 -1
  428. package/dist/services/cron.js +74 -65
  429. package/dist/services/cron.js.map +1 -1
  430. package/dist/services/cron.mjs +73 -67
  431. package/dist/services/cron.mjs.map +1 -1
  432. package/dist/services/custom-fields.js +9 -7
  433. package/dist/services/custom-fields.js.map +1 -1
  434. package/dist/services/custom-fields.mjs +8 -9
  435. package/dist/services/custom-fields.mjs.map +1 -1
  436. package/dist/services/document-service/attributes/index.js +23 -18
  437. package/dist/services/document-service/attributes/index.js.map +1 -1
  438. package/dist/services/document-service/attributes/index.mjs +22 -19
  439. package/dist/services/document-service/attributes/index.mjs.map +1 -1
  440. package/dist/services/document-service/attributes/transforms.js +16 -15
  441. package/dist/services/document-service/attributes/transforms.js.map +1 -1
  442. package/dist/services/document-service/attributes/transforms.mjs +15 -15
  443. package/dist/services/document-service/attributes/transforms.mjs.map +1 -1
  444. package/dist/services/document-service/common.js +5 -4
  445. package/dist/services/document-service/common.js.map +1 -1
  446. package/dist/services/document-service/common.mjs +4 -5
  447. package/dist/services/document-service/common.mjs.map +1 -1
  448. package/dist/services/document-service/components.d.ts.map +1 -1
  449. package/dist/services/document-service/components.js +255 -257
  450. package/dist/services/document-service/components.js.map +1 -1
  451. package/dist/services/document-service/components.mjs +254 -262
  452. package/dist/services/document-service/components.mjs.map +1 -1
  453. package/dist/services/document-service/draft-and-publish.d.ts +1 -1
  454. package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
  455. package/dist/services/document-service/draft-and-publish.js +88 -48
  456. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  457. package/dist/services/document-service/draft-and-publish.mjs +87 -54
  458. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  459. package/dist/services/document-service/entries.d.ts.map +1 -1
  460. package/dist/services/document-service/entries.js +151 -91
  461. package/dist/services/document-service/entries.js.map +1 -1
  462. package/dist/services/document-service/entries.mjs +150 -92
  463. package/dist/services/document-service/entries.mjs.map +1 -1
  464. package/dist/services/document-service/events.d.ts +1 -1
  465. package/dist/services/document-service/events.d.ts.map +1 -1
  466. package/dist/services/document-service/events.js +52 -40
  467. package/dist/services/document-service/events.js.map +1 -1
  468. package/dist/services/document-service/events.mjs +51 -41
  469. package/dist/services/document-service/events.mjs.map +1 -1
  470. package/dist/services/document-service/first-published-at.d.ts +7 -0
  471. package/dist/services/document-service/first-published-at.d.ts.map +1 -0
  472. package/dist/services/document-service/first-published-at.js +31 -0
  473. package/dist/services/document-service/first-published-at.js.map +1 -0
  474. package/dist/services/document-service/first-published-at.mjs +28 -0
  475. package/dist/services/document-service/first-published-at.mjs.map +1 -0
  476. package/dist/services/document-service/index.js +53 -33
  477. package/dist/services/document-service/index.js.map +1 -1
  478. package/dist/services/document-service/index.mjs +52 -34
  479. package/dist/services/document-service/index.mjs.map +1 -1
  480. package/dist/services/document-service/internationalization.d.ts +6 -1
  481. package/dist/services/document-service/internationalization.d.ts.map +1 -1
  482. package/dist/services/document-service/internationalization.js +94 -46
  483. package/dist/services/document-service/internationalization.js.map +1 -1
  484. package/dist/services/document-service/internationalization.mjs +92 -50
  485. package/dist/services/document-service/internationalization.mjs.map +1 -1
  486. package/dist/services/document-service/middlewares/errors.js +23 -19
  487. package/dist/services/document-service/middlewares/errors.js.map +1 -1
  488. package/dist/services/document-service/middlewares/errors.mjs +22 -20
  489. package/dist/services/document-service/middlewares/errors.mjs.map +1 -1
  490. package/dist/services/document-service/middlewares/middleware-manager.js +46 -44
  491. package/dist/services/document-service/middlewares/middleware-manager.js.map +1 -1
  492. package/dist/services/document-service/middlewares/middleware-manager.mjs +45 -45
  493. package/dist/services/document-service/middlewares/middleware-manager.mjs.map +1 -1
  494. package/dist/services/document-service/params.js +11 -5
  495. package/dist/services/document-service/params.js.map +1 -1
  496. package/dist/services/document-service/params.mjs +10 -6
  497. package/dist/services/document-service/params.mjs.map +1 -1
  498. package/dist/services/document-service/repository.d.ts.map +1 -1
  499. package/dist/services/document-service/repository.js +358 -319
  500. package/dist/services/document-service/repository.js.map +1 -1
  501. package/dist/services/document-service/repository.mjs +357 -320
  502. package/dist/services/document-service/repository.mjs.map +1 -1
  503. package/dist/services/document-service/transform/data.js +22 -12
  504. package/dist/services/document-service/transform/data.js.map +1 -1
  505. package/dist/services/document-service/transform/data.mjs +21 -13
  506. package/dist/services/document-service/transform/data.mjs.map +1 -1
  507. package/dist/services/document-service/transform/fields.js +26 -17
  508. package/dist/services/document-service/transform/fields.js.map +1 -1
  509. package/dist/services/document-service/transform/fields.mjs +25 -18
  510. package/dist/services/document-service/transform/fields.mjs.map +1 -1
  511. package/dist/services/document-service/transform/id-map.d.ts +1 -1
  512. package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
  513. package/dist/services/document-service/transform/id-map.js +115 -77
  514. package/dist/services/document-service/transform/id-map.js.map +1 -1
  515. package/dist/services/document-service/transform/id-map.mjs +114 -78
  516. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  517. package/dist/services/document-service/transform/id-transform.d.ts +1 -1
  518. package/dist/services/document-service/transform/id-transform.d.ts.map +1 -1
  519. package/dist/services/document-service/transform/id-transform.js +37 -29
  520. package/dist/services/document-service/transform/id-transform.js.map +1 -1
  521. package/dist/services/document-service/transform/id-transform.mjs +36 -30
  522. package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
  523. package/dist/services/document-service/transform/populate.js +23 -18
  524. package/dist/services/document-service/transform/populate.js.map +1 -1
  525. package/dist/services/document-service/transform/populate.mjs +22 -19
  526. package/dist/services/document-service/transform/populate.mjs.map +1 -1
  527. package/dist/services/document-service/transform/query.js +11 -6
  528. package/dist/services/document-service/transform/query.js.map +1 -1
  529. package/dist/services/document-service/transform/query.mjs +10 -7
  530. package/dist/services/document-service/transform/query.mjs.map +1 -1
  531. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts +1 -1
  532. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  533. package/dist/services/document-service/transform/relations/extract/data-ids.js +70 -54
  534. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  535. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +69 -55
  536. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  537. package/dist/services/document-service/transform/relations/transform/data-ids.js +96 -72
  538. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  539. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +95 -73
  540. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  541. package/dist/services/document-service/transform/relations/transform/default-locale.js +47 -29
  542. package/dist/services/document-service/transform/relations/transform/default-locale.js.map +1 -1
  543. package/dist/services/document-service/transform/relations/transform/default-locale.mjs +46 -30
  544. package/dist/services/document-service/transform/relations/transform/default-locale.mjs.map +1 -1
  545. package/dist/services/document-service/transform/relations/utils/dp.d.ts +1 -1
  546. package/dist/services/document-service/transform/relations/utils/dp.d.ts.map +1 -1
  547. package/dist/services/document-service/transform/relations/utils/dp.js +52 -26
  548. package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -1
  549. package/dist/services/document-service/transform/relations/utils/dp.mjs +51 -27
  550. package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -1
  551. package/dist/services/document-service/transform/relations/utils/i18n.d.ts +1 -1
  552. package/dist/services/document-service/transform/relations/utils/i18n.d.ts.map +1 -1
  553. package/dist/services/document-service/transform/relations/utils/i18n.js +20 -18
  554. package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -1
  555. package/dist/services/document-service/transform/relations/utils/i18n.mjs +19 -21
  556. package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -1
  557. package/dist/services/document-service/transform/relations/utils/map-relation.js +116 -73
  558. package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
  559. package/dist/services/document-service/transform/relations/utils/map-relation.mjs +115 -75
  560. package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
  561. package/dist/services/document-service/utils/bidirectional-relations.d.ts +95 -0
  562. package/dist/services/document-service/utils/bidirectional-relations.d.ts.map +1 -0
  563. package/dist/services/document-service/utils/bidirectional-relations.js +148 -0
  564. package/dist/services/document-service/utils/bidirectional-relations.js.map +1 -0
  565. package/dist/services/document-service/utils/bidirectional-relations.mjs +145 -0
  566. package/dist/services/document-service/utils/bidirectional-relations.mjs.map +1 -0
  567. package/dist/services/document-service/utils/populate.d.ts +1 -1
  568. package/dist/services/document-service/utils/populate.d.ts.map +1 -1
  569. package/dist/services/document-service/utils/populate.js +66 -42
  570. package/dist/services/document-service/utils/populate.js.map +1 -1
  571. package/dist/services/document-service/utils/populate.mjs +65 -43
  572. package/dist/services/document-service/utils/populate.mjs.map +1 -1
  573. package/dist/services/document-service/utils/unidirectional-relations.d.ts +15 -2
  574. package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
  575. package/dist/services/document-service/utils/unidirectional-relations.js +163 -61
  576. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  577. package/dist/services/document-service/utils/unidirectional-relations.mjs +162 -63
  578. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  579. package/dist/services/entity-service/index.js +230 -161
  580. package/dist/services/entity-service/index.js.map +1 -1
  581. package/dist/services/entity-service/index.mjs +229 -160
  582. package/dist/services/entity-service/index.mjs.map +1 -1
  583. package/dist/services/entity-validator/blocks-validator.js +135 -103
  584. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  585. package/dist/services/entity-validator/blocks-validator.mjs +134 -104
  586. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  587. package/dist/services/entity-validator/index.d.ts +1 -1
  588. package/dist/services/entity-validator/index.d.ts.map +1 -1
  589. package/dist/services/entity-validator/index.js +370 -366
  590. package/dist/services/entity-validator/index.js.map +1 -1
  591. package/dist/services/entity-validator/index.mjs +366 -363
  592. package/dist/services/entity-validator/index.mjs.map +1 -1
  593. package/dist/services/entity-validator/validators.d.ts +1 -0
  594. package/dist/services/entity-validator/validators.d.ts.map +1 -1
  595. package/dist/services/entity-validator/validators.js +270 -209
  596. package/dist/services/entity-validator/validators.js.map +1 -1
  597. package/dist/services/entity-validator/validators.mjs +269 -215
  598. package/dist/services/entity-validator/validators.mjs.map +1 -1
  599. package/dist/services/errors.js +65 -65
  600. package/dist/services/errors.js.map +1 -1
  601. package/dist/services/errors.mjs +64 -66
  602. package/dist/services/errors.mjs.map +1 -1
  603. package/dist/services/event-hub.js +82 -69
  604. package/dist/services/event-hub.js.map +1 -1
  605. package/dist/services/event-hub.mjs +81 -71
  606. package/dist/services/event-hub.mjs.map +1 -1
  607. package/dist/services/features.js +19 -14
  608. package/dist/services/features.js.map +1 -1
  609. package/dist/services/features.mjs +18 -15
  610. package/dist/services/features.mjs.map +1 -1
  611. package/dist/services/fs.js +41 -40
  612. package/dist/services/fs.js.map +1 -1
  613. package/dist/services/fs.mjs +40 -39
  614. package/dist/services/fs.mjs.map +1 -1
  615. package/dist/services/metrics/admin-user-hash.d.ts.map +1 -1
  616. package/dist/services/metrics/admin-user-hash.js +13 -11
  617. package/dist/services/metrics/admin-user-hash.js.map +1 -1
  618. package/dist/services/metrics/admin-user-hash.mjs +12 -10
  619. package/dist/services/metrics/admin-user-hash.mjs.map +1 -1
  620. package/dist/services/metrics/index.d.ts +1 -1
  621. package/dist/services/metrics/index.d.ts.map +1 -1
  622. package/dist/services/metrics/index.js +47 -40
  623. package/dist/services/metrics/index.js.map +1 -1
  624. package/dist/services/metrics/index.mjs +46 -42
  625. package/dist/services/metrics/index.mjs.map +1 -1
  626. package/dist/services/metrics/is-truthy.js +13 -6
  627. package/dist/services/metrics/is-truthy.js.map +1 -1
  628. package/dist/services/metrics/is-truthy.mjs +12 -6
  629. package/dist/services/metrics/is-truthy.mjs.map +1 -1
  630. package/dist/services/metrics/middleware.d.ts.map +1 -1
  631. package/dist/services/metrics/middleware.js +37 -22
  632. package/dist/services/metrics/middleware.js.map +1 -1
  633. package/dist/services/metrics/middleware.mjs +36 -24
  634. package/dist/services/metrics/middleware.mjs.map +1 -1
  635. package/dist/services/metrics/rate-limiter.d.ts.map +1 -1
  636. package/dist/services/metrics/rate-limiter.js +24 -19
  637. package/dist/services/metrics/rate-limiter.js.map +1 -1
  638. package/dist/services/metrics/rate-limiter.mjs +23 -21
  639. package/dist/services/metrics/rate-limiter.mjs.map +1 -1
  640. package/dist/services/metrics/sender.d.ts.map +1 -1
  641. package/dist/services/metrics/sender.js +78 -69
  642. package/dist/services/metrics/sender.js.map +1 -1
  643. package/dist/services/metrics/sender.mjs +77 -64
  644. package/dist/services/metrics/sender.mjs.map +1 -1
  645. package/dist/services/query-params.js +13 -10
  646. package/dist/services/query-params.js.map +1 -1
  647. package/dist/services/query-params.mjs +12 -12
  648. package/dist/services/query-params.mjs.map +1 -1
  649. package/dist/services/reloader.js +35 -32
  650. package/dist/services/reloader.js.map +1 -1
  651. package/dist/services/reloader.mjs +34 -33
  652. package/dist/services/reloader.mjs.map +1 -1
  653. package/dist/services/request-context.js +11 -8
  654. package/dist/services/request-context.js.map +1 -1
  655. package/dist/services/request-context.mjs +10 -10
  656. package/dist/services/request-context.mjs.map +1 -1
  657. package/dist/services/server/admin-api.js +11 -10
  658. package/dist/services/server/admin-api.js.map +1 -1
  659. package/dist/services/server/admin-api.mjs +10 -11
  660. package/dist/services/server/admin-api.mjs.map +1 -1
  661. package/dist/services/server/api.js +33 -27
  662. package/dist/services/server/api.js.map +1 -1
  663. package/dist/services/server/api.mjs +32 -26
  664. package/dist/services/server/api.mjs.map +1 -1
  665. package/dist/services/server/compose-endpoint.js +116 -105
  666. package/dist/services/server/compose-endpoint.js.map +1 -1
  667. package/dist/services/server/compose-endpoint.mjs +115 -105
  668. package/dist/services/server/compose-endpoint.mjs.map +1 -1
  669. package/dist/services/server/content-api.js +11 -9
  670. package/dist/services/server/content-api.js.map +1 -1
  671. package/dist/services/server/content-api.mjs +10 -10
  672. package/dist/services/server/content-api.mjs.map +1 -1
  673. package/dist/services/server/http-server.js +48 -44
  674. package/dist/services/server/http-server.js.map +1 -1
  675. package/dist/services/server/http-server.mjs +47 -43
  676. package/dist/services/server/http-server.mjs.map +1 -1
  677. package/dist/services/server/index.js +85 -82
  678. package/dist/services/server/index.js.map +1 -1
  679. package/dist/services/server/index.mjs +84 -81
  680. package/dist/services/server/index.mjs.map +1 -1
  681. package/dist/services/server/koa.js +49 -47
  682. package/dist/services/server/koa.js.map +1 -1
  683. package/dist/services/server/koa.mjs +48 -44
  684. package/dist/services/server/koa.mjs.map +1 -1
  685. package/dist/services/server/middleware.js +86 -82
  686. package/dist/services/server/middleware.js.map +1 -1
  687. package/dist/services/server/middleware.mjs +85 -82
  688. package/dist/services/server/middleware.mjs.map +1 -1
  689. package/dist/services/server/policy.js +24 -17
  690. package/dist/services/server/policy.js.map +1 -1
  691. package/dist/services/server/policy.mjs +23 -18
  692. package/dist/services/server/policy.mjs.map +1 -1
  693. package/dist/services/server/register-middlewares.js +68 -61
  694. package/dist/services/server/register-middlewares.js.map +1 -1
  695. package/dist/services/server/register-middlewares.mjs +67 -63
  696. package/dist/services/server/register-middlewares.mjs.map +1 -1
  697. package/dist/services/server/register-routes.js +109 -66
  698. package/dist/services/server/register-routes.js.map +1 -1
  699. package/dist/services/server/register-routes.mjs +108 -66
  700. package/dist/services/server/register-routes.mjs.map +1 -1
  701. package/dist/services/server/routing.d.ts +10 -0
  702. package/dist/services/server/routing.d.ts.map +1 -1
  703. package/dist/services/server/routing.js +100 -81
  704. package/dist/services/server/routing.js.map +1 -1
  705. package/dist/services/server/routing.mjs +99 -81
  706. package/dist/services/server/routing.mjs.map +1 -1
  707. package/dist/services/utils/conditional-fields.d.ts +3 -0
  708. package/dist/services/utils/conditional-fields.d.ts.map +1 -0
  709. package/dist/services/utils/conditional-fields.js +22 -0
  710. package/dist/services/utils/conditional-fields.js.map +1 -0
  711. package/dist/services/utils/conditional-fields.mjs +20 -0
  712. package/dist/services/utils/conditional-fields.mjs.map +1 -0
  713. package/dist/services/utils/dynamic-zones.js +13 -14
  714. package/dist/services/utils/dynamic-zones.js.map +1 -1
  715. package/dist/services/utils/dynamic-zones.mjs +12 -16
  716. package/dist/services/utils/dynamic-zones.mjs.map +1 -1
  717. package/dist/services/webhook-runner.js +124 -122
  718. package/dist/services/webhook-runner.js.map +1 -1
  719. package/dist/services/webhook-runner.mjs +123 -121
  720. package/dist/services/webhook-runner.mjs.map +1 -1
  721. package/dist/services/webhook-store.js +132 -99
  722. package/dist/services/webhook-store.js.map +1 -1
  723. package/dist/services/webhook-store.mjs +131 -101
  724. package/dist/services/webhook-store.mjs.map +1 -1
  725. package/dist/services/worker-queue.js +44 -49
  726. package/dist/services/worker-queue.js.map +1 -1
  727. package/dist/services/worker-queue.mjs +43 -49
  728. package/dist/services/worker-queue.mjs.map +1 -1
  729. package/dist/utils/convert-custom-field-type.js +17 -20
  730. package/dist/utils/convert-custom-field-type.js.map +1 -1
  731. package/dist/utils/convert-custom-field-type.mjs +16 -21
  732. package/dist/utils/convert-custom-field-type.mjs.map +1 -1
  733. package/dist/utils/cron.js +64 -30
  734. package/dist/utils/cron.js.map +1 -1
  735. package/dist/utils/cron.mjs +63 -31
  736. package/dist/utils/cron.mjs.map +1 -1
  737. package/dist/utils/fetch.d.ts +5 -1
  738. package/dist/utils/fetch.d.ts.map +1 -1
  739. package/dist/utils/fetch.js +28 -18
  740. package/dist/utils/fetch.js.map +1 -1
  741. package/dist/utils/fetch.mjs +27 -19
  742. package/dist/utils/fetch.mjs.map +1 -1
  743. package/dist/utils/filepath-to-prop-path.js +20 -28
  744. package/dist/utils/filepath-to-prop-path.js.map +1 -1
  745. package/dist/utils/filepath-to-prop-path.mjs +19 -26
  746. package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
  747. package/dist/utils/is-initialized.js +21 -12
  748. package/dist/utils/is-initialized.js.map +1 -1
  749. package/dist/utils/is-initialized.mjs +20 -13
  750. package/dist/utils/is-initialized.mjs.map +1 -1
  751. package/dist/utils/lifecycles.js +6 -5
  752. package/dist/utils/lifecycles.js.map +1 -1
  753. package/dist/utils/lifecycles.mjs +5 -6
  754. package/dist/utils/lifecycles.mjs.map +1 -1
  755. package/dist/utils/load-config-file.js +40 -38
  756. package/dist/utils/load-config-file.js.map +1 -1
  757. package/dist/utils/load-config-file.mjs +39 -36
  758. package/dist/utils/load-config-file.mjs.map +1 -1
  759. package/dist/utils/load-files.js +40 -35
  760. package/dist/utils/load-files.js.map +1 -1
  761. package/dist/utils/load-files.mjs +39 -32
  762. package/dist/utils/load-files.mjs.map +1 -1
  763. package/dist/utils/open-browser.js +8 -8
  764. package/dist/utils/open-browser.js.map +1 -1
  765. package/dist/utils/open-browser.mjs +7 -7
  766. package/dist/utils/open-browser.mjs.map +1 -1
  767. package/dist/utils/resolve-working-dirs.js +23 -10
  768. package/dist/utils/resolve-working-dirs.js.map +1 -1
  769. package/dist/utils/resolve-working-dirs.mjs +22 -9
  770. package/dist/utils/resolve-working-dirs.mjs.map +1 -1
  771. package/dist/utils/signals.js +20 -14
  772. package/dist/utils/signals.js.map +1 -1
  773. package/dist/utils/signals.mjs +19 -15
  774. package/dist/utils/signals.mjs.map +1 -1
  775. package/dist/utils/startup-logger.js +107 -83
  776. package/dist/utils/startup-logger.js.map +1 -1
  777. package/dist/utils/startup-logger.mjs +106 -80
  778. package/dist/utils/startup-logger.mjs.map +1 -1
  779. package/dist/utils/transform-content-types-to-models.d.ts +197 -0
  780. package/dist/utils/transform-content-types-to-models.d.ts.map +1 -1
  781. package/dist/utils/transform-content-types-to-models.js +350 -261
  782. package/dist/utils/transform-content-types-to-models.js.map +1 -1
  783. package/dist/utils/transform-content-types-to-models.mjs +349 -269
  784. package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
  785. package/dist/utils/update-notifier/index.d.ts.map +1 -1
  786. package/dist/utils/update-notifier/index.js +68 -73
  787. package/dist/utils/update-notifier/index.js.map +1 -1
  788. package/dist/utils/update-notifier/index.mjs +67 -67
  789. package/dist/utils/update-notifier/index.mjs.map +1 -1
  790. package/package.json +29 -27
@@ -1,69 +1,171 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const fp = require("lodash/fp");
4
- const load = async (uid, { oldVersions, newVersions }) => {
5
- const updates = [];
6
- await strapi.db.transaction(async ({ trx }) => {
7
- const contentTypes = Object.values(strapi.contentTypes);
8
- const components = Object.values(strapi.components);
9
- for (const model of [...contentTypes, ...components]) {
10
- const dbModel = strapi.db.metadata.get(model.uid);
11
- for (const attribute of Object.values(dbModel.attributes)) {
12
- if (attribute.type !== "relation" || attribute.target !== uid || attribute.inversedBy || attribute.mappedBy) {
13
- continue;
14
- }
15
- const joinTable = attribute.joinTable;
16
- if (!joinTable) {
17
- continue;
18
- }
19
- const { name: sourceColumnName } = joinTable.joinColumn;
20
- const { name: targetColumnName } = joinTable.inverseJoinColumn;
21
- const ids = oldVersions.map((entry) => entry.id);
22
- const oldVersionsRelations = await strapi.db.getConnection().select("*").from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
23
- if (oldVersionsRelations.length > 0) {
24
- updates.push({ joinTable, relations: oldVersionsRelations });
25
- }
26
- if (!model.options?.draftAndPublish) {
27
- const ids2 = newVersions.map((entry) => entry.id);
28
- const newVersionsRelations = await strapi.db.getConnection().select("*").from(joinTable.name).whereIn(targetColumnName, ids2).transacting(trx);
29
- if (newVersionsRelations.length > 0) {
30
- const discardToAdd = newVersionsRelations.filter((relation) => {
31
- const matchingOldVerion = oldVersionsRelations.find((oldRelation) => {
32
- return oldRelation[sourceColumnName] === relation[sourceColumnName];
33
- });
34
- return !matchingOldVerion;
35
- }).map(fp.omit("id"));
36
- updates.push({ joinTable, relations: discardToAdd });
37
- }
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+
5
+ /* -------------------------------------------------------------------------------------------------
6
+ * Component Helper Functions
7
+ * -----------------------------------------------------------------------------------------------*/ /**
8
+ * Finds content types that contain the given component and have draft & publish enabled.
9
+ */ const getParentSchemasForComponent = (componentSchema)=>{
10
+ return Object.values(strapi.contentTypes).filter((contentType)=>{
11
+ if (!contentType.options?.draftAndPublish) return false;
12
+ return Object.values(contentType.attributes).some((attr)=>{
13
+ return attr.type === 'component' && attr.component === componentSchema.uid || attr.type === 'dynamiczone' && attr.components?.includes(componentSchema.uid);
14
+ });
15
+ });
16
+ };
17
+ /**
18
+ * Determines if a component relation should be propagated to a new document version
19
+ * when a document with draft and publish is updated.
20
+ */ const shouldPropagateRelationToNewVersion = async (componentRelation, componentSchema, parentSchemasForComponent, trx)=>{
21
+ const componentId = componentRelation[`${componentSchema.modelName}_id`];
22
+ const parent = await strapi.db.findComponentParent(componentSchema, componentId, parentSchemasForComponent, {
23
+ trx
24
+ });
25
+ // Keep relation if component has no parent entry
26
+ if (!parent?.uid) {
27
+ return true;
28
+ }
29
+ const parentContentType = strapi.contentTypes[parent.uid];
30
+ // Keep relation if parent doesn't have draft & publish enabled
31
+ if (!parentContentType?.options?.draftAndPublish) {
32
+ return true;
33
+ }
34
+ // Discard relation if parent has draft & publish enabled
35
+ return false;
36
+ };
37
+ /**
38
+ * Filters component relations to only include those that should be propagated to new document versions.
39
+ * Only relations that are NOT linked to a draft & publish parent type are kept.
40
+ */ const filterComponentRelations = async (relations, componentSchema, trx)=>{
41
+ // Exit if no relations to filter
42
+ if (relations.length === 0) {
43
+ return relations;
44
+ }
45
+ const componentParents = getParentSchemasForComponent(componentSchema);
46
+ // Exit if no draft & publish parent types exist
47
+ if (componentParents.length === 0) {
48
+ return relations;
49
+ }
50
+ const relationsToPropagate = [];
51
+ for (const relation of relations){
52
+ if (await shouldPropagateRelationToNewVersion(relation, componentSchema, componentParents, trx)) {
53
+ relationsToPropagate.push(relation);
38
54
  }
39
- }
40
55
  }
41
- });
42
- return updates;
56
+ return relationsToPropagate;
57
+ };
58
+ /**
59
+ * Loads lingering relations that need to be updated when overriding a published or draft entry.
60
+ * This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.
61
+ * This is not the case for bi-directional relations, where the target entry is also linked to the source entry.
62
+ */ const load = async (uid, { oldVersions, newVersions })=>{
63
+ const updates = [];
64
+ // Iterate all components and content types to find relations that need to be updated
65
+ await strapi.db.transaction(async ({ trx })=>{
66
+ const contentTypes = Object.values(strapi.contentTypes);
67
+ const components = Object.values(strapi.components);
68
+ for (const model of [
69
+ ...contentTypes,
70
+ ...components
71
+ ]){
72
+ const dbModel = strapi.db.metadata.get(model.uid);
73
+ for (const attribute of Object.values(dbModel.attributes)){
74
+ /**
75
+ * Only consider unidirectional relations
76
+ */ if (attribute.type !== 'relation' || attribute.target !== uid || attribute.inversedBy || attribute.mappedBy) {
77
+ continue;
78
+ }
79
+ // TODO: joinColumn relations
80
+ const joinTable = attribute.joinTable;
81
+ if (!joinTable) {
82
+ continue;
83
+ }
84
+ const { name: sourceColumnName } = joinTable.joinColumn;
85
+ const { name: targetColumnName } = joinTable.inverseJoinColumn;
86
+ /**
87
+ * Load all relations that need to be updated
88
+ */ // NOTE: when the model has draft and publish, we can assume relation are only draft to draft & published to published
89
+ const ids = oldVersions.map((entry)=>entry.id);
90
+ const oldVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
91
+ if (oldVersionsRelations.length > 0) {
92
+ updates.push({
93
+ joinTable,
94
+ relations: oldVersionsRelations
95
+ });
96
+ }
97
+ /**
98
+ * if publishing
99
+ * if published version exists
100
+ * updated published versions links
101
+ * else
102
+ * create link to newly published version
103
+ *
104
+ * if discarding
105
+ * if published version link exists & not draft version link
106
+ * create link to new draft version
107
+ */ if (!model.options?.draftAndPublish) {
108
+ const ids = newVersions.map((entry)=>entry.id);
109
+ // This is the step were we query the join table based on the id of the document
110
+ const newVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
111
+ const filteredRelations = model.modelType === 'component' ? await filterComponentRelations(newVersionsRelations, model, trx) : newVersionsRelations;
112
+ if (filteredRelations.length > 0) {
113
+ // when publishing a draft that doesn't have a published version yet,
114
+ // copy the links to the draft over to the published version
115
+ // when discarding a published version, if no drafts exists
116
+ const discardToAdd = filteredRelations.filter((relation)=>{
117
+ const matchingOldVersion = oldVersionsRelations.find((oldRelation)=>{
118
+ return oldRelation[sourceColumnName] === relation[sourceColumnName];
119
+ });
120
+ return !matchingOldVersion;
121
+ }).map(fp.omit('id'));
122
+ updates.push({
123
+ joinTable,
124
+ relations: discardToAdd
125
+ });
126
+ }
127
+ }
128
+ }
129
+ }
130
+ });
131
+ return updates;
43
132
  };
44
- const sync = async (oldEntries, newEntries, oldRelations) => {
45
- const newEntryByLocale = fp.keyBy("locale", newEntries);
46
- const oldEntriesMap = oldEntries.reduce(
47
- (acc, entry) => {
48
- const newEntry = newEntryByLocale[entry.locale];
49
- if (!newEntry)
133
+ /**
134
+ * Updates uni directional relations to target the right entries when overriding published or draft entries.
135
+ *
136
+ * @param oldEntries The old entries that are being overridden
137
+ * @param newEntries The new entries that are overriding the old ones
138
+ * @param oldRelations The relations that were previously loaded with `load` @see load
139
+ */ const sync = async (oldEntries, newEntries, oldRelations)=>{
140
+ /**
141
+ * Create a map of old entry ids to new entry ids
142
+ *
143
+ * Will be used to update the relation target ids
144
+ */ const newEntryByLocale = fp.keyBy('locale', newEntries);
145
+ const oldEntriesMap = oldEntries.reduce((acc, entry)=>{
146
+ const newEntry = newEntryByLocale[entry.locale];
147
+ if (!newEntry) return acc;
148
+ acc[entry.id] = newEntry.id;
50
149
  return acc;
51
- acc[entry.id] = newEntry.id;
52
- return acc;
53
- },
54
- {}
55
- );
56
- await strapi.db.transaction(async ({ trx }) => {
57
- for (const { joinTable, relations } of oldRelations) {
58
- const column = joinTable.inverseJoinColumn.name;
59
- const newRelations = relations.map((relation) => {
60
- const newId = oldEntriesMap[relation[column]];
61
- return { ...relation, [column]: newId };
62
- });
63
- await trx.batchInsert(joinTable.name, newRelations, 1e3);
64
- }
65
- });
150
+ }, {});
151
+ await strapi.db.transaction(async ({ trx })=>{
152
+ // Iterate old relations that are deleted and insert the new ones
153
+ for (const { joinTable, relations } of oldRelations){
154
+ // Update old ids with the new ones
155
+ const column = joinTable.inverseJoinColumn.name;
156
+ const newRelations = relations.map((relation)=>{
157
+ const newId = oldEntriesMap[relation[column]];
158
+ return {
159
+ ...relation,
160
+ [column]: newId
161
+ };
162
+ });
163
+ // Insert those relations into the join table
164
+ await trx.batchInsert(joinTable.name, newRelations, 1000);
165
+ }
166
+ });
66
167
  };
168
+
67
169
  exports.load = load;
68
170
  exports.sync = sync;
69
171
  //# sourceMappingURL=unidirectional-relations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unidirectional-relations.js","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","omit","keyBy"],"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,IAAIC,QAAK,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,mBAAmBC,GAAAA,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
+ {"version":3,"file":"unidirectional-relations.js","sources":["../../../../src/services/document-service/utils/unidirectional-relations.ts"],"sourcesContent":["/* eslint-disable no-continue */\nimport { keyBy, omit } from 'lodash/fp';\n\nimport type { UID, Schema } from '@strapi/types';\n\ninterface LoadContext {\n oldVersions: { id: string; locale: string }[];\n newVersions: { id: string; locale: string }[];\n}\n\ninterface JoinTable {\n name: string;\n joinColumn: { name: string };\n inverseJoinColumn: { name: string };\n}\n\ninterface RelationUpdate {\n joinTable: JoinTable;\n relations: Record<string, any>[];\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Helper Functions\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Finds content types that contain the given component and have draft & publish enabled.\n */\nconst getParentSchemasForComponent = (componentSchema: Schema.Component): Schema.ContentType[] => {\n return Object.values(strapi.contentTypes).filter((contentType: any) => {\n if (!contentType.options?.draftAndPublish) return false;\n\n return Object.values(contentType.attributes).some((attr: any) => {\n return (\n (attr.type === 'component' && attr.component === componentSchema.uid) ||\n (attr.type === 'dynamiczone' && attr.components?.includes(componentSchema.uid))\n );\n });\n });\n};\n\n/**\n * Determines if a component relation should be propagated to a new document version\n * when a document with draft and publish is updated.\n */\nconst shouldPropagateRelationToNewVersion = async (\n componentRelation: Record<string, any>,\n componentSchema: Schema.Component,\n parentSchemasForComponent: Schema.ContentType[],\n trx: any\n): Promise<boolean> => {\n const componentId = componentRelation[`${componentSchema.modelName}_id`];\n\n const parent = await strapi.db.findComponentParent(\n componentSchema,\n componentId,\n parentSchemasForComponent,\n { trx }\n );\n\n // Keep relation if component has no parent entry\n if (!parent?.uid) {\n return true;\n }\n\n const parentContentType = strapi.contentTypes[parent.uid as UID.ContentType];\n\n // Keep relation if parent doesn't have draft & publish enabled\n if (!parentContentType?.options?.draftAndPublish) {\n return true;\n }\n\n // Discard relation if parent has draft & publish enabled\n return false;\n};\n\n/**\n * Filters component relations to only include those that should be propagated to new document versions.\n * Only relations that are NOT linked to a draft & publish parent type are kept.\n */\nconst filterComponentRelations = async (\n relations: Record<string, any>[],\n componentSchema: Schema.Component,\n trx: any\n): Promise<Record<string, any>[]> => {\n // Exit if no relations to filter\n if (relations.length === 0) {\n return relations;\n }\n\n const componentParents = getParentSchemasForComponent(componentSchema);\n\n // Exit if no draft & publish parent types exist\n if (componentParents.length === 0) {\n return relations;\n }\n\n const relationsToPropagate = [];\n for (const relation of relations) {\n if (\n await shouldPropagateRelationToNewVersion(relation, componentSchema, componentParents, trx)\n ) {\n relationsToPropagate.push(relation);\n }\n }\n\n return relationsToPropagate;\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 (\n uid: UID.ContentType,\n { oldVersions, newVersions }: LoadContext\n): Promise<RelationUpdate[]> => {\n const updates: RelationUpdate[] = [];\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 if (!model.options?.draftAndPublish) {\n const ids = newVersions.map((entry) => entry.id);\n\n // This is the step were we query the join table based on the id of the document\n const newVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n const filteredRelations =\n model.modelType === 'component'\n ? await filterComponentRelations(newVersionsRelations, model, trx)\n : newVersionsRelations;\n\n if (filteredRelations.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 = filteredRelations\n .filter((relation) => {\n const matchingOldVersion = oldVersionsRelations.find((oldRelation) => {\n return oldRelation[sourceColumnName] === relation[sourceColumnName];\n });\n\n return !matchingOldVersion;\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":["getParentSchemasForComponent","componentSchema","Object","values","strapi","contentTypes","filter","contentType","options","draftAndPublish","attributes","some","attr","type","component","uid","components","includes","shouldPropagateRelationToNewVersion","componentRelation","parentSchemasForComponent","trx","componentId","modelName","parent","db","findComponentParent","parentContentType","filterComponentRelations","relations","length","componentParents","relationsToPropagate","relation","push","load","oldVersions","newVersions","updates","transaction","model","dbModel","metadata","get","attribute","target","inversedBy","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","ids","map","entry","id","oldVersionsRelations","getConnection","select","from","whereIn","transacting","newVersionsRelations","filteredRelations","modelType","discardToAdd","matchingOldVersion","find","oldRelation","omit","sync","oldEntries","newEntries","oldRelations","newEntryByLocale","keyBy","oldEntriesMap","reduce","acc","newEntry","locale","column","newRelations","newId","batchInsert"],"mappings":"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"}
@@ -1,69 +1,168 @@
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
- }
1
+ import { omit, keyBy } from 'lodash/fp';
2
+
3
+ /* -------------------------------------------------------------------------------------------------
4
+ * Component Helper Functions
5
+ * -----------------------------------------------------------------------------------------------*/ /**
6
+ * Finds content types that contain the given component and have draft & publish enabled.
7
+ */ const getParentSchemasForComponent = (componentSchema)=>{
8
+ return Object.values(strapi.contentTypes).filter((contentType)=>{
9
+ if (!contentType.options?.draftAndPublish) return false;
10
+ return Object.values(contentType.attributes).some((attr)=>{
11
+ return attr.type === 'component' && attr.component === componentSchema.uid || attr.type === 'dynamiczone' && attr.components?.includes(componentSchema.uid);
12
+ });
13
+ });
14
+ };
15
+ /**
16
+ * Determines if a component relation should be propagated to a new document version
17
+ * when a document with draft and publish is updated.
18
+ */ const shouldPropagateRelationToNewVersion = async (componentRelation, componentSchema, parentSchemasForComponent, trx)=>{
19
+ const componentId = componentRelation[`${componentSchema.modelName}_id`];
20
+ const parent = await strapi.db.findComponentParent(componentSchema, componentId, parentSchemasForComponent, {
21
+ trx
22
+ });
23
+ // Keep relation if component has no parent entry
24
+ if (!parent?.uid) {
25
+ return true;
26
+ }
27
+ const parentContentType = strapi.contentTypes[parent.uid];
28
+ // Keep relation if parent doesn't have draft & publish enabled
29
+ if (!parentContentType?.options?.draftAndPublish) {
30
+ return true;
38
31
  }
39
- });
40
- return updates;
32
+ // Discard relation if parent has draft & publish enabled
33
+ return false;
41
34
  };
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);
35
+ /**
36
+ * Filters component relations to only include those that should be propagated to new document versions.
37
+ * Only relations that are NOT linked to a draft & publish parent type are kept.
38
+ */ const filterComponentRelations = async (relations, componentSchema, trx)=>{
39
+ // Exit if no relations to filter
40
+ if (relations.length === 0) {
41
+ return relations;
62
42
  }
63
- });
43
+ const componentParents = getParentSchemasForComponent(componentSchema);
44
+ // Exit if no draft & publish parent types exist
45
+ if (componentParents.length === 0) {
46
+ return relations;
47
+ }
48
+ const relationsToPropagate = [];
49
+ for (const relation of relations){
50
+ if (await shouldPropagateRelationToNewVersion(relation, componentSchema, componentParents, trx)) {
51
+ relationsToPropagate.push(relation);
52
+ }
53
+ }
54
+ return relationsToPropagate;
64
55
  };
65
- export {
66
- load,
67
- sync
56
+ /**
57
+ * Loads lingering relations that need to be updated when overriding a published or draft entry.
58
+ * This is necessary because the relations are uni-directional and the target entry is not aware of the source entry.
59
+ * This is not the case for bi-directional relations, where the target entry is also linked to the source entry.
60
+ */ const load = async (uid, { oldVersions, newVersions })=>{
61
+ const updates = [];
62
+ // Iterate all components and content types to find relations that need to be updated
63
+ await strapi.db.transaction(async ({ trx })=>{
64
+ const contentTypes = Object.values(strapi.contentTypes);
65
+ const components = Object.values(strapi.components);
66
+ for (const model of [
67
+ ...contentTypes,
68
+ ...components
69
+ ]){
70
+ const dbModel = strapi.db.metadata.get(model.uid);
71
+ for (const attribute of Object.values(dbModel.attributes)){
72
+ /**
73
+ * Only consider unidirectional relations
74
+ */ if (attribute.type !== 'relation' || attribute.target !== uid || attribute.inversedBy || attribute.mappedBy) {
75
+ continue;
76
+ }
77
+ // TODO: joinColumn relations
78
+ const joinTable = attribute.joinTable;
79
+ if (!joinTable) {
80
+ continue;
81
+ }
82
+ const { name: sourceColumnName } = joinTable.joinColumn;
83
+ const { name: targetColumnName } = joinTable.inverseJoinColumn;
84
+ /**
85
+ * Load all relations that need to be updated
86
+ */ // NOTE: when the model has draft and publish, we can assume relation are only draft to draft & published to published
87
+ const ids = oldVersions.map((entry)=>entry.id);
88
+ const oldVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
89
+ if (oldVersionsRelations.length > 0) {
90
+ updates.push({
91
+ joinTable,
92
+ relations: oldVersionsRelations
93
+ });
94
+ }
95
+ /**
96
+ * if publishing
97
+ * if published version exists
98
+ * updated published versions links
99
+ * else
100
+ * create link to newly published version
101
+ *
102
+ * if discarding
103
+ * if published version link exists & not draft version link
104
+ * create link to new draft version
105
+ */ if (!model.options?.draftAndPublish) {
106
+ const ids = newVersions.map((entry)=>entry.id);
107
+ // This is the step were we query the join table based on the id of the document
108
+ const newVersionsRelations = await strapi.db.getConnection().select('*').from(joinTable.name).whereIn(targetColumnName, ids).transacting(trx);
109
+ const filteredRelations = model.modelType === 'component' ? await filterComponentRelations(newVersionsRelations, model, trx) : newVersionsRelations;
110
+ if (filteredRelations.length > 0) {
111
+ // when publishing a draft that doesn't have a published version yet,
112
+ // copy the links to the draft over to the published version
113
+ // when discarding a published version, if no drafts exists
114
+ const discardToAdd = filteredRelations.filter((relation)=>{
115
+ const matchingOldVersion = oldVersionsRelations.find((oldRelation)=>{
116
+ return oldRelation[sourceColumnName] === relation[sourceColumnName];
117
+ });
118
+ return !matchingOldVersion;
119
+ }).map(omit('id'));
120
+ updates.push({
121
+ joinTable,
122
+ relations: discardToAdd
123
+ });
124
+ }
125
+ }
126
+ }
127
+ }
128
+ });
129
+ return updates;
130
+ };
131
+ /**
132
+ * Updates uni directional relations to target the right entries when overriding published or draft entries.
133
+ *
134
+ * @param oldEntries The old entries that are being overridden
135
+ * @param newEntries The new entries that are overriding the old ones
136
+ * @param oldRelations The relations that were previously loaded with `load` @see load
137
+ */ const sync = async (oldEntries, newEntries, oldRelations)=>{
138
+ /**
139
+ * Create a map of old entry ids to new entry ids
140
+ *
141
+ * Will be used to update the relation target ids
142
+ */ const newEntryByLocale = keyBy('locale', newEntries);
143
+ const oldEntriesMap = oldEntries.reduce((acc, entry)=>{
144
+ const newEntry = newEntryByLocale[entry.locale];
145
+ if (!newEntry) return acc;
146
+ acc[entry.id] = newEntry.id;
147
+ return acc;
148
+ }, {});
149
+ await strapi.db.transaction(async ({ trx })=>{
150
+ // Iterate old relations that are deleted and insert the new ones
151
+ for (const { joinTable, relations } of oldRelations){
152
+ // Update old ids with the new ones
153
+ const column = joinTable.inverseJoinColumn.name;
154
+ const newRelations = relations.map((relation)=>{
155
+ const newId = oldEntriesMap[relation[column]];
156
+ return {
157
+ ...relation,
158
+ [column]: newId
159
+ };
160
+ });
161
+ // Insert those relations into the join table
162
+ await trx.batchInsert(joinTable.name, newRelations, 1000);
163
+ }
164
+ });
68
165
  };
166
+
167
+ export { load, sync };
69
168
  //# sourceMappingURL=unidirectional-relations.mjs.map
@@ -1 +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
+ {"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 type { UID, Schema } from '@strapi/types';\n\ninterface LoadContext {\n oldVersions: { id: string; locale: string }[];\n newVersions: { id: string; locale: string }[];\n}\n\ninterface JoinTable {\n name: string;\n joinColumn: { name: string };\n inverseJoinColumn: { name: string };\n}\n\ninterface RelationUpdate {\n joinTable: JoinTable;\n relations: Record<string, any>[];\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Helper Functions\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Finds content types that contain the given component and have draft & publish enabled.\n */\nconst getParentSchemasForComponent = (componentSchema: Schema.Component): Schema.ContentType[] => {\n return Object.values(strapi.contentTypes).filter((contentType: any) => {\n if (!contentType.options?.draftAndPublish) return false;\n\n return Object.values(contentType.attributes).some((attr: any) => {\n return (\n (attr.type === 'component' && attr.component === componentSchema.uid) ||\n (attr.type === 'dynamiczone' && attr.components?.includes(componentSchema.uid))\n );\n });\n });\n};\n\n/**\n * Determines if a component relation should be propagated to a new document version\n * when a document with draft and publish is updated.\n */\nconst shouldPropagateRelationToNewVersion = async (\n componentRelation: Record<string, any>,\n componentSchema: Schema.Component,\n parentSchemasForComponent: Schema.ContentType[],\n trx: any\n): Promise<boolean> => {\n const componentId = componentRelation[`${componentSchema.modelName}_id`];\n\n const parent = await strapi.db.findComponentParent(\n componentSchema,\n componentId,\n parentSchemasForComponent,\n { trx }\n );\n\n // Keep relation if component has no parent entry\n if (!parent?.uid) {\n return true;\n }\n\n const parentContentType = strapi.contentTypes[parent.uid as UID.ContentType];\n\n // Keep relation if parent doesn't have draft & publish enabled\n if (!parentContentType?.options?.draftAndPublish) {\n return true;\n }\n\n // Discard relation if parent has draft & publish enabled\n return false;\n};\n\n/**\n * Filters component relations to only include those that should be propagated to new document versions.\n * Only relations that are NOT linked to a draft & publish parent type are kept.\n */\nconst filterComponentRelations = async (\n relations: Record<string, any>[],\n componentSchema: Schema.Component,\n trx: any\n): Promise<Record<string, any>[]> => {\n // Exit if no relations to filter\n if (relations.length === 0) {\n return relations;\n }\n\n const componentParents = getParentSchemasForComponent(componentSchema);\n\n // Exit if no draft & publish parent types exist\n if (componentParents.length === 0) {\n return relations;\n }\n\n const relationsToPropagate = [];\n for (const relation of relations) {\n if (\n await shouldPropagateRelationToNewVersion(relation, componentSchema, componentParents, trx)\n ) {\n relationsToPropagate.push(relation);\n }\n }\n\n return relationsToPropagate;\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 (\n uid: UID.ContentType,\n { oldVersions, newVersions }: LoadContext\n): Promise<RelationUpdate[]> => {\n const updates: RelationUpdate[] = [];\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 if (!model.options?.draftAndPublish) {\n const ids = newVersions.map((entry) => entry.id);\n\n // This is the step were we query the join table based on the id of the document\n const newVersionsRelations = await strapi.db\n .getConnection()\n .select('*')\n .from(joinTable.name)\n .whereIn(targetColumnName, ids)\n .transacting(trx);\n\n const filteredRelations =\n model.modelType === 'component'\n ? await filterComponentRelations(newVersionsRelations, model, trx)\n : newVersionsRelations;\n\n if (filteredRelations.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 = filteredRelations\n .filter((relation) => {\n const matchingOldVersion = oldVersionsRelations.find((oldRelation) => {\n return oldRelation[sourceColumnName] === relation[sourceColumnName];\n });\n\n return !matchingOldVersion;\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":["getParentSchemasForComponent","componentSchema","Object","values","strapi","contentTypes","filter","contentType","options","draftAndPublish","attributes","some","attr","type","component","uid","components","includes","shouldPropagateRelationToNewVersion","componentRelation","parentSchemasForComponent","trx","componentId","modelName","parent","db","findComponentParent","parentContentType","filterComponentRelations","relations","length","componentParents","relationsToPropagate","relation","push","load","oldVersions","newVersions","updates","transaction","model","dbModel","metadata","get","attribute","target","inversedBy","mappedBy","joinTable","name","sourceColumnName","joinColumn","targetColumnName","inverseJoinColumn","ids","map","entry","id","oldVersionsRelations","getConnection","select","from","whereIn","transacting","newVersionsRelations","filteredRelations","modelType","discardToAdd","matchingOldVersion","find","oldRelation","omit","sync","oldEntries","newEntries","oldRelations","newEntryByLocale","keyBy","oldEntriesMap","reduce","acc","newEntry","locale","column","newRelations","newId","batchInsert"],"mappings":"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"}