@webiny/api-headless-cms 0.0.0-unstable.6e5425ee89 → 0.0.0-unstable.7f63ea0744
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.
- package/context.d.ts +5 -2
- package/context.js +53 -4
- package/context.js.map +1 -1
- package/crud/contentEntry/markLockedFields.js +4 -2
- package/crud/contentEntry/markLockedFields.js.map +1 -1
- package/crud/contentEntry/referenceFieldsMapping.js +7 -5
- package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
- package/crud/contentEntry/searchableFields.d.ts +9 -0
- package/crud/contentEntry/searchableFields.js +72 -0
- package/crud/contentEntry/searchableFields.js.map +1 -0
- package/crud/contentEntry.crud.js +99 -42
- package/crud/contentEntry.crud.js.map +1 -1
- package/crud/contentModel/beforeCreate.d.ts +2 -3
- package/crud/contentModel/beforeCreate.js +4 -5
- package/crud/contentModel/beforeCreate.js.map +1 -1
- package/crud/contentModel/beforeUpdate.d.ts +2 -4
- package/crud/contentModel/beforeUpdate.js +2 -2
- package/crud/contentModel/beforeUpdate.js.map +1 -1
- package/crud/contentModel/createFieldStorageId.js +4 -1
- package/crud/contentModel/createFieldStorageId.js.map +1 -1
- package/crud/contentModel/validateModel.d.ts +3 -4
- package/crud/contentModel/validateModel.js +6 -3
- package/crud/contentModel/validateModel.js.map +1 -1
- package/crud/contentModel/validateModelFields.d.ts +3 -4
- package/crud/contentModel/validateModelFields.js +100 -38
- package/crud/contentModel/validateModelFields.js.map +1 -1
- package/crud/contentModel/validation.d.ts +477 -0
- package/crud/contentModel/validation.js +97 -0
- package/crud/contentModel/validation.js.map +1 -0
- package/crud/contentModel.crud.js +212 -177
- package/crud/contentModel.crud.js.map +1 -1
- package/crud/contentModelGroup/validation.d.ts +30 -0
- package/crud/contentModelGroup/validation.js +34 -0
- package/crud/contentModelGroup/validation.js.map +1 -0
- package/crud/contentModelGroup.crud.js +47 -52
- package/crud/contentModelGroup.crud.js.map +1 -1
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.d.ts +11 -0
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +203 -0
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -0
- package/fieldConverters/index.d.ts +2 -1
- package/fieldConverters/index.js +2 -1
- package/fieldConverters/index.js.map +1 -1
- package/graphql/buildSchemaPlugins.d.ts +8 -3
- package/graphql/buildSchemaPlugins.js +3 -7
- package/graphql/buildSchemaPlugins.js.map +1 -1
- package/graphql/createExecutableSchema.d.ts +7 -0
- package/graphql/createExecutableSchema.js +29 -0
- package/graphql/createExecutableSchema.js.map +1 -0
- package/graphql/generateSchema.d.ts +8 -0
- package/graphql/generateSchema.js +31 -0
- package/graphql/generateSchema.js.map +1 -0
- package/graphql/graphQLHandlerFactory.js +91 -50
- package/graphql/graphQLHandlerFactory.js.map +1 -1
- package/graphql/index.d.ts +1 -3
- package/graphql/index.js +2 -39
- package/graphql/index.js.map +1 -1
- package/graphql/schema/baseContentSchema.d.ts +6 -2
- package/graphql/schema/baseContentSchema.js +6 -4
- package/graphql/schema/baseContentSchema.js.map +1 -1
- package/graphql/schema/baseSchema.d.ts +3 -0
- package/graphql/schema/baseSchema.js +53 -0
- package/graphql/schema/baseSchema.js.map +1 -0
- package/graphql/schema/contentEntries.d.ts +6 -2
- package/graphql/schema/contentEntries.js +37 -23
- package/graphql/schema/contentEntries.js.map +1 -1
- package/graphql/schema/contentModelGroups.d.ts +6 -2
- package/graphql/schema/contentModelGroups.js +7 -3
- package/graphql/schema/contentModelGroups.js.map +1 -1
- package/graphql/schema/contentModels.d.ts +6 -2
- package/graphql/schema/contentModels.js +40 -7
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphql/schema/createFieldResolvers.d.ts +1 -1
- package/graphql/schema/createFieldResolvers.js +17 -6
- package/graphql/schema/createFieldResolvers.js.map +1 -1
- package/graphql/schema/createManageSDL.d.ts +2 -0
- package/graphql/schema/createManageSDL.js +10 -6
- package/graphql/schema/createManageSDL.js.map +1 -1
- package/graphql/schema/createReadResolvers.js +5 -0
- package/graphql/schema/createReadResolvers.js.map +1 -1
- package/graphql/schema/createReadSDL.d.ts +2 -0
- package/graphql/schema/createReadSDL.js +11 -5
- package/graphql/schema/createReadSDL.js.map +1 -1
- package/graphql/schema/schemaPlugins.d.ts +8 -3
- package/graphql/schema/schemaPlugins.js +58 -46
- package/graphql/schema/schemaPlugins.js.map +1 -1
- package/graphql/system.js +69 -72
- package/graphql/system.js.map +1 -1
- package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +2 -0
- package/graphqlFields/dynamicZone/dynamicZoneField.js +208 -0
- package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -0
- package/graphqlFields/dynamicZone/dynamicZoneStorage.d.ts +3 -0
- package/graphqlFields/dynamicZone/dynamicZoneStorage.js +63 -0
- package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -0
- package/graphqlFields/dynamicZone/index.d.ts +2 -0
- package/graphqlFields/dynamicZone/index.js +19 -0
- package/graphqlFields/dynamicZone/index.js.map +1 -0
- package/graphqlFields/index.d.ts +1 -1
- package/graphqlFields/index.js +2 -1
- package/graphqlFields/index.js.map +1 -1
- package/graphqlFields/number.js +4 -0
- package/graphqlFields/number.js.map +1 -1
- package/graphqlFields/object.js +112 -68
- package/graphqlFields/object.js.map +1 -1
- package/graphqlFields/ref.js +31 -45
- package/graphqlFields/ref.js.map +1 -1
- package/index.d.ts +3 -3
- package/index.js +3 -7
- package/index.js.map +1 -1
- package/package.json +28 -28
- package/plugins/CmsGraphQLSchemaPlugin.d.ts +5 -0
- package/plugins/CmsGraphQLSchemaPlugin.js +12 -0
- package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -0
- package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +20 -0
- package/plugins/CmsGraphQLSchemaSorterPlugin.js +28 -0
- package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -0
- package/plugins/CmsModelFieldConverterPlugin.d.ts +2 -2
- package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
- package/plugins/StorageTransformPlugin.d.ts +11 -11
- package/plugins/StorageTransformPlugin.js.map +1 -1
- package/plugins/index.d.ts +2 -0
- package/plugins/index.js +22 -0
- package/plugins/index.js.map +1 -1
- package/storage/object.js +4 -2
- package/storage/object.js.map +1 -1
- package/types.d.ts +241 -57
- package/types.js +62 -7
- package/types.js.map +1 -1
- package/utils/converters/ConverterCollection.js +5 -2
- package/utils/converters/ConverterCollection.js.map +1 -1
- package/utils/createTypeFromFields.d.ts +15 -0
- package/utils/createTypeFromFields.js +64 -0
- package/utils/createTypeFromFields.js.map +1 -0
- package/utils/createTypeName.js +2 -1
- package/utils/createTypeName.js.map +1 -1
- package/utils/entryStorage.js +14 -11
- package/utils/entryStorage.js.map +1 -1
- package/utils/getBaseFieldType.d.ts +4 -0
- package/utils/getBaseFieldType.js +10 -0
- package/utils/getBaseFieldType.js.map +1 -0
- package/utils/getSchemaFromFieldPlugins.d.ts +4 -7
- package/utils/getSchemaFromFieldPlugins.js +22 -14
- package/utils/getSchemaFromFieldPlugins.js.map +1 -1
- package/utils/renderFields.js +2 -1
- package/utils/renderFields.js.map +1 -1
- package/utils/renderGetFilterFields.js +6 -3
- package/utils/renderGetFilterFields.js.map +1 -1
- package/utils/renderInputFields.js +2 -1
- package/utils/renderInputFields.js.map +1 -1
- package/utils/renderListFilterFields.js +4 -2
- package/utils/renderListFilterFields.js.map +1 -1
- package/utils/renderSortEnum.d.ts +7 -4
- package/utils/renderSortEnum.js +21 -4
- package/utils/renderSortEnum.js.map +1 -1
- package/validators/dynamicZone.d.ts +2 -0
- package/validators/dynamicZone.js +20 -0
- package/validators/dynamicZone.js.map +1 -0
- package/validators/index.js +2 -1
- package/validators/index.js.map +1 -1
- package/crud/contentModel/createFieldModels.d.ts +0 -2
- package/crud/contentModel/createFieldModels.js +0 -20
- package/crud/contentModel/createFieldModels.js.map +0 -1
- package/crud/contentModel/fieldIdValidation.d.ts +0 -1
- package/crud/contentModel/fieldIdValidation.js +0 -20
- package/crud/contentModel/fieldIdValidation.js.map +0 -1
- package/crud/contentModel/idValidation.d.ts +0 -1
- package/crud/contentModel/idValidation.js +0 -17
- package/crud/contentModel/idValidation.js.map +0 -1
- package/crud/contentModel/models.d.ts +0 -4
- package/crud/contentModel/models.js +0 -173
- package/crud/contentModel/models.js.map +0 -1
- package/crud/index.d.ts +0 -6
- package/crud/index.js +0 -69
- package/crud/index.js.map +0 -1
- package/graphql/schema/resolvers/manage/resolveRequestChanges.d.ts +0 -7
- package/graphql/schema/resolvers/manage/resolveRequestChanges.js +0 -21
- package/graphql/schema/resolvers/manage/resolveRequestChanges.js.map +0 -1
- package/graphql/schema/resolvers/manage/resolveRequestReview.d.ts +0 -7
- package/graphql/schema/resolvers/manage/resolveRequestReview.js +0 -21
- package/graphql/schema/resolvers/manage/resolveRequestReview.js.map +0 -1
- package/utils/filterModelFields.d.ts +0 -16
- package/utils/filterModelFields.js +0 -71
- package/utils/filterModelFields.js.map +0 -1
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.CmsModelDynamicZoneFieldConverterPlugin = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
10
|
+
var _CmsModelFieldConverterPlugin = require("../plugins/CmsModelFieldConverterPlugin");
|
|
11
|
+
class CmsModelDynamicZoneFieldConverterPlugin extends _CmsModelFieldConverterPlugin.CmsModelFieldConverterPlugin {
|
|
12
|
+
constructor(...args) {
|
|
13
|
+
super(...args);
|
|
14
|
+
(0, _defineProperty2.default)(this, "name", "cms.field.converter.dynamicZone");
|
|
15
|
+
}
|
|
16
|
+
getFieldType() {
|
|
17
|
+
return "dynamicZone";
|
|
18
|
+
}
|
|
19
|
+
getTemplates(field) {
|
|
20
|
+
var _field$settings;
|
|
21
|
+
return ((_field$settings = field.settings) === null || _field$settings === void 0 ? void 0 : _field$settings.templates) || [];
|
|
22
|
+
}
|
|
23
|
+
convertToStorage(params) {
|
|
24
|
+
const {
|
|
25
|
+
field,
|
|
26
|
+
value,
|
|
27
|
+
converterCollection
|
|
28
|
+
} = params;
|
|
29
|
+
const templates = this.getTemplates(field);
|
|
30
|
+
if (templates.length === 0) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
if (field.multipleValues) {
|
|
34
|
+
if (!Array.isArray(value)) {
|
|
35
|
+
throw new _error.default(`Dynamic zone field "${field.fieldId}" is expecting an array value.`, "DYNAMIC_ZONE_EXPECTING_ARRAY_VALUE", {
|
|
36
|
+
field,
|
|
37
|
+
value
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
[field.storageId]: value.map(item => {
|
|
42
|
+
return this.processToStorage({
|
|
43
|
+
templates,
|
|
44
|
+
converterCollection,
|
|
45
|
+
value: item
|
|
46
|
+
});
|
|
47
|
+
})
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (Array.isArray(value)) {
|
|
51
|
+
throw new _error.default(`Dynamic zone field "${field.fieldId}" is expecting a non-array value.`, "DYNAMIC_ZONE_EXPECTING_NON_ARRAY_VALUE", {
|
|
52
|
+
field,
|
|
53
|
+
value
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const processedValue = this.processToStorage({
|
|
57
|
+
templates,
|
|
58
|
+
converterCollection,
|
|
59
|
+
value
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
[field.storageId]: processedValue
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
processToStorage(params) {
|
|
66
|
+
const {
|
|
67
|
+
templates,
|
|
68
|
+
converterCollection
|
|
69
|
+
} = params;
|
|
70
|
+
let {
|
|
71
|
+
value
|
|
72
|
+
} = params;
|
|
73
|
+
if (value === null || value === undefined) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* There are two ways converter needs to work:
|
|
78
|
+
* 1. when there is a _templateId
|
|
79
|
+
* 2. when there is a key which identifies which template is the data for
|
|
80
|
+
*/
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* When we have a template key, everything is simple.
|
|
84
|
+
*/
|
|
85
|
+
const templateId = value._templateId;
|
|
86
|
+
let graphQlName = undefined;
|
|
87
|
+
let template = undefined;
|
|
88
|
+
if (templateId) {
|
|
89
|
+
template = templates.find(t => {
|
|
90
|
+
return templateId === t.id;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* When we do not have a templateId, then the template identifier is the key of the value object.
|
|
95
|
+
* But at that point, values under that key become the value we are working with later on.
|
|
96
|
+
*/
|
|
97
|
+
//
|
|
98
|
+
else {
|
|
99
|
+
const keys = Object.keys(value);
|
|
100
|
+
if (keys.length === 0) {
|
|
101
|
+
return undefined;
|
|
102
|
+
} else if (keys.length > 1) {
|
|
103
|
+
throw new _error.default("There cannot be more than one dynamic zone template in a single dynamic zone field.", "DYNAMIC_ZONE_TOO_MANY_TEMPLATES", {
|
|
104
|
+
templates: keys
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
graphQlName = keys[0];
|
|
108
|
+
template = templates.find(t => t.gqlTypeName === graphQlName);
|
|
109
|
+
}
|
|
110
|
+
if (!template) {
|
|
111
|
+
throw new _error.default("Unknown template - converting to storage.", "UNKNOWN_TEMPLATE", {
|
|
112
|
+
templateId,
|
|
113
|
+
graphQlName
|
|
114
|
+
});
|
|
115
|
+
} else if (graphQlName) {
|
|
116
|
+
value = value[graphQlName];
|
|
117
|
+
}
|
|
118
|
+
return template.fields.reduce((values, field) => {
|
|
119
|
+
const converter = converterCollection.getConverter(field.type);
|
|
120
|
+
const converted = converter.convertToStorage({
|
|
121
|
+
field,
|
|
122
|
+
value: value ? value[field.fieldId] : undefined
|
|
123
|
+
});
|
|
124
|
+
Object.assign(values, converted);
|
|
125
|
+
return values;
|
|
126
|
+
}, {
|
|
127
|
+
_templateId: template.id
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
convertFromStorage(params) {
|
|
131
|
+
const {
|
|
132
|
+
field,
|
|
133
|
+
value,
|
|
134
|
+
converterCollection
|
|
135
|
+
} = params;
|
|
136
|
+
const templates = this.getTemplates(field);
|
|
137
|
+
if (templates.length === 0) {
|
|
138
|
+
return {};
|
|
139
|
+
}
|
|
140
|
+
if (field.multipleValues) {
|
|
141
|
+
if (!Array.isArray(value)) {
|
|
142
|
+
throw new _error.default(`Dynamic zone field "${field.fieldId}" is expecting an array value.`, "DYNAMIC_ZONE_EXPECTING_ARRAY_VALUE", {
|
|
143
|
+
field,
|
|
144
|
+
value
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
[field.fieldId]: value.map(item => {
|
|
149
|
+
return this.processFromStorage({
|
|
150
|
+
templates,
|
|
151
|
+
converterCollection,
|
|
152
|
+
value: item
|
|
153
|
+
});
|
|
154
|
+
})
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (Array.isArray(value)) {
|
|
158
|
+
throw new _error.default(`Dynamic zone field "${field.fieldId}" is expecting a non-array value.`, "DYNAMIC_ZONE_EXPECTING_NON_ARRAY_VALUE", {
|
|
159
|
+
field,
|
|
160
|
+
value
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const processedValue = this.processFromStorage({
|
|
164
|
+
templates,
|
|
165
|
+
converterCollection,
|
|
166
|
+
value
|
|
167
|
+
});
|
|
168
|
+
return {
|
|
169
|
+
[field.fieldId]: processedValue
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
processFromStorage(params) {
|
|
173
|
+
const {
|
|
174
|
+
templates,
|
|
175
|
+
value,
|
|
176
|
+
converterCollection
|
|
177
|
+
} = params;
|
|
178
|
+
if (value === null || value === undefined) {
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
const {
|
|
182
|
+
_templateId
|
|
183
|
+
} = value;
|
|
184
|
+
const template = templates.find(t => t.id === _templateId);
|
|
185
|
+
if (!template) {
|
|
186
|
+
throw new _error.default("Unknown template - converting from storage.", "UNKNOWN_TEMPLATE", {
|
|
187
|
+
templateId: _templateId
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return template.fields.reduce((values, field) => {
|
|
191
|
+
const converter = converterCollection.getConverter(field.type);
|
|
192
|
+
const converted = converter.convertFromStorage({
|
|
193
|
+
field,
|
|
194
|
+
value: value[field.storageId]
|
|
195
|
+
});
|
|
196
|
+
Object.assign(values, converted);
|
|
197
|
+
return values;
|
|
198
|
+
}, {
|
|
199
|
+
_templateId: template.id
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.CmsModelDynamicZoneFieldConverterPlugin = CmsModelDynamicZoneFieldConverterPlugin;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CmsModelDynamicZoneFieldConverterPlugin","CmsModelFieldConverterPlugin","getFieldType","getTemplates","field","settings","templates","convertToStorage","params","value","converterCollection","length","multipleValues","Array","isArray","WebinyError","fieldId","storageId","map","item","processToStorage","processedValue","undefined","templateId","_templateId","graphQlName","template","find","t","id","keys","Object","gqlTypeName","fields","reduce","values","converter","getConverter","type","converted","assign","convertFromStorage","processFromStorage"],"sources":["CmsModelDynamicZoneFieldConverterPlugin.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n CmsModelFieldConverterPlugin,\n ConvertParams\n} from \"~/plugins/CmsModelFieldConverterPlugin\";\nimport { CmsDynamicZoneTemplate, CmsEntryValues, CmsModelDynamicZoneField } from \"~/types\";\nimport { ConverterCollection } from \"~/utils/converters/ConverterCollection\";\n\ninterface DynamicZoneValue {\n [key: string]: any;\n}\n\ninterface ProcessValue {\n templates: CmsDynamicZoneTemplate[];\n value: DynamicZoneValue | null;\n converterCollection: ConverterCollection;\n}\n\nexport class CmsModelDynamicZoneFieldConverterPlugin extends CmsModelFieldConverterPlugin {\n public override name = \"cms.field.converter.dynamicZone\";\n\n public override getFieldType(): string {\n return \"dynamicZone\";\n }\n\n private getTemplates(field: CmsModelDynamicZoneField): CmsDynamicZoneTemplate[] {\n return field.settings?.templates || [];\n }\n\n public override convertToStorage(\n params: ConvertParams<CmsModelDynamicZoneField>\n ): CmsEntryValues {\n const { field, value, converterCollection } = params;\n\n const templates = this.getTemplates(field);\n\n if (templates.length === 0) {\n return {};\n }\n\n if (field.multipleValues) {\n if (!Array.isArray(value)) {\n throw new WebinyError(\n `Dynamic zone field \"${field.fieldId}\" is expecting an array value.`,\n \"DYNAMIC_ZONE_EXPECTING_ARRAY_VALUE\",\n {\n field,\n value\n }\n );\n }\n return {\n [field.storageId]: value.map(item => {\n return this.processToStorage({\n templates,\n converterCollection,\n value: item\n });\n })\n };\n }\n if (Array.isArray(value)) {\n throw new WebinyError(\n `Dynamic zone field \"${field.fieldId}\" is expecting a non-array value.`,\n \"DYNAMIC_ZONE_EXPECTING_NON_ARRAY_VALUE\",\n {\n field,\n value\n }\n );\n }\n\n const processedValue = this.processToStorage({\n templates,\n converterCollection,\n value\n });\n return {\n [field.storageId]: processedValue\n };\n }\n\n private processToStorage(params: ProcessValue) {\n const { templates, converterCollection } = params;\n let { value } = params;\n if (value === null || value === undefined) {\n return undefined;\n }\n /**\n * There are two ways converter needs to work:\n * 1. when there is a _templateId\n * 2. when there is a key which identifies which template is the data for\n */\n\n /**\n * When we have a template key, everything is simple.\n */\n const templateId = value._templateId;\n let graphQlName: string | undefined = undefined;\n let template: CmsDynamicZoneTemplate | undefined = undefined;\n if (templateId) {\n template = templates.find(t => {\n return templateId === t.id;\n });\n }\n /**\n * When we do not have a templateId, then the template identifier is the key of the value object.\n * But at that point, values under that key become the value we are working with later on.\n */\n //\n else {\n const keys = Object.keys(value);\n if (keys.length === 0) {\n return undefined;\n } else if (keys.length > 1) {\n throw new WebinyError(\n \"There cannot be more than one dynamic zone template in a single dynamic zone field.\",\n \"DYNAMIC_ZONE_TOO_MANY_TEMPLATES\",\n {\n templates: keys\n }\n );\n }\n graphQlName = keys[0] as string;\n template = templates.find(t => t.gqlTypeName === graphQlName);\n }\n\n if (!template) {\n throw new WebinyError(\"Unknown template - converting to storage.\", \"UNKNOWN_TEMPLATE\", {\n templateId,\n graphQlName\n });\n } else if (graphQlName) {\n value = value[graphQlName];\n }\n\n return template.fields.reduce<Record<string, any>>(\n (values, field) => {\n const converter = converterCollection.getConverter(field.type);\n const converted = converter.convertToStorage({\n field,\n value: value ? value[field.fieldId] : undefined\n });\n Object.assign(values, converted);\n return values;\n },\n {\n _templateId: template.id\n }\n );\n }\n\n public override convertFromStorage(\n params: ConvertParams<CmsModelDynamicZoneField>\n ): CmsEntryValues {\n const { field, value, converterCollection } = params;\n\n const templates = this.getTemplates(field);\n\n if (templates.length === 0) {\n return {};\n }\n\n if (field.multipleValues) {\n if (!Array.isArray(value)) {\n throw new WebinyError(\n `Dynamic zone field \"${field.fieldId}\" is expecting an array value.`,\n \"DYNAMIC_ZONE_EXPECTING_ARRAY_VALUE\",\n {\n field,\n value\n }\n );\n }\n return {\n [field.fieldId]: value.map(item => {\n return this.processFromStorage({\n templates,\n converterCollection,\n value: item\n });\n })\n };\n }\n if (Array.isArray(value)) {\n throw new WebinyError(\n `Dynamic zone field \"${field.fieldId}\" is expecting a non-array value.`,\n \"DYNAMIC_ZONE_EXPECTING_NON_ARRAY_VALUE\",\n {\n field,\n value\n }\n );\n }\n\n const processedValue = this.processFromStorage({\n templates,\n converterCollection,\n value\n });\n return {\n [field.fieldId]: processedValue\n };\n }\n\n private processFromStorage(params: ProcessValue) {\n const { templates, value, converterCollection } = params;\n if (value === null || value === undefined) {\n return undefined;\n }\n\n const { _templateId } = value;\n\n const template = templates.find(t => t.id === _templateId);\n if (!template) {\n throw new WebinyError(\n \"Unknown template - converting from storage.\",\n \"UNKNOWN_TEMPLATE\",\n {\n templateId: _templateId\n }\n );\n }\n\n return template.fields.reduce<Record<string, any>>(\n (values, field) => {\n const converter = converterCollection.getConverter(field.type);\n const converted = converter.convertFromStorage({\n field,\n value: value[field.storageId]\n });\n Object.assign(values, converted);\n return values;\n },\n {\n _templateId: template.id\n }\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { CmsModelObjectFieldConverterPlugin } from "./CmsModelObjectFieldConverterPlugin";
|
|
2
2
|
import { CmsModelDefaultFieldConverterPlugin } from "./CmsModelDefaultFieldConverterPlugin";
|
|
3
|
-
|
|
3
|
+
import { CmsModelDynamicZoneFieldConverterPlugin } from "./CmsModelDynamicZoneFieldConverterPlugin";
|
|
4
|
+
export declare const createFieldConverters: () => (CmsModelObjectFieldConverterPlugin | CmsModelDefaultFieldConverterPlugin | CmsModelDynamicZoneFieldConverterPlugin)[];
|
package/fieldConverters/index.js
CHANGED
|
@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.createFieldConverters = void 0;
|
|
7
7
|
var _CmsModelObjectFieldConverterPlugin = require("./CmsModelObjectFieldConverterPlugin");
|
|
8
8
|
var _CmsModelDefaultFieldConverterPlugin = require("./CmsModelDefaultFieldConverterPlugin");
|
|
9
|
+
var _CmsModelDynamicZoneFieldConverterPlugin = require("./CmsModelDynamicZoneFieldConverterPlugin");
|
|
9
10
|
const createFieldConverters = () => {
|
|
10
|
-
return [new _CmsModelObjectFieldConverterPlugin.CmsModelObjectFieldConverterPlugin(), new _CmsModelDefaultFieldConverterPlugin.CmsModelDefaultFieldConverterPlugin()];
|
|
11
|
+
return [new _CmsModelObjectFieldConverterPlugin.CmsModelObjectFieldConverterPlugin(), new _CmsModelDynamicZoneFieldConverterPlugin.CmsModelDynamicZoneFieldConverterPlugin(), new _CmsModelDefaultFieldConverterPlugin.CmsModelDefaultFieldConverterPlugin()];
|
|
11
12
|
};
|
|
12
13
|
exports.createFieldConverters = createFieldConverters;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createFieldConverters","CmsModelObjectFieldConverterPlugin","CmsModelDefaultFieldConverterPlugin"],"sources":["index.ts"],"sourcesContent":["import { CmsModelObjectFieldConverterPlugin } from \"~/fieldConverters/CmsModelObjectFieldConverterPlugin\";\nimport { CmsModelDefaultFieldConverterPlugin } from \"~/fieldConverters/CmsModelDefaultFieldConverterPlugin\";\n\nexport const createFieldConverters = () => {\n return [new CmsModelObjectFieldConverterPlugin()
|
|
1
|
+
{"version":3,"names":["createFieldConverters","CmsModelObjectFieldConverterPlugin","CmsModelDynamicZoneFieldConverterPlugin","CmsModelDefaultFieldConverterPlugin"],"sources":["index.ts"],"sourcesContent":["import { CmsModelObjectFieldConverterPlugin } from \"~/fieldConverters/CmsModelObjectFieldConverterPlugin\";\nimport { CmsModelDefaultFieldConverterPlugin } from \"~/fieldConverters/CmsModelDefaultFieldConverterPlugin\";\nimport { CmsModelDynamicZoneFieldConverterPlugin } from \"~/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin\";\n\nexport const createFieldConverters = () => {\n return [\n new CmsModelObjectFieldConverterPlugin(),\n new CmsModelDynamicZoneFieldConverterPlugin(),\n new CmsModelDefaultFieldConverterPlugin()\n ];\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AAEO,MAAMA,qBAAqB,GAAG,MAAM;EACvC,OAAO,CACH,IAAIC,sEAAkC,EAAE,EACxC,IAAIC,gFAAuC,EAAE,EAC7C,IAAIC,wEAAmC,EAAE,CAC5C;AACL,CAAC;AAAC"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { CmsContext, CmsModel } from "../types";
|
|
2
|
+
import { CmsGraphQLSchemaPlugin } from "../plugins";
|
|
3
3
|
/**
|
|
4
4
|
* This factory is called whenever we need to generate graphql-schema plugins using the current context.
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
interface BuildSchemaPluginsParams {
|
|
7
|
+
context: CmsContext;
|
|
8
|
+
models: CmsModel[];
|
|
9
|
+
}
|
|
10
|
+
export declare const buildSchemaPlugins: (params: BuildSchemaPluginsParams) => Promise<CmsGraphQLSchemaPlugin[]>;
|
|
11
|
+
export {};
|
|
@@ -9,15 +9,11 @@ var _contentEntries = require("./schema/contentEntries");
|
|
|
9
9
|
var _contentModelGroups = require("./schema/contentModelGroups");
|
|
10
10
|
var _baseContentSchema = require("./schema/baseContentSchema");
|
|
11
11
|
var _schemaPlugins = require("./schema/schemaPlugins");
|
|
12
|
-
|
|
13
|
-
* This factory is called whenever we need to generate graphql-schema plugins using the current context.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
const buildSchemaPlugins = async context => {
|
|
12
|
+
const buildSchemaPlugins = async params => {
|
|
17
13
|
return [
|
|
18
14
|
// Base GQL types and scalars
|
|
19
|
-
(0, _baseContentSchema.createBaseContentSchema)(
|
|
15
|
+
(0, _baseContentSchema.createBaseContentSchema)(params), (0, _contentModels.createModelsSchema)(params), (0, _contentEntries.createContentEntriesSchema)(params), (0, _contentModelGroups.createGroupsSchema)(params),
|
|
20
16
|
// Dynamic schema
|
|
21
|
-
...(await (0, _schemaPlugins.generateSchemaPlugins)(
|
|
17
|
+
...(await (0, _schemaPlugins.generateSchemaPlugins)(params))].filter(Boolean);
|
|
22
18
|
};
|
|
23
19
|
exports.buildSchemaPlugins = buildSchemaPlugins;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["buildSchemaPlugins","
|
|
1
|
+
{"version":3,"names":["buildSchemaPlugins","params","createBaseContentSchema","createModelsSchema","createContentEntriesSchema","createGroupsSchema","generateSchemaPlugins","filter","Boolean"],"sources":["buildSchemaPlugins.ts"],"sourcesContent":["import { CmsContext, CmsModel } from \"~/types\";\nimport { createModelsSchema } from \"./schema/contentModels\";\nimport { createContentEntriesSchema } from \"./schema/contentEntries\";\nimport { createGroupsSchema } from \"./schema/contentModelGroups\";\nimport { createBaseContentSchema } from \"./schema/baseContentSchema\";\nimport { generateSchemaPlugins } from \"./schema/schemaPlugins\";\nimport { CmsGraphQLSchemaPlugin } from \"~/plugins\";\n\n/**\n * This factory is called whenever we need to generate graphql-schema plugins using the current context.\n */\ninterface BuildSchemaPluginsParams {\n context: CmsContext;\n models: CmsModel[];\n}\nexport const buildSchemaPlugins = async (\n params: BuildSchemaPluginsParams\n): Promise<CmsGraphQLSchemaPlugin[]> => {\n return [\n // Base GQL types and scalars\n createBaseContentSchema(params),\n createModelsSchema(params),\n createContentEntriesSchema(params),\n createGroupsSchema(params),\n // Dynamic schema\n ...(await generateSchemaPlugins(params))\n ].filter(Boolean);\n};\n"],"mappings":";;;;;;AACA;AACA;AACA;AACA;AACA;AAUO,MAAMA,kBAAkB,GAAG,MAC9BC,MAAgC,IACI;EACpC,OAAO;EACH;EACA,IAAAC,0CAAuB,EAACD,MAAM,CAAC,EAC/B,IAAAE,iCAAkB,EAACF,MAAM,CAAC,EAC1B,IAAAG,0CAA0B,EAACH,MAAM,CAAC,EAClC,IAAAI,sCAAkB,EAACJ,MAAM,CAAC;EAC1B;EACA,IAAI,MAAM,IAAAK,oCAAqB,EAACL,MAAM,CAAC,CAAC,CAC3C,CAACM,MAAM,CAACC,OAAO,CAAC;AACrB,CAAC;AAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { GraphQLSchemaPlugin } from "@webiny/handler-graphql";
|
|
2
|
+
import { CmsContext } from "../types";
|
|
3
|
+
interface Params {
|
|
4
|
+
plugins: GraphQLSchemaPlugin<CmsContext>[];
|
|
5
|
+
}
|
|
6
|
+
export declare const createExecutableSchema: (params: Params) => import("graphql").GraphQLSchema;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createExecutableSchema = void 0;
|
|
7
|
+
var _schema = require("@graphql-tools/schema");
|
|
8
|
+
const createExecutableSchema = params => {
|
|
9
|
+
const {
|
|
10
|
+
plugins
|
|
11
|
+
} = params;
|
|
12
|
+
/**
|
|
13
|
+
* Really hard to type this to satisfy the makeExecutableSchema
|
|
14
|
+
*/
|
|
15
|
+
// TODO @ts-refactor
|
|
16
|
+
const typeDefs = [];
|
|
17
|
+
const resolvers = [];
|
|
18
|
+
|
|
19
|
+
// Get schema definitions from plugins
|
|
20
|
+
for (const plugin of plugins) {
|
|
21
|
+
typeDefs.push(plugin.schema.typeDefs);
|
|
22
|
+
resolvers.push(plugin.schema.resolvers);
|
|
23
|
+
}
|
|
24
|
+
return (0, _schema.makeExecutableSchema)({
|
|
25
|
+
typeDefs,
|
|
26
|
+
resolvers
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
exports.createExecutableSchema = createExecutableSchema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createExecutableSchema","params","plugins","typeDefs","resolvers","plugin","push","schema","makeExecutableSchema"],"sources":["createExecutableSchema.ts"],"sourcesContent":["import { makeExecutableSchema } from \"@graphql-tools/schema\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { CmsContext } from \"~/types\";\n\ninterface Params {\n plugins: GraphQLSchemaPlugin<CmsContext>[];\n}\nexport const createExecutableSchema = (params: Params) => {\n const { plugins } = params;\n /**\n * Really hard to type this to satisfy the makeExecutableSchema\n */\n // TODO @ts-refactor\n const typeDefs: any = [];\n const resolvers: any = [];\n\n // Get schema definitions from plugins\n for (const plugin of plugins) {\n typeDefs.push(plugin.schema.typeDefs);\n resolvers.push(plugin.schema.resolvers);\n }\n\n return makeExecutableSchema({\n typeDefs,\n resolvers\n });\n};\n"],"mappings":";;;;;;AAAA;AAOO,MAAMA,sBAAsB,GAAIC,MAAc,IAAK;EACtD,MAAM;IAAEC;EAAQ,CAAC,GAAGD,MAAM;EAC1B;AACJ;AACA;EACI;EACA,MAAME,QAAa,GAAG,EAAE;EACxB,MAAMC,SAAc,GAAG,EAAE;;EAEzB;EACA,KAAK,MAAMC,MAAM,IAAIH,OAAO,EAAE;IAC1BC,QAAQ,CAACG,IAAI,CAACD,MAAM,CAACE,MAAM,CAACJ,QAAQ,CAAC;IACrCC,SAAS,CAACE,IAAI,CAACD,MAAM,CAACE,MAAM,CAACH,SAAS,CAAC;EAC3C;EAEA,OAAO,IAAAI,4BAAoB,EAAC;IACxBL,QAAQ;IACRC;EACJ,CAAC,CAAC;AACN,CAAC;AAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CmsContext, CmsModel } from "../types";
|
|
2
|
+
import { GraphQLSchema } from "graphql/type";
|
|
3
|
+
interface GenerateSchemaParams {
|
|
4
|
+
context: CmsContext;
|
|
5
|
+
models: CmsModel[];
|
|
6
|
+
}
|
|
7
|
+
export declare const generateSchema: (params: GenerateSchemaParams) => Promise<GraphQLSchema>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.generateSchema = void 0;
|
|
7
|
+
var _buildSchemaPlugins = require("./buildSchemaPlugins");
|
|
8
|
+
var _createExecutableSchema = require("./createExecutableSchema");
|
|
9
|
+
var _plugins = require("../plugins");
|
|
10
|
+
const generateSchema = async params => {
|
|
11
|
+
const {
|
|
12
|
+
context,
|
|
13
|
+
models
|
|
14
|
+
} = params;
|
|
15
|
+
let generatedSchemaPlugins = [];
|
|
16
|
+
try {
|
|
17
|
+
generatedSchemaPlugins = await (0, _buildSchemaPlugins.buildSchemaPlugins)({
|
|
18
|
+
context,
|
|
19
|
+
models
|
|
20
|
+
});
|
|
21
|
+
} catch (ex) {
|
|
22
|
+
console.log(`Error while building schema plugins.`);
|
|
23
|
+
throw ex;
|
|
24
|
+
}
|
|
25
|
+
context.plugins.register(generatedSchemaPlugins);
|
|
26
|
+
const schemaPlugins = context.plugins.byType(_plugins.CmsGraphQLSchemaPlugin.type);
|
|
27
|
+
return (0, _createExecutableSchema.createExecutableSchema)({
|
|
28
|
+
plugins: schemaPlugins
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
exports.generateSchema = generateSchema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["generateSchema","params","context","models","generatedSchemaPlugins","buildSchemaPlugins","ex","console","log","plugins","register","schemaPlugins","byType","CmsGraphQLSchemaPlugin","type","createExecutableSchema"],"sources":["generateSchema.ts"],"sourcesContent":["import { CmsContext, CmsModel } from \"~/types\";\nimport { buildSchemaPlugins } from \"~/graphql/buildSchemaPlugins\";\nimport { createExecutableSchema } from \"~/graphql/createExecutableSchema\";\nimport { GraphQLSchema } from \"graphql/type\";\nimport { CmsGraphQLSchemaPlugin } from \"~/plugins\";\n\ninterface GenerateSchemaParams {\n context: CmsContext;\n models: CmsModel[];\n}\nexport const generateSchema = async (params: GenerateSchemaParams): Promise<GraphQLSchema> => {\n const { context, models } = params;\n\n let generatedSchemaPlugins: CmsGraphQLSchemaPlugin[] = [];\n try {\n generatedSchemaPlugins = await buildSchemaPlugins({ context, models });\n } catch (ex) {\n console.log(`Error while building schema plugins.`);\n throw ex;\n }\n\n context.plugins.register(generatedSchemaPlugins);\n\n const schemaPlugins = context.plugins.byType<CmsGraphQLSchemaPlugin>(\n CmsGraphQLSchemaPlugin.type\n );\n return createExecutableSchema({\n plugins: schemaPlugins\n });\n};\n"],"mappings":";;;;;;AACA;AACA;AAEA;AAMO,MAAMA,cAAc,GAAG,MAAOC,MAA4B,IAA6B;EAC1F,MAAM;IAAEC,OAAO;IAAEC;EAAO,CAAC,GAAGF,MAAM;EAElC,IAAIG,sBAAgD,GAAG,EAAE;EACzD,IAAI;IACAA,sBAAsB,GAAG,MAAM,IAAAC,sCAAkB,EAAC;MAAEH,OAAO;MAAEC;IAAO,CAAC,CAAC;EAC1E,CAAC,CAAC,OAAOG,EAAE,EAAE;IACTC,OAAO,CAACC,GAAG,CAAE,sCAAqC,CAAC;IACnD,MAAMF,EAAE;EACZ;EAEAJ,OAAO,CAACO,OAAO,CAACC,QAAQ,CAACN,sBAAsB,CAAC;EAEhD,MAAMO,aAAa,GAAGT,OAAO,CAACO,OAAO,CAACG,MAAM,CACxCC,+BAAsB,CAACC,IAAI,CAC9B;EACD,OAAO,IAAAC,8CAAsB,EAAC;IAC1BN,OAAO,EAAEE;EACb,CAAC,CAAC;AACN,CAAC;AAAC"}
|
|
@@ -5,13 +5,23 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.graphQLHandlerFactory = void 0;
|
|
8
|
-
var
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
9
|
var _apiSecurity = require("@webiny/api-security");
|
|
10
10
|
var _debugPlugins = _interopRequireDefault(require("@webiny/handler-graphql/debugPlugins"));
|
|
11
11
|
var _processRequestBody = _interopRequireDefault(require("@webiny/handler-graphql/processRequestBody"));
|
|
12
|
-
var _buildSchemaPlugins = require("./buildSchemaPlugins");
|
|
13
|
-
var _plugins = require("@webiny/handler-graphql/plugins");
|
|
14
12
|
var _handler = require("@webiny/handler");
|
|
13
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
14
|
+
var _codeFrame = _interopRequireDefault(require("code-frame"));
|
|
15
|
+
var _generateSchema = require("./generateSchema");
|
|
16
|
+
// @ts-ignore `code-frame` has no types
|
|
17
|
+
|
|
18
|
+
const createRequestBody = body => {
|
|
19
|
+
/**
|
|
20
|
+
* We are trusting that the body payload is correct.
|
|
21
|
+
* The `processRequestBody` will fail if it is not.
|
|
22
|
+
*/
|
|
23
|
+
return typeof body === "string" ? JSON.parse(body) : body;
|
|
24
|
+
};
|
|
15
25
|
const schemaList = new Map();
|
|
16
26
|
const generateCacheKey = async args => {
|
|
17
27
|
const {
|
|
@@ -22,29 +32,6 @@ const generateCacheKey = async args => {
|
|
|
22
32
|
const lastModelChange = await context.cms.getModelLastChange();
|
|
23
33
|
return [locale.code, type, lastModelChange.toISOString()].join("#");
|
|
24
34
|
};
|
|
25
|
-
const generateSchema = async args => {
|
|
26
|
-
const {
|
|
27
|
-
context
|
|
28
|
-
} = args;
|
|
29
|
-
context.plugins.register(await (0, _buildSchemaPlugins.buildSchemaPlugins)(context));
|
|
30
|
-
/**
|
|
31
|
-
* Really hard to type this to satisfy the makeExecutableSchema
|
|
32
|
-
*/
|
|
33
|
-
// TODO @ts-refactor
|
|
34
|
-
const typeDefs = [];
|
|
35
|
-
const resolvers = [];
|
|
36
|
-
|
|
37
|
-
// Get schema definitions from plugins
|
|
38
|
-
const schemaPlugins = context.plugins.byType(_plugins.GraphQLSchemaPlugin.type);
|
|
39
|
-
for (const pl of schemaPlugins) {
|
|
40
|
-
typeDefs.push(pl.schema.typeDefs);
|
|
41
|
-
resolvers.push(pl.schema.resolvers);
|
|
42
|
-
}
|
|
43
|
-
return (0, _schema.makeExecutableSchema)({
|
|
44
|
-
typeDefs,
|
|
45
|
-
resolvers
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
35
|
|
|
49
36
|
/**
|
|
50
37
|
* Gets an existing schema or rewrites existing one or creates a completely new one
|
|
@@ -59,27 +46,44 @@ const getSchema = async params => {
|
|
|
59
46
|
const tenantId = context.tenancy.getCurrentTenant().id;
|
|
60
47
|
const id = `${tenantId}#${type}#${locale.code}`;
|
|
61
48
|
const cacheKey = await generateCacheKey(params);
|
|
62
|
-
|
|
63
|
-
|
|
49
|
+
const cachedSchema = schemaList.get(id);
|
|
50
|
+
if ((cachedSchema === null || cachedSchema === void 0 ? void 0 : cachedSchema.key) === cacheKey) {
|
|
51
|
+
return cachedSchema.schema;
|
|
52
|
+
}
|
|
53
|
+
// Load model data
|
|
54
|
+
context.security.disableAuthorization();
|
|
55
|
+
const models = (await context.cms.listModels()).filter(model => model.isPrivate !== true);
|
|
56
|
+
context.security.enableAuthorization();
|
|
57
|
+
try {
|
|
58
|
+
const schema = await (0, _generateSchema.generateSchema)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
59
|
+
models
|
|
60
|
+
}));
|
|
64
61
|
schemaList.set(id, {
|
|
65
62
|
key: cacheKey,
|
|
66
63
|
schema
|
|
67
64
|
});
|
|
68
65
|
return schema;
|
|
66
|
+
} catch (err) {
|
|
67
|
+
if (!Array.isArray(err.locations)) {
|
|
68
|
+
throw new _error.default({
|
|
69
|
+
message: err.message,
|
|
70
|
+
code: err.code || "INVALID_GRAPHQL_SCHEMA_LOCATIONS",
|
|
71
|
+
data: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, err.data || {}), {}, {
|
|
72
|
+
locations: err.locations
|
|
73
|
+
})
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const [location] = err.locations;
|
|
77
|
+
throw new _error.default({
|
|
78
|
+
code: "INVALID_GRAPHQL_SCHEMA",
|
|
79
|
+
message: err.message,
|
|
80
|
+
data: {
|
|
81
|
+
invalidSegment: (0, _codeFrame.default)(err.source.body, location.line, location.column, {
|
|
82
|
+
frameSize: 15
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
});
|
|
69
86
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Safe to cast because check was done few lines up.
|
|
72
|
-
*/
|
|
73
|
-
const cache = schemaList.get(id);
|
|
74
|
-
if (cache.key === cacheKey) {
|
|
75
|
-
return cache.schema;
|
|
76
|
-
}
|
|
77
|
-
const schema = await generateSchema(params);
|
|
78
|
-
schemaList.set(id, {
|
|
79
|
-
key: cacheKey,
|
|
80
|
-
schema
|
|
81
|
-
});
|
|
82
|
-
return schema;
|
|
83
87
|
};
|
|
84
88
|
const checkEndpointAccess = async context => {
|
|
85
89
|
const permission = await context.security.getPermission(`cms.endpoint.${context.cms.type}`);
|
|
@@ -91,6 +95,22 @@ const checkEndpointAccess = async context => {
|
|
|
91
95
|
});
|
|
92
96
|
}
|
|
93
97
|
};
|
|
98
|
+
const formatErrorPayload = error => {
|
|
99
|
+
if (error instanceof _error.default) {
|
|
100
|
+
return JSON.stringify({
|
|
101
|
+
type: "CmsGraphQLWebinyError",
|
|
102
|
+
message: error.message,
|
|
103
|
+
code: error.code,
|
|
104
|
+
data: error.data
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return JSON.stringify({
|
|
108
|
+
type: "Error",
|
|
109
|
+
name: error.name,
|
|
110
|
+
message: error.message,
|
|
111
|
+
stack: error.stack
|
|
112
|
+
});
|
|
113
|
+
};
|
|
94
114
|
const cmsRoutes = new _handler.RoutePlugin(({
|
|
95
115
|
onPost,
|
|
96
116
|
onOptions,
|
|
@@ -110,19 +130,40 @@ const cmsRoutes = new _handler.RoutePlugin(({
|
|
|
110
130
|
}
|
|
111
131
|
});
|
|
112
132
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
133
|
+
let schema;
|
|
134
|
+
try {
|
|
135
|
+
schema = await getSchema({
|
|
136
|
+
context,
|
|
137
|
+
locale: context.cms.getLocale(),
|
|
138
|
+
type: context.cms.type
|
|
139
|
+
});
|
|
140
|
+
} catch (ex) {
|
|
141
|
+
console.log(`Error while generating the schema.`);
|
|
142
|
+
console.log(formatErrorPayload(ex));
|
|
143
|
+
throw ex;
|
|
144
|
+
}
|
|
145
|
+
let body = [];
|
|
146
|
+
try {
|
|
147
|
+
body = createRequestBody(request.body);
|
|
148
|
+
} catch (ex) {
|
|
149
|
+
console.log(`Error while creating the body request.`);
|
|
150
|
+
console.log(formatErrorPayload(ex));
|
|
151
|
+
throw ex;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const result = await (0, _processRequestBody.default)(body, schema, context);
|
|
155
|
+
return reply.code(200).send(result);
|
|
156
|
+
} catch (ex) {
|
|
157
|
+
console.log(`Error while processing the body request.`);
|
|
158
|
+
console.log(formatErrorPayload(ex));
|
|
159
|
+
throw ex;
|
|
160
|
+
}
|
|
121
161
|
});
|
|
122
162
|
onOptions("/cms/:type(^manage|preview|read$)/:locale", async (_, reply) => {
|
|
123
|
-
return reply.
|
|
163
|
+
return reply.status(204).send({}).hijack();
|
|
124
164
|
});
|
|
125
165
|
});
|
|
166
|
+
cmsRoutes.name = "headless-cms.graphql.route.default";
|
|
126
167
|
const graphQLHandlerFactory = ({
|
|
127
168
|
debug
|
|
128
169
|
}) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["schemaList","Map","generateCacheKey","args","context","locale","type","lastModelChange","cms","getModelLastChange","code","toISOString","join","generateSchema","plugins","register","buildSchemaPlugins","typeDefs","resolvers","schemaPlugins","byType","GraphQLSchemaPlugin","pl","push","schema","makeExecutableSchema","getSchema","params","tenantId","tenancy","getCurrentTenant","id","cacheKey","has","set","key","cache","get","checkEndpointAccess","permission","security","getPermission","NotAuthorizedError","data","reason","cmsRoutes","RoutePlugin","onPost","onOptions","request","reply","ex","send","error","message","stack","getLocale","body","result","processRequestBody","_","hijack","graphQLHandlerFactory","debug","debugPlugins"],"sources":["graphQLHandlerFactory.ts"],"sourcesContent":["import { GraphQLSchema } from \"graphql\";\nimport { makeExecutableSchema } from \"@graphql-tools/schema\";\nimport { ApiEndpoint, CmsContext } from \"~/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport { PluginCollection } from \"@webiny/plugins/types\";\nimport debugPlugins from \"@webiny/handler-graphql/debugPlugins\";\nimport processRequestBody from \"@webiny/handler-graphql/processRequestBody\";\nimport { buildSchemaPlugins } from \"./buildSchemaPlugins\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/plugins\";\nimport { GraphQLRequestBody } from \"@webiny/handler-graphql/types\";\nimport { RoutePlugin } from \"@webiny/handler\";\n\ninterface SchemaCache {\n key: string;\n schema: GraphQLSchema;\n}\ninterface GetSchemaParams {\n context: CmsContext;\n type: ApiEndpoint;\n locale: I18NLocale;\n}\n\nconst schemaList = new Map<string, SchemaCache>();\n\nconst generateCacheKey = async (args: GetSchemaParams): Promise<string> => {\n const { context, locale, type } = args;\n const lastModelChange = await context.cms.getModelLastChange();\n return [locale.code, type, lastModelChange.toISOString()].join(\"#\");\n};\n\nconst generateSchema = async (args: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context } = args;\n\n context.plugins.register(await buildSchemaPlugins(context));\n /**\n * Really hard to type this to satisfy the makeExecutableSchema\n */\n // TODO @ts-refactor\n const typeDefs: any = [];\n const resolvers: any = [];\n\n // Get schema definitions from plugins\n const schemaPlugins = context.plugins.byType<GraphQLSchemaPlugin>(GraphQLSchemaPlugin.type);\n for (const pl of schemaPlugins) {\n typeDefs.push(pl.schema.typeDefs);\n resolvers.push(pl.schema.resolvers);\n }\n\n return makeExecutableSchema({\n typeDefs,\n resolvers\n });\n};\n\n/**\n * Gets an existing schema or rewrites existing one or creates a completely new one\n * depending on the schemaId created from type and locale parameters\n */\nconst getSchema = async (params: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context, type, locale } = params;\n const tenantId = context.tenancy.getCurrentTenant().id;\n const id = `${tenantId}#${type}#${locale.code}`;\n\n const cacheKey = await generateCacheKey(params);\n if (!schemaList.has(id)) {\n const schema = await generateSchema(params);\n\n schemaList.set(id, {\n key: cacheKey,\n schema\n });\n return schema;\n }\n /**\n * Safe to cast because check was done few lines up.\n */\n const cache = schemaList.get(id) as SchemaCache;\n if (cache.key === cacheKey) {\n return cache.schema;\n }\n const schema = await generateSchema(params);\n schemaList.set(id, {\n key: cacheKey,\n schema\n });\n return schema;\n};\n\nconst checkEndpointAccess = async (context: CmsContext): Promise<void> => {\n const permission = await context.security.getPermission(`cms.endpoint.${context.cms.type}`);\n if (!permission) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access \"${context.cms.type}\" endpoint.`\n }\n });\n }\n};\n\nexport interface GraphQLHandlerFactoryParams {\n debug?: boolean;\n}\n\nconst cmsRoutes = new RoutePlugin<CmsContext>(({ onPost, onOptions, context }) => {\n onPost(\"/cms/:type(^manage|preview|read$)/:locale\", async (request, reply) => {\n try {\n await checkEndpointAccess(context);\n } catch (ex) {\n return reply.code(401).send({\n data: null,\n error: {\n message: ex.message || \"Not authorized!\",\n code: ex.code || \"SECURITY_NOT_AUTHORIZED\",\n data: ex.data || null,\n stack: null\n }\n });\n }\n\n const schema = await getSchema({\n context,\n locale: context.cms.getLocale(),\n type: context.cms.type as ApiEndpoint\n });\n const body: GraphQLRequestBody | GraphQLRequestBody[] = request.body as any;\n const result = await processRequestBody(body, schema, context);\n return reply.code(200).send(result);\n });\n\n onOptions(\"/cms/:type(^manage|preview|read$)/:locale\", async (_, reply) => {\n return reply.hijack().send({});\n });\n});\n\nexport const graphQLHandlerFactory = ({ debug }: GraphQLHandlerFactoryParams): PluginCollection => {\n return [\n ...(debug ? debugPlugins() : []),\n cmsRoutes,\n {\n type: \"wcp-telemetry-tracker\"\n }\n ];\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["createRequestBody","body","JSON","parse","schemaList","Map","generateCacheKey","args","context","locale","type","lastModelChange","cms","getModelLastChange","code","toISOString","join","getSchema","params","tenantId","tenancy","getCurrentTenant","id","cacheKey","cachedSchema","get","key","schema","security","disableAuthorization","models","listModels","filter","model","isPrivate","enableAuthorization","generateSchema","set","err","Array","isArray","locations","WebinyError","message","data","location","invalidSegment","codeFrame","source","line","column","frameSize","checkEndpointAccess","permission","getPermission","NotAuthorizedError","reason","formatErrorPayload","error","stringify","name","stack","cmsRoutes","RoutePlugin","onPost","onOptions","request","reply","ex","send","getLocale","console","log","result","processRequestBody","_","status","hijack","graphQLHandlerFactory","debug","debugPlugins"],"sources":["graphQLHandlerFactory.ts"],"sourcesContent":["import { GraphQLSchema } from \"graphql\";\nimport { ApiEndpoint, CmsContext } from \"~/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport { PluginCollection } from \"@webiny/plugins/types\";\nimport debugPlugins from \"@webiny/handler-graphql/debugPlugins\";\nimport processRequestBody from \"@webiny/handler-graphql/processRequestBody\";\nimport { GraphQLRequestBody } from \"@webiny/handler-graphql/types\";\nimport { RoutePlugin } from \"@webiny/handler\";\nimport WebinyError from \"@webiny/error\";\n// @ts-ignore `code-frame` has no types\nimport codeFrame from \"code-frame\";\nimport { generateSchema } from \"~/graphql/generateSchema\";\n\ninterface SchemaCache {\n key: string;\n schema: GraphQLSchema;\n}\ninterface GetSchemaParams {\n context: CmsContext;\n type: ApiEndpoint;\n locale: I18NLocale;\n}\n\nconst createRequestBody = (body: unknown): GraphQLRequestBody | GraphQLRequestBody[] => {\n /**\n * We are trusting that the body payload is correct.\n * The `processRequestBody` will fail if it is not.\n */\n return typeof body === \"string\" ? JSON.parse(body) : body;\n};\n\nconst schemaList = new Map<string, SchemaCache>();\n\nconst generateCacheKey = async (args: GetSchemaParams): Promise<string> => {\n const { context, locale, type } = args;\n const lastModelChange = await context.cms.getModelLastChange();\n return [locale.code, type, lastModelChange.toISOString()].join(\"#\");\n};\n\n/**\n * Gets an existing schema or rewrites existing one or creates a completely new one\n * depending on the schemaId created from type and locale parameters\n */\nconst getSchema = async (params: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context, type, locale } = params;\n const tenantId = context.tenancy.getCurrentTenant().id;\n const id = `${tenantId}#${type}#${locale.code}`;\n\n const cacheKey = await generateCacheKey(params);\n const cachedSchema = schemaList.get(id);\n if (cachedSchema?.key === cacheKey) {\n return cachedSchema.schema;\n }\n // Load model data\n context.security.disableAuthorization();\n const models = (await context.cms.listModels()).filter(model => model.isPrivate !== true);\n context.security.enableAuthorization();\n try {\n const schema = await generateSchema({\n ...params,\n models\n });\n schemaList.set(id, {\n key: cacheKey,\n schema\n });\n return schema;\n } catch (err) {\n if (!Array.isArray(err.locations)) {\n throw new WebinyError({\n message: err.message,\n code: err.code || \"INVALID_GRAPHQL_SCHEMA_LOCATIONS\",\n data: {\n ...(err.data || {}),\n locations: err.locations\n }\n });\n }\n const [location] = err.locations;\n\n throw new WebinyError({\n code: \"INVALID_GRAPHQL_SCHEMA\",\n message: err.message,\n data: {\n invalidSegment: codeFrame(err.source.body, location.line, location.column, {\n frameSize: 15\n })\n }\n });\n }\n};\n\nconst checkEndpointAccess = async (context: CmsContext): Promise<void> => {\n const permission = await context.security.getPermission(`cms.endpoint.${context.cms.type}`);\n if (!permission) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access \"${context.cms.type}\" endpoint.`\n }\n });\n }\n};\n\nconst formatErrorPayload = (error: Error): string => {\n if (error instanceof WebinyError) {\n return JSON.stringify({\n type: \"CmsGraphQLWebinyError\",\n message: error.message,\n code: error.code,\n data: error.data\n });\n }\n\n return JSON.stringify({\n type: \"Error\",\n name: error.name,\n message: error.message,\n stack: error.stack\n });\n};\n\nexport interface GraphQLHandlerFactoryParams {\n debug?: boolean;\n}\n\nconst cmsRoutes = new RoutePlugin<CmsContext>(({ onPost, onOptions, context }) => {\n onPost(\"/cms/:type(^manage|preview|read$)/:locale\", async (request, reply) => {\n try {\n await checkEndpointAccess(context);\n } catch (ex) {\n return reply.code(401).send({\n data: null,\n error: {\n message: ex.message || \"Not authorized!\",\n code: ex.code || \"SECURITY_NOT_AUTHORIZED\",\n data: ex.data || null,\n stack: null\n }\n });\n }\n\n let schema: GraphQLSchema;\n try {\n schema = await getSchema({\n context,\n locale: context.cms.getLocale(),\n type: context.cms.type as ApiEndpoint\n });\n } catch (ex) {\n console.log(`Error while generating the schema.`);\n console.log(formatErrorPayload(ex));\n throw ex;\n }\n\n let body: GraphQLRequestBody | GraphQLRequestBody[] = [];\n try {\n body = createRequestBody(request.body);\n } catch (ex) {\n console.log(`Error while creating the body request.`);\n console.log(formatErrorPayload(ex));\n throw ex;\n }\n\n try {\n const result = await processRequestBody(body, schema, context);\n return reply.code(200).send(result);\n } catch (ex) {\n console.log(`Error while processing the body request.`);\n console.log(formatErrorPayload(ex));\n throw ex;\n }\n });\n\n onOptions(\"/cms/:type(^manage|preview|read$)/:locale\", async (_, reply) => {\n return reply.status(204).send({}).hijack();\n });\n});\n\ncmsRoutes.name = \"headless-cms.graphql.route.default\";\n\nexport const graphQLHandlerFactory = ({ debug }: GraphQLHandlerFactoryParams): PluginCollection => {\n return [\n ...(debug ? debugPlugins() : []),\n cmsRoutes,\n {\n type: \"wcp-telemetry-tracker\"\n }\n ];\n};\n"],"mappings":"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"}
|
package/graphql/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { GraphQLSchemaPlugin } from "@webiny/handler-graphql/types";
|
|
2
1
|
import { GraphQLHandlerFactoryParams } from "./graphQLHandlerFactory";
|
|
3
|
-
import { CmsContext } from "../types";
|
|
4
2
|
export declare type CreateGraphQLParams = GraphQLHandlerFactoryParams;
|
|
5
|
-
export declare const createGraphQL: (params: CreateGraphQLParams) => (import("@webiny/
|
|
3
|
+
export declare const createGraphQL: (params: CreateGraphQLParams) => (import("@webiny/plugins/types").PluginCollection | import("@webiny/handler-graphql").GraphQLSchemaPlugin<import("../types").CmsContext> | import("@webiny/api").ContextPlugin<import("../types").CmsContext>)[];
|