@webiny/api-headless-cms 6.6.0-alpha.0 → 6.6.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/HeadlessCmsFeature.js +4 -1
  2. package/HeadlessCmsFeature.js.map +1 -1
  3. package/createCmsRoute.d.ts +13 -8
  4. package/createCmsRoute.js +14 -4
  5. package/createCmsRoute.js.map +1 -1
  6. package/crud/contentEntry/entryDataValidation.js +27 -0
  7. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  8. package/crud/contentModel/defaultFields.js +3 -2
  9. package/crud/contentModel/defaultFields.js.map +1 -1
  10. package/domain/contentModel/schemas.d.ts +8 -6
  11. package/domain/contentModel/schemas.js +5 -3
  12. package/domain/contentModel/schemas.js.map +1 -1
  13. package/exports/api/cms/model.d.ts +4 -1
  14. package/exports/api/cms/model.js +2 -0
  15. package/features/ai/DescribeContentModelTool.d.ts +55 -0
  16. package/features/ai/DescribeContentModelTool.js +60 -0
  17. package/features/ai/DescribeContentModelTool.js.map +1 -0
  18. package/features/ai/ListContentModelsTool.d.ts +41 -0
  19. package/features/ai/ListContentModelsTool.js +44 -0
  20. package/features/ai/ListContentModelsTool.js.map +1 -0
  21. package/features/ai/QueryEntriesTool.d.ts +75 -0
  22. package/features/ai/QueryEntriesTool.js +90 -0
  23. package/features/ai/QueryEntriesTool.js.map +1 -0
  24. package/features/ai/feature.d.ts +8 -0
  25. package/features/ai/feature.js +15 -0
  26. package/features/ai/feature.js.map +1 -0
  27. package/features/ai/index.d.ts +4 -0
  28. package/features/ai/index.js +4 -0
  29. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.d.ts +14 -0
  30. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js +32 -0
  31. package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js.map +1 -0
  32. package/features/contentModel/ComponentMapGenerator/abstractions.d.ts +8 -0
  33. package/features/contentModel/ComponentMapGenerator/abstractions.js +5 -0
  34. package/features/contentModel/ComponentMapGenerator/abstractions.js.map +1 -0
  35. package/features/contentModel/ComponentMapGenerator/feature.d.ts +4 -0
  36. package/features/contentModel/ComponentMapGenerator/feature.js +11 -0
  37. package/features/contentModel/ComponentMapGenerator/feature.js.map +1 -0
  38. package/features/contentModel/ComponentMapGenerator/index.d.ts +2 -0
  39. package/features/contentModel/ComponentMapGenerator/index.js +2 -0
  40. package/features/contentModel/ContentModelFeature.js +4 -0
  41. package/features/contentModel/ContentModelFeature.js.map +1 -1
  42. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.d.ts +19 -0
  43. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js +56 -0
  44. package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js.map +1 -0
  45. package/features/contentModel/RefModelsGenerator/abstractions.d.ts +11 -0
  46. package/features/contentModel/RefModelsGenerator/abstractions.js +5 -0
  47. package/features/contentModel/RefModelsGenerator/abstractions.js.map +1 -0
  48. package/features/contentModel/RefModelsGenerator/feature.d.ts +4 -0
  49. package/features/contentModel/RefModelsGenerator/feature.js +11 -0
  50. package/features/contentModel/RefModelsGenerator/feature.js.map +1 -0
  51. package/features/contentModel/RefModelsGenerator/index.d.ts +2 -0
  52. package/features/contentModel/RefModelsGenerator/index.js +2 -0
  53. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js +2 -0
  54. package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js.map +1 -1
  55. package/features/contentModelGroup/CreateGroup/CreateGroupRepository.d.ts +3 -1
  56. package/features/contentModelGroup/CreateGroup/CreateGroupRepository.js +6 -4
  57. package/features/contentModelGroup/CreateGroup/CreateGroupRepository.js.map +1 -1
  58. package/features/graphql/feature.js +2 -0
  59. package/features/graphql/feature.js.map +1 -1
  60. package/features/graphql/fields/base/AssetToGraphQL.d.ts +26 -0
  61. package/features/graphql/fields/base/AssetToGraphQL.js +148 -0
  62. package/features/graphql/fields/base/AssetToGraphQL.js.map +1 -0
  63. package/features/graphql/fields/base/DynamicZoneToGraphQL.js +5 -1
  64. package/features/graphql/fields/base/DynamicZoneToGraphQL.js.map +1 -1
  65. package/features/graphql/fields/base/ObjectToGraphQL.js +2 -2
  66. package/features/graphql/fields/base/ObjectToGraphQL.js.map +1 -1
  67. package/features/modelBuilder/abstractions.d.ts +10 -0
  68. package/features/modelBuilder/abstractions.js.map +1 -1
  69. package/features/modelBuilder/feature.js +2 -0
  70. package/features/modelBuilder/feature.js.map +1 -1
  71. package/features/modelBuilder/fields/AssetFieldType.d.ts +20 -0
  72. package/features/modelBuilder/fields/AssetFieldType.js +46 -0
  73. package/features/modelBuilder/fields/AssetFieldType.js.map +1 -0
  74. package/features/modelBuilder/fields/BaseFieldBuilder.d.ts +3 -1
  75. package/features/modelBuilder/fields/BaseFieldBuilder.js +4 -0
  76. package/features/modelBuilder/fields/BaseFieldBuilder.js.map +1 -1
  77. package/features/modelBuilder/fields/DataFieldBuilder.d.ts +42 -0
  78. package/features/modelBuilder/fields/DataFieldBuilder.js +5 -1
  79. package/features/modelBuilder/fields/DataFieldBuilder.js.map +1 -1
  80. package/features/modelBuilder/fields/DynamicZoneFieldType.d.ts +1 -0
  81. package/features/modelBuilder/fields/DynamicZoneFieldType.js +10 -9
  82. package/features/modelBuilder/fields/DynamicZoneFieldType.js.map +1 -1
  83. package/features/modelBuilder/fields/UiAlertFieldType.js +2 -1
  84. package/features/modelBuilder/fields/UiAlertFieldType.js.map +1 -1
  85. package/features/modelBuilder/fields/UiSeparatorFieldType.js +2 -1
  86. package/features/modelBuilder/fields/UiSeparatorFieldType.js.map +1 -1
  87. package/features/modelBuilder/fields/UiTabsFieldType.d.ts +2 -1
  88. package/features/modelBuilder/fields/UiTabsFieldType.js +6 -3
  89. package/features/modelBuilder/fields/UiTabsFieldType.js.map +1 -1
  90. package/features/modelBuilder/fields/resolveAssetUrl.d.ts +35 -0
  91. package/features/modelBuilder/fields/resolveAssetUrl.js +26 -0
  92. package/features/modelBuilder/fields/resolveAssetUrl.js.map +1 -0
  93. package/features/modelBuilder/index.d.ts +1 -1
  94. package/features/modelBuilder/models/BaseModelBuilder.d.ts +3 -1
  95. package/features/modelBuilder/models/BaseModelBuilder.js +7 -0
  96. package/features/modelBuilder/models/BaseModelBuilder.js.map +1 -1
  97. package/features/modelBuilder/models/PrivateModelBuilder.js +2 -1
  98. package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
  99. package/features/modelBuilder/models/PublicModelBuilder.js +2 -1
  100. package/features/modelBuilder/models/PublicModelBuilder.js.map +1 -1
  101. package/features/sortMapper/SortMapper.js +2 -5
  102. package/features/sortMapper/SortMapper.js.map +1 -1
  103. package/features/whereMapper/WhereMapper.js +7 -5
  104. package/features/whereMapper/WhereMapper.js.map +1 -1
  105. package/graphql/schema/cms/getEntryResolver.js +3 -2
  106. package/graphql/schema/cms/getEntryResolver.js.map +1 -1
  107. package/graphql/schema/cms/getModelResolver.d.ts +35 -0
  108. package/graphql/schema/cms/getModelResolver.js +49 -0
  109. package/graphql/schema/cms/getModelResolver.js.map +1 -0
  110. package/graphql/schema/cms/helpers/buildFieldsSelection.js +9 -2
  111. package/graphql/schema/cms/helpers/buildFieldsSelection.js.map +1 -1
  112. package/graphql/schema/cms/helpers/expandFieldWildcards.d.ts +2 -0
  113. package/graphql/schema/cms/helpers/expandFieldWildcards.js +13 -0
  114. package/graphql/schema/cms/helpers/expandFieldWildcards.js.map +1 -0
  115. package/graphql/schema/cms/helpers/index.d.ts +1 -0
  116. package/graphql/schema/cms/helpers/index.js +1 -0
  117. package/graphql/schema/cms/helpers/transformWhereToNested.js +39 -17
  118. package/graphql/schema/cms/helpers/transformWhereToNested.js.map +1 -1
  119. package/graphql/schema/cms/helpers.d.ts +1 -0
  120. package/graphql/schema/cms/helpers.js +1 -0
  121. package/graphql/schema/cms/listEntriesResolver.js +3 -2
  122. package/graphql/schema/cms/listEntriesResolver.js.map +1 -1
  123. package/graphql/schema/cms/resolvers/getModel.d.ts +8 -0
  124. package/graphql/schema/cms/resolvers/getModel.js +18 -0
  125. package/graphql/schema/cms/resolvers/getModel.js.map +1 -0
  126. package/graphql/schema/cms/resolvers/index.d.ts +1 -0
  127. package/graphql/schema/cms/resolvers/index.js +1 -0
  128. package/graphql/schema/cms/typeDefs/query.js +1 -0
  129. package/graphql/schema/cms/typeDefs/query.js.map +1 -1
  130. package/graphql/schema/cms/typeDefs/responses.js +5 -0
  131. package/graphql/schema/cms/typeDefs/responses.js.map +1 -1
  132. package/graphql/schema/contentModels.js +31 -0
  133. package/graphql/schema/contentModels.js.map +1 -1
  134. package/package.json +21 -22
  135. package/plugins/CmsModelPlugin.js +2 -1
  136. package/plugins/CmsModelPlugin.js.map +1 -1
  137. package/types/fields/dynamicZoneField.d.ts +3 -2
  138. package/types/model.d.ts +6 -0
  139. package/types/modelField.d.ts +3 -1
@@ -0,0 +1,19 @@
1
+ import { type IRefModelsGenerator, type RefModelMetadata } from "./abstractions.js";
2
+ import { ModelToAstConverter } from "../ModelToAstConverter/abstractions.js";
3
+ import { ValuesSelectionGenerator } from "../ValuesSelectionGenerator/abstractions.js";
4
+ import { ModelsFetcher } from "../shared/abstractions.js";
5
+ import type { CmsModel } from "../../../types/index.js";
6
+ declare class RefModelsGeneratorImpl implements IRefModelsGenerator {
7
+ private readonly modelToAst;
8
+ private readonly modelsFetcher;
9
+ private readonly valuesSelectionGenerator;
10
+ constructor(modelToAst: ModelToAstConverter.Interface, modelsFetcher: ModelsFetcher.Interface, valuesSelectionGenerator: ValuesSelectionGenerator.Interface);
11
+ generate(model: CmsModel): Promise<Record<string, RefModelMetadata>>;
12
+ private collectRefModelIds;
13
+ private collectFromFieldNode;
14
+ private collectFromCollectionNode;
15
+ }
16
+ export declare const RefModelsGenerator: typeof RefModelsGeneratorImpl & {
17
+ __abstraction: import("@webiny/di").Abstraction<IRefModelsGenerator>;
18
+ };
19
+ export {};
@@ -0,0 +1,56 @@
1
+ import { RefModelsGenerator } from "./abstractions.js";
2
+ import { ModelToAstConverter } from "../ModelToAstConverter/abstractions.js";
3
+ import { ValuesSelectionGenerator } from "../ValuesSelectionGenerator/abstractions.js";
4
+ import { ModelsFetcher } from "../shared/abstractions.js";
5
+ class RefModelsGeneratorImpl {
6
+ constructor(modelToAst, modelsFetcher, valuesSelectionGenerator){
7
+ this.modelToAst = modelToAst;
8
+ this.modelsFetcher = modelsFetcher;
9
+ this.valuesSelectionGenerator = valuesSelectionGenerator;
10
+ }
11
+ async generate(model) {
12
+ const ast = this.modelToAst.toAst(model);
13
+ const refModelIds = new Set();
14
+ for (const node of ast.children)this.collectRefModelIds(node, refModelIds);
15
+ const result = {};
16
+ for (const modelId of refModelIds){
17
+ const fetchResult = await this.modelsFetcher.fetchById(modelId);
18
+ if (fetchResult.isFail()) continue;
19
+ const refModel = fetchResult.value;
20
+ const valuesSelection = this.valuesSelectionGenerator.generate(refModel);
21
+ result[modelId] = {
22
+ valuesSelection
23
+ };
24
+ }
25
+ return result;
26
+ }
27
+ collectRefModelIds(node, modelIds) {
28
+ if ("field" === node.type) this.collectFromFieldNode(node, modelIds);
29
+ else if ("collection" === node.type) this.collectFromCollectionNode(node, modelIds);
30
+ }
31
+ collectFromFieldNode(node, modelIds) {
32
+ const { field, children } = node;
33
+ if ("ref" === field.type) {
34
+ const models = field.settings?.models;
35
+ if (Array.isArray(models)) {
36
+ for (const refModel of models)if (refModel.modelId) modelIds.add(refModel.modelId);
37
+ }
38
+ return;
39
+ }
40
+ for (const child of children)this.collectRefModelIds(child, modelIds);
41
+ }
42
+ collectFromCollectionNode(node, modelIds) {
43
+ for (const child of node.children)this.collectRefModelIds(child, modelIds);
44
+ }
45
+ }
46
+ const RefModelsGenerator_RefModelsGenerator = RefModelsGenerator.createImplementation({
47
+ implementation: RefModelsGeneratorImpl,
48
+ dependencies: [
49
+ ModelToAstConverter,
50
+ ModelsFetcher,
51
+ ValuesSelectionGenerator
52
+ ]
53
+ });
54
+ export { RefModelsGenerator_RefModelsGenerator as RefModelsGenerator };
55
+
56
+ //# sourceMappingURL=RefModelsGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentModel/RefModelsGenerator/RefModelsGenerator.js","sources":["../../../../src/features/contentModel/RefModelsGenerator/RefModelsGenerator.ts"],"sourcesContent":["import {\n RefModelsGenerator as Abstraction,\n type IRefModelsGenerator,\n type RefModelMetadata\n} from \"./abstractions.js\";\nimport { ModelToAstConverter } from \"../ModelToAstConverter/abstractions.js\";\nimport { ValuesSelectionGenerator } from \"../ValuesSelectionGenerator/abstractions.js\";\nimport { ModelsFetcher } from \"../shared/abstractions.js\";\nimport type {\n CmsModel,\n CmsModelFieldAstNode,\n CmsModelFieldAstNodeField,\n CmsModelFieldAstNodeCollection\n} from \"~/types/index.js\";\n\nclass RefModelsGeneratorImpl implements IRefModelsGenerator {\n constructor(\n private readonly modelToAst: ModelToAstConverter.Interface,\n private readonly modelsFetcher: ModelsFetcher.Interface,\n private readonly valuesSelectionGenerator: ValuesSelectionGenerator.Interface\n ) {}\n\n async generate(model: CmsModel): Promise<Record<string, RefModelMetadata>> {\n const ast = this.modelToAst.toAst(model);\n const refModelIds = new Set<string>();\n\n for (const node of ast.children) {\n this.collectRefModelIds(node, refModelIds);\n }\n\n const result: Record<string, RefModelMetadata> = {};\n\n for (const modelId of refModelIds) {\n const fetchResult = await this.modelsFetcher.fetchById(modelId);\n if (fetchResult.isFail()) {\n continue;\n }\n\n const refModel = fetchResult.value;\n const valuesSelection = this.valuesSelectionGenerator.generate(refModel);\n\n result[modelId] = { valuesSelection };\n }\n\n return result;\n }\n\n private collectRefModelIds(node: CmsModelFieldAstNode, modelIds: Set<string>): void {\n if (node.type === \"field\") {\n this.collectFromFieldNode(node, modelIds);\n } else if (node.type === \"collection\") {\n this.collectFromCollectionNode(node, modelIds);\n }\n }\n\n private collectFromFieldNode(node: CmsModelFieldAstNodeField, modelIds: Set<string>): void {\n const { field, children } = node;\n\n if (field.type === \"ref\") {\n const models = field.settings?.models;\n if (Array.isArray(models)) {\n for (const refModel of models) {\n if (refModel.modelId) {\n modelIds.add(refModel.modelId);\n }\n }\n }\n return;\n }\n\n for (const child of children) {\n this.collectRefModelIds(child, modelIds);\n }\n }\n\n private collectFromCollectionNode(\n node: CmsModelFieldAstNodeCollection,\n modelIds: Set<string>\n ): void {\n for (const child of node.children) {\n this.collectRefModelIds(child, modelIds);\n }\n }\n}\n\nexport const RefModelsGenerator = Abstraction.createImplementation({\n implementation: RefModelsGeneratorImpl,\n dependencies: [ModelToAstConverter, ModelsFetcher, ValuesSelectionGenerator]\n});\n"],"names":["RefModelsGeneratorImpl","modelToAst","modelsFetcher","valuesSelectionGenerator","model","ast","refModelIds","Set","node","result","modelId","fetchResult","refModel","valuesSelection","modelIds","field","children","models","Array","child","RefModelsGenerator","Abstraction","ModelToAstConverter","ModelsFetcher","ValuesSelectionGenerator"],"mappings":";;;;AAeA,MAAMA;IACF,YACqBC,UAAyC,EACzCC,aAAsC,EACtCC,wBAA4D,CAC/E;aAHmBF,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,wBAAwB,GAAxBA;IAClB;IAEH,MAAM,SAASC,KAAe,EAA6C;QACvE,MAAMC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAACD;QAClC,MAAME,cAAc,IAAIC;QAExB,KAAK,MAAMC,QAAQH,IAAI,QAAQ,CAC3B,IAAI,CAAC,kBAAkB,CAACG,MAAMF;QAGlC,MAAMG,SAA2C,CAAC;QAElD,KAAK,MAAMC,WAAWJ,YAAa;YAC/B,MAAMK,cAAc,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAACD;YACvD,IAAIC,YAAY,MAAM,IAClB;YAGJ,MAAMC,WAAWD,YAAY,KAAK;YAClC,MAAME,kBAAkB,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAACD;YAE/DH,MAAM,CAACC,QAAQ,GAAG;gBAAEG;YAAgB;QACxC;QAEA,OAAOJ;IACX;IAEQ,mBAAmBD,IAA0B,EAAEM,QAAqB,EAAQ;QAChF,IAAIN,AAAc,YAAdA,KAAK,IAAI,EACT,IAAI,CAAC,oBAAoB,CAACA,MAAMM;aAC7B,IAAIN,AAAc,iBAAdA,KAAK,IAAI,EAChB,IAAI,CAAC,yBAAyB,CAACA,MAAMM;IAE7C;IAEQ,qBAAqBN,IAA+B,EAAEM,QAAqB,EAAQ;QACvF,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGR;QAE5B,IAAIO,AAAe,UAAfA,MAAM,IAAI,EAAY;YACtB,MAAME,SAASF,MAAM,QAAQ,EAAE;YAC/B,IAAIG,MAAM,OAAO,CAACD,SACd;gBAAA,KAAK,MAAML,YAAYK,OACnB,IAAIL,SAAS,OAAO,EAChBE,SAAS,GAAG,CAACF,SAAS,OAAO;YAErC;YAEJ;QACJ;QAEA,KAAK,MAAMO,SAASH,SAChB,IAAI,CAAC,kBAAkB,CAACG,OAAOL;IAEvC;IAEQ,0BACJN,IAAoC,EACpCM,QAAqB,EACjB;QACJ,KAAK,MAAMK,SAASX,KAAK,QAAQ,CAC7B,IAAI,CAAC,kBAAkB,CAACW,OAAOL;IAEvC;AACJ;AAEO,MAAMM,wCAAqBC,mBAAAA,oBAAgC,CAAC;IAC/D,gBAAgBrB;IAChB,cAAc;QAACsB;QAAqBC;QAAeC;KAAyB;AAChF"}
@@ -0,0 +1,11 @@
1
+ import type { CmsModel } from "../../../types/index.js";
2
+ export interface RefModelMetadata {
3
+ valuesSelection: string;
4
+ }
5
+ export interface IRefModelsGenerator {
6
+ generate(model: CmsModel): Promise<Record<string, RefModelMetadata>>;
7
+ }
8
+ export declare const RefModelsGenerator: import("@webiny/di").Abstraction<IRefModelsGenerator>;
9
+ export declare namespace RefModelsGenerator {
10
+ type Interface = IRefModelsGenerator;
11
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const RefModelsGenerator = createAbstraction("RefModelsGenerator");
3
+ export { RefModelsGenerator };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentModel/RefModelsGenerator/abstractions.js","sources":["../../../../src/features/contentModel/RefModelsGenerator/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { CmsModel } from \"~/types/index.js\";\n\nexport interface RefModelMetadata {\n valuesSelection: string;\n}\n\nexport interface IRefModelsGenerator {\n generate(model: CmsModel): Promise<Record<string, RefModelMetadata>>;\n}\n\nexport const RefModelsGenerator = createAbstraction<IRefModelsGenerator>(\"RefModelsGenerator\");\n\nexport namespace RefModelsGenerator {\n export type Interface = IRefModelsGenerator;\n}\n"],"names":["RefModelsGenerator","createAbstraction"],"mappings":";AAWO,MAAMA,qBAAqBC,kBAAuC"}
@@ -0,0 +1,4 @@
1
+ export declare const RefModelsGeneratorFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { RefModelsGenerator } from "./RefModelsGenerator.js";
3
+ const RefModelsGeneratorFeature = createFeature({
4
+ name: "RefModelsGenerator",
5
+ register (container) {
6
+ container.register(RefModelsGenerator);
7
+ }
8
+ });
9
+ export { RefModelsGeneratorFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentModel/RefModelsGenerator/feature.js","sources":["../../../../src/features/contentModel/RefModelsGenerator/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { RefModelsGenerator } from \"./RefModelsGenerator.js\";\n\nexport const RefModelsGeneratorFeature = createFeature({\n name: \"RefModelsGenerator\",\n register(container) {\n container.register(RefModelsGenerator);\n }\n});\n"],"names":["RefModelsGeneratorFeature","createFeature","container","RefModelsGenerator"],"mappings":";;AAGO,MAAMA,4BAA4BC,cAAc;IACnD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
@@ -0,0 +1,2 @@
1
+ export { RefModelsGenerator } from "./abstractions.js";
2
+ export { RefModelsGeneratorFeature } from "./feature.js";
@@ -0,0 +1,2 @@
1
+ export { RefModelsGenerator } from "./abstractions.js";
2
+ export { RefModelsGeneratorFeature } from "./feature.js";
@@ -2,6 +2,7 @@ import { ValuesSelectionGenerator } from "./abstractions.js";
2
2
  import { ModelToAstConverter } from "../ModelToAstConverter/abstractions.js";
3
3
  import { createTypeName } from "../../../utils/createTypeName.js";
4
4
  const REF_SELECTION = "{ id modelId }";
5
+ const ASSET_SELECTION = "{ id src url name type size image { width height crop { top left bottom right } focalPoint { x y } alt caption } document { pages } video { autoplay poster } }";
5
6
  class ValuesSelectionGeneratorImpl {
6
7
  constructor(modelToAst){
7
8
  this.modelToAst = modelToAst;
@@ -22,6 +23,7 @@ class ValuesSelectionGeneratorImpl {
22
23
  walkFieldNode(node, typePrefix) {
23
24
  const { field, children } = node;
24
25
  if ("ref" === field.type) return `${field.fieldId} ${REF_SELECTION}`;
26
+ if ("asset" === field.type) return `${field.fieldId} ${ASSET_SELECTION}`;
25
27
  if (0 === children.length) {
26
28
  if ("object" === field.type || "dynamicZone" === field.type) return null;
27
29
  return field.fieldId;
@@ -1 +1 @@
1
- {"version":3,"file":"features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js","sources":["../../../../src/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.ts"],"sourcesContent":["import {\n ValuesSelectionGenerator as Abstraction,\n type IValuesSelectionGenerator\n} from \"./abstractions.js\";\nimport { ModelToAstConverter } from \"../ModelToAstConverter/abstractions.js\";\nimport type {\n CmsModel,\n CmsModelAst,\n CmsModelFieldAstNode,\n CmsModelFieldAstNodeCollection,\n CmsModelFieldAstNodeField\n} from \"~/types/index.js\";\nimport { createTypeName } from \"~/utils/createTypeName.js\";\n\nconst REF_SELECTION = \"{ id modelId }\";\n\nclass ValuesSelectionGeneratorImpl implements IValuesSelectionGenerator {\n constructor(private readonly modelToAst: ModelToAstConverter.Interface) {}\n\n generate(model: CmsModel): string {\n const ast = this.modelToAst.toAst(model);\n const selection = this.walkRoot(ast, model.singularApiName);\n return selection || \"_empty\";\n }\n\n private walkRoot(ast: CmsModelAst, typePrefix: string): string {\n return ast.children\n .map(node => this.walkNode(node, typePrefix))\n .filter(Boolean)\n .join(\"\\n\");\n }\n\n private walkNode(node: CmsModelFieldAstNode, typePrefix: string): string | null {\n if (node.type === \"field\") {\n return this.walkFieldNode(node, typePrefix);\n }\n if (node.type === \"collection\") {\n return this.walkCollectionNode(node, typePrefix);\n }\n return null;\n }\n\n private walkFieldNode(node: CmsModelFieldAstNodeField, typePrefix: string): string | null {\n const { field, children } = node;\n\n if (field.type === \"ref\") {\n return `${field.fieldId} ${REF_SELECTION}`;\n }\n\n if (children.length === 0) {\n if (field.type === \"object\" || field.type === \"dynamicZone\") {\n return null;\n }\n return field.fieldId;\n }\n\n const nestedPrefix = `${typePrefix}_${createTypeName(field.fieldId)}`;\n const childSelection = children\n .map(child => this.walkNode(child, nestedPrefix))\n .filter(Boolean)\n .join(\"\\n\");\n\n if (!childSelection) {\n return null;\n }\n\n return `${field.fieldId} { ${childSelection} }`;\n }\n\n private walkCollectionNode(\n node: CmsModelFieldAstNodeCollection,\n typePrefix: string\n ): string | null {\n const { collection, children } = node;\n const gqlTypeName = collection.gqlTypeName;\n\n if (!gqlTypeName) {\n return null;\n }\n\n const templateType = `${typePrefix}_${gqlTypeName}`;\n const childSelection = children\n .map(child => this.walkNode(child, templateType))\n .filter(Boolean)\n .join(\"\\n\");\n\n return `...on ${templateType} { ${childSelection} _templateId __typename }`;\n }\n}\n\nexport const ValuesSelectionGenerator = Abstraction.createImplementation({\n implementation: ValuesSelectionGeneratorImpl,\n dependencies: [ModelToAstConverter]\n});\n"],"names":["REF_SELECTION","ValuesSelectionGeneratorImpl","modelToAst","model","ast","selection","typePrefix","node","Boolean","field","children","nestedPrefix","createTypeName","childSelection","child","collection","gqlTypeName","templateType","ValuesSelectionGenerator","Abstraction","ModelToAstConverter"],"mappings":";;;AAcA,MAAMA,gBAAgB;AAEtB,MAAMC;IACF,YAA6BC,UAAyC,CAAE;aAA3CA,UAAU,GAAVA;IAA4C;IAEzE,SAASC,KAAe,EAAU;QAC9B,MAAMC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAACD;QAClC,MAAME,YAAY,IAAI,CAAC,QAAQ,CAACD,KAAKD,MAAM,eAAe;QAC1D,OAAOE,aAAa;IACxB;IAEQ,SAASD,GAAgB,EAAEE,UAAkB,EAAU;QAC3D,OAAOF,IAAI,QAAQ,CACd,GAAG,CAACG,CAAAA,OAAQ,IAAI,CAAC,QAAQ,CAACA,MAAMD,aAChC,MAAM,CAACE,SACP,IAAI,CAAC;IACd;IAEQ,SAASD,IAA0B,EAAED,UAAkB,EAAiB;QAC5E,IAAIC,AAAc,YAAdA,KAAK,IAAI,EACT,OAAO,IAAI,CAAC,aAAa,CAACA,MAAMD;QAEpC,IAAIC,AAAc,iBAAdA,KAAK,IAAI,EACT,OAAO,IAAI,CAAC,kBAAkB,CAACA,MAAMD;QAEzC,OAAO;IACX;IAEQ,cAAcC,IAA+B,EAAED,UAAkB,EAAiB;QACtF,MAAM,EAAEG,KAAK,EAAEC,QAAQ,EAAE,GAAGH;QAE5B,IAAIE,AAAe,UAAfA,MAAM,IAAI,EACV,OAAO,GAAGA,MAAM,OAAO,CAAC,CAAC,EAAET,eAAe;QAG9C,IAAIU,AAAoB,MAApBA,SAAS,MAAM,EAAQ;YACvB,IAAID,AAAe,aAAfA,MAAM,IAAI,IAAiBA,AAAe,kBAAfA,MAAM,IAAI,EACrC,OAAO;YAEX,OAAOA,MAAM,OAAO;QACxB;QAEA,MAAME,eAAe,GAAGL,WAAW,CAAC,EAAEM,eAAeH,MAAM,OAAO,GAAG;QACrE,MAAMI,iBAAiBH,SAClB,GAAG,CAACI,CAAAA,QAAS,IAAI,CAAC,QAAQ,CAACA,OAAOH,eAClC,MAAM,CAACH,SACP,IAAI,CAAC;QAEV,IAAI,CAACK,gBACD,OAAO;QAGX,OAAO,GAAGJ,MAAM,OAAO,CAAC,GAAG,EAAEI,eAAe,EAAE,CAAC;IACnD;IAEQ,mBACJN,IAAoC,EACpCD,UAAkB,EACL;QACb,MAAM,EAAES,UAAU,EAAEL,QAAQ,EAAE,GAAGH;QACjC,MAAMS,cAAcD,WAAW,WAAW;QAE1C,IAAI,CAACC,aACD,OAAO;QAGX,MAAMC,eAAe,GAAGX,WAAW,CAAC,EAAEU,aAAa;QACnD,MAAMH,iBAAiBH,SAClB,GAAG,CAACI,CAAAA,QAAS,IAAI,CAAC,QAAQ,CAACA,OAAOG,eAClC,MAAM,CAACT,SACP,IAAI,CAAC;QAEV,OAAO,CAAC,MAAM,EAAES,aAAa,GAAG,EAAEJ,eAAe,yBAAyB,CAAC;IAC/E;AACJ;AAEO,MAAMK,oDAA2BC,yBAAAA,oBAAgC,CAAC;IACrE,gBAAgBlB;IAChB,cAAc;QAACmB;KAAoB;AACvC"}
1
+ {"version":3,"file":"features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js","sources":["../../../../src/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.ts"],"sourcesContent":["import {\n ValuesSelectionGenerator as Abstraction,\n type IValuesSelectionGenerator\n} from \"./abstractions.js\";\nimport { ModelToAstConverter } from \"../ModelToAstConverter/abstractions.js\";\nimport type {\n CmsModel,\n CmsModelAst,\n CmsModelFieldAstNode,\n CmsModelFieldAstNodeCollection,\n CmsModelFieldAstNodeField\n} from \"~/types/index.js\";\nimport { createTypeName } from \"~/utils/createTypeName.js\";\n\nconst REF_SELECTION = \"{ id modelId }\";\n\nconst ASSET_SELECTION = [\n \"{ id src url name type size\",\n \"image { width height crop { top left bottom right } focalPoint { x y } alt caption }\",\n \"document { pages }\",\n \"video { autoplay poster } }\"\n].join(\" \");\n\nclass ValuesSelectionGeneratorImpl implements IValuesSelectionGenerator {\n constructor(private readonly modelToAst: ModelToAstConverter.Interface) {}\n\n generate(model: CmsModel): string {\n const ast = this.modelToAst.toAst(model);\n const selection = this.walkRoot(ast, model.singularApiName);\n return selection || \"_empty\";\n }\n\n private walkRoot(ast: CmsModelAst, typePrefix: string): string {\n return ast.children\n .map(node => this.walkNode(node, typePrefix))\n .filter(Boolean)\n .join(\"\\n\");\n }\n\n private walkNode(node: CmsModelFieldAstNode, typePrefix: string): string | null {\n if (node.type === \"field\") {\n return this.walkFieldNode(node, typePrefix);\n }\n if (node.type === \"collection\") {\n return this.walkCollectionNode(node, typePrefix);\n }\n return null;\n }\n\n private walkFieldNode(node: CmsModelFieldAstNodeField, typePrefix: string): string | null {\n const { field, children } = node;\n\n if (field.type === \"ref\") {\n return `${field.fieldId} ${REF_SELECTION}`;\n }\n\n if (field.type === \"asset\") {\n return `${field.fieldId} ${ASSET_SELECTION}`;\n }\n\n if (children.length === 0) {\n if (field.type === \"object\" || field.type === \"dynamicZone\") {\n return null;\n }\n return field.fieldId;\n }\n\n const nestedPrefix = `${typePrefix}_${createTypeName(field.fieldId)}`;\n const childSelection = children\n .map(child => this.walkNode(child, nestedPrefix))\n .filter(Boolean)\n .join(\"\\n\");\n\n if (!childSelection) {\n return null;\n }\n\n return `${field.fieldId} { ${childSelection} }`;\n }\n\n private walkCollectionNode(\n node: CmsModelFieldAstNodeCollection,\n typePrefix: string\n ): string | null {\n const { collection, children } = node;\n const gqlTypeName = collection.gqlTypeName;\n\n if (!gqlTypeName) {\n return null;\n }\n\n const templateType = `${typePrefix}_${gqlTypeName}`;\n const childSelection = children\n .map(child => this.walkNode(child, templateType))\n .filter(Boolean)\n .join(\"\\n\");\n\n return `...on ${templateType} { ${childSelection} _templateId __typename }`;\n }\n}\n\nexport const ValuesSelectionGenerator = Abstraction.createImplementation({\n implementation: ValuesSelectionGeneratorImpl,\n dependencies: [ModelToAstConverter]\n});\n"],"names":["REF_SELECTION","ASSET_SELECTION","ValuesSelectionGeneratorImpl","modelToAst","model","ast","selection","typePrefix","node","Boolean","field","children","nestedPrefix","createTypeName","childSelection","child","collection","gqlTypeName","templateType","ValuesSelectionGenerator","Abstraction","ModelToAstConverter"],"mappings":";;;AAcA,MAAMA,gBAAgB;AAEtB,MAAMC,kBAAkB;AAOxB,MAAMC;IACF,YAA6BC,UAAyC,CAAE;aAA3CA,UAAU,GAAVA;IAA4C;IAEzE,SAASC,KAAe,EAAU;QAC9B,MAAMC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAACD;QAClC,MAAME,YAAY,IAAI,CAAC,QAAQ,CAACD,KAAKD,MAAM,eAAe;QAC1D,OAAOE,aAAa;IACxB;IAEQ,SAASD,GAAgB,EAAEE,UAAkB,EAAU;QAC3D,OAAOF,IAAI,QAAQ,CACd,GAAG,CAACG,CAAAA,OAAQ,IAAI,CAAC,QAAQ,CAACA,MAAMD,aAChC,MAAM,CAACE,SACP,IAAI,CAAC;IACd;IAEQ,SAASD,IAA0B,EAAED,UAAkB,EAAiB;QAC5E,IAAIC,AAAc,YAAdA,KAAK,IAAI,EACT,OAAO,IAAI,CAAC,aAAa,CAACA,MAAMD;QAEpC,IAAIC,AAAc,iBAAdA,KAAK,IAAI,EACT,OAAO,IAAI,CAAC,kBAAkB,CAACA,MAAMD;QAEzC,OAAO;IACX;IAEQ,cAAcC,IAA+B,EAAED,UAAkB,EAAiB;QACtF,MAAM,EAAEG,KAAK,EAAEC,QAAQ,EAAE,GAAGH;QAE5B,IAAIE,AAAe,UAAfA,MAAM,IAAI,EACV,OAAO,GAAGA,MAAM,OAAO,CAAC,CAAC,EAAEV,eAAe;QAG9C,IAAIU,AAAe,YAAfA,MAAM,IAAI,EACV,OAAO,GAAGA,MAAM,OAAO,CAAC,CAAC,EAAET,iBAAiB;QAGhD,IAAIU,AAAoB,MAApBA,SAAS,MAAM,EAAQ;YACvB,IAAID,AAAe,aAAfA,MAAM,IAAI,IAAiBA,AAAe,kBAAfA,MAAM,IAAI,EACrC,OAAO;YAEX,OAAOA,MAAM,OAAO;QACxB;QAEA,MAAME,eAAe,GAAGL,WAAW,CAAC,EAAEM,eAAeH,MAAM,OAAO,GAAG;QACrE,MAAMI,iBAAiBH,SAClB,GAAG,CAACI,CAAAA,QAAS,IAAI,CAAC,QAAQ,CAACA,OAAOH,eAClC,MAAM,CAACH,SACP,IAAI,CAAC;QAEV,IAAI,CAACK,gBACD,OAAO;QAGX,OAAO,GAAGJ,MAAM,OAAO,CAAC,GAAG,EAAEI,eAAe,EAAE,CAAC;IACnD;IAEQ,mBACJN,IAAoC,EACpCD,UAAkB,EACL;QACb,MAAM,EAAES,UAAU,EAAEL,QAAQ,EAAE,GAAGH;QACjC,MAAMS,cAAcD,WAAW,WAAW;QAE1C,IAAI,CAACC,aACD,OAAO;QAGX,MAAMC,eAAe,GAAGX,WAAW,CAAC,EAAEU,aAAa;QACnD,MAAMH,iBAAiBH,SAClB,GAAG,CAACI,CAAAA,QAAS,IAAI,CAAC,QAAQ,CAACA,OAAOG,eAClC,MAAM,CAACT,SACP,IAAI,CAAC;QAEV,OAAO,CAAC,MAAM,EAAES,aAAa,GAAG,EAAEJ,eAAe,yBAAyB,CAAC;IAC/E;AACJ;AAEO,MAAMK,oDAA2BC,yBAAAA,oBAAgC,CAAC;IACrE,gBAAgBlB;IAChB,cAAc;QAACmB;KAAoB;AACvC"}
@@ -5,6 +5,7 @@ import { PluginGroupsProvider } from "../../../features/contentModelGroup/shared
5
5
  import { ListGroupsStorageOperation } from "../../../features/shared/storageOperations/group/ListGroupsStorageOperation.js";
6
6
  import { CreateGroupStorageOperation } from "../../../features/shared/storageOperations/group/CreateGroupStorageOperation.js";
7
7
  import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
8
+ import { StringFormatter } from "@webiny/api-core/features/stringFormatter/index.js";
8
9
  import type { CmsGroup } from "../../../types/index.js";
9
10
  /**
10
11
  * CreateGroupRepository - Validates and persists a new group.
@@ -22,7 +23,8 @@ declare class CreateGroupRepositoryImpl implements RepositoryAbstraction.Interfa
22
23
  private listGroups;
23
24
  private createGroup;
24
25
  private tenantContext;
25
- constructor(groupCache: GroupCache.Interface, pluginGroupsProvider: PluginGroupsProvider.Interface, listGroups: ListGroupsStorageOperation.Interface, createGroup: CreateGroupStorageOperation.Interface, tenantContext: TenantContext.Interface);
26
+ private stringFormatter;
27
+ constructor(groupCache: GroupCache.Interface, pluginGroupsProvider: PluginGroupsProvider.Interface, listGroups: ListGroupsStorageOperation.Interface, createGroup: CreateGroupStorageOperation.Interface, tenantContext: TenantContext.Interface, stringFormatter: StringFormatter.Interface);
26
28
  execute(group: CmsGroup): Promise<Result<void, RepositoryAbstraction.Error>>;
27
29
  private isSlugTaken;
28
30
  }
@@ -5,15 +5,16 @@ import { GroupPersistenceError, GroupSlugTakenError } from "../../../domain/cont
5
5
  import { ListGroupsStorageOperation } from "../../shared/storageOperations/group/ListGroupsStorageOperation.js";
6
6
  import { CreateGroupStorageOperation } from "../../shared/storageOperations/group/CreateGroupStorageOperation.js";
7
7
  import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
8
- import { toSlug } from "../../../utils/toSlug.js";
8
+ import { StringFormatter } from "@webiny/api-core/features/stringFormatter/index.js";
9
9
  import { generateAlphaNumericId } from "@webiny/utils";
10
10
  class CreateGroupRepositoryImpl {
11
- constructor(groupCache, pluginGroupsProvider, listGroups, createGroup, tenantContext){
11
+ constructor(groupCache, pluginGroupsProvider, listGroups, createGroup, tenantContext, stringFormatter){
12
12
  this.groupCache = groupCache;
13
13
  this.pluginGroupsProvider = pluginGroupsProvider;
14
14
  this.listGroups = listGroups;
15
15
  this.createGroup = createGroup;
16
16
  this.tenantContext = tenantContext;
17
+ this.stringFormatter = stringFormatter;
17
18
  }
18
19
  async execute(group) {
19
20
  try {
@@ -51,7 +52,7 @@ class CreateGroupRepositoryImpl {
51
52
  });
52
53
  return existingBySlug.length > 0;
53
54
  }
54
- const baseSlug = toSlug(group.name);
55
+ const baseSlug = this.stringFormatter.slugify(group.name);
55
56
  const existingBySlug = await this.listGroups.execute({
56
57
  where: {
57
58
  tenant,
@@ -70,7 +71,8 @@ const CreateGroupRepository_CreateGroupRepository = CreateGroupRepository.create
70
71
  PluginGroupsProvider,
71
72
  ListGroupsStorageOperation,
72
73
  CreateGroupStorageOperation,
73
- TenantContext
74
+ TenantContext,
75
+ StringFormatter
74
76
  ]
75
77
  });
76
78
  export { CreateGroupRepository_CreateGroupRepository as CreateGroupRepository };
@@ -1 +1 @@
1
- {"version":3,"file":"features/contentModelGroup/CreateGroup/CreateGroupRepository.js","sources":["../../../../src/features/contentModelGroup/CreateGroup/CreateGroupRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CreateGroupRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { GroupCache } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { PluginGroupsProvider } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { GroupSlugTakenError } from \"~/domain/contentModelGroup/errors.js\";\nimport { GroupPersistenceError } from \"~/domain/contentModelGroup/errors.js\";\nimport { ListGroupsStorageOperation } from \"~/features/shared/storageOperations/group/ListGroupsStorageOperation.js\";\nimport { CreateGroupStorageOperation } from \"~/features/shared/storageOperations/group/CreateGroupStorageOperation.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { toSlug } from \"~/utils/toSlug.js\";\nimport { generateAlphaNumericId } from \"@webiny/utils\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * CreateGroupRepository - Validates and persists a new group.\n *\n * Responsibilities:\n * - Validate ID uniqueness (if provided)\n * - Validate slug uniqueness (or generate unique slug)\n * - Check for plugin group conflicts\n * - Persist to storage\n * - Clear GroupCache after successful create\n */\nclass CreateGroupRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private groupCache: GroupCache.Interface,\n private pluginGroupsProvider: PluginGroupsProvider.Interface,\n private listGroups: ListGroupsStorageOperation.Interface,\n private createGroup: CreateGroupStorageOperation.Interface,\n private tenantContext: TenantContext.Interface\n ) {}\n\n async execute(group: CmsGroup): Promise<Result<void, RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // 1. Validate ID uniqueness (if provided)\n if (group.id) {\n const existingById = await this.listGroups.execute({\n where: {\n tenant: tenant.id,\n id: group.id\n }\n });\n\n if (existingById.length > 0) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n }\n\n // 2. Generate or validate slug\n const slugTaken = await this.isSlugTaken(group, tenant.id);\n if (slugTaken) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n\n // 3. Check for plugin group conflicts\n const pluginGroups = await this.pluginGroupsProvider.getGroups();\n const pluginGroupConflict = pluginGroups.find(pg => pg.slug === group.slug);\n if (pluginGroupConflict) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n\n // 4. Persist to storage\n await this.createGroup.execute({ group });\n\n // 5. Clear cache\n this.groupCache.clear();\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new GroupPersistenceError(error as Error));\n }\n }\n\n private async isSlugTaken(group: CmsGroup, tenant: string): Promise<boolean> {\n // If slug is provided and not empty, validate it\n if (group.slug && group.slug.trim()) {\n const existingBySlug = await this.listGroups.execute({\n where: {\n tenant,\n slug: group.slug\n }\n });\n\n return existingBySlug.length > 0;\n }\n\n // Generate slug from name\n const baseSlug = toSlug(group.name);\n const existingBySlug = await this.listGroups.execute({\n where: {\n tenant,\n slug: baseSlug\n }\n });\n\n if (existingBySlug.length === 0) {\n // No conflict, use base slug\n group.slug = baseSlug;\n } else {\n // Conflict, append random suffix\n group.slug = `${baseSlug}-${generateAlphaNumericId(8)}`;\n }\n\n return false;\n }\n}\n\nexport const CreateGroupRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateGroupRepositoryImpl,\n dependencies: [\n GroupCache,\n PluginGroupsProvider,\n ListGroupsStorageOperation,\n CreateGroupStorageOperation,\n TenantContext\n ]\n});\n"],"names":["CreateGroupRepositoryImpl","groupCache","pluginGroupsProvider","listGroups","createGroup","tenantContext","group","tenant","existingById","Result","GroupSlugTakenError","slugTaken","pluginGroups","pluginGroupConflict","pg","error","GroupPersistenceError","existingBySlug","baseSlug","toSlug","generateAlphaNumericId","CreateGroupRepository","RepositoryAbstraction","GroupCache","PluginGroupsProvider","ListGroupsStorageOperation","CreateGroupStorageOperation","TenantContext"],"mappings":";;;;;;;;;AAuBA,MAAMA;IACF,YACYC,UAAgC,EAChCC,oBAAoD,EACpDC,UAAgD,EAChDC,WAAkD,EAClDC,aAAsC,CAChD;aALUJ,UAAU,GAAVA;aACAC,oBAAoB,GAApBA;aACAC,UAAU,GAAVA;aACAC,WAAW,GAAXA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,QAAQC,KAAe,EAAsD;QAC/E,IAAI;YACA,MAAMC,SAAS,IAAI,CAAC,aAAa,CAAC,SAAS;YAG3C,IAAID,MAAM,EAAE,EAAE;gBACV,MAAME,eAAe,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;oBAC/C,OAAO;wBACH,QAAQD,OAAO,EAAE;wBACjB,IAAID,MAAM,EAAE;oBAChB;gBACJ;gBAEA,IAAIE,aAAa,MAAM,GAAG,GACtB,OAAOC,OAAO,IAAI,CAAC,IAAIC,oBAAoBJ,MAAM,IAAI;YAE7D;YAGA,MAAMK,YAAY,MAAM,IAAI,CAAC,WAAW,CAACL,OAAOC,OAAO,EAAE;YACzD,IAAII,WACA,OAAOF,OAAO,IAAI,CAAC,IAAIC,oBAAoBJ,MAAM,IAAI;YAIzD,MAAMM,eAAe,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS;YAC9D,MAAMC,sBAAsBD,aAAa,IAAI,CAACE,CAAAA,KAAMA,GAAG,IAAI,KAAKR,MAAM,IAAI;YAC1E,IAAIO,qBACA,OAAOJ,OAAO,IAAI,CAAC,IAAIC,oBAAoBJ,MAAM,IAAI;YAIzD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;gBAAEA;YAAM;YAGvC,IAAI,CAAC,UAAU,CAAC,KAAK;YAErB,OAAOG,OAAO,EAAE;QACpB,EAAE,OAAOM,OAAO;YACZ,OAAON,OAAO,IAAI,CAAC,IAAIO,sBAAsBD;QACjD;IACJ;IAEA,MAAc,YAAYT,KAAe,EAAEC,MAAc,EAAoB;QAEzE,IAAID,MAAM,IAAI,IAAIA,MAAM,IAAI,CAAC,IAAI,IAAI;YACjC,MAAMW,iBAAiB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBACjD,OAAO;oBACHV;oBACA,MAAMD,MAAM,IAAI;gBACpB;YACJ;YAEA,OAAOW,eAAe,MAAM,GAAG;QACnC;QAGA,MAAMC,WAAWC,OAAOb,MAAM,IAAI;QAClC,MAAMW,iBAAiB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACjD,OAAO;gBACHV;gBACA,MAAMW;YACV;QACJ;QAEA,IAAID,AAA0B,MAA1BA,eAAe,MAAM,EAErBX,MAAM,IAAI,GAAGY;aAGbZ,MAAM,IAAI,GAAG,GAAGY,SAAS,CAAC,EAAEE,uBAAuB,IAAI;QAG3D,OAAO;IACX;AACJ;AAEO,MAAMC,8CAAwBC,sBAAAA,oBAA0C,CAAC;IAC5E,gBAAgBtB;IAChB,cAAc;QACVuB;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
1
+ {"version":3,"file":"features/contentModelGroup/CreateGroup/CreateGroupRepository.js","sources":["../../../../src/features/contentModelGroup/CreateGroup/CreateGroupRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CreateGroupRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { GroupCache } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { PluginGroupsProvider } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { GroupSlugTakenError } from \"~/domain/contentModelGroup/errors.js\";\nimport { GroupPersistenceError } from \"~/domain/contentModelGroup/errors.js\";\nimport { ListGroupsStorageOperation } from \"~/features/shared/storageOperations/group/ListGroupsStorageOperation.js\";\nimport { CreateGroupStorageOperation } from \"~/features/shared/storageOperations/group/CreateGroupStorageOperation.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { StringFormatter } from \"@webiny/api-core/features/stringFormatter/index.js\";\nimport { generateAlphaNumericId } from \"@webiny/utils\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * CreateGroupRepository - Validates and persists a new group.\n *\n * Responsibilities:\n * - Validate ID uniqueness (if provided)\n * - Validate slug uniqueness (or generate unique slug)\n * - Check for plugin group conflicts\n * - Persist to storage\n * - Clear GroupCache after successful create\n */\nclass CreateGroupRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private groupCache: GroupCache.Interface,\n private pluginGroupsProvider: PluginGroupsProvider.Interface,\n private listGroups: ListGroupsStorageOperation.Interface,\n private createGroup: CreateGroupStorageOperation.Interface,\n private tenantContext: TenantContext.Interface,\n private stringFormatter: StringFormatter.Interface\n ) {}\n\n async execute(group: CmsGroup): Promise<Result<void, RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // 1. Validate ID uniqueness (if provided)\n if (group.id) {\n const existingById = await this.listGroups.execute({\n where: {\n tenant: tenant.id,\n id: group.id\n }\n });\n\n if (existingById.length > 0) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n }\n\n // 2. Generate or validate slug\n const slugTaken = await this.isSlugTaken(group, tenant.id);\n if (slugTaken) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n\n // 3. Check for plugin group conflicts\n const pluginGroups = await this.pluginGroupsProvider.getGroups();\n const pluginGroupConflict = pluginGroups.find(pg => pg.slug === group.slug);\n if (pluginGroupConflict) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n\n // 4. Persist to storage\n await this.createGroup.execute({ group });\n\n // 5. Clear cache\n this.groupCache.clear();\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new GroupPersistenceError(error as Error));\n }\n }\n\n private async isSlugTaken(group: CmsGroup, tenant: string): Promise<boolean> {\n // If slug is provided and not empty, validate it\n if (group.slug && group.slug.trim()) {\n const existingBySlug = await this.listGroups.execute({\n where: {\n tenant,\n slug: group.slug\n }\n });\n\n return existingBySlug.length > 0;\n }\n\n // Generate slug from name\n const baseSlug = this.stringFormatter.slugify(group.name);\n const existingBySlug = await this.listGroups.execute({\n where: {\n tenant,\n slug: baseSlug\n }\n });\n\n if (existingBySlug.length === 0) {\n // No conflict, use base slug\n group.slug = baseSlug;\n } else {\n // Conflict, append random suffix\n group.slug = `${baseSlug}-${generateAlphaNumericId(8)}`;\n }\n\n return false;\n }\n}\n\nexport const CreateGroupRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateGroupRepositoryImpl,\n dependencies: [\n GroupCache,\n PluginGroupsProvider,\n ListGroupsStorageOperation,\n CreateGroupStorageOperation,\n TenantContext,\n StringFormatter\n ]\n});\n"],"names":["CreateGroupRepositoryImpl","groupCache","pluginGroupsProvider","listGroups","createGroup","tenantContext","stringFormatter","group","tenant","existingById","Result","GroupSlugTakenError","slugTaken","pluginGroups","pluginGroupConflict","pg","error","GroupPersistenceError","existingBySlug","baseSlug","generateAlphaNumericId","CreateGroupRepository","RepositoryAbstraction","GroupCache","PluginGroupsProvider","ListGroupsStorageOperation","CreateGroupStorageOperation","TenantContext","StringFormatter"],"mappings":";;;;;;;;;AAuBA,MAAMA;IACF,YACYC,UAAgC,EAChCC,oBAAoD,EACpDC,UAAgD,EAChDC,WAAkD,EAClDC,aAAsC,EACtCC,eAA0C,CACpD;aANUL,UAAU,GAAVA;aACAC,oBAAoB,GAApBA;aACAC,UAAU,GAAVA;aACAC,WAAW,GAAXA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAM,QAAQC,KAAe,EAAsD;QAC/E,IAAI;YACA,MAAMC,SAAS,IAAI,CAAC,aAAa,CAAC,SAAS;YAG3C,IAAID,MAAM,EAAE,EAAE;gBACV,MAAME,eAAe,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;oBAC/C,OAAO;wBACH,QAAQD,OAAO,EAAE;wBACjB,IAAID,MAAM,EAAE;oBAChB;gBACJ;gBAEA,IAAIE,aAAa,MAAM,GAAG,GACtB,OAAOC,OAAO,IAAI,CAAC,IAAIC,oBAAoBJ,MAAM,IAAI;YAE7D;YAGA,MAAMK,YAAY,MAAM,IAAI,CAAC,WAAW,CAACL,OAAOC,OAAO,EAAE;YACzD,IAAII,WACA,OAAOF,OAAO,IAAI,CAAC,IAAIC,oBAAoBJ,MAAM,IAAI;YAIzD,MAAMM,eAAe,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS;YAC9D,MAAMC,sBAAsBD,aAAa,IAAI,CAACE,CAAAA,KAAMA,GAAG,IAAI,KAAKR,MAAM,IAAI;YAC1E,IAAIO,qBACA,OAAOJ,OAAO,IAAI,CAAC,IAAIC,oBAAoBJ,MAAM,IAAI;YAIzD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;gBAAEA;YAAM;YAGvC,IAAI,CAAC,UAAU,CAAC,KAAK;YAErB,OAAOG,OAAO,EAAE;QACpB,EAAE,OAAOM,OAAO;YACZ,OAAON,OAAO,IAAI,CAAC,IAAIO,sBAAsBD;QACjD;IACJ;IAEA,MAAc,YAAYT,KAAe,EAAEC,MAAc,EAAoB;QAEzE,IAAID,MAAM,IAAI,IAAIA,MAAM,IAAI,CAAC,IAAI,IAAI;YACjC,MAAMW,iBAAiB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBACjD,OAAO;oBACHV;oBACA,MAAMD,MAAM,IAAI;gBACpB;YACJ;YAEA,OAAOW,eAAe,MAAM,GAAG;QACnC;QAGA,MAAMC,WAAW,IAAI,CAAC,eAAe,CAAC,OAAO,CAACZ,MAAM,IAAI;QACxD,MAAMW,iBAAiB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACjD,OAAO;gBACHV;gBACA,MAAMW;YACV;QACJ;QAEA,IAAID,AAA0B,MAA1BA,eAAe,MAAM,EAErBX,MAAM,IAAI,GAAGY;aAGbZ,MAAM,IAAI,GAAG,GAAGY,SAAS,CAAC,EAAEC,uBAAuB,IAAI;QAG3D,OAAO;IACX;AACJ;AAEO,MAAMC,8CAAwBC,sBAAAA,oBAA0C,CAAC;IAC5E,gBAAgBtB;IAChB,cAAc;QACVuB;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -12,6 +12,7 @@ import { RefFieldToGraphQL } from "./fields/base/RefToGraphQL.js";
12
12
  import { SearchableJsonFieldToGraphQL } from "./fields/base/SearchableJsonToGraphQL.js";
13
13
  import { TextFieldToGraphQL } from "./fields/base/TextToGraphQL.js";
14
14
  import { RichTextFieldToGraphQL } from "./fields/base/RichTextToGraphQL.js";
15
+ import { AssetFieldToGraphQL } from "./fields/base/AssetToGraphQL.js";
15
16
  const GraphQLFeature = createFeature({
16
17
  name: "Cms/GraphQLFeature",
17
18
  register: (container)=>{
@@ -27,6 +28,7 @@ const GraphQLFeature = createFeature({
27
28
  container.register(RichTextFieldToGraphQL);
28
29
  container.register(SearchableJsonFieldToGraphQL);
29
30
  container.register(TextFieldToGraphQL);
31
+ container.register(AssetFieldToGraphQL);
30
32
  container.register(CmsModelFieldToGraphQLRegistry).inSingletonScope();
31
33
  }
32
34
  });
@@ -1 +1 @@
1
- {"version":3,"file":"features/graphql/feature.js","sources":["../../../src/features/graphql/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CmsModelFieldToGraphQLRegistry } from \"./fields/CmsModelFieldToGraphQLRegistry.js\";\nimport { BooleanFieldToGraphQL } from \"./fields/base/BooleanToGraphQL.js\";\nimport { DateTimeFieldToGraphQL } from \"./fields/base/DateTimeToGraphQL.js\";\nimport { DynamicZoneFieldToGraphQL } from \"./fields/base/DynamicZoneToGraphQL.js\";\nimport { FileFieldToGraphQL } from \"./fields/base/FileToGraphQL.js\";\nimport { JsonFieldToGraphQL } from \"./fields/base/JsonToGraphQL.js\";\nimport { LongTextFieldToGraphQL } from \"./fields/base/LongTextToGraphQL.js\";\nimport { NumberFieldToGraphQL } from \"./fields/base/NumberToGraphQL.js\";\nimport { ObjectFieldToGraphQL } from \"./fields/base/ObjectToGraphQL.js\";\nimport { RefFieldToGraphQL } from \"./fields/base/RefToGraphQL.js\";\nimport { SearchableJsonFieldToGraphQL } from \"./fields/base/SearchableJsonToGraphQL.js\";\nimport { TextFieldToGraphQL } from \"./fields/base/TextToGraphQL.js\";\nimport { RichTextFieldToGraphQL } from \"./fields/base/RichTextToGraphQL.js\";\n\nexport const GraphQLFeature = createFeature({\n name: \"Cms/GraphQLFeature\",\n register: container => {\n container.register(BooleanFieldToGraphQL);\n container.register(DateTimeFieldToGraphQL);\n container.register(DynamicZoneFieldToGraphQL);\n container.register(FileFieldToGraphQL);\n container.register(JsonFieldToGraphQL);\n container.register(LongTextFieldToGraphQL);\n container.register(NumberFieldToGraphQL);\n container.register(ObjectFieldToGraphQL);\n container.register(RefFieldToGraphQL);\n container.register(RichTextFieldToGraphQL);\n container.register(SearchableJsonFieldToGraphQL);\n container.register(TextFieldToGraphQL);\n\n container.register(CmsModelFieldToGraphQLRegistry).inSingletonScope();\n }\n});\n"],"names":["GraphQLFeature","createFeature","container","BooleanFieldToGraphQL","DateTimeFieldToGraphQL","DynamicZoneFieldToGraphQL","FileFieldToGraphQL","JsonFieldToGraphQL","LongTextFieldToGraphQL","NumberFieldToGraphQL","ObjectFieldToGraphQL","RefFieldToGraphQL","RichTextFieldToGraphQL","SearchableJsonFieldToGraphQL","TextFieldToGraphQL","CmsModelFieldToGraphQLRegistry"],"mappings":";;;;;;;;;;;;;;AAeO,MAAMA,iBAAiBC,cAAc;IACxC,MAAM;IACN,UAAUC,CAAAA;QACNA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;QACnBN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QACnBX,UAAU,QAAQ,CAACY;QAEnBZ,UAAU,QAAQ,CAACa,gCAAgC,gBAAgB;IACvE;AACJ"}
1
+ {"version":3,"file":"features/graphql/feature.js","sources":["../../../src/features/graphql/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CmsModelFieldToGraphQLRegistry } from \"./fields/CmsModelFieldToGraphQLRegistry.js\";\nimport { BooleanFieldToGraphQL } from \"./fields/base/BooleanToGraphQL.js\";\nimport { DateTimeFieldToGraphQL } from \"./fields/base/DateTimeToGraphQL.js\";\nimport { DynamicZoneFieldToGraphQL } from \"./fields/base/DynamicZoneToGraphQL.js\";\nimport { FileFieldToGraphQL } from \"./fields/base/FileToGraphQL.js\";\nimport { JsonFieldToGraphQL } from \"./fields/base/JsonToGraphQL.js\";\nimport { LongTextFieldToGraphQL } from \"./fields/base/LongTextToGraphQL.js\";\nimport { NumberFieldToGraphQL } from \"./fields/base/NumberToGraphQL.js\";\nimport { ObjectFieldToGraphQL } from \"./fields/base/ObjectToGraphQL.js\";\nimport { RefFieldToGraphQL } from \"./fields/base/RefToGraphQL.js\";\nimport { SearchableJsonFieldToGraphQL } from \"./fields/base/SearchableJsonToGraphQL.js\";\nimport { TextFieldToGraphQL } from \"./fields/base/TextToGraphQL.js\";\nimport { RichTextFieldToGraphQL } from \"./fields/base/RichTextToGraphQL.js\";\nimport { AssetFieldToGraphQL } from \"./fields/base/AssetToGraphQL.js\";\n\nexport const GraphQLFeature = createFeature({\n name: \"Cms/GraphQLFeature\",\n register: container => {\n container.register(BooleanFieldToGraphQL);\n container.register(DateTimeFieldToGraphQL);\n container.register(DynamicZoneFieldToGraphQL);\n container.register(FileFieldToGraphQL);\n container.register(JsonFieldToGraphQL);\n container.register(LongTextFieldToGraphQL);\n container.register(NumberFieldToGraphQL);\n container.register(ObjectFieldToGraphQL);\n container.register(RefFieldToGraphQL);\n container.register(RichTextFieldToGraphQL);\n container.register(SearchableJsonFieldToGraphQL);\n container.register(TextFieldToGraphQL);\n container.register(AssetFieldToGraphQL);\n\n container.register(CmsModelFieldToGraphQLRegistry).inSingletonScope();\n }\n});\n"],"names":["GraphQLFeature","createFeature","container","BooleanFieldToGraphQL","DateTimeFieldToGraphQL","DynamicZoneFieldToGraphQL","FileFieldToGraphQL","JsonFieldToGraphQL","LongTextFieldToGraphQL","NumberFieldToGraphQL","ObjectFieldToGraphQL","RefFieldToGraphQL","RichTextFieldToGraphQL","SearchableJsonFieldToGraphQL","TextFieldToGraphQL","AssetFieldToGraphQL","CmsModelFieldToGraphQLRegistry"],"mappings":";;;;;;;;;;;;;;;AAgBO,MAAMA,iBAAiBC,cAAc;IACxC,MAAM;IACN,UAAUC,CAAAA;QACNA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;QACnBN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QACnBX,UAAU,QAAQ,CAACY;QACnBZ,UAAU,QAAQ,CAACa;QAEnBb,UAAU,QAAQ,CAACc,gCAAgC,gBAAgB;IACvE;AACJ"}
@@ -0,0 +1,26 @@
1
+ import { CmsModelFieldToGraphQL } from "../abstractions/CmsModelFieldToGraphQL.js";
2
+ import type { CmsModelFieldType } from "../../../../types/modelField.js";
3
+ import type { GraphQLSchemaDefinition } from "@webiny/api-graphql/types.js";
4
+ import type { CmsContext } from "../../../../types/types.js";
5
+ declare class ReadApi implements CmsModelFieldToGraphQL.ReadApi {
6
+ createTypeField({ field }: CmsModelFieldToGraphQL.TypeFieldParams): string;
7
+ createResolver(): CmsModelFieldToGraphQL.Resolver;
8
+ createSchema(): GraphQLSchemaDefinition<CmsContext>;
9
+ }
10
+ declare class ManageApi extends ReadApi implements CmsModelFieldToGraphQL.ManageApi {
11
+ createInputField({ field }: CmsModelFieldToGraphQL.TypeFieldParams): string;
12
+ }
13
+ declare class AssetToGraphQL implements CmsModelFieldToGraphQL.Interface {
14
+ readonly read: ReadApi;
15
+ readonly manage: ManageApi;
16
+ readonly fieldType: CmsModelFieldType;
17
+ readonly isSearchable: boolean;
18
+ readonly isSortable: boolean;
19
+ readonly isFullTextSearchable: boolean;
20
+ getReadApi(): CmsModelFieldToGraphQL.ReadApi;
21
+ getManageApi(): CmsModelFieldToGraphQL.ManageApi;
22
+ }
23
+ export declare const AssetFieldToGraphQL: typeof AssetToGraphQL & {
24
+ __abstraction: import("@webiny/di").Abstraction<import("../abstractions/CmsModelFieldToGraphQL.js").ICmsModelFieldToGraphQL<import("~/types/modelField.js").CmsModelField>>;
25
+ };
26
+ export {};
@@ -0,0 +1,148 @@
1
+ import { CmsModelFieldToGraphQL } from "../abstractions/CmsModelFieldToGraphQL.js";
2
+ import { createGraphQLInputField } from "./utils/createGraphQLInputField.js";
3
+ import { resolveAssetUrl } from "../../../modelBuilder/fields/resolveAssetUrl.js";
4
+ const imageTypeDefs = `
5
+ type FmAssetCrop {
6
+ top: Number
7
+ left: Number
8
+ bottom: Number
9
+ right: Number
10
+ }
11
+
12
+ type FmAssetFocalPoint {
13
+ x: Number
14
+ y: Number
15
+ }
16
+
17
+ type FmAssetImage {
18
+ width: Number
19
+ height: Number
20
+ crop: FmAssetCrop
21
+ focalPoint: FmAssetFocalPoint
22
+ alt: String
23
+ caption: String
24
+ }
25
+
26
+ input FmAssetCropInput {
27
+ top: Number
28
+ left: Number
29
+ bottom: Number
30
+ right: Number
31
+ }
32
+
33
+ input FmAssetFocalPointInput {
34
+ x: Number
35
+ y: Number
36
+ }
37
+
38
+ input FmAssetImageInput {
39
+ width: Number
40
+ height: Number
41
+ crop: FmAssetCropInput
42
+ focalPoint: FmAssetFocalPointInput
43
+ alt: String
44
+ caption: String
45
+ }
46
+ `;
47
+ const documentTypeDefs = `
48
+ type FmAssetDocument {
49
+ pages: Number
50
+ }
51
+
52
+ input FmAssetDocumentInput {
53
+ pages: Number
54
+ }
55
+ `;
56
+ const videoTypeDefs = `
57
+ type FmAssetVideo {
58
+ autoplay: Boolean
59
+ poster: String
60
+ }
61
+
62
+ input FmAssetVideoInput {
63
+ autoplay: Boolean
64
+ poster: String
65
+ }
66
+ `;
67
+ const baseTypeDefs = `
68
+ type FmAsset {
69
+ id: String!
70
+ src: String!
71
+ url: String
72
+ name: String!
73
+ type: String!
74
+ size: Number!
75
+ image: FmAssetImage
76
+ document: FmAssetDocument
77
+ video: FmAssetVideo
78
+ }
79
+
80
+ input FmAssetInput {
81
+ id: String!
82
+ src: String!
83
+ # TODO: figure out how to remove this from here, as this is a derived read-only value.
84
+ url: String
85
+ name: String!
86
+ type: String!
87
+ size: Number!
88
+ image: FmAssetImageInput
89
+ document: FmAssetDocumentInput
90
+ video: FmAssetVideoInput
91
+ }
92
+ `;
93
+ const allTypeDefs = [
94
+ imageTypeDefs,
95
+ documentTypeDefs,
96
+ videoTypeDefs,
97
+ baseTypeDefs
98
+ ].join("\n");
99
+ class ReadApi {
100
+ createTypeField({ field }) {
101
+ if (field.list) return `${field.fieldId}: [FmAsset]`;
102
+ return `${field.fieldId}: FmAsset`;
103
+ }
104
+ createResolver() {
105
+ return {
106
+ resolver: null,
107
+ typeResolvers: {
108
+ FmAsset: {
109
+ url: (parent)=>resolveAssetUrl(parent)
110
+ }
111
+ }
112
+ };
113
+ }
114
+ createSchema() {
115
+ return {
116
+ typeDefs: allTypeDefs,
117
+ resolvers: {}
118
+ };
119
+ }
120
+ }
121
+ class ManageApi extends ReadApi {
122
+ createInputField({ field }) {
123
+ return createGraphQLInputField(field, "FmAssetInput");
124
+ }
125
+ }
126
+ class AssetToGraphQL {
127
+ getReadApi() {
128
+ return this.read;
129
+ }
130
+ getManageApi() {
131
+ return this.manage;
132
+ }
133
+ constructor(){
134
+ this.read = new ReadApi();
135
+ this.manage = new ManageApi();
136
+ this.fieldType = "asset";
137
+ this.isSearchable = false;
138
+ this.isSortable = false;
139
+ this.isFullTextSearchable = false;
140
+ }
141
+ }
142
+ const AssetFieldToGraphQL = CmsModelFieldToGraphQL.createImplementation({
143
+ implementation: AssetToGraphQL,
144
+ dependencies: []
145
+ });
146
+ export { AssetFieldToGraphQL };
147
+
148
+ //# sourceMappingURL=AssetToGraphQL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/graphql/fields/base/AssetToGraphQL.js","sources":["../../../../../src/features/graphql/fields/base/AssetToGraphQL.ts"],"sourcesContent":["import { CmsModelFieldToGraphQL } from \"../abstractions/CmsModelFieldToGraphQL.js\";\nimport type { CmsModelFieldType } from \"~/types/modelField.js\";\nimport type { GraphQLSchemaDefinition } from \"@webiny/api-graphql/types.js\";\nimport type { CmsContext } from \"~/types/types.js\";\nimport { createGraphQLInputField } from \"./utils/createGraphQLInputField.js\";\nimport { resolveAssetUrl } from \"../../../modelBuilder/fields/resolveAssetUrl.js\";\n\n// --- Image sub-type (self-contained block for future registry extraction) ---\n\nconst imageTypeDefs = /* GraphQL */ `\n type FmAssetCrop {\n top: Number\n left: Number\n bottom: Number\n right: Number\n }\n\n type FmAssetFocalPoint {\n x: Number\n y: Number\n }\n\n type FmAssetImage {\n width: Number\n height: Number\n crop: FmAssetCrop\n focalPoint: FmAssetFocalPoint\n alt: String\n caption: String\n }\n\n input FmAssetCropInput {\n top: Number\n left: Number\n bottom: Number\n right: Number\n }\n\n input FmAssetFocalPointInput {\n x: Number\n y: Number\n }\n\n input FmAssetImageInput {\n width: Number\n height: Number\n crop: FmAssetCropInput\n focalPoint: FmAssetFocalPointInput\n alt: String\n caption: String\n }\n`;\n\n// --- Document sub-type ---\n\nconst documentTypeDefs = /* GraphQL */ `\n type FmAssetDocument {\n pages: Number\n }\n\n input FmAssetDocumentInput {\n pages: Number\n }\n`;\n\n// --- Video sub-type ---\n\nconst videoTypeDefs = /* GraphQL */ `\n type FmAssetVideo {\n autoplay: Boolean\n poster: String\n }\n\n input FmAssetVideoInput {\n autoplay: Boolean\n poster: String\n }\n`;\n\n// --- Base asset type ---\n\nconst baseTypeDefs = /* GraphQL */ `\n type FmAsset {\n id: String!\n src: String!\n url: String\n name: String!\n type: String!\n size: Number!\n image: FmAssetImage\n document: FmAssetDocument\n video: FmAssetVideo\n }\n\n input FmAssetInput {\n id: String!\n src: String!\n # TODO: figure out how to remove this from here, as this is a derived read-only value.\n url: String\n name: String!\n type: String!\n size: Number!\n image: FmAssetImageInput\n document: FmAssetDocumentInput\n video: FmAssetVideoInput\n }\n`;\n\nconst allTypeDefs = [imageTypeDefs, documentTypeDefs, videoTypeDefs, baseTypeDefs].join(\"\\n\");\n\nclass ReadApi implements CmsModelFieldToGraphQL.ReadApi {\n public createTypeField({ field }: CmsModelFieldToGraphQL.TypeFieldParams): string {\n if (field.list) {\n return `${field.fieldId}: [FmAsset]`;\n }\n return `${field.fieldId}: FmAsset`;\n }\n\n public createResolver(): CmsModelFieldToGraphQL.Resolver {\n return {\n resolver: null,\n typeResolvers: {\n FmAsset: {\n url: (parent: any) => resolveAssetUrl(parent)\n }\n }\n };\n }\n\n public createSchema(): GraphQLSchemaDefinition<CmsContext> {\n return {\n typeDefs: allTypeDefs,\n resolvers: {}\n };\n }\n}\n\nclass ManageApi extends ReadApi implements CmsModelFieldToGraphQL.ManageApi {\n public createInputField({ field }: CmsModelFieldToGraphQL.TypeFieldParams): string {\n return createGraphQLInputField(field, \"FmAssetInput\");\n }\n}\n\nclass AssetToGraphQL implements CmsModelFieldToGraphQL.Interface {\n public readonly read = new ReadApi();\n public readonly manage = new ManageApi();\n\n public readonly fieldType: CmsModelFieldType = \"asset\";\n public readonly isSearchable: boolean = false;\n public readonly isSortable: boolean = false;\n public readonly isFullTextSearchable: boolean = false;\n\n public getReadApi(): CmsModelFieldToGraphQL.ReadApi {\n return this.read;\n }\n\n public getManageApi(): CmsModelFieldToGraphQL.ManageApi {\n return this.manage;\n }\n}\n\nexport const AssetFieldToGraphQL = CmsModelFieldToGraphQL.createImplementation({\n implementation: AssetToGraphQL,\n dependencies: []\n});\n"],"names":["imageTypeDefs","documentTypeDefs","videoTypeDefs","baseTypeDefs","allTypeDefs","ReadApi","field","parent","resolveAssetUrl","ManageApi","createGraphQLInputField","AssetToGraphQL","AssetFieldToGraphQL","CmsModelFieldToGraphQL"],"mappings":";;;AASA,MAAMA,gBAA8B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CrC,CAAC;AAID,MAAMC,mBAAiC,CAAC;;;;;;;;AAQxC,CAAC;AAID,MAAMC,gBAA8B,CAAC;;;;;;;;;;AAUrC,CAAC;AAID,MAAMC,eAA6B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AAyBpC,CAAC;AAED,MAAMC,cAAc;IAACJ;IAAeC;IAAkBC;IAAeC;CAAa,CAAC,IAAI,CAAC;AAExF,MAAME;IACK,gBAAgB,EAAEC,KAAK,EAA0C,EAAU;QAC9E,IAAIA,MAAM,IAAI,EACV,OAAO,GAAGA,MAAM,OAAO,CAAC,WAAW,CAAC;QAExC,OAAO,GAAGA,MAAM,OAAO,CAAC,SAAS,CAAC;IACtC;IAEO,iBAAkD;QACrD,OAAO;YACH,UAAU;YACV,eAAe;gBACX,SAAS;oBACL,KAAK,CAACC,SAAgBC,gBAAgBD;gBAC1C;YACJ;QACJ;IACJ;IAEO,eAAoD;QACvD,OAAO;YACH,UAAUH;YACV,WAAW,CAAC;QAChB;IACJ;AACJ;AAEA,MAAMK,kBAAkBJ;IACb,iBAAiB,EAAEC,KAAK,EAA0C,EAAU;QAC/E,OAAOI,wBAAwBJ,OAAO;IAC1C;AACJ;AAEA,MAAMK;IASK,aAA6C;QAChD,OAAO,IAAI,CAAC,IAAI;IACpB;IAEO,eAAiD;QACpD,OAAO,IAAI,CAAC,MAAM;IACtB;;aAdgB,IAAI,GAAG,IAAIN;aACX,MAAM,GAAG,IAAII;aAEb,SAAS,GAAsB;aAC/B,YAAY,GAAY;aACxB,UAAU,GAAY;aACtB,oBAAoB,GAAY;;AASpD;AAEO,MAAMG,sBAAsBC,uBAAuB,oBAAoB,CAAC;IAC3E,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -66,10 +66,14 @@ class ReadApi {
66
66
  fieldRegistry,
67
67
  templates
68
68
  });
69
+ const templateIds = templateTypes.map((type)=>`extend type ${type} {
70
+ _templateId: ID!
71
+ }
72
+ `);
69
73
  typeDefs.unshift(`union ${unionTypeName} = ${templateTypes.join(" | ")}`);
70
74
  return {
71
75
  fields: `${field.fieldId}: ${field.list ? `[${unionTypeName}!]` : unionTypeName}`,
72
- typeDefs: typeDefs.join("\n")
76
+ typeDefs: typeDefs.concat(templateIds).join("\n")
73
77
  };
74
78
  }
75
79
  createResolver(params) {
@@ -1 +1 @@
1
- {"version":3,"file":"features/graphql/fields/base/DynamicZoneToGraphQL.js","sources":["../../../../../src/features/graphql/fields/base/DynamicZoneToGraphQL.ts"],"sourcesContent":["import { CmsModelFieldToGraphQL } from \"../abstractions/CmsModelFieldToGraphQL.js\";\nimport type {\n ApiEndpoint,\n CmsDynamicZoneTemplate,\n CmsModel,\n CmsModelDynamicZoneField,\n CmsModelField,\n CmsModelFieldType,\n CmsModelFieldDefinition\n} from \"~/types/index.js\";\nimport type { ValidateChildFieldsParams } from \"../abstractions/CmsModelFieldToGraphQL.js\";\nimport type { CmsModelFieldAstNode, ICmsModelFieldToAst } from \"~/types/modelAst.js\";\nimport type { GraphQLFieldResolver } from \"@webiny/api-graphql/types.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { createTypeName } from \"~/utils/createTypeName.js\";\nimport { createGraphQLInputField } from \"./utils/createGraphQLInputField.js\";\nimport { createTypeDefsForTemplates } from \"./dynamicZone/createTypeDefsForTemplates.js\";\nimport { normalizeDynamicZoneInput } from \"./dynamicZone/normalizeDynamicZoneInput.js\";\n\nconst createUnionTypeName = (model: CmsModel, field: CmsModelField) => {\n return `${model.singularApiName}_${createTypeName(field.fieldId)}`;\n};\n\nconst getFieldTemplates = (field: CmsModelDynamicZoneField): CmsDynamicZoneTemplate[] => {\n if (!Array.isArray(field.settings?.templates)) {\n return [];\n }\n return field.settings.templates;\n};\n\nconst remapTemplateValue = (value: any, typeName: string) => {\n return { ...value, __typename: typeName };\n};\n\nconst createDynamicZoneResolver = (\n endpointType: ApiEndpoint\n): ((params: CmsModelFieldToGraphQL.ResolverParams) => CmsModelFieldToGraphQL.Resolver) => {\n return ({ model, models, field, fieldRegistry, createFieldResolvers, graphQLType }) => {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = getFieldTemplates(dzField);\n\n if (!templates.length) {\n return false;\n }\n\n const resolver = (parent: any) => {\n const value = parent[field.fieldId];\n if (!value) {\n return value;\n }\n\n const typeName = `${graphQLType}_${createTypeName(field.fieldId)}`;\n\n if (field.list && Array.isArray(value)) {\n return value.map(v => {\n const template = templates.find(tpl => tpl.id === v._templateId);\n if (!template) {\n return undefined;\n }\n return remapTemplateValue(v, `${typeName}_${template.gqlTypeName}`);\n });\n }\n\n const template = templates.find(tpl => tpl.id === value._templateId);\n if (!template) {\n return undefined;\n }\n return remapTemplateValue(value, `${typeName}_${template.gqlTypeName}`);\n };\n\n const { templateTypes } = createTypeDefsForTemplates({\n models,\n field,\n type: endpointType,\n typeOfType: \"type\",\n model,\n fieldRegistry,\n templates\n });\n\n const replace = new RegExp(`${model.singularApiName}_`, \"g\");\n\n const typeResolvers = templateTypes\n .map(templateType => {\n return templateType.replace(replace, `${graphQLType}_`);\n })\n .reduce<Record<string, Record<string, GraphQLFieldResolver>>>(\n (typeResolvers, templateType, index) => {\n return {\n ...typeResolvers,\n ...createFieldResolvers({\n graphQLType: templateType,\n fields: dzField.settings.templates[index].fields\n })\n };\n },\n {}\n );\n\n return {\n resolver,\n typeResolvers\n };\n };\n};\n\nclass ReadApi implements CmsModelFieldToGraphQL.ReadApi {\n public createTypeField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = getFieldTemplates(dzField);\n if (!templates.length) {\n return null;\n }\n\n const unionTypeName = createUnionTypeName(model, field);\n\n const { typeDefs, templateTypes } = createTypeDefsForTemplates({\n models,\n field,\n type: \"read\",\n typeOfType: \"type\",\n model,\n fieldRegistry,\n templates\n });\n\n typeDefs.unshift(`union ${unionTypeName} = ${templateTypes.join(\" | \")}`);\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${unionTypeName}!]` : unionTypeName}`,\n typeDefs: typeDefs.join(\"\\n\")\n };\n }\n\n public createResolver(\n params: CmsModelFieldToGraphQL.ResolverParams\n ): CmsModelFieldToGraphQL.Resolver {\n return createDynamicZoneResolver(\"read\")(params);\n }\n}\n\nclass ManageApi implements CmsModelFieldToGraphQL.ManageApi {\n public createTypeField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = getFieldTemplates(dzField);\n\n if (!templates.length) {\n return null;\n }\n\n const unionTypeName = createUnionTypeName(model, field);\n\n const { typeDefs, templateTypes } = createTypeDefsForTemplates({\n models,\n field,\n type: \"manage\",\n typeOfType: \"type\",\n model,\n fieldRegistry,\n templates\n });\n\n /* Add _templateId. */\n const templateIds = templateTypes.map(type => {\n return `extend type ${type} {\n _templateId: ID!\n }\n `;\n });\n\n typeDefs.unshift(`union ${unionTypeName} = ${templateTypes.join(\" | \")}`);\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${unionTypeName}!]` : unionTypeName}`,\n typeDefs: typeDefs.concat(templateIds).join(\"\\n\")\n };\n }\n\n public createInputField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = getFieldTemplates(dzField);\n\n if (!templates.length) {\n return null;\n }\n\n const { typeDefs, templateTypes } = createTypeDefsForTemplates({\n models,\n field,\n type: \"manage\",\n typeOfType: \"input\",\n model,\n fieldRegistry,\n templates\n });\n\n const typeName = `${model.singularApiName}_${createTypeName(field.fieldId)}`;\n\n const inputProperties = templateTypes.map(inputTypeName => {\n const key = inputTypeName.replace(`${typeName}_`, \"\").replace(\"Input\", \"\");\n return [key, inputTypeName];\n });\n\n /**\n * Generate a field input type, similar to this example:\n *\n * input Article_ContentInput {\n * Hero: Article_Content_HeroInput\n * SimpleText: Article_Content_SimpleTextInput\n * }\n */\n typeDefs.push(`input ${typeName}Input {\n ${inputProperties.map(\n ([key, value]) => `\n ${key}: ${value}\n `\n )}\n }`);\n\n return {\n fields: createGraphQLInputField(field, `${typeName}Input`),\n typeDefs: typeDefs.join(\"\\n\")\n };\n }\n\n public createResolver(\n params: CmsModelFieldToGraphQL.ResolverParams\n ): CmsModelFieldToGraphQL.Resolver {\n return createDynamicZoneResolver(\"manage\")(params);\n }\n\n public async normalizeInput<T>({\n field,\n input\n }: CmsModelFieldToGraphQL.InputNormalizeParams): Promise<T> {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = dzField.settings?.templates || [];\n\n if (Array.isArray(input) && field.list) {\n return input\n .map(value => normalizeDynamicZoneInput(value, templates))\n .filter(Boolean) as T;\n }\n\n return normalizeDynamicZoneInput(input as GenericRecord<string>, templates) as T;\n }\n}\n\nclass DynamicZoneToGraphQL implements CmsModelFieldToGraphQL.Interface {\n public readonly read = new ReadApi();\n public readonly manage = new ManageApi();\n\n public readonly fieldType: CmsModelFieldType = \"dynamicZone\";\n public readonly isSearchable: boolean = false;\n public readonly isSortable: boolean = false;\n public readonly isFullTextSearchable: boolean = false;\n\n public getReadApi(): CmsModelFieldToGraphQL.ReadApi {\n return this.read;\n }\n\n public getManageApi(): CmsModelFieldToGraphQL.ManageApi {\n return this.manage;\n }\n\n public validateChildFields(params: ValidateChildFieldsParams<CmsModelField>): void {\n const field = params.field as CmsModelDynamicZoneField;\n const originalField = params.originalField as CmsModelDynamicZoneField | undefined;\n\n const getOriginalTemplateFields = (templateId: string) => {\n if (!originalField?.settings?.templates) {\n return [];\n }\n const template = originalField.settings.templates.find(t => t.id === templateId);\n return template?.fields || [];\n };\n\n for (const template of field.settings.templates) {\n params.validate({\n fields: template.fields,\n originalFields: getOriginalTemplateFields(template.id)\n });\n }\n }\n\n public getFieldAst(field: CmsModelField, converter: ICmsModelFieldToAst): CmsModelFieldAstNode {\n const dzField = field as CmsModelDynamicZoneField;\n const { templates = [] } = dzField.settings;\n\n return {\n type: \"field\",\n field,\n children: templates.map(({ fields, ...template }) => {\n return {\n type: \"collection\" as const,\n collection: {\n ...template,\n discriminator: \"_templateId\"\n },\n children: fields.map(f => converter.toAst(f))\n };\n })\n };\n }\n}\n\nexport const DynamicZoneFieldToGraphQL = CmsModelFieldToGraphQL.createImplementation({\n implementation: DynamicZoneToGraphQL,\n dependencies: []\n});\n"],"names":["createUnionTypeName","model","field","createTypeName","getFieldTemplates","Array","remapTemplateValue","value","typeName","createDynamicZoneResolver","endpointType","models","fieldRegistry","createFieldResolvers","graphQLType","dzField","templates","resolver","parent","v","template","tpl","templateTypes","createTypeDefsForTemplates","replace","RegExp","typeResolvers","templateType","index","ReadApi","unionTypeName","typeDefs","params","ManageApi","templateIds","type","inputProperties","inputTypeName","key","createGraphQLInputField","input","normalizeDynamicZoneInput","Boolean","DynamicZoneToGraphQL","originalField","getOriginalTemplateFields","templateId","t","converter","fields","f","DynamicZoneFieldToGraphQL","CmsModelFieldToGraphQL"],"mappings":"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"}
1
+ {"version":3,"file":"features/graphql/fields/base/DynamicZoneToGraphQL.js","sources":["../../../../../src/features/graphql/fields/base/DynamicZoneToGraphQL.ts"],"sourcesContent":["import { CmsModelFieldToGraphQL } from \"../abstractions/CmsModelFieldToGraphQL.js\";\nimport type {\n ApiEndpoint,\n CmsDynamicZoneTemplate,\n CmsModel,\n CmsModelDynamicZoneField,\n CmsModelField,\n CmsModelFieldType,\n CmsModelFieldDefinition\n} from \"~/types/index.js\";\nimport type { ValidateChildFieldsParams } from \"../abstractions/CmsModelFieldToGraphQL.js\";\nimport type { CmsModelFieldAstNode, ICmsModelFieldToAst } from \"~/types/modelAst.js\";\nimport type { GraphQLFieldResolver } from \"@webiny/api-graphql/types.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { createTypeName } from \"~/utils/createTypeName.js\";\nimport { createGraphQLInputField } from \"./utils/createGraphQLInputField.js\";\nimport { createTypeDefsForTemplates } from \"./dynamicZone/createTypeDefsForTemplates.js\";\nimport { normalizeDynamicZoneInput } from \"./dynamicZone/normalizeDynamicZoneInput.js\";\n\nconst createUnionTypeName = (model: CmsModel, field: CmsModelField) => {\n return `${model.singularApiName}_${createTypeName(field.fieldId)}`;\n};\n\nconst getFieldTemplates = (field: CmsModelDynamicZoneField): CmsDynamicZoneTemplate[] => {\n if (!Array.isArray(field.settings?.templates)) {\n return [];\n }\n return field.settings.templates;\n};\n\nconst remapTemplateValue = (value: any, typeName: string) => {\n return { ...value, __typename: typeName };\n};\n\nconst createDynamicZoneResolver = (\n endpointType: ApiEndpoint\n): ((params: CmsModelFieldToGraphQL.ResolverParams) => CmsModelFieldToGraphQL.Resolver) => {\n return ({ model, models, field, fieldRegistry, createFieldResolvers, graphQLType }) => {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = getFieldTemplates(dzField);\n\n if (!templates.length) {\n return false;\n }\n\n const resolver = (parent: any) => {\n const value = parent[field.fieldId];\n if (!value) {\n return value;\n }\n\n const typeName = `${graphQLType}_${createTypeName(field.fieldId)}`;\n\n if (field.list && Array.isArray(value)) {\n return value.map(v => {\n const template = templates.find(tpl => tpl.id === v._templateId);\n if (!template) {\n return undefined;\n }\n return remapTemplateValue(v, `${typeName}_${template.gqlTypeName}`);\n });\n }\n\n const template = templates.find(tpl => tpl.id === value._templateId);\n if (!template) {\n return undefined;\n }\n return remapTemplateValue(value, `${typeName}_${template.gqlTypeName}`);\n };\n\n const { templateTypes } = createTypeDefsForTemplates({\n models,\n field,\n type: endpointType,\n typeOfType: \"type\",\n model,\n fieldRegistry,\n templates\n });\n\n const replace = new RegExp(`${model.singularApiName}_`, \"g\");\n\n const typeResolvers = templateTypes\n .map(templateType => {\n return templateType.replace(replace, `${graphQLType}_`);\n })\n .reduce<Record<string, Record<string, GraphQLFieldResolver>>>(\n (typeResolvers, templateType, index) => {\n return {\n ...typeResolvers,\n ...createFieldResolvers({\n graphQLType: templateType,\n fields: dzField.settings.templates[index].fields\n })\n };\n },\n {}\n );\n\n return {\n resolver,\n typeResolvers\n };\n };\n};\n\nclass ReadApi implements CmsModelFieldToGraphQL.ReadApi {\n public createTypeField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = getFieldTemplates(dzField);\n if (!templates.length) {\n return null;\n }\n\n const unionTypeName = createUnionTypeName(model, field);\n\n const { typeDefs, templateTypes } = createTypeDefsForTemplates({\n models,\n field,\n type: \"read\",\n typeOfType: \"type\",\n model,\n fieldRegistry,\n templates\n });\n\n const templateIds = templateTypes.map(type => {\n return `extend type ${type} {\n _templateId: ID!\n }\n `;\n });\n\n typeDefs.unshift(`union ${unionTypeName} = ${templateTypes.join(\" | \")}`);\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${unionTypeName}!]` : unionTypeName}`,\n typeDefs: typeDefs.concat(templateIds).join(\"\\n\")\n };\n }\n\n public createResolver(\n params: CmsModelFieldToGraphQL.ResolverParams\n ): CmsModelFieldToGraphQL.Resolver {\n return createDynamicZoneResolver(\"read\")(params);\n }\n}\n\nclass ManageApi implements CmsModelFieldToGraphQL.ManageApi {\n public createTypeField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = getFieldTemplates(dzField);\n\n if (!templates.length) {\n return null;\n }\n\n const unionTypeName = createUnionTypeName(model, field);\n\n const { typeDefs, templateTypes } = createTypeDefsForTemplates({\n models,\n field,\n type: \"manage\",\n typeOfType: \"type\",\n model,\n fieldRegistry,\n templates\n });\n\n /* Add _templateId. */\n const templateIds = templateTypes.map(type => {\n return `extend type ${type} {\n _templateId: ID!\n }\n `;\n });\n\n typeDefs.unshift(`union ${unionTypeName} = ${templateTypes.join(\" | \")}`);\n\n return {\n fields: `${field.fieldId}: ${field.list ? `[${unionTypeName}!]` : unionTypeName}`,\n typeDefs: typeDefs.concat(templateIds).join(\"\\n\")\n };\n }\n\n public createInputField({\n models,\n model,\n field,\n fieldRegistry\n }: CmsModelFieldToGraphQL.TypeFieldParams): CmsModelFieldDefinition | null {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = getFieldTemplates(dzField);\n\n if (!templates.length) {\n return null;\n }\n\n const { typeDefs, templateTypes } = createTypeDefsForTemplates({\n models,\n field,\n type: \"manage\",\n typeOfType: \"input\",\n model,\n fieldRegistry,\n templates\n });\n\n const typeName = `${model.singularApiName}_${createTypeName(field.fieldId)}`;\n\n const inputProperties = templateTypes.map(inputTypeName => {\n const key = inputTypeName.replace(`${typeName}_`, \"\").replace(\"Input\", \"\");\n return [key, inputTypeName];\n });\n\n /**\n * Generate a field input type, similar to this example:\n *\n * input Article_ContentInput {\n * Hero: Article_Content_HeroInput\n * SimpleText: Article_Content_SimpleTextInput\n * }\n */\n typeDefs.push(`input ${typeName}Input {\n ${inputProperties.map(\n ([key, value]) => `\n ${key}: ${value}\n `\n )}\n }`);\n\n return {\n fields: createGraphQLInputField(field, `${typeName}Input`),\n typeDefs: typeDefs.join(\"\\n\")\n };\n }\n\n public createResolver(\n params: CmsModelFieldToGraphQL.ResolverParams\n ): CmsModelFieldToGraphQL.Resolver {\n return createDynamicZoneResolver(\"manage\")(params);\n }\n\n public async normalizeInput<T>({\n field,\n input\n }: CmsModelFieldToGraphQL.InputNormalizeParams): Promise<T> {\n const dzField = field as CmsModelDynamicZoneField;\n const templates = dzField.settings?.templates || [];\n\n if (Array.isArray(input) && field.list) {\n return input\n .map(value => normalizeDynamicZoneInput(value, templates))\n .filter(Boolean) as T;\n }\n\n return normalizeDynamicZoneInput(input as GenericRecord<string>, templates) as T;\n }\n}\n\nclass DynamicZoneToGraphQL implements CmsModelFieldToGraphQL.Interface {\n public readonly read = new ReadApi();\n public readonly manage = new ManageApi();\n\n public readonly fieldType: CmsModelFieldType = \"dynamicZone\";\n public readonly isSearchable: boolean = false;\n public readonly isSortable: boolean = false;\n public readonly isFullTextSearchable: boolean = false;\n\n public getReadApi(): CmsModelFieldToGraphQL.ReadApi {\n return this.read;\n }\n\n public getManageApi(): CmsModelFieldToGraphQL.ManageApi {\n return this.manage;\n }\n\n public validateChildFields(params: ValidateChildFieldsParams<CmsModelField>): void {\n const field = params.field as CmsModelDynamicZoneField;\n const originalField = params.originalField as CmsModelDynamicZoneField | undefined;\n\n const getOriginalTemplateFields = (templateId: string) => {\n if (!originalField?.settings?.templates) {\n return [];\n }\n const template = originalField.settings.templates.find(t => t.id === templateId);\n return template?.fields || [];\n };\n\n for (const template of field.settings.templates) {\n params.validate({\n fields: template.fields,\n originalFields: getOriginalTemplateFields(template.id)\n });\n }\n }\n\n public getFieldAst(field: CmsModelField, converter: ICmsModelFieldToAst): CmsModelFieldAstNode {\n const dzField = field as CmsModelDynamicZoneField;\n const { templates = [] } = dzField.settings;\n\n return {\n type: \"field\",\n field,\n children: templates.map(({ fields, ...template }) => {\n return {\n type: \"collection\" as const,\n collection: {\n ...template,\n discriminator: \"_templateId\"\n },\n children: fields.map(f => converter.toAst(f))\n };\n })\n };\n }\n}\n\nexport const DynamicZoneFieldToGraphQL = CmsModelFieldToGraphQL.createImplementation({\n implementation: DynamicZoneToGraphQL,\n dependencies: []\n});\n"],"names":["createUnionTypeName","model","field","createTypeName","getFieldTemplates","Array","remapTemplateValue","value","typeName","createDynamicZoneResolver","endpointType","models","fieldRegistry","createFieldResolvers","graphQLType","dzField","templates","resolver","parent","v","template","tpl","templateTypes","createTypeDefsForTemplates","replace","RegExp","typeResolvers","templateType","index","ReadApi","unionTypeName","typeDefs","templateIds","type","params","ManageApi","inputProperties","inputTypeName","key","createGraphQLInputField","input","normalizeDynamicZoneInput","Boolean","DynamicZoneToGraphQL","originalField","getOriginalTemplateFields","templateId","t","converter","fields","f","DynamicZoneFieldToGraphQL","CmsModelFieldToGraphQL"],"mappings":"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"}