@webiny/api-headless-cms 0.0.0-unstable.aad28a72ae → 0.0.0-unstable.b14eaecf38

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 (386) hide show
  1. package/context.d.ts +5 -2
  2. package/context.js +61 -23
  3. package/context.js.map +1 -1
  4. package/crud/contentEntry/afterDelete.js +0 -5
  5. package/crud/contentEntry/afterDelete.js.map +1 -1
  6. package/crud/contentEntry/beforeCreate.js +0 -3
  7. package/crud/contentEntry/beforeCreate.js.map +1 -1
  8. package/crud/contentEntry/beforeUpdate.js +0 -3
  9. package/crud/contentEntry/beforeUpdate.js.map +1 -1
  10. package/crud/contentEntry/entryDataValidation.js +1 -40
  11. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  12. package/crud/contentEntry/markLockedFields.d.ts +1 -1
  13. package/crud/contentEntry/markLockedFields.js +15 -28
  14. package/crud/contentEntry/markLockedFields.js.map +1 -1
  15. package/crud/contentEntry/referenceFieldsMapping.js +5 -61
  16. package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
  17. package/crud/contentEntry/searchableFields.js +1 -12
  18. package/crud/contentEntry/searchableFields.js.map +1 -1
  19. package/crud/contentEntry.crud.d.ts +5 -2
  20. package/crud/contentEntry.crud.js +871 -936
  21. package/crud/contentEntry.crud.js.map +1 -1
  22. package/crud/contentModel/afterCreate.js +0 -2
  23. package/crud/contentModel/afterCreate.js.map +1 -1
  24. package/crud/contentModel/afterCreateFrom.js +0 -2
  25. package/crud/contentModel/afterCreateFrom.js.map +1 -1
  26. package/crud/contentModel/afterDelete.js +0 -2
  27. package/crud/contentModel/afterDelete.js.map +1 -1
  28. package/crud/contentModel/afterUpdate.js +0 -2
  29. package/crud/contentModel/afterUpdate.js.map +1 -1
  30. package/crud/contentModel/beforeCreate.d.ts +2 -3
  31. package/crud/contentModel/beforeCreate.js +43 -109
  32. package/crud/contentModel/beforeCreate.js.map +1 -1
  33. package/crud/contentModel/beforeDelete.d.ts +1 -1
  34. package/crud/contentModel/beforeDelete.js +1 -15
  35. package/crud/contentModel/beforeDelete.js.map +1 -1
  36. package/crud/contentModel/beforeUpdate.d.ts +2 -4
  37. package/crud/contentModel/beforeUpdate.js +33 -10
  38. package/crud/contentModel/beforeUpdate.js.map +1 -1
  39. package/crud/contentModel/compatibility/modelApiName.d.ts +3 -0
  40. package/crud/contentModel/compatibility/modelApiName.js +24 -0
  41. package/crud/contentModel/compatibility/modelApiName.js.map +1 -0
  42. package/crud/contentModel/contentModelManagerFactory.js +0 -7
  43. package/crud/contentModel/contentModelManagerFactory.js.map +1 -1
  44. package/crud/contentModel/createFieldStorageId.js +0 -3
  45. package/crud/contentModel/createFieldStorageId.js.map +1 -1
  46. package/crud/contentModel/defaultFields.d.ts +5 -0
  47. package/crud/contentModel/defaultFields.js +58 -0
  48. package/crud/contentModel/defaultFields.js.map +1 -0
  49. package/crud/contentModel/fields/descriptionField.d.ts +2 -0
  50. package/crud/contentModel/fields/descriptionField.js +42 -0
  51. package/crud/contentModel/fields/descriptionField.js.map +1 -0
  52. package/crud/contentModel/fields/imageField.d.ts +2 -0
  53. package/crud/contentModel/fields/imageField.js +46 -0
  54. package/crud/contentModel/fields/imageField.js.map +1 -0
  55. package/crud/contentModel/fields/titleField.d.ts +2 -0
  56. package/crud/contentModel/fields/titleField.js +58 -0
  57. package/crud/contentModel/fields/titleField.js.map +1 -0
  58. package/crud/contentModel/validate/endingAllowed.d.ts +6 -0
  59. package/crud/contentModel/validate/endingAllowed.js +26 -0
  60. package/crud/contentModel/validate/endingAllowed.js.map +1 -0
  61. package/crud/contentModel/validate/isModelEndingAllowed.d.ts +6 -0
  62. package/crud/contentModel/validate/isModelEndingAllowed.js +24 -0
  63. package/crud/contentModel/validate/isModelEndingAllowed.js.map +1 -0
  64. package/crud/contentModel/validate/modelId.d.ts +11 -0
  65. package/crud/contentModel/validate/modelId.js +36 -0
  66. package/crud/contentModel/validate/modelId.js.map +1 -0
  67. package/crud/contentModel/validate/pluralApiName.d.ts +7 -0
  68. package/crud/contentModel/validate/pluralApiName.js +24 -0
  69. package/crud/contentModel/validate/pluralApiName.js.map +1 -0
  70. package/crud/contentModel/validate/singularApiName.d.ts +7 -0
  71. package/crud/contentModel/validate/singularApiName.js +24 -0
  72. package/crud/contentModel/validate/singularApiName.js.map +1 -0
  73. package/crud/contentModel/validateLayout.js +0 -8
  74. package/crud/contentModel/validateLayout.js.map +1 -1
  75. package/crud/contentModel/validateModel.d.ts +4 -4
  76. package/crud/contentModel/validateModel.js +6 -11
  77. package/crud/contentModel/validateModel.js.map +1 -1
  78. package/crud/contentModel/validateModelFields.d.ts +4 -4
  79. package/crud/contentModel/validateModelFields.js +97 -126
  80. package/crud/contentModel/validateModelFields.js.map +1 -1
  81. package/crud/contentModel/validation.d.ts +551 -0
  82. package/crud/contentModel/validation.js +145 -0
  83. package/crud/contentModel/validation.js.map +1 -0
  84. package/crud/contentModel.crud.js +357 -391
  85. package/crud/contentModel.crud.js.map +1 -1
  86. package/crud/contentModelGroup/beforeCreate.js +0 -12
  87. package/crud/contentModelGroup/beforeCreate.js.map +1 -1
  88. package/crud/contentModelGroup/beforeDelete.js +0 -8
  89. package/crud/contentModelGroup/beforeDelete.js.map +1 -1
  90. package/crud/contentModelGroup/beforeUpdate.js +0 -5
  91. package/crud/contentModelGroup/beforeUpdate.js.map +1 -1
  92. package/crud/contentModelGroup/validation.d.ts +30 -0
  93. package/crud/contentModelGroup/validation.js +34 -0
  94. package/crud/contentModelGroup/validation.js.map +1 -0
  95. package/crud/contentModelGroup.crud.js +177 -221
  96. package/crud/contentModelGroup.crud.js.map +1 -1
  97. package/crud/settings.crud.d.ts +1 -1
  98. package/crud/settings.crud.js +5 -22
  99. package/crud/settings.crud.js.map +1 -1
  100. package/crud/system.crud.js +1 -96
  101. package/crud/system.crud.js.map +1 -1
  102. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js +0 -13
  103. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js.map +1 -1
  104. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +0 -36
  105. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
  106. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +0 -53
  107. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  108. package/fieldConverters/index.js +0 -5
  109. package/fieldConverters/index.js.map +1 -1
  110. package/graphql/buildSchemaPlugins.d.ts +8 -3
  111. package/graphql/buildSchemaPlugins.js +6 -14
  112. package/graphql/buildSchemaPlugins.js.map +1 -1
  113. package/graphql/checkEndpointAccess.d.ts +2 -0
  114. package/graphql/checkEndpointAccess.js +18 -0
  115. package/graphql/checkEndpointAccess.js.map +1 -0
  116. package/graphql/createExecutableSchema.d.ts +6 -0
  117. package/graphql/createExecutableSchema.js +29 -0
  118. package/graphql/createExecutableSchema.js.map +1 -0
  119. package/graphql/createRequestBody.d.ts +2 -0
  120. package/graphql/createRequestBody.js +14 -0
  121. package/graphql/createRequestBody.js.map +1 -0
  122. package/graphql/formatErrorPayload.d.ts +1 -0
  123. package/graphql/formatErrorPayload.js +25 -0
  124. package/graphql/formatErrorPayload.js.map +1 -0
  125. package/graphql/generateSchema.d.ts +8 -0
  126. package/graphql/generateSchema.js +31 -0
  127. package/graphql/generateSchema.js.map +1 -0
  128. package/graphql/getSchema.d.ts +17 -0
  129. package/graphql/getSchema.js +102 -0
  130. package/graphql/getSchema.js.map +1 -0
  131. package/graphql/graphQLHandlerFactory.js +8 -169
  132. package/graphql/graphQLHandlerFactory.js.map +1 -1
  133. package/graphql/handleRequest.d.ts +11 -0
  134. package/graphql/handleRequest.js +81 -0
  135. package/graphql/handleRequest.js.map +1 -0
  136. package/graphql/index.d.ts +1 -3
  137. package/graphql/index.js +2 -46
  138. package/graphql/index.js.map +1 -1
  139. package/graphql/schema/baseContentSchema.d.ts +6 -2
  140. package/graphql/schema/baseContentSchema.js +10 -20
  141. package/graphql/schema/baseContentSchema.js.map +1 -1
  142. package/graphql/schema/baseSchema.d.ts +3 -0
  143. package/graphql/schema/baseSchema.js +53 -0
  144. package/graphql/schema/baseSchema.js.map +1 -0
  145. package/graphql/schema/contentEntries.d.ts +6 -2
  146. package/graphql/schema/contentEntries.js +118 -107
  147. package/graphql/schema/contentEntries.js.map +1 -1
  148. package/graphql/schema/contentModelGroups.d.ts +6 -2
  149. package/graphql/schema/contentModelGroups.js +16 -29
  150. package/graphql/schema/contentModelGroups.js.map +1 -1
  151. package/graphql/schema/contentModels.d.ts +6 -2
  152. package/graphql/schema/contentModels.js +41 -24
  153. package/graphql/schema/contentModels.js.map +1 -1
  154. package/graphql/schema/createFieldResolvers.js +13 -24
  155. package/graphql/schema/createFieldResolvers.js.map +1 -1
  156. package/graphql/schema/createManageResolvers.d.ts +1 -1
  157. package/graphql/schema/createManageResolvers.js +33 -43
  158. package/graphql/schema/createManageResolvers.js.map +1 -1
  159. package/graphql/schema/createManageSDL.d.ts +3 -0
  160. package/graphql/schema/createManageSDL.js +61 -65
  161. package/graphql/schema/createManageSDL.js.map +1 -1
  162. package/graphql/schema/createPreviewResolvers.js +3 -17
  163. package/graphql/schema/createPreviewResolvers.js.map +1 -1
  164. package/graphql/schema/createReadResolvers.js +8 -17
  165. package/graphql/schema/createReadResolvers.js.map +1 -1
  166. package/graphql/schema/createReadSDL.d.ts +3 -0
  167. package/graphql/schema/createReadSDL.js +30 -34
  168. package/graphql/schema/createReadSDL.js.map +1 -1
  169. package/graphql/schema/resolvers/commonFieldResolvers.d.ts +3 -2
  170. package/graphql/schema/resolvers/commonFieldResolvers.js +2 -3
  171. package/graphql/schema/resolvers/commonFieldResolvers.js.map +1 -1
  172. package/graphql/schema/resolvers/manage/resolveCreate.js +0 -3
  173. package/graphql/schema/resolvers/manage/resolveCreate.js.map +1 -1
  174. package/graphql/schema/resolvers/manage/resolveCreateFrom.js +0 -3
  175. package/graphql/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
  176. package/graphql/schema/resolvers/manage/resolveDelete.js +0 -6
  177. package/graphql/schema/resolvers/manage/resolveDelete.js.map +1 -1
  178. package/graphql/schema/resolvers/manage/resolveGet.js +0 -16
  179. package/graphql/schema/resolvers/manage/resolveGet.js.map +1 -1
  180. package/graphql/schema/resolvers/manage/resolveGetByIds.js +0 -3
  181. package/graphql/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
  182. package/graphql/schema/resolvers/manage/resolveGetRevisions.js +0 -3
  183. package/graphql/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
  184. package/graphql/schema/resolvers/manage/resolveList.js +0 -3
  185. package/graphql/schema/resolvers/manage/resolveList.js.map +1 -1
  186. package/graphql/schema/resolvers/manage/resolvePublish.js +0 -3
  187. package/graphql/schema/resolvers/manage/resolvePublish.js.map +1 -1
  188. package/graphql/schema/resolvers/manage/resolveRepublish.js +0 -3
  189. package/graphql/schema/resolvers/manage/resolveRepublish.js.map +1 -1
  190. package/graphql/schema/resolvers/manage/resolveUnpublish.js +0 -3
  191. package/graphql/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
  192. package/graphql/schema/resolvers/manage/resolveUpdate.js +0 -3
  193. package/graphql/schema/resolvers/manage/resolveUpdate.js.map +1 -1
  194. package/graphql/schema/resolvers/preview/resolveGet.js +0 -8
  195. package/graphql/schema/resolvers/preview/resolveGet.js.map +1 -1
  196. package/graphql/schema/resolvers/preview/resolveList.js +0 -3
  197. package/graphql/schema/resolvers/preview/resolveList.js.map +1 -1
  198. package/graphql/schema/resolvers/read/resolveGet.js +0 -8
  199. package/graphql/schema/resolvers/read/resolveGet.js.map +1 -1
  200. package/graphql/schema/resolvers/read/resolveList.js +0 -3
  201. package/graphql/schema/resolvers/read/resolveList.js.map +1 -1
  202. package/graphql/schema/schemaPlugins.d.ts +8 -3
  203. package/graphql/schema/schemaPlugins.js +64 -66
  204. package/graphql/schema/schemaPlugins.js.map +1 -1
  205. package/graphql/system.js +55 -87
  206. package/graphql/system.js.map +1 -1
  207. package/graphqlFields/boolean.js +0 -12
  208. package/graphqlFields/boolean.js.map +1 -1
  209. package/graphqlFields/datetime.js +0 -17
  210. package/graphqlFields/datetime.js.map +1 -1
  211. package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +1 -1
  212. package/graphqlFields/dynamicZone/dynamicZoneField.js +27 -33
  213. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -1
  214. package/graphqlFields/dynamicZone/dynamicZoneStorage.js +2 -18
  215. package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -1
  216. package/graphqlFields/dynamicZone/index.js +0 -2
  217. package/graphqlFields/dynamicZone/index.js.map +1 -1
  218. package/graphqlFields/file.js +0 -8
  219. package/graphqlFields/file.js.map +1 -1
  220. package/graphqlFields/helpers.js +0 -10
  221. package/graphqlFields/helpers.js.map +1 -1
  222. package/graphqlFields/index.js +0 -12
  223. package/graphqlFields/index.js.map +1 -1
  224. package/graphqlFields/longText.js +0 -10
  225. package/graphqlFields/longText.js.map +1 -1
  226. package/graphqlFields/number.js +0 -12
  227. package/graphqlFields/number.js.map +1 -1
  228. package/graphqlFields/object.js +22 -39
  229. package/graphqlFields/object.js.map +1 -1
  230. package/graphqlFields/ref.js +64 -66
  231. package/graphqlFields/ref.js.map +1 -1
  232. package/graphqlFields/richText.js +0 -9
  233. package/graphqlFields/richText.js.map +1 -1
  234. package/graphqlFields/text.js +0 -11
  235. package/graphqlFields/text.js.map +1 -1
  236. package/index.d.ts +5 -3
  237. package/index.js +26 -28
  238. package/index.js.map +1 -1
  239. package/modelManager/DefaultCmsModelManager.js +0 -16
  240. package/modelManager/DefaultCmsModelManager.js.map +1 -1
  241. package/modelManager/index.js +0 -4
  242. package/modelManager/index.js.map +1 -1
  243. package/package.json +26 -28
  244. package/parameters/context.js +0 -4
  245. package/parameters/context.js.map +1 -1
  246. package/parameters/header.js +0 -11
  247. package/parameters/header.js.map +1 -1
  248. package/parameters/index.js +0 -8
  249. package/parameters/index.js.map +1 -1
  250. package/parameters/manual.js +1 -8
  251. package/parameters/manual.js.map +1 -1
  252. package/parameters/path.js +0 -11
  253. package/parameters/path.js.map +1 -1
  254. package/plugins/CmsGraphQLSchemaPlugin.d.ts +5 -0
  255. package/plugins/CmsGraphQLSchemaPlugin.js +12 -0
  256. package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -0
  257. package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +20 -0
  258. package/plugins/CmsGraphQLSchemaSorterPlugin.js +28 -0
  259. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -0
  260. package/plugins/CmsGroupPlugin.js +0 -8
  261. package/plugins/CmsGroupPlugin.js.map +1 -1
  262. package/plugins/CmsModelFieldConverterPlugin.js +0 -5
  263. package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
  264. package/plugins/CmsModelPlugin.d.ts +19 -3
  265. package/plugins/CmsModelPlugin.js +30 -40
  266. package/plugins/CmsModelPlugin.js.map +1 -1
  267. package/plugins/CmsParametersPlugin.js +0 -7
  268. package/plugins/CmsParametersPlugin.js.map +1 -1
  269. package/plugins/StorageOperationsCmsModelPlugin.d.ts +23 -0
  270. package/plugins/StorageOperationsCmsModelPlugin.js +42 -0
  271. package/plugins/StorageOperationsCmsModelPlugin.js.map +1 -0
  272. package/plugins/StorageTransformPlugin.js +0 -9
  273. package/plugins/StorageTransformPlugin.js.map +1 -1
  274. package/plugins/index.d.ts +3 -0
  275. package/plugins/index.js +33 -10
  276. package/plugins/index.js.map +1 -1
  277. package/storage/default.js +0 -3
  278. package/storage/default.js.map +1 -1
  279. package/storage/object.js +0 -19
  280. package/storage/object.js.map +1 -1
  281. package/types.d.ts +173 -79
  282. package/types.js +23 -73
  283. package/types.js.map +1 -1
  284. package/utils/access.js +11 -25
  285. package/utils/access.js.map +1 -1
  286. package/utils/converters/Converter.js +0 -13
  287. package/utils/converters/Converter.js.map +1 -1
  288. package/utils/converters/ConverterCollection.js +9 -33
  289. package/utils/converters/ConverterCollection.js.map +1 -1
  290. package/utils/converters/valueKeyStorageConverter.d.ts +1 -5
  291. package/utils/converters/valueKeyStorageConverter.js +21 -44
  292. package/utils/converters/valueKeyStorageConverter.js.map +1 -1
  293. package/utils/createTypeFromFields.d.ts +1 -0
  294. package/utils/createTypeFromFields.js +11 -20
  295. package/utils/createTypeFromFields.js.map +1 -1
  296. package/utils/createTypeName.d.ts +0 -2
  297. package/utils/createTypeName.js +2 -19
  298. package/utils/createTypeName.js.map +1 -1
  299. package/utils/entryStorage.js +10 -26
  300. package/utils/entryStorage.js.map +1 -1
  301. package/utils/filterAsync.js +0 -5
  302. package/utils/filterAsync.js.map +1 -1
  303. package/utils/getBaseFieldType.js +0 -2
  304. package/utils/getBaseFieldType.js.map +1 -1
  305. package/utils/getEntryDescription.d.ts +2 -0
  306. package/utils/getEntryDescription.js +17 -0
  307. package/utils/getEntryDescription.js.map +1 -0
  308. package/utils/getEntryImage.d.ts +2 -0
  309. package/utils/getEntryImage.js +17 -0
  310. package/utils/getEntryImage.js.map +1 -0
  311. package/utils/getEntryTitle.js +0 -9
  312. package/utils/getEntryTitle.js.map +1 -1
  313. package/utils/getSchemaFromFieldPlugins.d.ts +4 -7
  314. package/utils/getSchemaFromFieldPlugins.js +23 -19
  315. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  316. package/utils/incrementEntryIdVersion.d.ts +5 -0
  317. package/utils/incrementEntryIdVersion.js +29 -0
  318. package/utils/incrementEntryIdVersion.js.map +1 -0
  319. package/utils/ownership.d.ts +3 -3
  320. package/utils/ownership.js +0 -8
  321. package/utils/ownership.js.map +1 -1
  322. package/utils/permissions.js +8 -23
  323. package/utils/permissions.js.map +1 -1
  324. package/utils/renderFields.d.ts +2 -1
  325. package/utils/renderFields.js +8 -10
  326. package/utils/renderFields.js.map +1 -1
  327. package/utils/renderGetFilterFields.js +0 -13
  328. package/utils/renderGetFilterFields.js.map +1 -1
  329. package/utils/renderInputFields.d.ts +2 -1
  330. package/utils/renderInputFields.js +4 -9
  331. package/utils/renderInputFields.js.map +1 -1
  332. package/utils/renderListFilterFields.js +1 -10
  333. package/utils/renderListFilterFields.js.map +1 -1
  334. package/utils/renderSortEnum.d.ts +7 -4
  335. package/utils/renderSortEnum.js +19 -11
  336. package/utils/renderSortEnum.js.map +1 -1
  337. package/utils/toSlug.js +0 -4
  338. package/utils/toSlug.js.map +1 -1
  339. package/validators/dateGte.js +0 -7
  340. package/validators/dateGte.js.map +1 -1
  341. package/validators/dateLte.js +0 -7
  342. package/validators/dateLte.js.map +1 -1
  343. package/validators/dynamicZone.js +0 -4
  344. package/validators/dynamicZone.js.map +1 -1
  345. package/validators/gte.js +0 -8
  346. package/validators/gte.js.map +1 -1
  347. package/validators/in.js +0 -8
  348. package/validators/in.js.map +1 -1
  349. package/validators/index.js +0 -16
  350. package/validators/index.js.map +1 -1
  351. package/validators/lte.js +0 -8
  352. package/validators/lte.js.map +1 -1
  353. package/validators/maxLength.js +0 -8
  354. package/validators/maxLength.js.map +1 -1
  355. package/validators/minLength.js +0 -8
  356. package/validators/minLength.js.map +1 -1
  357. package/validators/pattern.js +0 -9
  358. package/validators/pattern.js.map +1 -1
  359. package/validators/patternPlugins/email.js +0 -2
  360. package/validators/patternPlugins/email.js.map +1 -1
  361. package/validators/patternPlugins/index.js +0 -8
  362. package/validators/patternPlugins/index.js.map +1 -1
  363. package/validators/patternPlugins/lowerCase.js +0 -2
  364. package/validators/patternPlugins/lowerCase.js.map +1 -1
  365. package/validators/patternPlugins/lowerCaseSpace.js +0 -2
  366. package/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
  367. package/validators/patternPlugins/upperCase.js +0 -2
  368. package/validators/patternPlugins/upperCase.js.map +1 -1
  369. package/validators/patternPlugins/upperCaseSpace.js +0 -2
  370. package/validators/patternPlugins/upperCaseSpace.js.map +1 -1
  371. package/validators/patternPlugins/url.js +0 -2
  372. package/validators/patternPlugins/url.js.map +1 -1
  373. package/validators/required.js +0 -5
  374. package/validators/required.js.map +1 -1
  375. package/validators/timeGte.js +0 -8
  376. package/validators/timeGte.js.map +1 -1
  377. package/validators/timeLte.js +0 -8
  378. package/validators/timeLte.js.map +1 -1
  379. package/validators/unique.js +0 -7
  380. package/validators/unique.js.map +1 -1
  381. package/crud/index.d.ts +0 -6
  382. package/crud/index.js +0 -85
  383. package/crud/index.js.map +0 -1
  384. package/utils/filterModelFields.d.ts +0 -16
  385. package/utils/filterModelFields.js +0 -77
  386. package/utils/filterModelFields.js.map +0 -1
@@ -1,90 +1,30 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.validateModelFields = void 0;
9
-
10
8
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11
-
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
13
  var _getBaseFieldType = require("../../utils/getBaseFieldType");
21
-
22
- const defaultTitleFieldId = "id";
23
- const allowedTitleFieldTypes = ["text", "number"];
24
-
25
- const getContentModelTitleFieldId = (fields, titleFieldId) => {
26
- /**
27
- * If there are no fields defined, we will return the default field
28
- */
29
- if (fields.length === 0) {
30
- return defaultTitleFieldId;
31
- }
32
- /**
33
- * if there is no title field defined either in input data or existing content model data
34
- * we will take first text field that has no multiple values enabled
35
- * or if initial titleFieldId is the default one also try to find first available text field
36
- */
37
-
38
-
39
- if (!titleFieldId || titleFieldId === defaultTitleFieldId) {
40
- const titleField = fields.find(field => {
41
- return (0, _getBaseFieldType.getBaseFieldType)(field) === "text" && !field.multipleValues;
42
- });
43
- return (titleField === null || titleField === void 0 ? void 0 : titleField.fieldId) || defaultTitleFieldId;
44
- }
45
- /**
46
- * check existing titleFieldId for existence in the model
47
- * for correct type
48
- * and that it is not multiple values field
49
- */
50
-
51
-
52
- const target = fields.find(f => f.fieldId === titleFieldId);
53
-
54
- if (!target) {
55
- throw new _error.default(`Field selected for the title field does not exist in the model.`, "VALIDATION_ERROR", {
56
- fieldId: titleFieldId,
57
- fields
58
- });
59
- }
60
-
61
- if (allowedTitleFieldTypes.includes(target.type) === false) {
62
- throw new _error.default(`Only ${allowedTitleFieldTypes.join(", ")} and id fields can be used as an entry title.`, "ENTRY_TITLE_FIELD_TYPE", {
63
- storageId: target.storageId,
64
- fieldId: target.fieldId,
65
- type: target.type
66
- });
67
- }
68
-
69
- if (target.multipleValues) {
70
- throw new _error.default(`Fields that accept multiple values cannot be used as the entry title.`, "ENTRY_TITLE_FIELD_TYPE", {
71
- storageId: target.storageId,
72
- fieldId: target.fieldId,
73
- type: target.type
74
- });
75
- }
76
-
77
- return target.fieldId;
78
- };
79
-
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");
80
21
  const extractInvalidField = (model, err) => {
81
22
  var _err$source;
82
-
83
23
  const sdl = ((_err$source = err.source) === null || _err$source === void 0 ? void 0 : _err$source.body) || "";
24
+
84
25
  /**
85
26
  * Find the invalid type
86
27
  */
87
-
88
28
  const {
89
29
  line: lineNumber
90
30
  } = err.locations ? err.locations[0] : {
@@ -93,33 +33,25 @@ const extractInvalidField = (model, err) => {
93
33
  const sdlLines = sdl.split("\n");
94
34
  let sdlLine;
95
35
  let gqlType;
96
-
97
36
  for (let i = lineNumber; i > 0; i--) {
98
37
  if (sdlLine && sdlLine.includes("type ")) {
99
38
  gqlType = sdlLine.match(/type\s+(.*?)\s+{/);
100
39
  break;
101
40
  }
102
-
103
41
  sdlLine = sdlLines[i];
104
42
  }
105
-
106
43
  let invalidField = undefined;
107
-
108
44
  if (Array.isArray(gqlType)) {
109
45
  const fieldRegex = new RegExp(`([^\\s+].*?):\\s+\\[?${gqlType[1]}!?\\]?`);
110
46
  const matched = sdl.match(fieldRegex);
111
-
112
47
  if (matched) {
113
48
  invalidField = matched[1];
114
49
  }
115
50
  }
116
-
117
51
  let message = `See more details in the browser console.`;
118
-
119
52
  if (invalidField) {
120
53
  message = `Please review the definition of "${invalidField}" field.`;
121
54
  }
122
-
123
55
  return {
124
56
  data: {
125
57
  modelId: model.modelId,
@@ -130,16 +62,14 @@ const extractInvalidField = (model, err) => {
130
62
  message: [`Model "${model.modelId}" was not saved!`, message].join("\n")
131
63
  };
132
64
  };
133
-
134
65
  const createValidateChildFields = plugins => {
135
66
  return ({
136
67
  fields,
137
68
  originalFields
138
69
  }) => {
139
- if (fields.length === 0) {
70
+ if (fields.length === 0 && originalFields.length === 0) {
140
71
  return;
141
72
  }
142
-
143
73
  validateFields({
144
74
  fields,
145
75
  originalFields,
@@ -148,7 +78,6 @@ const createValidateChildFields = plugins => {
148
78
  });
149
79
  };
150
80
  };
151
-
152
81
  const validateFields = params => {
153
82
  const {
154
83
  plugins,
@@ -156,23 +85,27 @@ const validateFields = params => {
156
85
  originalFields,
157
86
  lockedFields
158
87
  } = params;
88
+ const idList = [];
159
89
  const fieldIdList = [];
160
90
  const storageIdList = [];
161
- const validateChildFields = createValidateChildFields(plugins);
162
-
163
91
  for (const field of fields) {
164
92
  const baseType = (0, _getBaseFieldType.getBaseFieldType)(field);
165
93
  const plugin = plugins.find(plugin => plugin.fieldType === baseType);
166
-
167
94
  if (!plugin) {
168
95
  throw new Error(`Cannot update content model because of the unknown "${baseType}" field.`);
169
96
  }
170
-
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);
171
105
  const originalField = originalFields.find(f => f.id === field.id);
172
106
  /**
173
107
  * Field MUST have an fieldId defined.
174
108
  */
175
-
176
109
  if (!field.fieldId) {
177
110
  throw new _error.default(`Field does not have an "fieldId" defined.`, "MISSING_FIELD_ID", {
178
111
  field
@@ -191,12 +124,9 @@ const validateFields = params => {
191
124
  * https://discuss.elastic.co/t/special-characters-in-field-names/10658/3
192
125
  * https://discuss.elastic.co/t/illegal-characters-in-elasticsearch-field-names/17196/2
193
126
  */
194
-
195
-
196
127
  const isLocked = lockedFields.some(lockedField => {
197
- return lockedField.fieldId === field.storageId;
128
+ return lockedField.fieldId === field.storageId || lockedField.fieldId === field.fieldId;
198
129
  });
199
-
200
130
  if (!field.storageId) {
201
131
  /**
202
132
  * In case field is locked, we must set the storageId to the fieldId value.
@@ -225,32 +155,26 @@ const validateFields = params => {
225
155
  * Check the field's fieldId against existing ones.
226
156
  * There cannot be two fields with the same fieldId - outside world identifier.
227
157
  */
228
-
229
-
230
158
  if (fieldIdList.includes(field.fieldId)) {
231
159
  throw new _error.default(`Cannot update content model because field "${field.storageId}" has fieldId "${field.fieldId}", which is already used.`);
232
160
  }
233
-
234
161
  fieldIdList.push(field.fieldId);
235
162
  /**
236
163
  * Check the field's storageId against the existing ones.
237
164
  * There cannot be two fields with the same storageId.
238
165
  */
239
-
240
166
  if (storageIdList.includes(field.storageId)) {
241
167
  throw new _error.default(`Cannot update content model because field "${field.label}" has storageId "${field.storageId}", which is already used.`);
242
168
  }
243
-
244
169
  storageIdList.push(field.storageId);
245
170
  /**
246
171
  * There might be some plugins which allow child fields.
247
172
  * We use this method to validate them as well.
248
173
  */
249
-
250
174
  if (!plugin.validateChildFields) {
251
175
  continue;
252
176
  }
253
-
177
+ const validateChildFields = createValidateChildFields(plugins);
254
178
  plugin.validateChildFields({
255
179
  field,
256
180
  originalField,
@@ -258,29 +182,70 @@ const validateFields = params => {
258
182
  });
259
183
  }
260
184
  };
261
-
262
- 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 => {
263
222
  const {
223
+ models,
264
224
  model,
265
225
  original,
266
- plugins
226
+ context
267
227
  } = params;
268
228
  const {
269
- titleFieldId
229
+ titleFieldId,
230
+ descriptionFieldId,
231
+ imageFieldId
270
232
  } = model;
233
+ const {
234
+ plugins
235
+ } = context;
236
+
271
237
  /**
272
238
  * There should be fields/locked fields in either model or data to be updated.
273
239
  */
274
-
275
240
  const {
276
241
  fields = [],
277
242
  lockedFields = []
278
243
  } = model;
244
+
279
245
  /**
280
246
  * Let's inspect the fields of the received content model. We prevent saving of a content model if it
281
247
  * contains a field for which a "cms-model-field-to-graphql" plugin does not exist on the backend.
282
248
  */
283
-
284
249
  const fieldTypePlugins = plugins.byType("cms-model-field-to-graphql");
285
250
  validateFields({
286
251
  fields,
@@ -288,59 +253,69 @@ const validateModelFields = params => {
288
253
  lockedFields,
289
254
  plugins: fieldTypePlugins
290
255
  });
291
-
292
256
  if (fields.length) {
257
+ const sorterPlugins = plugins.byType(_plugins.CmsGraphQLSchemaSorterPlugin.type);
293
258
  /**
294
259
  * Make sure that this model can be safely converted to a GraphQL SDL
295
260
  */
296
261
  const schema = (0, _createManageSDL.createManageSDL)({
262
+ models,
297
263
  model,
298
264
  fieldTypePlugins: fieldTypePlugins.reduce((acc, pl) => (0, _objectSpread2.default)((0, _objectSpread2.default)({}, acc), {}, {
299
265
  [pl.fieldType]: pl
300
- }), {})
266
+ }), {}),
267
+ sorterPlugins
301
268
  });
302
-
303
269
  try {
304
270
  (0, _graphqlTag.default)(schema);
305
271
  } catch (err) {
306
272
  throw new _error.default(extractInvalidField(model, err));
307
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
+ }
308
292
  }
309
-
310
- 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);
311
296
  const cmsLockedFieldPlugins = plugins.byType("cms-model-locked-field");
297
+
312
298
  /**
313
299
  * We must not allow removal or changes in fields that are already in use in content entries.
314
300
  * Locked fields still have fieldId (should be storageId) because of the old existing locked fields in the models.
315
301
  */
316
-
317
302
  for (const lockedField of lockedFields) {
318
303
  const existingField = fields.find(item => item.storageId === lockedField.fieldId);
304
+
319
305
  /**
320
306
  * Starting with 5.33.0 fields can be deleted.
321
307
  * Our UI gives a warning upon locked field deletion, but if user is managing fields through API directly - we cannot do anything.
322
308
  */
323
-
324
309
  if (!existingField) {
325
- continue; // throw new WebinyError(
326
- // `Cannot remove the field "${lockedField.fieldId}" because it's already in use in created content.`,
327
- // "ENTRY_FIELD_USED",
328
- // {
329
- // lockedField,
330
- // fields
331
- // }
332
- // );
310
+ continue;
333
311
  }
334
-
335
312
  if (lockedField.multipleValues !== existingField.multipleValues) {
336
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", {
337
314
  reason: `"multipleValues" changed`,
338
315
  field: existingField
339
316
  });
340
317
  }
341
-
342
318
  const fieldType = (0, _getBaseFieldType.getBaseFieldType)(existingField);
343
-
344
319
  if (lockedField.type !== fieldType) {
345
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", {
346
321
  reason: `"type" changed`,
@@ -348,18 +323,15 @@ const validateModelFields = params => {
348
323
  existingFieldType: fieldType
349
324
  });
350
325
  }
326
+
351
327
  /**
352
328
  * Check `lockedField` invariant for specific field
353
329
  */
354
-
355
-
356
330
  const lockedFieldsByType = cmsLockedFieldPlugins.filter(pl => pl.fieldType === (0, _getBaseFieldType.getBaseFieldType)(lockedField));
357
-
358
331
  for (const plugin of lockedFieldsByType) {
359
332
  if (typeof plugin.checkLockedField !== "function") {
360
333
  continue;
361
334
  }
362
-
363
335
  plugin.checkLockedField({
364
336
  lockedField,
365
337
  field: existingField
@@ -367,5 +339,4 @@ const validateModelFields = params => {
367
339
  }
368
340
  }
369
341
  };
370
-
371
342
  exports.validateModelFields = validateModelFields;
@@ -1 +1 @@
1
- {"version":3,"names":["defaultTitleFieldId","allowedTitleFieldTypes","getContentModelTitleFieldId","fields","titleFieldId","length","titleField","find","field","getBaseFieldType","multipleValues","fieldId","target","f","WebinyError","includes","type","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","createValidateChildFields","plugins","originalFields","validateFields","lockedFields","params","fieldIdList","storageIdList","validateChildFields","baseType","plugin","fieldType","Error","originalField","id","isLocked","some","lockedField","createFieldStorageId","push","label","validate","validateModelFields","original","fieldTypePlugins","byType","schema","createManageSDL","reduce","acc","pl","gql","cmsLockedFieldPlugins","existingField","item","reason","lockedFieldType","existingFieldType","lockedFieldsByType","filter","checkLockedField"],"sources":["validateModelFields.ts"],"sourcesContent":["import {\n CmsModel,\n CmsModelField,\n CmsModelFieldToGraphQLPlugin,\n CmsModelFieldToGraphQLPluginValidateChildFieldsValidate,\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\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType\";\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 getBaseFieldType(field) === \"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\nconst createValidateChildFields = (\n plugins: CmsModelFieldToGraphQLPlugin[]\n): CmsModelFieldToGraphQLPluginValidateChildFieldsValidate => {\n return ({ fields, originalFields }) => {\n if (fields.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}\nconst validateFields = (params: ValidateFieldsParams) => {\n const { plugins, fields, originalFields, lockedFields } = params;\n\n const fieldIdList: string[] = [];\n\n const storageIdList: string[] = [];\n\n const validateChildFields = createValidateChildFields(plugins);\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 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 * 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 plugin.validateChildFields({\n field,\n originalField,\n validate: validateChildFields\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 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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"}
1
+ {"version":3,"names":["extractInvalidField","model","err","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","gql","getContentModelTitleFieldId","getContentModelDescriptionFieldId","getContentModelImageFieldId","cmsLockedFieldPlugins","existingField","item","multipleValues","reason","lockedFieldType","existingFieldType","lockedFieldsByType","checkLockedField"],"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 (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 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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"}