@webiny/api-headless-cms 6.4.12-beta.5 → 6.5.0-beta.1

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 (275) hide show
  1. package/crud/contentEntry/entryDataValidation.d.ts +1 -1
  2. package/crud/contentEntry/entryDataValidation.js +33 -18
  3. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  4. package/crud/contentEntry.crud.js +12 -39
  5. package/crud/contentEntry.crud.js.map +1 -1
  6. package/crud/contentModel/defaultFields.js +3 -2
  7. package/crud/contentModel/defaultFields.js.map +1 -1
  8. package/crud/contentModel/validate/endingAllowed.js +1 -1
  9. package/crud/contentModel/validate/endingAllowed.js.map +1 -1
  10. package/crud/contentModel/validate/pluralApiName.js +1 -1
  11. package/crud/contentModel/validate/pluralApiName.js.map +1 -1
  12. package/crud/contentModel/validate/singularApiName.js +1 -1
  13. package/crud/contentModel/validate/singularApiName.js.map +1 -1
  14. package/crud/contentModel/validation.js +2 -2
  15. package/crud/contentModel/validation.js.map +1 -1
  16. package/domain/contentModel/schemas.d.ts +4 -0
  17. package/domain/contentModel/schemas.js +5 -2
  18. package/domain/contentModel/schemas.js.map +1 -1
  19. package/domain/contentModel/validation/endingAllowed.js +1 -1
  20. package/domain/contentModel/validation/endingAllowed.js.map +1 -1
  21. package/domain/contentModel/validation/pluralApiName.js +1 -1
  22. package/domain/contentModel/validation/pluralApiName.js.map +1 -1
  23. package/domain/contentModel/validation/singularApiName.js +1 -1
  24. package/domain/contentModel/validation/singularApiName.js.map +1 -1
  25. package/export/crud/exporting.js +2 -2
  26. package/export/crud/exporting.js.map +1 -1
  27. package/export/crud/imports/importGroups.js +2 -1
  28. package/export/crud/imports/importGroups.js.map +1 -1
  29. package/export/crud/imports/validateModels.js +1 -1
  30. package/export/crud/imports/validateModels.js.map +1 -1
  31. package/exports/api/cms/model.d.ts +4 -1
  32. package/exports/api/cms/model.js +2 -0
  33. package/extension.d.ts +3 -0
  34. package/extension.js +19 -0
  35. package/extension.js.map +1 -0
  36. package/features/contentEntry/ContentEntriesFeature.js +2 -0
  37. package/features/contentEntry/ContentEntriesFeature.js.map +1 -1
  38. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js +1 -2
  39. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js.map +1 -1
  40. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.d.ts +1 -3
  41. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js +4 -12
  42. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
  43. package/features/contentEntry/CreateEntryRevisionFrom/abstractions.d.ts +2 -0
  44. package/features/contentEntry/CreateEntryRevisionFrom/abstractions.js.map +1 -1
  45. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js +1 -0
  46. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js.map +1 -1
  47. package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js +1 -3
  48. package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js.map +1 -1
  49. package/features/contentEntry/PublishEntry/PublishEntryUseCase.d.ts +1 -3
  50. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js +4 -10
  51. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
  52. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js +3 -1
  53. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js.map +1 -1
  54. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js +3 -1
  55. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js.map +1 -1
  56. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js +3 -1
  57. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js.map +1 -1
  58. package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.d.ts +14 -0
  59. package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js +34 -0
  60. package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js.map +1 -0
  61. package/features/contentEntry/UpdateRevision/abstractions.d.ts +10 -0
  62. package/features/contentEntry/UpdateRevision/abstractions.js +5 -0
  63. package/features/contentEntry/UpdateRevision/abstractions.js.map +1 -0
  64. package/features/contentEntry/UpdateRevision/feature.d.ts +4 -0
  65. package/features/contentEntry/UpdateRevision/feature.js +11 -0
  66. package/features/contentEntry/UpdateRevision/feature.js.map +1 -0
  67. package/features/contentEntry/UpdateRevision/index.d.ts +1 -0
  68. package/features/contentEntry/UpdateRevision/index.js +1 -0
  69. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.d.ts +2 -2
  70. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js +2 -2
  71. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js.map +1 -1
  72. package/features/contentEntry/ensureItemIds.d.ts +13 -0
  73. package/features/contentEntry/ensureItemIds.js +22 -0
  74. package/features/contentEntry/ensureItemIds.js.map +1 -0
  75. package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.d.ts +3 -1
  76. package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js +9 -3
  77. package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js.map +1 -1
  78. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.d.ts +7 -5
  79. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js +48 -18
  80. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js.map +1 -1
  81. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/abstractions.d.ts +17 -1
  82. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/abstractions.js.map +1 -1
  83. package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/CreatePublishEntryDataFactory.d.ts +5 -3
  84. package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/CreatePublishEntryDataFactory.js +22 -16
  85. package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/CreatePublishEntryDataFactory.js.map +1 -1
  86. package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/abstractions.d.ts +15 -1
  87. package/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/abstractions.js.map +1 -1
  88. package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/CreateRepublishEntryDataFactory.d.ts +5 -3
  89. package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/CreateRepublishEntryDataFactory.js +17 -13
  90. package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/CreateRepublishEntryDataFactory.js.map +1 -1
  91. package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/abstractions.d.ts +13 -1
  92. package/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/abstractions.js.map +1 -1
  93. package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/CreateUnpublishEntryDataFactory.d.ts +6 -6
  94. package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/CreateUnpublishEntryDataFactory.js +17 -18
  95. package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/CreateUnpublishEntryDataFactory.js.map +1 -1
  96. package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/abstractions.d.ts +14 -2
  97. package/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/abstractions.js.map +1 -1
  98. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.d.ts +7 -3
  99. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js +73 -30
  100. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js.map +1 -1
  101. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/abstractions.d.ts +15 -1
  102. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/abstractions.js.map +1 -1
  103. package/features/contentEntry/entryDataFactories/expiresAt.js +2 -2
  104. package/features/contentEntry/entryDataFactories/expiresAt.js.map +1 -1
  105. package/features/contentEntry/entryDataFactories/hasEntryContentChanged.d.ts +24 -0
  106. package/features/contentEntry/entryDataFactories/hasEntryContentChanged.js +13 -0
  107. package/features/contentEntry/entryDataFactories/hasEntryContentChanged.js.map +1 -0
  108. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.d.ts +14 -0
  109. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js +32 -0
  110. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js.map +1 -0
  111. package/features/contentModel/ComponentMapGenerator/abstractions.d.ts +8 -0
  112. package/features/contentModel/ComponentMapGenerator/abstractions.js +5 -0
  113. package/features/contentModel/ComponentMapGenerator/abstractions.js.map +1 -0
  114. package/features/contentModel/ComponentMapGenerator/feature.d.ts +4 -0
  115. package/features/contentModel/ComponentMapGenerator/feature.js +11 -0
  116. package/features/contentModel/ComponentMapGenerator/feature.js.map +1 -0
  117. package/features/contentModel/ComponentMapGenerator/index.d.ts +2 -0
  118. package/features/contentModel/ComponentMapGenerator/index.js +2 -0
  119. package/features/contentModel/ContentModelFeature.js +6 -0
  120. package/features/contentModel/ContentModelFeature.js.map +1 -1
  121. package/features/contentModel/CreateModel/CreateModelRepository.js +2 -1
  122. package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
  123. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +2 -1
  124. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
  125. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.d.ts +19 -0
  126. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js +56 -0
  127. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js.map +1 -0
  128. package/features/contentModel/RefModelsGenerator/abstractions.d.ts +11 -0
  129. package/features/contentModel/RefModelsGenerator/abstractions.js +5 -0
  130. package/features/contentModel/RefModelsGenerator/abstractions.js.map +1 -0
  131. package/features/contentModel/RefModelsGenerator/feature.d.ts +4 -0
  132. package/features/contentModel/RefModelsGenerator/feature.js +11 -0
  133. package/features/contentModel/RefModelsGenerator/feature.js.map +1 -0
  134. package/features/contentModel/RefModelsGenerator/index.d.ts +2 -0
  135. package/features/contentModel/RefModelsGenerator/index.js +2 -0
  136. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.d.ts +16 -0
  137. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js +54 -0
  138. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js.map +1 -0
  139. package/features/contentModel/ValuesSelectionGenerator/abstractions.d.ts +8 -0
  140. package/features/contentModel/ValuesSelectionGenerator/abstractions.js +5 -0
  141. package/features/contentModel/ValuesSelectionGenerator/abstractions.js.map +1 -0
  142. package/features/contentModel/ValuesSelectionGenerator/feature.d.ts +4 -0
  143. package/features/contentModel/ValuesSelectionGenerator/feature.js +11 -0
  144. package/features/contentModel/ValuesSelectionGenerator/feature.js.map +1 -0
  145. package/features/contentModel/ValuesSelectionGenerator/index.d.ts +1 -0
  146. package/features/contentModel/ValuesSelectionGenerator/index.js +1 -0
  147. package/features/graphql/feature.js +2 -0
  148. package/features/graphql/feature.js.map +1 -1
  149. package/features/graphql/fields/base/AssetToGraphQL.d.ts +26 -0
  150. package/features/graphql/fields/base/AssetToGraphQL.js +153 -0
  151. package/features/graphql/fields/base/AssetToGraphQL.js.map +1 -0
  152. package/features/graphql/fields/base/DynamicZoneToGraphQL.js +12 -2
  153. package/features/graphql/fields/base/DynamicZoneToGraphQL.js.map +1 -1
  154. package/features/graphql/fields/base/ObjectToGraphQL.js +8 -5
  155. package/features/graphql/fields/base/ObjectToGraphQL.js.map +1 -1
  156. package/features/modelBuilder/abstractions.d.ts +9 -0
  157. package/features/modelBuilder/abstractions.js.map +1 -1
  158. package/features/modelBuilder/feature.js +2 -0
  159. package/features/modelBuilder/feature.js.map +1 -1
  160. package/features/modelBuilder/fields/AssetFieldType.d.ts +20 -0
  161. package/features/modelBuilder/fields/AssetFieldType.js +46 -0
  162. package/features/modelBuilder/fields/AssetFieldType.js.map +1 -0
  163. package/features/modelBuilder/fields/DataFieldBuilder.d.ts +62 -18
  164. package/features/modelBuilder/fields/DataFieldBuilder.js +8 -0
  165. package/features/modelBuilder/fields/DataFieldBuilder.js.map +1 -1
  166. package/features/modelBuilder/fields/DynamicZoneFieldType.d.ts +1 -0
  167. package/features/modelBuilder/fields/DynamicZoneFieldType.js +2 -6
  168. package/features/modelBuilder/fields/DynamicZoneFieldType.js.map +1 -1
  169. package/features/modelBuilder/fields/resolveAssetUrl.d.ts +35 -0
  170. package/features/modelBuilder/fields/resolveAssetUrl.js +26 -0
  171. package/features/modelBuilder/fields/resolveAssetUrl.js.map +1 -0
  172. package/features/modelBuilder/index.d.ts +1 -1
  173. package/features/modelBuilder/models/BaseModelBuilder.d.ts +3 -1
  174. package/features/modelBuilder/models/BaseModelBuilder.js +7 -0
  175. package/features/modelBuilder/models/BaseModelBuilder.js.map +1 -1
  176. package/features/modelBuilder/models/PrivateModelBuilder.js +2 -1
  177. package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
  178. package/features/modelBuilder/models/PublicModelBuilder.js +2 -1
  179. package/features/modelBuilder/models/PublicModelBuilder.js.map +1 -1
  180. package/features/sortMapper/SortMapper.js +2 -5
  181. package/features/sortMapper/SortMapper.js.map +1 -1
  182. package/features/storage/fields/CompressedTextStorageTransform.js +1 -1
  183. package/features/storage/fields/CompressedTextStorageTransform.js.map +1 -1
  184. package/features/storage/fields/DateStorageTransform.js +4 -3
  185. package/features/storage/fields/DateStorageTransform.js.map +1 -1
  186. package/features/storage/fields/DynamicZoneStorageTransform.js +2 -2
  187. package/features/storage/fields/DynamicZoneStorageTransform.js.map +1 -1
  188. package/features/storage/fields/JsonStorageTransform.js +1 -1
  189. package/features/storage/fields/JsonStorageTransform.js.map +1 -1
  190. package/features/storage/fields/LongTextStorageTransform.js +1 -1
  191. package/features/storage/fields/LongTextStorageTransform.js.map +1 -1
  192. package/features/storage/fields/ObjectStorageTransform.js +27 -7
  193. package/features/storage/fields/ObjectStorageTransform.js.map +1 -1
  194. package/features/storage/fields/RichTextStorageTransform.js +1 -1
  195. package/features/storage/fields/RichTextStorageTransform.js.map +1 -1
  196. package/features/validation/validators/DateGteValidator.js +1 -1
  197. package/features/validation/validators/DateGteValidator.js.map +1 -1
  198. package/features/validation/validators/DateLteValidator.js +1 -1
  199. package/features/validation/validators/DateLteValidator.js.map +1 -1
  200. package/features/validation/validators/PatternValidator.js +1 -1
  201. package/features/validation/validators/PatternValidator.js.map +1 -1
  202. package/features/whereMapper/WhereMapper.js +10 -7
  203. package/features/whereMapper/WhereMapper.js.map +1 -1
  204. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +8 -2
  205. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
  206. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +8 -2
  207. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  208. package/fieldConverters/index.d.ts +1 -1
  209. package/graphql/getSchema/generateCacheKey.js +1 -1
  210. package/graphql/getSchema/generateCacheKey.js.map +1 -1
  211. package/graphql/scalars/RevisionId.js +1 -1
  212. package/graphql/scalars/RevisionId.js.map +1 -1
  213. package/graphql/schema/baseSchema.js +5 -25
  214. package/graphql/schema/baseSchema.js.map +1 -1
  215. package/graphql/schema/cms/getEntryResolver.js +3 -2
  216. package/graphql/schema/cms/getEntryResolver.js.map +1 -1
  217. package/graphql/schema/cms/getModelResolver.d.ts +35 -0
  218. package/graphql/schema/cms/getModelResolver.js +49 -0
  219. package/graphql/schema/cms/getModelResolver.js.map +1 -0
  220. package/graphql/schema/cms/helpers/buildFieldsSelection.js +9 -2
  221. package/graphql/schema/cms/helpers/buildFieldsSelection.js.map +1 -1
  222. package/graphql/schema/cms/helpers/expandFieldWildcards.d.ts +2 -0
  223. package/graphql/schema/cms/helpers/expandFieldWildcards.js +13 -0
  224. package/graphql/schema/cms/helpers/expandFieldWildcards.js.map +1 -0
  225. package/graphql/schema/cms/helpers/index.d.ts +1 -0
  226. package/graphql/schema/cms/helpers/index.js +1 -0
  227. package/graphql/schema/cms/helpers.d.ts +1 -0
  228. package/graphql/schema/cms/helpers.js +1 -0
  229. package/graphql/schema/cms/index.js +2 -1
  230. package/graphql/schema/cms/index.js.map +1 -1
  231. package/graphql/schema/cms/listEntriesResolver.js +3 -2
  232. package/graphql/schema/cms/listEntriesResolver.js.map +1 -1
  233. package/graphql/schema/cms/resolvers/getModel.d.ts +8 -0
  234. package/graphql/schema/cms/resolvers/getModel.js +18 -0
  235. package/graphql/schema/cms/resolvers/getModel.js.map +1 -0
  236. package/graphql/schema/cms/resolvers/index.d.ts +1 -0
  237. package/graphql/schema/cms/resolvers/index.js +1 -0
  238. package/graphql/schema/cms/typeDefs/query.js +1 -0
  239. package/graphql/schema/cms/typeDefs/query.js.map +1 -1
  240. package/graphql/schema/cms/typeDefs/responses.js +5 -0
  241. package/graphql/schema/cms/typeDefs/responses.js.map +1 -1
  242. package/graphql/schema/contentModels.js +40 -1
  243. package/graphql/schema/contentModels.js.map +1 -1
  244. package/graphql/schema/createFieldResolvers.js +1 -1
  245. package/graphql/schema/createFieldResolvers.js.map +1 -1
  246. package/index.d.ts +2 -5
  247. package/index.js +1 -21
  248. package/package.json +27 -30
  249. package/plugins/CmsModelPlugin.js +12 -10
  250. package/plugins/CmsModelPlugin.js.map +1 -1
  251. package/types/fields/dynamicZoneField.d.ts +1 -0
  252. package/types/model.d.ts +6 -0
  253. package/types/modelField.d.ts +13 -0
  254. package/types/types.d.ts +8 -4
  255. package/types/types.js.map +1 -1
  256. package/utils/caching/Cache.js +1 -1
  257. package/utils/caching/Cache.js.map +1 -1
  258. package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.d.ts +28 -0
  259. package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js +324 -0
  260. package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js.map +1 -0
  261. package/utils/contentModelToJsonSchema/index.d.ts +2 -0
  262. package/utils/contentModelToJsonSchema/index.js +1 -0
  263. package/utils/contentModelToJsonSchema/types.d.ts +24 -0
  264. package/utils/contentModelToJsonSchema/types.js +0 -0
  265. package/utils/createModelField.js +2 -1
  266. package/utils/createModelField.js.map +1 -1
  267. package/utils/date.js +1 -1
  268. package/utils/date.js.map +1 -1
  269. package/utils/entryStorage.js +1 -1
  270. package/utils/entryStorage.js.map +1 -1
  271. package/utils/index.d.ts +1 -0
  272. package/utils/index.js +1 -0
  273. package/utils/renderFields.js +1 -1
  274. package/utils/renderFields.js.map +1 -1
  275. package/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/schema/contentModels.js","sources":["../../../src/graphql/schema/contentModels.ts"],"sourcesContent":["import { ErrorResponse, NotFoundError, Response } from \"@webiny/handler-graphql\";\nimport type { CmsContext, CmsModel } from \"~/types/index.js\";\nimport type { Resolvers } from \"@webiny/handler-graphql/types.js\";\nimport type { ICmsGraphQLSchemaPlugin } from \"~/plugins/index.js\";\nimport { createCmsGraphQLSchemaPlugin } from \"~/plugins/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\n\nexport interface CreateModelsSchemaParams {\n context: CmsContext;\n}\n\nexport const createModelsSchema = ({\n context\n}: CreateModelsSchemaParams): ICmsGraphQLSchemaPlugin => {\n const resolvers: Resolvers<CmsContext> = {\n Query: {\n getContentModel: async (_: unknown, args: GenericRecord, context) => {\n try {\n const model = await context.cms.getModel(args.modelId);\n\n if (!model) {\n throw new NotFoundError(`Content model \"${args.modelId}\" was not found!`);\n }\n\n return new Response(model);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n listContentModels: async (_: unknown, args: GenericRecord, context: CmsContext) => {\n try {\n const models = await context.cms.listModels({\n includePrivate: false,\n includePlugins: args?.includePlugins === false ? false : true\n });\n return new Response(models);\n } catch (e) {\n return new ErrorResponse(e);\n }\n }\n },\n CmsContentModelField: {\n renderer: field => {\n // Make sure `settings` is an object.\n if (field.renderer) {\n // We're using `||` here, because we want to use the fallback value for both `undefined` and `null`.\n return { ...field.renderer, settings: field.renderer.settings || {} };\n }\n\n return field.renderer;\n },\n tags(field) {\n // Make sure `tags` are always returned as an array.\n return Array.isArray(field.tags) ? field.tags : [];\n }\n },\n CmsContentModel: {\n tags(model: CmsModel) {\n // Make sure `tags` always contain a `type` tag, to differentiate between models.\n const hasType = (model.tags || []).find(tag => tag.startsWith(\"type:\"));\n\n return hasType ? model.tags : [\"type:model\", ...(model.tags || [])];\n },\n plugin: (model: CmsModel) => {\n return model.isPlugin ?? false;\n }\n }\n };\n\n let manageSchema = \"\";\n if (context.cms.MANAGE) {\n resolvers[\"Mutation\"] = {\n createContentModel: async (_: unknown, args: any, context) => {\n try {\n const model = await context.cms.createModel(args.data);\n return new Response(model);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n createContentModelFrom: async (_: unknown, args: any, context) => {\n try {\n const model = await context.cms.createModelFrom(args.modelId, args.data);\n return new Response(model);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n updateContentModel: async (_: unknown, args: any, context) => {\n const { modelId, data } = args;\n try {\n const model = await context.cms.updateModel(modelId, data);\n return new Response(model);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n deleteContentModel: async (_: unknown, args: any, context) => {\n const { modelId } = args;\n try {\n await context.cms.deleteModel(modelId);\n return new Response(true);\n } catch (e) {\n return new ErrorResponse(e);\n }\n }\n };\n\n manageSchema = /* GraphQL */ `\n input CmsPredefinedValueInput {\n label: String!\n value: String!\n selected: Boolean\n }\n\n input CmsPredefinedValuesInput {\n enabled: Boolean\n values: [CmsPredefinedValueInput]\n }\n input CmsFieldRendererInput {\n name: String\n settings: JSON\n }\n\n input CmsFieldValidationInput {\n name: String!\n message: String\n settings: JSON\n }\n\n input CmsFieldRuleInput {\n type: String!\n target: String!\n operator: String!\n value: JSON\n action: String!\n }\n\n input CmsContentModelFieldInput {\n id: ID!\n label: String!\n help: String\n description: String\n note: String\n placeholder: String\n # we never use user input - this is here to the GraphQL does not break when posting from our UI\n # used for debugging purposes\n storageId: String\n fieldId: String!\n type: String!\n tags: [String!]\n list: Boolean\n predefinedValues: CmsPredefinedValuesInput\n renderer: CmsFieldRendererInput\n validation: [CmsFieldValidationInput]\n listValidation: [CmsFieldValidationInput]\n settings: JSON\n rules: [CmsFieldRuleInput!]\n }\n\n input CmsContentModelCreateInput {\n name: String!\n singularApiName: String!\n pluralApiName: String!\n modelId: String\n group: String!\n icon: Icon\n singleEntry: Boolean\n description: String\n layout: JSON\n fields: [CmsContentModelFieldInput!]\n titleFieldId: String\n descriptionFieldId: String\n imageFieldId: String\n tags: [String!]\n defaultFields: Boolean\n }\n\n input CmsContentModelCreateFromInput {\n name: String!\n singularApiName: String!\n pluralApiName: String!\n modelId: String\n group: String!\n icon: Icon\n description: String\n }\n\n input CmsContentModelUpdateInput {\n name: String\n singularApiName: String\n pluralApiName: String\n group: String\n icon: Icon\n description: String\n layout: JSON!\n fields: [CmsContentModelFieldInput!]!\n titleFieldId: String\n descriptionFieldId: String\n imageFieldId: String\n tags: [String!]\n }\n\n extend type Mutation {\n createContentModel(data: CmsContentModelCreateInput!): CmsContentModelResponse\n\n createContentModelFrom(\n modelId: ID!\n data: CmsContentModelCreateFromInput!\n ): CmsContentModelResponse\n\n updateContentModel(\n modelId: ID!\n data: CmsContentModelUpdateInput!\n ): CmsContentModelResponse\n\n deleteContentModel(modelId: ID!): CmsDeleteResponse\n }\n `;\n }\n\n const plugin = createCmsGraphQLSchemaPlugin({\n typeDefs: /* GraphQL */ `\n type CmsFieldValidation {\n name: String!\n message: String\n settings: JSON\n }\n\n type CmsFieldRenderer {\n name: String\n settings: JSON\n }\n\n type CmsPredefinedValue {\n label: String\n value: String\n selected: Boolean\n }\n\n type CmsPredefinedValues {\n enabled: Boolean\n values: [CmsPredefinedValue]\n }\n\n type CmsFieldRule {\n type: String!\n target: String!\n operator: String!\n value: JSON\n action: String!\n }\n\n type CmsContentModelField {\n id: ID!\n # auto-generated value\n # used for debugging purposes\n storageId: String\n fieldId: String!\n label: String!\n help: String\n description: String\n note: String\n placeholder: String\n type: String!\n tags: [String!]!\n list: Boolean\n predefinedValues: CmsPredefinedValues\n renderer: CmsFieldRenderer\n validation: [CmsFieldValidation!]\n listValidation: [CmsFieldValidation!]\n settings: JSON\n rules: [CmsFieldRule!]\n }\n\n type CmsContentModel {\n name: String!\n singularApiName: String!\n pluralApiName: String!\n modelId: String!\n description: String\n group: String!\n icon: Icon\n createdOn: DateTime\n savedOn: DateTime\n createdBy: CmsIdentity\n fields: [CmsContentModelField!]!\n layout: JSON!\n titleFieldId: String\n descriptionFieldId: String\n imageFieldId: String\n tags: [String!]!\n tenant: String!\n # Returns true if the content model is registered via a plugin.\n plugin: Boolean!\n }\n\n type CmsContentModelResponse {\n data: CmsContentModel\n error: CmsError\n }\n\n type CmsContentModelListResponse {\n data: [CmsContentModel]\n meta: CmsListMeta\n error: CmsError\n }\n\n extend type Query {\n getContentModel(modelId: ID!, where: JSON, sort: String): CmsContentModelResponse\n\n listContentModels(includePlugins: Boolean = true): CmsContentModelListResponse\n }\n\n ${manageSchema}\n `,\n resolvers\n });\n plugin.name = `headless-cms.graphql.schema.${context.cms.type}.content-models`;\n return plugin;\n};\n"],"names":["createModelsSchema","context","resolvers","_","args","model","NotFoundError","Response","e","ErrorResponse","models","field","Array","hasType","tag","manageSchema","modelId","data","plugin","createCmsGraphQLSchemaPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"graphql/schema/contentModels.js","sources":["../../../src/graphql/schema/contentModels.ts"],"sourcesContent":["import { ErrorResponse, NotFoundError, Response } from \"@webiny/handler-graphql\";\nimport type { CmsContext, CmsModel } from \"~/types/index.js\";\nimport type { Resolvers } from \"@webiny/handler-graphql/types.js\";\nimport type { ICmsGraphQLSchemaPlugin } from \"~/plugins/index.js\";\nimport { createCmsGraphQLSchemaPlugin } from \"~/plugins/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { ValuesSelectionGenerator } from \"~/features/contentModel/ValuesSelectionGenerator/abstractions.js\";\nimport { ComponentMapGenerator } from \"~/features/contentModel/ComponentMapGenerator/abstractions.js\";\nimport { RefModelsGenerator } from \"~/features/contentModel/RefModelsGenerator/abstractions.js\";\n\nexport interface CreateModelsSchemaParams {\n context: CmsContext;\n}\n\nexport const createModelsSchema = ({\n context\n}: CreateModelsSchemaParams): ICmsGraphQLSchemaPlugin => {\n const resolvers: Resolvers<CmsContext> = {\n Query: {\n getContentModel: async (_: unknown, args: GenericRecord, context) => {\n try {\n const model = await context.cms.getModel(args.modelId);\n\n if (!model) {\n throw new NotFoundError(`Content model \"${args.modelId}\" was not found!`);\n }\n\n return new Response(model);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n listContentModels: async (_: unknown, args: GenericRecord, context: CmsContext) => {\n try {\n const models = await context.cms.listModels({\n includePrivate: false,\n includePlugins: args?.includePlugins === false ? false : true\n });\n return new Response(models);\n } catch (e) {\n return new ErrorResponse(e);\n }\n }\n },\n CmsContentModelField: {\n renderer: field => {\n // Make sure `settings` is an object.\n if (field.renderer) {\n // We're using `||` here, because we want to use the fallback value for both `undefined` and `null`.\n return { ...field.renderer, settings: field.renderer.settings || {} };\n }\n\n return field.renderer;\n },\n tags(field) {\n // Make sure `tags` are always returned as an array.\n return Array.isArray(field.tags) ? field.tags : [];\n }\n },\n CmsContentModelMetadata: {\n valuesSelection: (model: CmsModel, _: unknown, ctx: CmsContext) => {\n const generator = ctx.container.resolve(ValuesSelectionGenerator);\n return generator.generate(model);\n },\n componentMap: (model: CmsModel, _: unknown, ctx: CmsContext) => {\n const generator = ctx.container.resolve(ComponentMapGenerator);\n return generator.generate(model);\n },\n refModels: async (model: CmsModel, _: unknown, ctx: CmsContext) => {\n const generator = ctx.container.resolve(RefModelsGenerator);\n return generator.generate(model);\n }\n },\n CmsContentModel: {\n metadata: (model: CmsModel) => model,\n tags(model: CmsModel) {\n // Make sure `tags` always contain a `type` tag, to differentiate between models.\n const hasType = (model.tags || []).find(tag => tag.startsWith(\"type:\"));\n\n return hasType ? model.tags : [\"type:model\", ...(model.tags || [])];\n },\n plugin: (model: CmsModel) => {\n return model.isPlugin ?? false;\n },\n valuesSelection: (model: CmsModel, _: unknown, ctx: CmsContext) => {\n const generator = ctx.container.resolve(ValuesSelectionGenerator);\n return generator.generate(model);\n }\n }\n };\n\n let manageSchema = \"\";\n if (context.cms.MANAGE) {\n resolvers[\"Mutation\"] = {\n createContentModel: async (_: unknown, args: any, context) => {\n try {\n const model = await context.cms.createModel(args.data);\n return new Response(model);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n createContentModelFrom: async (_: unknown, args: any, context) => {\n try {\n const model = await context.cms.createModelFrom(args.modelId, args.data);\n return new Response(model);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n updateContentModel: async (_: unknown, args: any, context) => {\n const { modelId, data } = args;\n try {\n const model = await context.cms.updateModel(modelId, data);\n return new Response(model);\n } catch (e) {\n return new ErrorResponse(e);\n }\n },\n deleteContentModel: async (_: unknown, args: any, context) => {\n const { modelId } = args;\n try {\n await context.cms.deleteModel(modelId);\n return new Response(true);\n } catch (e) {\n return new ErrorResponse(e);\n }\n }\n };\n\n manageSchema = /* GraphQL */ `\n input CmsPredefinedValueInput {\n label: String!\n value: String!\n selected: Boolean\n }\n\n input CmsPredefinedValuesInput {\n enabled: Boolean\n values: [CmsPredefinedValueInput]\n }\n input CmsFieldRendererInput {\n name: String\n settings: JSON\n }\n\n input CmsFieldValidationInput {\n name: String!\n message: String\n settings: JSON\n }\n\n input CmsFieldRuleInput {\n type: String!\n target: String!\n operator: String!\n value: JSON\n action: String!\n }\n\n input CmsContentModelFieldInput {\n id: ID!\n label: String!\n help: String\n description: String\n note: String\n placeholder: String\n # we never use user input - this is here to the GraphQL does not break when posting from our UI\n # used for debugging purposes\n storageId: String\n fieldId: String!\n type: String!\n tags: [String!]\n list: Boolean\n disabled: Boolean\n predefinedValues: CmsPredefinedValuesInput\n renderer: CmsFieldRendererInput\n validation: [CmsFieldValidationInput]\n listValidation: [CmsFieldValidationInput]\n settings: JSON\n rules: [CmsFieldRuleInput!]\n }\n\n input CmsContentModelCreateInput {\n name: String!\n singularApiName: String!\n pluralApiName: String!\n modelId: String\n group: String!\n icon: Icon\n singleEntry: Boolean\n description: String\n layout: JSON\n fields: [CmsContentModelFieldInput!]\n titleFieldId: String\n descriptionFieldId: String\n imageFieldId: String\n tags: [String!]\n defaultFields: Boolean\n settings: JSON\n }\n\n input CmsContentModelCreateFromInput {\n name: String!\n singularApiName: String!\n pluralApiName: String!\n modelId: String\n group: String!\n icon: Icon\n description: String\n }\n\n input CmsContentModelUpdateInput {\n name: String\n singularApiName: String\n pluralApiName: String\n group: String\n icon: Icon\n description: String\n layout: JSON!\n fields: [CmsContentModelFieldInput!]!\n titleFieldId: String\n descriptionFieldId: String\n imageFieldId: String\n tags: [String!]\n settings: JSON\n }\n\n extend type Mutation {\n createContentModel(data: CmsContentModelCreateInput!): CmsContentModelResponse\n\n createContentModelFrom(\n modelId: ID!\n data: CmsContentModelCreateFromInput!\n ): CmsContentModelResponse\n\n updateContentModel(\n modelId: ID!\n data: CmsContentModelUpdateInput!\n ): CmsContentModelResponse\n\n deleteContentModel(modelId: ID!): CmsDeleteResponse\n }\n `;\n }\n\n const plugin = createCmsGraphQLSchemaPlugin({\n typeDefs: /* GraphQL */ `\n type CmsFieldValidation {\n name: String!\n message: String\n settings: JSON\n }\n\n type CmsFieldRenderer {\n name: String\n settings: JSON\n }\n\n type CmsPredefinedValue {\n label: String\n value: String\n selected: Boolean\n }\n\n type CmsPredefinedValues {\n enabled: Boolean\n values: [CmsPredefinedValue]\n }\n\n type CmsFieldRule {\n type: String!\n target: String!\n operator: String!\n value: JSON\n action: String!\n }\n\n type CmsContentModelField {\n id: ID!\n # auto-generated value\n # used for debugging purposes\n storageId: String\n fieldId: String!\n label: String!\n help: String\n description: String\n note: String\n placeholder: String\n type: String!\n tags: [String!]!\n list: Boolean\n disabled: Boolean\n predefinedValues: CmsPredefinedValues\n renderer: CmsFieldRenderer\n validation: [CmsFieldValidation!]\n listValidation: [CmsFieldValidation!]\n settings: JSON\n rules: [CmsFieldRule!]\n }\n\n type CmsContentModelRefModel {\n valuesSelection: String\n }\n\n type CmsContentModelMetadata {\n valuesSelection: String\n componentMap: JSON\n refModels: JSON\n }\n\n type CmsContentModel {\n name: String!\n singularApiName: String!\n pluralApiName: String!\n modelId: String!\n description: String\n group: String!\n icon: Icon\n createdOn: DateTime\n savedOn: DateTime\n createdBy: CmsIdentity\n fields: [CmsContentModelField!]!\n layout: JSON!\n titleFieldId: String\n descriptionFieldId: String\n imageFieldId: String\n tags: [String!]!\n tenant: String!\n settings: JSON\n # Returns true if the content model is registered via a plugin.\n plugin: Boolean!\n valuesSelection: String\n metadata: CmsContentModelMetadata\n }\n\n type CmsContentModelResponse {\n data: CmsContentModel\n error: CmsError\n }\n\n type CmsContentModelListResponse {\n data: [CmsContentModel]\n meta: CmsListMeta\n error: CmsError\n }\n\n extend type Query {\n getContentModel(modelId: ID!, where: JSON, sort: String): CmsContentModelResponse\n\n listContentModels(includePlugins: Boolean = true): CmsContentModelListResponse\n }\n\n ${manageSchema}\n `,\n resolvers\n });\n plugin.name = `headless-cms.graphql.schema.${context.cms.type}.content-models`;\n return plugin;\n};\n"],"names":["createModelsSchema","context","resolvers","_","args","model","NotFoundError","Response","e","ErrorResponse","models","field","Array","ctx","generator","ValuesSelectionGenerator","ComponentMapGenerator","RefModelsGenerator","hasType","tag","manageSchema","modelId","data","plugin","createCmsGraphQLSchemaPlugin"],"mappings":"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"}
@@ -26,7 +26,7 @@ const createFieldResolversFactory = (factoryParams)=>{
26
26
  fieldRegistry
27
27
  }) : null;
28
28
  if (false === fieldResolver) continue;
29
- else if ("function" == typeof fieldResolver) resolver = fieldResolver;
29
+ if ("function" == typeof fieldResolver) resolver = fieldResolver;
30
30
  else if (fieldResolver) {
31
31
  resolver = fieldResolver.resolver;
32
32
  Object.assign(typeResolvers, fieldResolver.typeResolvers);
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/schema/createFieldResolvers.js","sources":["../../../src/graphql/schema/createFieldResolvers.ts"],"sourcesContent":["import set from \"lodash/set.js\";\nimport type { Resolvers } from \"@webiny/handler-graphql/types.js\";\nimport WebinyError from \"@webiny/error\";\nimport type { ApiEndpoint, CmsContext, CmsModel, CmsModelField } from \"~/types/index.js\";\nimport { entryFieldFromStorageTransform } from \"~/utils/entryStorage.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\nimport type {\n CmsModelFieldToGraphQL,\n CmsModelFieldToGraphQLRegistry\n} from \"~/features/graphql/index.js\";\n\ninterface CreateFieldResolvers {\n graphQLType: string;\n fields: CmsModelField[];\n isRoot: boolean;\n extraResolvers?: Resolvers<any>;\n}\n\ninterface CreateFieldResolversFactoryParams {\n endpointType: ApiEndpoint;\n models: CmsModel[];\n model: CmsModel;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\n\n/**\n * We use a factory to avoid passing the parameters for recursive invocations.\n * This way they will always be in the function scope, and we can only pass \"fields\".\n */\nexport const createFieldResolversFactory = (factoryParams: CreateFieldResolversFactoryParams) => {\n const { endpointType, models, model, fieldRegistry } = factoryParams;\n return function createFieldResolvers(params: CreateFieldResolvers) {\n const { graphQLType, fields, isRoot = false, extraResolvers = {} } = params;\n\n const fieldResolvers: Resolvers<any> = {};\n const typeResolvers = {};\n\n for (const field of fields) {\n const plugin = fieldRegistry.get(getBaseFieldType(field));\n if (!plugin) {\n continue;\n }\n /**\n * Field that is passed into this factory MUST have fieldId, so filter it before the method call.\n */\n if (!field.fieldId) {\n throw new WebinyError(\n \"Field is missing an `fieldId`. Cannot process field without the `fieldId` in the resolvers.\",\n \"FIELD_ID_ERROR\",\n {\n field\n }\n );\n }\n\n const api: CmsModelFieldToGraphQL.ReadApi | CmsModelFieldToGraphQL.ManageApi =\n endpointType === \"manage\" ? plugin.manage : plugin.read;\n const createResolver = api?.createResolver || null;\n\n let resolver: any;\n const fieldResolver = createResolver\n ? createResolver({\n graphQLType,\n models,\n model,\n field,\n createFieldResolvers,\n fieldRegistry\n })\n : null;\n\n /**\n * When fieldResolver is false it will completely skip adding field fieldId into the resolvers.\n * This is to fix the breaking of GraphQL schema.\n */\n if (fieldResolver === false) {\n continue;\n } else if (typeof fieldResolver === \"function\") {\n resolver = fieldResolver;\n } else if (fieldResolver) {\n resolver = fieldResolver.resolver;\n Object.assign(typeResolvers, fieldResolver.typeResolvers);\n }\n\n const { fieldId } = field;\n /**\n * Figure out a better way to extract value from parent.\n * // TODO fix\n */\n const getValue = (parent: any) => {\n if (!parent?.values || !parent?.values[fieldId]) {\n return {\n isRoot: false,\n value: parent?.[fieldId]\n };\n }\n return {\n isRoot: true,\n value: parent.values[fieldId]\n };\n };\n\n fieldResolvers[fieldId] = async (parent, args, context: CmsContext, info) => {\n /**\n * This is required because due to ref field can be requested without the populated data.\n * At that point there is no .values no fieldId property on the parent\n */\n const { isRoot: valueIsRoot, value } = getValue(parent);\n if (value === undefined) {\n return undefined;\n }\n // Get transformed value (eg. data decompression)\n const transformedValue = await entryFieldFromStorageTransform({\n context,\n model,\n field,\n value\n });\n\n set(\n valueIsRoot && parent.values ? parent.values : parent,\n fieldId,\n transformedValue\n );\n\n if (!resolver) {\n return valueIsRoot && parent.values[fieldId]\n ? parent.values[fieldId]\n : parent[fieldId];\n }\n\n return await resolver(valueIsRoot ? parent.values : parent, args, context, info);\n };\n }\n\n /**\n * Difference between root and non-root (object and dz, etc... fields) is that root has a values wrapper.\n * Subtypes must not have it.\n */\n if (!isRoot) {\n return {\n [graphQLType]: {\n ...fieldResolvers,\n ...extraResolvers\n },\n ...typeResolvers\n };\n }\n\n return {\n [graphQLType]: {\n ...extraResolvers\n },\n [`${graphQLType}Values`]: fieldResolvers,\n ...typeResolvers\n };\n };\n};\n"],"names":["createFieldResolversFactory","factoryParams","endpointType","models","model","fieldRegistry","createFieldResolvers","params","graphQLType","fields","isRoot","extraResolvers","fieldResolvers","typeResolvers","field","plugin","getBaseFieldType","WebinyError","api","createResolver","resolver","fieldResolver","Object","fieldId","getValue","parent","args","context","info","valueIsRoot","value","undefined","transformedValue","entryFieldFromStorageTransform","set"],"mappings":";;;;AA6BO,MAAMA,8BAA8B,CAACC;IACxC,MAAM,EAAEC,YAAY,EAAEC,MAAM,EAAEC,KAAK,EAAEC,aAAa,EAAE,GAAGJ;IACvD,OAAO,SAASK,qBAAqBC,MAA4B;QAC7D,MAAM,EAAEC,WAAW,EAAEC,MAAM,EAAEC,SAAS,KAAK,EAAEC,iBAAiB,CAAC,CAAC,EAAE,GAAGJ;QAErE,MAAMK,iBAAiC,CAAC;QACxC,MAAMC,gBAAgB,CAAC;QAEvB,KAAK,MAAMC,SAASL,OAAQ;YACxB,MAAMM,SAASV,cAAc,GAAG,CAACW,iBAAiBF;YAClD,IAAI,CAACC,QACD;YAKJ,IAAI,CAACD,MAAM,OAAO,EACd,MAAM,IAAIG,MACN,+FACA,kBACA;gBACIH;YACJ;YAIR,MAAMI,MACFhB,AAAiB,aAAjBA,eAA4Ba,OAAO,MAAM,GAAGA,OAAO,IAAI;YAC3D,MAAMI,iBAAiBD,KAAK,kBAAkB;YAE9C,IAAIE;YACJ,MAAMC,gBAAgBF,iBAChBA,eAAe;gBACXX;gBACAL;gBACAC;gBACAU;gBACAR;gBACAD;YACJ,KACA;YAMN,IAAIgB,AAAkB,UAAlBA,eACA;iBACG,IAAI,AAAyB,cAAzB,OAAOA,eACdD,WAAWC;iBACR,IAAIA,eAAe;gBACtBD,WAAWC,cAAc,QAAQ;gBACjCC,OAAO,MAAM,CAACT,eAAeQ,cAAc,aAAa;YAC5D;YAEA,MAAM,EAAEE,OAAO,EAAE,GAAGT;YAKpB,MAAMU,WAAW,CAACC;gBACd,IAAI,CAACA,QAAQ,UAAU,CAACA,QAAQ,MAAM,CAACF,QAAQ,EAC3C,OAAO;oBACH,QAAQ;oBACR,OAAOE,QAAQ,CAACF,QAAQ;gBAC5B;gBAEJ,OAAO;oBACH,QAAQ;oBACR,OAAOE,OAAO,MAAM,CAACF,QAAQ;gBACjC;YACJ;YAEAX,cAAc,CAACW,QAAQ,GAAG,OAAOE,QAAQC,MAAMC,SAAqBC;gBAKhE,MAAM,EAAE,QAAQC,WAAW,EAAEC,KAAK,EAAE,GAAGN,SAASC;gBAChD,IAAIK,AAAUC,WAAVD,OACA;gBAGJ,MAAME,mBAAmB,MAAMC,+BAA+B;oBAC1DN;oBACAvB;oBACAU;oBACAgB;gBACJ;gBAEAI,IACIL,eAAeJ,OAAO,MAAM,GAAGA,OAAO,MAAM,GAAGA,QAC/CF,SACAS;gBAGJ,IAAI,CAACZ,UACD,OAAOS,eAAeJ,OAAO,MAAM,CAACF,QAAQ,GACtCE,OAAO,MAAM,CAACF,QAAQ,GACtBE,MAAM,CAACF,QAAQ;gBAGzB,OAAO,MAAMH,SAASS,cAAcJ,OAAO,MAAM,GAAGA,QAAQC,MAAMC,SAASC;YAC/E;QACJ;QAMA,IAAI,CAAClB,QACD,OAAO;YACH,CAACF,YAAY,EAAE;gBACX,GAAGI,cAAc;gBACjB,GAAGD,cAAc;YACrB;YACA,GAAGE,aAAa;QACpB;QAGJ,OAAO;YACH,CAACL,YAAY,EAAE;gBACX,GAAGG,cAAc;YACrB;YACA,CAAC,GAAGH,YAAY,MAAM,CAAC,CAAC,EAAEI;YAC1B,GAAGC,aAAa;QACpB;IACJ;AACJ"}
1
+ {"version":3,"file":"graphql/schema/createFieldResolvers.js","sources":["../../../src/graphql/schema/createFieldResolvers.ts"],"sourcesContent":["import set from \"lodash/set.js\";\nimport type { Resolvers } from \"@webiny/handler-graphql/types.js\";\nimport WebinyError from \"@webiny/error\";\nimport type { ApiEndpoint, CmsContext, CmsModel, CmsModelField } from \"~/types/index.js\";\nimport { entryFieldFromStorageTransform } from \"~/utils/entryStorage.js\";\nimport { getBaseFieldType } from \"~/utils/getBaseFieldType.js\";\nimport type {\n CmsModelFieldToGraphQL,\n CmsModelFieldToGraphQLRegistry\n} from \"~/features/graphql/index.js\";\n\ninterface CreateFieldResolvers {\n graphQLType: string;\n fields: CmsModelField[];\n isRoot: boolean;\n extraResolvers?: Resolvers<any>;\n}\n\ninterface CreateFieldResolversFactoryParams {\n endpointType: ApiEndpoint;\n models: CmsModel[];\n model: CmsModel;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\n\n/**\n * We use a factory to avoid passing the parameters for recursive invocations.\n * This way they will always be in the function scope, and we can only pass \"fields\".\n */\nexport const createFieldResolversFactory = (factoryParams: CreateFieldResolversFactoryParams) => {\n const { endpointType, models, model, fieldRegistry } = factoryParams;\n return function createFieldResolvers(params: CreateFieldResolvers) {\n const { graphQLType, fields, isRoot = false, extraResolvers = {} } = params;\n\n const fieldResolvers: Resolvers<any> = {};\n const typeResolvers = {};\n\n for (const field of fields) {\n const plugin = fieldRegistry.get(getBaseFieldType(field));\n if (!plugin) {\n continue;\n }\n /**\n * Field that is passed into this factory MUST have fieldId, so filter it before the method call.\n */\n if (!field.fieldId) {\n throw new WebinyError(\n \"Field is missing an `fieldId`. Cannot process field without the `fieldId` in the resolvers.\",\n \"FIELD_ID_ERROR\",\n {\n field\n }\n );\n }\n\n const api: CmsModelFieldToGraphQL.ReadApi | CmsModelFieldToGraphQL.ManageApi =\n endpointType === \"manage\" ? plugin.manage : plugin.read;\n const createResolver = api?.createResolver || null;\n\n let resolver: any;\n const fieldResolver = createResolver\n ? createResolver({\n graphQLType,\n models,\n model,\n field,\n createFieldResolvers,\n fieldRegistry\n })\n : null;\n\n /**\n * When fieldResolver is false it will completely skip adding field fieldId into the resolvers.\n * This is to fix the breaking of GraphQL schema.\n */\n if (fieldResolver === false) {\n continue;\n } else if (typeof fieldResolver === \"function\") {\n resolver = fieldResolver;\n } else if (fieldResolver) {\n resolver = fieldResolver.resolver;\n Object.assign(typeResolvers, fieldResolver.typeResolvers);\n }\n\n const { fieldId } = field;\n /**\n * Figure out a better way to extract value from parent.\n * // TODO fix\n */\n const getValue = (parent: any) => {\n if (!parent?.values || !parent?.values[fieldId]) {\n return {\n isRoot: false,\n value: parent?.[fieldId]\n };\n }\n return {\n isRoot: true,\n value: parent.values[fieldId]\n };\n };\n\n fieldResolvers[fieldId] = async (parent, args, context: CmsContext, info) => {\n /**\n * This is required because due to ref field can be requested without the populated data.\n * At that point there is no .values no fieldId property on the parent\n */\n const { isRoot: valueIsRoot, value } = getValue(parent);\n if (value === undefined) {\n return undefined;\n }\n // Get transformed value (eg. data decompression)\n const transformedValue = await entryFieldFromStorageTransform({\n context,\n model,\n field,\n value\n });\n\n set(\n valueIsRoot && parent.values ? parent.values : parent,\n fieldId,\n transformedValue\n );\n\n if (!resolver) {\n return valueIsRoot && parent.values[fieldId]\n ? parent.values[fieldId]\n : parent[fieldId];\n }\n\n return await resolver(valueIsRoot ? parent.values : parent, args, context, info);\n };\n }\n\n /**\n * Difference between root and non-root (object and dz, etc... fields) is that root has a values wrapper.\n * Subtypes must not have it.\n */\n if (!isRoot) {\n return {\n [graphQLType]: {\n ...fieldResolvers,\n ...extraResolvers\n },\n ...typeResolvers\n };\n }\n\n return {\n [graphQLType]: {\n ...extraResolvers\n },\n [`${graphQLType}Values`]: fieldResolvers,\n ...typeResolvers\n };\n };\n};\n"],"names":["createFieldResolversFactory","factoryParams","endpointType","models","model","fieldRegistry","createFieldResolvers","params","graphQLType","fields","isRoot","extraResolvers","fieldResolvers","typeResolvers","field","plugin","getBaseFieldType","WebinyError","api","createResolver","resolver","fieldResolver","Object","fieldId","getValue","parent","args","context","info","valueIsRoot","value","undefined","transformedValue","entryFieldFromStorageTransform","set"],"mappings":";;;;AA6BO,MAAMA,8BAA8B,CAACC;IACxC,MAAM,EAAEC,YAAY,EAAEC,MAAM,EAAEC,KAAK,EAAEC,aAAa,EAAE,GAAGJ;IACvD,OAAO,SAASK,qBAAqBC,MAA4B;QAC7D,MAAM,EAAEC,WAAW,EAAEC,MAAM,EAAEC,SAAS,KAAK,EAAEC,iBAAiB,CAAC,CAAC,EAAE,GAAGJ;QAErE,MAAMK,iBAAiC,CAAC;QACxC,MAAMC,gBAAgB,CAAC;QAEvB,KAAK,MAAMC,SAASL,OAAQ;YACxB,MAAMM,SAASV,cAAc,GAAG,CAACW,iBAAiBF;YAClD,IAAI,CAACC,QACD;YAKJ,IAAI,CAACD,MAAM,OAAO,EACd,MAAM,IAAIG,MACN,+FACA,kBACA;gBACIH;YACJ;YAIR,MAAMI,MACFhB,AAAiB,aAAjBA,eAA4Ba,OAAO,MAAM,GAAGA,OAAO,IAAI;YAC3D,MAAMI,iBAAiBD,KAAK,kBAAkB;YAE9C,IAAIE;YACJ,MAAMC,gBAAgBF,iBAChBA,eAAe;gBACXX;gBACAL;gBACAC;gBACAU;gBACAR;gBACAD;YACJ,KACA;YAMN,IAAIgB,AAAkB,UAAlBA,eACA;YACG,IAAI,AAAyB,cAAzB,OAAOA,eACdD,WAAWC;iBACR,IAAIA,eAAe;gBACtBD,WAAWC,cAAc,QAAQ;gBACjCC,OAAO,MAAM,CAACT,eAAeQ,cAAc,aAAa;YAC5D;YAEA,MAAM,EAAEE,OAAO,EAAE,GAAGT;YAKpB,MAAMU,WAAW,CAACC;gBACd,IAAI,CAACA,QAAQ,UAAU,CAACA,QAAQ,MAAM,CAACF,QAAQ,EAC3C,OAAO;oBACH,QAAQ;oBACR,OAAOE,QAAQ,CAACF,QAAQ;gBAC5B;gBAEJ,OAAO;oBACH,QAAQ;oBACR,OAAOE,OAAO,MAAM,CAACF,QAAQ;gBACjC;YACJ;YAEAX,cAAc,CAACW,QAAQ,GAAG,OAAOE,QAAQC,MAAMC,SAAqBC;gBAKhE,MAAM,EAAE,QAAQC,WAAW,EAAEC,KAAK,EAAE,GAAGN,SAASC;gBAChD,IAAIK,AAAUC,WAAVD,OACA;gBAGJ,MAAME,mBAAmB,MAAMC,+BAA+B;oBAC1DN;oBACAvB;oBACAU;oBACAgB;gBACJ;gBAEAI,IACIL,eAAeJ,OAAO,MAAM,GAAGA,OAAO,MAAM,GAAGA,QAC/CF,SACAS;gBAGJ,IAAI,CAACZ,UACD,OAAOS,eAAeJ,OAAO,MAAM,CAACF,QAAQ,GACtCE,OAAO,MAAM,CAACF,QAAQ,GACtBE,MAAM,CAACF,QAAQ;gBAGzB,OAAO,MAAMH,SAASS,cAAcJ,OAAO,MAAM,GAAGA,QAAQC,MAAMC,SAASC;YAC/E;QACJ;QAMA,IAAI,CAAClB,QACD,OAAO;YACH,CAACF,YAAY,EAAE;gBACX,GAAGI,cAAc;gBACjB,GAAGD,cAAc;YACrB;YACA,GAAGE,aAAa;QACpB;QAGJ,OAAO;YACH,CAACL,YAAY,EAAE;gBACX,GAAGG,cAAc;YACrB;YACA,CAAC,GAAGH,YAAY,MAAM,CAAC,CAAC,EAAEI;YAC1B,GAAGC,aAAa;QACpB;IACJ;AACJ"}
package/index.d.ts CHANGED
@@ -1,12 +1,9 @@
1
- import type { CreateGraphQLParams } from "./graphql/index.js";
2
1
  import { entryFieldFromStorageTransform, entryFromStorageTransform, entryToStorageTransform } from "./utils/entryStorage.js";
3
- import type { Plugin } from "@webiny/plugins/types.js";
4
2
  export * from "./utils/isHeadlessCmsReady.js";
5
3
  export * from "./utils/createModelField.js";
6
4
  export * from "./graphql/schema/resolvers/manage/normalizeGraphQlInput.js";
7
- export type CreateHeadlessCmsGraphQLParams = CreateGraphQLParams;
8
- export declare const createHeadlessCmsGraphQL: (params?: CreateHeadlessCmsGraphQLParams) => Plugin[];
9
- export declare const createHeadlessCmsContext: () => (import("@webiny/api/index.js").ContextPlugin<import("./types/types.js").CmsContext> | (import("./fieldConverters/CmsModelObjectFieldConverterPlugin.js").CmsModelObjectFieldConverterPlugin | import("./fieldConverters/CmsModelDefaultFieldConverterPlugin.js").CmsModelDefaultFieldConverterPlugin | import("./fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js").CmsModelDynamicZoneFieldConverterPlugin)[])[];
5
+ export { createCmsExtension } from "./extension.js";
6
+ export type { ICreateCmsExtensionParams } from "./extension.js";
10
7
  export * from "./plugins/index.js";
11
8
  export * from "./utils/incrementEntryIdVersion.js";
12
9
  export * from "./graphql/handleRequest.js";
package/index.js CHANGED
@@ -1,9 +1,3 @@
1
- import { createGraphQL } from "./graphql/index.js";
2
- import { createContextParameterPlugin, createHeaderParameterPlugin, createPathParameterPlugin } from "./parameters/index.js";
3
- import { createContextPlugin } from "./context.js";
4
- import { createRevisionIdScalarPlugin } from "./graphql/scalars/RevisionIdScalarPlugin.js";
5
- import { createFieldConverters } from "./fieldConverters/index.js";
6
- import { createExportGraphQL } from "./export/index.js";
7
1
  export * from "./utils/isHeadlessCmsReady.js";
8
2
  export * from "./utils/createModelField.js";
9
3
  export * from "./graphql/schema/resolvers/manage/normalizeGraphQlInput.js";
@@ -12,22 +6,8 @@ export * from "./utils/incrementEntryIdVersion.js";
12
6
  export * from "./graphql/handleRequest.js";
13
7
  export * from "./features/contentEntry/ContentEntryTraverser/ContentEntryTraverser.js";
14
8
  export * from "./utils/contentModelAst/index.js";
15
- const createHeadlessCmsGraphQL = (params = {})=>[
16
- ...createRevisionIdScalarPlugin(),
17
- createPathParameterPlugin(),
18
- createHeaderParameterPlugin(),
19
- createContextParameterPlugin(),
20
- ...createGraphQL(params),
21
- createExportGraphQL()
22
- ];
23
- const createHeadlessCmsContext = ()=>[
24
- createContextPlugin(),
25
- createFieldConverters()
26
- ];
27
9
  export { entryFieldFromStorageTransform, entryFromStorageTransform, entryToStorageTransform } from "./utils/entryStorage.js";
10
+ export { createCmsExtension } from "./extension.js";
28
11
  export { ContentEntryTraverserProvider } from "./features/contentEntry/ContentEntryTraverser/abstractions.js";
29
12
  export { CmsWhereMapper } from "./features/whereMapper/abstractions.js";
30
13
  export { CmsSortMapper } from "./features/sortMapper/abstractions.js";
31
- export { createHeadlessCmsContext, createHeadlessCmsGraphQL };
32
-
33
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms",
3
- "version": "6.4.12-beta.5",
3
+ "version": "6.5.0-beta.1",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -22,48 +22,45 @@
22
22
  ],
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
- "@babel/code-frame": "8.0.6",
26
- "@graphql-tools/merge": "9.2.4",
27
- "@graphql-tools/schema": "10.1.1",
28
- "@webiny/api": "6.4.12-beta.5",
29
- "@webiny/api-core": "6.4.12-beta.5",
30
- "@webiny/di": "1.1.0",
31
- "@webiny/error": "6.4.12-beta.5",
32
- "@webiny/feature": "6.4.12-beta.5",
33
- "@webiny/handler": "6.4.12-beta.5",
34
- "@webiny/handler-aws": "6.4.12-beta.5",
35
- "@webiny/handler-db": "6.4.12-beta.5",
36
- "@webiny/handler-graphql": "6.4.12-beta.5",
37
- "@webiny/plugins": "6.4.12-beta.5",
38
- "@webiny/project": "6.4.12-beta.5",
39
- "@webiny/utils": "6.4.12-beta.5",
40
- "@webiny/validation": "6.4.12-beta.5",
25
+ "@babel/code-frame": "8.0.0",
26
+ "@graphql-tools/merge": "9.2.2",
27
+ "@graphql-tools/schema": "10.0.38",
28
+ "@webiny/api": "6.5.0-beta.1",
29
+ "@webiny/api-core": "6.5.0-beta.1",
30
+ "@webiny/di": "1.0.2",
31
+ "@webiny/error": "6.5.0-beta.1",
32
+ "@webiny/feature": "6.5.0-beta.1",
33
+ "@webiny/handler": "6.5.0-beta.1",
34
+ "@webiny/handler-aws": "6.5.0-beta.1",
35
+ "@webiny/handler-db": "6.5.0-beta.1",
36
+ "@webiny/handler-graphql": "6.5.0-beta.1",
37
+ "@webiny/plugins": "6.5.0-beta.1",
38
+ "@webiny/project": "6.5.0-beta.1",
39
+ "@webiny/utils": "6.5.0-beta.1",
40
+ "@webiny/validation": "6.5.0-beta.1",
41
41
  "dot-prop-immutable": "2.1.1",
42
42
  "graphql": "16.14.2",
43
43
  "graphql-tag": "2.12.7",
44
44
  "lodash": "4.18.1",
45
- "p-map": "7.0.8",
45
+ "p-map": "7.0.6",
46
46
  "p-reduce": "3.0.0",
47
47
  "pluralize": "8.0.0",
48
48
  "slugify": "1.6.9",
49
- "zod": "4.6.5"
49
+ "zod": "4.4.3"
50
50
  },
51
51
  "devDependencies": {
52
- "@types/babel__code-frame": "7.27.0",
53
52
  "@types/pluralize": "0.0.33",
54
- "@webiny/aws-sdk": "6.4.12-beta.5",
55
- "@webiny/build-tools": "6.4.12-beta.5",
56
- "@webiny/db-dynamodb": "6.4.12-beta.5",
57
- "@webiny/handler-db": "6.4.12-beta.5",
58
- "@webiny/project-utils": "6.4.12-beta.5",
59
- "@webiny/sdk": "6.4.12-beta.5",
60
- "@webiny/wcp": "6.4.12-beta.5",
53
+ "@webiny/build-tools": "6.5.0-beta.1",
54
+ "@webiny/handler-db": "6.5.0-beta.1",
55
+ "@webiny/project-utils": "6.5.0-beta.1",
56
+ "@webiny/sdk": "6.5.0-beta.1",
57
+ "@webiny/wcp": "6.5.0-beta.1",
61
58
  "apollo-graphql": "0.9.7",
62
59
  "graphql": "16.14.2",
63
- "oxfmt": "0.68.0",
60
+ "oxfmt": "0.59.0",
64
61
  "rimraf": "6.1.3",
65
- "typescript": "6.0.3",
66
- "vitest": "5.0.1",
62
+ "typescript": "7.0.2",
63
+ "vitest": "4.1.10",
67
64
  "write-json-file": "7.0.0"
68
65
  },
69
66
  "publishConfig": {
@@ -32,7 +32,8 @@ class CmsModelPlugin extends Plugin {
32
32
  name: input.name,
33
33
  pluralApiName,
34
34
  singularApiName,
35
- titleFieldId: "id"
35
+ titleFieldId: "id",
36
+ settings: {}
36
37
  };
37
38
  if (input.noValidate) {
38
39
  delete input["noValidate"];
@@ -126,15 +127,16 @@ class CmsModelPlugin extends Plugin {
126
127
  };
127
128
  for (const field of model.fields){
128
129
  const total = countFieldInLayout(field.id, model.layout);
129
- if (1 === total) continue;
130
- else if (total > 1) throw new error(`Field "${field.id}" is in more than one layout cell.`, "DUPLICATE_FIELD_IN_LAYOUT", {
131
- model,
132
- field
133
- });
134
- throw new error(`Missing field "${field.id}" in layout.`, "MISSING_FIELD_IN_LAYOUT", {
135
- model,
136
- field
137
- });
130
+ if (1 !== total) {
131
+ if (total > 1) throw new error(`Field "${field.id}" is in more than one layout cell.`, "DUPLICATE_FIELD_IN_LAYOUT", {
132
+ model,
133
+ field
134
+ });
135
+ throw new error(`Missing field "${field.id}" in layout.`, "MISSING_FIELD_IN_LAYOUT", {
136
+ model,
137
+ field
138
+ });
139
+ }
138
140
  }
139
141
  }
140
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugins/CmsModelPlugin.js","sources":["../../src/plugins/CmsModelPlugin.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport lodashCamelCase from \"lodash/camelCase.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport upperFirst from \"lodash/upperFirst.js\";\nimport pluralize from \"pluralize\";\nimport { Plugin } from \"@webiny/plugins\";\nimport type {\n CmsModel as CmsModelBase,\n CmsModelField as CmsModelFieldBase,\n CmsModelFieldSettings as BaseCmsModelFieldSettings\n} from \"~/types/index.js\";\nimport { createFieldStorageId } from \"~/crud/contentModel/createFieldStorageId.js\";\nimport { validateStorageId } from \"~/crud/contentModel/validateStorageId.js\";\n\nconst createApiName = (name: string) => {\n return upperFirst(camelCase(name));\n};\n\nconst createPluralApiName = (name: string) => {\n return pluralize(createApiName(name));\n};\n\ninterface CmsModelFieldSettings extends Omit<BaseCmsModelFieldSettings, \"fields\"> {\n /**\n * Object field has child fields.\n */\n fields?: CmsModelFieldInput[];\n}\n\ninterface CmsModelFieldInput extends Omit<CmsModelFieldBase, \"storageId\" | \"settings\"> {\n /**\n * If defined, it must be camelCased string.\n * This is for backwards compatibility - before fields had storageId.\n *\n * This should only be populated in old model fields.\n * New ones must have this empty.\n */\n storageId?: string;\n /**\n * We must have a possibility to have a nested field defined without the storageId.\n */\n settings?: CmsModelFieldSettings;\n}\n\nexport interface CmsApiModel extends Omit<\n CmsModelPluginModel,\n \"isPrivate\" | \"fields\" | \"singularApiName\" | \"pluralApiName\" | \"isPlugin\"\n> {\n isPrivate?: never;\n noValidate?: boolean;\n singularApiName?: string;\n pluralApiName?: string;\n fields: CmsModelFieldInput[];\n}\n\nexport interface CmsApiModelFull extends Omit<CmsApiModel, \"fields\"> {\n fields: CmsModelFieldBase[];\n}\n\ninterface CmsPrivateModel extends Omit<\n CmsModelPluginModel,\n | \"isPrivate\"\n | \"singularApiName\"\n | \"pluralApiName\"\n | \"fields\"\n | \"isPlugin\"\n | \"layout\"\n | \"icon\"\n | \"titleFieldId\"\n | \"description\"\n> {\n noValidate?: boolean;\n titleFieldId?: string;\n singularApiName?: never;\n pluralApiName?: never;\n isPrivate: true;\n fields: CmsModelFieldInput[];\n}\n\nexport interface CmsPrivateModelFull extends Omit<\n CmsPrivateModel,\n \"fields\" | \"createdBy\" | \"createdOn\" | \"savedOn\"\n> {\n fields: CmsModelFieldBase[];\n}\n\nexport type CmsModelInput = CmsApiModel | CmsPrivateModel | CmsApiModelFull | CmsPrivateModelFull;\n\nexport interface CmsModelPluginModel extends Omit<CmsModelBase, \"tenant\"> {\n tenant?: string;\n}\n\ninterface CmsModelPluginOptions {\n validateLayout?: boolean;\n}\n\nexport class CmsModelPlugin extends Plugin {\n public static override readonly type: string = \"cms-content-model\";\n public readonly contentModel: CmsModelPluginModel;\n\n private readonly options: CmsModelPluginOptions;\n\n constructor(contentModel: CmsModelInput, options?: CmsModelPluginOptions) {\n super();\n this.options = options || {};\n this.contentModel = this.buildModel(contentModel);\n }\n\n private buildModel(input: CmsModelInput): CmsModelPluginModel {\n const isPrivate = input.isPrivate ?? false;\n\n const singularApiName = input.singularApiName\n ? createApiName(input.singularApiName)\n : createApiName(input.name);\n\n const pluralApiName = input.pluralApiName\n ? createApiName(input.pluralApiName)\n : createPluralApiName(input.name);\n\n const modelPlugin: CmsModelPluginModel = {\n group: input.group ?? \"ungrouped\",\n description: \"\",\n fields: [],\n isPlugin: true,\n isPrivate,\n icon: null,\n layout: [],\n modelId: input.modelId,\n name: input.name,\n pluralApiName,\n singularApiName,\n titleFieldId: \"id\"\n };\n\n if (input.noValidate) {\n /**\n * We can safely ignore this error, because we are sure noValidate is not a model field.\n */\n delete input[\"noValidate\"];\n\n return {\n ...modelPlugin,\n ...input,\n // Since `noValidate` is set, we trust the input, and cast to `CmsModelFieldBase`.\n fields: input.fields as CmsModelFieldBase[],\n pluralApiName,\n singularApiName\n };\n }\n\n const model: CmsModelPluginModel = {\n ...modelPlugin,\n ...input,\n pluralApiName,\n singularApiName,\n fields: this.buildFields(input, input.fields)\n };\n this.validateLayout(model);\n return model;\n }\n\n private buildFields(\n model: CmsModelInput,\n inputFields: CmsModelFieldInput[]\n ): CmsModelFieldBase[] {\n if (inputFields.length === 0) {\n throw new WebinyError(\n `Missing fields for the defined model \"${model.modelId}\".`,\n \"MISSING_FIELDS\",\n {\n model\n }\n );\n }\n const fields: CmsModelFieldBase[] = [];\n const storageIdList: string[] = [];\n const fieldIdList: string[] = [];\n for (const input of inputFields) {\n /**\n * Field must contain an fieldId. It is required in the graphql, but lets check it just in case\n */\n if (!(input.fieldId || \"\").trim()) {\n throw new WebinyError(\n `Field's \"storageId\" is not defined for the content model \"${model.modelId}\".`,\n \"FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n const fieldId = lodashCamelCase(input.fieldId);\n /**\n * FieldID must be in correct pattern.\n */\n if (fieldId.match(/^[0-9]/) !== null) {\n throw new WebinyError(\n `Field's \"fieldId\" does not match correct pattern in the content model \"${model.modelId}\" - cannot start with a number.`,\n \"FIELD_FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n /**\n * FieldID also must be camelCased.\n */\n if (fieldId !== input.fieldId) {\n throw new WebinyError(\n `Field's \"fieldId\" must be a camel cased string in the content model \"${model.modelId}\".`,\n \"FIELD_FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n /**\n * ... and fieldId must be unique.\n */\n if (fieldIdList.includes(fieldId)) {\n throw new WebinyError(\n `Field's \"fieldId\" (id: ${input.id}) is not unique in the content model \"${model.modelId}\".`,\n \"FIELD_ID_NOT_UNIQUE_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n\n let storageId = input.storageId;\n if (storageId) {\n try {\n validateStorageId(storageId);\n } catch (e) {\n throw WebinyError.from(e, {\n data: { model, storageId, field: input }\n });\n }\n } else {\n storageId = createFieldStorageId(input);\n }\n\n /**\n * Fields storageId must be unique.\n */\n if (storageIdList.includes(storageId)) {\n throw new WebinyError(\n `Field's \"storageId\" is not unique in the content model \"${model.modelId}\".`,\n \"STORAGE_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n\n /**\n * We can safely ignore error because we are going through the fields and making sure each has storageId.\n */\n // @ts-expect-error\n let settings: BaseCmsModelFieldSettings = input.settings;\n\n const childFields = settings?.fields || [];\n if (input.type === \"object\" && childFields.length > 0) {\n settings = {\n ...(settings || {}),\n fields: this.buildFields(model, childFields)\n };\n }\n\n const field: CmsModelFieldBase = {\n ...input,\n settings,\n storageId\n };\n /**\n * Add all relevant data to arrays.\n */\n fields.push(field);\n storageIdList.push(field.storageId);\n fieldIdList.push(field.fieldId);\n }\n return fields;\n }\n\n private validateLayout(model: CmsModelPluginModel): void {\n /**\n * Only skip validation if option.validateLayout was set as false, explicitly.\n */\n if (this.options.validateLayout === false) {\n return;\n }\n\n const countFieldInLayout = (fieldId: string, layout: any[][]): number => {\n let total = 0;\n for (const row of layout) {\n for (const cell of row) {\n if (typeof cell === \"string\") {\n if (cell === fieldId) {\n total++;\n }\n } else if (cell && typeof cell === \"object\" && Array.isArray(cell.tabs)) {\n for (const tab of cell.tabs) {\n if (Array.isArray(tab.layout)) {\n total += countFieldInLayout(fieldId, tab.layout);\n }\n }\n }\n }\n }\n return total;\n };\n\n for (const field of model.fields) {\n const total = countFieldInLayout(field.id, model.layout);\n if (total === 1) {\n continue;\n } else if (total > 1) {\n throw new WebinyError(\n `Field \"${field.id}\" is in more than one layout cell.`,\n \"DUPLICATE_FIELD_IN_LAYOUT\",\n {\n model,\n field\n }\n );\n }\n throw new WebinyError(\n `Missing field \"${field.id}\" in layout.`,\n \"MISSING_FIELD_IN_LAYOUT\",\n {\n model,\n field\n }\n );\n }\n }\n}\n\n/**\n * IMPORTANT! This function should NOT be used outside the `api-headless-cms` package!\n * @internal\n */\nexport const createModelPlugin = (\n model: CmsModelInput,\n options?: CmsModelPluginOptions\n): CmsModelPlugin => {\n return new CmsModelPlugin(model, options);\n};\n\n/**\n * IMPORTANT! This function should NOT be used outside the `api-headless-cms` package!\n * @internal\n */\nexport const createPrivateModelPlugin = (\n input: Omit<CmsPrivateModelFull, \"group\" | \"isPrivate\">\n): CmsModelPlugin => {\n return createModelPlugin(\n {\n authorization: false,\n noValidate: true,\n isPrivate: true,\n group: \"private\",\n ...input\n },\n {\n validateLayout: false\n }\n );\n};\n"],"names":["createApiName","name","upperFirst","camelCase","createPluralApiName","pluralize","CmsModelPlugin","Plugin","contentModel","options","input","isPrivate","singularApiName","pluralApiName","modelPlugin","model","inputFields","WebinyError","fields","storageIdList","fieldIdList","fieldId","lodashCamelCase","storageId","validateStorageId","e","createFieldStorageId","settings","childFields","field","countFieldInLayout","layout","total","row","cell","Array","tab","createModelPlugin","createPrivateModelPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"plugins/CmsModelPlugin.js","sources":["../../src/plugins/CmsModelPlugin.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport lodashCamelCase from \"lodash/camelCase.js\";\nimport camelCase from \"lodash/camelCase.js\";\nimport upperFirst from \"lodash/upperFirst.js\";\nimport pluralize from \"pluralize\";\nimport { Plugin } from \"@webiny/plugins\";\nimport type {\n CmsModel as CmsModelBase,\n CmsModelField as CmsModelFieldBase,\n CmsModelFieldSettings as BaseCmsModelFieldSettings\n} from \"~/types/index.js\";\nimport { createFieldStorageId } from \"~/crud/contentModel/createFieldStorageId.js\";\nimport { validateStorageId } from \"~/crud/contentModel/validateStorageId.js\";\n\nconst createApiName = (name: string) => {\n return upperFirst(camelCase(name));\n};\n\nconst createPluralApiName = (name: string) => {\n return pluralize(createApiName(name));\n};\n\ninterface CmsModelFieldSettings extends Omit<BaseCmsModelFieldSettings, \"fields\"> {\n /**\n * Object field has child fields.\n */\n fields?: CmsModelFieldInput[];\n}\n\ninterface CmsModelFieldInput extends Omit<CmsModelFieldBase, \"storageId\" | \"settings\"> {\n /**\n * If defined, it must be camelCased string.\n * This is for backwards compatibility - before fields had storageId.\n *\n * This should only be populated in old model fields.\n * New ones must have this empty.\n */\n storageId?: string;\n /**\n * We must have a possibility to have a nested field defined without the storageId.\n */\n settings?: CmsModelFieldSettings;\n}\n\nexport interface CmsApiModel extends Omit<\n CmsModelPluginModel,\n \"isPrivate\" | \"fields\" | \"singularApiName\" | \"pluralApiName\" | \"isPlugin\"\n> {\n isPrivate?: never;\n noValidate?: boolean;\n singularApiName?: string;\n pluralApiName?: string;\n fields: CmsModelFieldInput[];\n}\n\nexport interface CmsApiModelFull extends Omit<CmsApiModel, \"fields\"> {\n fields: CmsModelFieldBase[];\n}\n\ninterface CmsPrivateModel extends Omit<\n CmsModelPluginModel,\n | \"isPrivate\"\n | \"singularApiName\"\n | \"pluralApiName\"\n | \"fields\"\n | \"isPlugin\"\n | \"layout\"\n | \"icon\"\n | \"titleFieldId\"\n | \"description\"\n> {\n noValidate?: boolean;\n titleFieldId?: string;\n singularApiName?: never;\n pluralApiName?: never;\n isPrivate: true;\n fields: CmsModelFieldInput[];\n}\n\nexport interface CmsPrivateModelFull extends Omit<\n CmsPrivateModel,\n \"fields\" | \"createdBy\" | \"createdOn\" | \"savedOn\"\n> {\n fields: CmsModelFieldBase[];\n}\n\nexport type CmsModelInput = CmsApiModel | CmsPrivateModel | CmsApiModelFull | CmsPrivateModelFull;\n\nexport interface CmsModelPluginModel extends Omit<CmsModelBase, \"tenant\"> {\n tenant?: string;\n}\n\ninterface CmsModelPluginOptions {\n validateLayout?: boolean;\n}\n\nexport class CmsModelPlugin extends Plugin {\n public static override readonly type: string = \"cms-content-model\";\n public readonly contentModel: CmsModelPluginModel;\n\n private readonly options: CmsModelPluginOptions;\n\n constructor(contentModel: CmsModelInput, options?: CmsModelPluginOptions) {\n super();\n this.options = options || {};\n this.contentModel = this.buildModel(contentModel);\n }\n\n private buildModel(input: CmsModelInput): CmsModelPluginModel {\n const isPrivate = input.isPrivate ?? false;\n\n const singularApiName = input.singularApiName\n ? createApiName(input.singularApiName)\n : createApiName(input.name);\n\n const pluralApiName = input.pluralApiName\n ? createApiName(input.pluralApiName)\n : createPluralApiName(input.name);\n\n const modelPlugin: CmsModelPluginModel = {\n group: input.group ?? \"ungrouped\",\n description: \"\",\n fields: [],\n isPlugin: true,\n isPrivate,\n icon: null,\n layout: [],\n modelId: input.modelId,\n name: input.name,\n pluralApiName,\n singularApiName,\n titleFieldId: \"id\",\n settings: {}\n };\n\n if (input.noValidate) {\n /**\n * We can safely ignore this error, because we are sure noValidate is not a model field.\n */\n delete input[\"noValidate\"];\n\n return {\n ...modelPlugin,\n ...input,\n // Since `noValidate` is set, we trust the input, and cast to `CmsModelFieldBase`.\n fields: input.fields as CmsModelFieldBase[],\n pluralApiName,\n singularApiName\n };\n }\n\n const model: CmsModelPluginModel = {\n ...modelPlugin,\n ...input,\n pluralApiName,\n singularApiName,\n fields: this.buildFields(input, input.fields)\n };\n this.validateLayout(model);\n return model;\n }\n\n private buildFields(\n model: CmsModelInput,\n inputFields: CmsModelFieldInput[]\n ): CmsModelFieldBase[] {\n if (inputFields.length === 0) {\n throw new WebinyError(\n `Missing fields for the defined model \"${model.modelId}\".`,\n \"MISSING_FIELDS\",\n {\n model\n }\n );\n }\n const fields: CmsModelFieldBase[] = [];\n const storageIdList: string[] = [];\n const fieldIdList: string[] = [];\n for (const input of inputFields) {\n /**\n * Field must contain an fieldId. It is required in the graphql, but lets check it just in case\n */\n if (!(input.fieldId || \"\").trim()) {\n throw new WebinyError(\n `Field's \"storageId\" is not defined for the content model \"${model.modelId}\".`,\n \"FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n const fieldId = lodashCamelCase(input.fieldId);\n /**\n * FieldID must be in correct pattern.\n */\n if (fieldId.match(/^[0-9]/) !== null) {\n throw new WebinyError(\n `Field's \"fieldId\" does not match correct pattern in the content model \"${model.modelId}\" - cannot start with a number.`,\n \"FIELD_FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n /**\n * FieldID also must be camelCased.\n */\n if (fieldId !== input.fieldId) {\n throw new WebinyError(\n `Field's \"fieldId\" must be a camel cased string in the content model \"${model.modelId}\".`,\n \"FIELD_FIELD_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n /**\n * ... and fieldId must be unique.\n */\n if (fieldIdList.includes(fieldId)) {\n throw new WebinyError(\n `Field's \"fieldId\" (id: ${input.id}) is not unique in the content model \"${model.modelId}\".`,\n \"FIELD_ID_NOT_UNIQUE_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n\n let storageId = input.storageId;\n if (storageId) {\n try {\n validateStorageId(storageId);\n } catch (e) {\n throw WebinyError.from(e, {\n data: { model, storageId, field: input }\n });\n }\n } else {\n storageId = createFieldStorageId(input);\n }\n\n /**\n * Fields storageId must be unique.\n */\n if (storageIdList.includes(storageId)) {\n throw new WebinyError(\n `Field's \"storageId\" is not unique in the content model \"${model.modelId}\".`,\n \"STORAGE_ID_ERROR\",\n {\n model,\n field: input\n }\n );\n }\n\n /**\n * We can safely ignore error because we are going through the fields and making sure each has storageId.\n */\n // @ts-expect-error\n let settings: BaseCmsModelFieldSettings = input.settings;\n\n const childFields = settings?.fields || [];\n if (input.type === \"object\" && childFields.length > 0) {\n settings = {\n ...(settings || {}),\n fields: this.buildFields(model, childFields)\n };\n }\n\n const field: CmsModelFieldBase = {\n ...input,\n settings,\n storageId\n };\n /**\n * Add all relevant data to arrays.\n */\n fields.push(field);\n storageIdList.push(field.storageId);\n fieldIdList.push(field.fieldId);\n }\n return fields;\n }\n\n private validateLayout(model: CmsModelPluginModel): void {\n /**\n * Only skip validation if option.validateLayout was set as false, explicitly.\n */\n if (this.options.validateLayout === false) {\n return;\n }\n\n const countFieldInLayout = (fieldId: string, layout: any[][]): number => {\n let total = 0;\n for (const row of layout) {\n for (const cell of row) {\n if (typeof cell === \"string\") {\n if (cell === fieldId) {\n total++;\n }\n } else if (cell && typeof cell === \"object\" && Array.isArray(cell.tabs)) {\n for (const tab of cell.tabs) {\n if (Array.isArray(tab.layout)) {\n total += countFieldInLayout(fieldId, tab.layout);\n }\n }\n }\n }\n }\n return total;\n };\n\n for (const field of model.fields) {\n const total = countFieldInLayout(field.id, model.layout);\n if (total === 1) {\n continue;\n } else if (total > 1) {\n throw new WebinyError(\n `Field \"${field.id}\" is in more than one layout cell.`,\n \"DUPLICATE_FIELD_IN_LAYOUT\",\n {\n model,\n field\n }\n );\n }\n throw new WebinyError(\n `Missing field \"${field.id}\" in layout.`,\n \"MISSING_FIELD_IN_LAYOUT\",\n {\n model,\n field\n }\n );\n }\n }\n}\n\n/**\n * IMPORTANT! This function should NOT be used outside the `api-headless-cms` package!\n * @internal\n */\nexport const createModelPlugin = (\n model: CmsModelInput,\n options?: CmsModelPluginOptions\n): CmsModelPlugin => {\n return new CmsModelPlugin(model, options);\n};\n\n/**\n * IMPORTANT! This function should NOT be used outside the `api-headless-cms` package!\n * @internal\n */\nexport const createPrivateModelPlugin = (\n input: Omit<CmsPrivateModelFull, \"group\" | \"isPrivate\">\n): CmsModelPlugin => {\n return createModelPlugin(\n {\n authorization: false,\n noValidate: true,\n isPrivate: true,\n group: \"private\",\n ...input\n },\n {\n validateLayout: false\n }\n );\n};\n"],"names":["createApiName","name","upperFirst","camelCase","createPluralApiName","pluralize","CmsModelPlugin","Plugin","contentModel","options","input","isPrivate","singularApiName","pluralApiName","modelPlugin","model","inputFields","WebinyError","fields","storageIdList","fieldIdList","fieldId","lodashCamelCase","storageId","validateStorageId","e","createFieldStorageId","settings","childFields","field","countFieldInLayout","layout","total","row","cell","Array","tab","createModelPlugin","createPrivateModelPlugin"],"mappings":"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"}
@@ -10,6 +10,7 @@ export interface CmsDynamicZoneTemplate {
10
10
  layout: CmsModelLayoutCell[][];
11
11
  validation: CmsModelFieldValidation[];
12
12
  tags?: string[];
13
+ componentName?: string;
13
14
  }
14
15
  /**
15
16
  * A definition for dynamic-zone field to show possible type of the field in settings.
package/types/model.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { CmsIdentity } from "./identity.js";
2
2
  import type { CmsModelField, CmsModelFieldInput, FieldRule } from "./modelField.js";
3
3
  import type { CmsIcon } from "../types/types.js";
4
+ import type { IModelSettings } from "../features/modelBuilder/abstractions.js";
4
5
  export interface CmsTabLayoutTab {
5
6
  id: string;
6
7
  label: string;
@@ -140,6 +141,10 @@ export interface CmsModel {
140
141
  * Is this model created via plugin?
141
142
  */
142
143
  isPlugin?: boolean;
144
+ /**
145
+ * Arbitrary model-level settings (e.g., feature flags).
146
+ */
147
+ settings?: IModelSettings | null;
143
148
  }
144
149
  export interface StorageCmsModelFields {
145
150
  compression: string;
@@ -209,6 +214,7 @@ export interface CmsModelCreateInput {
209
214
  descriptionFieldId?: string | null;
210
215
  imageFieldId?: string | null;
211
216
  icon?: CmsIcon | null;
217
+ settings?: IModelSettings | null;
212
218
  }
213
219
  /**
214
220
  * A GraphQL `params.data` parameter received when creating content model from existing model.
@@ -1,6 +1,7 @@
1
1
  import type { CmsModel, CmsModelLayout } from "./model.js";
2
2
  import type { GenericRecord } from "@webiny/api/types.js";
3
3
  import type { CmsDynamicZoneTemplate } from "../types/fields/dynamicZoneField.js";
4
+ import type { IModelSettings } from "../features/modelBuilder/abstractions.js";
4
5
  export type FieldRuleAction = "hide" | "disable" | string;
5
6
  export interface FieldRule {
6
7
  type: "accessControl" | "condition";
@@ -97,6 +98,13 @@ export interface CmsModelField {
97
98
  *
98
99
  */
99
100
  list?: boolean;
101
+ /**
102
+ * Renders the field in the admin app, but doesn't let anyone edit its value.
103
+ *
104
+ * This only affects the admin app. The API doesn't check it, so a disabled field
105
+ * can still be written to over GraphQL.
106
+ */
107
+ disabled?: boolean;
100
108
  /**
101
109
  * Fields can be tagged to give them contextual meaning.
102
110
  */
@@ -163,6 +171,10 @@ export interface CmsModelFieldInput {
163
171
  * Are multiple values allowed?
164
172
  */
165
173
  list?: boolean;
174
+ /**
175
+ * @see CmsModelField.disabled
176
+ */
177
+ disabled?: boolean;
166
178
  /**
167
179
  * Predefined values options for the field. Check the reference for more information.
168
180
  */
@@ -242,6 +254,7 @@ export interface CmsModelUpdateInput {
242
254
  titleFieldId?: string | null;
243
255
  descriptionFieldId?: string | null;
244
256
  imageFieldId?: string | null;
257
+ settings?: IModelSettings | null;
245
258
  }
246
259
  /**
247
260
  * Object containing content model field renderer options.
package/types/types.d.ts CHANGED
@@ -59,7 +59,7 @@ export interface HeadlessCms extends CmsGroupContext, CmsModelContext, CmsEntryC
59
59
  importing: HeadlessCmsImport;
60
60
  getExecutableSchema: GetExecutableSchema;
61
61
  }
62
- export type GetExecutableSchema = (type: ApiEndpoint) => Promise<(<TData = Record<string, any>, TExtensions = Record<string, any>>(input: GraphQLRequestBody | GraphQLRequestBody[]) => ReturnType<typeof processRequestBody<TData, TExtensions>>)>;
62
+ export type GetExecutableSchema = (type: ApiEndpoint) => Promise<<TData = Record<string, any>, TExtensions = Record<string, any>>(input: GraphQLRequestBody | GraphQLRequestBody[]) => ReturnType<typeof processRequestBody<TData, TExtensions>>>;
63
63
  /**
64
64
  * @description This combines all contexts used in the CMS into a single one.
65
65
  *
@@ -647,7 +647,7 @@ export interface CreateCmsEntryInput<TValues extends CmsEntryValues = CmsEntryVa
647
647
  expiresAt?: Date | undefined;
648
648
  }
649
649
  export interface CreateCmsEntryOptionsInput {
650
- skipValidators?: string[];
650
+ skipValidation?: boolean;
651
651
  }
652
652
  /**
653
653
  * @category Context
@@ -684,7 +684,7 @@ export interface CreateFromCmsEntryInput<TValues extends CmsEntryValues = CmsEnt
684
684
  values: TValues;
685
685
  }
686
686
  export interface CreateRevisionCmsEntryOptionsInput {
687
- skipValidators?: string[];
687
+ skipValidation?: boolean;
688
688
  }
689
689
  /**
690
690
  * @category Context
@@ -736,7 +736,7 @@ export interface UpdateCmsEntryInput<TValues extends CmsEntryValues = CmsEntryVa
736
736
  expiresAt?: Date | number | null | undefined;
737
737
  }
738
738
  export interface UpdateCmsEntryOptionsInput {
739
- skipValidators?: string[];
739
+ skipValidation?: boolean;
740
740
  }
741
741
  /**
742
742
  * @category Context
@@ -1145,6 +1145,10 @@ export interface CmsEntryStorageOperations {
1145
1145
  * Update existing entry.
1146
1146
  */
1147
1147
  update: <T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, params: CmsEntryStorageOperationsUpdateParams<T>) => Promise<CmsEntry<T>>;
1148
+ /**
1149
+ * Update a single revision record without touching the latest or published records.
1150
+ */
1151
+ updateRevision: <T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, params: CmsEntryStorageOperationsUpdateParams<T>) => Promise<CmsEntry<T>>;
1148
1152
  /**
1149
1153
  * Move entry and all its entries into a new folder.
1150
1154
  */