@webiny/api-headless-cms 6.4.12-beta.4 → 6.5.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) 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.js.map +1 -1
  41. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js +1 -0
  42. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js.map +1 -1
  43. package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js +1 -3
  44. package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js.map +1 -1
  45. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
  46. package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.d.ts +14 -0
  47. package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js +34 -0
  48. package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js.map +1 -0
  49. package/features/contentEntry/UpdateRevision/abstractions.d.ts +10 -0
  50. package/features/contentEntry/UpdateRevision/abstractions.js +5 -0
  51. package/features/contentEntry/UpdateRevision/abstractions.js.map +1 -0
  52. package/features/contentEntry/UpdateRevision/feature.d.ts +4 -0
  53. package/features/contentEntry/UpdateRevision/feature.js +11 -0
  54. package/features/contentEntry/UpdateRevision/feature.js.map +1 -0
  55. package/features/contentEntry/UpdateRevision/index.d.ts +1 -0
  56. package/features/contentEntry/UpdateRevision/index.js +1 -0
  57. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.d.ts +2 -2
  58. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js +2 -2
  59. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js.map +1 -1
  60. package/features/contentEntry/ensureItemIds.d.ts +13 -0
  61. package/features/contentEntry/ensureItemIds.js +22 -0
  62. package/features/contentEntry/ensureItemIds.js.map +1 -0
  63. package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.d.ts +3 -1
  64. package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js +9 -3
  65. package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js.map +1 -1
  66. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.d.ts +3 -3
  67. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js +10 -6
  68. package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js.map +1 -1
  69. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.d.ts +3 -1
  70. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js +9 -3
  71. package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js.map +1 -1
  72. package/features/contentEntry/entryDataFactories/expiresAt.js +2 -2
  73. package/features/contentEntry/entryDataFactories/expiresAt.js.map +1 -1
  74. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.d.ts +14 -0
  75. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js +32 -0
  76. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js.map +1 -0
  77. package/features/contentModel/ComponentMapGenerator/abstractions.d.ts +8 -0
  78. package/features/contentModel/ComponentMapGenerator/abstractions.js +5 -0
  79. package/features/contentModel/ComponentMapGenerator/abstractions.js.map +1 -0
  80. package/features/contentModel/ComponentMapGenerator/feature.d.ts +4 -0
  81. package/features/contentModel/ComponentMapGenerator/feature.js +11 -0
  82. package/features/contentModel/ComponentMapGenerator/feature.js.map +1 -0
  83. package/features/contentModel/ComponentMapGenerator/index.d.ts +2 -0
  84. package/features/contentModel/ComponentMapGenerator/index.js +2 -0
  85. package/features/contentModel/ContentModelFeature.js +6 -0
  86. package/features/contentModel/ContentModelFeature.js.map +1 -1
  87. package/features/contentModel/CreateModel/CreateModelRepository.js +2 -1
  88. package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
  89. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +2 -1
  90. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
  91. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.d.ts +19 -0
  92. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js +56 -0
  93. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js.map +1 -0
  94. package/features/contentModel/RefModelsGenerator/abstractions.d.ts +11 -0
  95. package/features/contentModel/RefModelsGenerator/abstractions.js +5 -0
  96. package/features/contentModel/RefModelsGenerator/abstractions.js.map +1 -0
  97. package/features/contentModel/RefModelsGenerator/feature.d.ts +4 -0
  98. package/features/contentModel/RefModelsGenerator/feature.js +11 -0
  99. package/features/contentModel/RefModelsGenerator/feature.js.map +1 -0
  100. package/features/contentModel/RefModelsGenerator/index.d.ts +2 -0
  101. package/features/contentModel/RefModelsGenerator/index.js +2 -0
  102. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.d.ts +16 -0
  103. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js +54 -0
  104. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js.map +1 -0
  105. package/features/contentModel/ValuesSelectionGenerator/abstractions.d.ts +8 -0
  106. package/features/contentModel/ValuesSelectionGenerator/abstractions.js +5 -0
  107. package/features/contentModel/ValuesSelectionGenerator/abstractions.js.map +1 -0
  108. package/features/contentModel/ValuesSelectionGenerator/feature.d.ts +4 -0
  109. package/features/contentModel/ValuesSelectionGenerator/feature.js +11 -0
  110. package/features/contentModel/ValuesSelectionGenerator/feature.js.map +1 -0
  111. package/features/contentModel/ValuesSelectionGenerator/index.d.ts +1 -0
  112. package/features/contentModel/ValuesSelectionGenerator/index.js +1 -0
  113. package/features/graphql/feature.js +2 -0
  114. package/features/graphql/feature.js.map +1 -1
  115. package/features/graphql/fields/base/AssetToGraphQL.d.ts +26 -0
  116. package/features/graphql/fields/base/AssetToGraphQL.js +148 -0
  117. package/features/graphql/fields/base/AssetToGraphQL.js.map +1 -0
  118. package/features/graphql/fields/base/DynamicZoneToGraphQL.js +12 -2
  119. package/features/graphql/fields/base/DynamicZoneToGraphQL.js.map +1 -1
  120. package/features/graphql/fields/base/ObjectToGraphQL.js +8 -5
  121. package/features/graphql/fields/base/ObjectToGraphQL.js.map +1 -1
  122. package/features/modelBuilder/abstractions.d.ts +9 -0
  123. package/features/modelBuilder/abstractions.js.map +1 -1
  124. package/features/modelBuilder/feature.js +2 -0
  125. package/features/modelBuilder/feature.js.map +1 -1
  126. package/features/modelBuilder/fields/AssetFieldType.d.ts +20 -0
  127. package/features/modelBuilder/fields/AssetFieldType.js +46 -0
  128. package/features/modelBuilder/fields/AssetFieldType.js.map +1 -0
  129. package/features/modelBuilder/fields/DataFieldBuilder.d.ts +62 -18
  130. package/features/modelBuilder/fields/DataFieldBuilder.js +8 -0
  131. package/features/modelBuilder/fields/DataFieldBuilder.js.map +1 -1
  132. package/features/modelBuilder/fields/DynamicZoneFieldType.d.ts +1 -0
  133. package/features/modelBuilder/fields/DynamicZoneFieldType.js +2 -6
  134. package/features/modelBuilder/fields/DynamicZoneFieldType.js.map +1 -1
  135. package/features/modelBuilder/fields/resolveAssetUrl.d.ts +35 -0
  136. package/features/modelBuilder/fields/resolveAssetUrl.js +26 -0
  137. package/features/modelBuilder/fields/resolveAssetUrl.js.map +1 -0
  138. package/features/modelBuilder/index.d.ts +1 -1
  139. package/features/modelBuilder/models/BaseModelBuilder.d.ts +3 -1
  140. package/features/modelBuilder/models/BaseModelBuilder.js +7 -0
  141. package/features/modelBuilder/models/BaseModelBuilder.js.map +1 -1
  142. package/features/modelBuilder/models/PrivateModelBuilder.js +2 -1
  143. package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
  144. package/features/modelBuilder/models/PublicModelBuilder.js +2 -1
  145. package/features/modelBuilder/models/PublicModelBuilder.js.map +1 -1
  146. package/features/sortMapper/SortMapper.js +2 -5
  147. package/features/sortMapper/SortMapper.js.map +1 -1
  148. package/features/storage/fields/CompressedTextStorageTransform.js +1 -1
  149. package/features/storage/fields/CompressedTextStorageTransform.js.map +1 -1
  150. package/features/storage/fields/DateStorageTransform.js +4 -3
  151. package/features/storage/fields/DateStorageTransform.js.map +1 -1
  152. package/features/storage/fields/DynamicZoneStorageTransform.js +2 -2
  153. package/features/storage/fields/DynamicZoneStorageTransform.js.map +1 -1
  154. package/features/storage/fields/JsonStorageTransform.js +1 -1
  155. package/features/storage/fields/JsonStorageTransform.js.map +1 -1
  156. package/features/storage/fields/LongTextStorageTransform.js +1 -1
  157. package/features/storage/fields/LongTextStorageTransform.js.map +1 -1
  158. package/features/storage/fields/ObjectStorageTransform.js +27 -7
  159. package/features/storage/fields/ObjectStorageTransform.js.map +1 -1
  160. package/features/storage/fields/RichTextStorageTransform.js +1 -1
  161. package/features/storage/fields/RichTextStorageTransform.js.map +1 -1
  162. package/features/validation/validators/DateGteValidator.js +1 -1
  163. package/features/validation/validators/DateGteValidator.js.map +1 -1
  164. package/features/validation/validators/DateLteValidator.js +1 -1
  165. package/features/validation/validators/DateLteValidator.js.map +1 -1
  166. package/features/validation/validators/PatternValidator.js +1 -1
  167. package/features/validation/validators/PatternValidator.js.map +1 -1
  168. package/features/whereMapper/WhereMapper.js +10 -7
  169. package/features/whereMapper/WhereMapper.js.map +1 -1
  170. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +8 -2
  171. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
  172. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +8 -2
  173. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  174. package/fieldConverters/index.d.ts +1 -1
  175. package/graphql/getSchema/generateCacheKey.js +1 -1
  176. package/graphql/getSchema/generateCacheKey.js.map +1 -1
  177. package/graphql/scalars/RevisionId.js +1 -1
  178. package/graphql/scalars/RevisionId.js.map +1 -1
  179. package/graphql/schema/baseSchema.js +5 -25
  180. package/graphql/schema/baseSchema.js.map +1 -1
  181. package/graphql/schema/cms/getEntryResolver.js +3 -2
  182. package/graphql/schema/cms/getEntryResolver.js.map +1 -1
  183. package/graphql/schema/cms/getModelResolver.d.ts +35 -0
  184. package/graphql/schema/cms/getModelResolver.js +49 -0
  185. package/graphql/schema/cms/getModelResolver.js.map +1 -0
  186. package/graphql/schema/cms/helpers/buildFieldsSelection.js +9 -2
  187. package/graphql/schema/cms/helpers/buildFieldsSelection.js.map +1 -1
  188. package/graphql/schema/cms/helpers/expandFieldWildcards.d.ts +2 -0
  189. package/graphql/schema/cms/helpers/expandFieldWildcards.js +13 -0
  190. package/graphql/schema/cms/helpers/expandFieldWildcards.js.map +1 -0
  191. package/graphql/schema/cms/helpers/index.d.ts +1 -0
  192. package/graphql/schema/cms/helpers/index.js +1 -0
  193. package/graphql/schema/cms/helpers.d.ts +1 -0
  194. package/graphql/schema/cms/helpers.js +1 -0
  195. package/graphql/schema/cms/index.js +2 -1
  196. package/graphql/schema/cms/index.js.map +1 -1
  197. package/graphql/schema/cms/listEntriesResolver.js +3 -2
  198. package/graphql/schema/cms/listEntriesResolver.js.map +1 -1
  199. package/graphql/schema/cms/resolvers/getModel.d.ts +8 -0
  200. package/graphql/schema/cms/resolvers/getModel.js +18 -0
  201. package/graphql/schema/cms/resolvers/getModel.js.map +1 -0
  202. package/graphql/schema/cms/resolvers/index.d.ts +1 -0
  203. package/graphql/schema/cms/resolvers/index.js +1 -0
  204. package/graphql/schema/cms/typeDefs/query.js +1 -0
  205. package/graphql/schema/cms/typeDefs/query.js.map +1 -1
  206. package/graphql/schema/cms/typeDefs/responses.js +5 -0
  207. package/graphql/schema/cms/typeDefs/responses.js.map +1 -1
  208. package/graphql/schema/contentModels.js +40 -1
  209. package/graphql/schema/contentModels.js.map +1 -1
  210. package/graphql/schema/createFieldResolvers.js +1 -1
  211. package/graphql/schema/createFieldResolvers.js.map +1 -1
  212. package/index.d.ts +2 -5
  213. package/index.js +1 -21
  214. package/package.json +26 -29
  215. package/plugins/CmsModelPlugin.js +12 -10
  216. package/plugins/CmsModelPlugin.js.map +1 -1
  217. package/types/fields/dynamicZoneField.d.ts +1 -0
  218. package/types/model.d.ts +6 -0
  219. package/types/modelField.d.ts +13 -0
  220. package/types/types.d.ts +8 -4
  221. package/types/types.js.map +1 -1
  222. package/utils/caching/Cache.js +1 -1
  223. package/utils/caching/Cache.js.map +1 -1
  224. package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.d.ts +28 -0
  225. package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js +324 -0
  226. package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js.map +1 -0
  227. package/utils/contentModelToJsonSchema/index.d.ts +2 -0
  228. package/utils/contentModelToJsonSchema/index.js +1 -0
  229. package/utils/contentModelToJsonSchema/types.d.ts +24 -0
  230. package/utils/contentModelToJsonSchema/types.js +0 -0
  231. package/utils/createModelField.js +2 -1
  232. package/utils/createModelField.js.map +1 -1
  233. package/utils/date.js +1 -1
  234. package/utils/date.js.map +1 -1
  235. package/utils/entryStorage.js +1 -1
  236. package/utils/entryStorage.js.map +1 -1
  237. package/utils/index.d.ts +1 -0
  238. package/utils/index.js +1 -0
  239. package/utils/renderFields.js +1 -1
  240. package/utils/renderFields.js.map +1 -1
  241. package/index.js.map +0 -1
@@ -0,0 +1,49 @@
1
+ import { getErrorMessage, getModel } from "./helpers.js";
2
+ import { ComponentMapGenerator } from "../../../features/contentModel/ComponentMapGenerator/abstractions.js";
3
+ import { ValuesSelectionGenerator } from "../../../features/contentModel/ValuesSelectionGenerator/abstractions.js";
4
+ import { RefModelsGenerator } from "../../../features/contentModel/RefModelsGenerator/abstractions.js";
5
+ const createGetModelResolver = ()=>async ({ args, context })=>{
6
+ const { modelId } = args;
7
+ try {
8
+ const model = await getModel(context, modelId);
9
+ const componentMapGenerator = context.container.resolve(ComponentMapGenerator);
10
+ const valuesSelectionGenerator = context.container.resolve(ValuesSelectionGenerator);
11
+ const refModelsGenerator = context.container.resolve(RefModelsGenerator);
12
+ const componentMap = componentMapGenerator.generate(model);
13
+ const valuesSelection = valuesSelectionGenerator.generate(model);
14
+ const refModels = await refModelsGenerator.generate(model);
15
+ return {
16
+ data: {
17
+ name: model.name,
18
+ modelId: model.modelId,
19
+ singularApiName: model.singularApiName,
20
+ pluralApiName: model.pluralApiName,
21
+ description: model.description,
22
+ titleFieldId: model.titleFieldId,
23
+ descriptionFieldId: model.descriptionFieldId,
24
+ imageFieldId: model.imageFieldId,
25
+ fields: model.fields,
26
+ layout: model.layout,
27
+ tags: model.tags,
28
+ settings: model.settings,
29
+ metadata: {
30
+ valuesSelection,
31
+ componentMap,
32
+ refModels
33
+ }
34
+ },
35
+ error: null
36
+ };
37
+ } catch (error) {
38
+ return {
39
+ data: null,
40
+ error: {
41
+ message: getErrorMessage(error, "Failed to get model"),
42
+ code: "GET_MODEL_ERROR"
43
+ }
44
+ };
45
+ }
46
+ };
47
+ export { createGetModelResolver };
48
+
49
+ //# sourceMappingURL=getModelResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql/schema/cms/getModelResolver.js","sources":["../../../../src/graphql/schema/cms/getModelResolver.ts"],"sourcesContent":["import type { CmsContext } from \"~/types/index.js\";\nimport { getModel, getErrorMessage } from \"./helpers.js\";\nimport { ComponentMapGenerator } from \"~/features/contentModel/ComponentMapGenerator/abstractions.js\";\nimport { ValuesSelectionGenerator } from \"~/features/contentModel/ValuesSelectionGenerator/abstractions.js\";\nimport { RefModelsGenerator } from \"~/features/contentModel/RefModelsGenerator/abstractions.js\";\n\nexport interface GetModelArgs {\n modelId: string;\n}\n\nexport const createGetModelResolver = () => {\n return async ({ args, context }: { args: GetModelArgs; context: CmsContext }) => {\n const { modelId } = args;\n\n try {\n const model = await getModel(context, modelId);\n const componentMapGenerator = context.container.resolve(ComponentMapGenerator);\n const valuesSelectionGenerator = context.container.resolve(ValuesSelectionGenerator);\n const refModelsGenerator = context.container.resolve(RefModelsGenerator);\n\n const componentMap = componentMapGenerator.generate(model);\n const valuesSelection = valuesSelectionGenerator.generate(model);\n const refModels = await refModelsGenerator.generate(model);\n\n return {\n data: {\n name: model.name,\n modelId: model.modelId,\n singularApiName: model.singularApiName,\n pluralApiName: model.pluralApiName,\n description: model.description,\n titleFieldId: model.titleFieldId,\n descriptionFieldId: model.descriptionFieldId,\n imageFieldId: model.imageFieldId,\n fields: model.fields,\n layout: model.layout,\n tags: model.tags,\n settings: model.settings,\n metadata: {\n valuesSelection,\n componentMap,\n refModels\n }\n },\n error: null\n };\n } catch (error) {\n return {\n data: null,\n error: {\n message: getErrorMessage(error, \"Failed to get model\"),\n code: \"GET_MODEL_ERROR\"\n }\n };\n }\n };\n};\n"],"names":["createGetModelResolver","args","context","modelId","model","getModel","componentMapGenerator","ComponentMapGenerator","valuesSelectionGenerator","ValuesSelectionGenerator","refModelsGenerator","RefModelsGenerator","componentMap","valuesSelection","refModels","error","getErrorMessage"],"mappings":";;;;AAUO,MAAMA,yBAAyB,IAC3B,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAA+C;QACxE,MAAM,EAAEC,OAAO,EAAE,GAAGF;QAEpB,IAAI;YACA,MAAMG,QAAQ,MAAMC,SAASH,SAASC;YACtC,MAAMG,wBAAwBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;YACxD,MAAMC,2BAA2BN,QAAQ,SAAS,CAAC,OAAO,CAACO;YAC3D,MAAMC,qBAAqBR,QAAQ,SAAS,CAAC,OAAO,CAACS;YAErD,MAAMC,eAAeN,sBAAsB,QAAQ,CAACF;YACpD,MAAMS,kBAAkBL,yBAAyB,QAAQ,CAACJ;YAC1D,MAAMU,YAAY,MAAMJ,mBAAmB,QAAQ,CAACN;YAEpD,OAAO;gBACH,MAAM;oBACF,MAAMA,MAAM,IAAI;oBAChB,SAASA,MAAM,OAAO;oBACtB,iBAAiBA,MAAM,eAAe;oBACtC,eAAeA,MAAM,aAAa;oBAClC,aAAaA,MAAM,WAAW;oBAC9B,cAAcA,MAAM,YAAY;oBAChC,oBAAoBA,MAAM,kBAAkB;oBAC5C,cAAcA,MAAM,YAAY;oBAChC,QAAQA,MAAM,MAAM;oBACpB,QAAQA,MAAM,MAAM;oBACpB,MAAMA,MAAM,IAAI;oBAChB,UAAUA,MAAM,QAAQ;oBACxB,UAAU;wBACNS;wBACAD;wBACAE;oBACJ;gBACJ;gBACA,OAAO;YACX;QACJ,EAAE,OAAOC,OAAO;YACZ,OAAO;gBACH,MAAM;gBACN,OAAO;oBACH,SAASC,gBAAgBD,OAAO;oBAChC,MAAM;gBACV;YACJ;QACJ;IACJ"}
@@ -4,8 +4,12 @@ const buildFieldsSelection = (fields)=>{
4
4
  entryId
5
5
  values
6
6
  `;
7
+ const rawSelections = [];
8
+ const dotFields = [];
9
+ for (const field of fields)if (field.includes("{")) rawSelections.push(field);
10
+ else dotFields.push(field);
7
11
  const fieldTree = {};
8
- fields.forEach((field)=>{
12
+ dotFields.forEach((field)=>{
9
13
  const parts = field.split(".");
10
14
  let current = fieldTree;
11
15
  parts.forEach((part, index)=>{
@@ -27,7 +31,10 @@ const buildFieldsSelection = (fields)=>{
27
31
  });
28
32
  return lines.join("\n");
29
33
  };
30
- return buildSelection(fieldTree);
34
+ const parts = [];
35
+ if (dotFields.length > 0) parts.push(buildSelection(fieldTree));
36
+ for (const raw of rawSelections)parts.push(` ${raw}`);
37
+ return parts.join("\n");
31
38
  };
32
39
  export { buildFieldsSelection };
33
40
 
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/schema/cms/helpers/buildFieldsSelection.js","sources":["../../../../../src/graphql/schema/cms/helpers/buildFieldsSelection.ts"],"sourcesContent":["/**\n * Helper to build GraphQL fields selection from fields array.\n * Supports both top-level fields (e.g., \"createdOn\", \"id\") and values fields (e.g., \"values.author.name\").\n * Properly merges nested fields that share common parent paths.\n *\n * @param fields - Optional array of field paths in dot notation\n * @returns GraphQL selection string with proper field nesting\n *\n * @example\n * buildFieldsSelection([\"id\", \"entryId\", \"createdOn\", \"values.name\", \"values.author.name\", \"values.author.email\"])\n * // Returns:\n * // id\n * // entryId\n * // createdOn\n * // values {\n * // name\n * // author {\n * // name\n * // email\n * // }\n * // }\n */\nexport const buildFieldsSelection = (fields?: string[]): string => {\n if (!fields || fields.length === 0) {\n return `\n id\n entryId\n values\n `;\n }\n\n interface FieldNode {\n [key: string]: FieldNode | null;\n }\n\n const fieldTree: FieldNode = {};\n\n fields.forEach(field => {\n const parts = field.split(\".\");\n let current = fieldTree;\n\n parts.forEach((part, index) => {\n if (current[part] === undefined) {\n // Leaf node (null) or new branch (empty object)\n current[part] = index === parts.length - 1 ? null : {};\n } else if (current[part] === null && index < parts.length - 1) {\n // Convert leaf to branch if we need to traverse deeper\n current[part] = {};\n }\n if (current[part] !== null) {\n current = current[part] as FieldNode;\n }\n });\n });\n\n /**\n * Recursively converts the field tree into a GraphQL selection string.\n *\n * @param node - The current field tree node to process\n * @param indent - Current indentation level for formatting\n * @returns GraphQL selection string for this node and its children\n *\n * Handles two cases:\n * - Leaf nodes (value === null): Simple field name\n * - Branch nodes (value === object): Field name with nested selection in braces\n */\n const buildSelection = (node: FieldNode, indent: string = \" \"): string => {\n const lines: string[] = [];\n\n Object.keys(node)\n .sort()\n .forEach(key => {\n const value = node[key];\n if (value === null) {\n // Leaf field - just the field name\n lines.push(`${indent}${key}`);\n } else {\n // Branch field - field name with nested selection\n lines.push(`${indent}${key} {`);\n lines.push(buildSelection(value, indent + \" \"));\n lines.push(`${indent}}`);\n }\n });\n\n return lines.join(\"\\n\");\n };\n\n return buildSelection(fieldTree);\n};\n"],"names":["buildFieldsSelection","fields","fieldTree","field","parts","current","part","index","undefined","buildSelection","node","indent","lines","Object","key","value"],"mappings":"AAsBO,MAAMA,uBAAuB,CAACC;IACjC,IAAI,CAACA,UAAUA,AAAkB,MAAlBA,OAAO,MAAM,EACxB,OAAO,CAAC;;;;QAIR,CAAC;IAOL,MAAMC,YAAuB,CAAC;IAE9BD,OAAO,OAAO,CAACE,CAAAA;QACX,MAAMC,QAAQD,MAAM,KAAK,CAAC;QAC1B,IAAIE,UAAUH;QAEdE,MAAM,OAAO,CAAC,CAACE,MAAMC;YACjB,IAAIF,AAAkBG,WAAlBH,OAAO,CAACC,KAAK,EAEbD,OAAO,CAACC,KAAK,GAAGC,UAAUH,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC;iBAClD,IAAIC,AAAkB,SAAlBA,OAAO,CAACC,KAAK,IAAaC,QAAQH,MAAM,MAAM,GAAG,GAExDC,OAAO,CAACC,KAAK,GAAG,CAAC;YAErB,IAAID,AAAkB,SAAlBA,OAAO,CAACC,KAAK,EACbD,UAAUA,OAAO,CAACC,KAAK;QAE/B;IACJ;IAaA,MAAMG,iBAAiB,CAACC,MAAiBC,SAAiB,UAAU;QAChE,MAAMC,QAAkB,EAAE;QAE1BC,OAAO,IAAI,CAACH,MACP,IAAI,GACJ,OAAO,CAACI,CAAAA;YACL,MAAMC,QAAQL,IAAI,CAACI,IAAI;YACvB,IAAIC,AAAU,SAAVA,OAEAH,MAAM,IAAI,CAAC,GAAGD,SAASG,KAAK;iBACzB;gBAEHF,MAAM,IAAI,CAAC,GAAGD,SAASG,IAAI,EAAE,CAAC;gBAC9BF,MAAM,IAAI,CAACH,eAAeM,OAAOJ,SAAS;gBAC1CC,MAAM,IAAI,CAAC,GAAGD,OAAO,CAAC,CAAC;YAC3B;QACJ;QAEJ,OAAOC,MAAM,IAAI,CAAC;IACtB;IAEA,OAAOH,eAAeP;AAC1B"}
1
+ {"version":3,"file":"graphql/schema/cms/helpers/buildFieldsSelection.js","sources":["../../../../../src/graphql/schema/cms/helpers/buildFieldsSelection.ts"],"sourcesContent":["/**\n * Helper to build GraphQL fields selection from fields array.\n * Supports both top-level fields (e.g., \"createdOn\", \"id\") and values fields (e.g., \"values.author.name\").\n * Properly merges nested fields that share common parent paths.\n *\n * @param fields - Optional array of field paths in dot notation\n * @returns GraphQL selection string with proper field nesting\n *\n * @example\n * buildFieldsSelection([\"id\", \"entryId\", \"createdOn\", \"values.name\", \"values.author.name\", \"values.author.email\"])\n * // Returns:\n * // id\n * // entryId\n * // createdOn\n * // values {\n * // name\n * // author {\n * // name\n * // email\n * // }\n * // }\n */\nexport const buildFieldsSelection = (fields?: string[]): string => {\n if (!fields || fields.length === 0) {\n return `\n id\n entryId\n values\n `;\n }\n\n const rawSelections: string[] = [];\n const dotFields: string[] = [];\n\n for (const field of fields) {\n if (field.includes(\"{\")) {\n rawSelections.push(field);\n } else {\n dotFields.push(field);\n }\n }\n\n interface FieldNode {\n [key: string]: FieldNode | null;\n }\n\n const fieldTree: FieldNode = {};\n\n dotFields.forEach(field => {\n const parts = field.split(\".\");\n let current = fieldTree;\n\n parts.forEach((part, index) => {\n if (current[part] === undefined) {\n current[part] = index === parts.length - 1 ? null : {};\n } else if (current[part] === null && index < parts.length - 1) {\n current[part] = {};\n }\n if (current[part] !== null) {\n current = current[part] as FieldNode;\n }\n });\n });\n\n const buildSelection = (node: FieldNode, indent: string = \" \"): string => {\n const lines: string[] = [];\n\n Object.keys(node)\n .sort()\n .forEach(key => {\n const value = node[key];\n if (value === null) {\n lines.push(`${indent}${key}`);\n } else {\n lines.push(`${indent}${key} {`);\n lines.push(buildSelection(value, indent + \" \"));\n lines.push(`${indent}}`);\n }\n });\n\n return lines.join(\"\\n\");\n };\n\n const parts: string[] = [];\n\n if (dotFields.length > 0) {\n parts.push(buildSelection(fieldTree));\n }\n\n for (const raw of rawSelections) {\n parts.push(` ${raw}`);\n }\n\n return parts.join(\"\\n\");\n};\n"],"names":["buildFieldsSelection","fields","rawSelections","dotFields","field","fieldTree","parts","current","part","index","undefined","buildSelection","node","indent","lines","Object","key","value","raw"],"mappings":"AAsBO,MAAMA,uBAAuB,CAACC;IACjC,IAAI,CAACA,UAAUA,AAAkB,MAAlBA,OAAO,MAAM,EACxB,OAAO,CAAC;;;;QAIR,CAAC;IAGL,MAAMC,gBAA0B,EAAE;IAClC,MAAMC,YAAsB,EAAE;IAE9B,KAAK,MAAMC,SAASH,OAChB,IAAIG,MAAM,QAAQ,CAAC,MACfF,cAAc,IAAI,CAACE;SAEnBD,UAAU,IAAI,CAACC;IAQvB,MAAMC,YAAuB,CAAC;IAE9BF,UAAU,OAAO,CAACC,CAAAA;QACd,MAAME,QAAQF,MAAM,KAAK,CAAC;QAC1B,IAAIG,UAAUF;QAEdC,MAAM,OAAO,CAAC,CAACE,MAAMC;YACjB,IAAIF,AAAkBG,WAAlBH,OAAO,CAACC,KAAK,EACbD,OAAO,CAACC,KAAK,GAAGC,UAAUH,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC;iBAClD,IAAIC,AAAkB,SAAlBA,OAAO,CAACC,KAAK,IAAaC,QAAQH,MAAM,MAAM,GAAG,GACxDC,OAAO,CAACC,KAAK,GAAG,CAAC;YAErB,IAAID,AAAkB,SAAlBA,OAAO,CAACC,KAAK,EACbD,UAAUA,OAAO,CAACC,KAAK;QAE/B;IACJ;IAEA,MAAMG,iBAAiB,CAACC,MAAiBC,SAAiB,UAAU;QAChE,MAAMC,QAAkB,EAAE;QAE1BC,OAAO,IAAI,CAACH,MACP,IAAI,GACJ,OAAO,CAACI,CAAAA;YACL,MAAMC,QAAQL,IAAI,CAACI,IAAI;YACvB,IAAIC,AAAU,SAAVA,OACAH,MAAM,IAAI,CAAC,GAAGD,SAASG,KAAK;iBACzB;gBACHF,MAAM,IAAI,CAAC,GAAGD,SAASG,IAAI,EAAE,CAAC;gBAC9BF,MAAM,IAAI,CAACH,eAAeM,OAAOJ,SAAS;gBAC1CC,MAAM,IAAI,CAAC,GAAGD,OAAO,CAAC,CAAC;YAC3B;QACJ;QAEJ,OAAOC,MAAM,IAAI,CAAC;IACtB;IAEA,MAAMR,QAAkB,EAAE;IAE1B,IAAIH,UAAU,MAAM,GAAG,GACnBG,MAAM,IAAI,CAACK,eAAeN;IAG9B,KAAK,MAAMa,OAAOhB,cACdI,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAEY,KAAK;IAG/B,OAAOZ,MAAM,IAAI,CAAC;AACtB"}
@@ -0,0 +1,2 @@
1
+ import type { CmsContext, CmsModel } from "../../../../types/index.js";
2
+ export declare const expandFieldWildcards: (fields: string[], model: CmsModel, context: CmsContext) => string[];
@@ -0,0 +1,13 @@
1
+ import { ValuesSelectionGenerator } from "../../../../features/contentModel/ValuesSelectionGenerator/abstractions.js";
2
+ const expandFieldWildcards = (fields, model, context)=>{
3
+ if (!fields.includes("values.*")) return fields;
4
+ const generator = context.container.resolve(ValuesSelectionGenerator);
5
+ const valuesSelection = generator.generate(model);
6
+ if (!valuesSelection || "_empty" === valuesSelection) return fields.filter((f)=>"values.*" !== f);
7
+ const expanded = fields.filter((f)=>"values.*" !== f);
8
+ expanded.push(`values { ${valuesSelection} }`);
9
+ return expanded;
10
+ };
11
+ export { expandFieldWildcards };
12
+
13
+ //# sourceMappingURL=expandFieldWildcards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql/schema/cms/helpers/expandFieldWildcards.js","sources":["../../../../../src/graphql/schema/cms/helpers/expandFieldWildcards.ts"],"sourcesContent":["import type { CmsContext, CmsModel } from \"~/types/index.js\";\nimport { ValuesSelectionGenerator } from \"~/features/contentModel/ValuesSelectionGenerator/abstractions.js\";\n\nexport const expandFieldWildcards = (\n fields: string[],\n model: CmsModel,\n context: CmsContext\n): string[] => {\n if (!fields.includes(\"values.*\")) {\n return fields;\n }\n\n const generator = context.container.resolve(ValuesSelectionGenerator);\n const valuesSelection = generator.generate(model);\n\n if (!valuesSelection || valuesSelection === \"_empty\") {\n return fields.filter(f => f !== \"values.*\");\n }\n\n const expanded = fields.filter(f => f !== \"values.*\");\n expanded.push(`values { ${valuesSelection} }`);\n return expanded;\n};\n"],"names":["expandFieldWildcards","fields","model","context","generator","ValuesSelectionGenerator","valuesSelection","f","expanded"],"mappings":";AAGO,MAAMA,uBAAuB,CAChCC,QACAC,OACAC;IAEA,IAAI,CAACF,OAAO,QAAQ,CAAC,aACjB,OAAOA;IAGX,MAAMG,YAAYD,QAAQ,SAAS,CAAC,OAAO,CAACE;IAC5C,MAAMC,kBAAkBF,UAAU,QAAQ,CAACF;IAE3C,IAAI,CAACI,mBAAmBA,AAAoB,aAApBA,iBACpB,OAAOL,OAAO,MAAM,CAACM,CAAAA,IAAKA,AAAM,eAANA;IAG9B,MAAMC,WAAWP,OAAO,MAAM,CAACM,CAAAA,IAAKA,AAAM,eAANA;IACpCC,SAAS,IAAI,CAAC,CAAC,SAAS,EAAEF,gBAAgB,EAAE,CAAC;IAC7C,OAAOE;AACX"}
@@ -2,4 +2,5 @@ export { getErrorMessage } from "./getErrorMessage.js";
2
2
  export { getModel } from "./getModel.js";
3
3
  export { transformSortToArray } from "./transformSortToArray.js";
4
4
  export { buildFieldsSelection } from "./buildFieldsSelection.js";
5
+ export { expandFieldWildcards } from "./expandFieldWildcards.js";
5
6
  export { transformWhereToNested } from "./transformWhereToNested.js";
@@ -2,4 +2,5 @@ export { getErrorMessage } from "./getErrorMessage.js";
2
2
  export { getModel } from "./getModel.js";
3
3
  export { transformSortToArray } from "./transformSortToArray.js";
4
4
  export { buildFieldsSelection } from "./buildFieldsSelection.js";
5
+ export { expandFieldWildcards } from "./expandFieldWildcards.js";
5
6
  export { transformWhereToNested } from "./transformWhereToNested.js";
@@ -2,4 +2,5 @@ export { getErrorMessage } from "./helpers/getErrorMessage.js";
2
2
  export { getModel } from "./helpers/getModel.js";
3
3
  export { transformSortToArray } from "./helpers/transformSortToArray.js";
4
4
  export { buildFieldsSelection } from "./helpers/buildFieldsSelection.js";
5
+ export { expandFieldWildcards } from "./helpers/expandFieldWildcards.js";
5
6
  export { transformWhereToNested } from "./helpers/transformWhereToNested.js";
@@ -2,4 +2,5 @@ export { getErrorMessage } from "./helpers/getErrorMessage.js";
2
2
  export { getModel } from "./helpers/getModel.js";
3
3
  export { transformSortToArray } from "./helpers/transformSortToArray.js";
4
4
  export { buildFieldsSelection } from "./helpers/buildFieldsSelection.js";
5
+ export { expandFieldWildcards } from "./helpers/expandFieldWildcards.js";
5
6
  export { transformWhereToNested } from "./helpers/transformWhereToNested.js";
@@ -1,6 +1,6 @@
1
1
  import { ContextPlugin } from "@webiny/api";
2
2
  import { CmsMutationTypeDefsImpl, CmsQueryTypeDefsImpl, CmsResponseTypeDefsImpl } from "./typeDefs/index.js";
3
- import { CreateEntryResolverImpl, DeleteEntryRevisionResolverImpl, GetEntryResolverImpl, ListEntriesResolverImpl, MutationCmsResolverImpl, PublishEntryRevisionResolverImpl, QueryCmsResolverImpl, UnpublishEntryRevisionResolverImpl, UpdateEntryRevisionResolverImpl } from "./resolvers/index.js";
3
+ import { CreateEntryResolverImpl, DeleteEntryRevisionResolverImpl, GetEntryResolverImpl, GetModelResolverImpl, ListEntriesResolverImpl, MutationCmsResolverImpl, PublishEntryRevisionResolverImpl, QueryCmsResolverImpl, UnpublishEntryRevisionResolverImpl, UpdateEntryRevisionResolverImpl } from "./resolvers/index.js";
4
4
  const createCmsSchema = ()=>{
5
5
  const plugin = new ContextPlugin(async (context)=>{
6
6
  context.container.register(CmsResponseTypeDefsImpl);
@@ -15,6 +15,7 @@ const createCmsSchema = ()=>{
15
15
  context.container.register(DeleteEntryRevisionResolverImpl);
16
16
  context.container.register(PublishEntryRevisionResolverImpl);
17
17
  context.container.register(UnpublishEntryRevisionResolverImpl);
18
+ context.container.register(GetModelResolverImpl);
18
19
  });
19
20
  plugin.name = "headless-cms.graphql.createCmsSchema";
20
21
  return plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/schema/cms/index.js","sources":["../../../../src/graphql/schema/cms/index.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/api\";\nimport {\n CmsResponseTypeDefsImpl,\n CmsQueryTypeDefsImpl,\n CmsMutationTypeDefsImpl\n} from \"./typeDefs/index.js\";\nimport {\n QueryCmsResolverImpl,\n MutationCmsResolverImpl,\n GetEntryResolverImpl,\n ListEntriesResolverImpl,\n CreateEntryResolverImpl,\n UpdateEntryRevisionResolverImpl,\n DeleteEntryRevisionResolverImpl,\n PublishEntryRevisionResolverImpl,\n UnpublishEntryRevisionResolverImpl\n} from \"./resolvers/index.js\";\n\nexport const createCmsSchema = () => {\n const plugin = new ContextPlugin(async context => {\n // Register type definitions.\n context.container.register(CmsResponseTypeDefsImpl);\n context.container.register(CmsQueryTypeDefsImpl);\n context.container.register(CmsMutationTypeDefsImpl);\n\n // Register resolvers.\n context.container.register(QueryCmsResolverImpl);\n context.container.register(MutationCmsResolverImpl);\n context.container.register(GetEntryResolverImpl);\n context.container.register(ListEntriesResolverImpl);\n context.container.register(CreateEntryResolverImpl);\n context.container.register(UpdateEntryRevisionResolverImpl);\n context.container.register(DeleteEntryRevisionResolverImpl);\n context.container.register(PublishEntryRevisionResolverImpl);\n context.container.register(UnpublishEntryRevisionResolverImpl);\n });\n\n plugin.name = \"headless-cms.graphql.createCmsSchema\";\n\n return plugin;\n};\n"],"names":["createCmsSchema","plugin","ContextPlugin","context","CmsResponseTypeDefsImpl","CmsQueryTypeDefsImpl","CmsMutationTypeDefsImpl","QueryCmsResolverImpl","MutationCmsResolverImpl","GetEntryResolverImpl","ListEntriesResolverImpl","CreateEntryResolverImpl","UpdateEntryRevisionResolverImpl","DeleteEntryRevisionResolverImpl","PublishEntryRevisionResolverImpl","UnpublishEntryRevisionResolverImpl"],"mappings":";;;AAkBO,MAAMA,kBAAkB;IAC3B,MAAMC,SAAS,IAAIC,cAAc,OAAMC;QAEnCA,QAAQ,SAAS,CAAC,QAAQ,CAACC;QAC3BD,QAAQ,SAAS,CAAC,QAAQ,CAACE;QAC3BF,QAAQ,SAAS,CAAC,QAAQ,CAACG;QAG3BH,QAAQ,SAAS,CAAC,QAAQ,CAACI;QAC3BJ,QAAQ,SAAS,CAAC,QAAQ,CAACK;QAC3BL,QAAQ,SAAS,CAAC,QAAQ,CAACM;QAC3BN,QAAQ,SAAS,CAAC,QAAQ,CAACO;QAC3BP,QAAQ,SAAS,CAAC,QAAQ,CAACQ;QAC3BR,QAAQ,SAAS,CAAC,QAAQ,CAACS;QAC3BT,QAAQ,SAAS,CAAC,QAAQ,CAACU;QAC3BV,QAAQ,SAAS,CAAC,QAAQ,CAACW;QAC3BX,QAAQ,SAAS,CAAC,QAAQ,CAACY;IAC/B;IAEAd,OAAO,IAAI,GAAG;IAEd,OAAOA;AACX"}
1
+ {"version":3,"file":"graphql/schema/cms/index.js","sources":["../../../../src/graphql/schema/cms/index.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/api\";\nimport {\n CmsResponseTypeDefsImpl,\n CmsQueryTypeDefsImpl,\n CmsMutationTypeDefsImpl\n} from \"./typeDefs/index.js\";\nimport {\n QueryCmsResolverImpl,\n MutationCmsResolverImpl,\n GetEntryResolverImpl,\n ListEntriesResolverImpl,\n CreateEntryResolverImpl,\n UpdateEntryRevisionResolverImpl,\n DeleteEntryRevisionResolverImpl,\n PublishEntryRevisionResolverImpl,\n UnpublishEntryRevisionResolverImpl,\n GetModelResolverImpl\n} from \"./resolvers/index.js\";\n\nexport const createCmsSchema = () => {\n const plugin = new ContextPlugin(async context => {\n // Register type definitions.\n context.container.register(CmsResponseTypeDefsImpl);\n context.container.register(CmsQueryTypeDefsImpl);\n context.container.register(CmsMutationTypeDefsImpl);\n\n // Register resolvers.\n context.container.register(QueryCmsResolverImpl);\n context.container.register(MutationCmsResolverImpl);\n context.container.register(GetEntryResolverImpl);\n context.container.register(ListEntriesResolverImpl);\n context.container.register(CreateEntryResolverImpl);\n context.container.register(UpdateEntryRevisionResolverImpl);\n context.container.register(DeleteEntryRevisionResolverImpl);\n context.container.register(PublishEntryRevisionResolverImpl);\n context.container.register(UnpublishEntryRevisionResolverImpl);\n context.container.register(GetModelResolverImpl);\n });\n\n plugin.name = \"headless-cms.graphql.createCmsSchema\";\n\n return plugin;\n};\n"],"names":["createCmsSchema","plugin","ContextPlugin","context","CmsResponseTypeDefsImpl","CmsQueryTypeDefsImpl","CmsMutationTypeDefsImpl","QueryCmsResolverImpl","MutationCmsResolverImpl","GetEntryResolverImpl","ListEntriesResolverImpl","CreateEntryResolverImpl","UpdateEntryRevisionResolverImpl","DeleteEntryRevisionResolverImpl","PublishEntryRevisionResolverImpl","UnpublishEntryRevisionResolverImpl","GetModelResolverImpl"],"mappings":";;;AAmBO,MAAMA,kBAAkB;IAC3B,MAAMC,SAAS,IAAIC,cAAc,OAAMC;QAEnCA,QAAQ,SAAS,CAAC,QAAQ,CAACC;QAC3BD,QAAQ,SAAS,CAAC,QAAQ,CAACE;QAC3BF,QAAQ,SAAS,CAAC,QAAQ,CAACG;QAG3BH,QAAQ,SAAS,CAAC,QAAQ,CAACI;QAC3BJ,QAAQ,SAAS,CAAC,QAAQ,CAACK;QAC3BL,QAAQ,SAAS,CAAC,QAAQ,CAACM;QAC3BN,QAAQ,SAAS,CAAC,QAAQ,CAACO;QAC3BP,QAAQ,SAAS,CAAC,QAAQ,CAACQ;QAC3BR,QAAQ,SAAS,CAAC,QAAQ,CAACS;QAC3BT,QAAQ,SAAS,CAAC,QAAQ,CAACU;QAC3BV,QAAQ,SAAS,CAAC,QAAQ,CAACW;QAC3BX,QAAQ,SAAS,CAAC,QAAQ,CAACY;QAC3BZ,QAAQ,SAAS,CAAC,QAAQ,CAACa;IAC/B;IAEAf,OAAO,IAAI,GAAG;IAEd,OAAOA;AACX"}
@@ -1,11 +1,12 @@
1
- import { buildFieldsSelection, getErrorMessage, getModel, transformSortToArray, transformWhereToNested } from "./helpers.js";
1
+ import { buildFieldsSelection, expandFieldWildcards, getErrorMessage, getModel, transformSortToArray, transformWhereToNested } from "./helpers.js";
2
2
  const createListEntriesResolver = ()=>async ({ args, context })=>{
3
3
  const { modelId, where, sort, limit, after, search, fields, preview = false } = args;
4
4
  try {
5
5
  const model = await getModel(context, modelId);
6
6
  const apiType = preview ? "preview" : "read";
7
7
  const executeSchema = await context.cms.getExecutableSchema(apiType);
8
- const fieldsSelection = buildFieldsSelection(fields);
8
+ const expandedFields = expandFieldWildcards(fields, model, context);
9
+ const fieldsSelection = buildFieldsSelection(expandedFields);
9
10
  const transformedSort = transformSortToArray(sort);
10
11
  const transformedWhere = transformWhereToNested(where);
11
12
  const query = `
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/schema/cms/listEntriesResolver.js","sources":["../../../../src/graphql/schema/cms/listEntriesResolver.ts"],"sourcesContent":["import type { CmsContext } from \"~/types/index.js\";\nimport type { ApiEndpoint } from \"~/types/index.js\";\nimport type { ExecutionResult } from \"graphql\";\nimport {\n getModel,\n getErrorMessage,\n buildFieldsSelection,\n transformSortToArray,\n transformWhereToNested\n} from \"./helpers.js\";\n\nexport interface ListEntriesArgs {\n modelId: string;\n where?: Record<string, unknown>;\n sort?: Record<string, unknown> | string[];\n limit?: number;\n after?: string;\n search?: string;\n fields: string[];\n preview?: boolean;\n}\n\nexport const createListEntriesResolver = () => {\n return async ({ args, context }: { args: ListEntriesArgs; context: CmsContext }) => {\n const { modelId, where, sort, limit, after, search, fields, preview = false } = args;\n\n try {\n const model = await getModel(context, modelId);\n\n // Determine which API to use based on the preview flag.\n // preview=true -> preview API, preview=false -> read API\n const apiType: ApiEndpoint = preview ? \"preview\" : \"read\";\n const executeSchema = await context.cms.getExecutableSchema(apiType);\n\n const fieldsSelection = buildFieldsSelection(fields);\n\n // Transform sort to array format expected by the underlying GraphQL schema.\n // Handles both object format {createdOn: \"desc\"} and array format [\"createdOn_DESC\"].\n const transformedSort = transformSortToArray(sort);\n\n // Transform dot-notation where keys (e.g. \"values.name\") into nested objects\n // (e.g. { values: { name: ... } }) so they match the typed ListWhereInput.\n const transformedWhere = transformWhereToNested(where);\n\n const query = /* GraphQL */ `\n query List${model.pluralApiName}(\n $where: ${model.singularApiName}ListWhereInput\n $sort: [${model.singularApiName}ListSorter!]\n $limit: Int\n $after: String\n $search: String\n ) {\n list${model.pluralApiName}(\n where: $where\n sort: $sort\n limit: $limit\n after: $after\n search: $search\n ) {\n data {\n ${fieldsSelection}\n }\n meta {\n cursor\n hasMoreItems\n totalCount\n }\n error {\n message\n code\n data\n }\n }\n }\n `;\n\n const result = (await executeSchema({\n query,\n variables: { where: transformedWhere, sort: transformedSort, limit, after, search }\n })) as ExecutionResult;\n\n if (result.errors && result.errors.length > 0) {\n return {\n data: [],\n meta: { cursor: null, hasMoreItems: false, totalCount: 0 },\n error: {\n message: result.errors.map(e => e.message).join(\"; \"),\n code: \"LIST_ENTRIES_ERROR\"\n }\n };\n }\n\n const operationName = `list${model.pluralApiName}`;\n return (\n result.data?.[operationName] || {\n data: [],\n meta: { cursor: null, hasMoreItems: false, totalCount: 0 },\n error: null\n }\n );\n } catch (error) {\n return {\n data: [],\n meta: { cursor: null, hasMoreItems: false, totalCount: 0 },\n error: {\n message: getErrorMessage(error, \"Failed to list entries\"),\n code: \"LIST_ENTRIES_ERROR\"\n }\n };\n }\n };\n};\n"],"names":["createListEntriesResolver","args","context","modelId","where","sort","limit","after","search","fields","preview","model","getModel","apiType","executeSchema","fieldsSelection","buildFieldsSelection","transformedSort","transformSortToArray","transformedWhere","transformWhereToNested","query","result","e","operationName","error","getErrorMessage"],"mappings":";AAsBO,MAAMA,4BAA4B,IAC9B,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAkD;QAC3E,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEC,IAAI,EAAEC,KAAK,EAAEC,KAAK,EAAEC,MAAM,EAAEC,MAAM,EAAEC,UAAU,KAAK,EAAE,GAAGT;QAEhF,IAAI;YACA,MAAMU,QAAQ,MAAMC,SAASV,SAASC;YAItC,MAAMU,UAAuBH,UAAU,YAAY;YACnD,MAAMI,gBAAgB,MAAMZ,QAAQ,GAAG,CAAC,mBAAmB,CAACW;YAE5D,MAAME,kBAAkBC,qBAAqBP;YAI7C,MAAMQ,kBAAkBC,qBAAqBb;YAI7C,MAAMc,mBAAmBC,uBAAuBhB;YAEhD,MAAMiB,QAAsB,CAAC;0BACf,EAAEV,MAAM,aAAa,CAAC;4BACpB,EAAEA,MAAM,eAAe,CAAC;4BACxB,EAAEA,MAAM,eAAe,CAAC;;;;;wBAK5B,EAAEA,MAAM,aAAa,CAAC;;;;;;;;4BAQlB,EAAEI,gBAAgB;;;;;;;;;;;;;;YAclC,CAAC;YAED,MAAMO,SAAU,MAAMR,cAAc;gBAChCO;gBACA,WAAW;oBAAE,OAAOF;oBAAkB,MAAMF;oBAAiBX;oBAAOC;oBAAOC;gBAAO;YACtF;YAEA,IAAIc,OAAO,MAAM,IAAIA,OAAO,MAAM,CAAC,MAAM,GAAG,GACxC,OAAO;gBACH,MAAM,EAAE;gBACR,MAAM;oBAAE,QAAQ;oBAAM,cAAc;oBAAO,YAAY;gBAAE;gBACzD,OAAO;oBACH,SAASA,OAAO,MAAM,CAAC,GAAG,CAACC,CAAAA,IAAKA,EAAE,OAAO,EAAE,IAAI,CAAC;oBAChD,MAAM;gBACV;YACJ;YAGJ,MAAMC,gBAAgB,CAAC,IAAI,EAAEb,MAAM,aAAa,EAAE;YAClD,OACIW,OAAO,IAAI,EAAE,CAACE,cAAc,IAAI;gBAC5B,MAAM,EAAE;gBACR,MAAM;oBAAE,QAAQ;oBAAM,cAAc;oBAAO,YAAY;gBAAE;gBACzD,OAAO;YACX;QAER,EAAE,OAAOC,OAAO;YACZ,OAAO;gBACH,MAAM,EAAE;gBACR,MAAM;oBAAE,QAAQ;oBAAM,cAAc;oBAAO,YAAY;gBAAE;gBACzD,OAAO;oBACH,SAASC,gBAAgBD,OAAO;oBAChC,MAAM;gBACV;YACJ;QACJ;IACJ"}
1
+ {"version":3,"file":"graphql/schema/cms/listEntriesResolver.js","sources":["../../../../src/graphql/schema/cms/listEntriesResolver.ts"],"sourcesContent":["import type { CmsContext } from \"~/types/index.js\";\nimport type { ApiEndpoint } from \"~/types/index.js\";\nimport type { ExecutionResult } from \"graphql\";\nimport {\n getModel,\n getErrorMessage,\n buildFieldsSelection,\n expandFieldWildcards,\n transformSortToArray,\n transformWhereToNested\n} from \"./helpers.js\";\n\nexport interface ListEntriesArgs {\n modelId: string;\n where?: Record<string, unknown>;\n sort?: Record<string, unknown> | string[];\n limit?: number;\n after?: string;\n search?: string;\n fields: string[];\n preview?: boolean;\n}\n\nexport const createListEntriesResolver = () => {\n return async ({ args, context }: { args: ListEntriesArgs; context: CmsContext }) => {\n const { modelId, where, sort, limit, after, search, fields, preview = false } = args;\n\n try {\n const model = await getModel(context, modelId);\n\n // Determine which API to use based on the preview flag.\n // preview=true -> preview API, preview=false -> read API\n const apiType: ApiEndpoint = preview ? \"preview\" : \"read\";\n const executeSchema = await context.cms.getExecutableSchema(apiType);\n\n const expandedFields = expandFieldWildcards(fields, model, context);\n const fieldsSelection = buildFieldsSelection(expandedFields);\n\n // Transform sort to array format expected by the underlying GraphQL schema.\n // Handles both object format {createdOn: \"desc\"} and array format [\"createdOn_DESC\"].\n const transformedSort = transformSortToArray(sort);\n\n // Transform dot-notation where keys (e.g. \"values.name\") into nested objects\n // (e.g. { values: { name: ... } }) so they match the typed ListWhereInput.\n const transformedWhere = transformWhereToNested(where);\n\n const query = /* GraphQL */ `\n query List${model.pluralApiName}(\n $where: ${model.singularApiName}ListWhereInput\n $sort: [${model.singularApiName}ListSorter!]\n $limit: Int\n $after: String\n $search: String\n ) {\n list${model.pluralApiName}(\n where: $where\n sort: $sort\n limit: $limit\n after: $after\n search: $search\n ) {\n data {\n ${fieldsSelection}\n }\n meta {\n cursor\n hasMoreItems\n totalCount\n }\n error {\n message\n code\n data\n }\n }\n }\n `;\n\n const result = (await executeSchema({\n query,\n variables: { where: transformedWhere, sort: transformedSort, limit, after, search }\n })) as ExecutionResult;\n\n if (result.errors && result.errors.length > 0) {\n return {\n data: [],\n meta: { cursor: null, hasMoreItems: false, totalCount: 0 },\n error: {\n message: result.errors.map(e => e.message).join(\"; \"),\n code: \"LIST_ENTRIES_ERROR\"\n }\n };\n }\n\n const operationName = `list${model.pluralApiName}`;\n return (\n result.data?.[operationName] || {\n data: [],\n meta: { cursor: null, hasMoreItems: false, totalCount: 0 },\n error: null\n }\n );\n } catch (error) {\n return {\n data: [],\n meta: { cursor: null, hasMoreItems: false, totalCount: 0 },\n error: {\n message: getErrorMessage(error, \"Failed to list entries\"),\n code: \"LIST_ENTRIES_ERROR\"\n }\n };\n }\n };\n};\n"],"names":["createListEntriesResolver","args","context","modelId","where","sort","limit","after","search","fields","preview","model","getModel","apiType","executeSchema","expandedFields","expandFieldWildcards","fieldsSelection","buildFieldsSelection","transformedSort","transformSortToArray","transformedWhere","transformWhereToNested","query","result","e","operationName","error","getErrorMessage"],"mappings":";AAuBO,MAAMA,4BAA4B,IAC9B,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAkD;QAC3E,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEC,IAAI,EAAEC,KAAK,EAAEC,KAAK,EAAEC,MAAM,EAAEC,MAAM,EAAEC,UAAU,KAAK,EAAE,GAAGT;QAEhF,IAAI;YACA,MAAMU,QAAQ,MAAMC,SAASV,SAASC;YAItC,MAAMU,UAAuBH,UAAU,YAAY;YACnD,MAAMI,gBAAgB,MAAMZ,QAAQ,GAAG,CAAC,mBAAmB,CAACW;YAE5D,MAAME,iBAAiBC,qBAAqBP,QAAQE,OAAOT;YAC3D,MAAMe,kBAAkBC,qBAAqBH;YAI7C,MAAMI,kBAAkBC,qBAAqBf;YAI7C,MAAMgB,mBAAmBC,uBAAuBlB;YAEhD,MAAMmB,QAAsB,CAAC;0BACf,EAAEZ,MAAM,aAAa,CAAC;4BACpB,EAAEA,MAAM,eAAe,CAAC;4BACxB,EAAEA,MAAM,eAAe,CAAC;;;;;wBAK5B,EAAEA,MAAM,aAAa,CAAC;;;;;;;;4BAQlB,EAAEM,gBAAgB;;;;;;;;;;;;;;YAclC,CAAC;YAED,MAAMO,SAAU,MAAMV,cAAc;gBAChCS;gBACA,WAAW;oBAAE,OAAOF;oBAAkB,MAAMF;oBAAiBb;oBAAOC;oBAAOC;gBAAO;YACtF;YAEA,IAAIgB,OAAO,MAAM,IAAIA,OAAO,MAAM,CAAC,MAAM,GAAG,GACxC,OAAO;gBACH,MAAM,EAAE;gBACR,MAAM;oBAAE,QAAQ;oBAAM,cAAc;oBAAO,YAAY;gBAAE;gBACzD,OAAO;oBACH,SAASA,OAAO,MAAM,CAAC,GAAG,CAACC,CAAAA,IAAKA,EAAE,OAAO,EAAE,IAAI,CAAC;oBAChD,MAAM;gBACV;YACJ;YAGJ,MAAMC,gBAAgB,CAAC,IAAI,EAAEf,MAAM,aAAa,EAAE;YAClD,OACIa,OAAO,IAAI,EAAE,CAACE,cAAc,IAAI;gBAC5B,MAAM,EAAE;gBACR,MAAM;oBAAE,QAAQ;oBAAM,cAAc;oBAAO,YAAY;gBAAE;gBACzD,OAAO;YACX;QAER,EAAE,OAAOC,OAAO;YACZ,OAAO;gBACH,MAAM,EAAE;gBACR,MAAM;oBAAE,QAAQ;oBAAM,cAAc;oBAAO,YAAY;gBAAE;gBACzD,OAAO;oBACH,SAASC,gBAAgBD,OAAO;oBAChC,MAAM;gBACV;YACJ;QACJ;IACJ"}
@@ -0,0 +1,8 @@
1
+ import { CoreGraphQLSchemaFactory } from "@webiny/handler-graphql/graphql/abstractions.core.js";
2
+ declare class GetModelResolver implements CoreGraphQLSchemaFactory.Interface {
3
+ execute(builder: CoreGraphQLSchemaFactory.SchemaBuilder): CoreGraphQLSchemaFactory.Return;
4
+ }
5
+ export declare const GetModelResolverImpl: typeof GetModelResolver & {
6
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/handler-graphql/graphql/abstractions.public.js").IGraphQLSchemaFactory>;
7
+ };
8
+ export {};
@@ -0,0 +1,18 @@
1
+ import { CoreGraphQLSchemaFactory } from "@webiny/handler-graphql/graphql/abstractions.core.js";
2
+ import { createGetModelResolver } from "../getModelResolver.js";
3
+ class GetModelResolver {
4
+ async execute(builder) {
5
+ builder.addResolver({
6
+ path: "CmsQuery.getModel",
7
+ resolver: createGetModelResolver
8
+ });
9
+ return builder;
10
+ }
11
+ }
12
+ const GetModelResolverImpl = CoreGraphQLSchemaFactory.createImplementation({
13
+ implementation: GetModelResolver,
14
+ dependencies: []
15
+ });
16
+ export { GetModelResolverImpl };
17
+
18
+ //# sourceMappingURL=getModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql/schema/cms/resolvers/getModel.js","sources":["../../../../../src/graphql/schema/cms/resolvers/getModel.ts"],"sourcesContent":["import { CoreGraphQLSchemaFactory } from \"@webiny/handler-graphql/graphql/abstractions.core.js\";\nimport { createGetModelResolver } from \"../getModelResolver.js\";\n\nclass GetModelResolver implements CoreGraphQLSchemaFactory.Interface {\n async execute(\n builder: CoreGraphQLSchemaFactory.SchemaBuilder\n ): CoreGraphQLSchemaFactory.Return {\n builder.addResolver({\n path: \"CmsQuery.getModel\",\n resolver: createGetModelResolver\n });\n\n return builder;\n }\n}\n\nexport const GetModelResolverImpl = CoreGraphQLSchemaFactory.createImplementation({\n implementation: GetModelResolver,\n dependencies: []\n});\n"],"names":["GetModelResolver","builder","createGetModelResolver","GetModelResolverImpl","CoreGraphQLSchemaFactory"],"mappings":";;AAGA,MAAMA;IACF,MAAM,QACFC,OAA+C,EAChB;QAC/BA,QAAQ,WAAW,CAAC;YAChB,MAAM;YACN,UAAUC;QACd;QAEA,OAAOD;IACX;AACJ;AAEO,MAAME,uBAAuBC,yBAAyB,oBAAoB,CAAC;IAC9E,gBAAgBJ;IAChB,cAAc,EAAE;AACpB"}
@@ -7,3 +7,4 @@ export { UpdateEntryRevisionResolverImpl } from "./updateEntryRevision.js";
7
7
  export { DeleteEntryRevisionResolverImpl } from "./deleteEntryRevision.js";
8
8
  export { PublishEntryRevisionResolverImpl } from "./publishEntryRevision.js";
9
9
  export { UnpublishEntryRevisionResolverImpl } from "./unpublishEntryRevision.js";
10
+ export { GetModelResolverImpl } from "./getModel.js";
@@ -7,3 +7,4 @@ export { UpdateEntryRevisionResolverImpl } from "./updateEntryRevision.js";
7
7
  export { DeleteEntryRevisionResolverImpl } from "./deleteEntryRevision.js";
8
8
  export { PublishEntryRevisionResolverImpl } from "./publishEntryRevision.js";
9
9
  export { UnpublishEntryRevisionResolverImpl } from "./unpublishEntryRevision.js";
10
+ export { GetModelResolverImpl } from "./getModel.js";
@@ -19,6 +19,7 @@ class CmsQueryTypeDefs {
19
19
  fields: [String!]!
20
20
  preview: Boolean
21
21
  ): CmsListResponse!
22
+ getModel(modelId: ID!): CmsModelResponse!
22
23
  }
23
24
 
24
25
  extend type Query {
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/schema/cms/typeDefs/query.js","sources":["../../../../../src/graphql/schema/cms/typeDefs/query.ts"],"sourcesContent":["import { CoreGraphQLSchemaFactory } from \"@webiny/handler-graphql/graphql/abstractions.core.js\";\n\nclass CmsQueryTypeDefs implements CoreGraphQLSchemaFactory.Interface {\n async execute(\n builder: CoreGraphQLSchemaFactory.SchemaBuilder\n ): CoreGraphQLSchemaFactory.Return {\n builder.addTypeDefs(/* GraphQL */ `\n type CmsQuery {\n getEntry(\n modelId: ID!\n where: JSON!\n fields: [String!]!\n preview: Boolean\n ): CmsEntryResponse!\n listEntries(\n modelId: ID!\n where: JSON\n sort: JSON\n limit: Int\n after: String\n search: String\n fields: [String!]!\n preview: Boolean\n ): CmsListResponse!\n }\n\n extend type Query {\n cms: CmsQuery!\n }\n `);\n\n return builder;\n }\n}\n\nexport const CmsQueryTypeDefsImpl = CoreGraphQLSchemaFactory.createImplementation({\n implementation: CmsQueryTypeDefs,\n dependencies: []\n});\n"],"names":["CmsQueryTypeDefs","builder","CmsQueryTypeDefsImpl","CoreGraphQLSchemaFactory"],"mappings":";AAEA,MAAMA;IACF,MAAM,QACFC,OAA+C,EAChB;QAC/BA,QAAQ,WAAW,CAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;QAuBnC,CAAC;QAED,OAAOA;IACX;AACJ;AAEO,MAAMC,uBAAuBC,yBAAyB,oBAAoB,CAAC;IAC9E,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"graphql/schema/cms/typeDefs/query.js","sources":["../../../../../src/graphql/schema/cms/typeDefs/query.ts"],"sourcesContent":["import { CoreGraphQLSchemaFactory } from \"@webiny/handler-graphql/graphql/abstractions.core.js\";\n\nclass CmsQueryTypeDefs implements CoreGraphQLSchemaFactory.Interface {\n async execute(\n builder: CoreGraphQLSchemaFactory.SchemaBuilder\n ): CoreGraphQLSchemaFactory.Return {\n builder.addTypeDefs(/* GraphQL */ `\n type CmsQuery {\n getEntry(\n modelId: ID!\n where: JSON!\n fields: [String!]!\n preview: Boolean\n ): CmsEntryResponse!\n listEntries(\n modelId: ID!\n where: JSON\n sort: JSON\n limit: Int\n after: String\n search: String\n fields: [String!]!\n preview: Boolean\n ): CmsListResponse!\n getModel(modelId: ID!): CmsModelResponse!\n }\n\n extend type Query {\n cms: CmsQuery!\n }\n `);\n\n return builder;\n }\n}\n\nexport const CmsQueryTypeDefsImpl = CoreGraphQLSchemaFactory.createImplementation({\n implementation: CmsQueryTypeDefs,\n dependencies: []\n});\n"],"names":["CmsQueryTypeDefs","builder","CmsQueryTypeDefsImpl","CoreGraphQLSchemaFactory"],"mappings":";AAEA,MAAMA;IACF,MAAM,QACFC,OAA+C,EAChB;QAC/BA,QAAQ,WAAW,CAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;QAwBnC,CAAC;QAED,OAAOA;IACX;AACJ;AAEO,MAAMC,uBAAuBC,yBAAyB,oBAAoB,CAAC;IAC9E,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
@@ -23,6 +23,11 @@ class CmsResponseTypeDefs {
23
23
  data: Boolean
24
24
  error: CmsError
25
25
  }
26
+
27
+ type CmsModelResponse {
28
+ data: JSON
29
+ error: CmsError
30
+ }
26
31
  `);
27
32
  return builder;
28
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graphql/schema/cms/typeDefs/responses.js","sources":["../../../../../src/graphql/schema/cms/typeDefs/responses.ts"],"sourcesContent":["import { CoreGraphQLSchemaFactory } from \"@webiny/handler-graphql/graphql/abstractions.core.js\";\n\nclass CmsResponseTypeDefs implements CoreGraphQLSchemaFactory.Interface {\n async execute(\n builder: CoreGraphQLSchemaFactory.SchemaBuilder\n ): CoreGraphQLSchemaFactory.Return {\n builder.addTypeDefs(/* GraphQL */ `\n type CmsEntryResponse {\n data: JSON\n error: CmsError\n }\n\n type CmsListMeta {\n cursor: String\n hasMoreItems: Boolean\n totalCount: Int\n }\n\n type CmsListResponse {\n data: [JSON!]\n meta: CmsListMeta\n error: CmsError\n }\n\n type CmsDeleteResponse {\n data: Boolean\n error: CmsError\n }\n `);\n\n return builder;\n }\n}\n\nexport const CmsResponseTypeDefsImpl = CoreGraphQLSchemaFactory.createImplementation({\n implementation: CmsResponseTypeDefs,\n dependencies: []\n});\n"],"names":["CmsResponseTypeDefs","builder","CmsResponseTypeDefsImpl","CoreGraphQLSchemaFactory"],"mappings":";AAEA,MAAMA;IACF,MAAM,QACFC,OAA+C,EAChB;QAC/BA,QAAQ,WAAW,CAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;QAsBnC,CAAC;QAED,OAAOA;IACX;AACJ;AAEO,MAAMC,0BAA0BC,yBAAyB,oBAAoB,CAAC;IACjF,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"graphql/schema/cms/typeDefs/responses.js","sources":["../../../../../src/graphql/schema/cms/typeDefs/responses.ts"],"sourcesContent":["import { CoreGraphQLSchemaFactory } from \"@webiny/handler-graphql/graphql/abstractions.core.js\";\n\nclass CmsResponseTypeDefs implements CoreGraphQLSchemaFactory.Interface {\n async execute(\n builder: CoreGraphQLSchemaFactory.SchemaBuilder\n ): CoreGraphQLSchemaFactory.Return {\n builder.addTypeDefs(/* GraphQL */ `\n type CmsEntryResponse {\n data: JSON\n error: CmsError\n }\n\n type CmsListMeta {\n cursor: String\n hasMoreItems: Boolean\n totalCount: Int\n }\n\n type CmsListResponse {\n data: [JSON!]\n meta: CmsListMeta\n error: CmsError\n }\n\n type CmsDeleteResponse {\n data: Boolean\n error: CmsError\n }\n\n type CmsModelResponse {\n data: JSON\n error: CmsError\n }\n `);\n\n return builder;\n }\n}\n\nexport const CmsResponseTypeDefsImpl = CoreGraphQLSchemaFactory.createImplementation({\n implementation: CmsResponseTypeDefs,\n dependencies: []\n});\n"],"names":["CmsResponseTypeDefs","builder","CmsResponseTypeDefsImpl","CoreGraphQLSchemaFactory"],"mappings":";AAEA,MAAMA;IACF,MAAM,QACFC,OAA+C,EAChB;QAC/BA,QAAQ,WAAW,CAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;QA2BnC,CAAC;QAED,OAAOA;IACX;AACJ;AAEO,MAAMC,0BAA0BC,yBAAyB,oBAAoB,CAAC;IACjF,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
@@ -1,5 +1,8 @@
1
1
  import { ErrorResponse, NotFoundError, Response } from "@webiny/handler-graphql";
2
2
  import { createCmsGraphQLSchemaPlugin } from "../../plugins/index.js";
3
+ import { ValuesSelectionGenerator } from "../../features/contentModel/ValuesSelectionGenerator/abstractions.js";
4
+ import { ComponentMapGenerator } from "../../features/contentModel/ComponentMapGenerator/abstractions.js";
5
+ import { RefModelsGenerator } from "../../features/contentModel/RefModelsGenerator/abstractions.js";
3
6
  const createModelsSchema = ({ context })=>{
4
7
  const resolvers = {
5
8
  Query: {
@@ -36,7 +39,22 @@ const createModelsSchema = ({ context })=>{
36
39
  return Array.isArray(field.tags) ? field.tags : [];
37
40
  }
38
41
  },
42
+ CmsContentModelMetadata: {
43
+ valuesSelection: (model, _, ctx)=>{
44
+ const generator = ctx.container.resolve(ValuesSelectionGenerator);
45
+ return generator.generate(model);
46
+ },
47
+ componentMap: (model, _, ctx)=>{
48
+ const generator = ctx.container.resolve(ComponentMapGenerator);
49
+ return generator.generate(model);
50
+ },
51
+ refModels: async (model, _, ctx)=>{
52
+ const generator = ctx.container.resolve(RefModelsGenerator);
53
+ return generator.generate(model);
54
+ }
55
+ },
39
56
  CmsContentModel: {
57
+ metadata: (model)=>model,
40
58
  tags (model) {
41
59
  const hasType = (model.tags || []).find((tag)=>tag.startsWith("type:"));
42
60
  return hasType ? model.tags : [
@@ -44,7 +62,11 @@ const createModelsSchema = ({ context })=>{
44
62
  ...model.tags || []
45
63
  ];
46
64
  },
47
- plugin: (model)=>model.isPlugin ?? false
65
+ plugin: (model)=>model.isPlugin ?? false,
66
+ valuesSelection: (model, _, ctx)=>{
67
+ const generator = ctx.container.resolve(ValuesSelectionGenerator);
68
+ return generator.generate(model);
69
+ }
48
70
  }
49
71
  };
50
72
  let manageSchema = "";
@@ -129,6 +151,7 @@ const createModelsSchema = ({ context })=>{
129
151
  type: String!
130
152
  tags: [String!]
131
153
  list: Boolean
154
+ disabled: Boolean
132
155
  predefinedValues: CmsPredefinedValuesInput
133
156
  renderer: CmsFieldRendererInput
134
157
  validation: [CmsFieldValidationInput]
@@ -153,6 +176,7 @@ const createModelsSchema = ({ context })=>{
153
176
  imageFieldId: String
154
177
  tags: [String!]
155
178
  defaultFields: Boolean
179
+ settings: JSON
156
180
  }
157
181
 
158
182
  input CmsContentModelCreateFromInput {
@@ -178,6 +202,7 @@ const createModelsSchema = ({ context })=>{
178
202
  descriptionFieldId: String
179
203
  imageFieldId: String
180
204
  tags: [String!]
205
+ settings: JSON
181
206
  }
182
207
 
183
208
  extend type Mutation {
@@ -243,6 +268,7 @@ const createModelsSchema = ({ context })=>{
243
268
  type: String!
244
269
  tags: [String!]!
245
270
  list: Boolean
271
+ disabled: Boolean
246
272
  predefinedValues: CmsPredefinedValues
247
273
  renderer: CmsFieldRenderer
248
274
  validation: [CmsFieldValidation!]
@@ -251,6 +277,16 @@ const createModelsSchema = ({ context })=>{
251
277
  rules: [CmsFieldRule!]
252
278
  }
253
279
 
280
+ type CmsContentModelRefModel {
281
+ valuesSelection: String
282
+ }
283
+
284
+ type CmsContentModelMetadata {
285
+ valuesSelection: String
286
+ componentMap: JSON
287
+ refModels: JSON
288
+ }
289
+
254
290
  type CmsContentModel {
255
291
  name: String!
256
292
  singularApiName: String!
@@ -269,8 +305,11 @@ const createModelsSchema = ({ context })=>{
269
305
  imageFieldId: String
270
306
  tags: [String!]!
271
307
  tenant: String!
308
+ settings: JSON
272
309
  # Returns true if the content model is registered via a plugin.
273
310
  plugin: Boolean!
311
+ valuesSelection: String
312
+ metadata: CmsContentModelMetadata
274
313
  }
275
314
 
276
315
  type CmsContentModelResponse {
@@ -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";