@strapi/content-type-builder 5.37.0 → 5.38.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 (433) hide show
  1. package/dist/admin/components/AIChat/Chat.js.map +1 -1
  2. package/dist/admin/components/AIChat/Chat.mjs +2 -2
  3. package/dist/admin/components/AIChat/Chat.mjs.map +1 -1
  4. package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -1
  5. package/dist/admin/components/AIChat/FeedbackModal.mjs +1 -1
  6. package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -1
  7. package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -1
  8. package/dist/admin/components/AIChat/UploadCodeModal.mjs +1 -1
  9. package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -1
  10. package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -1
  11. package/dist/admin/components/AIChat/UploadFigmaModal.mjs +1 -1
  12. package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -1
  13. package/dist/admin/components/AIChat/components/Alert.js.map +1 -1
  14. package/dist/admin/components/AIChat/components/Alert.mjs.map +1 -1
  15. package/dist/admin/components/AIChat/components/AnimatedBox.js.map +1 -1
  16. package/dist/admin/components/AIChat/components/AnimatedBox.mjs.map +1 -1
  17. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js.map +1 -1
  18. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs.map +1 -1
  19. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -1
  20. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +1 -1
  21. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -1
  22. package/dist/admin/components/AIChat/components/Base64Image.js.map +1 -1
  23. package/dist/admin/components/AIChat/components/Base64Image.mjs.map +1 -1
  24. package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -1
  25. package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -1
  26. package/dist/admin/components/AIChat/components/Dropzone.js +2 -6
  27. package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -1
  28. package/dist/admin/components/AIChat/components/Dropzone.mjs +3 -7
  29. package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -1
  30. package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -1
  31. package/dist/admin/components/AIChat/components/FloatingPanel.mjs +1 -1
  32. package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -1
  33. package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -1
  34. package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -1
  35. package/dist/admin/components/AIChat/components/ImagePreview.js.map +1 -1
  36. package/dist/admin/components/AIChat/components/ImagePreview.mjs +1 -1
  37. package/dist/admin/components/AIChat/components/ImagePreview.mjs.map +1 -1
  38. package/dist/admin/components/AIChat/components/Input.js +1 -5
  39. package/dist/admin/components/AIChat/components/Input.js.map +1 -1
  40. package/dist/admin/components/AIChat/components/Input.mjs +4 -7
  41. package/dist/admin/components/AIChat/components/Input.mjs.map +1 -1
  42. package/dist/admin/components/AIChat/components/Messages/Marker.js.map +1 -1
  43. package/dist/admin/components/AIChat/components/Messages/Marker.mjs +2 -2
  44. package/dist/admin/components/AIChat/components/Messages/Marker.mjs.map +1 -1
  45. package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
  46. package/dist/admin/components/AIChat/components/Messages/Message.mjs +1 -1
  47. package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -1
  48. package/dist/admin/components/AIChat/components/ResizableTextArea.js.map +1 -1
  49. package/dist/admin/components/AIChat/components/ResizableTextArea.mjs.map +1 -1
  50. package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -1
  51. package/dist/admin/components/AIChat/components/SimpleMenu.mjs.map +1 -1
  52. package/dist/admin/components/AIChat/components/StepModal.js.map +1 -1
  53. package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -1
  54. package/dist/admin/components/AIChat/components/animations.js.map +1 -1
  55. package/dist/admin/components/AIChat/components/animations.mjs.map +1 -1
  56. package/dist/admin/components/AIChat/components/icons/FigmaIcon.js.map +1 -1
  57. package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs.map +1 -1
  58. package/dist/admin/components/AIChat/components/icons/StopIcon.js.map +1 -1
  59. package/dist/admin/components/AIChat/components/icons/StopIcon.mjs.map +1 -1
  60. package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -1
  61. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -1
  62. package/dist/admin/components/AIChat/hooks/useAttachments.js.map +1 -1
  63. package/dist/admin/components/AIChat/hooks/useAttachments.mjs.map +1 -1
  64. package/dist/admin/components/AIChat/hooks/useChatTitle.js.map +1 -1
  65. package/dist/admin/components/AIChat/hooks/useChatTitle.mjs.map +1 -1
  66. package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -1
  67. package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs.map +1 -1
  68. package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -1
  69. package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -1
  70. package/dist/admin/components/AIChat/hooks/useFigmaUpload.js.map +1 -1
  71. package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs.map +1 -1
  72. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js.map +1 -1
  73. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs.map +1 -1
  74. package/dist/admin/components/AIChat/hooks/useTranslations.js.map +1 -1
  75. package/dist/admin/components/AIChat/hooks/useTranslations.mjs.map +1 -1
  76. package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -1
  77. package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -1
  78. package/dist/admin/components/AIChat/lib/constants.js.map +1 -1
  79. package/dist/admin/components/AIChat/lib/constants.mjs.map +1 -1
  80. package/dist/admin/components/AIChat/lib/misc.js.map +1 -1
  81. package/dist/admin/components/AIChat/lib/misc.mjs.map +1 -1
  82. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -1
  83. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -1
  84. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -1
  85. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -1
  86. package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -1
  87. package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -1
  88. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
  89. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
  90. package/dist/admin/components/AllowedTypesSelect.js.map +1 -1
  91. package/dist/admin/components/AllowedTypesSelect.mjs.map +1 -1
  92. package/dist/admin/components/ApplyConditionButton.js.map +1 -1
  93. package/dist/admin/components/ApplyConditionButton.mjs.map +1 -1
  94. package/dist/admin/components/AttributeIcon.js.map +1 -1
  95. package/dist/admin/components/AttributeIcon.mjs +1 -1
  96. package/dist/admin/components/AttributeIcon.mjs.map +1 -1
  97. package/dist/admin/components/AttributeOptions/AttributeList.js.map +1 -1
  98. package/dist/admin/components/AttributeOptions/AttributeList.mjs.map +1 -1
  99. package/dist/admin/components/AttributeOptions/AttributeOption.js.map +1 -1
  100. package/dist/admin/components/AttributeOptions/AttributeOption.mjs.map +1 -1
  101. package/dist/admin/components/AttributeOptions/AttributeOptions.js.map +1 -1
  102. package/dist/admin/components/AttributeOptions/AttributeOptions.mjs.map +1 -1
  103. package/dist/admin/components/AttributeOptions/CustomFieldOption.js.map +1 -1
  104. package/dist/admin/components/AttributeOptions/CustomFieldOption.mjs.map +1 -1
  105. package/dist/admin/components/AttributeOptions/CustomFieldsList.js.map +1 -1
  106. package/dist/admin/components/AttributeOptions/CustomFieldsList.mjs.map +1 -1
  107. package/dist/admin/components/AttributeOptions/EmptyAttributes.js.map +1 -1
  108. package/dist/admin/components/AttributeOptions/EmptyAttributes.mjs.map +1 -1
  109. package/dist/admin/components/AttributeOptions/OptionBoxWrapper.js.map +1 -1
  110. package/dist/admin/components/AttributeOptions/OptionBoxWrapper.mjs.map +1 -1
  111. package/dist/admin/components/AttributeRow.js.map +1 -1
  112. package/dist/admin/components/AttributeRow.mjs +1 -1
  113. package/dist/admin/components/AttributeRow.mjs.map +1 -1
  114. package/dist/admin/components/AutoReloadOverlayBlocker.js.map +1 -1
  115. package/dist/admin/components/AutoReloadOverlayBlocker.mjs.map +1 -1
  116. package/dist/admin/components/BooleanDefaultValueSelect.js.map +1 -1
  117. package/dist/admin/components/BooleanDefaultValueSelect.mjs.map +1 -1
  118. package/dist/admin/components/BooleanRadioGroup.js.map +1 -1
  119. package/dist/admin/components/BooleanRadioGroup.mjs.map +1 -1
  120. package/dist/admin/components/CTBSession/CTBSessionProvider.js.map +1 -1
  121. package/dist/admin/components/CTBSession/CTBSessionProvider.mjs.map +1 -1
  122. package/dist/admin/components/CTBSession/sessionContext.js.map +1 -1
  123. package/dist/admin/components/CTBSession/sessionContext.mjs.map +1 -1
  124. package/dist/admin/components/CTBSession/useCTBSession.js.map +1 -1
  125. package/dist/admin/components/CTBSession/useCTBSession.mjs.map +1 -1
  126. package/dist/admin/components/CTBSession/useCTBTracking.js.map +1 -1
  127. package/dist/admin/components/CTBSession/useCTBTracking.mjs.map +1 -1
  128. package/dist/admin/components/CheckboxWithNumberField.js.map +1 -1
  129. package/dist/admin/components/CheckboxWithNumberField.mjs.map +1 -1
  130. package/dist/admin/components/ComponentCard/ComponentCard.js.map +1 -1
  131. package/dist/admin/components/ComponentCard/ComponentCard.mjs +1 -1
  132. package/dist/admin/components/ComponentCard/ComponentCard.mjs.map +1 -1
  133. package/dist/admin/components/ComponentCard/ComponentIcon/ComponentIcon.js.map +1 -1
  134. package/dist/admin/components/ComponentCard/ComponentIcon/ComponentIcon.mjs.map +1 -1
  135. package/dist/admin/components/ComponentList.js.map +1 -1
  136. package/dist/admin/components/ComponentList.mjs.map +1 -1
  137. package/dist/admin/components/ComponentRow.js.map +1 -1
  138. package/dist/admin/components/ComponentRow.mjs.map +1 -1
  139. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js.map +1 -1
  140. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs +2 -2
  141. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs.map +1 -1
  142. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +1 -1
  143. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +1 -1
  144. package/dist/admin/components/ContentTypeRadioGroup.js.map +1 -1
  145. package/dist/admin/components/ContentTypeRadioGroup.mjs.map +1 -1
  146. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js.map +1 -1
  147. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs.map +1 -1
  148. package/dist/admin/components/CustomRadioGroup/Styles.js.map +1 -1
  149. package/dist/admin/components/CustomRadioGroup/Styles.mjs +1 -1
  150. package/dist/admin/components/CustomRadioGroup/Styles.mjs.map +1 -1
  151. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  152. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  153. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  154. package/dist/admin/components/DataManager/DataManagerProvider.mjs +1 -1
  155. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  156. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  157. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  158. package/dist/admin/components/DataManager/undoRedo.js.map +1 -1
  159. package/dist/admin/components/DataManager/undoRedo.mjs.map +1 -1
  160. package/dist/admin/components/DataManager/useDataManager.js.map +1 -1
  161. package/dist/admin/components/DataManager/useDataManager.mjs.map +1 -1
  162. package/dist/admin/components/DataManager/useServerRestartWatcher.js.map +1 -1
  163. package/dist/admin/components/DataManager/useServerRestartWatcher.mjs.map +1 -1
  164. package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
  165. package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
  166. package/dist/admin/components/DataManager/utils/retrieveComponentsThatHaveComponents.js.map +1 -1
  167. package/dist/admin/components/DataManager/utils/retrieveComponentsThatHaveComponents.mjs.map +1 -1
  168. package/dist/admin/components/DataManager/utils/retrieveNestedComponents.js.map +1 -1
  169. package/dist/admin/components/DataManager/utils/retrieveNestedComponents.mjs.map +1 -1
  170. package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.js.map +1 -1
  171. package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.mjs.map +1 -1
  172. package/dist/admin/components/DisplayedType.js.map +1 -1
  173. package/dist/admin/components/DisplayedType.mjs.map +1 -1
  174. package/dist/admin/components/DraftAndPublishToggle.js.map +1 -1
  175. package/dist/admin/components/DraftAndPublishToggle.mjs.map +1 -1
  176. package/dist/admin/components/DynamicZoneList.js.map +1 -1
  177. package/dist/admin/components/DynamicZoneList.mjs +1 -1
  178. package/dist/admin/components/DynamicZoneList.mjs.map +1 -1
  179. package/dist/admin/components/ExitPrompt.js.map +1 -1
  180. package/dist/admin/components/ExitPrompt.mjs.map +1 -1
  181. package/dist/admin/components/Footers.js.map +1 -1
  182. package/dist/admin/components/Footers.mjs +2 -2
  183. package/dist/admin/components/Footers.mjs.map +1 -1
  184. package/dist/admin/components/FormModal/FormModal.js.map +1 -1
  185. package/dist/admin/components/FormModal/FormModal.mjs +1 -1
  186. package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
  187. package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
  188. package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
  189. package/dist/admin/components/FormModal/attributes/advancedForm.js.map +1 -1
  190. package/dist/admin/components/FormModal/attributes/advancedForm.mjs.map +1 -1
  191. package/dist/admin/components/FormModal/attributes/attributeOptions.js.map +1 -1
  192. package/dist/admin/components/FormModal/attributes/attributeOptions.mjs.map +1 -1
  193. package/dist/admin/components/FormModal/attributes/baseForm.js.map +1 -1
  194. package/dist/admin/components/FormModal/attributes/baseForm.mjs.map +1 -1
  195. package/dist/admin/components/FormModal/attributes/commonBaseForm.js.map +1 -1
  196. package/dist/admin/components/FormModal/attributes/commonBaseForm.mjs.map +1 -1
  197. package/dist/admin/components/FormModal/attributes/form.js.map +1 -1
  198. package/dist/admin/components/FormModal/attributes/form.mjs.map +1 -1
  199. package/dist/admin/components/FormModal/attributes/nameField.js.map +1 -1
  200. package/dist/admin/components/FormModal/attributes/nameField.mjs.map +1 -1
  201. package/dist/admin/components/FormModal/attributes/types.js.map +1 -1
  202. package/dist/admin/components/FormModal/attributes/types.mjs +1 -1
  203. package/dist/admin/components/FormModal/attributes/types.mjs.map +1 -1
  204. package/dist/admin/components/FormModal/attributes/validation/common.js.map +1 -1
  205. package/dist/admin/components/FormModal/attributes/validation/common.mjs.map +1 -1
  206. package/dist/admin/components/FormModal/component/componentField.js.map +1 -1
  207. package/dist/admin/components/FormModal/component/componentField.mjs.map +1 -1
  208. package/dist/admin/components/FormModal/component/componentForm.js.map +1 -1
  209. package/dist/admin/components/FormModal/component/componentForm.mjs.map +1 -1
  210. package/dist/admin/components/FormModal/component/createComponentSchema.js.map +1 -1
  211. package/dist/admin/components/FormModal/component/createComponentSchema.mjs.map +1 -1
  212. package/dist/admin/components/FormModal/contentType/contentTypeForm.js.map +1 -1
  213. package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs.map +1 -1
  214. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js.map +1 -1
  215. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.mjs.map +1 -1
  216. package/dist/admin/components/FormModal/dynamiczoneForm.js.map +1 -1
  217. package/dist/admin/components/FormModal/dynamiczoneForm.mjs.map +1 -1
  218. package/dist/admin/components/FormModal/forms/forms.js.map +1 -1
  219. package/dist/admin/components/FormModal/forms/forms.mjs.map +1 -1
  220. package/dist/admin/components/FormModal/forms/utils/addItemsToFormSection.js.map +1 -1
  221. package/dist/admin/components/FormModal/forms/utils/addItemsToFormSection.mjs.map +1 -1
  222. package/dist/admin/components/FormModal/forms/utils/createCollectionName.js.map +1 -1
  223. package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs.map +1 -1
  224. package/dist/admin/components/FormModal/forms/utils/getUsedAttributeNames.js.map +1 -1
  225. package/dist/admin/components/FormModal/forms/utils/getUsedAttributeNames.mjs.map +1 -1
  226. package/dist/admin/components/FormModal/reducer.js.map +1 -1
  227. package/dist/admin/components/FormModal/reducer.mjs.map +1 -1
  228. package/dist/admin/components/FormModal/utils/canEditContentType.js.map +1 -1
  229. package/dist/admin/components/FormModal/utils/canEditContentType.mjs.map +1 -1
  230. package/dist/admin/components/FormModal/utils/createUid.js.map +1 -1
  231. package/dist/admin/components/FormModal/utils/createUid.mjs.map +1 -1
  232. package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.js.map +1 -1
  233. package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.mjs.map +1 -1
  234. package/dist/admin/components/FormModal/utils/getAttributesToDisplay.js.map +1 -1
  235. package/dist/admin/components/FormModal/utils/getAttributesToDisplay.mjs.map +1 -1
  236. package/dist/admin/components/FormModal/utils/getFormInputNames.js.map +1 -1
  237. package/dist/admin/components/FormModal/utils/getFormInputNames.mjs.map +1 -1
  238. package/dist/admin/components/FormModal/utils/relations.js.map +1 -1
  239. package/dist/admin/components/FormModal/utils/relations.mjs.map +1 -1
  240. package/dist/admin/components/FormModalEndActions.js.map +1 -1
  241. package/dist/admin/components/FormModalEndActions.mjs.map +1 -1
  242. package/dist/admin/components/FormModalHeader.js.map +1 -1
  243. package/dist/admin/components/FormModalHeader.mjs.map +1 -1
  244. package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.js.map +1 -1
  245. package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.mjs.map +1 -1
  246. package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.js.map +1 -1
  247. package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.mjs.map +1 -1
  248. package/dist/admin/components/FormModalNavigation/useFormModalNavigation.js.map +1 -1
  249. package/dist/admin/components/FormModalNavigation/useFormModalNavigation.mjs.map +1 -1
  250. package/dist/admin/components/FormModalSubHeader.js.map +1 -1
  251. package/dist/admin/components/FormModalSubHeader.mjs.map +1 -1
  252. package/dist/admin/components/GenericInputs.js +1 -5
  253. package/dist/admin/components/GenericInputs.js.map +1 -1
  254. package/dist/admin/components/GenericInputs.mjs +1 -5
  255. package/dist/admin/components/GenericInputs.mjs.map +1 -1
  256. package/dist/admin/components/IconPicker/IconPicker.js.map +1 -1
  257. package/dist/admin/components/IconPicker/IconPicker.mjs +1 -1
  258. package/dist/admin/components/IconPicker/IconPicker.mjs.map +1 -1
  259. package/dist/admin/components/IconPicker/constants.js.map +1 -1
  260. package/dist/admin/components/IconPicker/constants.mjs.map +1 -1
  261. package/dist/admin/components/List.js.map +1 -1
  262. package/dist/admin/components/List.mjs +1 -1
  263. package/dist/admin/components/List.mjs.map +1 -1
  264. package/dist/admin/components/PluralName.js.map +1 -1
  265. package/dist/admin/components/PluralName.mjs.map +1 -1
  266. package/dist/admin/components/Relation/Relation.js.map +1 -1
  267. package/dist/admin/components/Relation/Relation.mjs.map +1 -1
  268. package/dist/admin/components/Relation/RelationField/RelationField.js.map +1 -1
  269. package/dist/admin/components/Relation/RelationField/RelationField.mjs.map +1 -1
  270. package/dist/admin/components/Relation/RelationField/RelationTargetPicker/RelationTargetPicker.js.map +1 -1
  271. package/dist/admin/components/Relation/RelationField/RelationTargetPicker/RelationTargetPicker.mjs.map +1 -1
  272. package/dist/admin/components/Relation/RelationNaturePicker/Components.js.map +1 -1
  273. package/dist/admin/components/Relation/RelationNaturePicker/Components.mjs.map +1 -1
  274. package/dist/admin/components/Relation/RelationNaturePicker/RelationNaturePicker.js.map +1 -1
  275. package/dist/admin/components/Relation/RelationNaturePicker/RelationNaturePicker.mjs +1 -1
  276. package/dist/admin/components/Relation/RelationNaturePicker/RelationNaturePicker.mjs.map +1 -1
  277. package/dist/admin/components/SelectCategory.js.map +1 -1
  278. package/dist/admin/components/SelectCategory.mjs.map +1 -1
  279. package/dist/admin/components/SelectComponent.js.map +1 -1
  280. package/dist/admin/components/SelectComponent.mjs.map +1 -1
  281. package/dist/admin/components/SelectComponents.js.map +1 -1
  282. package/dist/admin/components/SelectComponents.mjs.map +1 -1
  283. package/dist/admin/components/SelectDateType.js.map +1 -1
  284. package/dist/admin/components/SelectDateType.mjs.map +1 -1
  285. package/dist/admin/components/SelectNumber.js.map +1 -1
  286. package/dist/admin/components/SelectNumber.mjs.map +1 -1
  287. package/dist/admin/components/SingularName.js.map +1 -1
  288. package/dist/admin/components/SingularName.mjs.map +1 -1
  289. package/dist/admin/components/Status.js.map +1 -1
  290. package/dist/admin/components/Status.mjs.map +1 -1
  291. package/dist/admin/components/TabForm.js.map +1 -1
  292. package/dist/admin/components/TabForm.mjs.map +1 -1
  293. package/dist/admin/components/TextareaEnum.js.map +1 -1
  294. package/dist/admin/components/TextareaEnum.mjs.map +1 -1
  295. package/dist/admin/constants.js.map +1 -1
  296. package/dist/admin/constants.mjs.map +1 -1
  297. package/dist/admin/icons/Curve.js.map +1 -1
  298. package/dist/admin/icons/Curve.mjs.map +1 -1
  299. package/dist/admin/index.js.map +1 -1
  300. package/dist/admin/index.mjs.map +1 -1
  301. package/dist/admin/pages/App/index.js.map +1 -1
  302. package/dist/admin/pages/App/index.mjs.map +1 -1
  303. package/dist/admin/pages/ListView/EmptyState.js.map +1 -1
  304. package/dist/admin/pages/ListView/EmptyState.mjs +1 -1
  305. package/dist/admin/pages/ListView/EmptyState.mjs.map +1 -1
  306. package/dist/admin/pages/ListView/LinkToCMSettingsView.js.map +1 -1
  307. package/dist/admin/pages/ListView/LinkToCMSettingsView.mjs.map +1 -1
  308. package/dist/admin/pages/ListView/ListView.js.map +1 -1
  309. package/dist/admin/pages/ListView/ListView.mjs +1 -1
  310. package/dist/admin/pages/ListView/ListView.mjs.map +1 -1
  311. package/dist/admin/reducers.js +4 -4
  312. package/dist/admin/reducers.js.map +1 -1
  313. package/dist/admin/reducers.mjs +4 -4
  314. package/dist/admin/reducers.mjs.map +1 -1
  315. package/dist/admin/utils/conditions.js.map +1 -1
  316. package/dist/admin/utils/conditions.mjs.map +1 -1
  317. package/dist/admin/utils/findAttribute.js.map +1 -1
  318. package/dist/admin/utils/findAttribute.mjs.map +1 -1
  319. package/dist/admin/utils/formAPI.js.map +1 -1
  320. package/dist/admin/utils/formAPI.mjs.map +1 -1
  321. package/dist/admin/utils/getAttributeDisplayedType.js.map +1 -1
  322. package/dist/admin/utils/getAttributeDisplayedType.mjs.map +1 -1
  323. package/dist/admin/utils/getMaxDepth.js.map +1 -1
  324. package/dist/admin/utils/getMaxDepth.mjs.map +1 -1
  325. package/dist/admin/utils/getRelationType.js.map +1 -1
  326. package/dist/admin/utils/getRelationType.mjs.map +1 -1
  327. package/dist/admin/utils/getTrad.js.map +1 -1
  328. package/dist/admin/utils/getTrad.mjs.map +1 -1
  329. package/dist/admin/utils/getYupInnerErrors.js.map +1 -1
  330. package/dist/admin/utils/getYupInnerErrors.mjs.map +1 -1
  331. package/dist/admin/utils/isAllowedContentTypesForRelations.js.map +1 -1
  332. package/dist/admin/utils/isAllowedContentTypesForRelations.mjs.map +1 -1
  333. package/dist/admin/utils/makeUnique.js.map +1 -1
  334. package/dist/admin/utils/makeUnique.mjs.map +1 -1
  335. package/dist/admin/utils/nameToSlug.js.map +1 -1
  336. package/dist/admin/utils/nameToSlug.mjs.map +1 -1
  337. package/dist/admin/utils/parseDateValue.js.map +1 -1
  338. package/dist/admin/utils/parseDateValue.mjs.map +1 -1
  339. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
  340. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
  341. package/dist/admin/utils/timeFormat.js.map +1 -1
  342. package/dist/admin/utils/timeFormat.mjs.map +1 -1
  343. package/dist/admin/utils/toRegressedEnumValue.js.map +1 -1
  344. package/dist/admin/utils/toRegressedEnumValue.mjs.map +1 -1
  345. package/dist/server/bootstrap.js.map +1 -1
  346. package/dist/server/bootstrap.mjs.map +1 -1
  347. package/dist/server/config.js.map +1 -1
  348. package/dist/server/config.mjs.map +1 -1
  349. package/dist/server/controllers/builder.js.map +1 -1
  350. package/dist/server/controllers/builder.mjs.map +1 -1
  351. package/dist/server/controllers/component-categories.js.map +1 -1
  352. package/dist/server/controllers/component-categories.mjs.map +1 -1
  353. package/dist/server/controllers/components.js.map +1 -1
  354. package/dist/server/controllers/components.mjs +1 -1
  355. package/dist/server/controllers/components.mjs.map +1 -1
  356. package/dist/server/controllers/content-types.js.map +1 -1
  357. package/dist/server/controllers/content-types.mjs +1 -1
  358. package/dist/server/controllers/content-types.mjs.map +1 -1
  359. package/dist/server/controllers/index.js.map +1 -1
  360. package/dist/server/controllers/index.mjs.map +1 -1
  361. package/dist/server/controllers/schema.js.map +1 -1
  362. package/dist/server/controllers/schema.mjs.map +1 -1
  363. package/dist/server/controllers/validation/common.js.map +1 -1
  364. package/dist/server/controllers/validation/common.mjs.map +1 -1
  365. package/dist/server/controllers/validation/component-category.js.map +1 -1
  366. package/dist/server/controllers/validation/component-category.mjs.map +1 -1
  367. package/dist/server/controllers/validation/component.js.map +1 -1
  368. package/dist/server/controllers/validation/component.mjs +1 -1
  369. package/dist/server/controllers/validation/component.mjs.map +1 -1
  370. package/dist/server/controllers/validation/content-type.js.map +1 -1
  371. package/dist/server/controllers/validation/content-type.mjs.map +1 -1
  372. package/dist/server/controllers/validation/data-transform.js.map +1 -1
  373. package/dist/server/controllers/validation/data-transform.mjs.map +1 -1
  374. package/dist/server/controllers/validation/model-schema.js.map +1 -1
  375. package/dist/server/controllers/validation/model-schema.mjs.map +1 -1
  376. package/dist/server/controllers/validation/relations.js.map +1 -1
  377. package/dist/server/controllers/validation/relations.mjs.map +1 -1
  378. package/dist/server/controllers/validation/schema.js.map +1 -1
  379. package/dist/server/controllers/validation/schema.mjs +1 -1
  380. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  381. package/dist/server/controllers/validation/types.js +0 -1
  382. package/dist/server/controllers/validation/types.js.map +1 -1
  383. package/dist/server/controllers/validation/types.mjs +1 -2
  384. package/dist/server/controllers/validation/types.mjs.map +1 -1
  385. package/dist/server/index.js +8 -8
  386. package/dist/server/middlewares/is-development-mode.js.map +1 -1
  387. package/dist/server/middlewares/is-development-mode.mjs.map +1 -1
  388. package/dist/server/register.js.map +1 -1
  389. package/dist/server/register.mjs.map +1 -1
  390. package/dist/server/routes/admin.js.map +1 -1
  391. package/dist/server/routes/admin.mjs.map +1 -1
  392. package/dist/server/routes/content-api.js.map +1 -1
  393. package/dist/server/routes/content-api.mjs.map +1 -1
  394. package/dist/server/routes/index.js.map +1 -1
  395. package/dist/server/routes/index.mjs.map +1 -1
  396. package/dist/server/services/api-handler.js.map +1 -1
  397. package/dist/server/services/api-handler.mjs.map +1 -1
  398. package/dist/server/services/builder.js.map +1 -1
  399. package/dist/server/services/builder.mjs.map +1 -1
  400. package/dist/server/services/component-categories.js.map +1 -1
  401. package/dist/server/services/component-categories.mjs +1 -1
  402. package/dist/server/services/component-categories.mjs.map +1 -1
  403. package/dist/server/services/components.js.map +1 -1
  404. package/dist/server/services/components.mjs +1 -1
  405. package/dist/server/services/components.mjs.map +1 -1
  406. package/dist/server/services/constants.js.map +1 -1
  407. package/dist/server/services/constants.mjs.map +1 -1
  408. package/dist/server/services/content-types.js.map +1 -1
  409. package/dist/server/services/content-types.mjs +1 -1
  410. package/dist/server/services/content-types.mjs.map +1 -1
  411. package/dist/server/services/index.js.map +1 -1
  412. package/dist/server/services/index.mjs.map +1 -1
  413. package/dist/server/services/schema-builder/component-builder.js.map +1 -1
  414. package/dist/server/services/schema-builder/component-builder.mjs +1 -1
  415. package/dist/server/services/schema-builder/component-builder.mjs.map +1 -1
  416. package/dist/server/services/schema-builder/content-type-builder.js.map +1 -1
  417. package/dist/server/services/schema-builder/content-type-builder.mjs +2 -2
  418. package/dist/server/services/schema-builder/content-type-builder.mjs.map +1 -1
  419. package/dist/server/services/schema-builder/index.js.map +1 -1
  420. package/dist/server/services/schema-builder/index.mjs +3 -3
  421. package/dist/server/services/schema-builder/index.mjs.map +1 -1
  422. package/dist/server/services/schema-builder/schema-handler.js.map +1 -1
  423. package/dist/server/services/schema-builder/schema-handler.mjs.map +1 -1
  424. package/dist/server/services/schema.js.map +1 -1
  425. package/dist/server/services/schema.mjs +1 -1
  426. package/dist/server/services/schema.mjs.map +1 -1
  427. package/dist/server/utils/attributes.js.map +1 -1
  428. package/dist/server/utils/attributes.mjs.map +1 -1
  429. package/dist/server/utils/index.js.map +1 -1
  430. package/dist/server/utils/index.mjs.map +1 -1
  431. package/dist/server/utils/typeguards.js.map +1 -1
  432. package/dist/server/utils/typeguards.mjs.map +1 -1
  433. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"component-category.js","sources":["../../../../server/src/controllers/validation/component-category.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isValidCategoryName } from './common';\n\nconst componentCategorySchema = yup\n .object({\n name: yup.string().min(3).test(isValidCategoryName).required('name.required'),\n })\n .noUnknown();\n\nexport default validateYupSchema(componentCategorySchema);\n"],"names":["componentCategorySchema","yup","object","name","string","min","test","isValidCategoryName","required","noUnknown","validateYupSchema"],"mappings":";;;;;AAGA,MAAMA,uBAAAA,GAA0BC,SAC7BC,CAAAA,MAAM,CAAC;IACNC,IAAMF,EAAAA,SAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,GAAGC,IAAI,CAACC,0BAAqBC,CAAAA,CAAAA,QAAQ,CAAC,eAAA;AAC/D,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,gCAAeC,wBAAkBV,uBAAyB,CAAA;;;;"}
1
+ {"version":3,"file":"component-category.js","sources":["../../../../server/src/controllers/validation/component-category.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isValidCategoryName } from './common';\n\nconst componentCategorySchema = yup\n .object({\n name: yup.string().min(3).test(isValidCategoryName).required('name.required'),\n })\n .noUnknown();\n\nexport default validateYupSchema(componentCategorySchema);\n"],"names":["componentCategorySchema","yup","object","name","string","min","test","isValidCategoryName","required","noUnknown","validateYupSchema"],"mappings":";;;;;AAGA,MAAMA,uBAAAA,GAA0BC,SAAAA,CAC7BC,MAAM,CAAC;IACNC,IAAAA,EAAMF,SAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,GAAGC,IAAI,CAACC,0BAAAA,CAAAA,CAAqBC,QAAQ,CAAC,eAAA;AAC/D,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,gCAAeC,wBAAkBV,uBAAAA,CAAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"component-category.mjs","sources":["../../../../server/src/controllers/validation/component-category.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isValidCategoryName } from './common';\n\nconst componentCategorySchema = yup\n .object({\n name: yup.string().min(3).test(isValidCategoryName).required('name.required'),\n })\n .noUnknown();\n\nexport default validateYupSchema(componentCategorySchema);\n"],"names":["componentCategorySchema","yup","object","name","string","min","test","isValidCategoryName","required","noUnknown","validateYupSchema"],"mappings":";;;AAGA,MAAMA,uBAAAA,GAA0BC,GAC7BC,CAAAA,MAAM,CAAC;IACNC,IAAMF,EAAAA,GAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,GAAGC,IAAI,CAACC,mBAAqBC,CAAAA,CAAAA,QAAQ,CAAC,eAAA;AAC/D,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,gCAAeC,kBAAkBV,uBAAyB,CAAA;;;;"}
1
+ {"version":3,"file":"component-category.mjs","sources":["../../../../server/src/controllers/validation/component-category.ts"],"sourcesContent":["import { yup, validateYupSchema } from '@strapi/utils';\nimport { isValidCategoryName } from './common';\n\nconst componentCategorySchema = yup\n .object({\n name: yup.string().min(3).test(isValidCategoryName).required('name.required'),\n })\n .noUnknown();\n\nexport default validateYupSchema(componentCategorySchema);\n"],"names":["componentCategorySchema","yup","object","name","string","min","test","isValidCategoryName","required","noUnknown","validateYupSchema"],"mappings":";;;AAGA,MAAMA,uBAAAA,GAA0BC,GAAAA,CAC7BC,MAAM,CAAC;IACNC,IAAAA,EAAMF,GAAAA,CAAIG,MAAM,EAAA,CAAGC,GAAG,CAAC,GAAGC,IAAI,CAACC,mBAAAA,CAAAA,CAAqBC,QAAQ,CAAC,eAAA;AAC/D,CAAA,CAAA,CACCC,SAAS,EAAA;AAEZ,gCAAeC,kBAAkBV,uBAAAA,CAAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sources":["../../../../server/src/controllers/validation/component.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct } from '@strapi/types';\nimport { modelTypes, DEFAULT_TYPES } from '../../services/constants';\nimport { isValidCategoryName, isValidIcon } from './common';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults } from './data-transform';\n\nexport const VALID_RELATIONS = ['oneToOne', 'oneToMany'];\nexport const VALID_TYPES = [...DEFAULT_TYPES, 'component', 'customField'];\n\nexport const componentSchema = createSchema(VALID_TYPES, VALID_RELATIONS, {\n modelType: modelTypes.COMPONENT,\n})\n .shape({\n displayName: yup.string().min(1).required('displayName.required'),\n icon: yup.string().nullable().test(isValidIcon),\n category: yup.string().nullable().test(isValidCategoryName).required('category.required'),\n })\n .required()\n .noUnknown();\n\nexport const nestedComponentSchema = yup.array().of(\n componentSchema\n .shape({\n uid: yup.string(),\n tmpUID: yup.string(),\n })\n .test({\n name: 'mustHaveUIDOrTmpUID',\n message: 'Component must have a uid or a tmpUID',\n test(attr: unknown) {\n if (_.has(attr, 'uid') && _.has(attr, 'tmpUID')) return false;\n if (!_.has(attr, 'uid') && !_.has(attr, 'tmpUID')) return false;\n return true;\n },\n })\n .required()\n .noUnknown()\n);\n\nexport const componentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateComponentInput = validateYupSchema(componentInputSchema);\n\nconst updateComponentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateUpdateComponentInput = (data: {\n component?: Struct.ComponentSchema;\n components?: Struct.ComponentSchema[];\n}) => {\n if (_.has(data, 'component') && data.component) {\n removeEmptyDefaults(data.component);\n }\n\n if (_.has(data, 'components') && Array.isArray(data.components)) {\n data.components.forEach((data) => {\n if (_.has(data, 'uid')) {\n removeEmptyDefaults(data);\n }\n });\n }\n\n return validateYupSchema(updateComponentInputSchema)(data);\n};\n"],"names":["VALID_RELATIONS","VALID_TYPES","DEFAULT_TYPES","componentSchema","createSchema","modelType","modelTypes","COMPONENT","shape","displayName","yup","string","min","required","icon","nullable","test","isValidIcon","category","isValidCategoryName","noUnknown","nestedComponentSchema","array","of","uid","tmpUID","name","message","attr","_","has","componentInputSchema","object","component","components","validateComponentInput","validateYupSchema","updateComponentInputSchema","validateUpdateComponentInput","data","removeEmptyDefaults","Array","isArray","forEach"],"mappings":";;;;;;;;;MASaA,eAAkB,GAAA;AAAC,IAAA,UAAA;AAAY,IAAA;;MAC/BC,WAAc,GAAA;AAAIC,IAAAA,GAAAA,uBAAAA;AAAe,IAAA,WAAA;AAAa,IAAA;;AAE9CC,MAAAA,eAAAA,GAAkBC,wBAAaH,CAAAA,WAAAA,EAAaD,eAAiB,EAAA;AACxEK,IAAAA,SAAAA,EAAWC,qBAAWC;AACxB,CAAA,CAAA,CACGC,KAAK,CAAC;AACLC,IAAAA,WAAAA,EAAaC,UAAIC,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,QAAQ,CAAC,sBAAA,CAAA;AAC1CC,IAAAA,IAAAA,EAAMJ,UAAIC,MAAM,EAAA,CAAGI,QAAQ,EAAA,CAAGC,IAAI,CAACC,kBAAAA,CAAAA;IACnCC,QAAUR,EAAAA,SAAAA,CAAIC,MAAM,EAAGI,CAAAA,QAAQ,GAAGC,IAAI,CAACG,0BAAqBN,CAAAA,CAAAA,QAAQ,CAAC,mBAAA;AACvE,CACCA,CAAAA,CAAAA,QAAQ,EACRO,CAAAA,SAAS;AAEL,MAAMC,wBAAwBX,SAAIY,CAAAA,KAAK,GAAGC,EAAE,CACjDpB,eACGK,CAAAA,KAAK,CAAC;AACLgB,IAAAA,GAAAA,EAAKd,UAAIC,MAAM,EAAA;AACfc,IAAAA,MAAAA,EAAQf,UAAIC,MAAM;AACpB,CAAA,CAAA,CACCK,IAAI,CAAC;IACJU,IAAM,EAAA,qBAAA;IACNC,OAAS,EAAA,uCAAA;AACTX,IAAAA,IAAAA,CAAAA,CAAKY,IAAa,EAAA;QAChB,IAAIC,CAAAA,CAAEC,GAAG,CAACF,IAAM,EAAA,KAAA,CAAA,IAAUC,EAAEC,GAAG,CAACF,IAAM,EAAA,QAAA,CAAA,EAAW,OAAO,KAAA;AACxD,QAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACF,IAAM,EAAA,KAAA,CAAA,IAAU,CAACC,CAAAA,CAAEC,GAAG,CAACF,IAAM,EAAA,QAAA,CAAA,EAAW,OAAO,KAAA;QAC1D,OAAO,IAAA;AACT;AACF,CACCf,CAAAA,CAAAA,QAAQ,EACRO,CAAAA,SAAS,EACZ;AAEWW,MAAAA,oBAAAA,GAAuBrB,SACjCsB,CAAAA,MAAM,CAAC;IACNC,SAAW9B,EAAAA,eAAAA;IACX+B,UAAYb,EAAAA;AACd,CAAA,CAAA,CACCD,SAAS;AAEL,MAAMe,sBAAyBC,GAAAA,uBAAAA,CAAkBL,oBAAsB;AAE9E,MAAMM,0BAAAA,GAA6B3B,SAChCsB,CAAAA,MAAM,CAAC;IACNC,SAAW9B,EAAAA,eAAAA;IACX+B,UAAYb,EAAAA;AACd,CAAA,CAAA,CACCD,SAAS,EAAA;AAEL,MAAMkB,+BAA+B,CAACC,IAAAA,GAAAA;AAI3C,IAAA,IAAIV,EAAEC,GAAG,CAACS,MAAM,WAAgBA,CAAAA,IAAAA,IAAAA,CAAKN,SAAS,EAAE;AAC9CO,QAAAA,iCAAAA,CAAoBD,KAAKN,SAAS,CAAA;AACpC;IAEA,IAAIJ,CAAAA,CAAEC,GAAG,CAACS,IAAM,EAAA,YAAA,CAAA,IAAiBE,MAAMC,OAAO,CAACH,IAAKL,CAAAA,UAAU,CAAG,EAAA;AAC/DK,QAAAA,IAAAA,CAAKL,UAAU,CAACS,OAAO,CAAC,CAACJ,IAAAA,GAAAA;AACvB,YAAA,IAAIV,CAAEC,CAAAA,GAAG,CAACS,IAAAA,EAAM,KAAQ,CAAA,EAAA;gBACtBC,iCAAoBD,CAAAA,IAAAA,CAAAA;AACtB;AACF,SAAA,CAAA;AACF;AAEA,IAAA,OAAOH,wBAAkBC,0BAA4BE,CAAAA,CAAAA,IAAAA,CAAAA;AACvD;;;;;;;;;;"}
1
+ {"version":3,"file":"component.js","sources":["../../../../server/src/controllers/validation/component.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct } from '@strapi/types';\nimport { modelTypes, DEFAULT_TYPES } from '../../services/constants';\nimport { isValidCategoryName, isValidIcon } from './common';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults } from './data-transform';\n\nexport const VALID_RELATIONS = ['oneToOne', 'oneToMany'];\nexport const VALID_TYPES = [...DEFAULT_TYPES, 'component', 'customField'];\n\nexport const componentSchema = createSchema(VALID_TYPES, VALID_RELATIONS, {\n modelType: modelTypes.COMPONENT,\n})\n .shape({\n displayName: yup.string().min(1).required('displayName.required'),\n icon: yup.string().nullable().test(isValidIcon),\n category: yup.string().nullable().test(isValidCategoryName).required('category.required'),\n })\n .required()\n .noUnknown();\n\nexport const nestedComponentSchema = yup.array().of(\n componentSchema\n .shape({\n uid: yup.string(),\n tmpUID: yup.string(),\n })\n .test({\n name: 'mustHaveUIDOrTmpUID',\n message: 'Component must have a uid or a tmpUID',\n test(attr: unknown) {\n if (_.has(attr, 'uid') && _.has(attr, 'tmpUID')) return false;\n if (!_.has(attr, 'uid') && !_.has(attr, 'tmpUID')) return false;\n return true;\n },\n })\n .required()\n .noUnknown()\n);\n\nexport const componentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateComponentInput = validateYupSchema(componentInputSchema);\n\nconst updateComponentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateUpdateComponentInput = (data: {\n component?: Struct.ComponentSchema;\n components?: Struct.ComponentSchema[];\n}) => {\n if (_.has(data, 'component') && data.component) {\n removeEmptyDefaults(data.component);\n }\n\n if (_.has(data, 'components') && Array.isArray(data.components)) {\n data.components.forEach((data) => {\n if (_.has(data, 'uid')) {\n removeEmptyDefaults(data);\n }\n });\n }\n\n return validateYupSchema(updateComponentInputSchema)(data);\n};\n"],"names":["VALID_RELATIONS","VALID_TYPES","DEFAULT_TYPES","componentSchema","createSchema","modelType","modelTypes","COMPONENT","shape","displayName","yup","string","min","required","icon","nullable","test","isValidIcon","category","isValidCategoryName","noUnknown","nestedComponentSchema","array","of","uid","tmpUID","name","message","attr","_","has","componentInputSchema","object","component","components","validateComponentInput","validateYupSchema","updateComponentInputSchema","validateUpdateComponentInput","data","removeEmptyDefaults","Array","isArray","forEach"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash';
2
2
  import { yup, validateYupSchema } from '@strapi/utils';
3
3
  import { modelTypes, DEFAULT_TYPES } from '../../services/constants.mjs';
4
- import { isValidIcon, isValidCategoryName } from './common.mjs';
4
+ import { isValidCategoryName, isValidIcon } from './common.mjs';
5
5
  import { createSchema } from './model-schema.mjs';
6
6
  import { removeEmptyDefaults } from './data-transform.mjs';
7
7
 
@@ -1 +1 @@
1
- {"version":3,"file":"component.mjs","sources":["../../../../server/src/controllers/validation/component.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct } from '@strapi/types';\nimport { modelTypes, DEFAULT_TYPES } from '../../services/constants';\nimport { isValidCategoryName, isValidIcon } from './common';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults } from './data-transform';\n\nexport const VALID_RELATIONS = ['oneToOne', 'oneToMany'];\nexport const VALID_TYPES = [...DEFAULT_TYPES, 'component', 'customField'];\n\nexport const componentSchema = createSchema(VALID_TYPES, VALID_RELATIONS, {\n modelType: modelTypes.COMPONENT,\n})\n .shape({\n displayName: yup.string().min(1).required('displayName.required'),\n icon: yup.string().nullable().test(isValidIcon),\n category: yup.string().nullable().test(isValidCategoryName).required('category.required'),\n })\n .required()\n .noUnknown();\n\nexport const nestedComponentSchema = yup.array().of(\n componentSchema\n .shape({\n uid: yup.string(),\n tmpUID: yup.string(),\n })\n .test({\n name: 'mustHaveUIDOrTmpUID',\n message: 'Component must have a uid or a tmpUID',\n test(attr: unknown) {\n if (_.has(attr, 'uid') && _.has(attr, 'tmpUID')) return false;\n if (!_.has(attr, 'uid') && !_.has(attr, 'tmpUID')) return false;\n return true;\n },\n })\n .required()\n .noUnknown()\n);\n\nexport const componentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateComponentInput = validateYupSchema(componentInputSchema);\n\nconst updateComponentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateUpdateComponentInput = (data: {\n component?: Struct.ComponentSchema;\n components?: Struct.ComponentSchema[];\n}) => {\n if (_.has(data, 'component') && data.component) {\n removeEmptyDefaults(data.component);\n }\n\n if (_.has(data, 'components') && Array.isArray(data.components)) {\n data.components.forEach((data) => {\n if (_.has(data, 'uid')) {\n removeEmptyDefaults(data);\n }\n });\n }\n\n return validateYupSchema(updateComponentInputSchema)(data);\n};\n"],"names":["VALID_RELATIONS","VALID_TYPES","DEFAULT_TYPES","componentSchema","createSchema","modelType","modelTypes","COMPONENT","shape","displayName","yup","string","min","required","icon","nullable","test","isValidIcon","category","isValidCategoryName","noUnknown","nestedComponentSchema","array","of","uid","tmpUID","name","message","attr","_","has","componentInputSchema","object","component","components","validateComponentInput","validateYupSchema","updateComponentInputSchema","validateUpdateComponentInput","data","removeEmptyDefaults","Array","isArray","forEach"],"mappings":";;;;;;;MASaA,eAAkB,GAAA;AAAC,IAAA,UAAA;AAAY,IAAA;;MAC/BC,WAAc,GAAA;AAAIC,IAAAA,GAAAA,aAAAA;AAAe,IAAA,WAAA;AAAa,IAAA;;AAE9CC,MAAAA,eAAAA,GAAkBC,YAAaH,CAAAA,WAAAA,EAAaD,eAAiB,EAAA;AACxEK,IAAAA,SAAAA,EAAWC,WAAWC;AACxB,CAAA,CAAA,CACGC,KAAK,CAAC;AACLC,IAAAA,WAAAA,EAAaC,IAAIC,MAAM,EAAA,CAAGC,GAAG,CAAC,CAAA,CAAA,CAAGC,QAAQ,CAAC,sBAAA,CAAA;AAC1CC,IAAAA,IAAAA,EAAMJ,IAAIC,MAAM,EAAA,CAAGI,QAAQ,EAAA,CAAGC,IAAI,CAACC,WAAAA,CAAAA;IACnCC,QAAUR,EAAAA,GAAAA,CAAIC,MAAM,EAAGI,CAAAA,QAAQ,GAAGC,IAAI,CAACG,mBAAqBN,CAAAA,CAAAA,QAAQ,CAAC,mBAAA;AACvE,CACCA,CAAAA,CAAAA,QAAQ,EACRO,CAAAA,SAAS;AAEL,MAAMC,wBAAwBX,GAAIY,CAAAA,KAAK,GAAGC,EAAE,CACjDpB,eACGK,CAAAA,KAAK,CAAC;AACLgB,IAAAA,GAAAA,EAAKd,IAAIC,MAAM,EAAA;AACfc,IAAAA,MAAAA,EAAQf,IAAIC,MAAM;AACpB,CAAA,CAAA,CACCK,IAAI,CAAC;IACJU,IAAM,EAAA,qBAAA;IACNC,OAAS,EAAA,uCAAA;AACTX,IAAAA,IAAAA,CAAAA,CAAKY,IAAa,EAAA;QAChB,IAAIC,CAAAA,CAAEC,GAAG,CAACF,IAAM,EAAA,KAAA,CAAA,IAAUC,EAAEC,GAAG,CAACF,IAAM,EAAA,QAAA,CAAA,EAAW,OAAO,KAAA;AACxD,QAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACF,IAAM,EAAA,KAAA,CAAA,IAAU,CAACC,CAAAA,CAAEC,GAAG,CAACF,IAAM,EAAA,QAAA,CAAA,EAAW,OAAO,KAAA;QAC1D,OAAO,IAAA;AACT;AACF,CACCf,CAAAA,CAAAA,QAAQ,EACRO,CAAAA,SAAS,EACZ;AAEWW,MAAAA,oBAAAA,GAAuBrB,GACjCsB,CAAAA,MAAM,CAAC;IACNC,SAAW9B,EAAAA,eAAAA;IACX+B,UAAYb,EAAAA;AACd,CAAA,CAAA,CACCD,SAAS;AAEL,MAAMe,sBAAyBC,GAAAA,iBAAAA,CAAkBL,oBAAsB;AAE9E,MAAMM,0BAAAA,GAA6B3B,GAChCsB,CAAAA,MAAM,CAAC;IACNC,SAAW9B,EAAAA,eAAAA;IACX+B,UAAYb,EAAAA;AACd,CAAA,CAAA,CACCD,SAAS,EAAA;AAEL,MAAMkB,+BAA+B,CAACC,IAAAA,GAAAA;AAI3C,IAAA,IAAIV,EAAEC,GAAG,CAACS,MAAM,WAAgBA,CAAAA,IAAAA,IAAAA,CAAKN,SAAS,EAAE;AAC9CO,QAAAA,mBAAAA,CAAoBD,KAAKN,SAAS,CAAA;AACpC;IAEA,IAAIJ,CAAAA,CAAEC,GAAG,CAACS,IAAM,EAAA,YAAA,CAAA,IAAiBE,MAAMC,OAAO,CAACH,IAAKL,CAAAA,UAAU,CAAG,EAAA;AAC/DK,QAAAA,IAAAA,CAAKL,UAAU,CAACS,OAAO,CAAC,CAACJ,IAAAA,GAAAA;AACvB,YAAA,IAAIV,CAAEC,CAAAA,GAAG,CAACS,IAAAA,EAAM,KAAQ,CAAA,EAAA;gBACtBC,mBAAoBD,CAAAA,IAAAA,CAAAA;AACtB;AACF,SAAA,CAAA;AACF;AAEA,IAAA,OAAOH,kBAAkBC,0BAA4BE,CAAAA,CAAAA,IAAAA,CAAAA;AACvD;;;;"}
1
+ {"version":3,"file":"component.mjs","sources":["../../../../server/src/controllers/validation/component.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct } from '@strapi/types';\nimport { modelTypes, DEFAULT_TYPES } from '../../services/constants';\nimport { isValidCategoryName, isValidIcon } from './common';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults } from './data-transform';\n\nexport const VALID_RELATIONS = ['oneToOne', 'oneToMany'];\nexport const VALID_TYPES = [...DEFAULT_TYPES, 'component', 'customField'];\n\nexport const componentSchema = createSchema(VALID_TYPES, VALID_RELATIONS, {\n modelType: modelTypes.COMPONENT,\n})\n .shape({\n displayName: yup.string().min(1).required('displayName.required'),\n icon: yup.string().nullable().test(isValidIcon),\n category: yup.string().nullable().test(isValidCategoryName).required('category.required'),\n })\n .required()\n .noUnknown();\n\nexport const nestedComponentSchema = yup.array().of(\n componentSchema\n .shape({\n uid: yup.string(),\n tmpUID: yup.string(),\n })\n .test({\n name: 'mustHaveUIDOrTmpUID',\n message: 'Component must have a uid or a tmpUID',\n test(attr: unknown) {\n if (_.has(attr, 'uid') && _.has(attr, 'tmpUID')) return false;\n if (!_.has(attr, 'uid') && !_.has(attr, 'tmpUID')) return false;\n return true;\n },\n })\n .required()\n .noUnknown()\n);\n\nexport const componentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateComponentInput = validateYupSchema(componentInputSchema);\n\nconst updateComponentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateUpdateComponentInput = (data: {\n component?: Struct.ComponentSchema;\n components?: Struct.ComponentSchema[];\n}) => {\n if (_.has(data, 'component') && data.component) {\n removeEmptyDefaults(data.component);\n }\n\n if (_.has(data, 'components') && Array.isArray(data.components)) {\n data.components.forEach((data) => {\n if (_.has(data, 'uid')) {\n removeEmptyDefaults(data);\n }\n });\n }\n\n return validateYupSchema(updateComponentInputSchema)(data);\n};\n"],"names":["VALID_RELATIONS","VALID_TYPES","DEFAULT_TYPES","componentSchema","createSchema","modelType","modelTypes","COMPONENT","shape","displayName","yup","string","min","required","icon","nullable","test","isValidIcon","category","isValidCategoryName","noUnknown","nestedComponentSchema","array","of","uid","tmpUID","name","message","attr","_","has","componentInputSchema","object","component","components","validateComponentInput","validateYupSchema","updateComponentInputSchema","validateUpdateComponentInput","data","removeEmptyDefaults","Array","isArray","forEach"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-type.js","sources":["../../../../server/src/controllers/validation/content-type.ts"],"sourcesContent":["/* eslint-disable no-template-curly-in-string */ // yup templates need to be in this format\n\nimport { flatMap, getOr, has, snakeCase } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct, Internal, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { modelTypes, DEFAULT_TYPES, typeKinds } from '../../services/constants';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults, removeDeletedUIDTargetFields } from './data-transform';\nimport { nestedComponentSchema } from './component';\n\n// Input flattens some fields of the \"info\" into the root type\nexport type CreateContentTypeInput = {\n uid?: UID.ContentType;\n contentType?: Partial<Struct.ContentTypeSchema> & Partial<Struct.ContentTypeSchemaInfo>;\n components?: Array<\n Partial<Struct.ComponentSchema> &\n Partial<Struct.SchemaInfo> & { tmpUID?: Internal.UID.Component }\n >;\n singularName: Struct.ContentTypeSchemaInfo['singularName'];\n attributes: Struct.SchemaAttributes & Record<string, any>;\n kind: Struct.ContentTypeKind;\n collectionName?: Struct.CollectionTypeSchema['collectionName'];\n pluralName: Struct.ContentTypeSchemaInfo['pluralName'];\n displayName: Struct.ContentTypeSchemaInfo['displayName'];\n description?: Struct.ContentTypeSchemaInfo['description'];\n options?: Struct.SchemaOptions;\n draftAndPublish?: Struct.SchemaOptions['draftAndPublish'];\n pluginOptions?: Struct.ContentTypeSchema['pluginOptions'];\n config?: object;\n};\n\n/**\n * Allowed relation per type kind\n */\nconst VALID_RELATIONS = {\n [typeKinds.SINGLE_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n [typeKinds.COLLECTION_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'manyToOne',\n 'manyToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n} as const;\n\n/**\n * Allowed types\n */\nconst VALID_TYPES = [...DEFAULT_TYPES, 'uid', 'component', 'dynamiczone', 'customField'];\n\n/**\n * Returns a yup schema to validate a content type payload\n */\nconst createContentTypeSchema = (data: CreateContentTypeInput, { isEdition = false } = {}) => {\n const kind: keyof typeof VALID_RELATIONS = getOr(\n typeKinds.COLLECTION_TYPE,\n 'contentType.kind',\n data\n );\n\n const contentTypeSchema = createSchema(VALID_TYPES, VALID_RELATIONS[kind] || [], {\n modelType: modelTypes.CONTENT_TYPE,\n })\n .shape({\n displayName: yup.string().min(1).required(),\n singularName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n pluralName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(nameIsNotExistingCollectionName(isEdition)) // TODO: v5: require singularName to not match a collection name\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n })\n .test(\n 'singularName-not-equal-pluralName',\n '${path}: singularName and pluralName should be different',\n (value) => value.singularName !== value.pluralName\n );\n\n return yup\n .object({\n // FIXME .noUnknown(false) will strip off the unwanted properties without throwing an error\n // Why not having .noUnknown() ? Because we want to be able to add options relatable to EE features\n // without having any reference to them in CE.\n // Why not handle an \"options\" object in the content-type ? The admin panel needs lots of rework\n // to be able to send this options object instead of top-level attributes.\n // @nathan-pichon 20/02/2023\n contentType: contentTypeSchema.required().noUnknown(false),\n components: nestedComponentSchema,\n })\n .noUnknown();\n};\n\n/**\n * Validator for content type creation\n */\nexport const validateContentTypeInput = (data: CreateContentTypeInput) => {\n return validateYupSchema(createContentTypeSchema(data))(data);\n};\n\n/**\n * Validator for content type edition\n */\nexport const validateUpdateContentTypeInput = (data: CreateContentTypeInput) => {\n if (has('contentType', data)) {\n removeEmptyDefaults(data.contentType);\n removeDeletedUIDTargetFields(data.contentType as Struct.ContentTypeSchema);\n }\n\n if (has('components', data) && Array.isArray(data.components)) {\n data.components.forEach((comp) => {\n if (has('uid', comp)) {\n removeEmptyDefaults(comp as Struct.ComponentSchema);\n }\n });\n }\n\n return validateYupSchema(createContentTypeSchema(data, { isEdition: true }))(data);\n};\n\nconst forbiddenContentTypeNameValidator = () => {\n const reservedNames = getService('builder').getReservedNames().models;\n\n return {\n name: 'forbiddenContentTypeName',\n message: `Content Type name cannot be one of ${reservedNames.join(', ')}`,\n test(value: unknown) {\n if (typeof value !== 'string') {\n return true;\n }\n\n return !getService('builder').isReservedModelName(value);\n },\n };\n};\n\nconst nameIsAvailable = (isEdition: boolean) => {\n // TODO TS: if strapi.contentTypes (ie, ContentTypes) works as an ArrayLike and is used like this, we may want to ensure it is typed so that it can be without using as\n const usedNames = flatMap((ct: Struct.ContentTypeSchema) => {\n return [ct.info?.singularName, ct.info?.pluralName];\n })(strapi.contentTypes as any);\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\nconst nameIsNotExistingCollectionName = (isEdition: boolean) => {\n const usedNames = Object.keys(strapi.contentTypes).map(\n (key) => strapi.contentTypes[key as Internal.UID.ContentType].collectionName\n ) as string[];\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]);\n\nexport const validateKind = validateYupSchema(kindSchema);\n"],"names":["VALID_RELATIONS","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","VALID_TYPES","DEFAULT_TYPES","createContentTypeSchema","data","isEdition","kind","getOr","contentTypeSchema","createSchema","modelType","modelTypes","CONTENT_TYPE","shape","displayName","yup","string","min","required","singularName","test","nameIsAvailable","forbiddenContentTypeNameValidator","isKebabCase","pluralName","nameIsNotExistingCollectionName","value","object","contentType","noUnknown","components","nestedComponentSchema","validateContentTypeInput","validateYupSchema","validateUpdateContentTypeInput","has","removeEmptyDefaults","removeDeletedUIDTargetFields","Array","isArray","forEach","comp","reservedNames","getService","getReservedNames","models","name","message","join","isReservedModelName","usedNames","flatMap","ct","info","strapi","contentTypes","every","usedName","snakeCase","Object","keys","map","key","collectionName","kindSchema","oneOf","validateKind"],"mappings":"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"}
1
+ {"version":3,"file":"content-type.js","sources":["../../../../server/src/controllers/validation/content-type.ts"],"sourcesContent":["/* eslint-disable no-template-curly-in-string */ // yup templates need to be in this format\n\nimport { flatMap, getOr, has, snakeCase } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct, Internal, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { modelTypes, DEFAULT_TYPES, typeKinds } from '../../services/constants';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults, removeDeletedUIDTargetFields } from './data-transform';\nimport { nestedComponentSchema } from './component';\n\n// Input flattens some fields of the \"info\" into the root type\nexport type CreateContentTypeInput = {\n uid?: UID.ContentType;\n contentType?: Partial<Struct.ContentTypeSchema> & Partial<Struct.ContentTypeSchemaInfo>;\n components?: Array<\n Partial<Struct.ComponentSchema> &\n Partial<Struct.SchemaInfo> & { tmpUID?: Internal.UID.Component }\n >;\n singularName: Struct.ContentTypeSchemaInfo['singularName'];\n attributes: Struct.SchemaAttributes & Record<string, any>;\n kind: Struct.ContentTypeKind;\n collectionName?: Struct.CollectionTypeSchema['collectionName'];\n pluralName: Struct.ContentTypeSchemaInfo['pluralName'];\n displayName: Struct.ContentTypeSchemaInfo['displayName'];\n description?: Struct.ContentTypeSchemaInfo['description'];\n options?: Struct.SchemaOptions;\n draftAndPublish?: Struct.SchemaOptions['draftAndPublish'];\n pluginOptions?: Struct.ContentTypeSchema['pluginOptions'];\n config?: object;\n};\n\n/**\n * Allowed relation per type kind\n */\nconst VALID_RELATIONS = {\n [typeKinds.SINGLE_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n [typeKinds.COLLECTION_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'manyToOne',\n 'manyToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n} as const;\n\n/**\n * Allowed types\n */\nconst VALID_TYPES = [...DEFAULT_TYPES, 'uid', 'component', 'dynamiczone', 'customField'];\n\n/**\n * Returns a yup schema to validate a content type payload\n */\nconst createContentTypeSchema = (data: CreateContentTypeInput, { isEdition = false } = {}) => {\n const kind: keyof typeof VALID_RELATIONS = getOr(\n typeKinds.COLLECTION_TYPE,\n 'contentType.kind',\n data\n );\n\n const contentTypeSchema = createSchema(VALID_TYPES, VALID_RELATIONS[kind] || [], {\n modelType: modelTypes.CONTENT_TYPE,\n })\n .shape({\n displayName: yup.string().min(1).required(),\n singularName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n pluralName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(nameIsNotExistingCollectionName(isEdition)) // TODO: v5: require singularName to not match a collection name\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n })\n .test(\n 'singularName-not-equal-pluralName',\n '${path}: singularName and pluralName should be different',\n (value) => value.singularName !== value.pluralName\n );\n\n return yup\n .object({\n // FIXME .noUnknown(false) will strip off the unwanted properties without throwing an error\n // Why not having .noUnknown() ? Because we want to be able to add options relatable to EE features\n // without having any reference to them in CE.\n // Why not handle an \"options\" object in the content-type ? The admin panel needs lots of rework\n // to be able to send this options object instead of top-level attributes.\n // @nathan-pichon 20/02/2023\n contentType: contentTypeSchema.required().noUnknown(false),\n components: nestedComponentSchema,\n })\n .noUnknown();\n};\n\n/**\n * Validator for content type creation\n */\nexport const validateContentTypeInput = (data: CreateContentTypeInput) => {\n return validateYupSchema(createContentTypeSchema(data))(data);\n};\n\n/**\n * Validator for content type edition\n */\nexport const validateUpdateContentTypeInput = (data: CreateContentTypeInput) => {\n if (has('contentType', data)) {\n removeEmptyDefaults(data.contentType);\n removeDeletedUIDTargetFields(data.contentType as Struct.ContentTypeSchema);\n }\n\n if (has('components', data) && Array.isArray(data.components)) {\n data.components.forEach((comp) => {\n if (has('uid', comp)) {\n removeEmptyDefaults(comp as Struct.ComponentSchema);\n }\n });\n }\n\n return validateYupSchema(createContentTypeSchema(data, { isEdition: true }))(data);\n};\n\nconst forbiddenContentTypeNameValidator = () => {\n const reservedNames = getService('builder').getReservedNames().models;\n\n return {\n name: 'forbiddenContentTypeName',\n message: `Content Type name cannot be one of ${reservedNames.join(', ')}`,\n test(value: unknown) {\n if (typeof value !== 'string') {\n return true;\n }\n\n return !getService('builder').isReservedModelName(value);\n },\n };\n};\n\nconst nameIsAvailable = (isEdition: boolean) => {\n // TODO TS: if strapi.contentTypes (ie, ContentTypes) works as an ArrayLike and is used like this, we may want to ensure it is typed so that it can be without using as\n const usedNames = flatMap((ct: Struct.ContentTypeSchema) => {\n return [ct.info?.singularName, ct.info?.pluralName];\n })(strapi.contentTypes as any);\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\nconst nameIsNotExistingCollectionName = (isEdition: boolean) => {\n const usedNames = Object.keys(strapi.contentTypes).map(\n (key) => strapi.contentTypes[key as Internal.UID.ContentType].collectionName\n ) as string[];\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]);\n\nexport const validateKind = validateYupSchema(kindSchema);\n"],"names":["VALID_RELATIONS","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","VALID_TYPES","DEFAULT_TYPES","createContentTypeSchema","data","isEdition","kind","getOr","contentTypeSchema","createSchema","modelType","modelTypes","CONTENT_TYPE","shape","displayName","yup","string","min","required","singularName","test","nameIsAvailable","forbiddenContentTypeNameValidator","isKebabCase","pluralName","nameIsNotExistingCollectionName","value","object","contentType","noUnknown","components","nestedComponentSchema","validateContentTypeInput","validateYupSchema","validateUpdateContentTypeInput","has","removeEmptyDefaults","removeDeletedUIDTargetFields","Array","isArray","forEach","comp","reservedNames","getService","getReservedNames","models","name","message","join","isReservedModelName","usedNames","flatMap","ct","info","strapi","contentTypes","every","usedName","snakeCase","Object","keys","map","key","collectionName","kindSchema","oneOf","validateKind"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-type.mjs","sources":["../../../../server/src/controllers/validation/content-type.ts"],"sourcesContent":["/* eslint-disable no-template-curly-in-string */ // yup templates need to be in this format\n\nimport { flatMap, getOr, has, snakeCase } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct, Internal, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { modelTypes, DEFAULT_TYPES, typeKinds } from '../../services/constants';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults, removeDeletedUIDTargetFields } from './data-transform';\nimport { nestedComponentSchema } from './component';\n\n// Input flattens some fields of the \"info\" into the root type\nexport type CreateContentTypeInput = {\n uid?: UID.ContentType;\n contentType?: Partial<Struct.ContentTypeSchema> & Partial<Struct.ContentTypeSchemaInfo>;\n components?: Array<\n Partial<Struct.ComponentSchema> &\n Partial<Struct.SchemaInfo> & { tmpUID?: Internal.UID.Component }\n >;\n singularName: Struct.ContentTypeSchemaInfo['singularName'];\n attributes: Struct.SchemaAttributes & Record<string, any>;\n kind: Struct.ContentTypeKind;\n collectionName?: Struct.CollectionTypeSchema['collectionName'];\n pluralName: Struct.ContentTypeSchemaInfo['pluralName'];\n displayName: Struct.ContentTypeSchemaInfo['displayName'];\n description?: Struct.ContentTypeSchemaInfo['description'];\n options?: Struct.SchemaOptions;\n draftAndPublish?: Struct.SchemaOptions['draftAndPublish'];\n pluginOptions?: Struct.ContentTypeSchema['pluginOptions'];\n config?: object;\n};\n\n/**\n * Allowed relation per type kind\n */\nconst VALID_RELATIONS = {\n [typeKinds.SINGLE_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n [typeKinds.COLLECTION_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'manyToOne',\n 'manyToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n} as const;\n\n/**\n * Allowed types\n */\nconst VALID_TYPES = [...DEFAULT_TYPES, 'uid', 'component', 'dynamiczone', 'customField'];\n\n/**\n * Returns a yup schema to validate a content type payload\n */\nconst createContentTypeSchema = (data: CreateContentTypeInput, { isEdition = false } = {}) => {\n const kind: keyof typeof VALID_RELATIONS = getOr(\n typeKinds.COLLECTION_TYPE,\n 'contentType.kind',\n data\n );\n\n const contentTypeSchema = createSchema(VALID_TYPES, VALID_RELATIONS[kind] || [], {\n modelType: modelTypes.CONTENT_TYPE,\n })\n .shape({\n displayName: yup.string().min(1).required(),\n singularName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n pluralName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(nameIsNotExistingCollectionName(isEdition)) // TODO: v5: require singularName to not match a collection name\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n })\n .test(\n 'singularName-not-equal-pluralName',\n '${path}: singularName and pluralName should be different',\n (value) => value.singularName !== value.pluralName\n );\n\n return yup\n .object({\n // FIXME .noUnknown(false) will strip off the unwanted properties without throwing an error\n // Why not having .noUnknown() ? Because we want to be able to add options relatable to EE features\n // without having any reference to them in CE.\n // Why not handle an \"options\" object in the content-type ? The admin panel needs lots of rework\n // to be able to send this options object instead of top-level attributes.\n // @nathan-pichon 20/02/2023\n contentType: contentTypeSchema.required().noUnknown(false),\n components: nestedComponentSchema,\n })\n .noUnknown();\n};\n\n/**\n * Validator for content type creation\n */\nexport const validateContentTypeInput = (data: CreateContentTypeInput) => {\n return validateYupSchema(createContentTypeSchema(data))(data);\n};\n\n/**\n * Validator for content type edition\n */\nexport const validateUpdateContentTypeInput = (data: CreateContentTypeInput) => {\n if (has('contentType', data)) {\n removeEmptyDefaults(data.contentType);\n removeDeletedUIDTargetFields(data.contentType as Struct.ContentTypeSchema);\n }\n\n if (has('components', data) && Array.isArray(data.components)) {\n data.components.forEach((comp) => {\n if (has('uid', comp)) {\n removeEmptyDefaults(comp as Struct.ComponentSchema);\n }\n });\n }\n\n return validateYupSchema(createContentTypeSchema(data, { isEdition: true }))(data);\n};\n\nconst forbiddenContentTypeNameValidator = () => {\n const reservedNames = getService('builder').getReservedNames().models;\n\n return {\n name: 'forbiddenContentTypeName',\n message: `Content Type name cannot be one of ${reservedNames.join(', ')}`,\n test(value: unknown) {\n if (typeof value !== 'string') {\n return true;\n }\n\n return !getService('builder').isReservedModelName(value);\n },\n };\n};\n\nconst nameIsAvailable = (isEdition: boolean) => {\n // TODO TS: if strapi.contentTypes (ie, ContentTypes) works as an ArrayLike and is used like this, we may want to ensure it is typed so that it can be without using as\n const usedNames = flatMap((ct: Struct.ContentTypeSchema) => {\n return [ct.info?.singularName, ct.info?.pluralName];\n })(strapi.contentTypes as any);\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\nconst nameIsNotExistingCollectionName = (isEdition: boolean) => {\n const usedNames = Object.keys(strapi.contentTypes).map(\n (key) => strapi.contentTypes[key as Internal.UID.ContentType].collectionName\n ) as string[];\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]);\n\nexport const validateKind = validateYupSchema(kindSchema);\n"],"names":["VALID_RELATIONS","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","VALID_TYPES","DEFAULT_TYPES","createContentTypeSchema","data","isEdition","kind","getOr","contentTypeSchema","createSchema","modelType","modelTypes","CONTENT_TYPE","shape","displayName","yup","string","min","required","singularName","test","nameIsAvailable","forbiddenContentTypeNameValidator","isKebabCase","pluralName","nameIsNotExistingCollectionName","value","object","contentType","noUnknown","components","nestedComponentSchema","validateContentTypeInput","validateYupSchema","validateUpdateContentTypeInput","has","removeEmptyDefaults","removeDeletedUIDTargetFields","Array","isArray","forEach","comp","reservedNames","getService","getReservedNames","models","name","message","join","isReservedModelName","usedNames","flatMap","ct","info","strapi","contentTypes","every","usedName","snakeCase","Object","keys","map","key","collectionName","kindSchema","oneOf","validateKind"],"mappings":"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"}
1
+ {"version":3,"file":"content-type.mjs","sources":["../../../../server/src/controllers/validation/content-type.ts"],"sourcesContent":["/* eslint-disable no-template-curly-in-string */ // yup templates need to be in this format\n\nimport { flatMap, getOr, has, snakeCase } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct, Internal, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { modelTypes, DEFAULT_TYPES, typeKinds } from '../../services/constants';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults, removeDeletedUIDTargetFields } from './data-transform';\nimport { nestedComponentSchema } from './component';\n\n// Input flattens some fields of the \"info\" into the root type\nexport type CreateContentTypeInput = {\n uid?: UID.ContentType;\n contentType?: Partial<Struct.ContentTypeSchema> & Partial<Struct.ContentTypeSchemaInfo>;\n components?: Array<\n Partial<Struct.ComponentSchema> &\n Partial<Struct.SchemaInfo> & { tmpUID?: Internal.UID.Component }\n >;\n singularName: Struct.ContentTypeSchemaInfo['singularName'];\n attributes: Struct.SchemaAttributes & Record<string, any>;\n kind: Struct.ContentTypeKind;\n collectionName?: Struct.CollectionTypeSchema['collectionName'];\n pluralName: Struct.ContentTypeSchemaInfo['pluralName'];\n displayName: Struct.ContentTypeSchemaInfo['displayName'];\n description?: Struct.ContentTypeSchemaInfo['description'];\n options?: Struct.SchemaOptions;\n draftAndPublish?: Struct.SchemaOptions['draftAndPublish'];\n pluginOptions?: Struct.ContentTypeSchema['pluginOptions'];\n config?: object;\n};\n\n/**\n * Allowed relation per type kind\n */\nconst VALID_RELATIONS = {\n [typeKinds.SINGLE_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n [typeKinds.COLLECTION_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'manyToOne',\n 'manyToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n} as const;\n\n/**\n * Allowed types\n */\nconst VALID_TYPES = [...DEFAULT_TYPES, 'uid', 'component', 'dynamiczone', 'customField'];\n\n/**\n * Returns a yup schema to validate a content type payload\n */\nconst createContentTypeSchema = (data: CreateContentTypeInput, { isEdition = false } = {}) => {\n const kind: keyof typeof VALID_RELATIONS = getOr(\n typeKinds.COLLECTION_TYPE,\n 'contentType.kind',\n data\n );\n\n const contentTypeSchema = createSchema(VALID_TYPES, VALID_RELATIONS[kind] || [], {\n modelType: modelTypes.CONTENT_TYPE,\n })\n .shape({\n displayName: yup.string().min(1).required(),\n singularName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n pluralName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(nameIsNotExistingCollectionName(isEdition)) // TODO: v5: require singularName to not match a collection name\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n })\n .test(\n 'singularName-not-equal-pluralName',\n '${path}: singularName and pluralName should be different',\n (value) => value.singularName !== value.pluralName\n );\n\n return yup\n .object({\n // FIXME .noUnknown(false) will strip off the unwanted properties without throwing an error\n // Why not having .noUnknown() ? Because we want to be able to add options relatable to EE features\n // without having any reference to them in CE.\n // Why not handle an \"options\" object in the content-type ? The admin panel needs lots of rework\n // to be able to send this options object instead of top-level attributes.\n // @nathan-pichon 20/02/2023\n contentType: contentTypeSchema.required().noUnknown(false),\n components: nestedComponentSchema,\n })\n .noUnknown();\n};\n\n/**\n * Validator for content type creation\n */\nexport const validateContentTypeInput = (data: CreateContentTypeInput) => {\n return validateYupSchema(createContentTypeSchema(data))(data);\n};\n\n/**\n * Validator for content type edition\n */\nexport const validateUpdateContentTypeInput = (data: CreateContentTypeInput) => {\n if (has('contentType', data)) {\n removeEmptyDefaults(data.contentType);\n removeDeletedUIDTargetFields(data.contentType as Struct.ContentTypeSchema);\n }\n\n if (has('components', data) && Array.isArray(data.components)) {\n data.components.forEach((comp) => {\n if (has('uid', comp)) {\n removeEmptyDefaults(comp as Struct.ComponentSchema);\n }\n });\n }\n\n return validateYupSchema(createContentTypeSchema(data, { isEdition: true }))(data);\n};\n\nconst forbiddenContentTypeNameValidator = () => {\n const reservedNames = getService('builder').getReservedNames().models;\n\n return {\n name: 'forbiddenContentTypeName',\n message: `Content Type name cannot be one of ${reservedNames.join(', ')}`,\n test(value: unknown) {\n if (typeof value !== 'string') {\n return true;\n }\n\n return !getService('builder').isReservedModelName(value);\n },\n };\n};\n\nconst nameIsAvailable = (isEdition: boolean) => {\n // TODO TS: if strapi.contentTypes (ie, ContentTypes) works as an ArrayLike and is used like this, we may want to ensure it is typed so that it can be without using as\n const usedNames = flatMap((ct: Struct.ContentTypeSchema) => {\n return [ct.info?.singularName, ct.info?.pluralName];\n })(strapi.contentTypes as any);\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\nconst nameIsNotExistingCollectionName = (isEdition: boolean) => {\n const usedNames = Object.keys(strapi.contentTypes).map(\n (key) => strapi.contentTypes[key as Internal.UID.ContentType].collectionName\n ) as string[];\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]);\n\nexport const validateKind = validateYupSchema(kindSchema);\n"],"names":["VALID_RELATIONS","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","VALID_TYPES","DEFAULT_TYPES","createContentTypeSchema","data","isEdition","kind","getOr","contentTypeSchema","createSchema","modelType","modelTypes","CONTENT_TYPE","shape","displayName","yup","string","min","required","singularName","test","nameIsAvailable","forbiddenContentTypeNameValidator","isKebabCase","pluralName","nameIsNotExistingCollectionName","value","object","contentType","noUnknown","components","nestedComponentSchema","validateContentTypeInput","validateYupSchema","validateUpdateContentTypeInput","has","removeEmptyDefaults","removeDeletedUIDTargetFields","Array","isArray","forEach","comp","reservedNames","getService","getReservedNames","models","name","message","join","isReservedModelName","usedNames","flatMap","ct","info","strapi","contentTypes","every","usedName","snakeCase","Object","keys","map","key","collectionName","kindSchema","oneOf","validateKind"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-transform.js","sources":["../../../../server/src/controllers/validation/data-transform.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\nimport _ from 'lodash';\nimport { hasDefaultAttribute } from '../../utils/typeguards';\n\nexport const removeEmptyDefaults = (\n data: Partial<Struct.ContentTypeSchema> | Partial<Struct.ComponentSchema> | undefined\n) => {\n const { attributes } = data || {};\n\n Object.keys(attributes!).forEach((attributeName) => {\n const attribute = attributes![attributeName];\n\n if (hasDefaultAttribute(attribute) && attribute.default === '') {\n attribute.default = undefined;\n }\n });\n};\n\nexport const removeDeletedUIDTargetFields = (data: Struct.ContentTypeSchema) => {\n if (_.has(data, 'attributes')) {\n Object.values(data.attributes).forEach((attribute) => {\n if (\n attribute.type === 'uid' &&\n !_.isUndefined(attribute.targetField) &&\n !_.has(data.attributes, attribute.targetField)\n ) {\n attribute.targetField = undefined;\n }\n });\n }\n};\n"],"names":["removeEmptyDefaults","data","attributes","Object","keys","forEach","attributeName","attribute","hasDefaultAttribute","default","undefined","removeDeletedUIDTargetFields","_","has","values","type","isUndefined","targetField"],"mappings":";;;;;AAIO,MAAMA,sBAAsB,CACjCC,IAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,UAAU,EAAE,GAAGD,QAAQ,EAAC;AAEhCE,IAAAA,MAAAA,CAAOC,IAAI,CAACF,UAAaG,CAAAA,CAAAA,OAAO,CAAC,CAACC,aAAAA,GAAAA;QAChC,MAAMC,SAAAA,GAAYL,UAAW,CAACI,aAAc,CAAA;AAE5C,QAAA,IAAIE,8BAAoBD,CAAAA,SAAAA,CAAAA,IAAcA,SAAUE,CAAAA,OAAO,KAAK,EAAI,EAAA;AAC9DF,YAAAA,SAAAA,CAAUE,OAAO,GAAGC,SAAAA;AACtB;AACF,KAAA,CAAA;AACF;AAEO,MAAMC,+BAA+B,CAACV,IAAAA,GAAAA;AAC3C,IAAA,IAAIW,CAAEC,CAAAA,GAAG,CAACZ,IAAAA,EAAM,YAAe,CAAA,EAAA;AAC7BE,QAAAA,MAAAA,CAAOW,MAAM,CAACb,IAAAA,CAAKC,UAAU,CAAEG,CAAAA,OAAO,CAAC,CAACE,SAAAA,GAAAA;YACtC,IACEA,SAAAA,CAAUQ,IAAI,KAAK,KAAA,IACnB,CAACH,CAAEI,CAAAA,WAAW,CAACT,SAAUU,CAAAA,WAAW,KACpC,CAACL,CAAAA,CAAEC,GAAG,CAACZ,IAAAA,CAAKC,UAAU,EAAEK,SAAAA,CAAUU,WAAW,CAC7C,EAAA;AACAV,gBAAAA,SAAAA,CAAUU,WAAW,GAAGP,SAAAA;AAC1B;AACF,SAAA,CAAA;AACF;AACF;;;;;"}
1
+ {"version":3,"file":"data-transform.js","sources":["../../../../server/src/controllers/validation/data-transform.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\nimport _ from 'lodash';\nimport { hasDefaultAttribute } from '../../utils/typeguards';\n\nexport const removeEmptyDefaults = (\n data: Partial<Struct.ContentTypeSchema> | Partial<Struct.ComponentSchema> | undefined\n) => {\n const { attributes } = data || {};\n\n Object.keys(attributes!).forEach((attributeName) => {\n const attribute = attributes![attributeName];\n\n if (hasDefaultAttribute(attribute) && attribute.default === '') {\n attribute.default = undefined;\n }\n });\n};\n\nexport const removeDeletedUIDTargetFields = (data: Struct.ContentTypeSchema) => {\n if (_.has(data, 'attributes')) {\n Object.values(data.attributes).forEach((attribute) => {\n if (\n attribute.type === 'uid' &&\n !_.isUndefined(attribute.targetField) &&\n !_.has(data.attributes, attribute.targetField)\n ) {\n attribute.targetField = undefined;\n }\n });\n }\n};\n"],"names":["removeEmptyDefaults","data","attributes","Object","keys","forEach","attributeName","attribute","hasDefaultAttribute","default","undefined","removeDeletedUIDTargetFields","_","has","values","type","isUndefined","targetField"],"mappings":";;;;;AAIO,MAAMA,sBAAsB,CACjCC,IAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,UAAU,EAAE,GAAGD,QAAQ,EAAC;AAEhCE,IAAAA,MAAAA,CAAOC,IAAI,CAACF,UAAAA,CAAAA,CAAaG,OAAO,CAAC,CAACC,aAAAA,GAAAA;QAChC,MAAMC,SAAAA,GAAYL,UAAW,CAACI,aAAAA,CAAc;AAE5C,QAAA,IAAIE,8BAAAA,CAAoBD,SAAAA,CAAAA,IAAcA,SAAAA,CAAUE,OAAO,KAAK,EAAA,EAAI;AAC9DF,YAAAA,SAAAA,CAAUE,OAAO,GAAGC,SAAAA;AACtB,QAAA;AACF,IAAA,CAAA,CAAA;AACF;AAEO,MAAMC,+BAA+B,CAACV,IAAAA,GAAAA;AAC3C,IAAA,IAAIW,CAAAA,CAAEC,GAAG,CAACZ,IAAAA,EAAM,YAAA,CAAA,EAAe;AAC7BE,QAAAA,MAAAA,CAAOW,MAAM,CAACb,IAAAA,CAAKC,UAAU,CAAA,CAAEG,OAAO,CAAC,CAACE,SAAAA,GAAAA;YACtC,IACEA,SAAAA,CAAUQ,IAAI,KAAK,KAAA,IACnB,CAACH,CAAAA,CAAEI,WAAW,CAACT,SAAAA,CAAUU,WAAW,KACpC,CAACL,CAAAA,CAAEC,GAAG,CAACZ,IAAAA,CAAKC,UAAU,EAAEK,SAAAA,CAAUU,WAAW,CAAA,EAC7C;AACAV,gBAAAA,SAAAA,CAAUU,WAAW,GAAGP,SAAAA;AAC1B,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AACF;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-transform.mjs","sources":["../../../../server/src/controllers/validation/data-transform.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\nimport _ from 'lodash';\nimport { hasDefaultAttribute } from '../../utils/typeguards';\n\nexport const removeEmptyDefaults = (\n data: Partial<Struct.ContentTypeSchema> | Partial<Struct.ComponentSchema> | undefined\n) => {\n const { attributes } = data || {};\n\n Object.keys(attributes!).forEach((attributeName) => {\n const attribute = attributes![attributeName];\n\n if (hasDefaultAttribute(attribute) && attribute.default === '') {\n attribute.default = undefined;\n }\n });\n};\n\nexport const removeDeletedUIDTargetFields = (data: Struct.ContentTypeSchema) => {\n if (_.has(data, 'attributes')) {\n Object.values(data.attributes).forEach((attribute) => {\n if (\n attribute.type === 'uid' &&\n !_.isUndefined(attribute.targetField) &&\n !_.has(data.attributes, attribute.targetField)\n ) {\n attribute.targetField = undefined;\n }\n });\n }\n};\n"],"names":["removeEmptyDefaults","data","attributes","Object","keys","forEach","attributeName","attribute","hasDefaultAttribute","default","undefined","removeDeletedUIDTargetFields","_","has","values","type","isUndefined","targetField"],"mappings":";;;AAIO,MAAMA,sBAAsB,CACjCC,IAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,UAAU,EAAE,GAAGD,QAAQ,EAAC;AAEhCE,IAAAA,MAAAA,CAAOC,IAAI,CAACF,UAAaG,CAAAA,CAAAA,OAAO,CAAC,CAACC,aAAAA,GAAAA;QAChC,MAAMC,SAAAA,GAAYL,UAAW,CAACI,aAAc,CAAA;AAE5C,QAAA,IAAIE,mBAAoBD,CAAAA,SAAAA,CAAAA,IAAcA,SAAUE,CAAAA,OAAO,KAAK,EAAI,EAAA;AAC9DF,YAAAA,SAAAA,CAAUE,OAAO,GAAGC,SAAAA;AACtB;AACF,KAAA,CAAA;AACF;AAEO,MAAMC,+BAA+B,CAACV,IAAAA,GAAAA;AAC3C,IAAA,IAAIW,CAAEC,CAAAA,GAAG,CAACZ,IAAAA,EAAM,YAAe,CAAA,EAAA;AAC7BE,QAAAA,MAAAA,CAAOW,MAAM,CAACb,IAAAA,CAAKC,UAAU,CAAEG,CAAAA,OAAO,CAAC,CAACE,SAAAA,GAAAA;YACtC,IACEA,SAAAA,CAAUQ,IAAI,KAAK,KAAA,IACnB,CAACH,CAAEI,CAAAA,WAAW,CAACT,SAAUU,CAAAA,WAAW,KACpC,CAACL,CAAAA,CAAEC,GAAG,CAACZ,IAAAA,CAAKC,UAAU,EAAEK,SAAAA,CAAUU,WAAW,CAC7C,EAAA;AACAV,gBAAAA,SAAAA,CAAUU,WAAW,GAAGP,SAAAA;AAC1B;AACF,SAAA,CAAA;AACF;AACF;;;;"}
1
+ {"version":3,"file":"data-transform.mjs","sources":["../../../../server/src/controllers/validation/data-transform.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\nimport _ from 'lodash';\nimport { hasDefaultAttribute } from '../../utils/typeguards';\n\nexport const removeEmptyDefaults = (\n data: Partial<Struct.ContentTypeSchema> | Partial<Struct.ComponentSchema> | undefined\n) => {\n const { attributes } = data || {};\n\n Object.keys(attributes!).forEach((attributeName) => {\n const attribute = attributes![attributeName];\n\n if (hasDefaultAttribute(attribute) && attribute.default === '') {\n attribute.default = undefined;\n }\n });\n};\n\nexport const removeDeletedUIDTargetFields = (data: Struct.ContentTypeSchema) => {\n if (_.has(data, 'attributes')) {\n Object.values(data.attributes).forEach((attribute) => {\n if (\n attribute.type === 'uid' &&\n !_.isUndefined(attribute.targetField) &&\n !_.has(data.attributes, attribute.targetField)\n ) {\n attribute.targetField = undefined;\n }\n });\n }\n};\n"],"names":["removeEmptyDefaults","data","attributes","Object","keys","forEach","attributeName","attribute","hasDefaultAttribute","default","undefined","removeDeletedUIDTargetFields","_","has","values","type","isUndefined","targetField"],"mappings":";;;AAIO,MAAMA,sBAAsB,CACjCC,IAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,UAAU,EAAE,GAAGD,QAAQ,EAAC;AAEhCE,IAAAA,MAAAA,CAAOC,IAAI,CAACF,UAAAA,CAAAA,CAAaG,OAAO,CAAC,CAACC,aAAAA,GAAAA;QAChC,MAAMC,SAAAA,GAAYL,UAAW,CAACI,aAAAA,CAAc;AAE5C,QAAA,IAAIE,mBAAAA,CAAoBD,SAAAA,CAAAA,IAAcA,SAAAA,CAAUE,OAAO,KAAK,EAAA,EAAI;AAC9DF,YAAAA,SAAAA,CAAUE,OAAO,GAAGC,SAAAA;AACtB,QAAA;AACF,IAAA,CAAA,CAAA;AACF;AAEO,MAAMC,+BAA+B,CAACV,IAAAA,GAAAA;AAC3C,IAAA,IAAIW,CAAAA,CAAEC,GAAG,CAACZ,IAAAA,EAAM,YAAA,CAAA,EAAe;AAC7BE,QAAAA,MAAAA,CAAOW,MAAM,CAACb,IAAAA,CAAKC,UAAU,CAAA,CAAEG,OAAO,CAAC,CAACE,SAAAA,GAAAA;YACtC,IACEA,SAAAA,CAAUQ,IAAI,KAAK,KAAA,IACnB,CAACH,CAAAA,CAAEI,WAAW,CAACT,SAAAA,CAAUU,WAAW,KACpC,CAACL,CAAAA,CAAEC,GAAG,CAACZ,IAAAA,CAAKC,UAAU,EAAEK,SAAAA,CAAUU,WAAW,CAAA,EAC7C;AACAV,gBAAAA,SAAAA,CAAUU,WAAW,GAAGP,SAAAA;AAC1B,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"model-schema.js","sources":["../../../../server/src/controllers/validation/model-schema.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { snakeCase } from 'lodash/fp';\nimport { modelTypes, typeKinds } from '../../services/constants';\nimport { getService } from '../../utils';\nimport { isValidKey, isValidCollectionName } from './common';\nimport { getTypeValidator } from './types';\nimport { getRelationValidator } from './relations';\n\ntype ModelTypeInput = (typeof modelTypes)[keyof typeof modelTypes];\n\ntype CreateAttributesInput = {\n types: ReadonlyArray<string>;\n relations: ReadonlyArray<string>;\n modelType?: ModelTypeInput;\n};\n\nexport const createSchema = (\n types: CreateAttributesInput['types'],\n relations: CreateAttributesInput['relations'],\n { modelType }: { modelType?: ModelTypeInput } = {}\n) => {\n const shape = {\n description: yup.string(),\n options: yup.object(),\n pluginOptions: yup.object(),\n collectionName: yup.string().nullable().test(isValidCollectionName),\n attributes: createAttributesValidator({ types, relations, modelType }),\n draftAndPublish: yup.boolean(),\n } as any;\n\n if (modelType === modelTypes.CONTENT_TYPE) {\n shape.kind = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]).nullable();\n }\n\n return yup.object(shape).noUnknown();\n};\n\nconst createAttributesValidator = ({ types, modelType, relations }: CreateAttributesInput) => {\n return yup.lazy((attributes) => {\n return yup\n .object()\n .shape(\n _.mapValues(attributes, (attribute, key) => {\n if (isForbiddenKey(key)) {\n return forbiddenValidator();\n }\n\n if (isConflictingKey(key, attributes)) {\n return conflictingKeysValidator(key);\n }\n\n if (attribute.type === 'relation') {\n return getRelationValidator(attribute, relations).test(isValidKey(key));\n }\n\n if (_.has(attribute, 'type')) {\n return getTypeValidator(attribute, { types, modelType, attributes }).test(\n isValidKey(key)\n );\n }\n\n return typeOrRelationValidator;\n })\n )\n .required('attributes.required');\n });\n};\n\nconst isConflictingKey = (key: string, attributes: Record<string, any>) => {\n const snakeCaseKey = snakeCase(key);\n\n return Object.keys(attributes).some((existingKey) => {\n if (existingKey === key) return false; // don't compare against itself\n return snakeCase(existingKey) === snakeCaseKey;\n });\n};\n\nconst isForbiddenKey = (key: string) => {\n return getService('builder').isReservedAttributeName(key);\n};\n\nconst forbiddenValidator = () => {\n const reservedNames = [...getService('builder').getReservedNames().attributes];\n\n return yup.mixed().test({\n name: 'forbiddenKeys',\n message: `Attribute keys cannot be one of ${reservedNames.join(', ')}`,\n test: () => false,\n });\n};\n\nconst conflictingKeysValidator = (key: string) => {\n return yup.mixed().test({\n name: 'conflictingKeys',\n message: `Attribute ${key} conflicts with an existing key`,\n test: () => false,\n });\n};\n\nconst typeOrRelationValidator = yup.object().test({\n name: 'mustHaveTypeOrTarget',\n message: 'Attribute must have either a type or a target',\n test: () => false,\n});\n"],"names":["createSchema","types","relations","modelType","shape","description","yup","string","options","object","pluginOptions","collectionName","nullable","test","isValidCollectionName","attributes","createAttributesValidator","draftAndPublish","boolean","modelTypes","CONTENT_TYPE","kind","oneOf","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","noUnknown","lazy","_","mapValues","attribute","key","isForbiddenKey","forbiddenValidator","isConflictingKey","conflictingKeysValidator","type","getRelationValidator","isValidKey","has","getTypeValidator","typeOrRelationValidator","required","snakeCaseKey","snakeCase","Object","keys","some","existingKey","getService","isReservedAttributeName","reservedNames","getReservedNames","mixed","name","message","join"],"mappings":"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"}
1
+ {"version":3,"file":"model-schema.js","sources":["../../../../server/src/controllers/validation/model-schema.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { snakeCase } from 'lodash/fp';\nimport { modelTypes, typeKinds } from '../../services/constants';\nimport { getService } from '../../utils';\nimport { isValidKey, isValidCollectionName } from './common';\nimport { getTypeValidator } from './types';\nimport { getRelationValidator } from './relations';\n\ntype ModelTypeInput = (typeof modelTypes)[keyof typeof modelTypes];\n\ntype CreateAttributesInput = {\n types: ReadonlyArray<string>;\n relations: ReadonlyArray<string>;\n modelType?: ModelTypeInput;\n};\n\nexport const createSchema = (\n types: CreateAttributesInput['types'],\n relations: CreateAttributesInput['relations'],\n { modelType }: { modelType?: ModelTypeInput } = {}\n) => {\n const shape = {\n description: yup.string(),\n options: yup.object(),\n pluginOptions: yup.object(),\n collectionName: yup.string().nullable().test(isValidCollectionName),\n attributes: createAttributesValidator({ types, relations, modelType }),\n draftAndPublish: yup.boolean(),\n } as any;\n\n if (modelType === modelTypes.CONTENT_TYPE) {\n shape.kind = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]).nullable();\n }\n\n return yup.object(shape).noUnknown();\n};\n\nconst createAttributesValidator = ({ types, modelType, relations }: CreateAttributesInput) => {\n return yup.lazy((attributes) => {\n return yup\n .object()\n .shape(\n _.mapValues(attributes, (attribute, key) => {\n if (isForbiddenKey(key)) {\n return forbiddenValidator();\n }\n\n if (isConflictingKey(key, attributes)) {\n return conflictingKeysValidator(key);\n }\n\n if (attribute.type === 'relation') {\n return getRelationValidator(attribute, relations).test(isValidKey(key));\n }\n\n if (_.has(attribute, 'type')) {\n return getTypeValidator(attribute, { types, modelType, attributes }).test(\n isValidKey(key)\n );\n }\n\n return typeOrRelationValidator;\n })\n )\n .required('attributes.required');\n });\n};\n\nconst isConflictingKey = (key: string, attributes: Record<string, any>) => {\n const snakeCaseKey = snakeCase(key);\n\n return Object.keys(attributes).some((existingKey) => {\n if (existingKey === key) return false; // don't compare against itself\n return snakeCase(existingKey) === snakeCaseKey;\n });\n};\n\nconst isForbiddenKey = (key: string) => {\n return getService('builder').isReservedAttributeName(key);\n};\n\nconst forbiddenValidator = () => {\n const reservedNames = [...getService('builder').getReservedNames().attributes];\n\n return yup.mixed().test({\n name: 'forbiddenKeys',\n message: `Attribute keys cannot be one of ${reservedNames.join(', ')}`,\n test: () => false,\n });\n};\n\nconst conflictingKeysValidator = (key: string) => {\n return yup.mixed().test({\n name: 'conflictingKeys',\n message: `Attribute ${key} conflicts with an existing key`,\n test: () => false,\n });\n};\n\nconst typeOrRelationValidator = yup.object().test({\n name: 'mustHaveTypeOrTarget',\n message: 'Attribute must have either a type or a target',\n test: () => false,\n});\n"],"names":["createSchema","types","relations","modelType","shape","description","yup","string","options","object","pluginOptions","collectionName","nullable","test","isValidCollectionName","attributes","createAttributesValidator","draftAndPublish","boolean","modelTypes","CONTENT_TYPE","kind","oneOf","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","noUnknown","lazy","_","mapValues","attribute","key","isForbiddenKey","forbiddenValidator","isConflictingKey","conflictingKeysValidator","type","getRelationValidator","isValidKey","has","getTypeValidator","typeOrRelationValidator","required","snakeCaseKey","snakeCase","Object","keys","some","existingKey","getService","isReservedAttributeName","reservedNames","getReservedNames","mixed","name","message","join"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"model-schema.mjs","sources":["../../../../server/src/controllers/validation/model-schema.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { snakeCase } from 'lodash/fp';\nimport { modelTypes, typeKinds } from '../../services/constants';\nimport { getService } from '../../utils';\nimport { isValidKey, isValidCollectionName } from './common';\nimport { getTypeValidator } from './types';\nimport { getRelationValidator } from './relations';\n\ntype ModelTypeInput = (typeof modelTypes)[keyof typeof modelTypes];\n\ntype CreateAttributesInput = {\n types: ReadonlyArray<string>;\n relations: ReadonlyArray<string>;\n modelType?: ModelTypeInput;\n};\n\nexport const createSchema = (\n types: CreateAttributesInput['types'],\n relations: CreateAttributesInput['relations'],\n { modelType }: { modelType?: ModelTypeInput } = {}\n) => {\n const shape = {\n description: yup.string(),\n options: yup.object(),\n pluginOptions: yup.object(),\n collectionName: yup.string().nullable().test(isValidCollectionName),\n attributes: createAttributesValidator({ types, relations, modelType }),\n draftAndPublish: yup.boolean(),\n } as any;\n\n if (modelType === modelTypes.CONTENT_TYPE) {\n shape.kind = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]).nullable();\n }\n\n return yup.object(shape).noUnknown();\n};\n\nconst createAttributesValidator = ({ types, modelType, relations }: CreateAttributesInput) => {\n return yup.lazy((attributes) => {\n return yup\n .object()\n .shape(\n _.mapValues(attributes, (attribute, key) => {\n if (isForbiddenKey(key)) {\n return forbiddenValidator();\n }\n\n if (isConflictingKey(key, attributes)) {\n return conflictingKeysValidator(key);\n }\n\n if (attribute.type === 'relation') {\n return getRelationValidator(attribute, relations).test(isValidKey(key));\n }\n\n if (_.has(attribute, 'type')) {\n return getTypeValidator(attribute, { types, modelType, attributes }).test(\n isValidKey(key)\n );\n }\n\n return typeOrRelationValidator;\n })\n )\n .required('attributes.required');\n });\n};\n\nconst isConflictingKey = (key: string, attributes: Record<string, any>) => {\n const snakeCaseKey = snakeCase(key);\n\n return Object.keys(attributes).some((existingKey) => {\n if (existingKey === key) return false; // don't compare against itself\n return snakeCase(existingKey) === snakeCaseKey;\n });\n};\n\nconst isForbiddenKey = (key: string) => {\n return getService('builder').isReservedAttributeName(key);\n};\n\nconst forbiddenValidator = () => {\n const reservedNames = [...getService('builder').getReservedNames().attributes];\n\n return yup.mixed().test({\n name: 'forbiddenKeys',\n message: `Attribute keys cannot be one of ${reservedNames.join(', ')}`,\n test: () => false,\n });\n};\n\nconst conflictingKeysValidator = (key: string) => {\n return yup.mixed().test({\n name: 'conflictingKeys',\n message: `Attribute ${key} conflicts with an existing key`,\n test: () => false,\n });\n};\n\nconst typeOrRelationValidator = yup.object().test({\n name: 'mustHaveTypeOrTarget',\n message: 'Attribute must have either a type or a target',\n test: () => false,\n});\n"],"names":["createSchema","types","relations","modelType","shape","description","yup","string","options","object","pluginOptions","collectionName","nullable","test","isValidCollectionName","attributes","createAttributesValidator","draftAndPublish","boolean","modelTypes","CONTENT_TYPE","kind","oneOf","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","noUnknown","lazy","_","mapValues","attribute","key","isForbiddenKey","forbiddenValidator","isConflictingKey","conflictingKeysValidator","type","getRelationValidator","isValidKey","has","getTypeValidator","typeOrRelationValidator","required","snakeCaseKey","snakeCase","Object","keys","some","existingKey","getService","isReservedAttributeName","reservedNames","getReservedNames","mixed","name","message","join"],"mappings":"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"}
1
+ {"version":3,"file":"model-schema.mjs","sources":["../../../../server/src/controllers/validation/model-schema.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { snakeCase } from 'lodash/fp';\nimport { modelTypes, typeKinds } from '../../services/constants';\nimport { getService } from '../../utils';\nimport { isValidKey, isValidCollectionName } from './common';\nimport { getTypeValidator } from './types';\nimport { getRelationValidator } from './relations';\n\ntype ModelTypeInput = (typeof modelTypes)[keyof typeof modelTypes];\n\ntype CreateAttributesInput = {\n types: ReadonlyArray<string>;\n relations: ReadonlyArray<string>;\n modelType?: ModelTypeInput;\n};\n\nexport const createSchema = (\n types: CreateAttributesInput['types'],\n relations: CreateAttributesInput['relations'],\n { modelType }: { modelType?: ModelTypeInput } = {}\n) => {\n const shape = {\n description: yup.string(),\n options: yup.object(),\n pluginOptions: yup.object(),\n collectionName: yup.string().nullable().test(isValidCollectionName),\n attributes: createAttributesValidator({ types, relations, modelType }),\n draftAndPublish: yup.boolean(),\n } as any;\n\n if (modelType === modelTypes.CONTENT_TYPE) {\n shape.kind = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]).nullable();\n }\n\n return yup.object(shape).noUnknown();\n};\n\nconst createAttributesValidator = ({ types, modelType, relations }: CreateAttributesInput) => {\n return yup.lazy((attributes) => {\n return yup\n .object()\n .shape(\n _.mapValues(attributes, (attribute, key) => {\n if (isForbiddenKey(key)) {\n return forbiddenValidator();\n }\n\n if (isConflictingKey(key, attributes)) {\n return conflictingKeysValidator(key);\n }\n\n if (attribute.type === 'relation') {\n return getRelationValidator(attribute, relations).test(isValidKey(key));\n }\n\n if (_.has(attribute, 'type')) {\n return getTypeValidator(attribute, { types, modelType, attributes }).test(\n isValidKey(key)\n );\n }\n\n return typeOrRelationValidator;\n })\n )\n .required('attributes.required');\n });\n};\n\nconst isConflictingKey = (key: string, attributes: Record<string, any>) => {\n const snakeCaseKey = snakeCase(key);\n\n return Object.keys(attributes).some((existingKey) => {\n if (existingKey === key) return false; // don't compare against itself\n return snakeCase(existingKey) === snakeCaseKey;\n });\n};\n\nconst isForbiddenKey = (key: string) => {\n return getService('builder').isReservedAttributeName(key);\n};\n\nconst forbiddenValidator = () => {\n const reservedNames = [...getService('builder').getReservedNames().attributes];\n\n return yup.mixed().test({\n name: 'forbiddenKeys',\n message: `Attribute keys cannot be one of ${reservedNames.join(', ')}`,\n test: () => false,\n });\n};\n\nconst conflictingKeysValidator = (key: string) => {\n return yup.mixed().test({\n name: 'conflictingKeys',\n message: `Attribute ${key} conflicts with an existing key`,\n test: () => false,\n });\n};\n\nconst typeOrRelationValidator = yup.object().test({\n name: 'mustHaveTypeOrTarget',\n message: 'Attribute must have either a type or a target',\n test: () => false,\n});\n"],"names":["createSchema","types","relations","modelType","shape","description","yup","string","options","object","pluginOptions","collectionName","nullable","test","isValidCollectionName","attributes","createAttributesValidator","draftAndPublish","boolean","modelTypes","CONTENT_TYPE","kind","oneOf","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","noUnknown","lazy","_","mapValues","attribute","key","isForbiddenKey","forbiddenValidator","isConflictingKey","conflictingKeysValidator","type","getRelationValidator","isValidKey","has","getTypeValidator","typeOrRelationValidator","required","snakeCaseKey","snakeCase","Object","keys","some","existingKey","getService","isReservedAttributeName","reservedNames","getReservedNames","mixed","name","message","join"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"relations.js","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":"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"}
1
+ {"version":3,"file":"relations.js","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"relations.mjs","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":"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"}
1
+ {"version":3,"file":"relations.mjs","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":"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"}