@strapi/content-manager 0.0.0-next.e21fe90bf2ab9906267ea6e6ca620bdcc729906c → 0.0.0-next.e3eb76a86aff89979cc9098aec129d2ffa600c56

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 (248) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +300 -204
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +304 -209
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/components/LeftMenu.js +34 -30
  6. package/dist/admin/components/LeftMenu.js.map +1 -1
  7. package/dist/admin/components/LeftMenu.mjs +36 -32
  8. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  9. package/dist/admin/history/components/VersionHeader.js +6 -0
  10. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  11. package/dist/admin/history/components/VersionHeader.mjs +7 -1
  12. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  13. package/dist/admin/hooks/useDocumentActions.js +12 -4
  14. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  15. package/dist/admin/hooks/useDocumentActions.mjs +12 -4
  16. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  18. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  19. package/dist/admin/index.js +1 -3
  20. package/dist/admin/index.js.map +1 -1
  21. package/dist/admin/pages/EditView/EditViewPage.js +81 -74
  22. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  23. package/dist/admin/pages/EditView/EditViewPage.mjs +82 -75
  24. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/components/DocumentActions.js +235 -71
  26. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  27. package/dist/admin/pages/EditView/components/DocumentActions.mjs +238 -74
  28. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +12 -15
  30. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +12 -15
  32. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +61 -26
  34. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +63 -28
  36. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +21 -35
  38. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +21 -35
  40. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
  42. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
  44. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -0
  46. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +2 -0
  48. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +2 -2
  50. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -3
  52. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +128 -55
  54. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +128 -55
  56. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +120 -32
  58. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +124 -36
  60. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/UID.js +4 -2
  62. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +4 -2
  64. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +1 -1
  66. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +1 -1
  68. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
  70. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
  72. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +86 -118
  74. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +86 -118
  76. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormLayout.js +20 -24
  78. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormLayout.mjs +20 -24
  80. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  81. package/dist/admin/pages/ListView/ListViewPage.js +77 -0
  82. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  83. package/dist/admin/pages/ListView/ListViewPage.mjs +78 -1
  84. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  85. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +2 -1
  86. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  87. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -1
  88. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  89. package/dist/admin/pages/ListView/components/Filters.js +1 -0
  90. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  91. package/dist/admin/pages/ListView/components/Filters.mjs +1 -0
  92. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  93. package/dist/admin/pages/ListView/components/TableActions.js +13 -3
  94. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  95. package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
  96. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  97. package/dist/admin/preview/components/PreviewHeader.js +1 -1
  98. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  99. package/dist/admin/preview/components/PreviewHeader.mjs +1 -1
  100. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  101. package/dist/admin/services/documents.js +2 -2
  102. package/dist/admin/services/documents.js.map +1 -1
  103. package/dist/admin/services/documents.mjs +2 -2
  104. package/dist/admin/services/documents.mjs.map +1 -1
  105. package/dist/admin/services/homepage.js +9 -5
  106. package/dist/admin/services/homepage.js.map +1 -1
  107. package/dist/admin/services/homepage.mjs +9 -5
  108. package/dist/admin/services/homepage.mjs.map +1 -1
  109. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
  110. package/dist/admin/src/hooks/useDocumentActions.d.ts +1 -0
  111. package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
  112. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
  113. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
  114. package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -0
  115. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +7 -8
  116. package/dist/admin/src/services/documents.d.ts +7 -1
  117. package/dist/admin/translations/en.json.js +3 -1
  118. package/dist/admin/translations/en.json.js.map +1 -1
  119. package/dist/admin/translations/en.json.mjs +3 -1
  120. package/dist/admin/translations/en.json.mjs.map +1 -1
  121. package/dist/admin/translations/ru.json.js +235 -226
  122. package/dist/admin/translations/ru.json.js.map +1 -1
  123. package/dist/admin/translations/ru.json.mjs +230 -226
  124. package/dist/admin/translations/ru.json.mjs.map +1 -1
  125. package/dist/admin/utils/validation.js +1 -1
  126. package/dist/admin/utils/validation.js.map +1 -1
  127. package/dist/admin/utils/validation.mjs +1 -1
  128. package/dist/admin/utils/validation.mjs.map +1 -1
  129. package/dist/server/controllers/content-types.js +11 -1
  130. package/dist/server/controllers/content-types.js.map +1 -1
  131. package/dist/server/controllers/content-types.mjs +11 -1
  132. package/dist/server/controllers/content-types.mjs.map +1 -1
  133. package/dist/server/controllers/index.js +3 -1
  134. package/dist/server/controllers/index.js.map +1 -1
  135. package/dist/server/controllers/index.mjs +3 -1
  136. package/dist/server/controllers/index.mjs.map +1 -1
  137. package/dist/server/controllers/validation/index.js +14 -2
  138. package/dist/server/controllers/validation/index.js.map +1 -1
  139. package/dist/server/controllers/validation/index.mjs +14 -2
  140. package/dist/server/controllers/validation/index.mjs.map +1 -1
  141. package/dist/server/history/services/lifecycles.js +3 -0
  142. package/dist/server/history/services/lifecycles.js.map +1 -1
  143. package/dist/server/history/services/lifecycles.mjs +3 -0
  144. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  145. package/dist/server/homepage/controllers/homepage.js +57 -0
  146. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  147. package/dist/server/homepage/controllers/homepage.mjs +36 -0
  148. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  149. package/dist/server/homepage/controllers/index.js +10 -0
  150. package/dist/server/homepage/controllers/index.js.map +1 -0
  151. package/dist/server/homepage/controllers/index.mjs +8 -0
  152. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  153. package/dist/server/homepage/index.js +14 -0
  154. package/dist/server/homepage/index.js.map +1 -0
  155. package/dist/server/homepage/index.mjs +12 -0
  156. package/dist/server/homepage/index.mjs.map +1 -0
  157. package/dist/server/homepage/routes/homepage.js +25 -0
  158. package/dist/server/homepage/routes/homepage.js.map +1 -0
  159. package/dist/server/homepage/routes/homepage.mjs +23 -0
  160. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  161. package/dist/server/homepage/routes/index.js +13 -0
  162. package/dist/server/homepage/routes/index.js.map +1 -0
  163. package/dist/server/homepage/routes/index.mjs +11 -0
  164. package/dist/server/homepage/routes/index.mjs.map +1 -0
  165. package/dist/server/homepage/services/homepage.js +157 -0
  166. package/dist/server/homepage/services/homepage.js.map +1 -0
  167. package/dist/server/homepage/services/homepage.mjs +155 -0
  168. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  169. package/dist/server/homepage/services/index.js +10 -0
  170. package/dist/server/homepage/services/index.js.map +1 -0
  171. package/dist/server/homepage/services/index.mjs +8 -0
  172. package/dist/server/homepage/services/index.mjs.map +1 -0
  173. package/dist/server/preview/services/preview.js +0 -1
  174. package/dist/server/preview/services/preview.js.map +1 -1
  175. package/dist/server/preview/services/preview.mjs +0 -1
  176. package/dist/server/preview/services/preview.mjs.map +1 -1
  177. package/dist/server/routes/index.js +3 -1
  178. package/dist/server/routes/index.js.map +1 -1
  179. package/dist/server/routes/index.mjs +3 -1
  180. package/dist/server/routes/index.mjs.map +1 -1
  181. package/dist/server/services/data-mapper.js +4 -1
  182. package/dist/server/services/data-mapper.js.map +1 -1
  183. package/dist/server/services/data-mapper.mjs +4 -1
  184. package/dist/server/services/data-mapper.mjs.map +1 -1
  185. package/dist/server/services/document-manager.js +8 -1
  186. package/dist/server/services/document-manager.js.map +1 -1
  187. package/dist/server/services/document-manager.mjs +8 -1
  188. package/dist/server/services/document-manager.mjs.map +1 -1
  189. package/dist/server/services/document-metadata.js +3 -1
  190. package/dist/server/services/document-metadata.js.map +1 -1
  191. package/dist/server/services/document-metadata.mjs +3 -1
  192. package/dist/server/services/document-metadata.mjs.map +1 -1
  193. package/dist/server/services/index.js +3 -1
  194. package/dist/server/services/index.js.map +1 -1
  195. package/dist/server/services/index.mjs +3 -1
  196. package/dist/server/services/index.mjs.map +1 -1
  197. package/dist/server/services/utils/configuration/attributes.js +1 -1
  198. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  199. package/dist/server/services/utils/configuration/attributes.mjs +1 -1
  200. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  201. package/dist/server/services/utils/configuration/layouts.js +1 -1
  202. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  203. package/dist/server/services/utils/configuration/layouts.mjs +1 -1
  204. package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
  205. package/dist/server/services/utils/configuration/metadatas.js +8 -0
  206. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  207. package/dist/server/services/utils/configuration/metadatas.mjs +8 -0
  208. package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
  209. package/dist/server/services/utils/populate.js +11 -0
  210. package/dist/server/services/utils/populate.js.map +1 -1
  211. package/dist/server/services/utils/populate.mjs +11 -0
  212. package/dist/server/services/utils/populate.mjs.map +1 -1
  213. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  214. package/dist/server/src/controllers/index.d.ts.map +1 -1
  215. package/dist/server/src/controllers/validation/index.d.ts +6 -1
  216. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  217. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  218. package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
  219. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  220. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  221. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  222. package/dist/server/src/homepage/index.d.ts +16 -0
  223. package/dist/server/src/homepage/index.d.ts.map +1 -0
  224. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  225. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  226. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  227. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  228. package/dist/server/src/{services → homepage/services}/homepage.d.ts +1 -1
  229. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  230. package/dist/server/src/homepage/services/index.d.ts +9 -0
  231. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  232. package/dist/server/src/index.d.ts +8 -0
  233. package/dist/server/src/index.d.ts.map +1 -1
  234. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  235. package/dist/server/src/routes/index.d.ts +1 -0
  236. package/dist/server/src/routes/index.d.ts.map +1 -1
  237. package/dist/server/src/services/data-mapper.d.ts +1 -0
  238. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  239. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  240. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  241. package/dist/server/src/services/index.d.ts +7 -0
  242. package/dist/server/src/services/index.d.ts.map +1 -1
  243. package/dist/server/src/services/utils/configuration/metadatas.d.ts.map +1 -1
  244. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  245. package/dist/shared/contracts/collection-types.d.ts +0 -1
  246. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  247. package/package.json +11 -8
  248. package/dist/server/src/services/homepage.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sources":["../../../admin/src/utils/validation.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n | yup.StringSchema\n | yup.NumberSchema\n | yup.BooleanSchema\n | yup.DateSchema\n | yup.ArraySchema<any>\n | yup.ObjectSchema<any>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ValidationOptions {\n status: 'draft' | 'published' | null;\n}\n\nconst arrayValidator = (attribute: Schema['attributes'][string], options: ValidationOptions) => ({\n message: translatedErrors.required,\n test(value: unknown) {\n if (options.status === 'draft') {\n return true;\n }\n\n if (!attribute.required) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n\n return true;\n },\n});\n\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n attributes: Schema['attributes'] = {},\n components: ComponentsDictionary = {},\n options: ValidationOptions = { status: null }\n): yup.ObjectSchema<any> => {\n const createModelSchema = (attributes: Schema['attributes']): yup.ObjectSchema<any> =>\n yup\n .object()\n .shape(\n Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n if (DOCUMENT_META_FIELDS.includes(name)) {\n return acc;\n }\n\n /**\n * These validations won't apply to every attribute\n * and that's okay, in that case we just return the\n * schema as it was passed.\n */\n const validations = [\n addNullableValidation,\n addRequiredValidation,\n addMinLengthValidation,\n addMaxLengthValidation,\n addMinValidation,\n addMaxValidation,\n addRegexValidation,\n ].map((fn) => fn(attribute, options));\n\n const transformSchema = pipe(...validations);\n\n switch (attribute.type) {\n case 'component': {\n const { attributes } = components[attribute.component];\n\n if (attribute.repeatable) {\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(createModelSchema(attributes).nullable(false))\n ).test(arrayValidator(attribute, options)),\n };\n } else {\n return {\n ...acc,\n [name]: transformSchema(createModelSchema(attributes).nullable()),\n };\n }\n }\n case 'dynamiczone':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.lazy(\n (\n data: SchemaUtils.Attribute.Value<SchemaUtils.Attribute.DynamicZone>[number]\n ) => {\n const attributes = components?.[data?.__component]?.attributes;\n\n const validation = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(components)),\n })\n .nullable(false);\n if (!attributes) {\n return validation;\n }\n\n return validation.concat(createModelSchema(attributes));\n }\n ) as unknown as yup.ObjectSchema<any>\n )\n ).test(arrayValidator(attribute, options)),\n };\n case 'relation':\n return {\n ...acc,\n [name]: transformSchema(\n yup.lazy((value) => {\n if (!value) {\n return yup.mixed().nullable(true);\n } else if (Array.isArray(value)) {\n // If a relation value is an array, we expect\n // an array of objects with {id} properties, representing the related entities.\n return yup.array().of(\n yup.object().shape({\n id: yup.number().required(),\n })\n );\n } else if (typeof value === 'object') {\n // A realtion value can also be an object. Some API\n // repsonses return the number of entities in the relation\n // as { count: x }\n return yup.object();\n } else {\n return yup\n .mixed()\n .test(\n 'type-error',\n 'Relation values must be either null, an array of objects with {id} or an object.',\n () => false\n );\n }\n })\n ),\n };\n default:\n return {\n ...acc,\n [name]: transformSchema(createAttributeSchema(attribute)),\n };\n }\n }, {})\n )\n /**\n * TODO: investigate why an undefined object fails a check of `nullable`.\n */\n .default(null);\n\n return createModelSchema(attributes);\n};\n\nconst createAttributeSchema = (\n attribute: Exclude<\n SchemaUtils.Attribute.AnyAttribute,\n { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n >\n) => {\n switch (attribute.type) {\n case 'biginteger':\n return yup.string().matches(/^-?\\d*$/);\n case 'boolean':\n return yup.boolean();\n case 'blocks':\n return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n if (!value || Array.isArray(value)) {\n return true;\n } else {\n return false;\n }\n });\n case 'decimal':\n case 'float':\n case 'integer':\n return yup.number();\n case 'email':\n return yup.string().email(translatedErrors.email);\n case 'enumeration':\n return yup.string().oneOf([...attribute.enum, null]);\n case 'json':\n return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n /**\n * We don't want to validate the JSON field if it's empty.\n */\n if (!value || (typeof value === 'string' && value.length === 0)) {\n return true;\n }\n\n // If the value was created via content API and wasn't changed, then it's still an object\n if (typeof value === 'object') {\n try {\n JSON.stringify(value);\n return true;\n } catch (err) {\n return false;\n }\n }\n\n try {\n JSON.parse(value);\n\n return true;\n } catch (err) {\n return false;\n }\n });\n case 'password':\n case 'richtext':\n case 'string':\n case 'text':\n return yup.string();\n case 'uid':\n return yup.string().matches(/^[A-Za-z0-9-_.~]*$/);\n default:\n /**\n * This allows any value.\n */\n return yup.mixed();\n }\n};\n\n// Helper function to return schema.nullable() if it exists, otherwise return schema\nconst nullableSchema = <TSchema extends AnySchema>(schema: TSchema) => {\n return schema?.nullable\n ? schema.nullable()\n : // In some cases '.nullable' will not be available on the schema.\n // e.g. when the schema has been built using yup.lazy (e.g. for relations).\n // In these cases we should just return the schema as it is.\n schema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n attribute: Schema['attributes'][string],\n options: ValidationOptions\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addNullableValidation: ValidationFn = () => (schema) => {\n return nullableSchema(schema);\n};\n\nconst addRequiredValidation: ValidationFn = (attribute, options) => (schema) => {\n if (options.status === 'draft' || !attribute.required) {\n return schema;\n }\n\n if (attribute.required && 'required' in schema) {\n return schema.required(translatedErrors.required);\n }\n\n return schema;\n};\n\nconst addMinLengthValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // Skip minLength validation for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if (\n 'minLength' in attribute &&\n attribute.minLength &&\n Number.isInteger(attribute.minLength) &&\n 'min' in schema\n ) {\n return schema.min(attribute.minLength, {\n ...translatedErrors.minLength,\n values: {\n min: attribute.minLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMaxLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'maxLength' in attribute &&\n attribute.maxLength &&\n Number.isInteger(attribute.maxLength) &&\n 'max' in schema\n ) {\n return schema.max(attribute.maxLength, {\n ...translatedErrors.maxLength,\n values: {\n max: attribute.maxLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMinValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // do not validate min for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if ('min' in attribute && 'min' in schema) {\n const min = toInteger(attribute.min);\n\n if (min) {\n return schema.min(min, {\n ...translatedErrors.min,\n values: {\n min,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst addMaxValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('max' in attribute) {\n const max = toInteger(attribute.max);\n\n if ('max' in schema && max) {\n return schema.max(max, {\n ...translatedErrors.max,\n values: {\n max,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst toInteger = (val?: string | number): number | undefined => {\n if (typeof val === 'number' || val === undefined) {\n return val;\n } else {\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n }\n};\n\nconst addRegexValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n return schema.matches(new RegExp(attribute.regex), {\n message: {\n id: translatedErrors.regex.id,\n defaultMessage: 'The value does not match the defined pattern.',\n },\n\n excludeEmptyString: !attribute.required,\n }) as TSchema;\n }\n\n return schema;\n };\n\nexport { createYupSchema };\n"],"names":["arrayValidator","attribute","options","message","translatedErrors","required","test","value","status","Array","isArray","length","createYupSchema","attributes","components","createModelSchema","yup","object","shape","Object","entries","reduce","acc","name","DOCUMENT_META_FIELDS","includes","validations","addNullableValidation","addRequiredValidation","addMinLengthValidation","addMaxLengthValidation","addMinValidation","addMaxValidation","addRegexValidation","map","fn","transformSchema","pipe","type","component","repeatable","array","of","nullable","lazy","data","__component","validation","string","oneOf","keys","concat","mixed","id","number","createAttributeSchema","default","matches","boolean","json","email","enum","JSON","stringify","err","parse","nullableSchema","schema","minLength","Number","isInteger","min","values","maxLength","max","toInteger","val","undefined","num","isNaN","regex","RegExp","defaultMessage","excludeEmptyString"],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sources":["../../../admin/src/utils/validation.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n | yup.StringSchema\n | yup.NumberSchema\n | yup.BooleanSchema\n | yup.DateSchema\n | yup.ArraySchema<any>\n | yup.ObjectSchema<any>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ValidationOptions {\n status: 'draft' | 'published' | null;\n}\n\nconst arrayValidator = (attribute: Schema['attributes'][string], options: ValidationOptions) => ({\n message: translatedErrors.required,\n test(value: unknown) {\n if (options.status === 'draft') {\n return true;\n }\n\n if (!attribute.required) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n\n return true;\n },\n});\n\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n attributes: Schema['attributes'] = {},\n components: ComponentsDictionary = {},\n options: ValidationOptions = { status: null }\n): yup.ObjectSchema<any> => {\n const createModelSchema = (attributes: Schema['attributes']): yup.ObjectSchema<any> =>\n yup\n .object()\n .shape(\n Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n if (DOCUMENT_META_FIELDS.includes(name)) {\n return acc;\n }\n\n /**\n * These validations won't apply to every attribute\n * and that's okay, in that case we just return the\n * schema as it was passed.\n */\n const validations = [\n addNullableValidation,\n addRequiredValidation,\n addMinLengthValidation,\n addMaxLengthValidation,\n addMinValidation,\n addMaxValidation,\n addRegexValidation,\n ].map((fn) => fn(attribute, options));\n\n const transformSchema = pipe(...validations);\n\n switch (attribute.type) {\n case 'component': {\n const { attributes } = components[attribute.component];\n\n if (attribute.repeatable) {\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(createModelSchema(attributes).nullable(false))\n ).test(arrayValidator(attribute, options)),\n };\n } else {\n return {\n ...acc,\n [name]: transformSchema(createModelSchema(attributes).nullable()),\n };\n }\n }\n case 'dynamiczone':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.lazy(\n (\n data: SchemaUtils.Attribute.Value<SchemaUtils.Attribute.DynamicZone>[number]\n ) => {\n const attributes = components?.[data?.__component]?.attributes;\n\n const validation = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(components)),\n })\n .nullable(false);\n if (!attributes) {\n return validation;\n }\n\n return validation.concat(createModelSchema(attributes));\n }\n ) as unknown as yup.ObjectSchema<any>\n )\n ).test(arrayValidator(attribute, options)),\n };\n case 'relation':\n return {\n ...acc,\n [name]: transformSchema(\n yup.lazy((value) => {\n if (!value) {\n return yup.mixed().nullable(true);\n } else if (Array.isArray(value)) {\n // If a relation value is an array, we expect\n // an array of objects with {id} properties, representing the related entities.\n return yup.array().of(\n yup.object().shape({\n id: yup.number().required(),\n })\n );\n } else if (typeof value === 'object') {\n // A realtion value can also be an object. Some API\n // repsonses return the number of entities in the relation\n // as { count: x }\n return yup.object();\n } else {\n return yup\n .mixed()\n .test(\n 'type-error',\n 'Relation values must be either null, an array of objects with {id} or an object.',\n () => false\n );\n }\n })\n ),\n };\n default:\n return {\n ...acc,\n [name]: transformSchema(createAttributeSchema(attribute)),\n };\n }\n }, {})\n )\n /**\n * TODO: investigate why an undefined object fails a check of `nullable`.\n */\n .default(null);\n\n return createModelSchema(attributes);\n};\n\nconst createAttributeSchema = (\n attribute: Exclude<\n SchemaUtils.Attribute.AnyAttribute,\n { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n >\n) => {\n switch (attribute.type) {\n case 'biginteger':\n return yup.string().matches(/^-?\\d*$/);\n case 'boolean':\n return yup.boolean();\n case 'blocks':\n return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n if (!value || Array.isArray(value)) {\n return true;\n } else {\n return false;\n }\n });\n case 'decimal':\n case 'float':\n case 'integer':\n return yup.number();\n case 'email':\n return yup.string().email(translatedErrors.email);\n case 'enumeration':\n return yup.string().oneOf([...attribute.enum, null]);\n case 'json':\n return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n /**\n * We don't want to validate the JSON field if it's empty.\n */\n if (!value || (typeof value === 'string' && value.length === 0)) {\n return true;\n }\n\n // If the value was created via content API and wasn't changed, then it's still an object\n if (typeof value === 'object') {\n try {\n JSON.stringify(value);\n return true;\n } catch (err) {\n return false;\n }\n }\n\n try {\n JSON.parse(value);\n\n return true;\n } catch (err) {\n return false;\n }\n });\n case 'password':\n case 'richtext':\n case 'string':\n case 'text':\n return yup.string();\n case 'uid':\n return yup\n .string()\n .matches(attribute.regex ? new RegExp(attribute.regex) : /^[A-Za-z0-9-_.~]*$/);\n default:\n /**\n * This allows any value.\n */\n return yup.mixed();\n }\n};\n\n// Helper function to return schema.nullable() if it exists, otherwise return schema\nconst nullableSchema = <TSchema extends AnySchema>(schema: TSchema) => {\n return schema?.nullable\n ? schema.nullable()\n : // In some cases '.nullable' will not be available on the schema.\n // e.g. when the schema has been built using yup.lazy (e.g. for relations).\n // In these cases we should just return the schema as it is.\n schema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n attribute: Schema['attributes'][string],\n options: ValidationOptions\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addNullableValidation: ValidationFn = () => (schema) => {\n return nullableSchema(schema);\n};\n\nconst addRequiredValidation: ValidationFn = (attribute, options) => (schema) => {\n if (options.status === 'draft' || !attribute.required) {\n return schema;\n }\n\n if (attribute.required && 'required' in schema) {\n return schema.required(translatedErrors.required);\n }\n\n return schema;\n};\n\nconst addMinLengthValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // Skip minLength validation for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if (\n 'minLength' in attribute &&\n attribute.minLength &&\n Number.isInteger(attribute.minLength) &&\n 'min' in schema\n ) {\n return schema.min(attribute.minLength, {\n ...translatedErrors.minLength,\n values: {\n min: attribute.minLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMaxLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'maxLength' in attribute &&\n attribute.maxLength &&\n Number.isInteger(attribute.maxLength) &&\n 'max' in schema\n ) {\n return schema.max(attribute.maxLength, {\n ...translatedErrors.maxLength,\n values: {\n max: attribute.maxLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMinValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // do not validate min for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if ('min' in attribute && 'min' in schema) {\n const min = toInteger(attribute.min);\n\n if (min) {\n return schema.min(min, {\n ...translatedErrors.min,\n values: {\n min,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst addMaxValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('max' in attribute) {\n const max = toInteger(attribute.max);\n\n if ('max' in schema && max) {\n return schema.max(max, {\n ...translatedErrors.max,\n values: {\n max,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst toInteger = (val?: string | number): number | undefined => {\n if (typeof val === 'number' || val === undefined) {\n return val;\n } else {\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n }\n};\n\nconst addRegexValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n return schema.matches(new RegExp(attribute.regex), {\n message: {\n id: translatedErrors.regex.id,\n defaultMessage: 'The value does not match the defined pattern.',\n },\n\n excludeEmptyString: !attribute.required,\n }) as TSchema;\n }\n\n return schema;\n };\n\nexport { createYupSchema };\n"],"names":["arrayValidator","attribute","options","message","translatedErrors","required","test","value","status","Array","isArray","length","createYupSchema","attributes","components","createModelSchema","yup","object","shape","Object","entries","reduce","acc","name","DOCUMENT_META_FIELDS","includes","validations","addNullableValidation","addRequiredValidation","addMinLengthValidation","addMaxLengthValidation","addMinValidation","addMaxValidation","addRegexValidation","map","fn","transformSchema","pipe","type","component","repeatable","array","of","nullable","lazy","data","__component","validation","string","oneOf","keys","concat","mixed","id","number","createAttributeSchema","default","matches","boolean","json","email","enum","JSON","stringify","err","parse","regex","RegExp","nullableSchema","schema","minLength","Number","isInteger","min","values","maxLength","max","toInteger","val","undefined","num","isNaN","defaultMessage","excludeEmptyString"],"mappings":"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"}
@@ -161,7 +161,7 @@ const createAttributeSchema = (attribute)=>{
161
161
  case 'text':
162
162
  return yup.string();
163
163
  case 'uid':
164
- return yup.string().matches(/^[A-Za-z0-9-_.~]*$/);
164
+ return yup.string().matches(attribute.regex ? new RegExp(attribute.regex) : /^[A-Za-z0-9-_.~]*$/);
165
165
  default:
166
166
  /**
167
167
  * This allows any value.
@@ -1 +1 @@
1
- {"version":3,"file":"validation.mjs","sources":["../../../admin/src/utils/validation.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n | yup.StringSchema\n | yup.NumberSchema\n | yup.BooleanSchema\n | yup.DateSchema\n | yup.ArraySchema<any>\n | yup.ObjectSchema<any>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ValidationOptions {\n status: 'draft' | 'published' | null;\n}\n\nconst arrayValidator = (attribute: Schema['attributes'][string], options: ValidationOptions) => ({\n message: translatedErrors.required,\n test(value: unknown) {\n if (options.status === 'draft') {\n return true;\n }\n\n if (!attribute.required) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n\n return true;\n },\n});\n\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n attributes: Schema['attributes'] = {},\n components: ComponentsDictionary = {},\n options: ValidationOptions = { status: null }\n): yup.ObjectSchema<any> => {\n const createModelSchema = (attributes: Schema['attributes']): yup.ObjectSchema<any> =>\n yup\n .object()\n .shape(\n Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n if (DOCUMENT_META_FIELDS.includes(name)) {\n return acc;\n }\n\n /**\n * These validations won't apply to every attribute\n * and that's okay, in that case we just return the\n * schema as it was passed.\n */\n const validations = [\n addNullableValidation,\n addRequiredValidation,\n addMinLengthValidation,\n addMaxLengthValidation,\n addMinValidation,\n addMaxValidation,\n addRegexValidation,\n ].map((fn) => fn(attribute, options));\n\n const transformSchema = pipe(...validations);\n\n switch (attribute.type) {\n case 'component': {\n const { attributes } = components[attribute.component];\n\n if (attribute.repeatable) {\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(createModelSchema(attributes).nullable(false))\n ).test(arrayValidator(attribute, options)),\n };\n } else {\n return {\n ...acc,\n [name]: transformSchema(createModelSchema(attributes).nullable()),\n };\n }\n }\n case 'dynamiczone':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.lazy(\n (\n data: SchemaUtils.Attribute.Value<SchemaUtils.Attribute.DynamicZone>[number]\n ) => {\n const attributes = components?.[data?.__component]?.attributes;\n\n const validation = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(components)),\n })\n .nullable(false);\n if (!attributes) {\n return validation;\n }\n\n return validation.concat(createModelSchema(attributes));\n }\n ) as unknown as yup.ObjectSchema<any>\n )\n ).test(arrayValidator(attribute, options)),\n };\n case 'relation':\n return {\n ...acc,\n [name]: transformSchema(\n yup.lazy((value) => {\n if (!value) {\n return yup.mixed().nullable(true);\n } else if (Array.isArray(value)) {\n // If a relation value is an array, we expect\n // an array of objects with {id} properties, representing the related entities.\n return yup.array().of(\n yup.object().shape({\n id: yup.number().required(),\n })\n );\n } else if (typeof value === 'object') {\n // A realtion value can also be an object. Some API\n // repsonses return the number of entities in the relation\n // as { count: x }\n return yup.object();\n } else {\n return yup\n .mixed()\n .test(\n 'type-error',\n 'Relation values must be either null, an array of objects with {id} or an object.',\n () => false\n );\n }\n })\n ),\n };\n default:\n return {\n ...acc,\n [name]: transformSchema(createAttributeSchema(attribute)),\n };\n }\n }, {})\n )\n /**\n * TODO: investigate why an undefined object fails a check of `nullable`.\n */\n .default(null);\n\n return createModelSchema(attributes);\n};\n\nconst createAttributeSchema = (\n attribute: Exclude<\n SchemaUtils.Attribute.AnyAttribute,\n { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n >\n) => {\n switch (attribute.type) {\n case 'biginteger':\n return yup.string().matches(/^-?\\d*$/);\n case 'boolean':\n return yup.boolean();\n case 'blocks':\n return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n if (!value || Array.isArray(value)) {\n return true;\n } else {\n return false;\n }\n });\n case 'decimal':\n case 'float':\n case 'integer':\n return yup.number();\n case 'email':\n return yup.string().email(translatedErrors.email);\n case 'enumeration':\n return yup.string().oneOf([...attribute.enum, null]);\n case 'json':\n return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n /**\n * We don't want to validate the JSON field if it's empty.\n */\n if (!value || (typeof value === 'string' && value.length === 0)) {\n return true;\n }\n\n // If the value was created via content API and wasn't changed, then it's still an object\n if (typeof value === 'object') {\n try {\n JSON.stringify(value);\n return true;\n } catch (err) {\n return false;\n }\n }\n\n try {\n JSON.parse(value);\n\n return true;\n } catch (err) {\n return false;\n }\n });\n case 'password':\n case 'richtext':\n case 'string':\n case 'text':\n return yup.string();\n case 'uid':\n return yup.string().matches(/^[A-Za-z0-9-_.~]*$/);\n default:\n /**\n * This allows any value.\n */\n return yup.mixed();\n }\n};\n\n// Helper function to return schema.nullable() if it exists, otherwise return schema\nconst nullableSchema = <TSchema extends AnySchema>(schema: TSchema) => {\n return schema?.nullable\n ? schema.nullable()\n : // In some cases '.nullable' will not be available on the schema.\n // e.g. when the schema has been built using yup.lazy (e.g. for relations).\n // In these cases we should just return the schema as it is.\n schema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n attribute: Schema['attributes'][string],\n options: ValidationOptions\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addNullableValidation: ValidationFn = () => (schema) => {\n return nullableSchema(schema);\n};\n\nconst addRequiredValidation: ValidationFn = (attribute, options) => (schema) => {\n if (options.status === 'draft' || !attribute.required) {\n return schema;\n }\n\n if (attribute.required && 'required' in schema) {\n return schema.required(translatedErrors.required);\n }\n\n return schema;\n};\n\nconst addMinLengthValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // Skip minLength validation for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if (\n 'minLength' in attribute &&\n attribute.minLength &&\n Number.isInteger(attribute.minLength) &&\n 'min' in schema\n ) {\n return schema.min(attribute.minLength, {\n ...translatedErrors.minLength,\n values: {\n min: attribute.minLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMaxLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'maxLength' in attribute &&\n attribute.maxLength &&\n Number.isInteger(attribute.maxLength) &&\n 'max' in schema\n ) {\n return schema.max(attribute.maxLength, {\n ...translatedErrors.maxLength,\n values: {\n max: attribute.maxLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMinValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // do not validate min for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if ('min' in attribute && 'min' in schema) {\n const min = toInteger(attribute.min);\n\n if (min) {\n return schema.min(min, {\n ...translatedErrors.min,\n values: {\n min,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst addMaxValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('max' in attribute) {\n const max = toInteger(attribute.max);\n\n if ('max' in schema && max) {\n return schema.max(max, {\n ...translatedErrors.max,\n values: {\n max,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst toInteger = (val?: string | number): number | undefined => {\n if (typeof val === 'number' || val === undefined) {\n return val;\n } else {\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n }\n};\n\nconst addRegexValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n return schema.matches(new RegExp(attribute.regex), {\n message: {\n id: translatedErrors.regex.id,\n defaultMessage: 'The value does not match the defined pattern.',\n },\n\n excludeEmptyString: !attribute.required,\n }) as TSchema;\n }\n\n return schema;\n };\n\nexport { createYupSchema };\n"],"names":["arrayValidator","attribute","options","message","translatedErrors","required","test","value","status","Array","isArray","length","createYupSchema","attributes","components","createModelSchema","yup","object","shape","Object","entries","reduce","acc","name","DOCUMENT_META_FIELDS","includes","validations","addNullableValidation","addRequiredValidation","addMinLengthValidation","addMaxLengthValidation","addMinValidation","addMaxValidation","addRegexValidation","map","fn","transformSchema","pipe","type","component","repeatable","array","of","nullable","lazy","data","__component","validation","string","oneOf","keys","concat","mixed","id","number","createAttributeSchema","default","matches","boolean","json","email","enum","JSON","stringify","err","parse","nullableSchema","schema","minLength","Number","isInteger","min","values","maxLength","max","toInteger","val","undefined","num","isNaN","regex","RegExp","defaultMessage","excludeEmptyString"],"mappings":"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"}
1
+ {"version":3,"file":"validation.mjs","sources":["../../../admin/src/utils/validation.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n | yup.StringSchema\n | yup.NumberSchema\n | yup.BooleanSchema\n | yup.DateSchema\n | yup.ArraySchema<any>\n | yup.ObjectSchema<any>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ValidationOptions {\n status: 'draft' | 'published' | null;\n}\n\nconst arrayValidator = (attribute: Schema['attributes'][string], options: ValidationOptions) => ({\n message: translatedErrors.required,\n test(value: unknown) {\n if (options.status === 'draft') {\n return true;\n }\n\n if (!attribute.required) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n\n return true;\n },\n});\n\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n attributes: Schema['attributes'] = {},\n components: ComponentsDictionary = {},\n options: ValidationOptions = { status: null }\n): yup.ObjectSchema<any> => {\n const createModelSchema = (attributes: Schema['attributes']): yup.ObjectSchema<any> =>\n yup\n .object()\n .shape(\n Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n if (DOCUMENT_META_FIELDS.includes(name)) {\n return acc;\n }\n\n /**\n * These validations won't apply to every attribute\n * and that's okay, in that case we just return the\n * schema as it was passed.\n */\n const validations = [\n addNullableValidation,\n addRequiredValidation,\n addMinLengthValidation,\n addMaxLengthValidation,\n addMinValidation,\n addMaxValidation,\n addRegexValidation,\n ].map((fn) => fn(attribute, options));\n\n const transformSchema = pipe(...validations);\n\n switch (attribute.type) {\n case 'component': {\n const { attributes } = components[attribute.component];\n\n if (attribute.repeatable) {\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(createModelSchema(attributes).nullable(false))\n ).test(arrayValidator(attribute, options)),\n };\n } else {\n return {\n ...acc,\n [name]: transformSchema(createModelSchema(attributes).nullable()),\n };\n }\n }\n case 'dynamiczone':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.lazy(\n (\n data: SchemaUtils.Attribute.Value<SchemaUtils.Attribute.DynamicZone>[number]\n ) => {\n const attributes = components?.[data?.__component]?.attributes;\n\n const validation = yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(components)),\n })\n .nullable(false);\n if (!attributes) {\n return validation;\n }\n\n return validation.concat(createModelSchema(attributes));\n }\n ) as unknown as yup.ObjectSchema<any>\n )\n ).test(arrayValidator(attribute, options)),\n };\n case 'relation':\n return {\n ...acc,\n [name]: transformSchema(\n yup.lazy((value) => {\n if (!value) {\n return yup.mixed().nullable(true);\n } else if (Array.isArray(value)) {\n // If a relation value is an array, we expect\n // an array of objects with {id} properties, representing the related entities.\n return yup.array().of(\n yup.object().shape({\n id: yup.number().required(),\n })\n );\n } else if (typeof value === 'object') {\n // A realtion value can also be an object. Some API\n // repsonses return the number of entities in the relation\n // as { count: x }\n return yup.object();\n } else {\n return yup\n .mixed()\n .test(\n 'type-error',\n 'Relation values must be either null, an array of objects with {id} or an object.',\n () => false\n );\n }\n })\n ),\n };\n default:\n return {\n ...acc,\n [name]: transformSchema(createAttributeSchema(attribute)),\n };\n }\n }, {})\n )\n /**\n * TODO: investigate why an undefined object fails a check of `nullable`.\n */\n .default(null);\n\n return createModelSchema(attributes);\n};\n\nconst createAttributeSchema = (\n attribute: Exclude<\n SchemaUtils.Attribute.AnyAttribute,\n { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n >\n) => {\n switch (attribute.type) {\n case 'biginteger':\n return yup.string().matches(/^-?\\d*$/);\n case 'boolean':\n return yup.boolean();\n case 'blocks':\n return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n if (!value || Array.isArray(value)) {\n return true;\n } else {\n return false;\n }\n });\n case 'decimal':\n case 'float':\n case 'integer':\n return yup.number();\n case 'email':\n return yup.string().email(translatedErrors.email);\n case 'enumeration':\n return yup.string().oneOf([...attribute.enum, null]);\n case 'json':\n return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n /**\n * We don't want to validate the JSON field if it's empty.\n */\n if (!value || (typeof value === 'string' && value.length === 0)) {\n return true;\n }\n\n // If the value was created via content API and wasn't changed, then it's still an object\n if (typeof value === 'object') {\n try {\n JSON.stringify(value);\n return true;\n } catch (err) {\n return false;\n }\n }\n\n try {\n JSON.parse(value);\n\n return true;\n } catch (err) {\n return false;\n }\n });\n case 'password':\n case 'richtext':\n case 'string':\n case 'text':\n return yup.string();\n case 'uid':\n return yup\n .string()\n .matches(attribute.regex ? new RegExp(attribute.regex) : /^[A-Za-z0-9-_.~]*$/);\n default:\n /**\n * This allows any value.\n */\n return yup.mixed();\n }\n};\n\n// Helper function to return schema.nullable() if it exists, otherwise return schema\nconst nullableSchema = <TSchema extends AnySchema>(schema: TSchema) => {\n return schema?.nullable\n ? schema.nullable()\n : // In some cases '.nullable' will not be available on the schema.\n // e.g. when the schema has been built using yup.lazy (e.g. for relations).\n // In these cases we should just return the schema as it is.\n schema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n attribute: Schema['attributes'][string],\n options: ValidationOptions\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addNullableValidation: ValidationFn = () => (schema) => {\n return nullableSchema(schema);\n};\n\nconst addRequiredValidation: ValidationFn = (attribute, options) => (schema) => {\n if (options.status === 'draft' || !attribute.required) {\n return schema;\n }\n\n if (attribute.required && 'required' in schema) {\n return schema.required(translatedErrors.required);\n }\n\n return schema;\n};\n\nconst addMinLengthValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // Skip minLength validation for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if (\n 'minLength' in attribute &&\n attribute.minLength &&\n Number.isInteger(attribute.minLength) &&\n 'min' in schema\n ) {\n return schema.min(attribute.minLength, {\n ...translatedErrors.minLength,\n values: {\n min: attribute.minLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMaxLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'maxLength' in attribute &&\n attribute.maxLength &&\n Number.isInteger(attribute.maxLength) &&\n 'max' in schema\n ) {\n return schema.max(attribute.maxLength, {\n ...translatedErrors.maxLength,\n values: {\n max: attribute.maxLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMinValidation: ValidationFn =\n (attribute, options) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n // do not validate min for draft\n if (options.status === 'draft') {\n return schema;\n }\n\n if ('min' in attribute && 'min' in schema) {\n const min = toInteger(attribute.min);\n\n if (min) {\n return schema.min(min, {\n ...translatedErrors.min,\n values: {\n min,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst addMaxValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('max' in attribute) {\n const max = toInteger(attribute.max);\n\n if ('max' in schema && max) {\n return schema.max(max, {\n ...translatedErrors.max,\n values: {\n max,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst toInteger = (val?: string | number): number | undefined => {\n if (typeof val === 'number' || val === undefined) {\n return val;\n } else {\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n }\n};\n\nconst addRegexValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n return schema.matches(new RegExp(attribute.regex), {\n message: {\n id: translatedErrors.regex.id,\n defaultMessage: 'The value does not match the defined pattern.',\n },\n\n excludeEmptyString: !attribute.required,\n }) as TSchema;\n }\n\n return schema;\n };\n\nexport { createYupSchema };\n"],"names":["arrayValidator","attribute","options","message","translatedErrors","required","test","value","status","Array","isArray","length","createYupSchema","attributes","components","createModelSchema","yup","object","shape","Object","entries","reduce","acc","name","DOCUMENT_META_FIELDS","includes","validations","addNullableValidation","addRequiredValidation","addMinLengthValidation","addMaxLengthValidation","addMinValidation","addMaxValidation","addRegexValidation","map","fn","transformSchema","pipe","type","component","repeatable","array","of","nullable","lazy","data","__component","validation","string","oneOf","keys","concat","mixed","id","number","createAttributeSchema","default","matches","boolean","json","email","enum","JSON","stringify","err","parse","regex","RegExp","nullableSchema","schema","minLength","Number","isInteger","min","values","maxLength","max","toInteger","val","undefined","num","isNaN","defaultMessage","excludeEmptyString"],"mappings":";;;;;AA0BA,MAAMA,cAAiB,GAAA,CAACC,SAAyCC,EAAAA,OAAAA,IAAgC;AAC/FC,QAAAA,OAAAA,EAASC,iBAAiBC,QAAQ;AAClCC,QAAAA,IAAAA,CAAAA,CAAKC,KAAc,EAAA;YACjB,IAAIL,OAAAA,CAAQM,MAAM,KAAK,OAAS,EAAA;gBAC9B,OAAO,IAAA;AACT;YAEA,IAAI,CAACP,SAAUI,CAAAA,QAAQ,EAAE;gBACvB,OAAO,IAAA;AACT;AAEA,YAAA,IAAI,CAACE,KAAO,EAAA;gBACV,OAAO,KAAA;AACT;AAEA,YAAA,IAAIE,MAAMC,OAAO,CAACH,UAAUA,KAAMI,CAAAA,MAAM,KAAK,CAAG,EAAA;gBAC9C,OAAO,KAAA;AACT;YAEA,OAAO,IAAA;AACT;KACF,CAAA;AAEA;;IAGA,MAAMC,eAAkB,GAAA,CACtBC,UAAmC,GAAA,EAAE,EACrCC,UAAmC,GAAA,EAAE,EACrCZ,OAA6B,GAAA;IAAEM,MAAQ,EAAA;AAAK,CAAC,GAAA;AAE7C,IAAA,MAAMO,oBAAoB,CAACF,UAAAA,GACzBG,IACGC,MAAM,EAAA,CACNC,KAAK,CACJC,MAAAA,CAAOC,OAAO,CAACP,YAAYQ,MAAM,CAAc,CAACC,GAAK,EAAA,CAACC,MAAMtB,SAAU,CAAA,GAAA;YACpE,IAAIuB,oBAAAA,CAAqBC,QAAQ,CAACF,IAAO,CAAA,EAAA;gBACvC,OAAOD,GAAAA;AACT;AAEA;;;;AAIC,cACD,MAAMI,WAAc,GAAA;AAClBC,gBAAAA,qBAAAA;AACAC,gBAAAA,qBAAAA;AACAC,gBAAAA,sBAAAA;AACAC,gBAAAA,sBAAAA;AACAC,gBAAAA,gBAAAA;AACAC,gBAAAA,gBAAAA;AACAC,gBAAAA;AACD,aAAA,CAACC,GAAG,CAAC,CAACC,EAAAA,GAAOA,GAAGlC,SAAWC,EAAAA,OAAAA,CAAAA,CAAAA;AAE5B,YAAA,MAAMkC,kBAAkBC,IAAQX,CAAAA,GAAAA,WAAAA,CAAAA;AAEhC,YAAA,OAAQzB,UAAUqC,IAAI;gBACpB,KAAK,WAAA;AAAa,oBAAA;wBAChB,MAAM,EAAEzB,UAAU,EAAE,GAAGC,UAAU,CAACb,SAAAA,CAAUsC,SAAS,CAAC;wBAEtD,IAAItC,SAAAA,CAAUuC,UAAU,EAAE;4BACxB,OAAO;AACL,gCAAA,GAAGlB,GAAG;AACN,gCAAA,CAACC,OAAOa,eAAAA,CACNpB,GAAIyB,CAAAA,KAAK,GAAGC,EAAE,CAAC3B,iBAAkBF,CAAAA,UAAAA,CAAAA,CAAY8B,QAAQ,CAAC,KAAA,CAAA,CAAA,CAAA,CACtDrC,IAAI,CAACN,eAAeC,SAAWC,EAAAA,OAAAA,CAAAA;AACnC,6BAAA;yBACK,MAAA;4BACL,OAAO;AACL,gCAAA,GAAGoB,GAAG;AACN,gCAAA,CAACC,IAAK,GAAEa,eAAgBrB,CAAAA,iBAAAA,CAAkBF,YAAY8B,QAAQ,EAAA;AAChE,6BAAA;AACF;AACF;gBACA,KAAK,aAAA;oBACH,OAAO;AACL,wBAAA,GAAGrB,GAAG;wBACN,CAACC,IAAAA,GAAOa,eAAAA,CACNpB,GAAIyB,CAAAA,KAAK,EAAGC,CAAAA,EAAE,CACZ1B,GAAAA,CAAI4B,IAAI,CACN,CACEC,IAAAA,GAAAA;AAEA,4BAAA,MAAMhC,UAAaC,GAAAA,UAAAA,GAAa+B,IAAAA,EAAMC,YAAY,EAAEjC,UAAAA;AAEpD,4BAAA,MAAMkC,UAAa/B,GAAAA,GAAAA,CAChBC,MAAM,EAAA,CACNC,KAAK,CAAC;gCACL4B,WAAa9B,EAAAA,GAAAA,CAAIgC,MAAM,EAAG3C,CAAAA,QAAQ,GAAG4C,KAAK,CAAC9B,MAAO+B,CAAAA,IAAI,CAACpC,UAAAA,CAAAA;AACzD,6BAAA,CAAA,CACC6B,QAAQ,CAAC,KAAA,CAAA;AACZ,4BAAA,IAAI,CAAC9B,UAAY,EAAA;gCACf,OAAOkC,UAAAA;AACT;4BAEA,OAAOA,UAAAA,CAAWI,MAAM,CAACpC,iBAAkBF,CAAAA,UAAAA,CAAAA,CAAAA;yBAIjDP,CAAAA,CAAAA,CAAAA,CAAAA,IAAI,CAACN,cAAAA,CAAeC,SAAWC,EAAAA,OAAAA,CAAAA;AACnC,qBAAA;gBACF,KAAK,UAAA;oBACH,OAAO;AACL,wBAAA,GAAGoB,GAAG;AACN,wBAAA,CAACC,OAAOa,eAAAA,CACNpB,GAAI4B,CAAAA,IAAI,CAAC,CAACrC,KAAAA,GAAAA;AACR,4BAAA,IAAI,CAACA,KAAO,EAAA;AACV,gCAAA,OAAOS,GAAIoC,CAAAA,KAAK,EAAGT,CAAAA,QAAQ,CAAC,IAAA,CAAA;AAC9B,6BAAA,MAAO,IAAIlC,KAAAA,CAAMC,OAAO,CAACH,KAAQ,CAAA,EAAA;;;gCAG/B,OAAOS,GAAAA,CAAIyB,KAAK,EAAGC,CAAAA,EAAE,CACnB1B,GAAIC,CAAAA,MAAM,EAAGC,CAAAA,KAAK,CAAC;oCACjBmC,EAAIrC,EAAAA,GAAAA,CAAIsC,MAAM,EAAA,CAAGjD,QAAQ;AAC3B,iCAAA,CAAA,CAAA;6BAEG,MAAA,IAAI,OAAOE,KAAAA,KAAU,QAAU,EAAA;;;;AAIpC,gCAAA,OAAOS,IAAIC,MAAM,EAAA;6BACZ,MAAA;AACL,gCAAA,OAAOD,IACJoC,KAAK,EAAA,CACL9C,IAAI,CACH,YAAA,EACA,oFACA,IAAM,KAAA,CAAA;AAEZ;AACF,yBAAA,CAAA;AAEJ,qBAAA;AACF,gBAAA;oBACE,OAAO;AACL,wBAAA,GAAGgB,GAAG;wBACN,CAACC,IAAAA,GAAOa,eAAAA,CAAgBmB,qBAAsBtD,CAAAA,SAAAA,CAAAA;AAChD,qBAAA;AACJ;AACF,SAAA,EAAG,EAEL,CAAA,CAAA;;AAEC,WACAuD,OAAO,CAAC,IAAA,CAAA;AAEb,IAAA,OAAOzC,iBAAkBF,CAAAA,UAAAA,CAAAA;AAC3B;AAEA,MAAM0C,wBAAwB,CAC5BtD,SAAAA,GAAAA;AAKA,IAAA,OAAQA,UAAUqC,IAAI;QACpB,KAAK,YAAA;AACH,YAAA,OAAOtB,GAAIgC,CAAAA,MAAM,EAAGS,CAAAA,OAAO,CAAC,SAAA,CAAA;QAC9B,KAAK,SAAA;AACH,YAAA,OAAOzC,IAAI0C,OAAO,EAAA;QACpB,KAAK,QAAA;YACH,OAAO1C,GAAAA,CAAIoC,KAAK,EAAG9C,CAAAA,IAAI,CAAC,UAAYF,EAAAA,gBAAAA,CAAiBuD,IAAI,EAAE,CAACpD,KAAAA,GAAAA;AAC1D,gBAAA,IAAI,CAACA,KAAAA,IAASE,KAAMC,CAAAA,OAAO,CAACH,KAAQ,CAAA,EAAA;oBAClC,OAAO,IAAA;iBACF,MAAA;oBACL,OAAO,KAAA;AACT;AACF,aAAA,CAAA;QACF,KAAK,SAAA;QACL,KAAK,OAAA;QACL,KAAK,SAAA;AACH,YAAA,OAAOS,IAAIsC,MAAM,EAAA;QACnB,KAAK,OAAA;AACH,YAAA,OAAOtC,IAAIgC,MAAM,EAAA,CAAGY,KAAK,CAACxD,iBAAiBwD,KAAK,CAAA;QAClD,KAAK,aAAA;AACH,YAAA,OAAO5C,GAAIgC,CAAAA,MAAM,EAAGC,CAAAA,KAAK,CAAC;AAAIhD,gBAAAA,GAAAA,SAAAA,CAAU4D,IAAI;AAAE,gBAAA;AAAK,aAAA,CAAA;QACrD,KAAK,MAAA;YACH,OAAO7C,GAAAA,CAAIoC,KAAK,EAAG9C,CAAAA,IAAI,CAAC,QAAUF,EAAAA,gBAAAA,CAAiBuD,IAAI,EAAE,CAACpD,KAAAA,GAAAA;AACxD;;YAGA,IAAI,CAACA,KAAU,IAAA,OAAOA,UAAU,QAAYA,IAAAA,KAAAA,CAAMI,MAAM,KAAK,CAAI,EAAA;oBAC/D,OAAO,IAAA;AACT;;gBAGA,IAAI,OAAOJ,UAAU,QAAU,EAAA;oBAC7B,IAAI;AACFuD,wBAAAA,IAAAA,CAAKC,SAAS,CAACxD,KAAAA,CAAAA;wBACf,OAAO,IAAA;AACT,qBAAA,CAAE,OAAOyD,GAAK,EAAA;wBACZ,OAAO,KAAA;AACT;AACF;gBAEA,IAAI;AACFF,oBAAAA,IAAAA,CAAKG,KAAK,CAAC1D,KAAAA,CAAAA;oBAEX,OAAO,IAAA;AACT,iBAAA,CAAE,OAAOyD,GAAK,EAAA;oBACZ,OAAO,KAAA;AACT;AACF,aAAA,CAAA;QACF,KAAK,UAAA;QACL,KAAK,UAAA;QACL,KAAK,QAAA;QACL,KAAK,MAAA;AACH,YAAA,OAAOhD,IAAIgC,MAAM,EAAA;QACnB,KAAK,KAAA;AACH,YAAA,OAAOhC,GACJgC,CAAAA,MAAM,EACNS,CAAAA,OAAO,CAACxD,SAAAA,CAAUiE,KAAK,GAAG,IAAIC,MAAAA,CAAOlE,SAAUiE,CAAAA,KAAK,CAAI,GAAA,oBAAA,CAAA;AAC7D,QAAA;AACE;;UAGA,OAAOlD,IAAIoC,KAAK,EAAA;AACpB;AACF,CAAA;AAEA;AACA,MAAMgB,iBAAiB,CAA4BC,MAAAA,GAAAA;AACjD,IAAA,OAAOA,MAAQ1B,EAAAA,QAAAA,GACX0B,MAAO1B,CAAAA,QAAQ;;AAIf0B,IAAAA,MAAAA;AACN,CAAA;AAcA,MAAM1C,qBAAAA,GAAsC,IAAM,CAAC0C,MAAAA,GAAAA;AACjD,QAAA,OAAOD,cAAeC,CAAAA,MAAAA,CAAAA;AACxB,KAAA;AAEA,MAAMzC,qBAAsC,GAAA,CAAC3B,SAAWC,EAAAA,OAAAA,GAAY,CAACmE,MAAAA,GAAAA;AACnE,QAAA,IAAInE,QAAQM,MAAM,KAAK,WAAW,CAACP,SAAAA,CAAUI,QAAQ,EAAE;YACrD,OAAOgE,MAAAA;AACT;AAEA,QAAA,IAAIpE,SAAUI,CAAAA,QAAQ,IAAI,UAAA,IAAcgE,MAAQ,EAAA;AAC9C,YAAA,OAAOA,MAAOhE,CAAAA,QAAQ,CAACD,gBAAAA,CAAiBC,QAAQ,CAAA;AAClD;QAEA,OAAOgE,MAAAA;AACT,KAAA;AAEA,MAAMxC,sBACJ,GAAA,CAAC5B,SAAWC,EAAAA,OAAAA,GACZ,CAA4BmE,MAAAA,GAAAA;;QAE1B,IAAInE,OAAAA,CAAQM,MAAM,KAAK,OAAS,EAAA;YAC9B,OAAO6D,MAAAA;AACT;AAEA,QAAA,IACE,WAAepE,IAAAA,SAAAA,IACfA,SAAUqE,CAAAA,SAAS,IACnBC,MAAAA,CAAOC,SAAS,CAACvE,SAAUqE,CAAAA,SAAS,CACpC,IAAA,KAAA,IAASD,MACT,EAAA;AACA,YAAA,OAAOA,MAAOI,CAAAA,GAAG,CAACxE,SAAAA,CAAUqE,SAAS,EAAE;AACrC,gBAAA,GAAGlE,iBAAiBkE,SAAS;gBAC7BI,MAAQ,EAAA;AACND,oBAAAA,GAAAA,EAAKxE,UAAUqE;AACjB;AACF,aAAA,CAAA;AACF;QAEA,OAAOD,MAAAA;AACT,KAAA;AAEF,MAAMvC,sBAAAA,GACJ,CAAC7B,SAAAA,GACD,CAA4BoE,MAAAA,GAAAA;AAC1B,QAAA,IACE,WAAepE,IAAAA,SAAAA,IACfA,SAAU0E,CAAAA,SAAS,IACnBJ,MAAAA,CAAOC,SAAS,CAACvE,SAAU0E,CAAAA,SAAS,CACpC,IAAA,KAAA,IAASN,MACT,EAAA;AACA,YAAA,OAAOA,MAAOO,CAAAA,GAAG,CAAC3E,SAAAA,CAAU0E,SAAS,EAAE;AACrC,gBAAA,GAAGvE,iBAAiBuE,SAAS;gBAC7BD,MAAQ,EAAA;AACNE,oBAAAA,GAAAA,EAAK3E,UAAU0E;AACjB;AACF,aAAA,CAAA;AACF;QAEA,OAAON,MAAAA;AACT,KAAA;AAEF,MAAMtC,gBACJ,GAAA,CAAC9B,SAAWC,EAAAA,OAAAA,GACZ,CAA4BmE,MAAAA,GAAAA;;QAE1B,IAAInE,OAAAA,CAAQM,MAAM,KAAK,OAAS,EAAA;YAC9B,OAAO6D,MAAAA;AACT;QAEA,IAAI,KAAA,IAASpE,SAAa,IAAA,KAAA,IAASoE,MAAQ,EAAA;YACzC,MAAMI,GAAAA,GAAMI,SAAU5E,CAAAA,SAAAA,CAAUwE,GAAG,CAAA;AAEnC,YAAA,IAAIA,GAAK,EAAA;gBACP,OAAOJ,MAAAA,CAAOI,GAAG,CAACA,GAAK,EAAA;AACrB,oBAAA,GAAGrE,iBAAiBqE,GAAG;oBACvBC,MAAQ,EAAA;AACND,wBAAAA;AACF;AACF,iBAAA,CAAA;AACF;AACF;QAEA,OAAOJ,MAAAA;AACT,KAAA;AAEF,MAAMrC,gBAAAA,GACJ,CAAC/B,SAAAA,GACD,CAA4BoE,MAAAA,GAAAA;AAC1B,QAAA,IAAI,SAASpE,SAAW,EAAA;YACtB,MAAM2E,GAAAA,GAAMC,SAAU5E,CAAAA,SAAAA,CAAU2E,GAAG,CAAA;YAEnC,IAAI,KAAA,IAASP,UAAUO,GAAK,EAAA;gBAC1B,OAAOP,MAAAA,CAAOO,GAAG,CAACA,GAAK,EAAA;AACrB,oBAAA,GAAGxE,iBAAiBwE,GAAG;oBACvBF,MAAQ,EAAA;AACNE,wBAAAA;AACF;AACF,iBAAA,CAAA;AACF;AACF;QAEA,OAAOP,MAAAA;AACT,KAAA;AAEF,MAAMQ,YAAY,CAACC,GAAAA,GAAAA;AACjB,IAAA,IAAI,OAAOA,GAAAA,KAAQ,QAAYA,IAAAA,GAAAA,KAAQC,SAAW,EAAA;QAChD,OAAOD,GAAAA;KACF,MAAA;AACL,QAAA,MAAME,MAAMT,MAAOO,CAAAA,GAAAA,CAAAA;QACnB,OAAOG,KAAAA,CAAMD,OAAOD,SAAYC,GAAAA,GAAAA;AAClC;AACF,CAAA;AAEA,MAAM/C,kBAAAA,GACJ,CAAChC,SAAAA,GACD,CAA4BoE,MAAAA,GAAAA;AAC1B,QAAA,IAAI,WAAWpE,SAAaA,IAAAA,SAAAA,CAAUiE,KAAK,IAAI,aAAaG,MAAQ,EAAA;AAClE,YAAA,OAAOA,OAAOZ,OAAO,CAAC,IAAIU,MAAOlE,CAAAA,SAAAA,CAAUiE,KAAK,CAAG,EAAA;gBACjD/D,OAAS,EAAA;oBACPkD,EAAIjD,EAAAA,gBAAAA,CAAiB8D,KAAK,CAACb,EAAE;oBAC7B6B,cAAgB,EAAA;AAClB,iBAAA;gBAEAC,kBAAoB,EAAA,CAAClF,UAAUI;AACjC,aAAA,CAAA;AACF;QAEA,OAAOgE,MAAAA;AACT,KAAA;;;;"}
@@ -49,7 +49,17 @@ var contentTypes = {
49
49
  const configuration = await contentTypeService.findConfiguration(contentType);
50
50
  const confWithUpdatedMetadata = {
51
51
  ...configuration,
52
- metadatas: fp.mapValues(assocMainField, configuration.metadatas)
52
+ metadatas: {
53
+ ...fp.mapValues(assocMainField, configuration.metadatas),
54
+ documentId: {
55
+ edit: {},
56
+ list: {
57
+ label: 'documentId',
58
+ searchable: true,
59
+ sortable: true
60
+ }
61
+ }
62
+ }
53
63
  };
54
64
  const components = await contentTypeService.findComponentsConfigurations(contentType);
55
65
  ctx.body = {
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { has, assoc, mapValues, prop } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { createModelConfigurationSchema, validateKind } from './validation';\n\nconst hasEditMainField = has('edit.mainField');\nconst getEditMainField = prop('edit.mainField');\nconst assocListMainField = assoc('list.mainField');\n\nconst assocMainField = (metadata: any) =>\n hasEditMainField(metadata) ? assocListMainField(getEditMainField(metadata), metadata) : metadata;\n\nexport default {\n async findContentTypes(ctx: any) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypes = getService('content-types').findContentTypesByKind(kind);\n const { toDto } = getService('data-mapper');\n\n ctx.body = { data: contentTypes.map(toDto) };\n },\n\n async findContentTypesSettings(ctx: any) {\n const { findAllContentTypes, findConfiguration } = getService('content-types');\n\n const contentTypes = await findAllContentTypes();\n const configurations = await Promise.all(\n contentTypes.map(async (contentType: any) => {\n const { uid, settings } = await findConfiguration(contentType);\n return { uid, settings };\n })\n );\n\n ctx.body = {\n data: configurations,\n };\n },\n\n async findContentTypeConfiguration(ctx: any) {\n const { uid } = ctx.params;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.findContentType(uid);\n\n if (!contentType) {\n return ctx.notFound('contentType.notFound');\n }\n\n const configuration = await contentTypeService.findConfiguration(contentType);\n\n const confWithUpdatedMetadata = {\n ...configuration,\n metadatas: mapValues(assocMainField, configuration.metadatas),\n };\n\n const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n ctx.body = {\n data: {\n contentType: confWithUpdatedMetadata,\n components,\n },\n };\n },\n\n async updateContentTypeConfiguration(ctx: any) {\n const { userAbility } = ctx.state;\n const { uid } = ctx.params;\n const { body } = ctx.request;\n\n const contentTypeService = getService('content-types');\n const metricsService = getService('metrics');\n\n const contentType = await contentTypeService.findContentType(uid);\n\n if (!contentType) {\n return ctx.notFound('contentType.notFound');\n }\n\n if (!getService('permission').canConfigureContentType({ userAbility, contentType })) {\n return ctx.forbidden();\n }\n\n let input;\n try {\n input = await createModelConfigurationSchema(contentType).validate(body, {\n abortEarly: false,\n stripUnknown: true,\n strict: true,\n });\n } catch (error: any) {\n return ctx.badRequest(null, {\n name: 'validationError',\n errors: error.errors,\n });\n }\n\n const newConfiguration = await contentTypeService.updateConfiguration(contentType, input);\n\n await metricsService.sendDidConfigureListView(contentType, newConfiguration);\n\n const confWithUpdatedMetadata = {\n ...newConfiguration,\n metadatas: mapValues(assocMainField, newConfiguration.metadatas),\n };\n\n const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n ctx.body = {\n data: {\n contentType: confWithUpdatedMetadata,\n components,\n },\n };\n },\n};\n"],"names":["hasEditMainField","has","getEditMainField","prop","assocListMainField","assoc","assocMainField","metadata","findContentTypes","ctx","kind","query","validateKind","error","send","contentTypes","getService","findContentTypesByKind","toDto","body","data","map","findContentTypesSettings","findAllContentTypes","findConfiguration","configurations","Promise","all","contentType","uid","settings","findContentTypeConfiguration","params","contentTypeService","findContentType","notFound","configuration","confWithUpdatedMetadata","metadatas","mapValues","components","findComponentsConfigurations","updateContentTypeConfiguration","userAbility","state","request","metricsService","canConfigureContentType","forbidden","input","createModelConfigurationSchema","validate","abortEarly","stripUnknown","strict","badRequest","name","errors","newConfiguration","updateConfiguration","sendDidConfigureListView"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { has, assoc, mapValues, prop } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { createModelConfigurationSchema, validateKind } from './validation';\n\nconst hasEditMainField = has('edit.mainField');\nconst getEditMainField = prop('edit.mainField');\nconst assocListMainField = assoc('list.mainField');\n\nconst assocMainField = (metadata: any) =>\n hasEditMainField(metadata) ? assocListMainField(getEditMainField(metadata), metadata) : metadata;\n\nexport default {\n async findContentTypes(ctx: any) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypes = getService('content-types').findContentTypesByKind(kind);\n const { toDto } = getService('data-mapper');\n\n ctx.body = { data: contentTypes.map(toDto) };\n },\n\n async findContentTypesSettings(ctx: any) {\n const { findAllContentTypes, findConfiguration } = getService('content-types');\n\n const contentTypes = await findAllContentTypes();\n const configurations = await Promise.all(\n contentTypes.map(async (contentType: any) => {\n const { uid, settings } = await findConfiguration(contentType);\n return { uid, settings };\n })\n );\n\n ctx.body = {\n data: configurations,\n };\n },\n\n async findContentTypeConfiguration(ctx: any) {\n const { uid } = ctx.params;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.findContentType(uid);\n\n if (!contentType) {\n return ctx.notFound('contentType.notFound');\n }\n\n const configuration = await contentTypeService.findConfiguration(contentType);\n\n const confWithUpdatedMetadata = {\n ...configuration,\n metadatas: {\n ...mapValues(assocMainField, configuration.metadatas),\n documentId: {\n edit: {},\n list: {\n label: 'documentId',\n searchable: true,\n sortable: true,\n },\n },\n },\n };\n\n const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n ctx.body = {\n data: {\n contentType: confWithUpdatedMetadata,\n components,\n },\n };\n },\n\n async updateContentTypeConfiguration(ctx: any) {\n const { userAbility } = ctx.state;\n const { uid } = ctx.params;\n const { body } = ctx.request;\n\n const contentTypeService = getService('content-types');\n const metricsService = getService('metrics');\n\n const contentType = await contentTypeService.findContentType(uid);\n\n if (!contentType) {\n return ctx.notFound('contentType.notFound');\n }\n\n if (!getService('permission').canConfigureContentType({ userAbility, contentType })) {\n return ctx.forbidden();\n }\n\n let input;\n try {\n input = await createModelConfigurationSchema(contentType).validate(body, {\n abortEarly: false,\n stripUnknown: true,\n strict: true,\n });\n } catch (error: any) {\n return ctx.badRequest(null, {\n name: 'validationError',\n errors: error.errors,\n });\n }\n\n const newConfiguration = await contentTypeService.updateConfiguration(contentType, input);\n\n await metricsService.sendDidConfigureListView(contentType, newConfiguration);\n\n const confWithUpdatedMetadata = {\n ...newConfiguration,\n metadatas: mapValues(assocMainField, newConfiguration.metadatas),\n };\n\n const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n ctx.body = {\n data: {\n contentType: confWithUpdatedMetadata,\n components,\n },\n };\n },\n};\n"],"names":["hasEditMainField","has","getEditMainField","prop","assocListMainField","assoc","assocMainField","metadata","findContentTypes","ctx","kind","query","validateKind","error","send","contentTypes","getService","findContentTypesByKind","toDto","body","data","map","findContentTypesSettings","findAllContentTypes","findConfiguration","configurations","Promise","all","contentType","uid","settings","findContentTypeConfiguration","params","contentTypeService","findContentType","notFound","configuration","confWithUpdatedMetadata","metadatas","mapValues","documentId","edit","list","label","searchable","sortable","components","findComponentsConfigurations","updateContentTypeConfiguration","userAbility","state","request","metricsService","canConfigureContentType","forbidden","input","createModelConfigurationSchema","validate","abortEarly","stripUnknown","strict","badRequest","name","errors","newConfiguration","updateConfiguration","sendDidConfigureListView"],"mappings":"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"}
@@ -47,7 +47,17 @@ var contentTypes = {
47
47
  const configuration = await contentTypeService.findConfiguration(contentType);
48
48
  const confWithUpdatedMetadata = {
49
49
  ...configuration,
50
- metadatas: mapValues(assocMainField, configuration.metadatas)
50
+ metadatas: {
51
+ ...mapValues(assocMainField, configuration.metadatas),
52
+ documentId: {
53
+ edit: {},
54
+ list: {
55
+ label: 'documentId',
56
+ searchable: true,
57
+ sortable: true
58
+ }
59
+ }
60
+ }
51
61
  };
52
62
  const components = await contentTypeService.findComponentsConfigurations(contentType);
53
63
  ctx.body = {
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { has, assoc, mapValues, prop } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { createModelConfigurationSchema, validateKind } from './validation';\n\nconst hasEditMainField = has('edit.mainField');\nconst getEditMainField = prop('edit.mainField');\nconst assocListMainField = assoc('list.mainField');\n\nconst assocMainField = (metadata: any) =>\n hasEditMainField(metadata) ? assocListMainField(getEditMainField(metadata), metadata) : metadata;\n\nexport default {\n async findContentTypes(ctx: any) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypes = getService('content-types').findContentTypesByKind(kind);\n const { toDto } = getService('data-mapper');\n\n ctx.body = { data: contentTypes.map(toDto) };\n },\n\n async findContentTypesSettings(ctx: any) {\n const { findAllContentTypes, findConfiguration } = getService('content-types');\n\n const contentTypes = await findAllContentTypes();\n const configurations = await Promise.all(\n contentTypes.map(async (contentType: any) => {\n const { uid, settings } = await findConfiguration(contentType);\n return { uid, settings };\n })\n );\n\n ctx.body = {\n data: configurations,\n };\n },\n\n async findContentTypeConfiguration(ctx: any) {\n const { uid } = ctx.params;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.findContentType(uid);\n\n if (!contentType) {\n return ctx.notFound('contentType.notFound');\n }\n\n const configuration = await contentTypeService.findConfiguration(contentType);\n\n const confWithUpdatedMetadata = {\n ...configuration,\n metadatas: mapValues(assocMainField, configuration.metadatas),\n };\n\n const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n ctx.body = {\n data: {\n contentType: confWithUpdatedMetadata,\n components,\n },\n };\n },\n\n async updateContentTypeConfiguration(ctx: any) {\n const { userAbility } = ctx.state;\n const { uid } = ctx.params;\n const { body } = ctx.request;\n\n const contentTypeService = getService('content-types');\n const metricsService = getService('metrics');\n\n const contentType = await contentTypeService.findContentType(uid);\n\n if (!contentType) {\n return ctx.notFound('contentType.notFound');\n }\n\n if (!getService('permission').canConfigureContentType({ userAbility, contentType })) {\n return ctx.forbidden();\n }\n\n let input;\n try {\n input = await createModelConfigurationSchema(contentType).validate(body, {\n abortEarly: false,\n stripUnknown: true,\n strict: true,\n });\n } catch (error: any) {\n return ctx.badRequest(null, {\n name: 'validationError',\n errors: error.errors,\n });\n }\n\n const newConfiguration = await contentTypeService.updateConfiguration(contentType, input);\n\n await metricsService.sendDidConfigureListView(contentType, newConfiguration);\n\n const confWithUpdatedMetadata = {\n ...newConfiguration,\n metadatas: mapValues(assocMainField, newConfiguration.metadatas),\n };\n\n const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n ctx.body = {\n data: {\n contentType: confWithUpdatedMetadata,\n components,\n },\n };\n },\n};\n"],"names":["hasEditMainField","has","getEditMainField","prop","assocListMainField","assoc","assocMainField","metadata","findContentTypes","ctx","kind","query","validateKind","error","send","contentTypes","getService","findContentTypesByKind","toDto","body","data","map","findContentTypesSettings","findAllContentTypes","findConfiguration","configurations","Promise","all","contentType","uid","settings","findContentTypeConfiguration","params","contentTypeService","findContentType","notFound","configuration","confWithUpdatedMetadata","metadatas","mapValues","components","findComponentsConfigurations","updateContentTypeConfiguration","userAbility","state","request","metricsService","canConfigureContentType","forbidden","input","createModelConfigurationSchema","validate","abortEarly","stripUnknown","strict","badRequest","name","errors","newConfiguration","updateConfiguration","sendDidConfigureListView"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { has, assoc, mapValues, prop } from 'lodash/fp';\nimport { getService } from '../utils';\nimport { createModelConfigurationSchema, validateKind } from './validation';\n\nconst hasEditMainField = has('edit.mainField');\nconst getEditMainField = prop('edit.mainField');\nconst assocListMainField = assoc('list.mainField');\n\nconst assocMainField = (metadata: any) =>\n hasEditMainField(metadata) ? assocListMainField(getEditMainField(metadata), metadata) : metadata;\n\nexport default {\n async findContentTypes(ctx: any) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypes = getService('content-types').findContentTypesByKind(kind);\n const { toDto } = getService('data-mapper');\n\n ctx.body = { data: contentTypes.map(toDto) };\n },\n\n async findContentTypesSettings(ctx: any) {\n const { findAllContentTypes, findConfiguration } = getService('content-types');\n\n const contentTypes = await findAllContentTypes();\n const configurations = await Promise.all(\n contentTypes.map(async (contentType: any) => {\n const { uid, settings } = await findConfiguration(contentType);\n return { uid, settings };\n })\n );\n\n ctx.body = {\n data: configurations,\n };\n },\n\n async findContentTypeConfiguration(ctx: any) {\n const { uid } = ctx.params;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.findContentType(uid);\n\n if (!contentType) {\n return ctx.notFound('contentType.notFound');\n }\n\n const configuration = await contentTypeService.findConfiguration(contentType);\n\n const confWithUpdatedMetadata = {\n ...configuration,\n metadatas: {\n ...mapValues(assocMainField, configuration.metadatas),\n documentId: {\n edit: {},\n list: {\n label: 'documentId',\n searchable: true,\n sortable: true,\n },\n },\n },\n };\n\n const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n ctx.body = {\n data: {\n contentType: confWithUpdatedMetadata,\n components,\n },\n };\n },\n\n async updateContentTypeConfiguration(ctx: any) {\n const { userAbility } = ctx.state;\n const { uid } = ctx.params;\n const { body } = ctx.request;\n\n const contentTypeService = getService('content-types');\n const metricsService = getService('metrics');\n\n const contentType = await contentTypeService.findContentType(uid);\n\n if (!contentType) {\n return ctx.notFound('contentType.notFound');\n }\n\n if (!getService('permission').canConfigureContentType({ userAbility, contentType })) {\n return ctx.forbidden();\n }\n\n let input;\n try {\n input = await createModelConfigurationSchema(contentType).validate(body, {\n abortEarly: false,\n stripUnknown: true,\n strict: true,\n });\n } catch (error: any) {\n return ctx.badRequest(null, {\n name: 'validationError',\n errors: error.errors,\n });\n }\n\n const newConfiguration = await contentTypeService.updateConfiguration(contentType, input);\n\n await metricsService.sendDidConfigureListView(contentType, newConfiguration);\n\n const confWithUpdatedMetadata = {\n ...newConfiguration,\n metadatas: mapValues(assocMainField, newConfiguration.metadatas),\n };\n\n const components = await contentTypeService.findComponentsConfigurations(contentType);\n\n ctx.body = {\n data: {\n contentType: confWithUpdatedMetadata,\n components,\n },\n };\n },\n};\n"],"names":["hasEditMainField","has","getEditMainField","prop","assocListMainField","assoc","assocMainField","metadata","findContentTypes","ctx","kind","query","validateKind","error","send","contentTypes","getService","findContentTypesByKind","toDto","body","data","map","findContentTypesSettings","findAllContentTypes","findConfiguration","configurations","Promise","all","contentType","uid","settings","findContentTypeConfiguration","params","contentTypeService","findContentType","notFound","configuration","confWithUpdatedMetadata","metadatas","mapValues","documentId","edit","list","label","searchable","sortable","components","findComponentsConfigurations","updateContentTypeConfiguration","userAbility","state","request","metricsService","canConfigureContentType","forbidden","input","createModelConfigurationSchema","validate","abortEarly","stripUnknown","strict","badRequest","name","errors","newConfiguration","updateConfiguration","sendDidConfigureListView"],"mappings":"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"}
@@ -9,6 +9,7 @@ var singleTypes = require('./single-types.js');
9
9
  var uid = require('./uid.js');
10
10
  var index = require('../history/index.js');
11
11
  var index$1 = require('../preview/index.js');
12
+ var index$2 = require('../homepage/index.js');
12
13
 
13
14
  var controllers = {
14
15
  'collection-types': collectionTypes,
@@ -19,7 +20,8 @@ var controllers = {
19
20
  'single-types': singleTypes,
20
21
  uid,
21
22
  ...index.controllers ? index.controllers : {},
22
- ...index$1.controllers ? index$1.controllers : {}
23
+ ...index$1.controllers ? index$1.controllers : {},
24
+ ...index$2.controllers
23
25
  };
24
26
 
25
27
  module.exports = controllers;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import collectionTypes from './collection-types';\nimport components from './components';\nimport contentTypes from './content-types';\nimport init from './init';\nimport relations from './relations';\nimport singleTypes from './single-types';\nimport uid from './uid';\nimport history from '../history';\nimport preview from '../preview';\n\nexport default {\n 'collection-types': collectionTypes,\n components,\n 'content-types': contentTypes,\n init,\n relations,\n 'single-types': singleTypes,\n uid,\n ...(history.controllers ? history.controllers : {}),\n ...(preview.controllers ? preview.controllers : {}),\n};\n"],"names":["collectionTypes","components","contentTypes","init","relations","singleTypes","uid","history","controllers","preview"],"mappings":";;;;;;;;;;;;AAUA,kBAAe;IACb,kBAAoBA,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,eAAiBC,EAAAA,YAAAA;AACjBC,IAAAA,IAAAA;AACAC,IAAAA,SAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,IAAAA,GAAAA;AACA,IAAA,GAAIC,MAAQC,WAAW,GAAGD,MAAQC,WAAW,GAAG,EAAE;AAClD,IAAA,GAAIC,QAAQD,WAAW,GAAGC,QAAQD,WAAW,GAAG;AAClD,CAAE;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import collectionTypes from './collection-types';\nimport components from './components';\nimport contentTypes from './content-types';\nimport init from './init';\nimport relations from './relations';\nimport singleTypes from './single-types';\nimport uid from './uid';\nimport history from '../history';\nimport preview from '../preview';\nimport homepage from '../homepage';\n\nexport default {\n 'collection-types': collectionTypes,\n components,\n 'content-types': contentTypes,\n init,\n relations,\n 'single-types': singleTypes,\n uid,\n ...(history.controllers ? history.controllers : {}),\n ...(preview.controllers ? preview.controllers : {}),\n ...homepage.controllers,\n};\n"],"names":["collectionTypes","components","contentTypes","init","relations","singleTypes","uid","history","controllers","preview","homepage"],"mappings":";;;;;;;;;;;;;AAWA,kBAAe;IACb,kBAAoBA,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,eAAiBC,EAAAA,YAAAA;AACjBC,IAAAA,IAAAA;AACAC,IAAAA,SAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,IAAAA,GAAAA;AACA,IAAA,GAAIC,MAAQC,WAAW,GAAGD,MAAQC,WAAW,GAAG,EAAE;AAClD,IAAA,GAAIC,QAAQD,WAAW,GAAGC,QAAQD,WAAW,GAAG,EAAE;AAClD,IAAA,GAAGE,QAASF;AACd,CAAE;;;;"}
@@ -7,6 +7,7 @@ import singleTypes from './single-types.mjs';
7
7
  import uid from './uid.mjs';
8
8
  import history from '../history/index.mjs';
9
9
  import preview from '../preview/index.mjs';
10
+ import homepage from '../homepage/index.mjs';
10
11
 
11
12
  var controllers = {
12
13
  'collection-types': collectionTypes,
@@ -17,7 +18,8 @@ var controllers = {
17
18
  'single-types': singleTypes,
18
19
  uid,
19
20
  ...history.controllers ? history.controllers : {},
20
- ...preview.controllers ? preview.controllers : {}
21
+ ...preview.controllers ? preview.controllers : {},
22
+ ...homepage.controllers
21
23
  };
22
24
 
23
25
  export { controllers as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import collectionTypes from './collection-types';\nimport components from './components';\nimport contentTypes from './content-types';\nimport init from './init';\nimport relations from './relations';\nimport singleTypes from './single-types';\nimport uid from './uid';\nimport history from '../history';\nimport preview from '../preview';\n\nexport default {\n 'collection-types': collectionTypes,\n components,\n 'content-types': contentTypes,\n init,\n relations,\n 'single-types': singleTypes,\n uid,\n ...(history.controllers ? history.controllers : {}),\n ...(preview.controllers ? preview.controllers : {}),\n};\n"],"names":["collectionTypes","components","contentTypes","init","relations","singleTypes","uid","history","controllers","preview"],"mappings":";;;;;;;;;;AAUA,kBAAe;IACb,kBAAoBA,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,eAAiBC,EAAAA,YAAAA;AACjBC,IAAAA,IAAAA;AACAC,IAAAA,SAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,IAAAA,GAAAA;AACA,IAAA,GAAIC,QAAQC,WAAW,GAAGD,QAAQC,WAAW,GAAG,EAAE;AAClD,IAAA,GAAIC,QAAQD,WAAW,GAAGC,QAAQD,WAAW,GAAG;AAClD,CAAE;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/controllers/index.ts"],"sourcesContent":["import collectionTypes from './collection-types';\nimport components from './components';\nimport contentTypes from './content-types';\nimport init from './init';\nimport relations from './relations';\nimport singleTypes from './single-types';\nimport uid from './uid';\nimport history from '../history';\nimport preview from '../preview';\nimport homepage from '../homepage';\n\nexport default {\n 'collection-types': collectionTypes,\n components,\n 'content-types': contentTypes,\n init,\n relations,\n 'single-types': singleTypes,\n uid,\n ...(history.controllers ? history.controllers : {}),\n ...(preview.controllers ? preview.controllers : {}),\n ...homepage.controllers,\n};\n"],"names":["collectionTypes","components","contentTypes","init","relations","singleTypes","uid","history","controllers","preview","homepage"],"mappings":";;;;;;;;;;;AAWA,kBAAe;IACb,kBAAoBA,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,eAAiBC,EAAAA,YAAAA;AACjBC,IAAAA,IAAAA;AACAC,IAAAA,SAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,IAAAA,GAAAA;AACA,IAAA,GAAIC,QAAQC,WAAW,GAAGD,QAAQC,WAAW,GAAG,EAAE;AAClD,IAAA,GAAIC,QAAQD,WAAW,GAAGC,QAAQD,WAAW,GAAG,EAAE;AAClD,IAAA,GAAGE,SAASF;AACd,CAAE;;;;"}
@@ -25,7 +25,9 @@ const generateUIDInputSchema = strapiUtils.yup.object({
25
25
  const checkUIDAvailabilityInputSchema = strapiUtils.yup.object({
26
26
  contentTypeUID: strapiUtils.yup.string().required(),
27
27
  field: strapiUtils.yup.string().required(),
28
- value: strapiUtils.yup.string().matches(/^[A-Za-z0-9-_.~]*$/).required()
28
+ value: strapiUtils.yup.string().required().test('isValueMatchingRegex', `\${path} must match the custom regex or the default one "/^[A-Za-z0-9-_.~]*$/"`, function(value, context) {
29
+ return value === '' || (context.options.context?.regex ? new RegExp(context.options?.context.regex).test(value) : /^[A-Za-z0-9-_.~]*$/.test(value));
30
+ })
29
31
  });
30
32
  const validateUIDField = (contentTypeUID, field)=>{
31
33
  const model = strapi.contentTypes[contentTypeUID];
@@ -46,7 +48,17 @@ const validateUIDField = (contentTypeUID, field)=>{
46
48
  const validateKind = strapiUtils.validateYupSchema(kindSchema);
47
49
  const validateBulkActionInput = strapiUtils.validateYupSchema(bulkActionInputSchema);
48
50
  const validateGenerateUIDInput = strapiUtils.validateYupSchema(generateUIDInputSchema);
49
- const validateCheckUIDAvailabilityInput = strapiUtils.validateYupSchema(checkUIDAvailabilityInputSchema);
51
+ const validateCheckUIDAvailabilityInput = (body)=>{
52
+ const options = {};
53
+ const contentType = body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;
54
+ if (contentType?.attributes[body.field] && `regex` in contentType.attributes[body.field] && contentType.attributes[body.field].regex) {
55
+ options.context = {
56
+ regex: (contentType?.attributes[body.field]).regex
57
+ };
58
+ }
59
+ const validator = strapiUtils.validateYupSchema(checkUIDAvailabilityInputSchema, options);
60
+ return validator(body);
61
+ };
50
62
 
51
63
  exports.validateBulkActionInput = validateBulkActionInput;
52
64
  exports.validateCheckUIDAvailabilityInput = validateCheckUIDAvailabilityInput;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .matches(/^[A-Za-z0-9-_.~]*$/)\n .required(),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = validateYupSchema(checkUIDAvailabilityInputSchema);\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","matches","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput"],"mappings":";;;;;;;;AAIA,MAAM,EAAEA,eAAe,EAAEC,eAAe,EAAE,GAAGC,kBAAAA;AAC7C,MAAMC,KAAQ,GAAA;AAAC,IAAA,YAAA;AAAc,IAAA;AAAiB,CAAA;AAE9C;;IAGA,MAAMC,aAAaC,eAAIC,CAAAA,MAAM,GAAGC,KAAK,CAACJ,OAAOK,QAAQ,EAAA;AAErD,MAAMC,qBAAAA,GAAwBJ,eAC3BK,CAAAA,MAAM,CAAC;IACNC,WAAaN,EAAAA,eAAAA,CAAIO,KAAK,EAAA,CAAGC,EAAE,CAACR,eAAIS,CAAAA,QAAQ,EAAIC,CAAAA,CAAAA,GAAG,CAAC,CAAA,CAAA,CAAGC,QAAQ;AAC7D,CAAA,CAAA,CACCA,QAAQ,EAAA;AAEX,MAAMC,sBAAAA,GAAyBZ,eAAIK,CAAAA,MAAM,CAAC;IACxCQ,cAAgBb,EAAAA,eAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IACrCG,KAAOd,EAAAA,eAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IAC5BI,IAAMf,EAAAA,eAAAA,CAAIK,MAAM,EAAA,CAAGM,QAAQ;AAC7B,CAAA,CAAA;AAEA,MAAMK,+BAAAA,GAAkChB,eAAIK,CAAAA,MAAM,CAAC;IACjDQ,cAAgBb,EAAAA,eAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IACrCG,KAAOd,EAAAA,eAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;AAC5BM,IAAAA,KAAAA,EAAOjB,gBACJC,MAAM,EAAA,CACNiB,OAAO,CAAC,sBACRP,QAAQ;AACb,CAAA,CAAA;AAEMQ,MAAAA,gBAAAA,GAAmB,CAACN,cAAqBC,EAAAA,KAAAA,GAAAA;AAC7C,IAAA,MAAMM,KAAQC,GAAAA,MAAAA,CAAOC,YAAY,CAACT,cAAe,CAAA;AAEjD,IAAA,IAAI,CAACO,KAAO,EAAA;AACV,QAAA,MAAM,IAAIxB,eAAgB,CAAA,uBAAA,CAAA;AAC5B;AAEA,IAAA,IACE,CAAC2B,CAAAA,CAAEC,GAAG,CAACJ,KAAO,EAAA;AAAC,QAAA,YAAA;AAAcN,QAAAA;KAAM,CACnCS,IAAAA,CAAAA,CAAEE,GAAG,CAACL,KAAO,EAAA;AAAC,QAAA,YAAA;AAAcN,QAAAA,KAAAA;AAAO,QAAA;AAAO,KAAA,CAAA,KAAM,KAChD,EAAA;AACA,QAAA,MAAM,IAAIlB,eAAgB,CAAA,CAAC,EAAEkB,KAAAA,CAAM,kCAAkC,CAAC,CAAA;AACxE;AACF;AAcA,MAAMY,eAAeC,6BAAkB5B,CAAAA,UAAAA;AACvC,MAAM6B,0BAA0BD,6BAAkBvB,CAAAA,qBAAAA;AAClD,MAAMyB,2BAA2BF,6BAAkBf,CAAAA,sBAAAA;AACnD,MAAMkB,oCAAoCH,6BAAkBX,CAAAA,+BAAAA;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport { ValidateOptions } from 'yup/lib/types';\nimport { TestContext } from 'yup';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .required()\n .test(\n 'isValueMatchingRegex',\n `\\${path} must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n function (value, context: TestContext<{ regex?: string }>) {\n return (\n value === '' ||\n (context.options.context?.regex\n ? new RegExp(context.options?.context.regex).test(value as string)\n : /^[A-Za-z0-9-_.~]*$/.test(value as string))\n );\n }\n ),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n const options: ValidateOptions<{ regex?: string }> = {};\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n options.context = {\n regex: (contentType?.attributes[body.field] as Schema.Attribute.UID).regex,\n };\n }\n\n const validator = validateYupSchema(checkUIDAvailabilityInputSchema, options);\n\n return validator(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","test","context","options","regex","RegExp","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","validator"],"mappings":"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"}
@@ -23,7 +23,9 @@ const generateUIDInputSchema = yup.object({
23
23
  const checkUIDAvailabilityInputSchema = yup.object({
24
24
  contentTypeUID: yup.string().required(),
25
25
  field: yup.string().required(),
26
- value: yup.string().matches(/^[A-Za-z0-9-_.~]*$/).required()
26
+ value: yup.string().required().test('isValueMatchingRegex', `\${path} must match the custom regex or the default one "/^[A-Za-z0-9-_.~]*$/"`, function(value, context) {
27
+ return value === '' || (context.options.context?.regex ? new RegExp(context.options?.context.regex).test(value) : /^[A-Za-z0-9-_.~]*$/.test(value));
28
+ })
27
29
  });
28
30
  const validateUIDField = (contentTypeUID, field)=>{
29
31
  const model = strapi.contentTypes[contentTypeUID];
@@ -44,7 +46,17 @@ const validateUIDField = (contentTypeUID, field)=>{
44
46
  const validateKind = validateYupSchema(kindSchema);
45
47
  const validateBulkActionInput = validateYupSchema(bulkActionInputSchema);
46
48
  const validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);
47
- const validateCheckUIDAvailabilityInput = validateYupSchema(checkUIDAvailabilityInputSchema);
49
+ const validateCheckUIDAvailabilityInput = (body)=>{
50
+ const options = {};
51
+ const contentType = body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;
52
+ if (contentType?.attributes[body.field] && `regex` in contentType.attributes[body.field] && contentType.attributes[body.field].regex) {
53
+ options.context = {
54
+ regex: (contentType?.attributes[body.field]).regex
55
+ };
56
+ }
57
+ const validator = validateYupSchema(checkUIDAvailabilityInputSchema, options);
58
+ return validator(body);
59
+ };
48
60
 
49
61
  export { validateBulkActionInput, validateCheckUIDAvailabilityInput, validateGenerateUIDInput, validateKind, validateUIDField };
50
62
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .matches(/^[A-Za-z0-9-_.~]*$/)\n .required(),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = validateYupSchema(checkUIDAvailabilityInputSchema);\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","matches","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput"],"mappings":";;;;;;AAIA,MAAM,EAAEA,eAAe,EAAEC,eAAe,EAAE,GAAGC,MAAAA;AAC7C,MAAMC,KAAQ,GAAA;AAAC,IAAA,YAAA;AAAc,IAAA;AAAiB,CAAA;AAE9C;;IAGA,MAAMC,aAAaC,GAAIC,CAAAA,MAAM,GAAGC,KAAK,CAACJ,OAAOK,QAAQ,EAAA;AAErD,MAAMC,qBAAAA,GAAwBJ,GAC3BK,CAAAA,MAAM,CAAC;IACNC,WAAaN,EAAAA,GAAAA,CAAIO,KAAK,EAAA,CAAGC,EAAE,CAACR,GAAIS,CAAAA,QAAQ,EAAIC,CAAAA,CAAAA,GAAG,CAAC,CAAA,CAAA,CAAGC,QAAQ;AAC7D,CAAA,CAAA,CACCA,QAAQ,EAAA;AAEX,MAAMC,sBAAAA,GAAyBZ,GAAIK,CAAAA,MAAM,CAAC;IACxCQ,cAAgBb,EAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IACrCG,KAAOd,EAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IAC5BI,IAAMf,EAAAA,GAAAA,CAAIK,MAAM,EAAA,CAAGM,QAAQ;AAC7B,CAAA,CAAA;AAEA,MAAMK,+BAAAA,GAAkChB,GAAIK,CAAAA,MAAM,CAAC;IACjDQ,cAAgBb,EAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;IACrCG,KAAOd,EAAAA,GAAAA,CAAIC,MAAM,EAAA,CAAGU,QAAQ,EAAA;AAC5BM,IAAAA,KAAAA,EAAOjB,IACJC,MAAM,EAAA,CACNiB,OAAO,CAAC,sBACRP,QAAQ;AACb,CAAA,CAAA;AAEMQ,MAAAA,gBAAAA,GAAmB,CAACN,cAAqBC,EAAAA,KAAAA,GAAAA;AAC7C,IAAA,MAAMM,KAAQC,GAAAA,MAAAA,CAAOC,YAAY,CAACT,cAAe,CAAA;AAEjD,IAAA,IAAI,CAACO,KAAO,EAAA;AACV,QAAA,MAAM,IAAIxB,eAAgB,CAAA,uBAAA,CAAA;AAC5B;AAEA,IAAA,IACE,CAAC2B,CAAAA,CAAEC,GAAG,CAACJ,KAAO,EAAA;AAAC,QAAA,YAAA;AAAcN,QAAAA;KAAM,CACnCS,IAAAA,CAAAA,CAAEE,GAAG,CAACL,KAAO,EAAA;AAAC,QAAA,YAAA;AAAcN,QAAAA,KAAAA;AAAO,QAAA;AAAO,KAAA,CAAA,KAAM,KAChD,EAAA;AACA,QAAA,MAAM,IAAIlB,eAAgB,CAAA,CAAC,EAAEkB,KAAAA,CAAM,kCAAkC,CAAC,CAAA;AACxE;AACF;AAcA,MAAMY,eAAeC,iBAAkB5B,CAAAA,UAAAA;AACvC,MAAM6B,0BAA0BD,iBAAkBvB,CAAAA,qBAAAA;AAClD,MAAMyB,2BAA2BF,iBAAkBf,CAAAA,sBAAAA;AACnD,MAAMkB,oCAAoCH,iBAAkBX,CAAAA,+BAAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/controllers/validation/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { Schema, UID } from '@strapi/types';\nimport { yup, validateYupSchema, errors } from '@strapi/utils';\nimport { ValidateOptions } from 'yup/lib/types';\nimport { TestContext } from 'yup';\nimport createModelConfigurationSchema from './model-configuration';\n\nconst { PaginationError, ValidationError } = errors;\nconst TYPES = ['singleType', 'collectionType'];\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf(TYPES).nullable();\n\nconst bulkActionInputSchema = yup\n .object({\n documentIds: yup.array().of(yup.strapiID()).min(1).required(),\n })\n .required();\n\nconst generateUIDInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n data: yup.object().required(),\n});\n\nconst checkUIDAvailabilityInputSchema = yup.object({\n contentTypeUID: yup.string().required(),\n field: yup.string().required(),\n value: yup\n .string()\n .required()\n .test(\n 'isValueMatchingRegex',\n `\\${path} must match the custom regex or the default one \"/^[A-Za-z0-9-_.~]*$/\"`,\n function (value, context: TestContext<{ regex?: string }>) {\n return (\n value === '' ||\n (context.options.context?.regex\n ? new RegExp(context.options?.context.regex).test(value as string)\n : /^[A-Za-z0-9-_.~]*$/.test(value as string))\n );\n }\n ),\n});\n\nconst validateUIDField = (contentTypeUID: any, field: any) => {\n const model = strapi.contentTypes[contentTypeUID];\n\n if (!model) {\n throw new ValidationError('ContentType not found');\n }\n\n if (\n !_.has(model, ['attributes', field]) ||\n _.get(model, ['attributes', field, 'type']) !== 'uid'\n ) {\n throw new ValidationError(`${field} must be a valid \\`uid\\` attribute`);\n }\n};\n\nconst validatePagination = ({ page, pageSize }: any) => {\n const pageNumber = parseInt(page, 10);\n const pageSizeNumber = parseInt(pageSize, 10);\n\n if (Number.isNaN(pageNumber) || pageNumber < 1) {\n throw new PaginationError('invalid pageNumber param');\n }\n if (Number.isNaN(pageSizeNumber) || pageSizeNumber < 1) {\n throw new PaginationError('invalid pageSize param');\n }\n};\n\nconst validateKind = validateYupSchema(kindSchema);\nconst validateBulkActionInput = validateYupSchema(bulkActionInputSchema);\nconst validateGenerateUIDInput = validateYupSchema(generateUIDInputSchema);\nconst validateCheckUIDAvailabilityInput = (body: {\n contentTypeUID: UID.ContentType;\n field: string;\n value: string;\n}) => {\n const options: ValidateOptions<{ regex?: string }> = {};\n\n const contentType =\n body.contentTypeUID in strapi.contentTypes ? strapi.contentTypes[body.contentTypeUID] : null;\n\n if (\n contentType?.attributes[body.field] &&\n `regex` in contentType.attributes[body.field] &&\n (contentType.attributes[body.field] as Schema.Attribute.UID).regex\n ) {\n options.context = {\n regex: (contentType?.attributes[body.field] as Schema.Attribute.UID).regex,\n };\n }\n\n const validator = validateYupSchema(checkUIDAvailabilityInputSchema, options);\n\n return validator(body);\n};\n\nexport {\n createModelConfigurationSchema,\n validateUIDField,\n validatePagination,\n validateKind,\n validateBulkActionInput,\n validateGenerateUIDInput,\n validateCheckUIDAvailabilityInput,\n};\n"],"names":["PaginationError","ValidationError","errors","TYPES","kindSchema","yup","string","oneOf","nullable","bulkActionInputSchema","object","documentIds","array","of","strapiID","min","required","generateUIDInputSchema","contentTypeUID","field","data","checkUIDAvailabilityInputSchema","value","test","context","options","regex","RegExp","validateUIDField","model","strapi","contentTypes","_","has","get","validateKind","validateYupSchema","validateBulkActionInput","validateGenerateUIDInput","validateCheckUIDAvailabilityInput","body","contentType","attributes","validator"],"mappings":"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"}
@@ -64,12 +64,15 @@ const createLifecyclesService = ({ strapi: strapi1 })=>{
64
64
  const serviceUtils = utils.createServiceUtils({
65
65
  strapi: strapi1
66
66
  });
67
+ const { persistTablesWithPrefix } = strapi1.service('admin::persist-tables');
67
68
  return {
68
69
  async bootstrap () {
69
70
  // Prevent initializing the service twice
70
71
  if (state.isInitialized) {
71
72
  return;
72
73
  }
74
+ // Avoid data loss in case users temporarily don't have a license
75
+ await persistTablesWithPrefix('strapi_history_versions');
73
76
  strapi1.documents.use(async (context, next)=>{
74
77
  const result = await next();
75
78
  if (!shouldCreateHistoryVersion(context)) {