@webiny/api-headless-cms 0.0.0-unstable.8c4d9f045a → 0.0.0-unstable.8feaff8c32

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 (475) hide show
  1. package/constants.d.ts +1 -0
  2. package/constants.js +8 -0
  3. package/constants.js.map +1 -0
  4. package/context.d.ts +5 -2
  5. package/context.js +96 -30
  6. package/context.js.map +1 -1
  7. package/crud/contentEntry/afterDelete.d.ts +2 -2
  8. package/crud/contentEntry/afterDelete.js +2 -7
  9. package/crud/contentEntry/afterDelete.js.map +1 -1
  10. package/crud/contentEntry/beforeCreate.d.ts +2 -2
  11. package/crud/contentEntry/beforeCreate.js +2 -5
  12. package/crud/contentEntry/beforeCreate.js.map +1 -1
  13. package/crud/contentEntry/beforeUpdate.d.ts +2 -2
  14. package/crud/contentEntry/beforeUpdate.js +2 -5
  15. package/crud/contentEntry/beforeUpdate.js.map +1 -1
  16. package/crud/contentEntry/entryDataValidation.js +4 -47
  17. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  18. package/crud/contentEntry/markLockedFields.d.ts +1 -1
  19. package/crud/contentEntry/markLockedFields.js +25 -39
  20. package/crud/contentEntry/markLockedFields.js.map +1 -1
  21. package/crud/contentEntry/referenceFieldsMapping.js +48 -77
  22. package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
  23. package/crud/contentEntry/searchableFields.d.ts +9 -0
  24. package/crud/contentEntry/searchableFields.js +72 -0
  25. package/crud/contentEntry/searchableFields.js.map +1 -0
  26. package/crud/contentEntry.crud.d.ts +12 -7
  27. package/crud/contentEntry.crud.js +1213 -1033
  28. package/crud/contentEntry.crud.js.map +1 -1
  29. package/crud/contentModel/afterCreate.d.ts +3 -3
  30. package/crud/contentModel/afterCreate.js +5 -7
  31. package/crud/contentModel/afterCreate.js.map +1 -1
  32. package/crud/contentModel/afterCreateFrom.d.ts +3 -3
  33. package/crud/contentModel/afterCreateFrom.js +5 -7
  34. package/crud/contentModel/afterCreateFrom.js.map +1 -1
  35. package/crud/contentModel/afterDelete.d.ts +3 -3
  36. package/crud/contentModel/afterDelete.js +5 -7
  37. package/crud/contentModel/afterDelete.js.map +1 -1
  38. package/crud/contentModel/afterUpdate.d.ts +3 -3
  39. package/crud/contentModel/afterUpdate.js +5 -7
  40. package/crud/contentModel/afterUpdate.js.map +1 -1
  41. package/crud/contentModel/beforeCreate.d.ts +5 -6
  42. package/crud/contentModel/beforeCreate.js +53 -119
  43. package/crud/contentModel/beforeCreate.js.map +1 -1
  44. package/crud/contentModel/beforeDelete.d.ts +3 -3
  45. package/crud/contentModel/beforeDelete.js +7 -21
  46. package/crud/contentModel/beforeDelete.js.map +1 -1
  47. package/crud/contentModel/beforeUpdate.d.ts +4 -6
  48. package/crud/contentModel/beforeUpdate.js +38 -15
  49. package/crud/contentModel/beforeUpdate.js.map +1 -1
  50. package/crud/contentModel/compatibility/modelApiName.d.ts +3 -0
  51. package/crud/contentModel/compatibility/modelApiName.js +24 -0
  52. package/crud/contentModel/compatibility/modelApiName.js.map +1 -0
  53. package/crud/contentModel/contentModelManagerFactory.js +0 -7
  54. package/crud/contentModel/contentModelManagerFactory.js.map +1 -1
  55. package/crud/contentModel/createFieldStorageId.js +4 -3
  56. package/crud/contentModel/createFieldStorageId.js.map +1 -1
  57. package/crud/contentModel/defaultFields.d.ts +5 -0
  58. package/crud/contentModel/defaultFields.js +58 -0
  59. package/crud/contentModel/defaultFields.js.map +1 -0
  60. package/crud/contentModel/fields/descriptionField.d.ts +2 -0
  61. package/crud/contentModel/fields/descriptionField.js +42 -0
  62. package/crud/contentModel/fields/descriptionField.js.map +1 -0
  63. package/crud/contentModel/fields/imageField.d.ts +2 -0
  64. package/crud/contentModel/fields/imageField.js +46 -0
  65. package/crud/contentModel/fields/imageField.js.map +1 -0
  66. package/crud/contentModel/fields/titleField.d.ts +2 -0
  67. package/crud/contentModel/fields/titleField.js +58 -0
  68. package/crud/contentModel/fields/titleField.js.map +1 -0
  69. package/crud/contentModel/validate/endingAllowed.d.ts +6 -0
  70. package/crud/contentModel/validate/endingAllowed.js +26 -0
  71. package/crud/contentModel/validate/endingAllowed.js.map +1 -0
  72. package/crud/contentModel/validate/isModelEndingAllowed.d.ts +6 -0
  73. package/crud/contentModel/validate/isModelEndingAllowed.js +24 -0
  74. package/crud/contentModel/validate/isModelEndingAllowed.js.map +1 -0
  75. package/crud/contentModel/validate/modelId.d.ts +11 -0
  76. package/crud/contentModel/validate/modelId.js +36 -0
  77. package/crud/contentModel/validate/modelId.js.map +1 -0
  78. package/crud/contentModel/validate/pluralApiName.d.ts +7 -0
  79. package/crud/contentModel/validate/pluralApiName.js +24 -0
  80. package/crud/contentModel/validate/pluralApiName.js.map +1 -0
  81. package/crud/contentModel/validate/singularApiName.d.ts +7 -0
  82. package/crud/contentModel/validate/singularApiName.js +24 -0
  83. package/crud/contentModel/validate/singularApiName.js.map +1 -0
  84. package/crud/contentModel/validateLayout.js +0 -8
  85. package/crud/contentModel/validateLayout.js.map +1 -1
  86. package/crud/contentModel/validateModel.d.ts +4 -4
  87. package/crud/contentModel/validateModel.js +7 -12
  88. package/crud/contentModel/validateModel.js.map +1 -1
  89. package/crud/contentModel/validateModelFields.d.ts +4 -4
  90. package/crud/contentModel/validateModelFields.js +134 -155
  91. package/crud/contentModel/validateModelFields.js.map +1 -1
  92. package/crud/contentModel/validation.d.ts +591 -0
  93. package/crud/contentModel/validation.js +145 -0
  94. package/crud/contentModel/validation.js.map +1 -0
  95. package/crud/contentModel.crud.d.ts +2 -0
  96. package/crud/contentModel.crud.js +426 -381
  97. package/crud/contentModel.crud.js.map +1 -1
  98. package/crud/contentModelGroup/beforeCreate.d.ts +2 -2
  99. package/crud/contentModelGroup/beforeCreate.js +3 -15
  100. package/crud/contentModelGroup/beforeCreate.js.map +1 -1
  101. package/crud/contentModelGroup/beforeDelete.d.ts +2 -2
  102. package/crud/contentModelGroup/beforeDelete.js +3 -11
  103. package/crud/contentModelGroup/beforeDelete.js.map +1 -1
  104. package/crud/contentModelGroup/beforeUpdate.d.ts +2 -2
  105. package/crud/contentModelGroup/beforeUpdate.js +2 -7
  106. package/crud/contentModelGroup/beforeUpdate.js.map +1 -1
  107. package/crud/contentModelGroup/validation.d.ts +30 -0
  108. package/crud/contentModelGroup/validation.js +34 -0
  109. package/crud/contentModelGroup/validation.js.map +1 -0
  110. package/crud/contentModelGroup.crud.d.ts +2 -0
  111. package/crud/contentModelGroup.crud.js +252 -231
  112. package/crud/contentModelGroup.crud.js.map +1 -1
  113. package/crud/settings.crud.d.ts +3 -1
  114. package/crud/settings.crud.js +10 -36
  115. package/crud/settings.crud.js.map +1 -1
  116. package/crud/system.crud.js +55 -138
  117. package/crud/system.crud.js.map +1 -1
  118. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js +1 -14
  119. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js.map +1 -1
  120. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.d.ts +11 -0
  121. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +203 -0
  122. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -0
  123. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +17 -72
  124. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  125. package/fieldConverters/index.d.ts +2 -1
  126. package/fieldConverters/index.js +2 -5
  127. package/fieldConverters/index.js.map +1 -1
  128. package/graphql/buildSchemaPlugins.d.ts +8 -3
  129. package/graphql/buildSchemaPlugins.js +7 -11
  130. package/graphql/buildSchemaPlugins.js.map +1 -1
  131. package/graphql/checkEndpointAccess.d.ts +2 -0
  132. package/graphql/checkEndpointAccess.js +18 -0
  133. package/graphql/checkEndpointAccess.js.map +1 -0
  134. package/graphql/createExecutableSchema.d.ts +6 -0
  135. package/graphql/createExecutableSchema.js +29 -0
  136. package/graphql/createExecutableSchema.js.map +1 -0
  137. package/graphql/createRequestBody.d.ts +2 -0
  138. package/graphql/createRequestBody.js +14 -0
  139. package/graphql/createRequestBody.js.map +1 -0
  140. package/graphql/formatErrorPayload.d.ts +1 -0
  141. package/graphql/formatErrorPayload.js +25 -0
  142. package/graphql/formatErrorPayload.js.map +1 -0
  143. package/graphql/generateSchema.d.ts +8 -0
  144. package/graphql/generateSchema.js +31 -0
  145. package/graphql/generateSchema.js.map +1 -0
  146. package/graphql/getSchema.d.ts +17 -0
  147. package/graphql/getSchema.js +102 -0
  148. package/graphql/getSchema.js.map +1 -0
  149. package/graphql/graphQLHandlerFactory.js +7 -130
  150. package/graphql/graphQLHandlerFactory.js.map +1 -1
  151. package/graphql/handleRequest.d.ts +11 -0
  152. package/graphql/handleRequest.js +81 -0
  153. package/graphql/handleRequest.js.map +1 -0
  154. package/graphql/index.d.ts +1 -3
  155. package/graphql/index.js +2 -46
  156. package/graphql/index.js.map +1 -1
  157. package/graphql/schema/baseContentSchema.d.ts +6 -2
  158. package/graphql/schema/baseContentSchema.js +15 -29
  159. package/graphql/schema/baseContentSchema.js.map +1 -1
  160. package/graphql/schema/baseSchema.d.ts +3 -0
  161. package/graphql/schema/baseSchema.js +84 -0
  162. package/graphql/schema/baseSchema.js.map +1 -0
  163. package/graphql/schema/contentEntries.d.ts +6 -2
  164. package/graphql/schema/contentEntries.js +127 -111
  165. package/graphql/schema/contentEntries.js.map +1 -1
  166. package/graphql/schema/contentModelGroups.d.ts +6 -2
  167. package/graphql/schema/contentModelGroups.js +16 -29
  168. package/graphql/schema/contentModelGroups.js.map +1 -1
  169. package/graphql/schema/contentModels.d.ts +6 -2
  170. package/graphql/schema/contentModels.js +77 -22
  171. package/graphql/schema/contentModels.js.map +1 -1
  172. package/graphql/schema/createFieldResolvers.d.ts +2 -2
  173. package/graphql/schema/createFieldResolvers.js +25 -44
  174. package/graphql/schema/createFieldResolvers.js.map +1 -1
  175. package/graphql/schema/createFieldTypePluginRecords.d.ts +3 -0
  176. package/graphql/schema/createFieldTypePluginRecords.js +13 -0
  177. package/graphql/schema/createFieldTypePluginRecords.js.map +1 -0
  178. package/graphql/schema/createManageResolvers.d.ts +1 -1
  179. package/graphql/schema/createManageResolvers.js +47 -57
  180. package/graphql/schema/createManageResolvers.js.map +1 -1
  181. package/graphql/schema/createManageSDL.d.ts +3 -0
  182. package/graphql/schema/createManageSDL.js +99 -83
  183. package/graphql/schema/createManageSDL.js.map +1 -1
  184. package/graphql/schema/createPreviewResolvers.js +6 -24
  185. package/graphql/schema/createPreviewResolvers.js.map +1 -1
  186. package/graphql/schema/createReadResolvers.js +11 -24
  187. package/graphql/schema/createReadResolvers.js.map +1 -1
  188. package/graphql/schema/createReadSDL.d.ts +3 -0
  189. package/graphql/schema/createReadSDL.js +48 -46
  190. package/graphql/schema/createReadSDL.js.map +1 -1
  191. package/graphql/schema/resolvers/commonFieldResolvers.d.ts +3 -2
  192. package/graphql/schema/resolvers/commonFieldResolvers.js +2 -3
  193. package/graphql/schema/resolvers/commonFieldResolvers.js.map +1 -1
  194. package/graphql/schema/resolvers/manage/resolveCreate.js +0 -3
  195. package/graphql/schema/resolvers/manage/resolveCreate.js.map +1 -1
  196. package/graphql/schema/resolvers/manage/resolveCreateFrom.js +0 -3
  197. package/graphql/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
  198. package/graphql/schema/resolvers/manage/resolveDelete.d.ts +2 -1
  199. package/graphql/schema/resolvers/manage/resolveDelete.js +13 -9
  200. package/graphql/schema/resolvers/manage/resolveDelete.js.map +1 -1
  201. package/graphql/schema/resolvers/manage/resolveDeleteMultiple.d.ts +7 -0
  202. package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js +20 -0
  203. package/graphql/schema/resolvers/manage/resolveDeleteMultiple.js.map +1 -0
  204. package/graphql/schema/resolvers/manage/resolveGet.js +5 -25
  205. package/graphql/schema/resolvers/manage/resolveGet.js.map +1 -1
  206. package/graphql/schema/resolvers/manage/resolveGetByIds.js +0 -3
  207. package/graphql/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
  208. package/graphql/schema/resolvers/manage/resolveGetRevisions.js +0 -3
  209. package/graphql/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
  210. package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.d.ts +4 -0
  211. package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js +18 -0
  212. package/graphql/schema/resolvers/manage/resolveGetUniqueFieldValues.js.map +1 -0
  213. package/graphql/schema/resolvers/manage/resolveList.js +0 -3
  214. package/graphql/schema/resolvers/manage/resolveList.js.map +1 -1
  215. package/graphql/schema/resolvers/manage/resolveMove.d.ts +8 -0
  216. package/graphql/schema/resolvers/manage/resolveMove.js +30 -0
  217. package/graphql/schema/resolvers/manage/resolveMove.js.map +1 -0
  218. package/graphql/schema/resolvers/manage/resolvePublish.js +0 -3
  219. package/graphql/schema/resolvers/manage/resolvePublish.js.map +1 -1
  220. package/graphql/schema/resolvers/manage/resolveRepublish.js +0 -3
  221. package/graphql/schema/resolvers/manage/resolveRepublish.js.map +1 -1
  222. package/graphql/schema/resolvers/manage/resolveUnpublish.js +0 -3
  223. package/graphql/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
  224. package/graphql/schema/resolvers/manage/resolveUpdate.js +0 -3
  225. package/graphql/schema/resolvers/manage/resolveUpdate.js.map +1 -1
  226. package/graphql/schema/resolvers/preview/resolveGet.js +3 -15
  227. package/graphql/schema/resolvers/preview/resolveGet.js.map +1 -1
  228. package/graphql/schema/resolvers/preview/resolveList.js +0 -3
  229. package/graphql/schema/resolvers/preview/resolveList.js.map +1 -1
  230. package/graphql/schema/resolvers/read/resolveGet.js +3 -15
  231. package/graphql/schema/resolvers/read/resolveGet.js.map +1 -1
  232. package/graphql/schema/resolvers/read/resolveList.js +0 -3
  233. package/graphql/schema/resolvers/read/resolveList.js.map +1 -1
  234. package/graphql/schema/schemaPlugins.d.ts +8 -3
  235. package/graphql/schema/schemaPlugins.js +58 -69
  236. package/graphql/schema/schemaPlugins.js.map +1 -1
  237. package/graphql/system.d.ts +2 -5
  238. package/graphql/system.js +56 -98
  239. package/graphql/system.js.map +1 -1
  240. package/graphqlFields/boolean.js +0 -12
  241. package/graphqlFields/boolean.js.map +1 -1
  242. package/graphqlFields/datetime.js +0 -17
  243. package/graphqlFields/datetime.js.map +1 -1
  244. package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +2 -0
  245. package/graphqlFields/dynamicZone/dynamicZoneField.js +243 -0
  246. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -0
  247. package/graphqlFields/dynamicZone/dynamicZoneStorage.d.ts +3 -0
  248. package/graphqlFields/dynamicZone/dynamicZoneStorage.js +63 -0
  249. package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -0
  250. package/graphqlFields/dynamicZone/index.d.ts +2 -0
  251. package/graphqlFields/dynamicZone/index.js +19 -0
  252. package/graphqlFields/dynamicZone/index.js.map +1 -0
  253. package/graphqlFields/file.js +0 -8
  254. package/graphqlFields/file.js.map +1 -1
  255. package/graphqlFields/helpers.js +0 -10
  256. package/graphqlFields/helpers.js.map +1 -1
  257. package/graphqlFields/index.d.ts +1 -1
  258. package/graphqlFields/index.js +2 -12
  259. package/graphqlFields/index.js.map +1 -1
  260. package/graphqlFields/longText.js +0 -10
  261. package/graphqlFields/longText.js.map +1 -1
  262. package/graphqlFields/number.js +5 -12
  263. package/graphqlFields/number.js.map +1 -1
  264. package/graphqlFields/object.js +132 -99
  265. package/graphqlFields/object.js.map +1 -1
  266. package/graphqlFields/ref.js +90 -114
  267. package/graphqlFields/ref.js.map +1 -1
  268. package/graphqlFields/richText.js +0 -9
  269. package/graphqlFields/richText.js.map +1 -1
  270. package/graphqlFields/text.js +2 -11
  271. package/graphqlFields/text.js.map +1 -1
  272. package/index.d.ts +5 -3
  273. package/index.js +27 -27
  274. package/index.js.map +1 -1
  275. package/modelManager/DefaultCmsModelManager.d.ts +7 -7
  276. package/modelManager/DefaultCmsModelManager.js +1 -17
  277. package/modelManager/DefaultCmsModelManager.js.map +1 -1
  278. package/modelManager/index.js +0 -4
  279. package/modelManager/index.js.map +1 -1
  280. package/package.json +36 -42
  281. package/parameters/context.js +0 -4
  282. package/parameters/context.js.map +1 -1
  283. package/parameters/header.js +4 -15
  284. package/parameters/header.js.map +1 -1
  285. package/parameters/index.js +0 -8
  286. package/parameters/index.js.map +1 -1
  287. package/parameters/manual.js +7 -15
  288. package/parameters/manual.js.map +1 -1
  289. package/parameters/path.js +1 -12
  290. package/parameters/path.js.map +1 -1
  291. package/plugins/CmsGraphQLSchemaPlugin.d.ts +5 -0
  292. package/plugins/CmsGraphQLSchemaPlugin.js +12 -0
  293. package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -0
  294. package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +20 -0
  295. package/plugins/CmsGraphQLSchemaSorterPlugin.js +28 -0
  296. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -0
  297. package/plugins/CmsGroupPlugin.js +1 -9
  298. package/plugins/CmsGroupPlugin.js.map +1 -1
  299. package/plugins/CmsModelFieldConverterPlugin.d.ts +2 -2
  300. package/plugins/CmsModelFieldConverterPlugin.js +1 -6
  301. package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
  302. package/plugins/CmsModelPlugin.d.ts +27 -5
  303. package/plugins/CmsModelPlugin.js +46 -51
  304. package/plugins/CmsModelPlugin.js.map +1 -1
  305. package/plugins/CmsParametersPlugin.js +4 -7
  306. package/plugins/CmsParametersPlugin.js.map +1 -1
  307. package/plugins/StorageOperationsCmsModelPlugin.d.ts +23 -0
  308. package/plugins/StorageOperationsCmsModelPlugin.js +42 -0
  309. package/plugins/StorageOperationsCmsModelPlugin.js.map +1 -0
  310. package/plugins/StorageTransformPlugin.d.ts +11 -11
  311. package/plugins/StorageTransformPlugin.js +1 -10
  312. package/plugins/StorageTransformPlugin.js.map +1 -1
  313. package/plugins/index.d.ts +3 -0
  314. package/plugins/index.js +33 -10
  315. package/plugins/index.js.map +1 -1
  316. package/storage/default.js +0 -3
  317. package/storage/default.js.map +1 -1
  318. package/storage/object.js +7 -27
  319. package/storage/object.js.map +1 -1
  320. package/types.d.ts +712 -251
  321. package/types.js +78 -76
  322. package/types.js.map +1 -1
  323. package/utils/converters/Converter.js +1 -14
  324. package/utils/converters/Converter.js.map +1 -1
  325. package/utils/converters/ConverterCollection.d.ts +7 -0
  326. package/utils/converters/ConverterCollection.js +36 -32
  327. package/utils/converters/ConverterCollection.js.map +1 -1
  328. package/utils/converters/valueKeyStorageConverter.d.ts +1 -5
  329. package/utils/converters/valueKeyStorageConverter.js +32 -51
  330. package/utils/converters/valueKeyStorageConverter.js.map +1 -1
  331. package/utils/createTypeFromFields.d.ts +16 -0
  332. package/utils/createTypeFromFields.js +66 -0
  333. package/utils/createTypeFromFields.js.map +1 -0
  334. package/utils/createTypeName.d.ts +0 -2
  335. package/utils/createTypeName.js +5 -20
  336. package/utils/createTypeName.js.map +1 -1
  337. package/utils/entryStorage.js +25 -42
  338. package/utils/entryStorage.js.map +1 -1
  339. package/utils/filterAsync.js +0 -5
  340. package/utils/filterAsync.js.map +1 -1
  341. package/utils/getBaseFieldType.d.ts +2 -0
  342. package/utils/getBaseFieldType.js +10 -0
  343. package/utils/getBaseFieldType.js.map +1 -0
  344. package/utils/getEntryDescription.d.ts +2 -0
  345. package/utils/getEntryDescription.js +17 -0
  346. package/utils/getEntryDescription.js.map +1 -0
  347. package/utils/getEntryImage.d.ts +2 -0
  348. package/utils/getEntryImage.js +17 -0
  349. package/utils/getEntryImage.js.map +1 -0
  350. package/utils/getEntryTitle.d.ts +1 -1
  351. package/utils/getEntryTitle.js +0 -9
  352. package/utils/getEntryTitle.js.map +1 -1
  353. package/utils/getSchemaFromFieldPlugins.d.ts +4 -7
  354. package/utils/getSchemaFromFieldPlugins.js +23 -19
  355. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  356. package/utils/incrementEntryIdVersion.d.ts +5 -0
  357. package/utils/incrementEntryIdVersion.js +29 -0
  358. package/utils/incrementEntryIdVersion.js.map +1 -0
  359. package/utils/permissions/EntriesPermissions.d.ts +4 -0
  360. package/utils/permissions/EntriesPermissions.js +9 -0
  361. package/utils/permissions/EntriesPermissions.js.map +1 -0
  362. package/utils/permissions/ModelGroupsPermissions.d.ts +11 -0
  363. package/utils/permissions/ModelGroupsPermissions.js +48 -0
  364. package/utils/permissions/ModelGroupsPermissions.js.map +1 -0
  365. package/utils/permissions/ModelsPermissions.d.ts +20 -0
  366. package/utils/permissions/ModelsPermissions.js +91 -0
  367. package/utils/permissions/ModelsPermissions.js.map +1 -0
  368. package/utils/permissions/SettingsPermissions.d.ts +4 -0
  369. package/utils/permissions/SettingsPermissions.js +9 -0
  370. package/utils/permissions/SettingsPermissions.js.map +1 -0
  371. package/utils/renderFields.d.ts +4 -2
  372. package/utils/renderFields.js +12 -11
  373. package/utils/renderFields.js.map +1 -1
  374. package/utils/renderGetFilterFields.d.ts +2 -2
  375. package/utils/renderGetFilterFields.js +9 -30
  376. package/utils/renderGetFilterFields.js.map +1 -1
  377. package/utils/renderInputFields.d.ts +4 -2
  378. package/utils/renderInputFields.js +19 -14
  379. package/utils/renderInputFields.js.map +1 -1
  380. package/utils/renderListFilterFields.d.ts +3 -1
  381. package/utils/renderListFilterFields.js +24 -28
  382. package/utils/renderListFilterFields.js.map +1 -1
  383. package/utils/renderSortEnum.d.ts +9 -5
  384. package/utils/renderSortEnum.js +26 -12
  385. package/utils/renderSortEnum.js.map +1 -1
  386. package/utils/toSlug.js +1 -5
  387. package/utils/toSlug.js.map +1 -1
  388. package/validators/dateGte.js +0 -7
  389. package/validators/dateGte.js.map +1 -1
  390. package/validators/dateLte.js +0 -7
  391. package/validators/dateLte.js.map +1 -1
  392. package/validators/dynamicZone.d.ts +2 -0
  393. package/validators/dynamicZone.js +20 -0
  394. package/validators/dynamicZone.js.map +1 -0
  395. package/validators/gte.js +0 -8
  396. package/validators/gte.js.map +1 -1
  397. package/validators/in.js +0 -8
  398. package/validators/in.js.map +1 -1
  399. package/validators/index.js +2 -16
  400. package/validators/index.js.map +1 -1
  401. package/validators/lte.js +0 -8
  402. package/validators/lte.js.map +1 -1
  403. package/validators/maxLength.js +0 -8
  404. package/validators/maxLength.js.map +1 -1
  405. package/validators/minLength.js +0 -8
  406. package/validators/minLength.js.map +1 -1
  407. package/validators/pattern.js +0 -9
  408. package/validators/pattern.js.map +1 -1
  409. package/validators/patternPlugins/email.js +0 -2
  410. package/validators/patternPlugins/email.js.map +1 -1
  411. package/validators/patternPlugins/index.js +0 -8
  412. package/validators/patternPlugins/index.js.map +1 -1
  413. package/validators/patternPlugins/lowerCase.js +0 -2
  414. package/validators/patternPlugins/lowerCase.js.map +1 -1
  415. package/validators/patternPlugins/lowerCaseSpace.js +0 -2
  416. package/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
  417. package/validators/patternPlugins/upperCase.js +0 -2
  418. package/validators/patternPlugins/upperCase.js.map +1 -1
  419. package/validators/patternPlugins/upperCaseSpace.js +0 -2
  420. package/validators/patternPlugins/upperCaseSpace.js.map +1 -1
  421. package/validators/patternPlugins/url.js +0 -2
  422. package/validators/patternPlugins/url.js.map +1 -1
  423. package/validators/required.js +0 -5
  424. package/validators/required.js.map +1 -1
  425. package/validators/timeGte.js +0 -8
  426. package/validators/timeGte.js.map +1 -1
  427. package/validators/timeLte.js +0 -8
  428. package/validators/timeLte.js.map +1 -1
  429. package/validators/unique.js +1 -8
  430. package/validators/unique.js.map +1 -1
  431. package/crud/contentModel/createFieldModels.d.ts +0 -2
  432. package/crud/contentModel/createFieldModels.js +0 -26
  433. package/crud/contentModel/createFieldModels.js.map +0 -1
  434. package/crud/contentModel/fieldIdValidation.d.ts +0 -1
  435. package/crud/contentModel/fieldIdValidation.js +0 -25
  436. package/crud/contentModel/fieldIdValidation.js.map +0 -1
  437. package/crud/contentModel/idValidation.d.ts +0 -1
  438. package/crud/contentModel/idValidation.js +0 -22
  439. package/crud/contentModel/idValidation.js.map +0 -1
  440. package/crud/contentModel/models.d.ts +0 -4
  441. package/crud/contentModel/models.js +0 -180
  442. package/crud/contentModel/models.js.map +0 -1
  443. package/crud/contentModel/systemFields.d.ts +0 -1
  444. package/crud/contentModel/systemFields.js +0 -8
  445. package/crud/contentModel/systemFields.js.map +0 -1
  446. package/crud/index.d.ts +0 -6
  447. package/crud/index.js +0 -89
  448. package/crud/index.js.map +0 -1
  449. package/graphql/schema/resolvers/manage/resolveRequestChanges.d.ts +0 -7
  450. package/graphql/schema/resolvers/manage/resolveRequestChanges.js +0 -21
  451. package/graphql/schema/resolvers/manage/resolveRequestChanges.js.map +0 -1
  452. package/graphql/schema/resolvers/manage/resolveRequestReview.d.ts +0 -7
  453. package/graphql/schema/resolvers/manage/resolveRequestReview.js +0 -21
  454. package/graphql/schema/resolvers/manage/resolveRequestReview.js.map +0 -1
  455. package/upgrades/5.33.0/index.d.ts +0 -3
  456. package/upgrades/5.33.0/index.js +0 -186
  457. package/upgrades/5.33.0/index.js.map +0 -1
  458. package/upgrades/index.d.ts +0 -1
  459. package/upgrades/index.js +0 -12
  460. package/upgrades/index.js.map +0 -1
  461. package/utils/access.d.ts +0 -8
  462. package/utils/access.js +0 -90
  463. package/utils/access.js.map +0 -1
  464. package/utils/filterModelFields.d.ts +0 -16
  465. package/utils/filterModelFields.js +0 -81
  466. package/utils/filterModelFields.js.map +0 -1
  467. package/utils/ownership.d.ts +0 -8
  468. package/utils/ownership.js +0 -41
  469. package/utils/ownership.js.map +0 -1
  470. package/utils/permissions.d.ts +0 -7
  471. package/utils/permissions.js +0 -110
  472. package/utils/permissions.js.map +0 -1
  473. package/utils/pluralizedTypeName.d.ts +0 -1
  474. package/utils/pluralizedTypeName.js +0 -26
  475. package/utils/pluralizedTypeName.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["validateModel","params","model","plugins","modelPlugin","byType","CmsModelPlugin","type","find","item","contentModel","modelId","WebinyError","validateModelFields"],"sources":["validateModel.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\nimport { CmsModel } from \"~/types\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { validateModelFields } from \"~/crud/contentModel/validateModelFields\";\n\ninterface ValidateModelParams {\n model: CmsModel;\n original?: CmsModel;\n plugins: PluginsContainer;\n}\n\nexport const validateModel = (params: ValidateModelParams) => {\n const { model, plugins } = params;\n\n const modelPlugin = plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n .find(item => item.contentModel.modelId === model.modelId);\n\n if (modelPlugin) {\n throw new WebinyError(\n \"Content models defined via plugins cannot be updated.\",\n \"CONTENT_MODEL_UPDATE_ERROR\",\n {\n modelId: model.modelId\n }\n );\n }\n\n validateModelFields(params);\n};\n"],"mappings":";;;;;;;;;AAAA;;AACA;;AAGA;;AAQO,MAAMA,aAAa,GAAIC,MAAD,IAAiC;EAC1D,MAAM;IAAEC,KAAF;IAASC;EAAT,IAAqBF,MAA3B;EAEA,MAAMG,WAAW,GAAGD,OAAO,CACtBE,MADe,CACQC,8BAAA,CAAeC,IADvB,EAEfC,IAFe,CAEVC,IAAI,IAAIA,IAAI,CAACC,YAAL,CAAkBC,OAAlB,KAA8BT,KAAK,CAACS,OAFlC,CAApB;;EAIA,IAAIP,WAAJ,EAAiB;IACb,MAAM,IAAIQ,cAAJ,CACF,uDADE,EAEF,4BAFE,EAGF;MACID,OAAO,EAAET,KAAK,CAACS;IADnB,CAHE,CAAN;EAOH;;EAED,IAAAE,wCAAA,EAAoBZ,MAApB;AACH,CAlBM"}
1
+ {"version":3,"names":["_error","_interopRequireDefault","require","_CmsModelPlugin","_validateModelFields","validateModel","params","model","context","plugins","modelPlugin","byType","CmsModelPlugin","type","find","item","contentModel","modelId","WebinyError","validateModelFields","exports"],"sources":["validateModel.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\nimport { CmsContext, CmsModel } from \"~/types\";\nimport { validateModelFields } from \"~/crud/contentModel/validateModelFields\";\n\ninterface ValidateModelParams {\n models: CmsModel[];\n model: CmsModel;\n original?: CmsModel;\n context: CmsContext;\n}\n\nexport const validateModel = async (params: ValidateModelParams): Promise<void> => {\n const { model, context } = params;\n\n const { plugins } = context;\n\n const modelPlugin = plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n .find(item => item.contentModel.modelId === model.modelId);\n\n if (modelPlugin) {\n throw new WebinyError(\n \"Content models defined via plugins cannot be updated.\",\n \"CONTENT_MODEL_UPDATE_ERROR\",\n {\n modelId: model.modelId\n }\n );\n }\n\n await validateModelFields(params);\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAEA,IAAAE,oBAAA,GAAAF,OAAA;AASO,MAAMG,aAAa,GAAG,MAAOC,MAA2B,IAAoB;EAC/E,MAAM;IAAEC,KAAK;IAAEC;EAAQ,CAAC,GAAGF,MAAM;EAEjC,MAAM;IAAEG;EAAQ,CAAC,GAAGD,OAAO;EAE3B,MAAME,WAAW,GAAGD,OAAO,CACtBE,MAAM,CAAiBC,8BAAc,CAACC,IAAI,CAAC,CAC3CC,IAAI,CAACC,IAAI,IAAIA,IAAI,CAACC,YAAY,CAACC,OAAO,KAAKV,KAAK,CAACU,OAAO,CAAC;EAE9D,IAAIP,WAAW,EAAE;IACb,MAAM,IAAIQ,cAAW,CACjB,uDAAuD,EACvD,4BAA4B,EAC5B;MACID,OAAO,EAAEV,KAAK,CAACU;IACnB,CACJ,CAAC;EACL;EAEA,MAAM,IAAAE,wCAAmB,EAACb,MAAM,CAAC;AACrC,CAAC;AAACc,OAAA,CAAAf,aAAA,GAAAA,aAAA"}
@@ -1,9 +1,9 @@
1
- import { CmsModel } from "../../types";
2
- import { PluginsContainer } from "@webiny/plugins";
1
+ import { CmsModel, CmsContext } from "../../types";
3
2
  interface ValidateModelFieldsParams {
3
+ models: CmsModel[];
4
4
  model: CmsModel;
5
5
  original?: CmsModel;
6
- plugins: PluginsContainer;
6
+ context: CmsContext;
7
7
  }
8
- export declare const validateModelFields: (params: ValidateModelFieldsParams) => void;
8
+ export declare const validateModelFields: (params: ValidateModelFieldsParams) => Promise<void>;
9
9
  export {};
@@ -1,92 +1,30 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.validateModelFields = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
12
10
  var _error = _interopRequireDefault(require("@webiny/error"));
13
-
14
11
  var _createManageSDL = require("../../graphql/schema/createManageSDL");
15
-
16
- var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
17
-
18
12
  var _createFieldStorageId = require("./createFieldStorageId");
19
-
20
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
-
22
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
23
-
24
- const defaultTitleFieldId = "id";
25
- const allowedTitleFieldTypes = ["text", "number"];
26
-
27
- const getContentModelTitleFieldId = (fields, titleFieldId) => {
28
- /**
29
- * If there are no fields defined, we will return the default field
30
- */
31
- if (fields.length === 0) {
32
- return defaultTitleFieldId;
33
- }
34
- /**
35
- * if there is no title field defined either in input data or existing content model data
36
- * we will take first text field that has no multiple values enabled
37
- * or if initial titleFieldId is the default one also try to find first available text field
38
- */
39
-
40
-
41
- if (!titleFieldId || titleFieldId === defaultTitleFieldId) {
42
- const titleField = fields.find(field => {
43
- return field.type === "text" && !field.multipleValues;
44
- });
45
- return (titleField === null || titleField === void 0 ? void 0 : titleField.fieldId) || defaultTitleFieldId;
46
- }
47
- /**
48
- * check existing titleFieldId for existence in the model
49
- * for correct type
50
- * and that it is not multiple values field
51
- */
52
-
53
-
54
- const target = fields.find(f => f.fieldId === titleFieldId);
55
-
56
- if (!target) {
57
- throw new _error.default(`Field selected for the title field does not exist in the model.`, "VALIDATION_ERROR", {
58
- fieldId: titleFieldId,
59
- fields
60
- });
61
- }
62
-
63
- if (allowedTitleFieldTypes.includes(target.type) === false) {
64
- throw new _error.default(`Only ${allowedTitleFieldTypes.join(", ")} and id fields can be used as an entry title.`, "ENTRY_TITLE_FIELD_TYPE", {
65
- storageId: target.storageId,
66
- fieldId: target.fieldId,
67
- type: target.type
68
- });
69
- }
70
-
71
- if (target.multipleValues) {
72
- throw new _error.default(`Fields that accept multiple values cannot be used as the entry title.`, "ENTRY_TITLE_FIELD_TYPE", {
73
- storageId: target.storageId,
74
- fieldId: target.fieldId,
75
- type: target.type
76
- });
77
- }
78
-
79
- return target.fieldId;
80
- };
81
-
13
+ var _getBaseFieldType = require("../../utils/getBaseFieldType");
14
+ var _titleField = require("./fields/titleField");
15
+ var _descriptionField = require("./fields/descriptionField");
16
+ var _imageField = require("./fields/imageField");
17
+ var _plugins = require("../../plugins");
18
+ var _buildSchemaPlugins = require("../../graphql/buildSchemaPlugins");
19
+ var _createExecutableSchema = require("../../graphql/createExecutableSchema");
20
+ var _utils = require("@webiny/utils");
82
21
  const extractInvalidField = (model, err) => {
83
22
  var _err$source;
84
-
85
23
  const sdl = ((_err$source = err.source) === null || _err$source === void 0 ? void 0 : _err$source.body) || "";
24
+
86
25
  /**
87
26
  * Find the invalid type
88
27
  */
89
-
90
28
  const {
91
29
  line: lineNumber
92
30
  } = err.locations ? err.locations[0] : {
@@ -95,33 +33,25 @@ const extractInvalidField = (model, err) => {
95
33
  const sdlLines = sdl.split("\n");
96
34
  let sdlLine;
97
35
  let gqlType;
98
-
99
36
  for (let i = lineNumber; i > 0; i--) {
100
37
  if (sdlLine && sdlLine.includes("type ")) {
101
38
  gqlType = sdlLine.match(/type\s+(.*?)\s+{/);
102
39
  break;
103
40
  }
104
-
105
41
  sdlLine = sdlLines[i];
106
42
  }
107
-
108
43
  let invalidField = undefined;
109
-
110
44
  if (Array.isArray(gqlType)) {
111
45
  const fieldRegex = new RegExp(`([^\\s+].*?):\\s+\\[?${gqlType[1]}!?\\]?`);
112
46
  const matched = sdl.match(fieldRegex);
113
-
114
47
  if (matched) {
115
48
  invalidField = matched[1];
116
49
  }
117
50
  }
118
-
119
51
  let message = `See more details in the browser console.`;
120
-
121
52
  if (invalidField) {
122
53
  message = `Please review the definition of "${invalidField}" field.`;
123
54
  }
124
-
125
55
  return {
126
56
  data: {
127
57
  modelId: model.modelId,
@@ -132,7 +62,22 @@ const extractInvalidField = (model, err) => {
132
62
  message: [`Model "${model.modelId}" was not saved!`, message].join("\n")
133
63
  };
134
64
  };
135
-
65
+ const createValidateChildFields = plugins => {
66
+ return ({
67
+ fields,
68
+ originalFields
69
+ }) => {
70
+ if (fields.length === 0 && originalFields.length === 0) {
71
+ return;
72
+ }
73
+ validateFields({
74
+ fields,
75
+ originalFields,
76
+ plugins,
77
+ lockedFields: []
78
+ });
79
+ };
80
+ };
136
81
  const validateFields = params => {
137
82
  const {
138
83
  plugins,
@@ -140,23 +85,27 @@ const validateFields = params => {
140
85
  originalFields,
141
86
  lockedFields
142
87
  } = params;
88
+ const idList = [];
143
89
  const fieldIdList = [];
144
90
  const storageIdList = [];
145
-
146
91
  for (const field of fields) {
147
- var _field$settings, _originalField$settin;
148
-
149
- const plugin = plugins.find(item => item.fieldType === field.type);
150
-
92
+ const baseType = (0, _getBaseFieldType.getBaseFieldType)(field);
93
+ const plugin = plugins.find(plugin => plugin.fieldType === baseType);
151
94
  if (!plugin) {
152
- throw new Error(`Cannot update content model because of the unknown "${field.type}" field.`);
95
+ throw new Error(`Cannot update content model because of the unknown "${baseType}" field.`);
153
96
  }
154
-
97
+ /**
98
+ * Check the field's id against existing ones.
99
+ * There cannot be two fields with the same id.
100
+ */
101
+ if (idList.includes(field.id)) {
102
+ throw new _error.default(`Cannot update content model because field "${field.storageId || field.fieldId}" has id "${field.id}", which is already used.`);
103
+ }
104
+ idList.push(field.id);
155
105
  const originalField = originalFields.find(f => f.id === field.id);
156
106
  /**
157
107
  * Field MUST have an fieldId defined.
158
108
  */
159
-
160
109
  if (!field.fieldId) {
161
110
  throw new _error.default(`Field does not have an "fieldId" defined.`, "MISSING_FIELD_ID", {
162
111
  field
@@ -175,12 +124,9 @@ const validateFields = params => {
175
124
  * https://discuss.elastic.co/t/special-characters-in-field-names/10658/3
176
125
  * https://discuss.elastic.co/t/illegal-characters-in-elasticsearch-field-names/17196/2
177
126
  */
178
-
179
-
180
127
  const isLocked = lockedFields.some(lockedField => {
181
- return lockedField.fieldId === field.storageId;
128
+ return lockedField.fieldId === field.storageId || lockedField.fieldId === field.fieldId;
182
129
  });
183
-
184
130
  if (!field.storageId) {
185
131
  /**
186
132
  * In case field is locked, we must set the storageId to the fieldId value.
@@ -209,75 +155,97 @@ const validateFields = params => {
209
155
  * Check the field's fieldId against existing ones.
210
156
  * There cannot be two fields with the same fieldId - outside world identifier.
211
157
  */
212
-
213
-
214
158
  if (fieldIdList.includes(field.fieldId)) {
215
159
  throw new _error.default(`Cannot update content model because field "${field.storageId}" has fieldId "${field.fieldId}", which is already used.`);
216
160
  }
217
-
218
161
  fieldIdList.push(field.fieldId);
219
162
  /**
220
163
  * Check the field's storageId against the existing ones.
221
164
  * There cannot be two fields with the same storageId.
222
165
  */
223
-
224
166
  if (storageIdList.includes(field.storageId)) {
225
167
  throw new _error.default(`Cannot update content model because field "${field.label}" has storageId "${field.storageId}", which is already used.`);
226
168
  }
227
-
228
169
  storageIdList.push(field.storageId);
229
170
  /**
230
- * TODO maybe make this part pluginable?
231
- * We need to check the object field child fields.
232
- * It must be recursive.
233
- */
234
-
235
- if (field.type !== "object") {
236
- continue;
237
- }
238
-
239
- const childFields = ((_field$settings = field.settings) === null || _field$settings === void 0 ? void 0 : _field$settings.fields) || [];
240
- const originalChildFields = (originalField === null || originalField === void 0 ? void 0 : (_originalField$settin = originalField.settings) === null || _originalField$settin === void 0 ? void 0 : _originalField$settin.fields) || [];
241
- /**
242
- * No point in going further if there are no child fields.
243
- * Code will break if child fields were removed but used in the entries.
171
+ * There might be some plugins which allow child fields.
172
+ * We use this method to validate them as well.
244
173
  */
245
-
246
- if (childFields.length === 0) {
174
+ if (!plugin.validateChildFields) {
247
175
  continue;
248
176
  }
249
-
250
- validateFields({
251
- fields: childFields,
252
- originalFields: originalChildFields,
253
- plugins,
254
- lockedFields: []
177
+ const validateChildFields = createValidateChildFields(plugins);
178
+ plugin.validateChildFields({
179
+ field,
180
+ originalField,
181
+ validate: validateChildFields
255
182
  });
256
183
  }
257
184
  };
258
-
259
- const validateModelFields = params => {
185
+ const createGraphQLSchema = async params => {
186
+ const {
187
+ context,
188
+ model
189
+ } = params;
190
+ const models = await context.security.withoutAuthorization(async () => {
191
+ return (await context.cms.listModels()).filter(model => {
192
+ return model.isPrivate !== true;
193
+ });
194
+ });
195
+ const modelPlugins = await (0, _buildSchemaPlugins.buildSchemaPlugins)({
196
+ context,
197
+ models: models.concat([model])
198
+ });
199
+ const plugins = context.plugins.byType(_plugins.CmsGraphQLSchemaPlugin.type).reduce((collection, plugin) => {
200
+ const name = plugin.name || `${_plugins.CmsGraphQLSchemaPlugin.type}-${(0, _utils.generateAlphaNumericId)(16)}`;
201
+ collection[name] = plugin;
202
+ return collection;
203
+ }, {});
204
+ for (const plugin of modelPlugins) {
205
+ const name = plugin.name || `${plugin.type}-${(0, _utils.generateAlphaNumericId)(16)}`;
206
+ plugins[name] = plugin;
207
+ }
208
+ return (0, _createExecutableSchema.createExecutableSchema)({
209
+ plugins: Object.values(plugins)
210
+ });
211
+ };
212
+ const extractErrorObject = error => {
213
+ return ["message", "code", "data", "stack"].reduce((output, key) => {
214
+ if (!error[key]) {
215
+ return output;
216
+ }
217
+ output[key] = error[key];
218
+ return output;
219
+ }, {});
220
+ };
221
+ const validateModelFields = async params => {
260
222
  const {
223
+ models,
261
224
  model,
262
225
  original,
263
- plugins
226
+ context
264
227
  } = params;
265
228
  const {
266
- titleFieldId
229
+ titleFieldId,
230
+ descriptionFieldId,
231
+ imageFieldId
267
232
  } = model;
233
+ const {
234
+ plugins
235
+ } = context;
236
+
268
237
  /**
269
238
  * There should be fields/locked fields in either model or data to be updated.
270
239
  */
271
-
272
240
  const {
273
241
  fields = [],
274
242
  lockedFields = []
275
243
  } = model;
244
+
276
245
  /**
277
246
  * Let's inspect the fields of the received content model. We prevent saving of a content model if it
278
247
  * contains a field for which a "cms-model-field-to-graphql" plugin does not exist on the backend.
279
248
  */
280
-
281
249
  const fieldTypePlugins = plugins.byType("cms-model-field-to-graphql");
282
250
  validateFields({
283
251
  fields,
@@ -285,73 +253,85 @@ const validateModelFields = params => {
285
253
  lockedFields,
286
254
  plugins: fieldTypePlugins
287
255
  });
288
-
289
256
  if (fields.length) {
257
+ const sorterPlugins = plugins.byType(_plugins.CmsGraphQLSchemaSorterPlugin.type);
290
258
  /**
291
259
  * Make sure that this model can be safely converted to a GraphQL SDL
292
260
  */
293
261
  const schema = (0, _createManageSDL.createManageSDL)({
262
+ models,
294
263
  model,
295
- fieldTypePlugins: fieldTypePlugins.reduce((acc, pl) => _objectSpread(_objectSpread({}, acc), {}, {
264
+ fieldTypePlugins: fieldTypePlugins.reduce((acc, pl) => (0, _objectSpread2.default)((0, _objectSpread2.default)({}, acc), {}, {
296
265
  [pl.fieldType]: pl
297
- }), {})
266
+ }), {}),
267
+ sorterPlugins
298
268
  });
299
-
300
269
  try {
301
270
  (0, _graphqlTag.default)(schema);
302
271
  } catch (err) {
303
272
  throw new _error.default(extractInvalidField(model, err));
304
273
  }
274
+ /**
275
+ *
276
+ */
277
+ try {
278
+ await createGraphQLSchema({
279
+ context,
280
+ model
281
+ });
282
+ } catch (err) {
283
+ throw new _error.default({
284
+ message: "Cannot generate GraphQL schema when testing with the given model. Please check the response for more details.",
285
+ code: "GRAPHQL_SCHEMA_ERROR",
286
+ data: {
287
+ modelId: model.modelId,
288
+ error: extractErrorObject(err)
289
+ }
290
+ });
291
+ }
305
292
  }
306
-
307
- model.titleFieldId = getContentModelTitleFieldId(fields, titleFieldId);
293
+ model.titleFieldId = (0, _titleField.getContentModelTitleFieldId)(fields, titleFieldId);
294
+ model.descriptionFieldId = (0, _descriptionField.getContentModelDescriptionFieldId)(fields, descriptionFieldId);
295
+ model.imageFieldId = (0, _imageField.getContentModelImageFieldId)(fields, imageFieldId);
308
296
  const cmsLockedFieldPlugins = plugins.byType("cms-model-locked-field");
297
+
309
298
  /**
310
299
  * We must not allow removal or changes in fields that are already in use in content entries.
311
300
  * Locked fields still have fieldId (should be storageId) because of the old existing locked fields in the models.
312
301
  */
313
-
314
302
  for (const lockedField of lockedFields) {
315
303
  const existingField = fields.find(item => item.storageId === lockedField.fieldId);
304
+
316
305
  /**
317
306
  * Starting with 5.33.0 fields can be deleted.
318
307
  * Our UI gives a warning upon locked field deletion, but if user is managing fields through API directly - we cannot do anything.
319
308
  */
320
-
321
309
  if (!existingField) {
322
- continue; // throw new WebinyError(
323
- // `Cannot remove the field "${lockedField.fieldId}" because it's already in use in created content.`,
324
- // "ENTRY_FIELD_USED",
325
- // {
326
- // lockedField,
327
- // fields
328
- // }
329
- // );
310
+ continue;
330
311
  }
331
-
332
- if (lockedField.multipleValues !== existingField.multipleValues) {
312
+ if (Boolean(lockedField.multipleValues) !== Boolean(existingField.multipleValues)) {
333
313
  throw new _error.default(`Cannot change "multipleValues" for the "${lockedField.fieldId}" field because it's already in use in created content.`, "ENTRY_FIELD_USED", {
314
+ reason: `"multipleValues" changed`,
334
315
  field: existingField
335
316
  });
336
317
  }
337
-
338
- if (lockedField.type !== existingField.type) {
318
+ const fieldType = (0, _getBaseFieldType.getBaseFieldType)(existingField);
319
+ if (lockedField.type !== fieldType) {
339
320
  throw new _error.default(`Cannot change field type for the "${lockedField.fieldId}" field because it's already in use in created content.`, "ENTRY_FIELD_USED", {
340
- field: existingField
321
+ reason: `"type" changed`,
322
+ lockedFieldType: lockedField.type,
323
+ existingFieldType: fieldType
341
324
  });
342
325
  }
326
+
343
327
  /**
344
328
  * Check `lockedField` invariant for specific field
345
329
  */
346
-
347
-
348
- const lockedFieldsByType = cmsLockedFieldPlugins.filter(pl => pl.fieldType === lockedField.type);
349
-
330
+ const lockedFieldsByType = cmsLockedFieldPlugins.filter(pl => pl.fieldType === (0, _getBaseFieldType.getBaseFieldType)(lockedField));
350
331
  for (const plugin of lockedFieldsByType) {
351
332
  if (typeof plugin.checkLockedField !== "function") {
352
333
  continue;
353
334
  }
354
-
355
335
  plugin.checkLockedField({
356
336
  lockedField,
357
337
  field: existingField
@@ -359,5 +339,4 @@ const validateModelFields = params => {
359
339
  }
360
340
  }
361
341
  };
362
-
363
342
  exports.validateModelFields = validateModelFields;
@@ -1 +1 @@
1
- {"version":3,"names":["defaultTitleFieldId","allowedTitleFieldTypes","getContentModelTitleFieldId","fields","titleFieldId","length","titleField","find","field","type","multipleValues","fieldId","target","f","WebinyError","includes","join","storageId","extractInvalidField","model","err","sdl","source","body","line","lineNumber","locations","sdlLines","split","sdlLine","gqlType","i","match","invalidField","undefined","Array","isArray","fieldRegex","RegExp","matched","message","data","modelId","code","validateFields","params","plugins","originalFields","lockedFields","fieldIdList","storageIdList","plugin","item","fieldType","Error","originalField","id","isLocked","some","lockedField","createFieldStorageId","push","label","childFields","settings","originalChildFields","validateModelFields","original","fieldTypePlugins","byType","schema","createManageSDL","reduce","acc","pl","gql","cmsLockedFieldPlugins","existingField","lockedFieldsByType","filter","checkLockedField"],"sources":["validateModelFields.ts"],"sourcesContent":["import {\n CmsModel,\n CmsModelField,\n CmsModelFieldToGraphQLPlugin,\n CmsModelLockedFieldPlugin,\n LockedField\n} from \"~/types\";\nimport WebinyError from \"@webiny/error\";\nimport { createManageSDL } from \"~/graphql/schema/createManageSDL\";\nimport gql from \"graphql-tag\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { createFieldStorageId } from \"./createFieldStorageId\";\nimport { GraphQLError } from \"graphql\";\n\nconst defaultTitleFieldId = \"id\";\n\nconst allowedTitleFieldTypes = [\"text\", \"number\"];\n\nconst getContentModelTitleFieldId = (fields: CmsModelField[], titleFieldId?: string): string => {\n /**\n * If there are no fields defined, we will return the default field\n */\n if (fields.length === 0) {\n return defaultTitleFieldId;\n }\n /**\n * if there is no title field defined either in input data or existing content model data\n * we will take first text field that has no multiple values enabled\n * or if initial titleFieldId is the default one also try to find first available text field\n */\n if (!titleFieldId || titleFieldId === defaultTitleFieldId) {\n const titleField = fields.find(field => {\n return field.type === \"text\" && !field.multipleValues;\n });\n return titleField?.fieldId || defaultTitleFieldId;\n }\n /**\n * check existing titleFieldId for existence in the model\n * for correct type\n * and that it is not multiple values field\n */\n const target = fields.find(f => f.fieldId === titleFieldId);\n if (!target) {\n throw new WebinyError(\n `Field selected for the title field does not exist in the model.`,\n \"VALIDATION_ERROR\",\n {\n fieldId: titleFieldId,\n fields\n }\n );\n }\n\n if (allowedTitleFieldTypes.includes(target.type) === false) {\n throw new WebinyError(\n `Only ${allowedTitleFieldTypes.join(\n \", \"\n )} and id fields can be used as an entry title.`,\n \"ENTRY_TITLE_FIELD_TYPE\",\n {\n storageId: target.storageId,\n fieldId: target.fieldId,\n type: target.type\n }\n );\n }\n\n if (target.multipleValues) {\n throw new WebinyError(\n `Fields that accept multiple values cannot be used as the entry title.`,\n \"ENTRY_TITLE_FIELD_TYPE\",\n {\n storageId: target.storageId,\n fieldId: target.fieldId,\n type: target.type\n }\n );\n }\n\n return target.fieldId;\n};\n\nconst extractInvalidField = (model: CmsModel, err: GraphQLError) => {\n const sdl = err.source?.body || \"\";\n\n /**\n * Find the invalid type\n */\n const { line: lineNumber } = err.locations\n ? err.locations[0]\n : {\n line: 0\n };\n const sdlLines = sdl.split(\"\\n\");\n let sdlLine;\n let gqlType;\n for (let i = lineNumber; i > 0; i--) {\n if (sdlLine && sdlLine.includes(\"type \")) {\n gqlType = sdlLine.match(/type\\s+(.*?)\\s+{/);\n break;\n }\n\n sdlLine = sdlLines[i];\n }\n\n let invalidField: string | undefined = undefined;\n if (Array.isArray(gqlType)) {\n const fieldRegex = new RegExp(`([^\\\\s+].*?):\\\\s+\\\\[?${gqlType[1]}!?\\\\]?`);\n\n const matched = sdl.match(fieldRegex);\n if (matched) {\n invalidField = matched[1];\n }\n }\n\n let message = `See more details in the browser console.`;\n if (invalidField) {\n message = `Please review the definition of \"${invalidField}\" field.`;\n }\n\n return {\n data: {\n modelId: model.modelId,\n sdl,\n invalidField\n },\n code: \"INVALID_MODEL_DEFINITION\",\n message: [`Model \"${model.modelId}\" was not saved!`, message].join(\"\\n\")\n };\n};\n\ninterface ValidateFieldsParams {\n plugins: CmsModelFieldToGraphQLPlugin[];\n fields: CmsModelField[];\n originalFields: CmsModelField[];\n lockedFields: LockedField[];\n}\nconst validateFields = (params: ValidateFieldsParams) => {\n const { plugins, fields, originalFields, lockedFields } = params;\n\n const fieldIdList: string[] = [];\n\n const storageIdList: string[] = [];\n\n for (const field of fields) {\n const plugin = plugins.find(item => item.fieldType === field.type);\n if (!plugin) {\n throw new Error(\n `Cannot update content model because of the unknown \"${field.type}\" field.`\n );\n }\n const originalField = originalFields.find(f => f.id === field.id);\n /**\n * Field MUST have an fieldId defined.\n */\n if (!field.fieldId) {\n throw new WebinyError(`Field does not have an \"fieldId\" defined.`, \"MISSING_FIELD_ID\", {\n field\n });\n }\n /**\n * If storageId does not match a certain pattern, add that pattern, but only if field is not locked (used) already.\n * This is to avoid errors in the already installed systems.\n *\n * Why are we using the @?\n *\n * It is not part of special characters for the query syntax in the Lucene.\n *\n * Relevant links:\n * https://lucene.apache.org/core/3_4_0/queryparsersyntax.html\n * https://discuss.elastic.co/t/special-characters-in-field-names/10658/3\n * https://discuss.elastic.co/t/illegal-characters-in-elasticsearch-field-names/17196/2\n */\n const isLocked = lockedFields.some(lockedField => {\n return lockedField.fieldId === field.storageId;\n });\n if (!field.storageId) {\n /**\n * In case field is locked, we must set the storageId to the fieldId value.\n * This should not happen, because we upgrade all the fields in 5.33.0, but let's have a check just in case of some upgrade miss.\n */\n //\n if (isLocked) {\n field.storageId = field.fieldId;\n }\n /**\n * When having original field, just set the storageId to value from the originalField\n */\n //\n else if (originalField) {\n field.storageId = originalField.storageId;\n }\n /**\n * The last case is when no original field and not locked - so this is a completely new field.\n */\n //\n else {\n field.storageId = createFieldStorageId(field);\n }\n }\n /**\n * Check the field's fieldId against existing ones.\n * There cannot be two fields with the same fieldId - outside world identifier.\n */\n if (fieldIdList.includes(field.fieldId)) {\n throw new WebinyError(\n `Cannot update content model because field \"${field.storageId}\" has fieldId \"${field.fieldId}\", which is already used.`\n );\n }\n fieldIdList.push(field.fieldId);\n /**\n * Check the field's storageId against the existing ones.\n * There cannot be two fields with the same storageId.\n */\n if (storageIdList.includes(field.storageId)) {\n throw new WebinyError(\n `Cannot update content model because field \"${field.label}\" has storageId \"${field.storageId}\", which is already used.`\n );\n }\n storageIdList.push(field.storageId);\n /**\n * TODO maybe make this part pluginable?\n * We need to check the object field child fields.\n * It must be recursive.\n */\n if (field.type !== \"object\") {\n continue;\n }\n const childFields = field.settings?.fields || [];\n const originalChildFields = originalField?.settings?.fields || [];\n /**\n * No point in going further if there are no child fields.\n * Code will break if child fields were removed but used in the entries.\n */\n if (childFields.length === 0) {\n continue;\n }\n validateFields({\n fields: childFields,\n originalFields: originalChildFields,\n plugins,\n lockedFields: []\n });\n }\n};\n\ninterface ValidateModelFieldsParams {\n model: CmsModel;\n original?: CmsModel;\n plugins: PluginsContainer;\n}\nexport const validateModelFields = (params: ValidateModelFieldsParams) => {\n const { model, original, plugins } = params;\n const { titleFieldId } = model;\n\n /**\n * There should be fields/locked fields in either model or data to be updated.\n */\n const { fields = [], lockedFields = [] } = model;\n\n /**\n * Let's inspect the fields of the received content model. We prevent saving of a content model if it\n * contains a field for which a \"cms-model-field-to-graphql\" plugin does not exist on the backend.\n */\n const fieldTypePlugins = plugins.byType<CmsModelFieldToGraphQLPlugin>(\n \"cms-model-field-to-graphql\"\n );\n\n validateFields({\n fields,\n originalFields: original?.fields || [],\n lockedFields,\n plugins: fieldTypePlugins\n });\n\n if (fields.length) {\n /**\n * Make sure that this model can be safely converted to a GraphQL SDL\n */\n const schema = createManageSDL({\n model,\n fieldTypePlugins: fieldTypePlugins.reduce(\n (acc, pl) => ({ ...acc, [pl.fieldType]: pl }),\n {}\n )\n });\n\n try {\n gql(schema);\n } catch (err) {\n throw new WebinyError(extractInvalidField(model, err));\n }\n }\n\n model.titleFieldId = getContentModelTitleFieldId(fields, titleFieldId);\n\n const cmsLockedFieldPlugins =\n plugins.byType<CmsModelLockedFieldPlugin>(\"cms-model-locked-field\");\n\n /**\n * We must not allow removal or changes in fields that are already in use in content entries.\n * Locked fields still have fieldId (should be storageId) because of the old existing locked fields in the models.\n */\n for (const lockedField of lockedFields) {\n const existingField = fields.find(item => item.storageId === lockedField.fieldId);\n\n /**\n * Starting with 5.33.0 fields can be deleted.\n * Our UI gives a warning upon locked field deletion, but if user is managing fields through API directly - we cannot do anything.\n */\n if (!existingField) {\n continue;\n // throw new WebinyError(\n // `Cannot remove the field \"${lockedField.fieldId}\" because it's already in use in created content.`,\n // \"ENTRY_FIELD_USED\",\n // {\n // lockedField,\n // fields\n // }\n // );\n }\n\n if (lockedField.multipleValues !== existingField.multipleValues) {\n throw new WebinyError(\n `Cannot change \"multipleValues\" for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\",\n {\n field: existingField\n }\n );\n }\n\n if (lockedField.type !== existingField.type) {\n throw new WebinyError(\n `Cannot change field type for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\",\n {\n field: existingField\n }\n );\n }\n\n /**\n * Check `lockedField` invariant for specific field\n */\n const lockedFieldsByType = cmsLockedFieldPlugins.filter(\n pl => pl.fieldType === lockedField.type\n );\n for (const plugin of lockedFieldsByType) {\n if (typeof plugin.checkLockedField !== \"function\") {\n continue;\n }\n plugin.checkLockedField({\n lockedField,\n field: existingField\n });\n }\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_graphqlTag","_interopRequireDefault","require","_error","_createManageSDL","_createFieldStorageId","_getBaseFieldType","_titleField","_descriptionField","_imageField","_plugins","_buildSchemaPlugins","_createExecutableSchema","_utils","extractInvalidField","model","err","_err$source","sdl","source","body","line","lineNumber","locations","sdlLines","split","sdlLine","gqlType","i","includes","match","invalidField","undefined","Array","isArray","fieldRegex","RegExp","matched","message","data","modelId","code","join","createValidateChildFields","plugins","fields","originalFields","length","validateFields","lockedFields","params","idList","fieldIdList","storageIdList","field","baseType","getBaseFieldType","plugin","find","fieldType","Error","id","WebinyError","storageId","fieldId","push","originalField","f","isLocked","some","lockedField","createFieldStorageId","label","validateChildFields","validate","createGraphQLSchema","context","models","security","withoutAuthorization","cms","listModels","filter","isPrivate","modelPlugins","buildSchemaPlugins","concat","byType","CmsGraphQLSchemaPlugin","type","reduce","collection","name","generateAlphaNumericId","createExecutableSchema","Object","values","extractErrorObject","error","output","key","validateModelFields","original","titleFieldId","descriptionFieldId","imageFieldId","fieldTypePlugins","sorterPlugins","CmsGraphQLSchemaSorterPlugin","schema","createManageSDL","acc","pl","_objectSpread2","default","gql","getContentModelTitleFieldId","getContentModelDescriptionFieldId","getContentModelImageFieldId","cmsLockedFieldPlugins","existingField","item","Boolean","multipleValues","reason","lockedFieldType","existingFieldType","lockedFieldsByType","checkLockedField","exports"],"sources":["validateModelFields.ts"],"sourcesContent":["import gql from \"graphql-tag\";\nimport WebinyError from \"@webiny/error\";\nimport {\n CmsModel,\n CmsContext,\n CmsModelField,\n CmsModelFieldToGraphQLPlugin,\n CmsModelFieldToGraphQLPluginValidateChildFieldsValidate,\n CmsModelLockedFieldPlugin,\n LockedField\n} from \"~/types\";\nimport { createManageSDL } from \"~/graphql/schema/createManageSDL\";\nimport { createFieldStorageId } from \"./createFieldStorageId\";\nimport { GraphQLError } from \"graphql\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType\";\nimport { getContentModelTitleFieldId } from \"./fields/titleField\";\nimport { getContentModelDescriptionFieldId } from \"./fields/descriptionField\";\nimport { getContentModelImageFieldId } from \"./fields/imageField\";\nimport { CmsGraphQLSchemaPlugin, CmsGraphQLSchemaSorterPlugin } from \"~/plugins\";\nimport { buildSchemaPlugins } from \"~/graphql/buildSchemaPlugins\";\nimport { createExecutableSchema } from \"~/graphql/createExecutableSchema\";\nimport { generateAlphaNumericId } from \"@webiny/utils\";\n\nconst extractInvalidField = (model: CmsModel, err: GraphQLError) => {\n const sdl = err.source?.body || \"\";\n\n /**\n * Find the invalid type\n */\n const { line: lineNumber } = err.locations\n ? err.locations[0]\n : {\n line: 0\n };\n const sdlLines = sdl.split(\"\\n\");\n let sdlLine;\n let gqlType;\n for (let i = lineNumber; i > 0; i--) {\n if (sdlLine && sdlLine.includes(\"type \")) {\n gqlType = sdlLine.match(/type\\s+(.*?)\\s+{/);\n break;\n }\n\n sdlLine = sdlLines[i];\n }\n\n let invalidField: string | undefined = undefined;\n if (Array.isArray(gqlType)) {\n const fieldRegex = new RegExp(`([^\\\\s+].*?):\\\\s+\\\\[?${gqlType[1]}!?\\\\]?`);\n\n const matched = sdl.match(fieldRegex);\n if (matched) {\n invalidField = matched[1];\n }\n }\n\n let message = `See more details in the browser console.`;\n if (invalidField) {\n message = `Please review the definition of \"${invalidField}\" field.`;\n }\n\n return {\n data: {\n modelId: model.modelId,\n sdl,\n invalidField\n },\n code: \"INVALID_MODEL_DEFINITION\",\n message: [`Model \"${model.modelId}\" was not saved!`, message].join(\"\\n\")\n };\n};\n\nconst createValidateChildFields = (\n plugins: CmsModelFieldToGraphQLPlugin[]\n): CmsModelFieldToGraphQLPluginValidateChildFieldsValidate => {\n return ({ fields, originalFields }) => {\n if (fields.length === 0 && originalFields.length === 0) {\n return;\n }\n validateFields({\n fields,\n originalFields,\n plugins,\n lockedFields: []\n });\n };\n};\n\ninterface ValidateFieldsParams {\n plugins: CmsModelFieldToGraphQLPlugin[];\n fields: CmsModelField[];\n originalFields: CmsModelField[];\n lockedFields: LockedField[];\n}\n\nconst validateFields = (params: ValidateFieldsParams) => {\n const { plugins, fields, originalFields, lockedFields } = params;\n\n const idList: string[] = [];\n const fieldIdList: string[] = [];\n const storageIdList: string[] = [];\n\n for (const field of fields) {\n const baseType = getBaseFieldType(field);\n const plugin = plugins.find(plugin => plugin.fieldType === baseType);\n\n if (!plugin) {\n throw new Error(\n `Cannot update content model because of the unknown \"${baseType}\" field.`\n );\n }\n /**\n * Check the field's id against existing ones.\n * There cannot be two fields with the same id.\n */\n if (idList.includes(field.id)) {\n throw new WebinyError(\n `Cannot update content model because field \"${\n field.storageId || field.fieldId\n }\" has id \"${field.id}\", which is already used.`\n );\n }\n idList.push(field.id);\n\n const originalField = originalFields.find(f => f.id === field.id);\n /**\n * Field MUST have an fieldId defined.\n */\n if (!field.fieldId) {\n throw new WebinyError(`Field does not have an \"fieldId\" defined.`, \"MISSING_FIELD_ID\", {\n field\n });\n }\n /**\n * If storageId does not match a certain pattern, add that pattern, but only if field is not locked (used) already.\n * This is to avoid errors in the already installed systems.\n *\n * Why are we using the @?\n *\n * It is not part of special characters for the query syntax in the Lucene.\n *\n * Relevant links:\n * https://lucene.apache.org/core/3_4_0/queryparsersyntax.html\n * https://discuss.elastic.co/t/special-characters-in-field-names/10658/3\n * https://discuss.elastic.co/t/illegal-characters-in-elasticsearch-field-names/17196/2\n */\n const isLocked = lockedFields.some(lockedField => {\n return lockedField.fieldId === field.storageId || lockedField.fieldId === field.fieldId;\n });\n if (!field.storageId) {\n /**\n * In case field is locked, we must set the storageId to the fieldId value.\n * This should not happen, because we upgrade all the fields in 5.33.0, but let's have a check just in case of some upgrade miss.\n */\n //\n if (isLocked) {\n field.storageId = field.fieldId;\n }\n /**\n * When having original field, just set the storageId to value from the originalField\n */\n //\n else if (originalField) {\n field.storageId = originalField.storageId;\n }\n /**\n * The last case is when no original field and not locked - so this is a completely new field.\n */\n //\n else {\n field.storageId = createFieldStorageId(field);\n }\n }\n /**\n * Check the field's fieldId against existing ones.\n * There cannot be two fields with the same fieldId - outside world identifier.\n */\n if (fieldIdList.includes(field.fieldId)) {\n throw new WebinyError(\n `Cannot update content model because field \"${field.storageId}\" has fieldId \"${field.fieldId}\", which is already used.`\n );\n }\n fieldIdList.push(field.fieldId);\n /**\n * Check the field's storageId against the existing ones.\n * There cannot be two fields with the same storageId.\n */\n if (storageIdList.includes(field.storageId)) {\n throw new WebinyError(\n `Cannot update content model because field \"${field.label}\" has storageId \"${field.storageId}\", which is already used.`\n );\n }\n storageIdList.push(field.storageId);\n /**\n * There might be some plugins which allow child fields.\n * We use this method to validate them as well.\n */\n if (!plugin.validateChildFields) {\n continue;\n }\n const validateChildFields = createValidateChildFields(plugins);\n plugin.validateChildFields({\n field,\n originalField,\n validate: validateChildFields\n });\n }\n};\n\ninterface CreateGraphQLSchemaParams {\n context: CmsContext;\n model: CmsModel;\n}\n\nconst createGraphQLSchema = async (params: CreateGraphQLSchemaParams): Promise<any> => {\n const { context, model } = params;\n\n const models = await context.security.withoutAuthorization(async () => {\n return (await context.cms.listModels()).filter((model): model is CmsModel => {\n return model.isPrivate !== true;\n });\n });\n\n const modelPlugins = await buildSchemaPlugins({\n context,\n models: models.concat([model])\n });\n\n const plugins = context.plugins\n .byType<CmsGraphQLSchemaPlugin>(CmsGraphQLSchemaPlugin.type)\n .reduce<Record<string, CmsGraphQLSchemaPlugin>>((collection, plugin) => {\n const name =\n plugin.name || `${CmsGraphQLSchemaPlugin.type}-${generateAlphaNumericId(16)}`;\n collection[name] = plugin;\n return collection;\n }, {});\n for (const plugin of modelPlugins) {\n const name = plugin.name || `${plugin.type}-${generateAlphaNumericId(16)}`;\n plugins[name] = plugin;\n }\n\n return createExecutableSchema({\n plugins: Object.values(plugins)\n });\n};\n\nconst extractErrorObject = (error: any) => {\n return [\"message\", \"code\", \"data\", \"stack\"].reduce<Record<string, any>>((output, key) => {\n if (!error[key]) {\n return output;\n }\n output[key] = error[key];\n return output;\n }, {});\n};\n\ninterface ValidateModelFieldsParams {\n models: CmsModel[];\n model: CmsModel;\n original?: CmsModel;\n context: CmsContext;\n}\n\nexport const validateModelFields = async (params: ValidateModelFieldsParams): Promise<void> => {\n const { models, model, original, context } = params;\n const { titleFieldId, descriptionFieldId, imageFieldId } = model;\n const { plugins } = context;\n\n /**\n * There should be fields/locked fields in either model or data to be updated.\n */\n const { fields = [], lockedFields = [] } = model;\n\n /**\n * Let's inspect the fields of the received content model. We prevent saving of a content model if it\n * contains a field for which a \"cms-model-field-to-graphql\" plugin does not exist on the backend.\n */\n const fieldTypePlugins = plugins.byType<CmsModelFieldToGraphQLPlugin>(\n \"cms-model-field-to-graphql\"\n );\n\n validateFields({\n fields,\n originalFields: original?.fields || [],\n lockedFields,\n plugins: fieldTypePlugins\n });\n\n if (fields.length) {\n const sorterPlugins = plugins.byType<CmsGraphQLSchemaSorterPlugin>(\n CmsGraphQLSchemaSorterPlugin.type\n );\n /**\n * Make sure that this model can be safely converted to a GraphQL SDL\n */\n const schema = createManageSDL({\n models,\n model,\n fieldTypePlugins: fieldTypePlugins.reduce(\n (acc, pl) => ({ ...acc, [pl.fieldType]: pl }),\n {}\n ),\n sorterPlugins\n });\n\n try {\n gql(schema);\n } catch (err) {\n throw new WebinyError(extractInvalidField(model, err));\n }\n /**\n *\n */\n try {\n await createGraphQLSchema({\n context,\n model\n });\n } catch (err) {\n throw new WebinyError({\n message:\n \"Cannot generate GraphQL schema when testing with the given model. Please check the response for more details.\",\n code: \"GRAPHQL_SCHEMA_ERROR\",\n data: {\n modelId: model.modelId,\n error: extractErrorObject(err)\n }\n });\n }\n }\n\n model.titleFieldId = getContentModelTitleFieldId(fields, titleFieldId);\n model.descriptionFieldId = getContentModelDescriptionFieldId(fields, descriptionFieldId);\n model.imageFieldId = getContentModelImageFieldId(fields, imageFieldId);\n\n const cmsLockedFieldPlugins =\n plugins.byType<CmsModelLockedFieldPlugin>(\"cms-model-locked-field\");\n\n /**\n * We must not allow removal or changes in fields that are already in use in content entries.\n * Locked fields still have fieldId (should be storageId) because of the old existing locked fields in the models.\n */\n for (const lockedField of lockedFields) {\n const existingField = fields.find(item => item.storageId === lockedField.fieldId);\n\n /**\n * Starting with 5.33.0 fields can be deleted.\n * Our UI gives a warning upon locked field deletion, but if user is managing fields through API directly - we cannot do anything.\n */\n if (!existingField) {\n continue;\n }\n\n if (Boolean(lockedField.multipleValues) !== Boolean(existingField.multipleValues)) {\n throw new WebinyError(\n `Cannot change \"multipleValues\" for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\",\n {\n reason: `\"multipleValues\" changed`,\n field: existingField\n }\n );\n }\n\n const fieldType = getBaseFieldType(existingField);\n if (lockedField.type !== fieldType) {\n throw new WebinyError(\n `Cannot change field type for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\",\n {\n reason: `\"type\" changed`,\n lockedFieldType: lockedField.type,\n existingFieldType: fieldType\n }\n );\n }\n\n /**\n * Check `lockedField` invariant for specific field\n */\n const lockedFieldsByType = cmsLockedFieldPlugins.filter(\n pl => pl.fieldType === getBaseFieldType(lockedField)\n );\n for (const plugin of lockedFieldsByType) {\n if (typeof plugin.checkLockedField !== \"function\") {\n continue;\n }\n plugin.checkLockedField({\n lockedField,\n field: existingField\n });\n }\n }\n};\n"],"mappings":"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"}