@strapi/core 0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b → 0.0.0-experimental.d362bf200f5f9359a4bbd4a549603de5ee1f04ca

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. package/dist/Strapi.d.ts +38 -36
  2. package/dist/Strapi.d.ts.map +1 -1
  3. package/dist/Strapi.js +31 -12
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +31 -12
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/configuration/index.d.ts.map +1 -1
  8. package/dist/configuration/index.js +4 -4
  9. package/dist/configuration/index.js.map +1 -1
  10. package/dist/configuration/index.mjs +1 -1
  11. package/dist/configuration/index.mjs.map +1 -1
  12. package/dist/configuration/urls.d.ts +8 -0
  13. package/dist/configuration/urls.d.ts.map +1 -0
  14. package/dist/configuration/urls.js +68 -0
  15. package/dist/configuration/urls.js.map +1 -0
  16. package/dist/configuration/urls.mjs +66 -0
  17. package/dist/configuration/urls.mjs.map +1 -0
  18. package/dist/container.d.ts +2 -2
  19. package/dist/container.d.ts.map +1 -1
  20. package/dist/container.js.map +1 -1
  21. package/dist/container.mjs.map +1 -1
  22. package/dist/core-api/controller/collection-type.d.ts +3 -3
  23. package/dist/core-api/controller/collection-type.d.ts.map +1 -1
  24. package/dist/core-api/controller/collection-type.js.map +1 -1
  25. package/dist/core-api/controller/collection-type.mjs.map +1 -1
  26. package/dist/core-api/controller/index.d.ts +3 -3
  27. package/dist/core-api/controller/index.d.ts.map +1 -1
  28. package/dist/core-api/controller/index.js +11 -6
  29. package/dist/core-api/controller/index.js.map +1 -1
  30. package/dist/core-api/controller/index.mjs +12 -7
  31. package/dist/core-api/controller/index.mjs.map +1 -1
  32. package/dist/core-api/controller/single-type.d.ts +3 -3
  33. package/dist/core-api/controller/single-type.d.ts.map +1 -1
  34. package/dist/core-api/controller/single-type.js.map +1 -1
  35. package/dist/core-api/controller/single-type.mjs.map +1 -1
  36. package/dist/core-api/controller/transform.d.ts +10 -9
  37. package/dist/core-api/controller/transform.d.ts.map +1 -1
  38. package/dist/core-api/controller/transform.js +19 -13
  39. package/dist/core-api/controller/transform.js.map +1 -1
  40. package/dist/core-api/controller/transform.mjs +19 -13
  41. package/dist/core-api/controller/transform.mjs.map +1 -1
  42. package/dist/core-api/service/collection-type.d.ts +10 -10
  43. package/dist/core-api/service/collection-type.d.ts.map +1 -1
  44. package/dist/core-api/service/collection-type.js.map +1 -1
  45. package/dist/core-api/service/collection-type.mjs.map +1 -1
  46. package/dist/core-api/service/index.d.ts +3 -3
  47. package/dist/core-api/service/index.d.ts.map +1 -1
  48. package/dist/core-api/service/index.js.map +1 -1
  49. package/dist/core-api/service/index.mjs.map +1 -1
  50. package/dist/core-api/service/single-type.d.ts +5 -5
  51. package/dist/core-api/service/single-type.d.ts.map +1 -1
  52. package/dist/core-api/service/single-type.js +3 -4
  53. package/dist/core-api/service/single-type.js.map +1 -1
  54. package/dist/core-api/service/single-type.mjs +3 -4
  55. package/dist/core-api/service/single-type.mjs.map +1 -1
  56. package/dist/domain/content-type/index.d.ts +1 -1
  57. package/dist/domain/content-type/index.d.ts.map +1 -1
  58. package/dist/domain/content-type/index.js +3 -0
  59. package/dist/domain/content-type/index.js.map +1 -1
  60. package/dist/domain/content-type/index.mjs +3 -0
  61. package/dist/domain/content-type/index.mjs.map +1 -1
  62. package/dist/domain/content-type/validator.d.ts.map +1 -1
  63. package/dist/domain/content-type/validator.js +1 -1
  64. package/dist/domain/content-type/validator.js.map +1 -1
  65. package/dist/domain/content-type/validator.mjs +2 -2
  66. package/dist/domain/content-type/validator.mjs.map +1 -1
  67. package/dist/domain/module/index.d.ts +24 -23
  68. package/dist/domain/module/index.d.ts.map +1 -1
  69. package/dist/domain/module/index.js +3 -3
  70. package/dist/domain/module/index.js.map +1 -1
  71. package/dist/domain/module/index.mjs +4 -4
  72. package/dist/domain/module/index.mjs.map +1 -1
  73. package/dist/ee/index.d.ts +2 -2
  74. package/dist/ee/index.d.ts.map +1 -1
  75. package/dist/ee/index.js.map +1 -1
  76. package/dist/ee/index.mjs.map +1 -1
  77. package/dist/ee/license.d.ts +2 -2
  78. package/dist/ee/license.d.ts.map +1 -1
  79. package/dist/ee/license.js.map +1 -1
  80. package/dist/ee/license.mjs.map +1 -1
  81. package/dist/factories.d.ts +10 -10
  82. package/dist/factories.d.ts.map +1 -1
  83. package/dist/factories.js +6 -2
  84. package/dist/factories.js.map +1 -1
  85. package/dist/factories.mjs +6 -2
  86. package/dist/factories.mjs.map +1 -1
  87. package/dist/loaders/admin.d.ts +2 -2
  88. package/dist/loaders/admin.d.ts.map +1 -1
  89. package/dist/loaders/admin.js.map +1 -1
  90. package/dist/loaders/admin.mjs.map +1 -1
  91. package/dist/loaders/apis.d.ts +2 -2
  92. package/dist/loaders/apis.d.ts.map +1 -1
  93. package/dist/loaders/apis.js +1 -1
  94. package/dist/loaders/apis.js.map +1 -1
  95. package/dist/loaders/apis.mjs +2 -2
  96. package/dist/loaders/apis.mjs.map +1 -1
  97. package/dist/loaders/components.d.ts +2 -2
  98. package/dist/loaders/components.d.ts.map +1 -1
  99. package/dist/loaders/components.js.map +1 -1
  100. package/dist/loaders/components.mjs.map +1 -1
  101. package/dist/loaders/index.d.ts +2 -2
  102. package/dist/loaders/index.d.ts.map +1 -1
  103. package/dist/loaders/index.js.map +1 -1
  104. package/dist/loaders/index.mjs.map +1 -1
  105. package/dist/loaders/middlewares.d.ts +2 -2
  106. package/dist/loaders/middlewares.d.ts.map +1 -1
  107. package/dist/loaders/middlewares.js.map +1 -1
  108. package/dist/loaders/middlewares.mjs.map +1 -1
  109. package/dist/loaders/plugins/get-enabled-plugins.d.ts +2 -2
  110. package/dist/loaders/plugins/get-enabled-plugins.d.ts.map +1 -1
  111. package/dist/loaders/plugins/get-enabled-plugins.js +2 -1
  112. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  113. package/dist/loaders/plugins/get-enabled-plugins.mjs +3 -2
  114. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  115. package/dist/loaders/plugins/index.d.ts +2 -2
  116. package/dist/loaders/plugins/index.d.ts.map +1 -1
  117. package/dist/loaders/plugins/index.js.map +1 -1
  118. package/dist/loaders/plugins/index.mjs.map +1 -1
  119. package/dist/loaders/policies.d.ts +2 -2
  120. package/dist/loaders/policies.d.ts.map +1 -1
  121. package/dist/loaders/policies.js.map +1 -1
  122. package/dist/loaders/policies.mjs.map +1 -1
  123. package/dist/loaders/sanitizers.d.ts +2 -2
  124. package/dist/loaders/sanitizers.d.ts.map +1 -1
  125. package/dist/loaders/sanitizers.js.map +1 -1
  126. package/dist/loaders/sanitizers.mjs.map +1 -1
  127. package/dist/loaders/src-index.d.ts +2 -2
  128. package/dist/loaders/src-index.d.ts.map +1 -1
  129. package/dist/loaders/src-index.js.map +1 -1
  130. package/dist/loaders/src-index.mjs.map +1 -1
  131. package/dist/loaders/validators.d.ts +2 -2
  132. package/dist/loaders/validators.d.ts.map +1 -1
  133. package/dist/loaders/validators.js.map +1 -1
  134. package/dist/loaders/validators.mjs.map +1 -1
  135. package/dist/middlewares/body.d.ts +2 -2
  136. package/dist/middlewares/body.d.ts.map +1 -1
  137. package/dist/middlewares/body.js.map +1 -1
  138. package/dist/middlewares/body.mjs.map +1 -1
  139. package/dist/middlewares/compression.d.ts +2 -2
  140. package/dist/middlewares/compression.d.ts.map +1 -1
  141. package/dist/middlewares/compression.js.map +1 -1
  142. package/dist/middlewares/compression.mjs.map +1 -1
  143. package/dist/middlewares/cors.d.ts +2 -2
  144. package/dist/middlewares/cors.d.ts.map +1 -1
  145. package/dist/middlewares/cors.js.map +1 -1
  146. package/dist/middlewares/cors.mjs.map +1 -1
  147. package/dist/middlewares/errors.d.ts +2 -2
  148. package/dist/middlewares/errors.d.ts.map +1 -1
  149. package/dist/middlewares/errors.js.map +1 -1
  150. package/dist/middlewares/errors.mjs.map +1 -1
  151. package/dist/middlewares/favicon.d.ts +2 -2
  152. package/dist/middlewares/favicon.d.ts.map +1 -1
  153. package/dist/middlewares/favicon.js.map +1 -1
  154. package/dist/middlewares/favicon.mjs.map +1 -1
  155. package/dist/middlewares/index.d.ts +2 -2
  156. package/dist/middlewares/index.d.ts.map +1 -1
  157. package/dist/middlewares/index.js.map +1 -1
  158. package/dist/middlewares/index.mjs.map +1 -1
  159. package/dist/middlewares/ip.d.ts +2 -2
  160. package/dist/middlewares/ip.d.ts.map +1 -1
  161. package/dist/middlewares/ip.js.map +1 -1
  162. package/dist/middlewares/ip.mjs.map +1 -1
  163. package/dist/middlewares/logger.d.ts +2 -2
  164. package/dist/middlewares/logger.d.ts.map +1 -1
  165. package/dist/middlewares/logger.js.map +1 -1
  166. package/dist/middlewares/logger.mjs.map +1 -1
  167. package/dist/middlewares/powered-by.d.ts +2 -2
  168. package/dist/middlewares/powered-by.d.ts.map +1 -1
  169. package/dist/middlewares/powered-by.js.map +1 -1
  170. package/dist/middlewares/powered-by.mjs.map +1 -1
  171. package/dist/middlewares/public.d.ts +2 -2
  172. package/dist/middlewares/public.d.ts.map +1 -1
  173. package/dist/middlewares/public.js.map +1 -1
  174. package/dist/middlewares/public.mjs.map +1 -1
  175. package/dist/middlewares/query.d.ts +2 -2
  176. package/dist/middlewares/query.d.ts.map +1 -1
  177. package/dist/middlewares/query.js.map +1 -1
  178. package/dist/middlewares/query.mjs.map +1 -1
  179. package/dist/middlewares/response-time.d.ts +2 -2
  180. package/dist/middlewares/response-time.d.ts.map +1 -1
  181. package/dist/middlewares/response-time.js.map +1 -1
  182. package/dist/middlewares/response-time.mjs.map +1 -1
  183. package/dist/middlewares/responses.d.ts +3 -3
  184. package/dist/middlewares/responses.d.ts.map +1 -1
  185. package/dist/middlewares/responses.js.map +1 -1
  186. package/dist/middlewares/responses.mjs.map +1 -1
  187. package/dist/middlewares/security.d.ts +2 -2
  188. package/dist/middlewares/security.d.ts.map +1 -1
  189. package/dist/middlewares/security.js +2 -2
  190. package/dist/middlewares/security.js.map +1 -1
  191. package/dist/middlewares/security.mjs +2 -2
  192. package/dist/middlewares/security.mjs.map +1 -1
  193. package/dist/middlewares/session.d.ts +2 -2
  194. package/dist/middlewares/session.d.ts.map +1 -1
  195. package/dist/middlewares/session.js.map +1 -1
  196. package/dist/middlewares/session.mjs.map +1 -1
  197. package/dist/migrations/draft-publish.d.ts +17 -0
  198. package/dist/migrations/draft-publish.d.ts.map +1 -0
  199. package/dist/migrations/draft-publish.js +59 -0
  200. package/dist/migrations/draft-publish.js.map +1 -0
  201. package/dist/migrations/draft-publish.mjs +59 -0
  202. package/dist/migrations/draft-publish.mjs.map +1 -0
  203. package/dist/registries/apis.d.ts +2 -2
  204. package/dist/registries/apis.d.ts.map +1 -1
  205. package/dist/registries/apis.js.map +1 -1
  206. package/dist/registries/apis.mjs.map +1 -1
  207. package/dist/registries/components.d.ts +6 -6
  208. package/dist/registries/components.d.ts.map +1 -1
  209. package/dist/registries/components.js.map +1 -1
  210. package/dist/registries/components.mjs.map +1 -1
  211. package/dist/registries/config.d.ts +2 -2
  212. package/dist/registries/config.d.ts.map +1 -1
  213. package/dist/registries/config.js +26 -6
  214. package/dist/registries/config.js.map +1 -1
  215. package/dist/registries/config.mjs +27 -5
  216. package/dist/registries/config.mjs.map +1 -1
  217. package/dist/registries/content-types.d.ts +5 -5
  218. package/dist/registries/content-types.d.ts.map +1 -1
  219. package/dist/registries/content-types.js.map +1 -1
  220. package/dist/registries/content-types.mjs.map +1 -1
  221. package/dist/registries/controllers.d.ts +10 -10
  222. package/dist/registries/controllers.d.ts.map +1 -1
  223. package/dist/registries/controllers.js.map +1 -1
  224. package/dist/registries/controllers.mjs.map +1 -1
  225. package/dist/registries/custom-fields.d.ts +3 -3
  226. package/dist/registries/custom-fields.d.ts.map +1 -1
  227. package/dist/registries/custom-fields.js.map +1 -1
  228. package/dist/registries/custom-fields.mjs.map +1 -1
  229. package/dist/registries/middlewares.d.ts +6 -6
  230. package/dist/registries/middlewares.d.ts.map +1 -1
  231. package/dist/registries/middlewares.js.map +1 -1
  232. package/dist/registries/middlewares.mjs.map +1 -1
  233. package/dist/registries/modules.d.ts +2 -2
  234. package/dist/registries/modules.d.ts.map +1 -1
  235. package/dist/registries/modules.js.map +1 -1
  236. package/dist/registries/modules.mjs.map +1 -1
  237. package/dist/registries/plugins.d.ts +5 -5
  238. package/dist/registries/plugins.d.ts.map +1 -1
  239. package/dist/registries/plugins.js.map +1 -1
  240. package/dist/registries/plugins.mjs.map +1 -1
  241. package/dist/registries/policies.d.ts +23 -11
  242. package/dist/registries/policies.d.ts.map +1 -1
  243. package/dist/registries/policies.js +64 -18
  244. package/dist/registries/policies.js.map +1 -1
  245. package/dist/registries/policies.mjs +65 -19
  246. package/dist/registries/policies.mjs.map +1 -1
  247. package/dist/registries/services.d.ts +8 -8
  248. package/dist/registries/services.d.ts.map +1 -1
  249. package/dist/registries/services.js.map +1 -1
  250. package/dist/registries/services.mjs.map +1 -1
  251. package/dist/services/auth/index.d.ts +4 -4
  252. package/dist/services/auth/index.d.ts.map +1 -1
  253. package/dist/services/auth/index.js.map +1 -1
  254. package/dist/services/auth/index.mjs.map +1 -1
  255. package/dist/services/content-api/index.d.ts +21 -3
  256. package/dist/services/content-api/index.d.ts.map +1 -1
  257. package/dist/services/content-api/index.js +27 -1
  258. package/dist/services/content-api/index.js.map +1 -1
  259. package/dist/services/content-api/index.mjs +27 -1
  260. package/dist/services/content-api/index.mjs.map +1 -1
  261. package/dist/services/content-api/permissions/index.d.ts +3 -3
  262. package/dist/services/content-api/permissions/index.d.ts.map +1 -1
  263. package/dist/services/content-api/permissions/index.js.map +1 -1
  264. package/dist/services/content-api/permissions/index.mjs.map +1 -1
  265. package/dist/services/cron.d.ts +2 -2
  266. package/dist/services/cron.d.ts.map +1 -1
  267. package/dist/services/cron.js.map +1 -1
  268. package/dist/services/cron.mjs.map +1 -1
  269. package/dist/services/custom-fields.d.ts +2 -2
  270. package/dist/services/custom-fields.d.ts.map +1 -1
  271. package/dist/services/custom-fields.js.map +1 -1
  272. package/dist/services/custom-fields.mjs.map +1 -1
  273. package/dist/services/document-service/common.d.ts +2 -2
  274. package/dist/services/document-service/common.d.ts.map +1 -1
  275. package/dist/services/document-service/common.js.map +1 -1
  276. package/dist/services/document-service/common.mjs.map +1 -1
  277. package/dist/services/document-service/document-engine.d.ts +1 -7
  278. package/dist/services/document-service/document-engine.d.ts.map +1 -1
  279. package/dist/services/document-service/draft-and-publish.d.ts +9 -23
  280. package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
  281. package/dist/services/document-service/draft-and-publish.js +37 -9
  282. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  283. package/dist/services/document-service/draft-and-publish.mjs +38 -10
  284. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  285. package/dist/services/document-service/index.d.ts +2 -2
  286. package/dist/services/document-service/index.d.ts.map +1 -1
  287. package/dist/services/document-service/index.js +10 -8
  288. package/dist/services/document-service/index.js.map +1 -1
  289. package/dist/services/document-service/index.mjs +4 -2
  290. package/dist/services/document-service/index.mjs.map +1 -1
  291. package/dist/services/document-service/internationalization.d.ts +5 -5
  292. package/dist/services/document-service/internationalization.d.ts.map +1 -1
  293. package/dist/services/document-service/internationalization.js.map +1 -1
  294. package/dist/services/document-service/internationalization.mjs.map +1 -1
  295. package/dist/services/document-service/middlewares/errors.d.ts +6 -0
  296. package/dist/services/document-service/middlewares/errors.d.ts.map +1 -0
  297. package/dist/services/document-service/middlewares/errors.js +25 -0
  298. package/dist/services/document-service/middlewares/errors.js.map +1 -0
  299. package/dist/services/document-service/middlewares/errors.mjs +25 -0
  300. package/dist/services/document-service/middlewares/errors.mjs.map +1 -0
  301. package/dist/services/document-service/middlewares/index.d.ts +3 -0
  302. package/dist/services/document-service/middlewares/index.d.ts.map +1 -0
  303. package/dist/services/document-service/{middlewares.d.ts → middlewares/middleware-manager.d.ts} +3 -4
  304. package/dist/services/document-service/middlewares/middleware-manager.d.ts.map +1 -0
  305. package/dist/services/document-service/{middlewares.js → middlewares/middleware-manager.js} +1 -1
  306. package/dist/services/document-service/middlewares/middleware-manager.js.map +1 -0
  307. package/dist/services/document-service/{middlewares.mjs → middlewares/middleware-manager.mjs} +1 -1
  308. package/dist/services/document-service/middlewares/middleware-manager.mjs.map +1 -0
  309. package/dist/services/document-service/repository.d.ts +3 -0
  310. package/dist/services/document-service/repository.d.ts.map +1 -0
  311. package/dist/services/document-service/repository.js +297 -0
  312. package/dist/services/document-service/repository.js.map +1 -0
  313. package/dist/services/document-service/repository.mjs +297 -0
  314. package/dist/services/document-service/repository.mjs.map +1 -0
  315. package/dist/services/document-service/transform/fields.d.ts +2 -2
  316. package/dist/services/document-service/transform/fields.d.ts.map +1 -1
  317. package/dist/services/document-service/transform/fields.js.map +1 -1
  318. package/dist/services/document-service/transform/fields.mjs.map +1 -1
  319. package/dist/services/document-service/transform/id-map.d.ts +4 -4
  320. package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
  321. package/dist/services/document-service/transform/id-map.js +15 -9
  322. package/dist/services/document-service/transform/id-map.js.map +1 -1
  323. package/dist/services/document-service/transform/id-map.mjs +16 -10
  324. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  325. package/dist/services/document-service/transform/id-transform.d.ts +4 -18
  326. package/dist/services/document-service/transform/id-transform.d.ts.map +1 -1
  327. package/dist/services/document-service/transform/id-transform.js +18 -12
  328. package/dist/services/document-service/transform/id-transform.js.map +1 -1
  329. package/dist/services/document-service/transform/id-transform.mjs +18 -12
  330. package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
  331. package/dist/services/document-service/transform/populate.d.ts +5 -2
  332. package/dist/services/document-service/transform/populate.d.ts.map +1 -1
  333. package/dist/services/document-service/transform/populate.js +1 -1
  334. package/dist/services/document-service/transform/populate.js.map +1 -1
  335. package/dist/services/document-service/transform/populate.mjs +1 -1
  336. package/dist/services/document-service/transform/populate.mjs.map +1 -1
  337. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts +3 -3
  338. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  339. package/dist/services/document-service/transform/relations/extract/data-ids.js +24 -13
  340. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  341. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +24 -13
  342. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  343. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts +3 -3
  344. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
  345. package/dist/services/document-service/transform/relations/transform/data-ids.js +62 -38
  346. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  347. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +63 -39
  348. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  349. package/dist/services/document-service/transform/relations/transform/output-ids.d.ts +1 -3
  350. package/dist/services/document-service/transform/relations/transform/output-ids.d.ts.map +1 -1
  351. package/dist/services/document-service/transform/relations/utils/dp.d.ts +10 -0
  352. package/dist/services/document-service/transform/relations/utils/dp.d.ts.map +1 -0
  353. package/dist/services/document-service/transform/relations/utils/dp.js +30 -0
  354. package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -0
  355. package/dist/services/document-service/transform/relations/utils/dp.mjs +30 -0
  356. package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -0
  357. package/dist/services/document-service/transform/relations/utils/i18n.d.ts +4 -4
  358. package/dist/services/document-service/transform/relations/utils/i18n.d.ts.map +1 -1
  359. package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -1
  360. package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -1
  361. package/dist/services/document-service/transform/relations/utils/types.d.ts +4 -1
  362. package/dist/services/document-service/transform/relations/utils/types.d.ts.map +1 -1
  363. package/dist/services/document-service/transform/types.d.ts +4 -4
  364. package/dist/services/document-service/transform/types.d.ts.map +1 -1
  365. package/dist/services/document-service/utils/populate.d.ts +9 -2
  366. package/dist/services/document-service/utils/populate.d.ts.map +1 -1
  367. package/dist/services/document-service/utils/populate.js +5 -5
  368. package/dist/services/document-service/utils/populate.js.map +1 -1
  369. package/dist/services/document-service/utils/populate.mjs +5 -5
  370. package/dist/services/document-service/utils/populate.mjs.map +1 -1
  371. package/dist/services/entity-service/attributes/index.d.ts +4 -4
  372. package/dist/services/entity-service/attributes/index.d.ts.map +1 -1
  373. package/dist/services/entity-service/attributes/index.js.map +1 -1
  374. package/dist/services/entity-service/attributes/index.mjs.map +1 -1
  375. package/dist/services/entity-service/attributes/transforms.d.ts +3 -3
  376. package/dist/services/entity-service/attributes/transforms.d.ts.map +1 -1
  377. package/dist/services/entity-service/attributes/transforms.js.map +1 -1
  378. package/dist/services/entity-service/attributes/transforms.mjs.map +1 -1
  379. package/dist/services/entity-service/components.d.ts +88 -16
  380. package/dist/services/entity-service/components.d.ts.map +1 -1
  381. package/dist/services/entity-service/components.js +13 -99
  382. package/dist/services/entity-service/components.js.map +1 -1
  383. package/dist/services/entity-service/components.mjs +14 -100
  384. package/dist/services/entity-service/components.mjs.map +1 -1
  385. package/dist/services/entity-service/index.d.ts +4 -6
  386. package/dist/services/entity-service/index.d.ts.map +1 -1
  387. package/dist/services/entity-service/index.js +38 -204
  388. package/dist/services/entity-service/index.js.map +1 -1
  389. package/dist/services/entity-service/index.mjs +32 -198
  390. package/dist/services/entity-service/index.mjs.map +1 -1
  391. package/dist/services/entity-service/params.d.ts +5 -5
  392. package/dist/services/entity-service/params.d.ts.map +1 -1
  393. package/dist/services/entity-service/params.js +1 -1
  394. package/dist/services/entity-service/params.js.map +1 -1
  395. package/dist/services/entity-service/params.mjs +1 -1
  396. package/dist/services/entity-service/params.mjs.map +1 -1
  397. package/dist/services/entity-validator/index.d.ts +2 -2
  398. package/dist/services/entity-validator/index.d.ts.map +1 -1
  399. package/dist/services/entity-validator/index.js +8 -3
  400. package/dist/services/entity-validator/index.js.map +1 -1
  401. package/dist/services/entity-validator/index.mjs +8 -3
  402. package/dist/services/entity-validator/index.mjs.map +1 -1
  403. package/dist/services/entity-validator/validators.d.ts +18 -18
  404. package/dist/services/entity-validator/validators.d.ts.map +1 -1
  405. package/dist/services/entity-validator/validators.js +6 -1
  406. package/dist/services/entity-validator/validators.js.map +1 -1
  407. package/dist/services/entity-validator/validators.mjs +6 -1
  408. package/dist/services/entity-validator/validators.mjs.map +1 -1
  409. package/dist/services/features.d.ts +3 -3
  410. package/dist/services/features.d.ts.map +1 -1
  411. package/dist/services/features.js.map +1 -1
  412. package/dist/services/features.mjs.map +1 -1
  413. package/dist/services/fs.d.ts +2 -2
  414. package/dist/services/fs.d.ts.map +1 -1
  415. package/dist/services/fs.js.map +1 -1
  416. package/dist/services/fs.mjs.map +1 -1
  417. package/dist/services/metrics/admin-user-hash.d.ts +2 -2
  418. package/dist/services/metrics/admin-user-hash.d.ts.map +1 -1
  419. package/dist/services/metrics/admin-user-hash.js.map +1 -1
  420. package/dist/services/metrics/admin-user-hash.mjs.map +1 -1
  421. package/dist/services/metrics/index.d.ts +2 -2
  422. package/dist/services/metrics/index.d.ts.map +1 -1
  423. package/dist/services/metrics/index.js.map +1 -1
  424. package/dist/services/metrics/index.mjs.map +1 -1
  425. package/dist/services/metrics/middleware.d.ts +2 -2
  426. package/dist/services/metrics/middleware.d.ts.map +1 -1
  427. package/dist/services/metrics/middleware.js.map +1 -1
  428. package/dist/services/metrics/middleware.mjs.map +1 -1
  429. package/dist/services/metrics/sender.d.ts +3 -3
  430. package/dist/services/metrics/sender.d.ts.map +1 -1
  431. package/dist/services/metrics/sender.js.map +1 -1
  432. package/dist/services/metrics/sender.mjs.map +1 -1
  433. package/dist/services/query-params.d.ts +7 -0
  434. package/dist/services/query-params.d.ts.map +1 -0
  435. package/dist/services/query-params.js +12 -0
  436. package/dist/services/query-params.js.map +1 -0
  437. package/dist/services/query-params.mjs +13 -0
  438. package/dist/services/query-params.mjs.map +1 -0
  439. package/dist/services/server/admin-api.d.ts +3 -3
  440. package/dist/services/server/admin-api.d.ts.map +1 -1
  441. package/dist/services/server/admin-api.js.map +1 -1
  442. package/dist/services/server/admin-api.mjs.map +1 -1
  443. package/dist/services/server/api.d.ts +3 -3
  444. package/dist/services/server/api.d.ts.map +1 -1
  445. package/dist/services/server/api.js.map +1 -1
  446. package/dist/services/server/api.mjs.map +1 -1
  447. package/dist/services/server/compose-endpoint.d.ts +2 -2
  448. package/dist/services/server/compose-endpoint.d.ts.map +1 -1
  449. package/dist/services/server/compose-endpoint.js +1 -2
  450. package/dist/services/server/compose-endpoint.js.map +1 -1
  451. package/dist/services/server/compose-endpoint.mjs +2 -3
  452. package/dist/services/server/compose-endpoint.mjs.map +1 -1
  453. package/dist/services/server/content-api.d.ts +3 -3
  454. package/dist/services/server/content-api.d.ts.map +1 -1
  455. package/dist/services/server/content-api.js.map +1 -1
  456. package/dist/services/server/content-api.mjs.map +1 -1
  457. package/dist/services/server/http-server.d.ts +2 -2
  458. package/dist/services/server/http-server.d.ts.map +1 -1
  459. package/dist/services/server/http-server.js.map +1 -1
  460. package/dist/services/server/http-server.mjs.map +1 -1
  461. package/dist/services/server/index.d.ts +2 -2
  462. package/dist/services/server/index.d.ts.map +1 -1
  463. package/dist/services/server/index.js +1 -2
  464. package/dist/services/server/index.js.map +1 -1
  465. package/dist/services/server/index.mjs +1 -2
  466. package/dist/services/server/index.mjs.map +1 -1
  467. package/dist/services/server/middleware.d.ts +4 -4
  468. package/dist/services/server/middleware.d.ts.map +1 -1
  469. package/dist/services/server/middleware.js.map +1 -1
  470. package/dist/services/server/middleware.mjs.map +1 -1
  471. package/dist/services/server/policy.d.ts +3 -3
  472. package/dist/services/server/policy.d.ts.map +1 -1
  473. package/dist/services/server/policy.js +4 -4
  474. package/dist/services/server/policy.js.map +1 -1
  475. package/dist/services/server/policy.mjs +4 -4
  476. package/dist/services/server/policy.mjs.map +1 -1
  477. package/dist/services/server/register-middlewares.d.ts +2 -2
  478. package/dist/services/server/register-middlewares.d.ts.map +1 -1
  479. package/dist/services/server/register-middlewares.js.map +1 -1
  480. package/dist/services/server/register-middlewares.mjs.map +1 -1
  481. package/dist/services/server/register-routes.d.ts +2 -2
  482. package/dist/services/server/register-routes.d.ts.map +1 -1
  483. package/dist/services/server/register-routes.js.map +1 -1
  484. package/dist/services/server/register-routes.mjs.map +1 -1
  485. package/dist/services/server/routing.d.ts +4 -4
  486. package/dist/services/server/routing.d.ts.map +1 -1
  487. package/dist/services/server/routing.js.map +1 -1
  488. package/dist/services/server/routing.mjs.map +1 -1
  489. package/dist/services/utils/dynamic-zones.d.ts.map +1 -1
  490. package/dist/services/utils/dynamic-zones.js +2 -1
  491. package/dist/services/utils/dynamic-zones.js.map +1 -1
  492. package/dist/services/utils/dynamic-zones.mjs +2 -1
  493. package/dist/services/utils/dynamic-zones.mjs.map +1 -1
  494. package/dist/services/webhook-runner.js.map +1 -1
  495. package/dist/services/webhook-runner.mjs.map +1 -1
  496. package/dist/utils/convert-custom-field-type.d.ts +2 -2
  497. package/dist/utils/convert-custom-field-type.d.ts.map +1 -1
  498. package/dist/utils/convert-custom-field-type.js.map +1 -1
  499. package/dist/utils/convert-custom-field-type.mjs.map +1 -1
  500. package/dist/utils/fetch.d.ts +3 -3
  501. package/dist/utils/fetch.d.ts.map +1 -1
  502. package/dist/utils/fetch.js.map +1 -1
  503. package/dist/utils/fetch.mjs.map +1 -1
  504. package/dist/utils/get-dirs.d.ts +3 -3
  505. package/dist/utils/get-dirs.d.ts.map +1 -1
  506. package/dist/utils/get-dirs.js.map +1 -1
  507. package/dist/utils/get-dirs.mjs.map +1 -1
  508. package/dist/utils/is-initialized.d.ts +2 -2
  509. package/dist/utils/is-initialized.d.ts.map +1 -1
  510. package/dist/utils/is-initialized.js +1 -1
  511. package/dist/utils/is-initialized.js.map +1 -1
  512. package/dist/utils/is-initialized.mjs +1 -1
  513. package/dist/utils/is-initialized.mjs.map +1 -1
  514. package/dist/utils/load-config-file.js +1 -1
  515. package/dist/utils/load-config-file.js.map +1 -1
  516. package/dist/utils/load-config-file.mjs +2 -2
  517. package/dist/utils/load-config-file.mjs.map +1 -1
  518. package/dist/utils/open-browser.d.ts +2 -2
  519. package/dist/utils/open-browser.d.ts.map +1 -1
  520. package/dist/utils/open-browser.js.map +1 -1
  521. package/dist/utils/open-browser.mjs.map +1 -1
  522. package/dist/utils/signals.d.ts +2 -2
  523. package/dist/utils/signals.d.ts.map +1 -1
  524. package/dist/utils/signals.js.map +1 -1
  525. package/dist/utils/signals.mjs.map +1 -1
  526. package/dist/utils/startup-logger.d.ts +2 -2
  527. package/dist/utils/startup-logger.d.ts.map +1 -1
  528. package/dist/utils/startup-logger.js.map +1 -1
  529. package/dist/utils/startup-logger.mjs.map +1 -1
  530. package/dist/utils/transform-content-types-to-models.d.ts +34 -84
  531. package/dist/utils/transform-content-types-to-models.d.ts.map +1 -1
  532. package/dist/utils/transform-content-types-to-models.js.map +1 -1
  533. package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
  534. package/dist/utils/update-notifier/index.d.ts +2 -2
  535. package/dist/utils/update-notifier/index.d.ts.map +1 -1
  536. package/dist/utils/update-notifier/index.js.map +1 -1
  537. package/dist/utils/update-notifier/index.mjs.map +1 -1
  538. package/package.json +15 -15
  539. package/dist/services/document-service/document-engine.js +0 -241
  540. package/dist/services/document-service/document-engine.js.map +0 -1
  541. package/dist/services/document-service/document-engine.mjs +0 -242
  542. package/dist/services/document-service/document-engine.mjs.map +0 -1
  543. package/dist/services/document-service/middlewares.d.ts.map +0 -1
  544. package/dist/services/document-service/middlewares.js.map +0 -1
  545. package/dist/services/document-service/middlewares.mjs.map +0 -1
  546. package/dist/services/document-service/repositories/content-type.d.ts +0 -3
  547. package/dist/services/document-service/repositories/content-type.d.ts.map +0 -1
  548. package/dist/services/document-service/repositories/content-type.js +0 -139
  549. package/dist/services/document-service/repositories/content-type.js.map +0 -1
  550. package/dist/services/document-service/repositories/content-type.mjs +0 -139
  551. package/dist/services/document-service/repositories/content-type.mjs.map +0 -1
  552. package/dist/services/document-service/transform/filters.d.ts +0 -3
  553. package/dist/services/document-service/transform/filters.d.ts.map +0 -1
  554. package/dist/services/document-service/transform/sort.d.ts +0 -5
  555. package/dist/services/document-service/transform/sort.d.ts.map +0 -1
  556. package/dist/services/document-service/transform/utils.d.ts +0 -9
  557. package/dist/services/document-service/transform/utils.d.ts.map +0 -1
  558. package/dist/services/utils/upload-files.d.ts +0 -8
  559. package/dist/services/utils/upload-files.d.ts.map +0 -1
  560. package/dist/services/utils/upload-files.js +0 -64
  561. package/dist/services/utils/upload-files.js.map +0 -1
  562. package/dist/services/utils/upload-files.mjs +0 -63
  563. package/dist/services/utils/upload-files.mjs.map +0 -1
@@ -1,14 +1,9 @@
1
1
  import _ from "lodash";
2
2
  import delegate from "delegates";
3
3
  import { errors } from "@strapi/database";
4
- import { errors as errors$1, sanitize, contentTypes, relations, convertQueryParams } from "@strapi/utils";
5
- import uploadFile from "../utils/upload-files.mjs";
6
- import { createComponents, omitComponentData, updateComponents, getComponents, deleteComponents, cloneComponents } from "./components.mjs";
7
- import { pickSelectionParams } from "./params.mjs";
8
- import { applyTransforms } from "./attributes/index.mjs";
9
- const { transformParamsToQuery } = convertQueryParams;
4
+ import { errors as errors$1, contentTypes, relations } from "@strapi/utils";
10
5
  const transformLoadParamsToQuery = (uid, field, params, pagination = {}) => {
11
- const query = transformParamsToQuery(uid, { populate: { [field]: params } });
6
+ const query = strapi.get("query-params").transform(uid, { populate: { [field]: params } });
12
7
  const res = {
13
8
  ...query.populate[field],
14
9
  ...pagination
@@ -21,240 +16,82 @@ const databaseErrorsToTransform = [
21
16
  errors.InvalidDateError,
22
17
  errors.InvalidRelationError
23
18
  ];
24
- const creationPipeline = (data, context) => {
25
- return applyTransforms(data, context);
26
- };
27
- const updatePipeline = (data, context) => {
28
- return applyTransforms(data, context);
29
- };
30
- const ALLOWED_WEBHOOK_EVENTS = {
31
- ENTRY_CREATE: "entry.create",
32
- ENTRY_UPDATE: "entry.update",
33
- ENTRY_DELETE: "entry.delete"
34
- };
35
19
  const createDefaultImplementation = ({
36
- strapi,
37
- db,
38
- eventHub,
39
- entityValidator
20
+ strapi: strapi2,
21
+ db
40
22
  }) => ({
41
- /**
42
- * Upload files utility
43
- */
44
- uploadFiles: uploadFile,
45
23
  async wrapParams(options = {}) {
46
24
  return options;
47
25
  },
48
26
  async wrapResult(result = {}) {
49
27
  return result;
50
28
  },
51
- async emitEvent(uid, event, entity) {
52
- if (uid === "admin::audit-log") {
53
- return;
54
- }
55
- const model = strapi.getModel(uid);
56
- const sanitizedEntity = await sanitize.sanitizers.defaultSanitizeOutput(model, entity);
57
- eventHub.emit(event, {
58
- model: model.modelName,
59
- uid: model.uid,
60
- entry: sanitizedEntity
61
- });
62
- },
63
29
  async findMany(uid, opts) {
64
- const { kind } = strapi.getModel(uid);
30
+ const { kind } = strapi2.getModel(uid);
65
31
  const wrappedParams = await this.wrapParams(opts, { uid, action: "findMany" });
66
- const query = transformParamsToQuery(uid, wrappedParams);
67
32
  if (kind === "singleType") {
68
- const entity = db.query(uid).findOne(query);
33
+ const entity = strapi2.documents(uid).findFirst(wrappedParams);
69
34
  return this.wrapResult(entity, { uid, action: "findOne" });
70
35
  }
71
- const entities = await db.query(uid).findMany(query);
36
+ const entities = await strapi2.documents(uid).findMany(wrappedParams);
72
37
  return this.wrapResult(entities, { uid, action: "findMany" });
73
38
  },
74
39
  async findPage(uid, opts) {
75
40
  const wrappedParams = await this.wrapParams(opts, { uid, action: "findPage" });
76
- const query = transformParamsToQuery(uid, wrappedParams);
77
- const page = await db.query(uid).findPage(query);
78
- return {
79
- ...page,
80
- results: await this.wrapResult(page.results, { uid, action: "findPage" })
81
- };
82
- },
83
- // TODO: streamline the logic based on the populate option
84
- async findWithRelationCountsPage(uid, opts) {
85
- const wrappedParams = await this.wrapParams(opts, { uid, action: "findWithRelationCounts" });
86
- const query = transformParamsToQuery(uid, wrappedParams);
41
+ const query = strapi2.get("query-params").transform(uid, wrappedParams);
87
42
  const entities = await db.query(uid).findPage(query);
88
- return {
89
- ...entities,
90
- results: await this.wrapResult(entities.results, { uid, action: "findWithRelationCounts" })
91
- };
92
- },
93
- async findWithRelationCounts(uid, opts) {
94
- const wrappedParams = await this.wrapParams(opts, { uid, action: "findWithRelationCounts" });
95
- const query = transformParamsToQuery(uid, wrappedParams);
96
- const entities = await db.query(uid).findMany(query);
97
- return this.wrapResult(entities, { uid, action: "findWithRelationCounts" });
43
+ return this.wrapResult(entities, { uid, action: "findMany" });
98
44
  },
99
45
  async findOne(uid, entityId, opts) {
100
46
  const wrappedParams = await this.wrapParams(opts, { uid, action: "findOne" });
101
- const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));
102
- const entity = await db.query(uid).findOne({ ...query, where: { id: entityId } });
47
+ const res = await db.query(uid).findOne({ where: { id: entityId } });
48
+ if (!res) {
49
+ return this.wrapResult(null, { uid, action: "findOne" });
50
+ }
51
+ const entity = await strapi2.documents(uid).findOne(res.documentId, wrappedParams);
103
52
  return this.wrapResult(entity, { uid, action: "findOne" });
104
53
  },
105
54
  async count(uid, opts) {
106
55
  const wrappedParams = await this.wrapParams(opts, { uid, action: "count" });
107
- const query = transformParamsToQuery(uid, wrappedParams);
108
- return db.query(uid).count(query);
56
+ return strapi2.documents(uid).count(wrappedParams);
109
57
  },
110
58
  async create(uid, params) {
111
59
  const wrappedParams = await this.wrapParams(params, { uid, action: "create" });
112
- const { data, files } = wrappedParams;
60
+ const { data } = wrappedParams;
113
61
  if (!data) {
114
62
  throw new Error("cannot create");
115
63
  }
116
- const model = strapi.getModel(uid);
117
- const isDraft = contentTypes.isDraft(data);
118
- const validData = await entityValidator.validateEntityCreation(model, data, { isDraft });
119
- const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));
120
- const componentData = await createComponents(uid, validData);
121
- const entityData = creationPipeline(
122
- Object.assign(omitComponentData(model, validData), componentData),
123
- {
124
- contentType: model
125
- }
126
- );
127
- let entity = await db.query(uid).create({
128
- ...query,
129
- data: entityData
64
+ const shouldPublish = !contentTypes.isDraft(data, strapi2.getModel(uid));
65
+ const entity = await strapi2.documents(uid).create({
66
+ ...wrappedParams,
67
+ status: shouldPublish ? "published" : "draft"
130
68
  });
131
- if (files && Object.keys(files).length > 0) {
132
- await this.uploadFiles(uid, Object.assign(entityData, entity), files);
133
- entity = await this.findOne(uid, entity.id, wrappedParams);
134
- }
135
- entity = await this.wrapResult(entity, { uid, action: "create" });
136
- const { ENTRY_CREATE } = ALLOWED_WEBHOOK_EVENTS;
137
- await this.emitEvent(uid, ENTRY_CREATE, entity);
138
- return entity;
69
+ return this.wrapResult(entity, { uid, action: "create" });
139
70
  },
140
71
  async update(uid, entityId, opts) {
141
72
  const wrappedParams = await this.wrapParams(opts, {
142
73
  uid,
143
74
  action: "update"
144
75
  });
145
- const { data, files } = wrappedParams;
146
- const model = strapi.getModel(uid);
147
76
  const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });
148
77
  if (!entityToUpdate) {
149
- return null;
78
+ return this.wrapResult(null, { uid, action: "update" });
150
79
  }
151
- const isDraft = contentTypes.isDraft(entityToUpdate);
152
- const validData = await entityValidator.validateEntityUpdate(
153
- model,
154
- data,
155
- {
156
- isDraft
157
- },
158
- entityToUpdate
159
- );
160
- const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));
161
- const componentData = await updateComponents(uid, entityToUpdate, validData);
162
- const entityData = updatePipeline(
163
- Object.assign(omitComponentData(model, validData), componentData),
164
- { contentType: model }
165
- );
166
- let entity = await db.query(uid).update({
167
- ...query,
168
- where: { id: entityId },
169
- data: entityData
80
+ const shouldPublish = !contentTypes.isDraft(entityToUpdate, strapi2.getModel(uid));
81
+ const entity = strapi2.documents(uid).update(entityToUpdate.documentId, {
82
+ ...wrappedParams,
83
+ status: shouldPublish ? "published" : "draft"
170
84
  });
171
- if (files && Object.keys(files).length > 0) {
172
- await this.uploadFiles(uid, Object.assign(entityData, entity), files);
173
- entity = await this.findOne(uid, entity.id, wrappedParams);
174
- }
175
- entity = await this.wrapResult(entity, { uid, action: "update" });
176
- const { ENTRY_UPDATE } = ALLOWED_WEBHOOK_EVENTS;
177
- await this.emitEvent(uid, ENTRY_UPDATE, entity);
178
- return entity;
85
+ return this.wrapResult(entity, { uid, action: "update" });
179
86
  },
180
87
  async delete(uid, entityId, opts) {
181
88
  const wrappedParams = await this.wrapParams(opts, { uid, action: "delete" });
182
- const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));
183
- let entityToDelete = await db.query(uid).findOne({
184
- ...query,
185
- where: { id: entityId }
186
- });
89
+ const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });
187
90
  if (!entityToDelete) {
188
- return null;
189
- }
190
- const componentsToDelete = await getComponents(uid, entityToDelete);
191
- await db.query(uid).delete({ where: { id: entityToDelete.id } });
192
- await deleteComponents(uid, componentsToDelete, { loadComponents: false });
193
- entityToDelete = await this.wrapResult(entityToDelete, { uid, action: "delete" });
194
- const { ENTRY_DELETE } = ALLOWED_WEBHOOK_EVENTS;
195
- await this.emitEvent(uid, ENTRY_DELETE, entityToDelete);
196
- return entityToDelete;
197
- },
198
- async clone(uid, cloneId, opts) {
199
- const wrappedParams = await this.wrapParams(opts, { uid, action: "clone" });
200
- const { data, files } = wrappedParams;
201
- if (!data) {
202
- throw new Error("cannot clone");
203
- }
204
- const model = strapi.getModel(uid);
205
- const entityToClone = await db.query(uid).findOne({ where: { id: cloneId } });
206
- if (!entityToClone) {
207
- return null;
208
- }
209
- const isDraft = contentTypes.isDraft(entityToClone);
210
- const validData = await entityValidator.validateEntityUpdate(
211
- model,
212
- // Omit the id, the cloned entity id will be generated by the database
213
- _.omit(data, ["id"]),
214
- { isDraft },
215
- entityToClone
216
- );
217
- const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));
218
- const componentData = await cloneComponents(uid, entityToClone, validData);
219
- const entityData = creationPipeline(
220
- Object.assign(omitComponentData(model, validData), componentData),
221
- {
222
- contentType: model
223
- }
224
- );
225
- let entity = await db.query(uid).clone(cloneId, {
226
- ...query,
227
- data: entityData
228
- });
229
- if (files && Object.keys(files).length > 0) {
230
- await this.uploadFiles(uid, Object.assign(entityData, entity), files);
231
- entity = await this.findOne(uid, entity.id, wrappedParams);
91
+ return this.wrapResult(null, { uid, action: "delete" });
232
92
  }
233
- const { ENTRY_CREATE } = ALLOWED_WEBHOOK_EVENTS;
234
- await this.emitEvent(uid, ENTRY_CREATE, entity);
235
- return entity;
236
- },
237
- // FIXME: used only for the CM to be removed
238
- async deleteMany(uid, opts) {
239
- const wrappedParams = await this.wrapParams(opts, { uid, action: "delete" });
240
- const query = transformParamsToQuery(uid, wrappedParams);
241
- let entitiesToDelete = await db.query(uid).findMany(query);
242
- if (!entitiesToDelete.length) {
243
- return { count: 0 };
244
- }
245
- const componentsToDelete = await Promise.all(
246
- entitiesToDelete.map((entityToDelete) => getComponents(uid, entityToDelete))
247
- );
248
- const deletedEntities = await db.query(uid).deleteMany(query);
249
- await Promise.all(
250
- componentsToDelete.map(
251
- (compos) => deleteComponents(uid, compos, { loadComponents: false })
252
- )
253
- );
254
- entitiesToDelete = await this.wrapResult(entitiesToDelete, { uid, action: "delete" });
255
- const { ENTRY_DELETE } = ALLOWED_WEBHOOK_EVENTS;
256
- await Promise.all(entitiesToDelete.map((entity) => this.emitEvent(uid, ENTRY_DELETE, entity)));
257
- return deletedEntities;
93
+ await strapi2.documents(uid).delete(entityToDelete.documentId, wrappedParams);
94
+ return this.wrapResult(entityToDelete, { uid, action: "delete" });
258
95
  },
259
96
  async load(uid, entity, field, params) {
260
97
  if (!_.isString(field)) {
@@ -267,7 +104,7 @@ const createDefaultImplementation = ({
267
104
  if (!_.isString(field)) {
268
105
  throw new Error(`Invalid load. Expected "${field}" to be a string`);
269
106
  }
270
- const { attributes } = strapi.getModel(uid);
107
+ const { attributes } = strapi2.getModel(uid);
271
108
  const attribute = attributes[field];
272
109
  if (!relations.isAnyToMany(attribute)) {
273
110
  throw new Error(`Invalid load. Expected "${field}" to be an anyToMany relational attribute`);
@@ -281,9 +118,6 @@ const createDefaultImplementation = ({
281
118
  }
282
119
  });
283
120
  const createEntityService = (ctx) => {
284
- Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
285
- ctx.strapi.webhookStore?.addAllowedEvent(key, value);
286
- });
287
121
  const implementation = createDefaultImplementation(ctx);
288
122
  const service = {
289
123
  implementation,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n sanitize,\n errors,\n relations as relationUtils,\n convertQueryParams,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type {\n Strapi,\n EntityService,\n EntityValidator,\n EventHub,\n Common,\n Schema,\n Shared,\n Utils,\n} from '@strapi/types';\n\nimport uploadFiles from '../utils/upload-files';\n\nimport {\n omitComponentData,\n getComponents,\n createComponents,\n updateComponents,\n deleteComponents,\n cloneComponents,\n} from './components';\n\nimport { pickSelectionParams } from './params';\nimport { applyTransforms } from './attributes';\n\nconst { transformParamsToQuery } = convertQueryParams;\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: EntityService.EntityService) => EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\ntype Context = {\n contentType: Schema.ContentType;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = transformParamsToQuery(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst creationPipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst updatePipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst ALLOWED_WEBHOOK_EVENTS = {\n ENTRY_CREATE: 'entry.create',\n ENTRY_UPDATE: 'entry.update',\n ENTRY_DELETE: 'entry.delete',\n};\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n eventHub,\n entityValidator,\n}: {\n strapi: Strapi;\n db: Database;\n eventHub: EventHub;\n entityValidator: EntityValidator;\n}): EntityService.EntityService => ({\n /**\n * Upload files utility\n */\n uploadFiles,\n\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async emitEvent(uid, event: string, entity) {\n // Ignore audit log events to prevent infinite loops\n if (uid === ('admin::audit-log' as Common.UID.ContentType)) {\n return;\n }\n\n const model = strapi.getModel(uid);\n const sanitizedEntity = await sanitize.sanitizers.defaultSanitizeOutput(model, entity);\n\n eventHub.emit(event, {\n model: model.modelName,\n uid: model.uid,\n entry: sanitizedEntity,\n });\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n if (kind === 'singleType') {\n const entity = db.query(uid).findOne(query);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await db.query(uid).findMany(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n const page = await db.query(uid).findPage(query);\n return {\n ...page,\n results: await this.wrapResult(page.results, { uid, action: 'findPage' }),\n };\n },\n\n // TODO: streamline the logic based on the populate option\n async findWithRelationCountsPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findWithRelationCounts' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return {\n ...entities,\n results: await this.wrapResult(entities.results, { uid, action: 'findWithRelationCounts' }),\n };\n },\n\n async findWithRelationCounts(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findWithRelationCounts' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n const entities = await db.query(uid).findMany(query);\n return this.wrapResult(entities, { uid, action: 'findWithRelationCounts' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n const entity = await db.query(uid).findOne({ ...query, where: { id: entityId } });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n return db.query(uid).count(query);\n },\n\n async create<\n TUID extends Common.UID.ContentType,\n TParams extends EntityService.Params.Pick<TUID, 'data' | 'files' | 'fields' | 'populate'>\n >(uid: TUID, params?: TParams) {\n const wrappedParams = await this.wrapParams<TParams>(params, { uid, action: 'create' });\n const { data, files } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const model = strapi.getModel(uid) as Shared.ContentTypes[Common.UID.ContentType];\n\n const isDraft = contentTypesUtils.isDraft(data);\n const validData = await entityValidator.validateEntityCreation(model, data, { isDraft });\n\n // select / populate\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n // TODO: wrap into transaction\n const componentData = await createComponents(uid, validData);\n\n const entityData = creationPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n {\n contentType: model,\n }\n );\n let entity = await db.query(uid).create({\n ...query,\n data: entityData,\n });\n\n // TODO: do all of this in a transaction to avoid a race condition where entity is created then deleted before we do findOne again\n // TODO: upload the files then set the links in the entity like with compo to avoid making too many queries\n if (files && Object.keys(files).length > 0) {\n await this.uploadFiles(uid, Object.assign(entityData, entity), files);\n entity = await this.findOne(uid, entity.id, wrappedParams);\n }\n\n entity = await this.wrapResult(entity, { uid, action: 'create' });\n\n const { ENTRY_CREATE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_CREATE, entity);\n\n return entity;\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n EntityService.Params.Pick<typeof uid, 'data:partial' | 'files' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const { data, files } = wrappedParams;\n\n const model = strapi.getModel(uid);\n\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return null;\n }\n\n const isDraft = contentTypesUtils.isDraft(entityToUpdate);\n\n const validData = await entityValidator.validateEntityUpdate(\n model,\n data,\n {\n isDraft,\n },\n entityToUpdate\n );\n\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n // TODO: wrap in transaction\n const componentData = await updateComponents(uid, entityToUpdate, validData);\n const entityData = updatePipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n { contentType: model }\n );\n\n let entity = await db.query(uid).update({\n ...query,\n where: { id: entityId },\n data: entityData,\n });\n\n // TODO: upload the files then set the links in the entity like with compo to avoid making too many queries\n if (files && Object.keys(files).length > 0) {\n await this.uploadFiles(uid, Object.assign(entityData, entity), files);\n entity = await this.findOne(uid, entity.id, wrappedParams);\n }\n\n entity = await this.wrapResult(entity, { uid, action: 'update' });\n\n const { ENTRY_UPDATE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_UPDATE, entity);\n\n return entity;\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n // select / populate\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n let entityToDelete = await db.query(uid).findOne({\n ...query,\n where: { id: entityId },\n });\n\n if (!entityToDelete) {\n return null;\n }\n\n const componentsToDelete = await getComponents(uid, entityToDelete);\n\n await db.query(uid).delete({ where: { id: entityToDelete.id } });\n await deleteComponents(uid, componentsToDelete as any, { loadComponents: false });\n\n entityToDelete = await this.wrapResult(entityToDelete, { uid, action: 'delete' });\n\n const { ENTRY_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_DELETE, entityToDelete);\n\n return entityToDelete;\n },\n\n async clone(uid, cloneId, opts) {\n const wrappedParams = await this.wrapParams<\n EntityService.Params.Pick<typeof uid, 'data' | 'files' | 'fields' | 'populate'>\n >(opts, { uid, action: 'clone' });\n const { data, files } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot clone');\n }\n\n const model = strapi.getModel(uid);\n\n const entityToClone = await db.query(uid).findOne({ where: { id: cloneId } });\n\n if (!entityToClone) {\n return null;\n }\n const isDraft = contentTypesUtils.isDraft(entityToClone);\n\n const validData = await entityValidator.validateEntityUpdate(\n model,\n // Omit the id, the cloned entity id will be generated by the database\n _.omit(data, ['id']) as Partial<typeof data>,\n { isDraft },\n entityToClone\n );\n\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n // TODO: wrap into transaction\n const componentData = await cloneComponents(uid, entityToClone, validData);\n\n const entityData = creationPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n {\n contentType: model,\n }\n );\n\n let entity = await db.query(uid).clone(cloneId, {\n ...query,\n data: entityData,\n });\n\n // TODO: upload the files then set the links in the entity like with compo to avoid making too many queries\n if (files && Object.keys(files).length > 0) {\n await this.uploadFiles(uid, Object.assign(entityData, entity), files);\n entity = await this.findOne(uid, entity.id, wrappedParams);\n }\n\n const { ENTRY_CREATE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_CREATE, entity);\n\n return entity;\n },\n // FIXME: used only for the CM to be removed\n async deleteMany(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n // select / populate\n const query = transformParamsToQuery(uid, wrappedParams);\n\n let entitiesToDelete = await db.query(uid).findMany(query);\n\n if (!entitiesToDelete.length) {\n return { count: 0 };\n }\n\n const componentsToDelete = await Promise.all(\n entitiesToDelete.map((entityToDelete) => getComponents(uid, entityToDelete))\n );\n\n const deletedEntities = await db.query(uid).deleteMany(query);\n await Promise.all(\n componentsToDelete.map((compos) =>\n deleteComponents(uid, compos as any, { loadComponents: false })\n )\n );\n\n entitiesToDelete = await this.wrapResult(entitiesToDelete, { uid, action: 'delete' });\n\n // Trigger webhooks. One for each entity\n const { ENTRY_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n await Promise.all(entitiesToDelete.map((entity) => this.emitEvent(uid, ENTRY_DELETE, entity)));\n\n return deletedEntities;\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Strapi;\n db: Database;\n eventHub: EventHub;\n entityValidator: EntityValidator;\n}): Decoratable<EntityService.EntityService> => {\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n ctx.strapi.webhookStore?.addAllowedEvent(key, value);\n });\n\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof EntityService.EntityService) =>\n async function (this: EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<EntityService.EntityService>;\n};\n"],"names":["databaseErrors","uploadFiles","contentTypesUtils","relationUtils","errors"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n errors,\n relations as relationUtils,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type { Core, Modules, Utils } from '@strapi/types';\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: Modules.EntityService.EntityService) => Modules.EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = strapi\n .get('query-params')\n .transform(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n}: {\n strapi: Core.Strapi;\n db: Database;\n}): Modules.EntityService.EntityService => ({\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n if (kind === 'singleType') {\n const entity = strapi.documents!(uid).findFirst(wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await strapi.documents!(uid).findMany(wrappedParams);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const res = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!res) {\n return this.wrapResult(null, { uid, action: 'findOne' });\n }\n\n const entity = await strapi.documents!(uid).findOne(res.documentId, wrappedParams);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n return strapi.documents!(uid).count(wrappedParams);\n },\n\n async create(uid, params) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data' | 'fields' | 'populate'>\n >(params, { uid, action: 'create' });\n const { data } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(data, strapi.getModel(uid));\n\n const entity = await strapi.documents!(uid).create({\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'create' });\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n Modules.EntityService.Params.Pick<typeof uid, 'data:partial' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return this.wrapResult(null, { uid, action: 'update' });\n }\n\n const shouldPublish = !contentTypesUtils.isDraft(entityToUpdate, strapi.getModel(uid));\n\n const entity = strapi.documents!(uid).update(entityToUpdate.documentId, {\n ...(wrappedParams as any),\n status: shouldPublish ? 'published' : 'draft',\n });\n\n return this.wrapResult(entity, { uid, action: 'update' });\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n const entityToDelete = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToDelete) {\n return this.wrapResult(null, { uid, action: 'delete' });\n }\n\n await strapi.documents!(uid).delete(entityToDelete.documentId, wrappedParams);\n\n return this.wrapResult(entityToDelete, { uid, action: 'delete' });\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Core.Strapi;\n db: Database;\n}): Decoratable<Modules.EntityService.EntityService> => {\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: Modules.EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof Modules.EntityService.EntityService) =>\n async function (this: Modules.EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<Modules.EntityService.EntityService>;\n};\n"],"names":["databaseErrors","strapi","contentTypesUtils","relationUtils","errors"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import type { Common, EntityService } from '@strapi/types';
2
- declare const pickSelectionParams: <TUID extends Common.UID.ContentType>(data: unknown) => {
3
- fields?: EntityService.Params.Fields.Any<TUID> | undefined;
1
+ import type { UID, Modules } from '@strapi/types';
2
+ declare const pickSelectionParams: <TUID extends UID.ContentType>(data: unknown) => {
3
+ fields?: Modules.Documents.Params.Fields.Any<TUID> | undefined;
4
4
  } & {
5
- populate?: EntityService.Params.Populate.Any<TUID> | undefined;
6
- };
5
+ populate?: Modules.Documents.Params.Populate.Any<TUID> | undefined;
6
+ } & Modules.Documents.Params.PublicationStatus.Param;
7
7
  export { pickSelectionParams };
8
8
  //# sourceMappingURL=params.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/services/entity-service/params.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE3D,QAAA,MAAM,mBAAmB,8CACjB,OAAO;;;;CAGd,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/services/entity-service/params.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAElD,QAAA,MAAM,mBAAmB,uCACjB,OAAO;;;;oDAGd,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const _ = require("lodash/fp");
4
4
  const pickSelectionParams = (data) => {
5
- return _.pick(["fields", "populate"], data);
5
+ return _.pick(["fields", "populate", "status"], data);
6
6
  };
7
7
  exports.pickSelectionParams = pickSelectionParams;
8
8
  //# sourceMappingURL=params.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"params.js","sources":["../../../src/services/entity-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { Common, EntityService } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends Common.UID.ContentType>(\n data: unknown\n): EntityService.Params.Pick<TUID, 'fields' | 'populate'> => {\n return pick(['fields', 'populate'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":["pick"],"mappings":";;;AAGM,MAAA,sBAAsB,CAC1B,SAC2D;AAC3D,SAAOA,EAAK,KAAA,CAAC,UAAU,UAAU,GAAG,IAAI;AAC1C;;"}
1
+ {"version":3,"file":"params.js","sources":["../../../src/services/entity-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { UID, Modules } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends UID.ContentType>(\n data: unknown\n): Modules.Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'> => {\n return pick(['fields', 'populate', 'status'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":["pick"],"mappings":";;;AAGM,MAAA,sBAAsB,CAC1B,SAC0E;AAC1E,SAAOA,EAAAA,KAAK,CAAC,UAAU,YAAY,QAAQ,GAAG,IAAI;AACpD;;"}
@@ -1,6 +1,6 @@
1
1
  import { pick } from "lodash/fp";
2
2
  const pickSelectionParams = (data) => {
3
- return pick(["fields", "populate"], data);
3
+ return pick(["fields", "populate", "status"], data);
4
4
  };
5
5
  export {
6
6
  pickSelectionParams
@@ -1 +1 @@
1
- {"version":3,"file":"params.mjs","sources":["../../../src/services/entity-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { Common, EntityService } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends Common.UID.ContentType>(\n data: unknown\n): EntityService.Params.Pick<TUID, 'fields' | 'populate'> => {\n return pick(['fields', 'populate'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":[],"mappings":";AAGM,MAAA,sBAAsB,CAC1B,SAC2D;AAC3D,SAAO,KAAK,CAAC,UAAU,UAAU,GAAG,IAAI;AAC1C;"}
1
+ {"version":3,"file":"params.mjs","sources":["../../../src/services/entity-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { UID, Modules } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends UID.ContentType>(\n data: unknown\n): Modules.Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'> => {\n return pick(['fields', 'populate', 'status'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":[],"mappings":";AAGM,MAAA,sBAAsB,CAC1B,SAC0E;AAC1E,SAAO,KAAK,CAAC,UAAU,YAAY,QAAQ,GAAG,IAAI;AACpD;"}
@@ -2,7 +2,7 @@
2
2
  * Entity validator
3
3
  * Module that will validate input data for entity creation or edition
4
4
  */
5
- import { EntityValidator } from '@strapi/types';
6
- declare const entityValidator: EntityValidator;
5
+ import { Modules } from '@strapi/types';
6
+ declare const entityValidator: Modules.EntityValidator.EntityValidator;
7
7
  export default entityValidator;
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,eAAe,EAAoD,MAAM,eAAe,CAAC;AAwelG,QAAA,MAAM,eAAe,EAAE,eAGtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,OAAO,EAAuB,MAAM,eAAe,CAAC;AA6e7D,QAAA,MAAM,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,eAG9C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -9,7 +9,10 @@ const { yup, validateYupSchema } = strapiUtils__default.default;
9
9
  const { isMediaAttribute, isScalarAttribute, getWritableAttributes } = strapiUtils__default.default.contentTypes;
10
10
  const { ValidationError } = strapiUtils__default.default.errors;
11
11
  const isInteger = (value) => Number.isInteger(value);
12
- const addMinMax = (validator, { attr, updatedAttribute }) => {
12
+ const addMinMax = (validator, {
13
+ attr,
14
+ updatedAttribute
15
+ }) => {
13
16
  let nextValidator = validator;
14
17
  if (isInteger(attr.min) && ("required" in attr && attr.required || Array.isArray(updatedAttribute.value) && updatedAttribute.value.length > 0)) {
15
18
  nextValidator = nextValidator.min(attr.min);
@@ -20,7 +23,9 @@ const addMinMax = (validator, { attr, updatedAttribute }) => {
20
23
  return nextValidator;
21
24
  };
22
25
  const addRequiredValidation = (createOrUpdate) => {
23
- return (validator, { attr: { required } }) => {
26
+ return (validator, {
27
+ attr: { required }
28
+ }) => {
24
29
  let nextValidator = validator;
25
30
  if (required) {
26
31
  if (createOrUpdate === "creation") {
@@ -297,7 +302,7 @@ const checkRelationsExist = async (relationsStore = {}) => {
297
302
  for (const [key, value] of Object.entries(relationsStore)) {
298
303
  const evaluate = async () => {
299
304
  const uniqueValues = _$1.uniqBy(value, `id`);
300
- const count = await strapi.query(key).count({
305
+ const count = await strapi.db.query(key).count({
301
306
  where: {
302
307
  id: {
303
308
  $in: uniqueValues.map((v) => v.id)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/entity-validator/index.ts"],"sourcesContent":["/**\n * Entity validator\n * Module that will validate input data for entity creation or edition\n */\n\nimport { uniqBy, castArray, isNil, isArray, mergeWith } from 'lodash';\nimport { has, prop, isObject, isEmpty } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport { EntityValidator, Common, Schema, Attribute, Shared, EntityService } from '@strapi/types';\nimport validators from './validators';\n\ntype CreateOrUpdate = 'creation' | 'update';\n\nconst { yup, validateYupSchema } = strapiUtils;\nconst { isMediaAttribute, isScalarAttribute, getWritableAttributes } = strapiUtils.contentTypes;\nconst { ValidationError } = strapiUtils.errors;\n\ntype Entity = {\n id: ID;\n [key: string]: unknown;\n} | null;\n\ntype ID = { id: string | number };\n\ntype RelationSource = string | number | ID;\n\ninterface ValidatorMeta<TAttribute = Attribute.Any> {\n attr: TAttribute;\n updatedAttribute: { name: string; value: any };\n}\n\ninterface ValidatorContext {\n isDraft?: boolean;\n locale?: string | null;\n}\n\ninterface AttributeValidatorMetas {\n attr: Attribute.Any;\n updatedAttribute: { name: string; value: unknown };\n model: Schema.ContentType | Schema.Component;\n entity?: Entity;\n}\n\ninterface ModelValidatorMetas {\n model: Schema.ContentType | Schema.Component;\n data: Record<string, unknown>;\n entity?: Entity;\n}\n\nconst isInteger = (value: unknown): value is number => Number.isInteger(value);\n\nconst addMinMax = <\n T extends {\n min(value: number): T;\n max(value: number): T;\n }\n>(\n validator: T,\n { attr, updatedAttribute }: ValidatorMeta<Attribute.Any & Attribute.MinMaxOption<string | number>>\n): T => {\n let nextValidator: T = validator;\n\n if (\n isInteger(attr.min) &&\n (('required' in attr && attr.required) ||\n (Array.isArray(updatedAttribute.value) && updatedAttribute.value.length > 0))\n ) {\n nextValidator = nextValidator.min(attr.min);\n }\n if (isInteger(attr.max)) {\n nextValidator = nextValidator.max(attr.max);\n }\n return nextValidator;\n};\n\nconst addRequiredValidation = (createOrUpdate: CreateOrUpdate) => {\n return <T extends strapiUtils.yup.AnySchema>(\n validator: T,\n { attr: { required } }: ValidatorMeta<Partial<Attribute.Any & Attribute.RequiredOption>>\n ): T => {\n let nextValidator = validator;\n\n if (required) {\n if (createOrUpdate === 'creation') {\n nextValidator = nextValidator.notNil();\n } else if (createOrUpdate === 'update') {\n nextValidator = nextValidator.notNull();\n }\n } else {\n nextValidator = nextValidator.nullable();\n }\n return nextValidator;\n };\n};\n\nconst addDefault = (createOrUpdate: CreateOrUpdate) => {\n return (\n validator: strapiUtils.yup.BaseSchema,\n { attr }: ValidatorMeta<Attribute.Any & Attribute.DefaultOption<unknown>>\n ) => {\n let nextValidator = validator;\n\n if (createOrUpdate === 'creation') {\n if (\n ((attr.type === 'component' && attr.repeatable) || attr.type === 'dynamiczone') &&\n !attr.required\n ) {\n nextValidator = nextValidator.default([]);\n } else {\n nextValidator = nextValidator.default(attr.default);\n }\n } else {\n nextValidator = nextValidator.default(undefined);\n }\n\n return nextValidator;\n };\n};\n\nconst preventCast = (validator: strapiUtils.yup.AnySchema) =>\n validator.transform((val, originalVal) => originalVal);\n\nconst createComponentValidator =\n (createOrUpdate: CreateOrUpdate) =>\n (\n { attr, updatedAttribute }: ValidatorMeta<Attribute.Component<Common.UID.Component, boolean>>,\n { isDraft }: ValidatorContext\n ) => {\n const model = strapi.getModel(attr.component);\n if (!model) {\n throw new Error('Validation failed: Model not found');\n }\n\n if (attr?.repeatable) {\n // FIXME: yup v1\n\n let validator = yup\n .array()\n .of(\n yup.lazy((item) =>\n createModelValidator(createOrUpdate)({ model, data: item }, { isDraft }).notNull()\n ) as any\n );\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: true },\n updatedAttribute,\n });\n\n validator = addMinMax(validator, { attr, updatedAttribute });\n\n return validator;\n }\n\n // FIXME: v4 was broken\n let validator = createModelValidator(createOrUpdate)(\n { model, data: updatedAttribute.value },\n { isDraft }\n );\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: !isDraft && attr.required },\n updatedAttribute,\n });\n\n return validator;\n };\n\nconst createDzValidator =\n (createOrUpdate: CreateOrUpdate) =>\n ({ attr, updatedAttribute }: ValidatorMeta, { isDraft }: ValidatorContext) => {\n let validator;\n\n validator = yup.array().of(\n yup.lazy((item) => {\n const model = strapi.getModel(prop('__component', item));\n const schema = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(strapi.components)),\n })\n .notNull();\n\n return model\n ? schema.concat(createModelValidator(createOrUpdate)({ model, data: item }, { isDraft }))\n : schema;\n }) as any // FIXME: yup v1\n );\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: true },\n updatedAttribute,\n });\n\n validator = addMinMax(validator, { attr, updatedAttribute });\n\n return validator;\n };\n\nconst createRelationValidator =\n (createOrUpdate: CreateOrUpdate) =>\n (\n { attr, updatedAttribute }: ValidatorMeta<Attribute.Relation>,\n { isDraft }: ValidatorContext\n ) => {\n let validator;\n\n if (Array.isArray(updatedAttribute.value)) {\n validator = yup.array().of(yup.mixed());\n } else {\n validator = yup.mixed();\n }\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: !isDraft && attr.required },\n updatedAttribute,\n });\n\n return validator;\n };\n\nconst createScalarAttributeValidator =\n (createOrUpdate: CreateOrUpdate) => (metas: ValidatorMeta, options: ValidatorContext) => {\n let validator;\n\n if (has(metas.attr.type, validators)) {\n validator = (validators as any)[metas.attr.type](metas, options);\n } else {\n // No validators specified - fall back to mixed\n validator = yup.mixed();\n }\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: !options.isDraft && metas.attr.required },\n updatedAttribute: metas.updatedAttribute,\n });\n\n return validator;\n };\n\nconst createAttributeValidator =\n (createOrUpdate: CreateOrUpdate) =>\n (metas: AttributeValidatorMetas, options: ValidatorContext) => {\n let validator = yup.mixed();\n\n if (isMediaAttribute(metas.attr)) {\n validator = yup.mixed();\n } else if (isScalarAttribute(metas.attr)) {\n validator = createScalarAttributeValidator(createOrUpdate)(metas, options);\n } else {\n if (metas.attr.type === 'component') {\n validator = createComponentValidator(createOrUpdate)(\n { attr: metas.attr, updatedAttribute: metas.updatedAttribute },\n options\n );\n } else if (metas.attr.type === 'dynamiczone') {\n validator = createDzValidator(createOrUpdate)(metas, options);\n } else if (metas.attr.type === 'relation') {\n validator = createRelationValidator(createOrUpdate)(\n {\n attr: metas.attr,\n updatedAttribute: metas.updatedAttribute,\n },\n options\n );\n }\n\n validator = preventCast(validator);\n }\n\n validator = addDefault(createOrUpdate)(validator, metas);\n\n return validator;\n };\n\nconst createModelValidator =\n (createOrUpdate: CreateOrUpdate) =>\n ({ model, data, entity }: ModelValidatorMetas, options: ValidatorContext) => {\n const writableAttributes = model ? getWritableAttributes(model as any) : [];\n\n const schema = writableAttributes.reduce((validators, attributeName) => {\n const metas = {\n attr: model.attributes[attributeName],\n updatedAttribute: { name: attributeName, value: prop(attributeName, data) },\n model,\n entity,\n };\n\n const validator = createAttributeValidator(createOrUpdate)(metas, options);\n\n validators[attributeName] = validator;\n\n return validators;\n }, {} as Record<string, strapiUtils.yup.BaseSchema>);\n\n return yup.object().shape(schema);\n };\n\nconst createValidateEntity = (createOrUpdate: CreateOrUpdate) => {\n return async <\n TUID extends Common.UID.ContentType,\n TData extends EntityService.Params.Data.Input<TUID>\n >(\n model: Shared.ContentTypes[TUID],\n data: TData | Partial<TData> | undefined,\n options?: ValidatorContext,\n entity?: Entity\n ): Promise<TData> => {\n if (!isObject(data)) {\n const { displayName } = model.info;\n\n throw new ValidationError(\n `Invalid payload submitted for the ${createOrUpdate} of an entity of type ${displayName}. Expected an object, but got ${typeof data}`\n );\n }\n\n const validator = createModelValidator(createOrUpdate)(\n { model, data, entity },\n {\n isDraft: options?.isDraft ?? false,\n locale: options?.locale ?? null,\n }\n )\n .test('relations-test', 'check that all relations exist', async function (data) {\n try {\n await checkRelationsExist(buildRelationsStore({ uid: model.uid, data }));\n } catch (e) {\n return this.createError({\n path: this.path,\n message: (e instanceof ValidationError && e.message) || 'Invalid relations',\n });\n }\n return true;\n })\n .required();\n\n return validateYupSchema(validator, {\n strict: false,\n abortEarly: false,\n })(data);\n };\n};\n\n/**\n * Builds an object containing all the media and relations being associated with an entity\n */\nconst buildRelationsStore = <TUID extends Common.UID.ContentType | Common.UID.Component>({\n uid,\n data,\n}: {\n uid: TUID;\n data: Record<string, unknown> | null;\n}): Record<string, ID[]> => {\n if (!uid) {\n throw new ValidationError(`Cannot build relations store: \"uid\" is undefined`);\n }\n\n if (isEmpty(data)) {\n return {};\n }\n\n const currentModel = strapi.getModel(uid);\n\n return Object.keys(currentModel.attributes).reduce((result, attributeName: string) => {\n const attribute = currentModel.attributes[attributeName];\n const value = data[attributeName];\n\n if (isNil(value)) {\n return result;\n }\n\n switch (attribute.type) {\n case 'relation':\n case 'media': {\n if (\n attribute.type === 'relation' &&\n (attribute.relation === 'morphToMany' || attribute.relation === 'morphToOne')\n ) {\n // TODO: handle polymorphic relations\n break;\n }\n\n const target =\n // eslint-disable-next-line no-nested-ternary\n attribute.type === 'media' ? 'plugin::upload.file' : attribute.target;\n // As there are multiple formats supported for associating relations\n // with an entity, the value here can be an: array, object or number.\n let source: RelationSource[];\n if (Array.isArray(value)) {\n source = value;\n } else if (isObject(value)) {\n if ('connect' in value && !isNil(value.connect)) {\n source = value.connect as RelationSource[];\n } else if ('set' in value && !isNil(value.set)) {\n source = value.set as RelationSource[];\n } else {\n source = [];\n }\n } else {\n source = castArray(value as RelationSource);\n }\n const idArray = source.map((v) => ({\n id: typeof v === 'object' ? v.id : v,\n }));\n\n // Update the relationStore to keep track of all associations being made\n // with relations and media.\n result[target] = result[target] || [];\n result[target].push(...idArray);\n break;\n }\n case 'component': {\n return castArray(value).reduce((relationsStore, componentValue) => {\n if (!attribute.component) {\n throw new ValidationError(\n `Cannot build relations store from component, component identifier is undefined`\n );\n }\n\n return mergeWith(\n relationsStore,\n buildRelationsStore({\n uid: attribute.component,\n data: componentValue as Record<string, unknown>,\n }),\n (objValue, srcValue) => {\n if (isArray(objValue)) {\n return objValue.concat(srcValue);\n }\n }\n );\n }, result) as Record<string, ID[]>;\n }\n case 'dynamiczone': {\n return castArray(value).reduce((relationsStore, dzValue) => {\n const value = dzValue as Record<string, unknown>;\n if (!value.__component) {\n throw new ValidationError(\n `Cannot build relations store from dynamiczone, component identifier is undefined`\n );\n }\n\n return mergeWith(\n relationsStore,\n buildRelationsStore({\n uid: value.__component as Common.UID.Component,\n data: value,\n }),\n (objValue, srcValue) => {\n if (isArray(objValue)) {\n return objValue.concat(srcValue);\n }\n }\n );\n }, result) as Record<string, ID[]>;\n }\n default:\n break;\n }\n\n return result;\n }, {} as Record<string, ID[]>);\n};\n\n/**\n * Iterate through the relations store and validates that every relation or media\n * mentioned exists\n */\nconst checkRelationsExist = async (relationsStore: Record<string, ID[]> = {}) => {\n const promises = [];\n\n for (const [key, value] of Object.entries(relationsStore)) {\n const evaluate = async () => {\n const uniqueValues = uniqBy(value, `id`);\n const count = await strapi.query(key as Common.UID.Schema).count({\n where: {\n id: {\n $in: uniqueValues.map((v) => v.id),\n },\n },\n });\n\n if (count !== uniqueValues.length) {\n throw new ValidationError(\n `${\n uniqueValues.length - count\n } relation(s) of type ${key} associated with this entity do not exist`\n );\n }\n };\n promises.push(evaluate());\n }\n\n return Promise.all(promises);\n};\n\nconst entityValidator: EntityValidator = {\n validateEntityCreation: createValidateEntity('creation'),\n validateEntityUpdate: createValidateEntity('update'),\n};\n\nexport default entityValidator;\n"],"names":["strapiUtils","validator","prop","has","validators","isObject","data","isEmpty","isNil","castArray","mergeWith","isArray","value","uniqBy"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/entity-validator/index.ts"],"sourcesContent":["/**\n * Entity validator\n * Module that will validate input data for entity creation or edition\n */\n\nimport { uniqBy, castArray, isNil, isArray, mergeWith } from 'lodash';\nimport { has, prop, isObject, isEmpty } from 'lodash/fp';\nimport strapiUtils from '@strapi/utils';\nimport { Modules, UID, Struct, Schema } from '@strapi/types';\nimport validators from './validators';\n\ntype CreateOrUpdate = 'creation' | 'update';\n\nconst { yup, validateYupSchema } = strapiUtils;\nconst { isMediaAttribute, isScalarAttribute, getWritableAttributes } = strapiUtils.contentTypes;\nconst { ValidationError } = strapiUtils.errors;\n\ntype Entity = {\n id: ID;\n [key: string]: unknown;\n} | null;\n\ntype ID = { id: string | number };\n\ntype RelationSource = string | number | ID;\n\ninterface ValidatorMeta<TAttribute = Schema.Attribute.AnyAttribute> {\n attr: TAttribute;\n updatedAttribute: { name: string; value: any };\n}\n\ninterface ValidatorContext {\n isDraft?: boolean;\n locale?: string | null;\n}\n\ninterface AttributeValidatorMetas {\n attr: Schema.Attribute.AnyAttribute;\n updatedAttribute: { name: string; value: unknown };\n model: Struct.Schema;\n entity?: Entity;\n}\n\ninterface ModelValidatorMetas {\n model: Struct.Schema;\n data: Record<string, unknown>;\n entity?: Entity;\n}\n\nconst isInteger = (value: unknown): value is number => Number.isInteger(value);\n\nconst addMinMax = <\n T extends {\n min(value: number): T;\n max(value: number): T;\n }\n>(\n validator: T,\n {\n attr,\n updatedAttribute,\n }: ValidatorMeta<Schema.Attribute.AnyAttribute & Schema.Attribute.MinMaxOption<string | number>>\n): T => {\n let nextValidator: T = validator;\n\n if (\n isInteger(attr.min) &&\n (('required' in attr && attr.required) ||\n (Array.isArray(updatedAttribute.value) && updatedAttribute.value.length > 0))\n ) {\n nextValidator = nextValidator.min(attr.min);\n }\n if (isInteger(attr.max)) {\n nextValidator = nextValidator.max(attr.max);\n }\n return nextValidator;\n};\n\nconst addRequiredValidation = (createOrUpdate: CreateOrUpdate) => {\n return <T extends strapiUtils.yup.AnySchema>(\n validator: T,\n {\n attr: { required },\n }: ValidatorMeta<Partial<Schema.Attribute.AnyAttribute & Schema.Attribute.RequiredOption>>\n ): T => {\n let nextValidator = validator;\n\n if (required) {\n if (createOrUpdate === 'creation') {\n nextValidator = nextValidator.notNil();\n } else if (createOrUpdate === 'update') {\n nextValidator = nextValidator.notNull();\n }\n } else {\n nextValidator = nextValidator.nullable();\n }\n return nextValidator;\n };\n};\n\nconst addDefault = (createOrUpdate: CreateOrUpdate) => {\n return (\n validator: strapiUtils.yup.BaseSchema,\n { attr }: ValidatorMeta<Schema.Attribute.AnyAttribute & Schema.Attribute.DefaultOption<unknown>>\n ) => {\n let nextValidator = validator;\n\n if (createOrUpdate === 'creation') {\n if (\n ((attr.type === 'component' && attr.repeatable) || attr.type === 'dynamiczone') &&\n !attr.required\n ) {\n nextValidator = nextValidator.default([]);\n } else {\n nextValidator = nextValidator.default(attr.default);\n }\n } else {\n nextValidator = nextValidator.default(undefined);\n }\n\n return nextValidator;\n };\n};\n\nconst preventCast = (validator: strapiUtils.yup.AnySchema) =>\n validator.transform((val, originalVal) => originalVal);\n\nconst createComponentValidator =\n (createOrUpdate: CreateOrUpdate) =>\n (\n { attr, updatedAttribute }: ValidatorMeta<Schema.Attribute.Component<UID.Component, boolean>>,\n { isDraft }: ValidatorContext\n ) => {\n const model = strapi.getModel(attr.component);\n if (!model) {\n throw new Error('Validation failed: Model not found');\n }\n\n if (attr?.repeatable) {\n // FIXME: yup v1\n\n let validator = yup\n .array()\n .of(\n yup.lazy((item) =>\n createModelValidator(createOrUpdate)({ model, data: item }, { isDraft }).notNull()\n ) as any\n );\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: true },\n updatedAttribute,\n });\n\n validator = addMinMax(validator, { attr, updatedAttribute });\n\n return validator;\n }\n\n // FIXME: v4 was broken\n let validator = createModelValidator(createOrUpdate)(\n { model, data: updatedAttribute.value },\n { isDraft }\n );\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: !isDraft && attr.required },\n updatedAttribute,\n });\n\n return validator;\n };\n\nconst createDzValidator =\n (createOrUpdate: CreateOrUpdate) =>\n ({ attr, updatedAttribute }: ValidatorMeta, { isDraft }: ValidatorContext) => {\n let validator;\n\n validator = yup.array().of(\n yup.lazy((item) => {\n const model = strapi.getModel(prop('__component', item));\n const schema = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(strapi.components)),\n })\n .notNull();\n\n return model\n ? schema.concat(createModelValidator(createOrUpdate)({ model, data: item }, { isDraft }))\n : schema;\n }) as any // FIXME: yup v1\n );\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: true },\n updatedAttribute,\n });\n\n validator = addMinMax(validator, { attr, updatedAttribute });\n\n return validator;\n };\n\nconst createRelationValidator =\n (createOrUpdate: CreateOrUpdate) =>\n (\n { attr, updatedAttribute }: ValidatorMeta<Schema.Attribute.Relation>,\n { isDraft }: ValidatorContext\n ) => {\n let validator;\n\n if (Array.isArray(updatedAttribute.value)) {\n validator = yup.array().of(yup.mixed());\n } else {\n validator = yup.mixed();\n }\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: !isDraft && attr.required },\n updatedAttribute,\n });\n\n return validator;\n };\n\nconst createScalarAttributeValidator =\n (createOrUpdate: CreateOrUpdate) => (metas: ValidatorMeta, options: ValidatorContext) => {\n let validator;\n\n if (has(metas.attr.type, validators)) {\n validator = (validators as any)[metas.attr.type](metas, options);\n } else {\n // No validators specified - fall back to mixed\n validator = yup.mixed();\n }\n\n validator = addRequiredValidation(createOrUpdate)(validator, {\n attr: { required: !options.isDraft && metas.attr.required },\n updatedAttribute: metas.updatedAttribute,\n });\n\n return validator;\n };\n\nconst createAttributeValidator =\n (createOrUpdate: CreateOrUpdate) =>\n (metas: AttributeValidatorMetas, options: ValidatorContext) => {\n let validator = yup.mixed();\n\n if (isMediaAttribute(metas.attr)) {\n validator = yup.mixed();\n } else if (isScalarAttribute(metas.attr)) {\n validator = createScalarAttributeValidator(createOrUpdate)(metas, options);\n } else {\n if (metas.attr.type === 'component') {\n validator = createComponentValidator(createOrUpdate)(\n { attr: metas.attr, updatedAttribute: metas.updatedAttribute },\n options\n );\n } else if (metas.attr.type === 'dynamiczone') {\n validator = createDzValidator(createOrUpdate)(metas, options);\n } else if (metas.attr.type === 'relation') {\n validator = createRelationValidator(createOrUpdate)(\n {\n attr: metas.attr,\n updatedAttribute: metas.updatedAttribute,\n },\n options\n );\n }\n\n validator = preventCast(validator);\n }\n\n validator = addDefault(createOrUpdate)(validator, metas);\n\n return validator;\n };\n\nconst createModelValidator =\n (createOrUpdate: CreateOrUpdate) =>\n ({ model, data, entity }: ModelValidatorMetas, options: ValidatorContext) => {\n const writableAttributes = model ? getWritableAttributes(model as any) : [];\n\n const schema = writableAttributes.reduce((validators, attributeName) => {\n const metas = {\n attr: model.attributes[attributeName],\n updatedAttribute: { name: attributeName, value: prop(attributeName, data) },\n model,\n entity,\n };\n\n const validator = createAttributeValidator(createOrUpdate)(metas, options);\n\n validators[attributeName] = validator;\n\n return validators;\n }, {} as Record<string, strapiUtils.yup.BaseSchema>);\n\n return yup.object().shape(schema);\n };\n\nconst createValidateEntity = (createOrUpdate: CreateOrUpdate) => {\n return async <\n TUID extends UID.ContentType,\n TData extends Modules.EntityService.Params.Data.Input<TUID>\n >(\n model: Schema.ContentType<TUID>,\n data: TData | Partial<TData> | undefined,\n options?: ValidatorContext,\n entity?: Entity\n ): Promise<TData> => {\n if (!isObject(data)) {\n const { displayName } = model.info;\n\n throw new ValidationError(\n `Invalid payload submitted for the ${createOrUpdate} of an entity of type ${displayName}. Expected an object, but got ${typeof data}`\n );\n }\n\n const validator = createModelValidator(createOrUpdate)(\n { model, data, entity },\n {\n isDraft: options?.isDraft ?? false,\n locale: options?.locale ?? null,\n }\n )\n .test('relations-test', 'check that all relations exist', async function (data) {\n try {\n await checkRelationsExist(buildRelationsStore({ uid: model.uid, data }));\n } catch (e) {\n return this.createError({\n path: this.path,\n message: (e instanceof ValidationError && e.message) || 'Invalid relations',\n });\n }\n return true;\n })\n .required();\n\n return validateYupSchema(validator, {\n strict: false,\n abortEarly: false,\n })(data);\n };\n};\n\n/**\n * Builds an object containing all the media and relations being associated with an entity\n */\nconst buildRelationsStore = <TUID extends UID.Schema>({\n uid,\n data,\n}: {\n uid: TUID;\n data: Record<string, unknown> | null;\n}): Record<string, ID[]> => {\n if (!uid) {\n throw new ValidationError(`Cannot build relations store: \"uid\" is undefined`);\n }\n\n if (isEmpty(data)) {\n return {};\n }\n\n const currentModel = strapi.getModel(uid);\n\n return Object.keys(currentModel.attributes).reduce((result, attributeName: string) => {\n const attribute = currentModel.attributes[attributeName];\n const value = data[attributeName];\n\n if (isNil(value)) {\n return result;\n }\n\n switch (attribute.type) {\n case 'relation':\n case 'media': {\n if (\n attribute.type === 'relation' &&\n (attribute.relation === 'morphToMany' || attribute.relation === 'morphToOne')\n ) {\n // TODO: handle polymorphic relations\n break;\n }\n\n const target =\n // eslint-disable-next-line no-nested-ternary\n attribute.type === 'media' ? 'plugin::upload.file' : attribute.target;\n // As there are multiple formats supported for associating relations\n // with an entity, the value here can be an: array, object or number.\n let source: RelationSource[];\n if (Array.isArray(value)) {\n source = value;\n } else if (isObject(value)) {\n if ('connect' in value && !isNil(value.connect)) {\n source = value.connect as RelationSource[];\n } else if ('set' in value && !isNil(value.set)) {\n source = value.set as RelationSource[];\n } else {\n source = [];\n }\n } else {\n source = castArray(value as RelationSource);\n }\n const idArray = source.map((v) => ({\n id: typeof v === 'object' ? v.id : v,\n }));\n\n // Update the relationStore to keep track of all associations being made\n // with relations and media.\n result[target] = result[target] || [];\n result[target].push(...idArray);\n break;\n }\n case 'component': {\n return castArray(value).reduce((relationsStore, componentValue) => {\n if (!attribute.component) {\n throw new ValidationError(\n `Cannot build relations store from component, component identifier is undefined`\n );\n }\n\n return mergeWith(\n relationsStore,\n buildRelationsStore({\n uid: attribute.component,\n data: componentValue as Record<string, unknown>,\n }),\n (objValue, srcValue) => {\n if (isArray(objValue)) {\n return objValue.concat(srcValue);\n }\n }\n );\n }, result) as Record<string, ID[]>;\n }\n case 'dynamiczone': {\n return castArray(value).reduce((relationsStore, dzValue) => {\n const value = dzValue as Record<string, unknown>;\n if (!value.__component) {\n throw new ValidationError(\n `Cannot build relations store from dynamiczone, component identifier is undefined`\n );\n }\n\n return mergeWith(\n relationsStore,\n buildRelationsStore({\n uid: value.__component as UID.Component,\n data: value,\n }),\n (objValue, srcValue) => {\n if (isArray(objValue)) {\n return objValue.concat(srcValue);\n }\n }\n );\n }, result) as Record<string, ID[]>;\n }\n default:\n break;\n }\n\n return result;\n }, {} as Record<string, ID[]>);\n};\n\n/**\n * Iterate through the relations store and validates that every relation or media\n * mentioned exists\n */\nconst checkRelationsExist = async (relationsStore: Record<string, ID[]> = {}) => {\n const promises = [];\n\n for (const [key, value] of Object.entries(relationsStore)) {\n const evaluate = async () => {\n const uniqueValues = uniqBy(value, `id`);\n const count = await strapi.db.query(key as UID.Schema).count({\n where: {\n id: {\n $in: uniqueValues.map((v) => v.id),\n },\n },\n });\n\n if (count !== uniqueValues.length) {\n throw new ValidationError(\n `${\n uniqueValues.length - count\n } relation(s) of type ${key} associated with this entity do not exist`\n );\n }\n };\n promises.push(evaluate());\n }\n\n return Promise.all(promises);\n};\n\nconst entityValidator: Modules.EntityValidator.EntityValidator = {\n validateEntityCreation: createValidateEntity('creation'),\n validateEntityUpdate: createValidateEntity('update'),\n};\n\nexport default entityValidator;\n"],"names":["strapiUtils","validator","prop","has","validators","isObject","data","isEmpty","isNil","castArray","mergeWith","isArray","value","uniqBy"],"mappings":"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"}