@strapi/content-manager 5.59.0 → 5.61.0

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 (300) hide show
  1. package/dist/admin/constants/customOrder.js +14 -0
  2. package/dist/admin/constants/customOrder.js.map +1 -0
  3. package/dist/admin/constants/customOrder.mjs +10 -0
  4. package/dist/admin/constants/customOrder.mjs.map +1 -0
  5. package/dist/admin/history/components/VersionInputRenderer.js +2 -1
  6. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  7. package/dist/admin/history/components/VersionInputRenderer.mjs +2 -1
  8. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  9. package/dist/admin/hooks/useDocument.js +22 -11
  10. package/dist/admin/hooks/useDocument.js.map +1 -1
  11. package/dist/admin/hooks/useDocument.mjs +22 -11
  12. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  13. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  14. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  15. package/dist/admin/hooks/useHasBeenNearViewport.js +70 -0
  16. package/dist/admin/hooks/useHasBeenNearViewport.js.map +1 -0
  17. package/dist/admin/hooks/useHasBeenNearViewport.mjs +46 -0
  18. package/dist/admin/hooks/useHasBeenNearViewport.mjs.map +1 -0
  19. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +102 -32
  20. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs +104 -35
  22. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js +20 -17
  24. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs +20 -17
  26. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +15 -1
  28. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +17 -3
  30. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js +21 -0
  32. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs +22 -1
  34. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +1 -0
  36. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +1 -0
  38. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +1 -0
  40. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +1 -0
  42. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +2 -0
  44. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +2 -0
  46. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +4 -7
  48. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +4 -7
  50. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +46 -10
  52. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +47 -11
  54. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormLayout.js +201 -50
  56. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormLayout.mjs +202 -52
  58. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  59. package/dist/admin/pages/EditView/components/InputRenderer.js +3 -1
  60. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  61. package/dist/admin/pages/EditView/components/InputRenderer.mjs +3 -1
  62. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  63. package/dist/admin/pages/ListConfiguration/components/Settings.js +31 -2
  64. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  65. package/dist/admin/pages/ListConfiguration/components/Settings.mjs +31 -2
  66. package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
  67. package/dist/admin/pages/ListView/ListViewPage.js +196 -132
  68. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  69. package/dist/admin/pages/ListView/ListViewPage.mjs +196 -132
  70. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  71. package/dist/admin/pages/ListView/components/CustomOrder.js +571 -0
  72. package/dist/admin/pages/ListView/components/CustomOrder.js.map +1 -0
  73. package/dist/admin/pages/ListView/components/CustomOrder.mjs +546 -0
  74. package/dist/admin/pages/ListView/components/CustomOrder.mjs.map +1 -0
  75. package/dist/admin/pages/ListView/components/TableActions.js +4 -1
  76. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  77. package/dist/admin/pages/ListView/components/TableActions.mjs +4 -1
  78. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  79. package/dist/admin/preview/components/PreviewSidePanel.js +2 -1
  80. package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
  81. package/dist/admin/preview/components/PreviewSidePanel.mjs +2 -1
  82. package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
  83. package/dist/admin/preview/utils/getPreviewUrlStatus.js +17 -0
  84. package/dist/admin/preview/utils/getPreviewUrlStatus.js.map +1 -0
  85. package/dist/admin/preview/utils/getPreviewUrlStatus.mjs +15 -0
  86. package/dist/admin/preview/utils/getPreviewUrlStatus.mjs.map +1 -0
  87. package/dist/admin/services/documents.js +22 -1
  88. package/dist/admin/services/documents.js.map +1 -1
  89. package/dist/admin/services/documents.mjs +21 -2
  90. package/dist/admin/services/documents.mjs.map +1 -1
  91. package/dist/admin/src/constants/customOrder.d.ts +8 -0
  92. package/dist/admin/src/exports.d.ts +1 -1
  93. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +3 -1
  94. package/dist/admin/src/hooks/useDocument.d.ts +4 -0
  95. package/dist/admin/src/hooks/useDocumentLayout.d.ts +6 -2
  96. package/dist/admin/src/hooks/useHasBeenNearViewport.d.ts +13 -0
  97. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.d.ts +13 -1
  98. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +11 -1
  99. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +2 -0
  100. package/dist/admin/src/pages/ListView/components/CustomOrder.d.ts +72 -0
  101. package/dist/admin/src/preview/utils/getPreviewUrlStatus.d.ts +6 -0
  102. package/dist/admin/src/services/documents.d.ts +10 -2
  103. package/dist/admin/translations/en.json.js +9 -0
  104. package/dist/admin/translations/en.json.js.map +1 -1
  105. package/dist/admin/translations/en.json.mjs +9 -0
  106. package/dist/admin/translations/en.json.mjs.map +1 -1
  107. package/dist/server/audit-logs.js +36 -0
  108. package/dist/server/audit-logs.js.map +1 -0
  109. package/dist/server/audit-logs.mjs +33 -0
  110. package/dist/server/audit-logs.mjs.map +1 -0
  111. package/dist/server/bootstrap.js +8 -0
  112. package/dist/server/bootstrap.js.map +1 -1
  113. package/dist/server/bootstrap.mjs +8 -0
  114. package/dist/server/bootstrap.mjs.map +1 -1
  115. package/dist/server/controllers/collection-types.js +8 -0
  116. package/dist/server/controllers/collection-types.js.map +1 -1
  117. package/dist/server/controllers/collection-types.mjs +8 -0
  118. package/dist/server/controllers/collection-types.mjs.map +1 -1
  119. package/dist/server/controllers/content-types.js +15 -0
  120. package/dist/server/controllers/content-types.js.map +1 -1
  121. package/dist/server/controllers/content-types.mjs +16 -1
  122. package/dist/server/controllers/content-types.mjs.map +1 -1
  123. package/dist/server/controllers/index.js +3 -1
  124. package/dist/server/controllers/index.js.map +1 -1
  125. package/dist/server/controllers/index.mjs +2 -0
  126. package/dist/server/controllers/index.mjs.map +1 -1
  127. package/dist/server/controllers/relations.js +53 -17
  128. package/dist/server/controllers/relations.js.map +1 -1
  129. package/dist/server/controllers/relations.mjs +54 -18
  130. package/dist/server/controllers/relations.mjs.map +1 -1
  131. package/dist/server/controllers/single-types.js +10 -1
  132. package/dist/server/controllers/single-types.js.map +1 -1
  133. package/dist/server/controllers/single-types.mjs +10 -1
  134. package/dist/server/controllers/single-types.mjs.map +1 -1
  135. package/dist/server/controllers/validation/model-configuration.js +2 -1
  136. package/dist/server/controllers/validation/model-configuration.js.map +1 -1
  137. package/dist/server/controllers/validation/model-configuration.mjs +2 -1
  138. package/dist/server/controllers/validation/model-configuration.mjs.map +1 -1
  139. package/dist/server/custom-order/constants.js +21 -0
  140. package/dist/server/custom-order/constants.js.map +1 -0
  141. package/dist/server/custom-order/constants.mjs +17 -0
  142. package/dist/server/custom-order/constants.mjs.map +1 -0
  143. package/dist/server/custom-order/controllers/custom-order.js +77 -0
  144. package/dist/server/custom-order/controllers/custom-order.js.map +1 -0
  145. package/dist/server/custom-order/controllers/custom-order.mjs +75 -0
  146. package/dist/server/custom-order/controllers/custom-order.mjs.map +1 -0
  147. package/dist/server/custom-order/controllers/index.js +10 -0
  148. package/dist/server/custom-order/controllers/index.js.map +1 -0
  149. package/dist/server/custom-order/controllers/index.mjs +8 -0
  150. package/dist/server/custom-order/controllers/index.mjs.map +1 -0
  151. package/dist/server/custom-order/index.js +71 -0
  152. package/dist/server/custom-order/index.js.map +1 -0
  153. package/dist/server/custom-order/index.mjs +69 -0
  154. package/dist/server/custom-order/index.mjs.map +1 -0
  155. package/dist/server/custom-order/routes/custom-order.js +38 -0
  156. package/dist/server/custom-order/routes/custom-order.js.map +1 -0
  157. package/dist/server/custom-order/routes/custom-order.mjs +36 -0
  158. package/dist/server/custom-order/routes/custom-order.mjs.map +1 -0
  159. package/dist/server/custom-order/routes/index.js +13 -0
  160. package/dist/server/custom-order/routes/index.js.map +1 -0
  161. package/dist/server/custom-order/routes/index.mjs +11 -0
  162. package/dist/server/custom-order/routes/index.mjs.map +1 -0
  163. package/dist/server/custom-order/services/custom-order.js +286 -0
  164. package/dist/server/custom-order/services/custom-order.js.map +1 -0
  165. package/dist/server/custom-order/services/custom-order.mjs +284 -0
  166. package/dist/server/custom-order/services/custom-order.mjs.map +1 -0
  167. package/dist/server/custom-order/services/document-middleware.js +83 -0
  168. package/dist/server/custom-order/services/document-middleware.js.map +1 -0
  169. package/dist/server/custom-order/services/document-middleware.mjs +81 -0
  170. package/dist/server/custom-order/services/document-middleware.mjs.map +1 -0
  171. package/dist/server/custom-order/services/index.js +10 -0
  172. package/dist/server/custom-order/services/index.js.map +1 -0
  173. package/dist/server/custom-order/services/index.mjs +8 -0
  174. package/dist/server/custom-order/services/index.mjs.map +1 -0
  175. package/dist/server/custom-order/services/utils.js +152 -0
  176. package/dist/server/custom-order/services/utils.js.map +1 -0
  177. package/dist/server/custom-order/services/utils.mjs +148 -0
  178. package/dist/server/custom-order/services/utils.mjs.map +1 -0
  179. package/dist/server/custom-order/utils.js +13 -0
  180. package/dist/server/custom-order/utils.js.map +1 -0
  181. package/dist/server/custom-order/utils.mjs +10 -0
  182. package/dist/server/custom-order/utils.mjs.map +1 -0
  183. package/dist/server/history/constants.js +2 -1
  184. package/dist/server/history/constants.js.map +1 -1
  185. package/dist/server/history/constants.mjs +2 -1
  186. package/dist/server/history/constants.mjs.map +1 -1
  187. package/dist/server/history/controllers/history-version.js +6 -2
  188. package/dist/server/history/controllers/history-version.js.map +1 -1
  189. package/dist/server/history/controllers/history-version.mjs +6 -2
  190. package/dist/server/history/controllers/history-version.mjs.map +1 -1
  191. package/dist/server/history/services/history.js +24 -7
  192. package/dist/server/history/services/history.js.map +1 -1
  193. package/dist/server/history/services/history.mjs +25 -8
  194. package/dist/server/history/services/history.mjs.map +1 -1
  195. package/dist/server/history/services/lifecycles.js +2 -16
  196. package/dist/server/history/services/lifecycles.js.map +1 -1
  197. package/dist/server/history/services/lifecycles.mjs +2 -16
  198. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  199. package/dist/server/mcp/schemas/filters-schema.js +10 -2
  200. package/dist/server/mcp/schemas/filters-schema.js.map +1 -1
  201. package/dist/server/mcp/schemas/filters-schema.mjs +10 -2
  202. package/dist/server/mcp/schemas/filters-schema.mjs.map +1 -1
  203. package/dist/server/preview/controllers/validation/preview.js +1 -1
  204. package/dist/server/preview/controllers/validation/preview.js.map +1 -1
  205. package/dist/server/preview/controllers/validation/preview.mjs +2 -2
  206. package/dist/server/preview/controllers/validation/preview.mjs.map +1 -1
  207. package/dist/server/register.js +4 -0
  208. package/dist/server/register.js.map +1 -1
  209. package/dist/server/register.mjs +4 -0
  210. package/dist/server/register.mjs.map +1 -1
  211. package/dist/server/routes/index.js +3 -1
  212. package/dist/server/routes/index.js.map +1 -1
  213. package/dist/server/routes/index.mjs +2 -0
  214. package/dist/server/routes/index.mjs.map +1 -1
  215. package/dist/server/services/content-types.js +2 -2
  216. package/dist/server/services/content-types.js.map +1 -1
  217. package/dist/server/services/content-types.mjs +2 -2
  218. package/dist/server/services/content-types.mjs.map +1 -1
  219. package/dist/server/services/document-manager.js +13 -0
  220. package/dist/server/services/document-manager.js.map +1 -1
  221. package/dist/server/services/document-manager.mjs +14 -1
  222. package/dist/server/services/document-manager.mjs.map +1 -1
  223. package/dist/server/services/document-metadata.js +1 -1
  224. package/dist/server/services/document-metadata.js.map +1 -1
  225. package/dist/server/services/document-metadata.mjs +1 -1
  226. package/dist/server/services/document-metadata.mjs.map +1 -1
  227. package/dist/server/services/index.js +3 -1
  228. package/dist/server/services/index.js.map +1 -1
  229. package/dist/server/services/index.mjs +2 -0
  230. package/dist/server/services/index.mjs.map +1 -1
  231. package/dist/server/services/utils/configuration/settings.js +2 -1
  232. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  233. package/dist/server/services/utils/configuration/settings.mjs +2 -1
  234. package/dist/server/services/utils/configuration/settings.mjs.map +1 -1
  235. package/dist/server/src/audit-logs.d.ts +40 -0
  236. package/dist/server/src/audit-logs.d.ts.map +1 -0
  237. package/dist/server/src/bootstrap.d.ts.map +1 -1
  238. package/dist/server/src/controllers/collection-types.d.ts +1 -1
  239. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  240. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  241. package/dist/server/src/controllers/index.d.ts +21 -3
  242. package/dist/server/src/controllers/index.d.ts.map +1 -1
  243. package/dist/server/src/controllers/relations.d.ts +19 -1
  244. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  245. package/dist/server/src/controllers/single-types.d.ts +1 -1
  246. package/dist/server/src/controllers/single-types.d.ts.map +1 -1
  247. package/dist/server/src/custom-order/constants.d.ts +18 -0
  248. package/dist/server/src/custom-order/constants.d.ts.map +1 -0
  249. package/dist/server/src/custom-order/controllers/custom-order.d.ts +8 -0
  250. package/dist/server/src/custom-order/controllers/custom-order.d.ts.map +1 -0
  251. package/dist/server/src/custom-order/controllers/index.d.ts +3 -0
  252. package/dist/server/src/custom-order/controllers/index.d.ts.map +1 -0
  253. package/dist/server/src/custom-order/index.d.ts +8 -0
  254. package/dist/server/src/custom-order/index.d.ts.map +1 -0
  255. package/dist/server/src/custom-order/routes/custom-order.d.ts +4 -0
  256. package/dist/server/src/custom-order/routes/custom-order.d.ts.map +1 -0
  257. package/dist/server/src/custom-order/routes/index.d.ts +10 -0
  258. package/dist/server/src/custom-order/routes/index.d.ts.map +1 -0
  259. package/dist/server/src/custom-order/services/custom-order.d.ts +43 -0
  260. package/dist/server/src/custom-order/services/custom-order.d.ts.map +1 -0
  261. package/dist/server/src/custom-order/services/document-middleware.d.ts +16 -0
  262. package/dist/server/src/custom-order/services/document-middleware.d.ts.map +1 -0
  263. package/dist/server/src/custom-order/services/index.d.ts +24 -0
  264. package/dist/server/src/custom-order/services/index.d.ts.map +1 -0
  265. package/dist/server/src/custom-order/services/utils.d.ts +34 -0
  266. package/dist/server/src/custom-order/services/utils.d.ts.map +1 -0
  267. package/dist/server/src/custom-order/utils.d.ts +6 -0
  268. package/dist/server/src/custom-order/utils.d.ts.map +1 -0
  269. package/dist/server/src/history/constants.d.ts.map +1 -1
  270. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  271. package/dist/server/src/history/services/history.d.ts.map +1 -1
  272. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  273. package/dist/server/src/index.d.ts +22 -6
  274. package/dist/server/src/index.d.ts.map +1 -1
  275. package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -1
  276. package/dist/server/src/register.d.ts.map +1 -1
  277. package/dist/server/src/routes/index.d.ts.map +1 -1
  278. package/dist/server/src/services/content-types.d.ts +1 -3
  279. package/dist/server/src/services/content-types.d.ts.map +1 -1
  280. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  281. package/dist/server/src/services/index.d.ts +1 -3
  282. package/dist/server/src/services/index.d.ts.map +1 -1
  283. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  284. package/dist/shared/contracts/content-types.d.ts +5 -0
  285. package/dist/shared/contracts/content-types.d.ts.map +1 -1
  286. package/dist/shared/contracts/custom-order.d.ts +33 -0
  287. package/dist/shared/contracts/custom-order.d.ts.map +1 -0
  288. package/dist/shared/contracts/custom-order.js +3 -0
  289. package/dist/shared/contracts/custom-order.js.map +1 -0
  290. package/dist/shared/contracts/custom-order.mjs +2 -0
  291. package/dist/shared/contracts/custom-order.mjs.map +1 -0
  292. package/dist/shared/contracts/history-versions.d.ts +0 -1
  293. package/dist/shared/contracts/history-versions.d.ts.map +1 -1
  294. package/dist/shared/contracts/index.d.ts +1 -0
  295. package/dist/shared/contracts/index.d.ts.map +1 -1
  296. package/dist/shared/contracts/index.js +2 -0
  297. package/dist/shared/contracts/index.js.map +1 -1
  298. package/dist/shared/contracts/index.mjs +2 -0
  299. package/dist/shared/contracts/index.mjs.map +1 -1
  300. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.js","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.split('?')[0].endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(attributesSchema, FIELDS_TO_IGNORE) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(entry, FIELDS_TO_IGNORE) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const BATCH_SIZE = 1000;\n\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n // Delete in batches of 1000 to avoid a single query that\n // exhausts the DB connection pool and blocks other operations.\n let deleted: number;\n do {\n // Fetch up to BATCH_SIZE expired IDs\n const expiredVersions = await strapi.db.query(HISTORY_VERSION_UID).findMany({\n select: ['id'],\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n limit: BATCH_SIZE,\n });\n\n const ids = expiredVersions.map((v: { id: number | string }) => v.id);\n deleted = ids.length;\n\n // Delete this batch by ID\n if (deleted > 0) {\n await strapi.db.query(HISTORY_VERSION_UID).deleteMany({\n where: {\n id: { $in: ids },\n },\n });\n }\n\n // If we got a full batch, there are likely more rows to delete — loop again.\n // If we got fewer, we've handled everything and can stop.\n } while (deleted >= BATCH_SIZE);\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","split","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","BATCH_SIZE","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","deleted","expiredVersions","HISTORY_VERSION_UID","select","created_at","$lt","limit","ids","map","v","id","deleteMany","options","destroy","remove"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycles.js","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.split('?')[0].endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema.\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n return {\n schema: omit(attributesSchema, FIELDS_TO_IGNORE) as CreateHistoryVersion['schema'],\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(entry, FIELDS_TO_IGNORE) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const BATCH_SIZE = 1000;\n\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n // Delete in batches of 1000 to avoid a single query that\n // exhausts the DB connection pool and blocks other operations.\n let deleted: number;\n do {\n // Fetch up to BATCH_SIZE expired IDs\n const expiredVersions = await strapi.db.query(HISTORY_VERSION_UID).findMany({\n select: ['id'],\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n limit: BATCH_SIZE,\n });\n\n const ids = expiredVersions.map((v: { id: number | string }) => v.id);\n deleted = ids.length;\n\n // Delete this batch by ID\n if (deleted > 0) {\n await strapi.db.query(HISTORY_VERSION_UID).deleteMany({\n where: {\n id: { $in: ids },\n },\n });\n }\n\n // If we got a full batch, there are likely more rows to delete — loop again.\n // If we got fewer, we've handled everything and can stop.\n } while (deleted >= BATCH_SIZE);\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","split","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","BATCH_SIZE","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","deleted","expiredVersions","HISTORY_VERSION_UID","select","created_at","$lt","limit","ids","map","v","id","deleteMany","options","destroy","remove"],"mappings":"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"}
@@ -30,27 +30,13 @@ import { createServiceUtils } from './utils.mjs';
30
30
  return true;
31
31
  };
32
32
  /**
33
- * Returns the content type schema (and its components schemas).
33
+ * Returns the content type schema.
34
34
  * Used to determine if changes were made in the content type builder since a history version was created.
35
35
  * And therefore which fields can be restored and which cannot.
36
36
  */ const getSchemas = (uid)=>{
37
37
  const attributesSchema = strapi.getModel(uid).attributes;
38
- // TODO: Handle nested components
39
- const componentsSchemas = Object.keys(attributesSchema).reduce((currentComponentSchemas, key)=>{
40
- const fieldSchema = attributesSchema[key];
41
- if (fieldSchema.type === 'component') {
42
- const componentSchema = strapi.getModel(fieldSchema.component).attributes;
43
- return {
44
- ...currentComponentSchemas,
45
- [fieldSchema.component]: componentSchema
46
- };
47
- }
48
- // Ignore anything that's not a component
49
- return currentComponentSchemas;
50
- }, {});
51
38
  return {
52
- schema: omit(attributesSchema, FIELDS_TO_IGNORE),
53
- componentsSchemas
39
+ schema: omit(attributesSchema, FIELDS_TO_IGNORE)
54
40
  };
55
41
  };
56
42
  const createLifecyclesService = ({ strapi: strapi1 })=>{
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.mjs","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.split('?')[0].endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema (and its components schemas).\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n // TODO: Handle nested components\n const componentsSchemas = Object.keys(attributesSchema).reduce(\n (currentComponentSchemas, key) => {\n const fieldSchema = attributesSchema[key];\n\n if (fieldSchema.type === 'component') {\n const componentSchema = strapi.getModel(fieldSchema.component).attributes;\n return {\n ...currentComponentSchemas,\n [fieldSchema.component]: componentSchema,\n };\n }\n\n // Ignore anything that's not a component\n return currentComponentSchemas;\n },\n {} as CreateHistoryVersion['componentsSchemas']\n );\n\n return {\n schema: omit(attributesSchema, FIELDS_TO_IGNORE) as CreateHistoryVersion['schema'],\n componentsSchemas,\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(entry, FIELDS_TO_IGNORE) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const BATCH_SIZE = 1000;\n\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n // Delete in batches of 1000 to avoid a single query that\n // exhausts the DB connection pool and blocks other operations.\n let deleted: number;\n do {\n // Fetch up to BATCH_SIZE expired IDs\n const expiredVersions = await strapi.db.query(HISTORY_VERSION_UID).findMany({\n select: ['id'],\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n limit: BATCH_SIZE,\n });\n\n const ids = expiredVersions.map((v: { id: number | string }) => v.id);\n deleted = ids.length;\n\n // Delete this batch by ID\n if (deleted > 0) {\n await strapi.db.query(HISTORY_VERSION_UID).deleteMany({\n where: {\n id: { $in: ids },\n },\n });\n }\n\n // If we got a full batch, there are likely more rows to delete — loop again.\n // If we got fewer, we've handled everything and can stop.\n } while (deleted >= BATCH_SIZE);\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","split","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","componentsSchemas","Object","keys","reduce","currentComponentSchemas","key","fieldSchema","type","componentSchema","component","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","BATCH_SIZE","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","deleted","expiredVersions","HISTORY_VERSION_UID","select","created_at","$lt","limit","ids","map","v","id","deleteMany","options","destroy","remove"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycles.mjs","sources":["../../../../server/src/history/services/lifecycles.ts"],"sourcesContent":["import type { Core, Modules, UID } from '@strapi/types';\nimport { contentTypes } from '@strapi/utils';\n\nimport { omit, castArray } from 'lodash';\n\nimport { getService } from '../utils';\nimport { FIELDS_TO_IGNORE, HISTORY_VERSION_UID } from '../constants';\n\nimport type { CreateHistoryVersion } from '../../../../shared/contracts/history-versions';\nimport { createServiceUtils } from './utils';\n\n/**\n * Filters out actions that should not create a history version.\n */\nconst shouldCreateHistoryVersion = (\n context: Modules.Documents.Middleware.Context\n): context is Modules.Documents.Middleware.Context & {\n action: 'create' | 'update' | 'clone' | 'publish' | 'unpublish' | 'discardDraft';\n contentType: UID.CollectionType;\n} => {\n // Ignore requests that are not related to the content manager\n if (!strapi.requestContext.get()?.request.url.startsWith('/content-manager')) {\n return false;\n }\n\n // NOTE: cannot do type narrowing with array includes\n if (\n context.action !== 'create' &&\n context.action !== 'update' &&\n context.action !== 'clone' &&\n context.action !== 'publish' &&\n context.action !== 'unpublish' &&\n context.action !== 'discardDraft'\n ) {\n return false;\n }\n\n /**\n * When a document is published, the draft version of the document is also updated.\n * It creates confusion for users because they see two history versions each publish action.\n * To avoid this, we silence the update action during a publish request,\n * so that they only see the published version of the document in the history.\n */\n if (\n context.action === 'update' &&\n strapi.requestContext.get()?.request.url.split('?')[0].endsWith('/actions/publish')\n ) {\n return false;\n }\n\n // Ignore content types not created by the user\n if (!context.contentType.uid.startsWith('api::')) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Returns the content type schema.\n * Used to determine if changes were made in the content type builder since a history version was created.\n * And therefore which fields can be restored and which cannot.\n */\nconst getSchemas = (uid: UID.CollectionType) => {\n const attributesSchema = strapi.getModel(uid).attributes;\n\n return {\n schema: omit(attributesSchema, FIELDS_TO_IGNORE) as CreateHistoryVersion['schema'],\n };\n};\n\nconst createLifecyclesService = ({ strapi }: { strapi: Core.Strapi }) => {\n const state: {\n isInitialized: boolean;\n } = {\n isInitialized: false,\n };\n\n const serviceUtils = createServiceUtils({ strapi });\n const { persistTablesWithPrefix } = strapi.service('admin::persist-tables');\n\n return {\n async bootstrap() {\n // Prevent initializing the service twice\n if (state.isInitialized) {\n return;\n }\n\n // Avoid data loss in case users temporarily don't have a license\n await persistTablesWithPrefix('strapi_history_versions');\n\n strapi.documents.use(async (context, next) => {\n const result = (await next()) as any;\n\n if (!shouldCreateHistoryVersion(context)) {\n return result;\n }\n\n // On create/clone actions, the documentId is not available before creating the action is executed\n const documentId =\n context.action === 'create' || context.action === 'clone'\n ? result.documentId\n : context.params.documentId;\n\n // Apply default locale if not available in the request\n const defaultLocale = await serviceUtils.getDefaultLocale();\n const locales = castArray(context.params?.locale || defaultLocale);\n if (!locales.length) {\n return result;\n }\n\n // All schemas related to the content type\n const uid = context.contentType.uid;\n const schemas = getSchemas(uid);\n const model = strapi.getModel(uid);\n\n const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);\n\n // Find all affected entries\n const localeEntries = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n ...(isLocalizedContentType ? { locale: { $in: locales } } : {}),\n ...(contentTypes.hasDraftAndPublish(strapi.contentTypes[uid])\n ? { publishedAt: null }\n : {}),\n },\n populate: serviceUtils.getDeepPopulate(uid, true /* use database syntax */),\n });\n\n await strapi.db.transaction(async ({ onCommit }) => {\n // .createVersion() is executed asynchronously,\n // onCommit prevents creating a history version\n // when the transaction has already been committed\n onCommit(async () => {\n for (const entry of localeEntries) {\n const status = await serviceUtils.getVersionStatus(uid, entry);\n\n await getService(strapi, 'history').createVersion({\n contentType: uid,\n data: omit(entry, FIELDS_TO_IGNORE) as Modules.Documents.AnyDocument,\n relatedDocumentId: documentId,\n locale: entry.locale,\n status,\n ...schemas,\n });\n }\n });\n });\n\n return result;\n });\n\n // Schedule a job to delete expired history versions every day at midnight\n strapi.cron.add({\n deleteHistoryDaily: {\n async task() {\n const BATCH_SIZE = 1000;\n\n const retentionDaysInMilliseconds =\n serviceUtils.getRetentionDays() * 24 * 60 * 60 * 1000;\n const expirationDate = new Date(Date.now() - retentionDaysInMilliseconds);\n\n // Delete in batches of 1000 to avoid a single query that\n // exhausts the DB connection pool and blocks other operations.\n let deleted: number;\n do {\n // Fetch up to BATCH_SIZE expired IDs\n const expiredVersions = await strapi.db.query(HISTORY_VERSION_UID).findMany({\n select: ['id'],\n where: {\n created_at: {\n $lt: expirationDate,\n },\n },\n limit: BATCH_SIZE,\n });\n\n const ids = expiredVersions.map((v: { id: number | string }) => v.id);\n deleted = ids.length;\n\n // Delete this batch by ID\n if (deleted > 0) {\n await strapi.db.query(HISTORY_VERSION_UID).deleteMany({\n where: {\n id: { $in: ids },\n },\n });\n }\n\n // If we got a full batch, there are likely more rows to delete — loop again.\n // If we got fewer, we've handled everything and can stop.\n } while (deleted >= BATCH_SIZE);\n },\n options: '0 0 * * *',\n },\n });\n\n state.isInitialized = true;\n },\n\n async destroy() {\n strapi.cron.remove('deleteHistoryDaily');\n },\n };\n};\n\nexport { createLifecyclesService };\n"],"names":["shouldCreateHistoryVersion","context","strapi","requestContext","get","request","url","startsWith","action","split","endsWith","contentType","uid","getSchemas","attributesSchema","getModel","attributes","schema","omit","FIELDS_TO_IGNORE","createLifecyclesService","state","isInitialized","serviceUtils","createServiceUtils","persistTablesWithPrefix","service","bootstrap","documents","use","next","result","documentId","params","defaultLocale","getDefaultLocale","locales","castArray","locale","length","schemas","model","isLocalizedContentType","localeEntries","db","query","findMany","where","$in","contentTypes","hasDraftAndPublish","publishedAt","populate","getDeepPopulate","transaction","onCommit","entry","status","getVersionStatus","getService","createVersion","data","relatedDocumentId","cron","add","deleteHistoryDaily","task","BATCH_SIZE","retentionDaysInMilliseconds","getRetentionDays","expirationDate","Date","now","deleted","expiredVersions","HISTORY_VERSION_UID","select","created_at","$lt","limit","ids","map","v","id","deleteMany","options","destroy","remove"],"mappings":"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"}
@@ -79,8 +79,15 @@ var sortSchema = require('./sort-schema.js');
79
79
  if (scalarKeys.length === 0) {
80
80
  return strapiUtils.z.never();
81
81
  }
82
- // Lazy reference for recursion ($and / $or / $not)
82
+ // Lazy reference for recursion ($and / $or / $not).
83
+ // The getter is memoized: zod's JSON Schema conversion calls `def.getter()` directly for every
84
+ // node that reaches the lazy, bypassing zod's own cache, so an unmemoized getter rebuilds the
85
+ // whole object (fields x operators) many times per conversion.
86
+ let resolvedFiltersObject;
83
87
  const filtersSchema = strapiUtils.z.lazy(()=>{
88
+ if (resolvedFiltersObject !== undefined) {
89
+ return resolvedFiltersObject;
90
+ }
84
91
  const fieldShapes = {};
85
92
  for (const key of scalarKeys){
86
93
  const attr = attributes[key];
@@ -95,12 +102,13 @@ var sortSchema = require('./sort-schema.js');
95
102
  operatorObject
96
103
  ]).optional();
97
104
  }
98
- return strapiUtils.z.object({
105
+ resolvedFiltersObject = strapiUtils.z.object({
99
106
  $and: strapiUtils.z.array(filtersSchema).optional(),
100
107
  $or: strapiUtils.z.array(filtersSchema).optional(),
101
108
  $not: filtersSchema.optional(),
102
109
  ...fieldShapes
103
110
  }).strict();
111
+ return resolvedFiltersObject;
104
112
  });
105
113
  return filtersSchema.optional().describe(`Filter object. Supports logical operators ($and, $or, $not) and field operators ` + `($eq, $ne, $in, $contains, $gt, $lt, etc.). Valid fields: ${scalarKeys.join(', ')}.`);
106
114
  };
@@ -1 +1 @@
1
- {"version":3,"file":"filters-schema.js","sources":["../../../../server/src/mcp/schemas/filters-schema.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Schema, Struct } from '@strapi/types';\nimport { getScalarAttributeKeys } from './sort-schema';\n\n/**\n * Maps a scalar Strapi attribute type to the appropriate Zod leaf value schema\n * used inside filter operator objects (e.g. { $eq: <value> }).\n */\nexport const attributeTypeToFilterValue = (attr: Schema.Attribute.AnyAttribute): z.ZodTypeAny => {\n switch (attr.type) {\n case 'integer':\n case 'biginteger':\n case 'decimal':\n case 'float':\n return z.union([z.number(), z.array(z.number())]);\n case 'boolean':\n return z.boolean();\n case 'enumeration': {\n const enumAttr = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(enumAttr.enum) && enumAttr.enum.length > 0) {\n return z.union([\n z.enum(enumAttr.enum as [string, ...string[]]),\n z.array(z.enum(enumAttr.enum as [string, ...string[]])),\n ]);\n }\n return z.union([z.string(), z.array(z.string())]);\n }\n default:\n // string, text, richtext, email, password, uid, date, datetime, time, timestamp\n return z.union([z.string(), z.array(z.string()), z.null()]);\n }\n};\n\n/** All supported Strapi filter operators (excludes the experimental `$jsonSupersetOf`). */\nexport const FILTER_OPERATORS = [\n '$eq',\n '$eqi',\n '$ne',\n '$nei',\n '$in',\n '$notIn',\n '$lt',\n '$lte',\n '$gt',\n '$gte',\n '$between',\n '$contains',\n '$notContains',\n '$containsi',\n '$notContainsi',\n '$startsWith',\n '$startsWithi',\n '$endsWith',\n '$endsWithi',\n '$null',\n '$notNull',\n] as const;\n\n/**\n * Builds a per-content-type recursive filters Zod schema.\n *\n * Shape:\n * - Logical operators: $and, $or accept an array of filter objects.\n * - Logical operator: $not accepts a single filter object.\n * - Field keys (scalar attrs only): accept either a direct value (implicit $eq)\n * or an operator object { $eq, $contains, $gt, … }.\n *\n * If the model has no scalar attributes, the schema is z.never() (filters not allowed).\n */\nexport const buildFiltersSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const scalarKeys = getScalarAttributeKeys(attributes, permittedFields);\n\n if (scalarKeys.length === 0) {\n return z.never();\n }\n\n // Lazy reference for recursion ($and / $or / $not)\n const filtersSchema: z.ZodTypeAny = z.lazy(() => {\n const fieldShapes: Record<string, z.ZodTypeAny> = {};\n\n for (const key of scalarKeys) {\n const attr = attributes[key];\n const valueSchema = attributeTypeToFilterValue(attr);\n const operatorObject = z.object(\n Object.fromEntries(FILTER_OPERATORS.map((op) => [op, valueSchema.optional()]))\n );\n // Field accepts either a direct value (implicit $eq) or operator object\n fieldShapes[key] = z.union([valueSchema, operatorObject]).optional();\n }\n\n return z\n .object({\n $and: z.array(filtersSchema).optional(),\n $or: z.array(filtersSchema).optional(),\n $not: filtersSchema.optional(),\n ...fieldShapes,\n })\n .strict();\n });\n\n return filtersSchema\n .optional()\n .describe(\n `Filter object. Supports logical operators ($and, $or, $not) and field operators ` +\n `($eq, $ne, $in, $contains, $gt, $lt, etc.). Valid fields: ${scalarKeys.join(', ')}.`\n );\n};\n"],"names":["attributeTypeToFilterValue","attr","type","z","union","number","array","boolean","enumAttr","Array","isArray","enum","length","string","null","FILTER_OPERATORS","buildFiltersSchema","attributes","permittedFields","scalarKeys","getScalarAttributeKeys","never","filtersSchema","lazy","fieldShapes","key","valueSchema","operatorObject","object","Object","fromEntries","map","op","optional","$and","$or","$not","strict","describe","join"],"mappings":";;;;;AAIA;;;IAIO,MAAMA,0BAAAA,GAA6B,CAACC,IAAAA,GAAAA;AACzC,IAAA,OAAQA,KAAKC,IAAI;QACf,KAAK,SAAA;QACL,KAAK,YAAA;QACL,KAAK,SAAA;QACL,KAAK,OAAA;YACH,OAAOC,aAAAA,CAAEC,KAAK,CAAC;AAACD,gBAAAA,aAAAA,CAAEE,MAAM,EAAA;gBAAIF,aAAAA,CAAEG,KAAK,CAACH,aAAAA,CAAEE,MAAM,EAAA;AAAI,aAAA,CAAA;QAClD,KAAK,SAAA;AACH,YAAA,OAAOF,cAAEI,OAAO,EAAA;QAClB,KAAK,aAAA;AAAe,YAAA;AAClB,gBAAA,MAAMC,QAAAA,GAAWP,IAAAA;gBACjB,IAAIQ,KAAAA,CAAMC,OAAO,CAACF,QAAAA,CAASG,IAAI,CAAA,IAAKH,QAAAA,CAASG,IAAI,CAACC,MAAM,GAAG,CAAA,EAAG;oBAC5D,OAAOT,aAAAA,CAAEC,KAAK,CAAC;wBACbD,aAAAA,CAAEQ,IAAI,CAACH,QAAAA,CAASG,IAAI,CAAA;AACpBR,wBAAAA,aAAAA,CAAEG,KAAK,CAACH,aAAAA,CAAEQ,IAAI,CAACH,SAASG,IAAI,CAAA;AAC7B,qBAAA,CAAA;AACH,gBAAA;gBACA,OAAOR,aAAAA,CAAEC,KAAK,CAAC;AAACD,oBAAAA,aAAAA,CAAEU,MAAM,EAAA;oBAAIV,aAAAA,CAAEG,KAAK,CAACH,aAAAA,CAAEU,MAAM,EAAA;AAAI,iBAAA,CAAA;AAClD,YAAA;AACA,QAAA;;YAEE,OAAOV,aAAAA,CAAEC,KAAK,CAAC;AAACD,gBAAAA,aAAAA,CAAEU,MAAM,EAAA;gBAAIV,aAAAA,CAAEG,KAAK,CAACH,aAAAA,CAAEU,MAAM,EAAA,CAAA;AAAKV,gBAAAA,aAAAA,CAAEW,IAAI;AAAG,aAAA,CAAA;AAC9D;AACF;AAEA,4FACO,MAAMC,gBAAAA,GAAmB;AAC9B,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,QAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,cAAA;AACA,IAAA,YAAA;AACA,IAAA,eAAA;AACA,IAAA,aAAA;AACA,IAAA,cAAA;AACA,IAAA,WAAA;AACA,IAAA,YAAA;AACA,IAAA,OAAA;AACA,IAAA;;AAGF;;;;;;;;;;AAUC,IACM,MAAMC,kBAAAA,GAAqB,CAChCC,UAAAA,EACAC,eAAAA,GAAAA;IAEA,MAAMC,UAAAA,GAAaC,kCAAuBH,UAAAA,EAAYC,eAAAA,CAAAA;IAEtD,IAAIC,UAAAA,CAAWP,MAAM,KAAK,CAAA,EAAG;AAC3B,QAAA,OAAOT,cAAEkB,KAAK,EAAA;AAChB,IAAA;;IAGA,MAAMC,aAAAA,GAA8BnB,aAAAA,CAAEoB,IAAI,CAAC,IAAA;AACzC,QAAA,MAAMC,cAA4C,EAAC;QAEnD,KAAK,MAAMC,OAAON,UAAAA,CAAY;YAC5B,MAAMlB,IAAAA,GAAOgB,UAAU,CAACQ,GAAAA,CAAI;AAC5B,YAAA,MAAMC,cAAc1B,0BAAAA,CAA2BC,IAAAA,CAAAA;YAC/C,MAAM0B,cAAAA,GAAiBxB,aAAAA,CAAEyB,MAAM,CAC7BC,MAAAA,CAAOC,WAAW,CAACf,gBAAAA,CAAiBgB,GAAG,CAAC,CAACC,EAAAA,GAAO;AAACA,oBAAAA,EAAAA;AAAIN,oBAAAA,WAAAA,CAAYO,QAAQ;AAAG,iBAAA,CAAA,CAAA,CAAA;;AAG9ET,YAAAA,WAAW,CAACC,GAAAA,CAAI,GAAGtB,aAAAA,CAAEC,KAAK,CAAC;AAACsB,gBAAAA,WAAAA;AAAaC,gBAAAA;AAAe,aAAA,CAAA,CAAEM,QAAQ,EAAA;AACpE,QAAA;QAEA,OAAO9B,aAAAA,CACJyB,MAAM,CAAC;AACNM,YAAAA,IAAAA,EAAM/B,aAAAA,CAAEG,KAAK,CAACgB,aAAAA,CAAAA,CAAeW,QAAQ,EAAA;AACrCE,YAAAA,GAAAA,EAAKhC,aAAAA,CAAEG,KAAK,CAACgB,aAAAA,CAAAA,CAAeW,QAAQ,EAAA;AACpCG,YAAAA,IAAAA,EAAMd,cAAcW,QAAQ,EAAA;AAC5B,YAAA,GAAGT;AACL,SAAA,CAAA,CACCa,MAAM,EAAA;AACX,IAAA,CAAA,CAAA;AAEA,IAAA,OAAOf,cACJW,QAAQ,EAAA,CACRK,QAAQ,CACP,CAAC,gFAAgF,CAAC,GAChF,CAAC,0DAA0D,EAAEnB,UAAAA,CAAWoB,IAAI,CAAC,IAAA,CAAA,CAAM,CAAC,CAAC,CAAA;AAE7F;;;;;;"}
1
+ {"version":3,"file":"filters-schema.js","sources":["../../../../server/src/mcp/schemas/filters-schema.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Schema, Struct } from '@strapi/types';\nimport { getScalarAttributeKeys } from './sort-schema';\n\n/**\n * Maps a scalar Strapi attribute type to the appropriate Zod leaf value schema\n * used inside filter operator objects (e.g. { $eq: <value> }).\n */\nexport const attributeTypeToFilterValue = (attr: Schema.Attribute.AnyAttribute): z.ZodTypeAny => {\n switch (attr.type) {\n case 'integer':\n case 'biginteger':\n case 'decimal':\n case 'float':\n return z.union([z.number(), z.array(z.number())]);\n case 'boolean':\n return z.boolean();\n case 'enumeration': {\n const enumAttr = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(enumAttr.enum) && enumAttr.enum.length > 0) {\n return z.union([\n z.enum(enumAttr.enum as [string, ...string[]]),\n z.array(z.enum(enumAttr.enum as [string, ...string[]])),\n ]);\n }\n return z.union([z.string(), z.array(z.string())]);\n }\n default:\n // string, text, richtext, email, password, uid, date, datetime, time, timestamp\n return z.union([z.string(), z.array(z.string()), z.null()]);\n }\n};\n\n/** All supported Strapi filter operators (excludes the experimental `$jsonSupersetOf`). */\nexport const FILTER_OPERATORS = [\n '$eq',\n '$eqi',\n '$ne',\n '$nei',\n '$in',\n '$notIn',\n '$lt',\n '$lte',\n '$gt',\n '$gte',\n '$between',\n '$contains',\n '$notContains',\n '$containsi',\n '$notContainsi',\n '$startsWith',\n '$startsWithi',\n '$endsWith',\n '$endsWithi',\n '$null',\n '$notNull',\n] as const;\n\n/**\n * Builds a per-content-type recursive filters Zod schema.\n *\n * Shape:\n * - Logical operators: $and, $or accept an array of filter objects.\n * - Logical operator: $not accepts a single filter object.\n * - Field keys (scalar attrs only): accept either a direct value (implicit $eq)\n * or an operator object { $eq, $contains, $gt, … }.\n *\n * If the model has no scalar attributes, the schema is z.never() (filters not allowed).\n */\nexport const buildFiltersSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const scalarKeys = getScalarAttributeKeys(attributes, permittedFields);\n\n if (scalarKeys.length === 0) {\n return z.never();\n }\n\n // Lazy reference for recursion ($and / $or / $not).\n // The getter is memoized: zod's JSON Schema conversion calls `def.getter()` directly for every\n // node that reaches the lazy, bypassing zod's own cache, so an unmemoized getter rebuilds the\n // whole object (fields x operators) many times per conversion.\n let resolvedFiltersObject: z.ZodTypeAny | undefined;\n const filtersSchema: z.ZodTypeAny = z.lazy(() => {\n if (resolvedFiltersObject !== undefined) {\n return resolvedFiltersObject;\n }\n\n const fieldShapes: Record<string, z.ZodTypeAny> = {};\n\n for (const key of scalarKeys) {\n const attr = attributes[key];\n const valueSchema = attributeTypeToFilterValue(attr);\n const operatorObject = z.object(\n Object.fromEntries(FILTER_OPERATORS.map((op) => [op, valueSchema.optional()]))\n );\n // Field accepts either a direct value (implicit $eq) or operator object\n fieldShapes[key] = z.union([valueSchema, operatorObject]).optional();\n }\n\n resolvedFiltersObject = z\n .object({\n $and: z.array(filtersSchema).optional(),\n $or: z.array(filtersSchema).optional(),\n $not: filtersSchema.optional(),\n ...fieldShapes,\n })\n .strict();\n\n return resolvedFiltersObject;\n });\n\n return filtersSchema\n .optional()\n .describe(\n `Filter object. Supports logical operators ($and, $or, $not) and field operators ` +\n `($eq, $ne, $in, $contains, $gt, $lt, etc.). Valid fields: ${scalarKeys.join(', ')}.`\n );\n};\n"],"names":["attributeTypeToFilterValue","attr","type","z","union","number","array","boolean","enumAttr","Array","isArray","enum","length","string","null","FILTER_OPERATORS","buildFiltersSchema","attributes","permittedFields","scalarKeys","getScalarAttributeKeys","never","resolvedFiltersObject","filtersSchema","lazy","undefined","fieldShapes","key","valueSchema","operatorObject","object","Object","fromEntries","map","op","optional","$and","$or","$not","strict","describe","join"],"mappings":"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"}
@@ -77,8 +77,15 @@ import { getScalarAttributeKeys } from './sort-schema.mjs';
77
77
  if (scalarKeys.length === 0) {
78
78
  return z.never();
79
79
  }
80
- // Lazy reference for recursion ($and / $or / $not)
80
+ // Lazy reference for recursion ($and / $or / $not).
81
+ // The getter is memoized: zod's JSON Schema conversion calls `def.getter()` directly for every
82
+ // node that reaches the lazy, bypassing zod's own cache, so an unmemoized getter rebuilds the
83
+ // whole object (fields x operators) many times per conversion.
84
+ let resolvedFiltersObject;
81
85
  const filtersSchema = z.lazy(()=>{
86
+ if (resolvedFiltersObject !== undefined) {
87
+ return resolvedFiltersObject;
88
+ }
82
89
  const fieldShapes = {};
83
90
  for (const key of scalarKeys){
84
91
  const attr = attributes[key];
@@ -93,12 +100,13 @@ import { getScalarAttributeKeys } from './sort-schema.mjs';
93
100
  operatorObject
94
101
  ]).optional();
95
102
  }
96
- return z.object({
103
+ resolvedFiltersObject = z.object({
97
104
  $and: z.array(filtersSchema).optional(),
98
105
  $or: z.array(filtersSchema).optional(),
99
106
  $not: filtersSchema.optional(),
100
107
  ...fieldShapes
101
108
  }).strict();
109
+ return resolvedFiltersObject;
102
110
  });
103
111
  return filtersSchema.optional().describe(`Filter object. Supports logical operators ($and, $or, $not) and field operators ` + `($eq, $ne, $in, $contains, $gt, $lt, etc.). Valid fields: ${scalarKeys.join(', ')}.`);
104
112
  };
@@ -1 +1 @@
1
- {"version":3,"file":"filters-schema.mjs","sources":["../../../../server/src/mcp/schemas/filters-schema.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Schema, Struct } from '@strapi/types';\nimport { getScalarAttributeKeys } from './sort-schema';\n\n/**\n * Maps a scalar Strapi attribute type to the appropriate Zod leaf value schema\n * used inside filter operator objects (e.g. { $eq: <value> }).\n */\nexport const attributeTypeToFilterValue = (attr: Schema.Attribute.AnyAttribute): z.ZodTypeAny => {\n switch (attr.type) {\n case 'integer':\n case 'biginteger':\n case 'decimal':\n case 'float':\n return z.union([z.number(), z.array(z.number())]);\n case 'boolean':\n return z.boolean();\n case 'enumeration': {\n const enumAttr = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(enumAttr.enum) && enumAttr.enum.length > 0) {\n return z.union([\n z.enum(enumAttr.enum as [string, ...string[]]),\n z.array(z.enum(enumAttr.enum as [string, ...string[]])),\n ]);\n }\n return z.union([z.string(), z.array(z.string())]);\n }\n default:\n // string, text, richtext, email, password, uid, date, datetime, time, timestamp\n return z.union([z.string(), z.array(z.string()), z.null()]);\n }\n};\n\n/** All supported Strapi filter operators (excludes the experimental `$jsonSupersetOf`). */\nexport const FILTER_OPERATORS = [\n '$eq',\n '$eqi',\n '$ne',\n '$nei',\n '$in',\n '$notIn',\n '$lt',\n '$lte',\n '$gt',\n '$gte',\n '$between',\n '$contains',\n '$notContains',\n '$containsi',\n '$notContainsi',\n '$startsWith',\n '$startsWithi',\n '$endsWith',\n '$endsWithi',\n '$null',\n '$notNull',\n] as const;\n\n/**\n * Builds a per-content-type recursive filters Zod schema.\n *\n * Shape:\n * - Logical operators: $and, $or accept an array of filter objects.\n * - Logical operator: $not accepts a single filter object.\n * - Field keys (scalar attrs only): accept either a direct value (implicit $eq)\n * or an operator object { $eq, $contains, $gt, … }.\n *\n * If the model has no scalar attributes, the schema is z.never() (filters not allowed).\n */\nexport const buildFiltersSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const scalarKeys = getScalarAttributeKeys(attributes, permittedFields);\n\n if (scalarKeys.length === 0) {\n return z.never();\n }\n\n // Lazy reference for recursion ($and / $or / $not)\n const filtersSchema: z.ZodTypeAny = z.lazy(() => {\n const fieldShapes: Record<string, z.ZodTypeAny> = {};\n\n for (const key of scalarKeys) {\n const attr = attributes[key];\n const valueSchema = attributeTypeToFilterValue(attr);\n const operatorObject = z.object(\n Object.fromEntries(FILTER_OPERATORS.map((op) => [op, valueSchema.optional()]))\n );\n // Field accepts either a direct value (implicit $eq) or operator object\n fieldShapes[key] = z.union([valueSchema, operatorObject]).optional();\n }\n\n return z\n .object({\n $and: z.array(filtersSchema).optional(),\n $or: z.array(filtersSchema).optional(),\n $not: filtersSchema.optional(),\n ...fieldShapes,\n })\n .strict();\n });\n\n return filtersSchema\n .optional()\n .describe(\n `Filter object. Supports logical operators ($and, $or, $not) and field operators ` +\n `($eq, $ne, $in, $contains, $gt, $lt, etc.). Valid fields: ${scalarKeys.join(', ')}.`\n );\n};\n"],"names":["attributeTypeToFilterValue","attr","type","z","union","number","array","boolean","enumAttr","Array","isArray","enum","length","string","null","FILTER_OPERATORS","buildFiltersSchema","attributes","permittedFields","scalarKeys","getScalarAttributeKeys","never","filtersSchema","lazy","fieldShapes","key","valueSchema","operatorObject","object","Object","fromEntries","map","op","optional","$and","$or","$not","strict","describe","join"],"mappings":"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"}
1
+ {"version":3,"file":"filters-schema.mjs","sources":["../../../../server/src/mcp/schemas/filters-schema.ts"],"sourcesContent":["import { z } from '@strapi/utils';\nimport type { Schema, Struct } from '@strapi/types';\nimport { getScalarAttributeKeys } from './sort-schema';\n\n/**\n * Maps a scalar Strapi attribute type to the appropriate Zod leaf value schema\n * used inside filter operator objects (e.g. { $eq: <value> }).\n */\nexport const attributeTypeToFilterValue = (attr: Schema.Attribute.AnyAttribute): z.ZodTypeAny => {\n switch (attr.type) {\n case 'integer':\n case 'biginteger':\n case 'decimal':\n case 'float':\n return z.union([z.number(), z.array(z.number())]);\n case 'boolean':\n return z.boolean();\n case 'enumeration': {\n const enumAttr = attr as Schema.Attribute.Enumeration<string[]>;\n if (Array.isArray(enumAttr.enum) && enumAttr.enum.length > 0) {\n return z.union([\n z.enum(enumAttr.enum as [string, ...string[]]),\n z.array(z.enum(enumAttr.enum as [string, ...string[]])),\n ]);\n }\n return z.union([z.string(), z.array(z.string())]);\n }\n default:\n // string, text, richtext, email, password, uid, date, datetime, time, timestamp\n return z.union([z.string(), z.array(z.string()), z.null()]);\n }\n};\n\n/** All supported Strapi filter operators (excludes the experimental `$jsonSupersetOf`). */\nexport const FILTER_OPERATORS = [\n '$eq',\n '$eqi',\n '$ne',\n '$nei',\n '$in',\n '$notIn',\n '$lt',\n '$lte',\n '$gt',\n '$gte',\n '$between',\n '$contains',\n '$notContains',\n '$containsi',\n '$notContainsi',\n '$startsWith',\n '$startsWithi',\n '$endsWith',\n '$endsWithi',\n '$null',\n '$notNull',\n] as const;\n\n/**\n * Builds a per-content-type recursive filters Zod schema.\n *\n * Shape:\n * - Logical operators: $and, $or accept an array of filter objects.\n * - Logical operator: $not accepts a single filter object.\n * - Field keys (scalar attrs only): accept either a direct value (implicit $eq)\n * or an operator object { $eq, $contains, $gt, … }.\n *\n * If the model has no scalar attributes, the schema is z.never() (filters not allowed).\n */\nexport const buildFiltersSchema = (\n attributes: Struct.SchemaAttributes,\n permittedFields?: Set<string> | null\n): z.ZodTypeAny => {\n const scalarKeys = getScalarAttributeKeys(attributes, permittedFields);\n\n if (scalarKeys.length === 0) {\n return z.never();\n }\n\n // Lazy reference for recursion ($and / $or / $not).\n // The getter is memoized: zod's JSON Schema conversion calls `def.getter()` directly for every\n // node that reaches the lazy, bypassing zod's own cache, so an unmemoized getter rebuilds the\n // whole object (fields x operators) many times per conversion.\n let resolvedFiltersObject: z.ZodTypeAny | undefined;\n const filtersSchema: z.ZodTypeAny = z.lazy(() => {\n if (resolvedFiltersObject !== undefined) {\n return resolvedFiltersObject;\n }\n\n const fieldShapes: Record<string, z.ZodTypeAny> = {};\n\n for (const key of scalarKeys) {\n const attr = attributes[key];\n const valueSchema = attributeTypeToFilterValue(attr);\n const operatorObject = z.object(\n Object.fromEntries(FILTER_OPERATORS.map((op) => [op, valueSchema.optional()]))\n );\n // Field accepts either a direct value (implicit $eq) or operator object\n fieldShapes[key] = z.union([valueSchema, operatorObject]).optional();\n }\n\n resolvedFiltersObject = z\n .object({\n $and: z.array(filtersSchema).optional(),\n $or: z.array(filtersSchema).optional(),\n $not: filtersSchema.optional(),\n ...fieldShapes,\n })\n .strict();\n\n return resolvedFiltersObject;\n });\n\n return filtersSchema\n .optional()\n .describe(\n `Filter object. Supports logical operators ($and, $or, $not) and field operators ` +\n `($eq, $ne, $in, $contains, $gt, $lt, etc.). Valid fields: ${scalarKeys.join(', ')}.`\n );\n};\n"],"names":["attributeTypeToFilterValue","attr","type","z","union","number","array","boolean","enumAttr","Array","isArray","enum","length","string","null","FILTER_OPERATORS","buildFiltersSchema","attributes","permittedFields","scalarKeys","getScalarAttributeKeys","never","resolvedFiltersObject","filtersSchema","lazy","undefined","fieldShapes","key","valueSchema","operatorObject","object","Object","fromEntries","map","op","optional","$and","$or","$not","strict","describe","join"],"mappings":"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"}
@@ -7,7 +7,7 @@ const getPreviewUrlSchema = strapiUtils.z.object({
7
7
  // Will be undefined for single types
8
8
  documentId: strapiUtils.z.string().optional(),
9
9
  locale: strapiUtils.z.string().nullable().optional(),
10
- status: strapiUtils.z.string().optional()
10
+ status: strapiUtils.statusSchema.optional()
11
11
  });
12
12
  const validatePreviewUrl = async (strapi, uid, params)=>{
13
13
  // Validate the request parameters format
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sources":["../../../../../server/src/preview/controllers/validation/preview.ts"],"sourcesContent":["import { pick } from 'lodash';\n\nimport type { Core, UID } from '@strapi/types';\nimport { z, validateZodSchema, errors } from '@strapi/utils';\n\nimport { Preview } from '../../../../../shared/contracts';\nimport type { HandlerParams } from '../../services/preview-config';\n\nconst getPreviewUrlSchema = z.object({\n // Will be undefined for single types\n documentId: z.string().optional(),\n locale: z.string().nullable().optional(),\n status: z.string().optional(),\n});\n\nexport const validatePreviewUrl = async (\n strapi: Core.Strapi,\n uid: UID.ContentType,\n params: Preview.GetPreviewUrl.Request['query']\n): Promise<HandlerParams> => {\n // Validate the request parameters format\n validateZodSchema(getPreviewUrlSchema)(params);\n\n const newParams = pick(params, ['documentId', 'locale', 'status']) as HandlerParams;\n const model = strapi.getModel(uid);\n\n // If it's not a collection type or single type\n if (!model || model.modelType !== 'contentType') {\n throw new errors.ValidationError('Invalid content type');\n }\n\n // Document id is not required for single types\n const isSingleType = model?.kind === 'singleType';\n if (!isSingleType && !params.documentId) {\n throw new errors.ValidationError('documentId is required for Collection Types');\n }\n\n // Fill the documentId if it's a single type\n if (isSingleType) {\n const doc = await strapi.documents(uid).findFirst();\n\n if (!doc) {\n throw new errors.NotFoundError('Document not found');\n }\n\n newParams.documentId = doc?.documentId;\n }\n\n /**\n * If status is not specified, follow the following rules:\n * - D&P disabled: status is considered published\n * - D&P enabled: status is considered draft\n */\n if (!newParams.status) {\n const isDPEnabled = model?.options?.draftAndPublish;\n newParams.status = isDPEnabled ? 'draft' : 'published';\n }\n\n return newParams;\n};\n"],"names":["getPreviewUrlSchema","z","object","documentId","string","optional","locale","nullable","status","validatePreviewUrl","strapi","uid","params","validateZodSchema","newParams","pick","model","getModel","modelType","errors","ValidationError","isSingleType","kind","doc","documents","findFirst","NotFoundError","isDPEnabled","options","draftAndPublish"],"mappings":";;;;;AAQA,MAAMA,mBAAAA,GAAsBC,aAAAA,CAAEC,MAAM,CAAC;;IAEnCC,UAAAA,EAAYF,aAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ,EAAA;AAC/BC,IAAAA,MAAAA,EAAQL,aAAAA,CAAEG,MAAM,EAAA,CAAGG,QAAQ,GAAGF,QAAQ,EAAA;IACtCG,MAAAA,EAAQP,aAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ;AAC7B,CAAA,CAAA;AAEO,MAAMI,kBAAAA,GAAqB,OAChCC,MAAAA,EACAC,GAAAA,EACAC,MAAAA,GAAAA;;AAGAC,IAAAA,6BAAAA,CAAkBb,mBAAAA,CAAAA,CAAqBY,MAAAA,CAAAA;IAEvC,MAAME,SAAAA,GAAYC,OAAKH,MAAAA,EAAQ;AAAC,QAAA,YAAA;AAAc,QAAA,QAAA;AAAU,QAAA;AAAS,KAAA,CAAA;IACjE,MAAMI,KAAAA,GAAQN,MAAAA,CAAOO,QAAQ,CAACN,GAAAA,CAAAA;;AAG9B,IAAA,IAAI,CAACK,KAAAA,IAASA,KAAAA,CAAME,SAAS,KAAK,aAAA,EAAe;QAC/C,MAAM,IAAIC,kBAAAA,CAAOC,eAAe,CAAC,sBAAA,CAAA;AACnC,IAAA;;IAGA,MAAMC,YAAAA,GAAeL,OAAOM,IAAAA,KAAS,YAAA;AACrC,IAAA,IAAI,CAACD,YAAAA,IAAgB,CAACT,MAAAA,CAAOT,UAAU,EAAE;QACvC,MAAM,IAAIgB,kBAAAA,CAAOC,eAAe,CAAC,6CAAA,CAAA;AACnC,IAAA;;AAGA,IAAA,IAAIC,YAAAA,EAAc;AAChB,QAAA,MAAME,MAAM,MAAMb,MAAAA,CAAOc,SAAS,CAACb,KAAKc,SAAS,EAAA;AAEjD,QAAA,IAAI,CAACF,GAAAA,EAAK;YACR,MAAM,IAAIJ,kBAAAA,CAAOO,aAAa,CAAC,oBAAA,CAAA;AACjC,QAAA;QAEAZ,SAAAA,CAAUX,UAAU,GAAGoB,GAAAA,EAAKpB,UAAAA;AAC9B,IAAA;AAEA;;;;AAIC,MACD,IAAI,CAACW,SAAAA,CAAUN,MAAM,EAAE;QACrB,MAAMmB,WAAAA,GAAcX,OAAOY,OAAAA,EAASC,eAAAA;QACpCf,SAAAA,CAAUN,MAAM,GAAGmB,WAAAA,GAAc,OAAA,GAAU,WAAA;AAC7C,IAAA;IAEA,OAAOb,SAAAA;AACT;;;;"}
1
+ {"version":3,"file":"preview.js","sources":["../../../../../server/src/preview/controllers/validation/preview.ts"],"sourcesContent":["import { pick } from 'lodash';\n\nimport type { Core, UID } from '@strapi/types';\nimport { z, validateZodSchema, errors, statusSchema } from '@strapi/utils';\n\nimport { Preview } from '../../../../../shared/contracts';\nimport type { HandlerParams } from '../../services/preview-config';\n\nconst getPreviewUrlSchema = z.object({\n // Will be undefined for single types\n documentId: z.string().optional(),\n locale: z.string().nullable().optional(),\n status: statusSchema.optional(),\n});\n\nexport const validatePreviewUrl = async (\n strapi: Core.Strapi,\n uid: UID.ContentType,\n params: Preview.GetPreviewUrl.Request['query']\n): Promise<HandlerParams> => {\n // Validate the request parameters format\n validateZodSchema(getPreviewUrlSchema)(params);\n\n const newParams = pick(params, ['documentId', 'locale', 'status']) as HandlerParams;\n const model = strapi.getModel(uid);\n\n // If it's not a collection type or single type\n if (!model || model.modelType !== 'contentType') {\n throw new errors.ValidationError('Invalid content type');\n }\n\n // Document id is not required for single types\n const isSingleType = model?.kind === 'singleType';\n if (!isSingleType && !params.documentId) {\n throw new errors.ValidationError('documentId is required for Collection Types');\n }\n\n // Fill the documentId if it's a single type\n if (isSingleType) {\n const doc = await strapi.documents(uid).findFirst();\n\n if (!doc) {\n throw new errors.NotFoundError('Document not found');\n }\n\n newParams.documentId = doc?.documentId;\n }\n\n /**\n * If status is not specified, follow the following rules:\n * - D&P disabled: status is considered published\n * - D&P enabled: status is considered draft\n */\n if (!newParams.status) {\n const isDPEnabled = model?.options?.draftAndPublish;\n newParams.status = isDPEnabled ? 'draft' : 'published';\n }\n\n return newParams;\n};\n"],"names":["getPreviewUrlSchema","z","object","documentId","string","optional","locale","nullable","status","statusSchema","validatePreviewUrl","strapi","uid","params","validateZodSchema","newParams","pick","model","getModel","modelType","errors","ValidationError","isSingleType","kind","doc","documents","findFirst","NotFoundError","isDPEnabled","options","draftAndPublish"],"mappings":";;;;;AAQA,MAAMA,mBAAAA,GAAsBC,aAAAA,CAAEC,MAAM,CAAC;;IAEnCC,UAAAA,EAAYF,aAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ,EAAA;AAC/BC,IAAAA,MAAAA,EAAQL,aAAAA,CAAEG,MAAM,EAAA,CAAGG,QAAQ,GAAGF,QAAQ,EAAA;AACtCG,IAAAA,MAAAA,EAAQC,yBAAaJ,QAAQ;AAC/B,CAAA,CAAA;AAEO,MAAMK,kBAAAA,GAAqB,OAChCC,MAAAA,EACAC,GAAAA,EACAC,MAAAA,GAAAA;;AAGAC,IAAAA,6BAAAA,CAAkBd,mBAAAA,CAAAA,CAAqBa,MAAAA,CAAAA;IAEvC,MAAME,SAAAA,GAAYC,OAAKH,MAAAA,EAAQ;AAAC,QAAA,YAAA;AAAc,QAAA,QAAA;AAAU,QAAA;AAAS,KAAA,CAAA;IACjE,MAAMI,KAAAA,GAAQN,MAAAA,CAAOO,QAAQ,CAACN,GAAAA,CAAAA;;AAG9B,IAAA,IAAI,CAACK,KAAAA,IAASA,KAAAA,CAAME,SAAS,KAAK,aAAA,EAAe;QAC/C,MAAM,IAAIC,kBAAAA,CAAOC,eAAe,CAAC,sBAAA,CAAA;AACnC,IAAA;;IAGA,MAAMC,YAAAA,GAAeL,OAAOM,IAAAA,KAAS,YAAA;AACrC,IAAA,IAAI,CAACD,YAAAA,IAAgB,CAACT,MAAAA,CAAOV,UAAU,EAAE;QACvC,MAAM,IAAIiB,kBAAAA,CAAOC,eAAe,CAAC,6CAAA,CAAA;AACnC,IAAA;;AAGA,IAAA,IAAIC,YAAAA,EAAc;AAChB,QAAA,MAAME,MAAM,MAAMb,MAAAA,CAAOc,SAAS,CAACb,KAAKc,SAAS,EAAA;AAEjD,QAAA,IAAI,CAACF,GAAAA,EAAK;YACR,MAAM,IAAIJ,kBAAAA,CAAOO,aAAa,CAAC,oBAAA,CAAA;AACjC,QAAA;QAEAZ,SAAAA,CAAUZ,UAAU,GAAGqB,GAAAA,EAAKrB,UAAAA;AAC9B,IAAA;AAEA;;;;AAIC,MACD,IAAI,CAACY,SAAAA,CAAUP,MAAM,EAAE;QACrB,MAAMoB,WAAAA,GAAcX,OAAOY,OAAAA,EAASC,eAAAA;QACpCf,SAAAA,CAAUP,MAAM,GAAGoB,WAAAA,GAAc,OAAA,GAAU,WAAA;AAC7C,IAAA;IAEA,OAAOb,SAAAA;AACT;;;;"}
@@ -1,11 +1,11 @@
1
1
  import { pick } from 'lodash';
2
- import { z, validateZodSchema, errors } from '@strapi/utils';
2
+ import { z, statusSchema, validateZodSchema, errors } from '@strapi/utils';
3
3
 
4
4
  const getPreviewUrlSchema = z.object({
5
5
  // Will be undefined for single types
6
6
  documentId: z.string().optional(),
7
7
  locale: z.string().nullable().optional(),
8
- status: z.string().optional()
8
+ status: statusSchema.optional()
9
9
  });
10
10
  const validatePreviewUrl = async (strapi, uid, params)=>{
11
11
  // Validate the request parameters format
@@ -1 +1 @@
1
- {"version":3,"file":"preview.mjs","sources":["../../../../../server/src/preview/controllers/validation/preview.ts"],"sourcesContent":["import { pick } from 'lodash';\n\nimport type { Core, UID } from '@strapi/types';\nimport { z, validateZodSchema, errors } from '@strapi/utils';\n\nimport { Preview } from '../../../../../shared/contracts';\nimport type { HandlerParams } from '../../services/preview-config';\n\nconst getPreviewUrlSchema = z.object({\n // Will be undefined for single types\n documentId: z.string().optional(),\n locale: z.string().nullable().optional(),\n status: z.string().optional(),\n});\n\nexport const validatePreviewUrl = async (\n strapi: Core.Strapi,\n uid: UID.ContentType,\n params: Preview.GetPreviewUrl.Request['query']\n): Promise<HandlerParams> => {\n // Validate the request parameters format\n validateZodSchema(getPreviewUrlSchema)(params);\n\n const newParams = pick(params, ['documentId', 'locale', 'status']) as HandlerParams;\n const model = strapi.getModel(uid);\n\n // If it's not a collection type or single type\n if (!model || model.modelType !== 'contentType') {\n throw new errors.ValidationError('Invalid content type');\n }\n\n // Document id is not required for single types\n const isSingleType = model?.kind === 'singleType';\n if (!isSingleType && !params.documentId) {\n throw new errors.ValidationError('documentId is required for Collection Types');\n }\n\n // Fill the documentId if it's a single type\n if (isSingleType) {\n const doc = await strapi.documents(uid).findFirst();\n\n if (!doc) {\n throw new errors.NotFoundError('Document not found');\n }\n\n newParams.documentId = doc?.documentId;\n }\n\n /**\n * If status is not specified, follow the following rules:\n * - D&P disabled: status is considered published\n * - D&P enabled: status is considered draft\n */\n if (!newParams.status) {\n const isDPEnabled = model?.options?.draftAndPublish;\n newParams.status = isDPEnabled ? 'draft' : 'published';\n }\n\n return newParams;\n};\n"],"names":["getPreviewUrlSchema","z","object","documentId","string","optional","locale","nullable","status","validatePreviewUrl","strapi","uid","params","validateZodSchema","newParams","pick","model","getModel","modelType","errors","ValidationError","isSingleType","kind","doc","documents","findFirst","NotFoundError","isDPEnabled","options","draftAndPublish"],"mappings":";;;AAQA,MAAMA,mBAAAA,GAAsBC,CAAAA,CAAEC,MAAM,CAAC;;IAEnCC,UAAAA,EAAYF,CAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ,EAAA;AAC/BC,IAAAA,MAAAA,EAAQL,CAAAA,CAAEG,MAAM,EAAA,CAAGG,QAAQ,GAAGF,QAAQ,EAAA;IACtCG,MAAAA,EAAQP,CAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ;AAC7B,CAAA,CAAA;AAEO,MAAMI,kBAAAA,GAAqB,OAChCC,MAAAA,EACAC,GAAAA,EACAC,MAAAA,GAAAA;;AAGAC,IAAAA,iBAAAA,CAAkBb,mBAAAA,CAAAA,CAAqBY,MAAAA,CAAAA;IAEvC,MAAME,SAAAA,GAAYC,KAAKH,MAAAA,EAAQ;AAAC,QAAA,YAAA;AAAc,QAAA,QAAA;AAAU,QAAA;AAAS,KAAA,CAAA;IACjE,MAAMI,KAAAA,GAAQN,MAAAA,CAAOO,QAAQ,CAACN,GAAAA,CAAAA;;AAG9B,IAAA,IAAI,CAACK,KAAAA,IAASA,KAAAA,CAAME,SAAS,KAAK,aAAA,EAAe;QAC/C,MAAM,IAAIC,MAAAA,CAAOC,eAAe,CAAC,sBAAA,CAAA;AACnC,IAAA;;IAGA,MAAMC,YAAAA,GAAeL,OAAOM,IAAAA,KAAS,YAAA;AACrC,IAAA,IAAI,CAACD,YAAAA,IAAgB,CAACT,MAAAA,CAAOT,UAAU,EAAE;QACvC,MAAM,IAAIgB,MAAAA,CAAOC,eAAe,CAAC,6CAAA,CAAA;AACnC,IAAA;;AAGA,IAAA,IAAIC,YAAAA,EAAc;AAChB,QAAA,MAAME,MAAM,MAAMb,MAAAA,CAAOc,SAAS,CAACb,KAAKc,SAAS,EAAA;AAEjD,QAAA,IAAI,CAACF,GAAAA,EAAK;YACR,MAAM,IAAIJ,MAAAA,CAAOO,aAAa,CAAC,oBAAA,CAAA;AACjC,QAAA;QAEAZ,SAAAA,CAAUX,UAAU,GAAGoB,GAAAA,EAAKpB,UAAAA;AAC9B,IAAA;AAEA;;;;AAIC,MACD,IAAI,CAACW,SAAAA,CAAUN,MAAM,EAAE;QACrB,MAAMmB,WAAAA,GAAcX,OAAOY,OAAAA,EAASC,eAAAA;QACpCf,SAAAA,CAAUN,MAAM,GAAGmB,WAAAA,GAAc,OAAA,GAAU,WAAA;AAC7C,IAAA;IAEA,OAAOb,SAAAA;AACT;;;;"}
1
+ {"version":3,"file":"preview.mjs","sources":["../../../../../server/src/preview/controllers/validation/preview.ts"],"sourcesContent":["import { pick } from 'lodash';\n\nimport type { Core, UID } from '@strapi/types';\nimport { z, validateZodSchema, errors, statusSchema } from '@strapi/utils';\n\nimport { Preview } from '../../../../../shared/contracts';\nimport type { HandlerParams } from '../../services/preview-config';\n\nconst getPreviewUrlSchema = z.object({\n // Will be undefined for single types\n documentId: z.string().optional(),\n locale: z.string().nullable().optional(),\n status: statusSchema.optional(),\n});\n\nexport const validatePreviewUrl = async (\n strapi: Core.Strapi,\n uid: UID.ContentType,\n params: Preview.GetPreviewUrl.Request['query']\n): Promise<HandlerParams> => {\n // Validate the request parameters format\n validateZodSchema(getPreviewUrlSchema)(params);\n\n const newParams = pick(params, ['documentId', 'locale', 'status']) as HandlerParams;\n const model = strapi.getModel(uid);\n\n // If it's not a collection type or single type\n if (!model || model.modelType !== 'contentType') {\n throw new errors.ValidationError('Invalid content type');\n }\n\n // Document id is not required for single types\n const isSingleType = model?.kind === 'singleType';\n if (!isSingleType && !params.documentId) {\n throw new errors.ValidationError('documentId is required for Collection Types');\n }\n\n // Fill the documentId if it's a single type\n if (isSingleType) {\n const doc = await strapi.documents(uid).findFirst();\n\n if (!doc) {\n throw new errors.NotFoundError('Document not found');\n }\n\n newParams.documentId = doc?.documentId;\n }\n\n /**\n * If status is not specified, follow the following rules:\n * - D&P disabled: status is considered published\n * - D&P enabled: status is considered draft\n */\n if (!newParams.status) {\n const isDPEnabled = model?.options?.draftAndPublish;\n newParams.status = isDPEnabled ? 'draft' : 'published';\n }\n\n return newParams;\n};\n"],"names":["getPreviewUrlSchema","z","object","documentId","string","optional","locale","nullable","status","statusSchema","validatePreviewUrl","strapi","uid","params","validateZodSchema","newParams","pick","model","getModel","modelType","errors","ValidationError","isSingleType","kind","doc","documents","findFirst","NotFoundError","isDPEnabled","options","draftAndPublish"],"mappings":";;;AAQA,MAAMA,mBAAAA,GAAsBC,CAAAA,CAAEC,MAAM,CAAC;;IAEnCC,UAAAA,EAAYF,CAAAA,CAAEG,MAAM,EAAA,CAAGC,QAAQ,EAAA;AAC/BC,IAAAA,MAAAA,EAAQL,CAAAA,CAAEG,MAAM,EAAA,CAAGG,QAAQ,GAAGF,QAAQ,EAAA;AACtCG,IAAAA,MAAAA,EAAQC,aAAaJ,QAAQ;AAC/B,CAAA,CAAA;AAEO,MAAMK,kBAAAA,GAAqB,OAChCC,MAAAA,EACAC,GAAAA,EACAC,MAAAA,GAAAA;;AAGAC,IAAAA,iBAAAA,CAAkBd,mBAAAA,CAAAA,CAAqBa,MAAAA,CAAAA;IAEvC,MAAME,SAAAA,GAAYC,KAAKH,MAAAA,EAAQ;AAAC,QAAA,YAAA;AAAc,QAAA,QAAA;AAAU,QAAA;AAAS,KAAA,CAAA;IACjE,MAAMI,KAAAA,GAAQN,MAAAA,CAAOO,QAAQ,CAACN,GAAAA,CAAAA;;AAG9B,IAAA,IAAI,CAACK,KAAAA,IAASA,KAAAA,CAAME,SAAS,KAAK,aAAA,EAAe;QAC/C,MAAM,IAAIC,MAAAA,CAAOC,eAAe,CAAC,sBAAA,CAAA;AACnC,IAAA;;IAGA,MAAMC,YAAAA,GAAeL,OAAOM,IAAAA,KAAS,YAAA;AACrC,IAAA,IAAI,CAACD,YAAAA,IAAgB,CAACT,MAAAA,CAAOV,UAAU,EAAE;QACvC,MAAM,IAAIiB,MAAAA,CAAOC,eAAe,CAAC,6CAAA,CAAA;AACnC,IAAA;;AAGA,IAAA,IAAIC,YAAAA,EAAc;AAChB,QAAA,MAAME,MAAM,MAAMb,MAAAA,CAAOc,SAAS,CAACb,KAAKc,SAAS,EAAA;AAEjD,QAAA,IAAI,CAACF,GAAAA,EAAK;YACR,MAAM,IAAIJ,MAAAA,CAAOO,aAAa,CAAC,oBAAA,CAAA;AACjC,QAAA;QAEAZ,SAAAA,CAAUZ,UAAU,GAAGqB,GAAAA,EAAKrB,UAAAA;AAC9B,IAAA;AAEA;;;;AAIC,MACD,IAAI,CAACY,SAAAA,CAAUP,MAAM,EAAE;QACrB,MAAMoB,WAAAA,GAAcX,OAAOY,OAAAA,EAASC,eAAAA;QACpCf,SAAAA,CAAUP,MAAM,GAAGoB,WAAAA,GAAc,OAAA,GAAU,WAAA;AAC7C,IAAA;IAEA,OAAOb,SAAAA;AACT;;;;"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  var index = require('./history/index.js');
4
4
  var index$1 = require('./preview/index.js');
5
+ var index$2 = require('./custom-order/index.js');
5
6
  var renameFields = require('./services/configuration/rename-fields.js');
6
7
 
7
8
  const register = async ({ strapi })=>{
@@ -16,6 +17,9 @@ const register = async ({ strapi })=>{
16
17
  await index$1.register?.({
17
18
  strapi
18
19
  });
20
+ await index$2.register?.({
21
+ strapi
22
+ });
19
23
  };
20
24
 
21
25
  module.exports = register;
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport history from './history';\nimport preview from './preview';\nimport { createContentManagerConfigurationRenamer } from './services/configuration/rename-fields';\n\nconst register: Plugin.LoadedPlugin['register'] = async ({ strapi }) => {\n // Before user migrations run, so a generated rename migration can rewrite the\n // saved layouts and leave the old-to-new map for each admin's browser.\n strapi.db.schema.registerAttributeRenameHandler(\n createContentManagerConfigurationRenamer({ strapi })\n );\n\n await history.register?.({ strapi });\n await preview.register?.({ strapi });\n};\n\nexport default register;\n"],"names":["register","strapi","db","schema","registerAttributeRenameHandler","createContentManagerConfigurationRenamer","history","preview"],"mappings":";;;;;;AAKA,MAAMA,QAAAA,GAA4C,OAAO,EAAEC,MAAM,EAAE,GAAA;;;AAGjEA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,MAAM,CAACC,8BAA8B,CAC7CC,qDAAAA,CAAyC;AAAEJ,QAAAA;AAAO,KAAA,CAAA,CAAA;IAGpD,MAAMK,KAAAA,CAAQN,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAClC,MAAMM,OAAAA,CAAQP,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;AACpC;;;;"}
1
+ {"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport history from './history';\nimport preview from './preview';\nimport customOrder from './custom-order';\nimport { createContentManagerConfigurationRenamer } from './services/configuration/rename-fields';\n\nconst register: Plugin.LoadedPlugin['register'] = async ({ strapi }) => {\n // Before user migrations run, so a generated rename migration can rewrite the\n // saved layouts and leave the old-to-new map for each admin's browser.\n strapi.db.schema.registerAttributeRenameHandler(\n createContentManagerConfigurationRenamer({ strapi })\n );\n\n await history.register?.({ strapi });\n await preview.register?.({ strapi });\n await customOrder.register?.({ strapi });\n};\n\nexport default register;\n"],"names":["register","strapi","db","schema","registerAttributeRenameHandler","createContentManagerConfigurationRenamer","history","preview","customOrder"],"mappings":";;;;;;;AAMA,MAAMA,QAAAA,GAA4C,OAAO,EAAEC,MAAM,EAAE,GAAA;;;AAGjEA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,MAAM,CAACC,8BAA8B,CAC7CC,qDAAAA,CAAyC;AAAEJ,QAAAA;AAAO,KAAA,CAAA,CAAA;IAGpD,MAAMK,KAAAA,CAAQN,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAClC,MAAMM,OAAAA,CAAQP,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAClC,MAAMO,OAAAA,CAAYR,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;AACxC;;;;"}
@@ -1,5 +1,6 @@
1
1
  import history from './history/index.mjs';
2
2
  import preview from './preview/index.mjs';
3
+ import feature from './custom-order/index.mjs';
3
4
  import { createContentManagerConfigurationRenamer } from './services/configuration/rename-fields.mjs';
4
5
 
5
6
  const register = async ({ strapi })=>{
@@ -14,6 +15,9 @@ const register = async ({ strapi })=>{
14
15
  await preview.register?.({
15
16
  strapi
16
17
  });
18
+ await feature.register?.({
19
+ strapi
20
+ });
17
21
  };
18
22
 
19
23
  export { register as default };
@@ -1 +1 @@
1
- {"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport history from './history';\nimport preview from './preview';\nimport { createContentManagerConfigurationRenamer } from './services/configuration/rename-fields';\n\nconst register: Plugin.LoadedPlugin['register'] = async ({ strapi }) => {\n // Before user migrations run, so a generated rename migration can rewrite the\n // saved layouts and leave the old-to-new map for each admin's browser.\n strapi.db.schema.registerAttributeRenameHandler(\n createContentManagerConfigurationRenamer({ strapi })\n );\n\n await history.register?.({ strapi });\n await preview.register?.({ strapi });\n};\n\nexport default register;\n"],"names":["register","strapi","db","schema","registerAttributeRenameHandler","createContentManagerConfigurationRenamer","history","preview"],"mappings":";;;;AAKA,MAAMA,QAAAA,GAA4C,OAAO,EAAEC,MAAM,EAAE,GAAA;;;AAGjEA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,MAAM,CAACC,8BAA8B,CAC7CC,wCAAAA,CAAyC;AAAEJ,QAAAA;AAAO,KAAA,CAAA,CAAA;IAGpD,MAAMK,OAAAA,CAAQN,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAClC,MAAMM,OAAAA,CAAQP,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;AACpC;;;;"}
1
+ {"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import type { Plugin } from '@strapi/types';\nimport history from './history';\nimport preview from './preview';\nimport customOrder from './custom-order';\nimport { createContentManagerConfigurationRenamer } from './services/configuration/rename-fields';\n\nconst register: Plugin.LoadedPlugin['register'] = async ({ strapi }) => {\n // Before user migrations run, so a generated rename migration can rewrite the\n // saved layouts and leave the old-to-new map for each admin's browser.\n strapi.db.schema.registerAttributeRenameHandler(\n createContentManagerConfigurationRenamer({ strapi })\n );\n\n await history.register?.({ strapi });\n await preview.register?.({ strapi });\n await customOrder.register?.({ strapi });\n};\n\nexport default register;\n"],"names":["register","strapi","db","schema","registerAttributeRenameHandler","createContentManagerConfigurationRenamer","history","preview","customOrder"],"mappings":";;;;;AAMA,MAAMA,QAAAA,GAA4C,OAAO,EAAEC,MAAM,EAAE,GAAA;;;AAGjEA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,MAAM,CAACC,8BAA8B,CAC7CC,wCAAAA,CAAyC;AAAEJ,QAAAA;AAAO,KAAA,CAAA,CAAA;IAGpD,MAAMK,OAAAA,CAAQN,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAClC,MAAMM,OAAAA,CAAQP,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;IAClC,MAAMO,OAAAA,CAAYR,QAAQ,GAAG;AAAEC,QAAAA;AAAO,KAAA,CAAA;AACxC;;;;"}
@@ -2,12 +2,14 @@
2
2
 
3
3
  var admin = require('./admin.js');
4
4
  var index = require('../history/index.js');
5
- var index$2 = require('../preview/index.js');
5
+ var index$3 = require('../preview/index.js');
6
6
  var index$1 = require('../homepage/index.js');
7
+ var index$2 = require('../custom-order/index.js');
7
8
 
8
9
  var routes = {
9
10
  admin,
10
11
  ...index.routes ? index.routes : {},
12
+ ...index$3.routes ? index$3.routes : {},
11
13
  ...index$2.routes ? index$2.routes : {},
12
14
  ...index$1.routes
13
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../server/src/routes/index.ts"],"sourcesContent":["import admin from './admin';\nimport history from '../history';\nimport preview from '../preview';\nimport homepage from '../homepage';\n\nexport default {\n admin,\n ...(history.routes ? history.routes : {}),\n ...(preview.routes ? preview.routes : {}),\n ...homepage.routes,\n};\n"],"names":["admin","history","routes","preview","homepage"],"mappings":";;;;;;;AAKA,aAAe;AACbA,IAAAA,KAAAA;AACA,IAAA,GAAIC,MAAQC,MAAM,GAAGD,MAAQC,MAAM,GAAG,EAAE;AACxC,IAAA,GAAIC,QAAQD,MAAM,GAAGC,QAAQD,MAAM,GAAG,EAAE;AACxC,IAAA,GAAGE,QAASF;AACd,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/routes/index.ts"],"sourcesContent":["import admin from './admin';\nimport history from '../history';\nimport preview from '../preview';\nimport homepage from '../homepage';\nimport customOrder from '../custom-order';\n\nexport default {\n admin,\n ...(history.routes ? history.routes : {}),\n ...(preview.routes ? preview.routes : {}),\n ...(customOrder.routes ? customOrder.routes : {}),\n ...homepage.routes,\n};\n"],"names":["admin","history","routes","preview","customOrder","homepage"],"mappings":";;;;;;;;AAMA,aAAe;AACbA,IAAAA,KAAAA;AACA,IAAA,GAAIC,MAAQC,MAAM,GAAGD,MAAQC,MAAM,GAAG,EAAE;AACxC,IAAA,GAAIC,QAAQD,MAAM,GAAGC,QAAQD,MAAM,GAAG,EAAE;AACxC,IAAA,GAAIE,QAAYF,MAAM,GAAGE,QAAYF,MAAM,GAAG,EAAE;AAChD,IAAA,GAAGG,QAASH;AACd,CAAA;;;;"}
@@ -2,11 +2,13 @@ import admin from './admin.mjs';
2
2
  import history from '../history/index.mjs';
3
3
  import preview from '../preview/index.mjs';
4
4
  import homepage from '../homepage/index.mjs';
5
+ import feature from '../custom-order/index.mjs';
5
6
 
6
7
  var routes = {
7
8
  admin,
8
9
  ...history.routes ? history.routes : {},
9
10
  ...preview.routes ? preview.routes : {},
11
+ ...feature.routes ? feature.routes : {},
10
12
  ...homepage.routes
11
13
  };
12
14
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../server/src/routes/index.ts"],"sourcesContent":["import admin from './admin';\nimport history from '../history';\nimport preview from '../preview';\nimport homepage from '../homepage';\n\nexport default {\n admin,\n ...(history.routes ? history.routes : {}),\n ...(preview.routes ? preview.routes : {}),\n ...homepage.routes,\n};\n"],"names":["admin","history","routes","preview","homepage"],"mappings":";;;;;AAKA,aAAe;AACbA,IAAAA,KAAAA;AACA,IAAA,GAAIC,QAAQC,MAAM,GAAGD,QAAQC,MAAM,GAAG,EAAE;AACxC,IAAA,GAAIC,QAAQD,MAAM,GAAGC,QAAQD,MAAM,GAAG,EAAE;AACxC,IAAA,GAAGE,SAASF;AACd,CAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/routes/index.ts"],"sourcesContent":["import admin from './admin';\nimport history from '../history';\nimport preview from '../preview';\nimport homepage from '../homepage';\nimport customOrder from '../custom-order';\n\nexport default {\n admin,\n ...(history.routes ? history.routes : {}),\n ...(preview.routes ? preview.routes : {}),\n ...(customOrder.routes ? customOrder.routes : {}),\n ...homepage.routes,\n};\n"],"names":["admin","history","routes","preview","customOrder","homepage"],"mappings":";;;;;;AAMA,aAAe;AACbA,IAAAA,KAAAA;AACA,IAAA,GAAIC,QAAQC,MAAM,GAAGD,QAAQC,MAAM,GAAG,EAAE;AACxC,IAAA,GAAIC,QAAQD,MAAM,GAAGC,QAAQD,MAAM,GAAG,EAAE;AACxC,IAAA,GAAIE,QAAYF,MAAM,GAAGE,QAAYF,MAAM,GAAG,EAAE;AAChD,IAAA,GAAGG,SAASH;AACd,CAAA;;;;"}
@@ -30,10 +30,10 @@ const service = ({ strapi: strapi1 })=>({
30
30
  ({ isDisplayed })=>isDisplayed === true);
31
31
  },
32
32
  findContentTypesByKind (kind) {
33
- if (!kind) {
33
+ if (kind === undefined || kind === null) {
34
34
  return this.findAllContentTypes();
35
35
  }
36
- // @ts-expect-error TODO when adding types
36
+ // @ts-expect-error should be resolved from data-mapper types
37
37
  return this.findAllContentTypes().filter(strapiUtils.contentTypes.isKind(kind));
38
38
  },
39
39
  async findConfiguration (contentType) {
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.js","sources":["../../../server/src/services/content-types.ts"],"sourcesContent":["import { mapValues } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport type { UID, Struct, Core } from '@strapi/types';\n\nimport type { ConfigurationUpdate } from './configuration';\n\nimport { getService } from '../utils';\nimport storeUtils from './utils/store';\nimport createConfigurationService from './configuration';\n\nconst configurationService = createConfigurationService({\n storeUtils,\n prefix: 'content_types',\n getModels() {\n const { toContentManagerModel } = getService('data-mapper');\n\n return mapValues(strapi.contentTypes, (value) => toContentManagerModel(value));\n },\n});\n\nconst service = ({ strapi }: { strapi: Core.Strapi }) => ({\n findAllContentTypes() {\n const { toContentManagerModel } = getService('data-mapper');\n\n return Object.values(strapi.contentTypes).map(toContentManagerModel);\n },\n\n findContentType(uid: UID.ContentType) {\n const { toContentManagerModel } = getService('data-mapper');\n\n const contentType = strapi.contentTypes[uid];\n\n return contentType == null ? contentType : toContentManagerModel(contentType);\n },\n\n findDisplayedContentTypes() {\n return this.findAllContentTypes().filter(\n // TODO\n // @ts-expect-error should be resolved from data-mapper types\n ({ isDisplayed }: { isDisplayed: boolean }) => isDisplayed === true\n );\n },\n\n findContentTypesByKind(kind: { kind: Struct.ContentTypeKind | undefined }) {\n if (!kind) {\n return this.findAllContentTypes();\n }\n\n // @ts-expect-error TODO when adding types\n return this.findAllContentTypes().filter(contentTypesUtils.isKind(kind));\n },\n\n async findConfiguration(contentType: Struct.ContentTypeSchema) {\n const configuration = await configurationService.getConfiguration(contentType.uid);\n\n return {\n uid: contentType.uid,\n ...configuration,\n };\n },\n\n async updateConfiguration(\n contentType: Struct.ContentTypeSchema,\n newConfiguration: ConfigurationUpdate\n ) {\n await configurationService.setConfiguration(contentType.uid, newConfiguration);\n\n return this.findConfiguration(contentType);\n },\n\n findComponentsConfigurations(contentType: Struct.ContentTypeSchema) {\n // delegate to componentService\n return getService('components').findComponentsConfigurations(contentType);\n },\n\n syncConfigurations() {\n return configurationService.syncConfigurations();\n },\n});\n\nexport default service;\n"],"names":["configurationService","createConfigurationService","storeUtils","prefix","getModels","toContentManagerModel","getService","mapValues","strapi","contentTypes","value","service","findAllContentTypes","Object","values","map","findContentType","uid","contentType","findDisplayedContentTypes","filter","isDisplayed","findContentTypesByKind","kind","contentTypesUtils","isKind","findConfiguration","configuration","getConfiguration","updateConfiguration","newConfiguration","setConfiguration","findComponentsConfigurations","syncConfigurations"],"mappings":";;;;;;;;AAYA,MAAMA,uBAAuBC,aAAAA,CAA2B;AACtDC,gBAAAA,KAAAA;IACAC,MAAAA,EAAQ,eAAA;AACRC,IAAAA,SAAAA,CAAAA,GAAAA;AACE,QAAA,MAAM,EAAEC,qBAAqB,EAAE,GAAGC,gBAAAA,CAAW,aAAA,CAAA;AAE7C,QAAA,OAAOC,YAAUC,MAAAA,CAAOC,YAAY,EAAE,CAACC,QAAUL,qBAAAA,CAAsBK,KAAAA,CAAAA,CAAAA;AACzE,IAAA;AACF,CAAA,CAAA;AAEA,MAAMC,UAAU,CAAC,EAAEH,QAAAA,OAAM,EAA2B,IAAM;AACxDI,QAAAA,mBAAAA,CAAAA,GAAAA;AACE,YAAA,MAAM,EAAEP,qBAAqB,EAAE,GAAGC,gBAAAA,CAAW,aAAA,CAAA;AAE7C,YAAA,OAAOO,OAAOC,MAAM,CAACN,QAAOC,YAAY,CAAA,CAAEM,GAAG,CAACV,qBAAAA,CAAAA;AAChD,QAAA,CAAA;AAEAW,QAAAA,eAAAA,CAAAA,CAAgBC,GAAoB,EAAA;AAClC,YAAA,MAAM,EAAEZ,qBAAqB,EAAE,GAAGC,gBAAAA,CAAW,aAAA,CAAA;AAE7C,YAAA,MAAMY,WAAAA,GAAcV,OAAAA,CAAOC,YAAY,CAACQ,GAAAA,CAAI;YAE5C,OAAOC,WAAAA,IAAe,IAAA,GAAOA,WAAAA,GAAcb,qBAAAA,CAAsBa,WAAAA,CAAAA;AACnE,QAAA,CAAA;AAEAC,QAAAA,yBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAO,IAAI,CAACP,mBAAmB,EAAA,CAAGQ,MAAM;;AAGtC,YAAA,CAAC,EAAEC,WAAW,EAA4B,GAAKA,WAAAA,KAAgB,IAAA,CAAA;AAEnE,QAAA,CAAA;AAEAC,QAAAA,sBAAAA,CAAAA,CAAuBC,IAAkD,EAAA;AACvE,YAAA,IAAI,CAACA,IAAAA,EAAM;gBACT,OAAO,IAAI,CAACX,mBAAmB,EAAA;AACjC,YAAA;;YAGA,OAAO,IAAI,CAACA,mBAAmB,EAAA,CAAGQ,MAAM,CAACI,wBAAAA,CAAkBC,MAAM,CAACF,IAAAA,CAAAA,CAAAA;AACpE,QAAA,CAAA;AAEA,QAAA,MAAMG,mBAAkBR,WAAqC,EAAA;AAC3D,YAAA,MAAMS,gBAAgB,MAAM3B,oBAAAA,CAAqB4B,gBAAgB,CAACV,YAAYD,GAAG,CAAA;YAEjF,OAAO;AACLA,gBAAAA,GAAAA,EAAKC,YAAYD,GAAG;AACpB,gBAAA,GAAGU;AACL,aAAA;AACF,QAAA,CAAA;QAEA,MAAME,mBAAAA,CAAAA,CACJX,WAAqC,EACrCY,gBAAqC,EAAA;AAErC,YAAA,MAAM9B,oBAAAA,CAAqB+B,gBAAgB,CAACb,WAAAA,CAAYD,GAAG,EAAEa,gBAAAA,CAAAA;YAE7D,OAAO,IAAI,CAACJ,iBAAiB,CAACR,WAAAA,CAAAA;AAChC,QAAA,CAAA;AAEAc,QAAAA,4BAAAA,CAAAA,CAA6Bd,WAAqC,EAAA;;YAEhE,OAAOZ,gBAAAA,CAAW,YAAA,CAAA,CAAc0B,4BAA4B,CAACd,WAAAA,CAAAA;AAC/D,QAAA,CAAA;AAEAe,QAAAA,kBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOjC,qBAAqBiC,kBAAkB,EAAA;AAChD,QAAA;KACF;;;;"}
1
+ {"version":3,"file":"content-types.js","sources":["../../../server/src/services/content-types.ts"],"sourcesContent":["import { mapValues } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport type { UID, Struct, Core } from '@strapi/types';\n\nimport type { ConfigurationUpdate } from './configuration';\n\nimport { getService } from '../utils';\nimport storeUtils from './utils/store';\nimport createConfigurationService from './configuration';\n\nconst configurationService = createConfigurationService({\n storeUtils,\n prefix: 'content_types',\n getModels() {\n const { toContentManagerModel } = getService('data-mapper');\n\n return mapValues(strapi.contentTypes, (value) => toContentManagerModel(value));\n },\n});\n\nconst service = ({ strapi }: { strapi: Core.Strapi }) => ({\n findAllContentTypes() {\n const { toContentManagerModel } = getService('data-mapper');\n\n return Object.values(strapi.contentTypes).map(toContentManagerModel);\n },\n\n findContentType(uid: UID.ContentType) {\n const { toContentManagerModel } = getService('data-mapper');\n\n const contentType = strapi.contentTypes[uid];\n\n return contentType == null ? contentType : toContentManagerModel(contentType);\n },\n\n findDisplayedContentTypes() {\n return this.findAllContentTypes().filter(\n // TODO\n // @ts-expect-error should be resolved from data-mapper types\n ({ isDisplayed }: { isDisplayed: boolean }) => isDisplayed === true\n );\n },\n\n findContentTypesByKind(kind: Struct.ContentTypeKind | null | undefined) {\n if (kind === undefined || kind === null) {\n return this.findAllContentTypes();\n }\n\n // @ts-expect-error should be resolved from data-mapper types\n return this.findAllContentTypes().filter(contentTypesUtils.isKind(kind));\n },\n\n async findConfiguration(contentType: Struct.ContentTypeSchema) {\n const configuration = await configurationService.getConfiguration(contentType.uid);\n\n return {\n uid: contentType.uid,\n ...configuration,\n };\n },\n\n async updateConfiguration(\n contentType: Struct.ContentTypeSchema,\n newConfiguration: ConfigurationUpdate\n ) {\n await configurationService.setConfiguration(contentType.uid, newConfiguration);\n\n return this.findConfiguration(contentType);\n },\n\n findComponentsConfigurations(contentType: Struct.ContentTypeSchema) {\n // delegate to componentService\n return getService('components').findComponentsConfigurations(contentType);\n },\n\n syncConfigurations() {\n return configurationService.syncConfigurations();\n },\n});\n\nexport default service;\n"],"names":["configurationService","createConfigurationService","storeUtils","prefix","getModels","toContentManagerModel","getService","mapValues","strapi","contentTypes","value","service","findAllContentTypes","Object","values","map","findContentType","uid","contentType","findDisplayedContentTypes","filter","isDisplayed","findContentTypesByKind","kind","undefined","contentTypesUtils","isKind","findConfiguration","configuration","getConfiguration","updateConfiguration","newConfiguration","setConfiguration","findComponentsConfigurations","syncConfigurations"],"mappings":";;;;;;;;AAYA,MAAMA,uBAAuBC,aAAAA,CAA2B;AACtDC,gBAAAA,KAAAA;IACAC,MAAAA,EAAQ,eAAA;AACRC,IAAAA,SAAAA,CAAAA,GAAAA;AACE,QAAA,MAAM,EAAEC,qBAAqB,EAAE,GAAGC,gBAAAA,CAAW,aAAA,CAAA;AAE7C,QAAA,OAAOC,YAAUC,MAAAA,CAAOC,YAAY,EAAE,CAACC,QAAUL,qBAAAA,CAAsBK,KAAAA,CAAAA,CAAAA;AACzE,IAAA;AACF,CAAA,CAAA;AAEA,MAAMC,UAAU,CAAC,EAAEH,QAAAA,OAAM,EAA2B,IAAM;AACxDI,QAAAA,mBAAAA,CAAAA,GAAAA;AACE,YAAA,MAAM,EAAEP,qBAAqB,EAAE,GAAGC,gBAAAA,CAAW,aAAA,CAAA;AAE7C,YAAA,OAAOO,OAAOC,MAAM,CAACN,QAAOC,YAAY,CAAA,CAAEM,GAAG,CAACV,qBAAAA,CAAAA;AAChD,QAAA,CAAA;AAEAW,QAAAA,eAAAA,CAAAA,CAAgBC,GAAoB,EAAA;AAClC,YAAA,MAAM,EAAEZ,qBAAqB,EAAE,GAAGC,gBAAAA,CAAW,aAAA,CAAA;AAE7C,YAAA,MAAMY,WAAAA,GAAcV,OAAAA,CAAOC,YAAY,CAACQ,GAAAA,CAAI;YAE5C,OAAOC,WAAAA,IAAe,IAAA,GAAOA,WAAAA,GAAcb,qBAAAA,CAAsBa,WAAAA,CAAAA;AACnE,QAAA,CAAA;AAEAC,QAAAA,yBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAO,IAAI,CAACP,mBAAmB,EAAA,CAAGQ,MAAM;;AAGtC,YAAA,CAAC,EAAEC,WAAW,EAA4B,GAAKA,WAAAA,KAAgB,IAAA,CAAA;AAEnE,QAAA,CAAA;AAEAC,QAAAA,sBAAAA,CAAAA,CAAuBC,IAA+C,EAAA;YACpE,IAAIA,IAAAA,KAASC,SAAAA,IAAaD,IAAAA,KAAS,IAAA,EAAM;gBACvC,OAAO,IAAI,CAACX,mBAAmB,EAAA;AACjC,YAAA;;YAGA,OAAO,IAAI,CAACA,mBAAmB,EAAA,CAAGQ,MAAM,CAACK,wBAAAA,CAAkBC,MAAM,CAACH,IAAAA,CAAAA,CAAAA;AACpE,QAAA,CAAA;AAEA,QAAA,MAAMI,mBAAkBT,WAAqC,EAAA;AAC3D,YAAA,MAAMU,gBAAgB,MAAM5B,oBAAAA,CAAqB6B,gBAAgB,CAACX,YAAYD,GAAG,CAAA;YAEjF,OAAO;AACLA,gBAAAA,GAAAA,EAAKC,YAAYD,GAAG;AACpB,gBAAA,GAAGW;AACL,aAAA;AACF,QAAA,CAAA;QAEA,MAAME,mBAAAA,CAAAA,CACJZ,WAAqC,EACrCa,gBAAqC,EAAA;AAErC,YAAA,MAAM/B,oBAAAA,CAAqBgC,gBAAgB,CAACd,WAAAA,CAAYD,GAAG,EAAEc,gBAAAA,CAAAA;YAE7D,OAAO,IAAI,CAACJ,iBAAiB,CAACT,WAAAA,CAAAA;AAChC,QAAA,CAAA;AAEAe,QAAAA,4BAAAA,CAAAA,CAA6Bf,WAAqC,EAAA;;YAEhE,OAAOZ,gBAAAA,CAAW,YAAA,CAAA,CAAc2B,4BAA4B,CAACf,WAAAA,CAAAA;AAC/D,QAAA,CAAA;AAEAgB,QAAAA,kBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOlC,qBAAqBkC,kBAAkB,EAAA;AAChD,QAAA;KACF;;;;"}
@@ -28,10 +28,10 @@ const service = ({ strapi: strapi1 })=>({
28
28
  ({ isDisplayed })=>isDisplayed === true);
29
29
  },
30
30
  findContentTypesByKind (kind) {
31
- if (!kind) {
31
+ if (kind === undefined || kind === null) {
32
32
  return this.findAllContentTypes();
33
33
  }
34
- // @ts-expect-error TODO when adding types
34
+ // @ts-expect-error should be resolved from data-mapper types
35
35
  return this.findAllContentTypes().filter(contentTypes.isKind(kind));
36
36
  },
37
37
  async findConfiguration (contentType) {
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.mjs","sources":["../../../server/src/services/content-types.ts"],"sourcesContent":["import { mapValues } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport type { UID, Struct, Core } from '@strapi/types';\n\nimport type { ConfigurationUpdate } from './configuration';\n\nimport { getService } from '../utils';\nimport storeUtils from './utils/store';\nimport createConfigurationService from './configuration';\n\nconst configurationService = createConfigurationService({\n storeUtils,\n prefix: 'content_types',\n getModels() {\n const { toContentManagerModel } = getService('data-mapper');\n\n return mapValues(strapi.contentTypes, (value) => toContentManagerModel(value));\n },\n});\n\nconst service = ({ strapi }: { strapi: Core.Strapi }) => ({\n findAllContentTypes() {\n const { toContentManagerModel } = getService('data-mapper');\n\n return Object.values(strapi.contentTypes).map(toContentManagerModel);\n },\n\n findContentType(uid: UID.ContentType) {\n const { toContentManagerModel } = getService('data-mapper');\n\n const contentType = strapi.contentTypes[uid];\n\n return contentType == null ? contentType : toContentManagerModel(contentType);\n },\n\n findDisplayedContentTypes() {\n return this.findAllContentTypes().filter(\n // TODO\n // @ts-expect-error should be resolved from data-mapper types\n ({ isDisplayed }: { isDisplayed: boolean }) => isDisplayed === true\n );\n },\n\n findContentTypesByKind(kind: { kind: Struct.ContentTypeKind | undefined }) {\n if (!kind) {\n return this.findAllContentTypes();\n }\n\n // @ts-expect-error TODO when adding types\n return this.findAllContentTypes().filter(contentTypesUtils.isKind(kind));\n },\n\n async findConfiguration(contentType: Struct.ContentTypeSchema) {\n const configuration = await configurationService.getConfiguration(contentType.uid);\n\n return {\n uid: contentType.uid,\n ...configuration,\n };\n },\n\n async updateConfiguration(\n contentType: Struct.ContentTypeSchema,\n newConfiguration: ConfigurationUpdate\n ) {\n await configurationService.setConfiguration(contentType.uid, newConfiguration);\n\n return this.findConfiguration(contentType);\n },\n\n findComponentsConfigurations(contentType: Struct.ContentTypeSchema) {\n // delegate to componentService\n return getService('components').findComponentsConfigurations(contentType);\n },\n\n syncConfigurations() {\n return configurationService.syncConfigurations();\n },\n});\n\nexport default service;\n"],"names":["configurationService","createConfigurationService","storeUtils","prefix","getModels","toContentManagerModel","getService","mapValues","strapi","contentTypes","value","service","findAllContentTypes","Object","values","map","findContentType","uid","contentType","findDisplayedContentTypes","filter","isDisplayed","findContentTypesByKind","kind","contentTypesUtils","isKind","findConfiguration","configuration","getConfiguration","updateConfiguration","newConfiguration","setConfiguration","findComponentsConfigurations","syncConfigurations"],"mappings":";;;;;;AAYA,MAAMA,uBAAuBC,0BAAAA,CAA2B;AACtDC,IAAAA,UAAAA;IACAC,MAAAA,EAAQ,eAAA;AACRC,IAAAA,SAAAA,CAAAA,GAAAA;AACE,QAAA,MAAM,EAAEC,qBAAqB,EAAE,GAAGC,UAAAA,CAAW,aAAA,CAAA;AAE7C,QAAA,OAAOC,UAAUC,MAAAA,CAAOC,YAAY,EAAE,CAACC,QAAUL,qBAAAA,CAAsBK,KAAAA,CAAAA,CAAAA;AACzE,IAAA;AACF,CAAA,CAAA;AAEA,MAAMC,UAAU,CAAC,EAAEH,QAAAA,OAAM,EAA2B,IAAM;AACxDI,QAAAA,mBAAAA,CAAAA,GAAAA;AACE,YAAA,MAAM,EAAEP,qBAAqB,EAAE,GAAGC,UAAAA,CAAW,aAAA,CAAA;AAE7C,YAAA,OAAOO,OAAOC,MAAM,CAACN,QAAOC,YAAY,CAAA,CAAEM,GAAG,CAACV,qBAAAA,CAAAA;AAChD,QAAA,CAAA;AAEAW,QAAAA,eAAAA,CAAAA,CAAgBC,GAAoB,EAAA;AAClC,YAAA,MAAM,EAAEZ,qBAAqB,EAAE,GAAGC,UAAAA,CAAW,aAAA,CAAA;AAE7C,YAAA,MAAMY,WAAAA,GAAcV,OAAAA,CAAOC,YAAY,CAACQ,GAAAA,CAAI;YAE5C,OAAOC,WAAAA,IAAe,IAAA,GAAOA,WAAAA,GAAcb,qBAAAA,CAAsBa,WAAAA,CAAAA;AACnE,QAAA,CAAA;AAEAC,QAAAA,yBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAO,IAAI,CAACP,mBAAmB,EAAA,CAAGQ,MAAM;;AAGtC,YAAA,CAAC,EAAEC,WAAW,EAA4B,GAAKA,WAAAA,KAAgB,IAAA,CAAA;AAEnE,QAAA,CAAA;AAEAC,QAAAA,sBAAAA,CAAAA,CAAuBC,IAAkD,EAAA;AACvE,YAAA,IAAI,CAACA,IAAAA,EAAM;gBACT,OAAO,IAAI,CAACX,mBAAmB,EAAA;AACjC,YAAA;;YAGA,OAAO,IAAI,CAACA,mBAAmB,EAAA,CAAGQ,MAAM,CAACI,YAAAA,CAAkBC,MAAM,CAACF,IAAAA,CAAAA,CAAAA;AACpE,QAAA,CAAA;AAEA,QAAA,MAAMG,mBAAkBR,WAAqC,EAAA;AAC3D,YAAA,MAAMS,gBAAgB,MAAM3B,oBAAAA,CAAqB4B,gBAAgB,CAACV,YAAYD,GAAG,CAAA;YAEjF,OAAO;AACLA,gBAAAA,GAAAA,EAAKC,YAAYD,GAAG;AACpB,gBAAA,GAAGU;AACL,aAAA;AACF,QAAA,CAAA;QAEA,MAAME,mBAAAA,CAAAA,CACJX,WAAqC,EACrCY,gBAAqC,EAAA;AAErC,YAAA,MAAM9B,oBAAAA,CAAqB+B,gBAAgB,CAACb,WAAAA,CAAYD,GAAG,EAAEa,gBAAAA,CAAAA;YAE7D,OAAO,IAAI,CAACJ,iBAAiB,CAACR,WAAAA,CAAAA;AAChC,QAAA,CAAA;AAEAc,QAAAA,4BAAAA,CAAAA,CAA6Bd,WAAqC,EAAA;;YAEhE,OAAOZ,UAAAA,CAAW,YAAA,CAAA,CAAc0B,4BAA4B,CAACd,WAAAA,CAAAA;AAC/D,QAAA,CAAA;AAEAe,QAAAA,kBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOjC,qBAAqBiC,kBAAkB,EAAA;AAChD,QAAA;KACF;;;;"}
1
+ {"version":3,"file":"content-types.mjs","sources":["../../../server/src/services/content-types.ts"],"sourcesContent":["import { mapValues } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nimport type { UID, Struct, Core } from '@strapi/types';\n\nimport type { ConfigurationUpdate } from './configuration';\n\nimport { getService } from '../utils';\nimport storeUtils from './utils/store';\nimport createConfigurationService from './configuration';\n\nconst configurationService = createConfigurationService({\n storeUtils,\n prefix: 'content_types',\n getModels() {\n const { toContentManagerModel } = getService('data-mapper');\n\n return mapValues(strapi.contentTypes, (value) => toContentManagerModel(value));\n },\n});\n\nconst service = ({ strapi }: { strapi: Core.Strapi }) => ({\n findAllContentTypes() {\n const { toContentManagerModel } = getService('data-mapper');\n\n return Object.values(strapi.contentTypes).map(toContentManagerModel);\n },\n\n findContentType(uid: UID.ContentType) {\n const { toContentManagerModel } = getService('data-mapper');\n\n const contentType = strapi.contentTypes[uid];\n\n return contentType == null ? contentType : toContentManagerModel(contentType);\n },\n\n findDisplayedContentTypes() {\n return this.findAllContentTypes().filter(\n // TODO\n // @ts-expect-error should be resolved from data-mapper types\n ({ isDisplayed }: { isDisplayed: boolean }) => isDisplayed === true\n );\n },\n\n findContentTypesByKind(kind: Struct.ContentTypeKind | null | undefined) {\n if (kind === undefined || kind === null) {\n return this.findAllContentTypes();\n }\n\n // @ts-expect-error should be resolved from data-mapper types\n return this.findAllContentTypes().filter(contentTypesUtils.isKind(kind));\n },\n\n async findConfiguration(contentType: Struct.ContentTypeSchema) {\n const configuration = await configurationService.getConfiguration(contentType.uid);\n\n return {\n uid: contentType.uid,\n ...configuration,\n };\n },\n\n async updateConfiguration(\n contentType: Struct.ContentTypeSchema,\n newConfiguration: ConfigurationUpdate\n ) {\n await configurationService.setConfiguration(contentType.uid, newConfiguration);\n\n return this.findConfiguration(contentType);\n },\n\n findComponentsConfigurations(contentType: Struct.ContentTypeSchema) {\n // delegate to componentService\n return getService('components').findComponentsConfigurations(contentType);\n },\n\n syncConfigurations() {\n return configurationService.syncConfigurations();\n },\n});\n\nexport default service;\n"],"names":["configurationService","createConfigurationService","storeUtils","prefix","getModels","toContentManagerModel","getService","mapValues","strapi","contentTypes","value","service","findAllContentTypes","Object","values","map","findContentType","uid","contentType","findDisplayedContentTypes","filter","isDisplayed","findContentTypesByKind","kind","undefined","contentTypesUtils","isKind","findConfiguration","configuration","getConfiguration","updateConfiguration","newConfiguration","setConfiguration","findComponentsConfigurations","syncConfigurations"],"mappings":";;;;;;AAYA,MAAMA,uBAAuBC,0BAAAA,CAA2B;AACtDC,IAAAA,UAAAA;IACAC,MAAAA,EAAQ,eAAA;AACRC,IAAAA,SAAAA,CAAAA,GAAAA;AACE,QAAA,MAAM,EAAEC,qBAAqB,EAAE,GAAGC,UAAAA,CAAW,aAAA,CAAA;AAE7C,QAAA,OAAOC,UAAUC,MAAAA,CAAOC,YAAY,EAAE,CAACC,QAAUL,qBAAAA,CAAsBK,KAAAA,CAAAA,CAAAA;AACzE,IAAA;AACF,CAAA,CAAA;AAEA,MAAMC,UAAU,CAAC,EAAEH,QAAAA,OAAM,EAA2B,IAAM;AACxDI,QAAAA,mBAAAA,CAAAA,GAAAA;AACE,YAAA,MAAM,EAAEP,qBAAqB,EAAE,GAAGC,UAAAA,CAAW,aAAA,CAAA;AAE7C,YAAA,OAAOO,OAAOC,MAAM,CAACN,QAAOC,YAAY,CAAA,CAAEM,GAAG,CAACV,qBAAAA,CAAAA;AAChD,QAAA,CAAA;AAEAW,QAAAA,eAAAA,CAAAA,CAAgBC,GAAoB,EAAA;AAClC,YAAA,MAAM,EAAEZ,qBAAqB,EAAE,GAAGC,UAAAA,CAAW,aAAA,CAAA;AAE7C,YAAA,MAAMY,WAAAA,GAAcV,OAAAA,CAAOC,YAAY,CAACQ,GAAAA,CAAI;YAE5C,OAAOC,WAAAA,IAAe,IAAA,GAAOA,WAAAA,GAAcb,qBAAAA,CAAsBa,WAAAA,CAAAA;AACnE,QAAA,CAAA;AAEAC,QAAAA,yBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAO,IAAI,CAACP,mBAAmB,EAAA,CAAGQ,MAAM;;AAGtC,YAAA,CAAC,EAAEC,WAAW,EAA4B,GAAKA,WAAAA,KAAgB,IAAA,CAAA;AAEnE,QAAA,CAAA;AAEAC,QAAAA,sBAAAA,CAAAA,CAAuBC,IAA+C,EAAA;YACpE,IAAIA,IAAAA,KAASC,SAAAA,IAAaD,IAAAA,KAAS,IAAA,EAAM;gBACvC,OAAO,IAAI,CAACX,mBAAmB,EAAA;AACjC,YAAA;;YAGA,OAAO,IAAI,CAACA,mBAAmB,EAAA,CAAGQ,MAAM,CAACK,YAAAA,CAAkBC,MAAM,CAACH,IAAAA,CAAAA,CAAAA;AACpE,QAAA,CAAA;AAEA,QAAA,MAAMI,mBAAkBT,WAAqC,EAAA;AAC3D,YAAA,MAAMU,gBAAgB,MAAM5B,oBAAAA,CAAqB6B,gBAAgB,CAACX,YAAYD,GAAG,CAAA;YAEjF,OAAO;AACLA,gBAAAA,GAAAA,EAAKC,YAAYD,GAAG;AACpB,gBAAA,GAAGW;AACL,aAAA;AACF,QAAA,CAAA;QAEA,MAAME,mBAAAA,CAAAA,CACJZ,WAAqC,EACrCa,gBAAqC,EAAA;AAErC,YAAA,MAAM/B,oBAAAA,CAAqBgC,gBAAgB,CAACd,WAAAA,CAAYD,GAAG,EAAEc,gBAAAA,CAAAA;YAE7D,OAAO,IAAI,CAACJ,iBAAiB,CAACT,WAAAA,CAAAA;AAChC,QAAA,CAAA;AAEAe,QAAAA,4BAAAA,CAAAA,CAA6Bf,WAAqC,EAAA;;YAEhE,OAAOZ,UAAAA,CAAW,YAAA,CAAA,CAAc2B,4BAA4B,CAACf,WAAAA,CAAAA;AAC/D,QAAA,CAAA;AAEAgB,QAAAA,kBAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOlC,qBAAqBkC,kBAAkB,EAAA;AAChD,QAAA;KACF;;;;"}