@webiny/api-headless-cms 0.0.0-mt-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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +73 -0
  3. package/content/contextSetup.d.ts +4 -0
  4. package/content/contextSetup.js +65 -0
  5. package/content/graphQLHandlerFactory.d.ts +5 -0
  6. package/content/graphQLHandlerFactory.js +173 -0
  7. package/content/plugins/CmsGroupPlugin.d.ts +11 -0
  8. package/content/plugins/CmsGroupPlugin.js +24 -0
  9. package/content/plugins/CmsModelPlugin.d.ts +11 -0
  10. package/content/plugins/CmsModelPlugin.js +24 -0
  11. package/content/plugins/buildSchemaPlugins.d.ts +7 -0
  12. package/content/plugins/buildSchemaPlugins.js +29 -0
  13. package/content/plugins/crud/contentEntry/afterDelete.d.ts +7 -0
  14. package/content/plugins/crud/contentEntry/afterDelete.js +41 -0
  15. package/content/plugins/crud/contentEntry/beforeCreate.d.ts +7 -0
  16. package/content/plugins/crud/contentEntry/beforeCreate.js +28 -0
  17. package/content/plugins/crud/contentEntry/beforeUpdate.d.ts +7 -0
  18. package/content/plugins/crud/contentEntry/beforeUpdate.js +28 -0
  19. package/content/plugins/crud/contentEntry/entryDataValidation.d.ts +4 -0
  20. package/content/plugins/crud/contentEntry/entryDataValidation.js +188 -0
  21. package/content/plugins/crud/contentEntry/markLockedFields.d.ts +12 -0
  22. package/content/plugins/crud/contentEntry/markLockedFields.js +117 -0
  23. package/content/plugins/crud/contentEntry.crud.d.ts +17 -0
  24. package/content/plugins/crud/contentEntry.crud.js +931 -0
  25. package/content/plugins/crud/contentModel/afterCreate.d.ts +7 -0
  26. package/content/plugins/crud/contentModel/afterCreate.js +18 -0
  27. package/content/plugins/crud/contentModel/afterDelete.d.ts +7 -0
  28. package/content/plugins/crud/contentModel/afterDelete.js +18 -0
  29. package/content/plugins/crud/contentModel/afterUpdate.d.ts +7 -0
  30. package/content/plugins/crud/contentModel/afterUpdate.js +18 -0
  31. package/content/plugins/crud/contentModel/beforeCreate.d.ts +9 -0
  32. package/content/plugins/crud/contentModel/beforeCreate.js +146 -0
  33. package/content/plugins/crud/contentModel/beforeDelete.d.ts +9 -0
  34. package/content/plugins/crud/contentModel/beforeDelete.js +56 -0
  35. package/content/plugins/crud/contentModel/beforeUpdate.d.ts +9 -0
  36. package/content/plugins/crud/contentModel/beforeUpdate.js +128 -0
  37. package/content/plugins/crud/contentModel/contentModelManagerFactory.d.ts +2 -0
  38. package/content/plugins/crud/contentModel/contentModelManagerFactory.js +29 -0
  39. package/content/plugins/crud/contentModel/createFieldModels.d.ts +2 -0
  40. package/content/plugins/crud/contentModel/createFieldModels.js +22 -0
  41. package/content/plugins/crud/contentModel/idValidation.d.ts +2 -0
  42. package/content/plugins/crud/contentModel/idValidation.js +22 -0
  43. package/content/plugins/crud/contentModel/models.d.ts +3 -0
  44. package/content/plugins/crud/contentModel/models.js +141 -0
  45. package/content/plugins/crud/contentModel/validateLayout.d.ts +2 -0
  46. package/content/plugins/crud/contentModel/validateLayout.js +38 -0
  47. package/content/plugins/crud/contentModel.crud.d.ts +12 -0
  48. package/content/plugins/crud/contentModel.crud.js +425 -0
  49. package/content/plugins/crud/contentModelGroup/beforeCreate.d.ts +9 -0
  50. package/content/plugins/crud/contentModelGroup/beforeCreate.js +66 -0
  51. package/content/plugins/crud/contentModelGroup/beforeDelete.d.ts +9 -0
  52. package/content/plugins/crud/contentModelGroup/beforeDelete.js +48 -0
  53. package/content/plugins/crud/contentModelGroup/beforeUpdate.d.ts +8 -0
  54. package/content/plugins/crud/contentModelGroup/beforeUpdate.js +28 -0
  55. package/content/plugins/crud/contentModelGroup.crud.d.ts +12 -0
  56. package/content/plugins/crud/contentModelGroup.crud.js +351 -0
  57. package/content/plugins/crud/index.d.ts +6 -0
  58. package/content/plugins/crud/index.js +100 -0
  59. package/content/plugins/graphqlFields/boolean.d.ts +3 -0
  60. package/content/plugins/graphqlFields/boolean.js +69 -0
  61. package/content/plugins/graphqlFields/datetime.d.ts +3 -0
  62. package/content/plugins/graphqlFields/datetime.js +83 -0
  63. package/content/plugins/graphqlFields/file.d.ts +3 -0
  64. package/content/plugins/graphqlFields/file.js +49 -0
  65. package/content/plugins/graphqlFields/index.d.ts +2 -0
  66. package/content/plugins/graphqlFields/index.js +30 -0
  67. package/content/plugins/graphqlFields/longText.d.ts +3 -0
  68. package/content/plugins/graphqlFields/longText.js +62 -0
  69. package/content/plugins/graphqlFields/number.d.ts +3 -0
  70. package/content/plugins/graphqlFields/number.js +75 -0
  71. package/content/plugins/graphqlFields/object.d.ts +3 -0
  72. package/content/plugins/graphqlFields/object.js +180 -0
  73. package/content/plugins/graphqlFields/ref.d.ts +3 -0
  74. package/content/plugins/graphqlFields/ref.js +205 -0
  75. package/content/plugins/graphqlFields/richText.d.ts +3 -0
  76. package/content/plugins/graphqlFields/richText.js +55 -0
  77. package/content/plugins/graphqlFields/text.d.ts +3 -0
  78. package/content/plugins/graphqlFields/text.js +72 -0
  79. package/content/plugins/internalSecurity/InternalAuthenticationPlugin.d.ts +8 -0
  80. package/content/plugins/internalSecurity/InternalAuthenticationPlugin.js +54 -0
  81. package/content/plugins/internalSecurity/InternalAuthorizationPlugin.d.ts +7 -0
  82. package/content/plugins/internalSecurity/InternalAuthorizationPlugin.js +35 -0
  83. package/content/plugins/modelManager/DefaultCmsModelManager.d.ts +15 -0
  84. package/content/plugins/modelManager/DefaultCmsModelManager.js +62 -0
  85. package/content/plugins/modelManager/index.d.ts +3 -0
  86. package/content/plugins/modelManager/index.js +20 -0
  87. package/content/plugins/schema/baseSchema.d.ts +4 -0
  88. package/content/plugins/schema/baseSchema.js +98 -0
  89. package/content/plugins/schema/contentEntries.d.ts +4 -0
  90. package/content/plugins/schema/contentEntries.js +166 -0
  91. package/content/plugins/schema/contentModelGroups.d.ts +4 -0
  92. package/content/plugins/schema/contentModelGroups.js +153 -0
  93. package/content/plugins/schema/contentModels.d.ts +4 -0
  94. package/content/plugins/schema/contentModels.js +225 -0
  95. package/content/plugins/schema/createFieldResolvers.d.ts +19 -0
  96. package/content/plugins/schema/createFieldResolvers.js +92 -0
  97. package/content/plugins/schema/createManageResolvers.d.ts +11 -0
  98. package/content/plugins/schema/createManageResolvers.js +135 -0
  99. package/content/plugins/schema/createManageSDL.d.ts +9 -0
  100. package/content/plugins/schema/createManageSDL.js +153 -0
  101. package/content/plugins/schema/createPreviewResolvers.d.ts +10 -0
  102. package/content/plugins/schema/createPreviewResolvers.js +55 -0
  103. package/content/plugins/schema/createReadResolvers.d.ts +10 -0
  104. package/content/plugins/schema/createReadResolvers.js +55 -0
  105. package/content/plugins/schema/createReadSDL.d.ts +9 -0
  106. package/content/plugins/schema/createReadSDL.js +96 -0
  107. package/content/plugins/schema/resolvers/commonFieldResolvers.d.ts +6 -0
  108. package/content/plugins/schema/resolvers/commonFieldResolvers.js +14 -0
  109. package/content/plugins/schema/resolvers/manage/resolveCreate.d.ts +6 -0
  110. package/content/plugins/schema/resolvers/manage/resolveCreate.js +23 -0
  111. package/content/plugins/schema/resolvers/manage/resolveCreateFrom.d.ts +7 -0
  112. package/content/plugins/schema/resolvers/manage/resolveCreateFrom.js +23 -0
  113. package/content/plugins/schema/resolvers/manage/resolveDelete.d.ts +2 -0
  114. package/content/plugins/schema/resolvers/manage/resolveDelete.js +30 -0
  115. package/content/plugins/schema/resolvers/manage/resolveGet.d.ts +2 -0
  116. package/content/plugins/schema/resolvers/manage/resolveGet.js +21 -0
  117. package/content/plugins/schema/resolvers/manage/resolveGetByIds.d.ts +2 -0
  118. package/content/plugins/schema/resolvers/manage/resolveGetByIds.js +23 -0
  119. package/content/plugins/schema/resolvers/manage/resolveGetRevisions.d.ts +2 -0
  120. package/content/plugins/schema/resolvers/manage/resolveGetRevisions.js +23 -0
  121. package/content/plugins/schema/resolvers/manage/resolveList.d.ts +2 -0
  122. package/content/plugins/schema/resolvers/manage/resolveList.js +23 -0
  123. package/content/plugins/schema/resolvers/manage/resolvePublish.d.ts +2 -0
  124. package/content/plugins/schema/resolvers/manage/resolvePublish.js +21 -0
  125. package/content/plugins/schema/resolvers/manage/resolveRequestChanges.d.ts +6 -0
  126. package/content/plugins/schema/resolvers/manage/resolveRequestChanges.js +23 -0
  127. package/content/plugins/schema/resolvers/manage/resolveRequestReview.d.ts +6 -0
  128. package/content/plugins/schema/resolvers/manage/resolveRequestReview.js +23 -0
  129. package/content/plugins/schema/resolvers/manage/resolveUnpublish.d.ts +2 -0
  130. package/content/plugins/schema/resolvers/manage/resolveUnpublish.js +21 -0
  131. package/content/plugins/schema/resolvers/manage/resolveUpdate.d.ts +7 -0
  132. package/content/plugins/schema/resolvers/manage/resolveUpdate.js +23 -0
  133. package/content/plugins/schema/resolvers/preview/resolveGet.d.ts +2 -0
  134. package/content/plugins/schema/resolvers/preview/resolveGet.js +38 -0
  135. package/content/plugins/schema/resolvers/preview/resolveList.d.ts +2 -0
  136. package/content/plugins/schema/resolvers/preview/resolveList.js +23 -0
  137. package/content/plugins/schema/resolvers/read/resolveGet.d.ts +2 -0
  138. package/content/plugins/schema/resolvers/read/resolveGet.js +38 -0
  139. package/content/plugins/schema/resolvers/read/resolveList.d.ts +2 -0
  140. package/content/plugins/schema/resolvers/read/resolveList.js +23 -0
  141. package/content/plugins/schema/schemaPlugins.d.ts +3 -0
  142. package/content/plugins/schema/schemaPlugins.js +92 -0
  143. package/content/plugins/storage/StorageTransformPlugin.d.ts +30 -0
  144. package/content/plugins/storage/StorageTransformPlugin.js +36 -0
  145. package/content/plugins/storage/default.d.ts +3 -0
  146. package/content/plugins/storage/default.js +28 -0
  147. package/content/plugins/storage/object.d.ts +3 -0
  148. package/content/plugins/storage/object.js +119 -0
  149. package/content/plugins/utils/createTypeName.d.ts +3 -0
  150. package/content/plugins/utils/createTypeName.js +28 -0
  151. package/content/plugins/utils/entryStorage.d.ts +17 -0
  152. package/content/plugins/utils/entryStorage.js +125 -0
  153. package/content/plugins/utils/getEntryTitle.d.ts +2 -0
  154. package/content/plugins/utils/getEntryTitle.js +42 -0
  155. package/content/plugins/utils/getSchemaFromFieldPlugins.d.ts +11 -0
  156. package/content/plugins/utils/getSchemaFromFieldPlugins.js +30 -0
  157. package/content/plugins/utils/pluralizedTypeName.d.ts +1 -0
  158. package/content/plugins/utils/pluralizedTypeName.js +26 -0
  159. package/content/plugins/utils/renderFields.d.ts +16 -0
  160. package/content/plugins/utils/renderFields.js +51 -0
  161. package/content/plugins/utils/renderGetFilterFields.d.ts +9 -0
  162. package/content/plugins/utils/renderGetFilterFields.js +41 -0
  163. package/content/plugins/utils/renderInputFields.d.ts +14 -0
  164. package/content/plugins/utils/renderInputFields.js +53 -0
  165. package/content/plugins/utils/renderListFilterFields.d.ts +10 -0
  166. package/content/plugins/utils/renderListFilterFields.js +39 -0
  167. package/content/plugins/utils/renderSortEnum.d.ts +9 -0
  168. package/content/plugins/utils/renderSortEnum.js +32 -0
  169. package/content/plugins/validators/dateGte.d.ts +3 -0
  170. package/content/plugins/validators/dateGte.js +37 -0
  171. package/content/plugins/validators/dateLte.d.ts +3 -0
  172. package/content/plugins/validators/dateLte.js +37 -0
  173. package/content/plugins/validators/gte.d.ts +3 -0
  174. package/content/plugins/validators/gte.js +32 -0
  175. package/content/plugins/validators/in.d.ts +3 -0
  176. package/content/plugins/validators/in.js +32 -0
  177. package/content/plugins/validators/index.d.ts +2 -0
  178. package/content/plugins/validators/index.js +36 -0
  179. package/content/plugins/validators/lte.d.ts +3 -0
  180. package/content/plugins/validators/lte.js +32 -0
  181. package/content/plugins/validators/maxLength.d.ts +3 -0
  182. package/content/plugins/validators/maxLength.js +32 -0
  183. package/content/plugins/validators/minLength.d.ts +3 -0
  184. package/content/plugins/validators/minLength.js +32 -0
  185. package/content/plugins/validators/pattern.d.ts +3 -0
  186. package/content/plugins/validators/pattern.js +47 -0
  187. package/content/plugins/validators/patternPlugins/email.d.ts +3 -0
  188. package/content/plugins/validators/patternPlugins/email.js +17 -0
  189. package/content/plugins/validators/patternPlugins/index.d.ts +2 -0
  190. package/content/plugins/validators/patternPlugins/index.js +19 -0
  191. package/content/plugins/validators/patternPlugins/lowerCase.d.ts +3 -0
  192. package/content/plugins/validators/patternPlugins/lowerCase.js +17 -0
  193. package/content/plugins/validators/patternPlugins/upperCase.d.ts +3 -0
  194. package/content/plugins/validators/patternPlugins/upperCase.js +17 -0
  195. package/content/plugins/validators/patternPlugins/url.d.ts +3 -0
  196. package/content/plugins/validators/patternPlugins/url.js +17 -0
  197. package/content/plugins/validators/required.d.ts +3 -0
  198. package/content/plugins/validators/required.js +25 -0
  199. package/content/plugins/validators/timeGte.d.ts +3 -0
  200. package/content/plugins/validators/timeGte.js +32 -0
  201. package/content/plugins/validators/timeLte.d.ts +3 -0
  202. package/content/plugins/validators/timeLte.js +32 -0
  203. package/index.d.ts +12 -0
  204. package/index.js +66 -0
  205. package/migrateCMSPermissions.d.ts +17 -0
  206. package/migrateCMSPermissions.js +193 -0
  207. package/package.json +80 -0
  208. package/plugins/context.d.ts +4 -0
  209. package/plugins/context.js +34 -0
  210. package/plugins/crud/index.d.ts +6 -0
  211. package/plugins/crud/index.js +100 -0
  212. package/plugins/crud/settings.crud.d.ts +10 -0
  213. package/plugins/crud/settings.crud.js +93 -0
  214. package/plugins/crud/system.crud.d.ts +10 -0
  215. package/plugins/crud/system.crud.js +182 -0
  216. package/plugins/graphql/system.d.ts +17 -0
  217. package/plugins/graphql/system.js +72 -0
  218. package/plugins/graphql.d.ts +2 -0
  219. package/plugins/graphql.js +79 -0
  220. package/plugins/upgrades/index.d.ts +2 -0
  221. package/plugins/upgrades/index.js +14 -0
  222. package/plugins/upgrades/v5.5.0/helpers.d.ts +6 -0
  223. package/plugins/upgrades/v5.5.0/helpers.js +10 -0
  224. package/plugins/upgrades/v5.5.0/index.d.ts +4 -0
  225. package/plugins/upgrades/v5.5.0/index.js +129 -0
  226. package/transformers.d.ts +2 -0
  227. package/transformers.js +25 -0
  228. package/types.d.ts +2149 -0
  229. package/types.js +366 -0
  230. package/utils.d.ts +25 -0
  231. package/utils.js +251 -0
@@ -0,0 +1,7 @@
1
+ import { AfterModelCreateTopicParams, CmsContext } from "../../../../types";
2
+ import { Topic } from "@webiny/pubsub/types";
3
+ export interface Params {
4
+ onAfterCreate: Topic<AfterModelCreateTopicParams>;
5
+ context: CmsContext;
6
+ }
7
+ export declare const assignAfterModelCreate: (params: Params) => void;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.assignAfterModelCreate = void 0;
7
+
8
+ const assignAfterModelCreate = params => {
9
+ const {
10
+ onAfterCreate,
11
+ context
12
+ } = params;
13
+ onAfterCreate.subscribe(async () => {
14
+ await context.cms.updateModelLastChange();
15
+ });
16
+ };
17
+
18
+ exports.assignAfterModelCreate = assignAfterModelCreate;
@@ -0,0 +1,7 @@
1
+ import { AfterModelDeleteTopicParams, CmsContext } from "../../../../types";
2
+ import { Topic } from "@webiny/pubsub/types";
3
+ export interface Params {
4
+ onAfterDelete: Topic<AfterModelDeleteTopicParams>;
5
+ context: CmsContext;
6
+ }
7
+ export declare const assignAfterModelDelete: (params: Params) => void;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.assignAfterModelDelete = void 0;
7
+
8
+ const assignAfterModelDelete = params => {
9
+ const {
10
+ onAfterDelete,
11
+ context
12
+ } = params;
13
+ onAfterDelete.subscribe(async () => {
14
+ await context.cms.updateModelLastChange();
15
+ });
16
+ };
17
+
18
+ exports.assignAfterModelDelete = assignAfterModelDelete;
@@ -0,0 +1,7 @@
1
+ import { AfterModelUpdateTopicParams, CmsContext } from "../../../../types";
2
+ import { Topic } from "@webiny/pubsub/types";
3
+ export interface Params {
4
+ onAfterUpdate: Topic<AfterModelUpdateTopicParams>;
5
+ context: CmsContext;
6
+ }
7
+ export declare const assignAfterModelUpdate: (params: Params) => void;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.assignAfterModelUpdate = void 0;
7
+
8
+ const assignAfterModelUpdate = params => {
9
+ const {
10
+ onAfterUpdate,
11
+ context
12
+ } = params;
13
+ onAfterUpdate.subscribe(async () => {
14
+ await context.cms.updateModelLastChange();
15
+ });
16
+ };
17
+
18
+ exports.assignAfterModelUpdate = assignAfterModelUpdate;
@@ -0,0 +1,9 @@
1
+ import { BeforeModelCreateTopicParams, HeadlessCmsStorageOperations } from "../../../../types";
2
+ import { Topic } from "@webiny/pubsub/types";
3
+ import { PluginsContainer } from "@webiny/plugins";
4
+ export interface Params {
5
+ onBeforeCreate: Topic<BeforeModelCreateTopicParams>;
6
+ storageOperations: HeadlessCmsStorageOperations;
7
+ plugins: PluginsContainer;
8
+ }
9
+ export declare const assignBeforeModelCreate: (params: Params) => void;
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.assignBeforeModelCreate = void 0;
9
+
10
+ var _error = _interopRequireDefault(require("@webiny/error"));
11
+
12
+ var _camelCase = _interopRequireDefault(require("lodash/camelCase"));
13
+
14
+ var _pluralize = _interopRequireDefault(require("pluralize"));
15
+
16
+ var _CmsModelPlugin = require("../../CmsModelPlugin");
17
+
18
+ const disallowedModelIdList = ["contentModel", "contentModels", "contentModelGroup", "contentModelGroups"];
19
+ /**
20
+ * This list is to disallow creating models that might interfere with GraphQL schema creation.
21
+ * Add more if required.
22
+ */
23
+
24
+ const disallowedModelIdEndingList = ["Response", "List", "Meta", "Input", "Sorter"];
25
+ /**
26
+ * Checks for the uniqueness of provided modelId, against the provided list of models.
27
+ * It also takes plural / singular forms of the provided modelId into account.
28
+ */
29
+
30
+ const checkModelIdUniqueness = (modelIdList, modelId) => {
31
+ if (modelIdList.includes(modelId) === true) {
32
+ throw new _error.default(`Content model with modelId "${modelId}" already exists.`, "MODEL_ID_EXISTS", {
33
+ modelId
34
+ });
35
+ }
36
+ /**
37
+ * Additionally, check if the plural form of the received modelId exists too. This prevents users
38
+ * from creating, for example, "event" and "events" models, which would break the GraphQL schema.
39
+ * 1. First check if user wants to create the "event" model, but the "events" model already exists.
40
+ */
41
+
42
+
43
+ const pluralizedModelIdCamelCase = (0, _pluralize.default)(modelId);
44
+
45
+ if (modelIdList.includes(pluralizedModelIdCamelCase) === true) {
46
+ throw new _error.default(`Content model with modelId "${modelId}" does not exist, but a model with modelId "${pluralizedModelIdCamelCase}" does.`, "MODEL_ID_PLURAL_ERROR", {
47
+ modelId,
48
+ plural: pluralizedModelIdCamelCase
49
+ });
50
+ }
51
+ /**
52
+ * 2. Then check if user wants to create the "events" model, but the "event" model already exists.
53
+ */
54
+
55
+
56
+ const singularizedModelIdCamelCase = _pluralize.default.singular(modelId);
57
+
58
+ if (modelIdList.includes(singularizedModelIdCamelCase) === true) {
59
+ throw new _error.default(`Content model with modelId "${modelId}" does not exist, but a model with modelId "${singularizedModelIdCamelCase}" does.`, "MODEL_ID_SINGULAR_ERROR", {
60
+ modelId,
61
+ singular: singularizedModelIdCamelCase
62
+ });
63
+ }
64
+ };
65
+
66
+ const checkModelIdAllowed = modelId => {
67
+ if (disallowedModelIdList.includes(modelId) === false) {
68
+ return;
69
+ }
70
+
71
+ throw new _error.default(`Provided model ID "${modelId}" is not allowed.`);
72
+ };
73
+
74
+ const checkModelIdEndingAllowed = modelId => {
75
+ for (const ending of disallowedModelIdEndingList) {
76
+ const re = new RegExp(`${ending}$`, "i");
77
+ const matched = modelId.match(re);
78
+
79
+ if (matched === null) {
80
+ continue;
81
+ }
82
+
83
+ throw new _error.default(`ModelId that ends with "${ending}" is not allowed.`, "MODEL_ID_NOT_ALLOWED", {
84
+ modelId
85
+ });
86
+ }
87
+ };
88
+
89
+ const getModelId = model => {
90
+ const {
91
+ modelId,
92
+ name
93
+ } = model;
94
+
95
+ if (modelId) {
96
+ return (0, _camelCase.default)(modelId.trim());
97
+ } else if (name) {
98
+ return (0, _camelCase.default)(name.trim());
99
+ }
100
+
101
+ throw new _error.default(`There is no "modelId" or "name" passed into the create model method.`, "MISSING_MODEL_DATA", {
102
+ model
103
+ });
104
+ };
105
+
106
+ const assignBeforeModelCreate = params => {
107
+ const {
108
+ onBeforeCreate,
109
+ storageOperations,
110
+ plugins
111
+ } = params;
112
+ onBeforeCreate.subscribe(async params => {
113
+ const {
114
+ model
115
+ } = params;
116
+ const modelId = getModelId(model);
117
+ const modelPlugin = plugins.byType(_CmsModelPlugin.CmsModelPlugin.type).find(item => item.contentModel.modelId === modelId);
118
+
119
+ if (modelPlugin) {
120
+ throw new _error.default(`Cannot create "${model.modelId}" content model because one is already registered via a plugin.`, "CONTENT_MODEL_CREATE_ERROR", {
121
+ modelId: model.modelId
122
+ });
123
+ }
124
+
125
+ const models = await storageOperations.models.list({
126
+ where: {
127
+ tenant: model.tenant,
128
+ locale: model.locale
129
+ }
130
+ });
131
+ const modelIdList = models.map(m => m.modelId);
132
+ /**
133
+ * We need to check for:
134
+ * - is that exact modelId allowed
135
+ * - is modelId unique
136
+ * - is model ending allowed
137
+ */
138
+
139
+ checkModelIdAllowed(modelId);
140
+ checkModelIdEndingAllowed(modelId);
141
+ checkModelIdUniqueness(modelIdList, modelId);
142
+ model.modelId = modelId;
143
+ });
144
+ };
145
+
146
+ exports.assignBeforeModelCreate = assignBeforeModelCreate;
@@ -0,0 +1,9 @@
1
+ import { Topic } from "@webiny/pubsub/types";
2
+ import { BeforeModelDeleteTopicParams, HeadlessCmsStorageOperations } from "../../../../types";
3
+ import { PluginsContainer } from "@webiny/plugins";
4
+ export interface Params {
5
+ onBeforeDelete: Topic<BeforeModelDeleteTopicParams>;
6
+ storageOperations: HeadlessCmsStorageOperations;
7
+ plugins: PluginsContainer;
8
+ }
9
+ export declare const assignBeforeModelDelete: (params: Params) => void;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.assignBeforeModelDelete = void 0;
9
+
10
+ var _error = _interopRequireDefault(require("@webiny/error"));
11
+
12
+ var _CmsModelPlugin = require("../../CmsModelPlugin");
13
+
14
+ const assignBeforeModelDelete = params => {
15
+ const {
16
+ onBeforeDelete,
17
+ storageOperations,
18
+ plugins
19
+ } = params;
20
+ onBeforeDelete.subscribe(async params => {
21
+ const {
22
+ model
23
+ } = params;
24
+ const modelPlugin = plugins.byType(_CmsModelPlugin.CmsModelPlugin.type).find(item => item.contentModel.modelId === model.modelId);
25
+
26
+ if (modelPlugin) {
27
+ throw new _error.default("Content models defined via plugins cannot be deleted.", "CONTENT_MODEL_DELETE_ERROR", {
28
+ modelId: model.modelId
29
+ });
30
+ }
31
+
32
+ let entries = [];
33
+
34
+ try {
35
+ const result = await storageOperations.entries.list(model, {
36
+ where: {
37
+ tenant: model.tenant,
38
+ locale: model.locale
39
+ },
40
+ limit: 1
41
+ });
42
+ entries = result.items;
43
+ } catch (ex) {
44
+ throw new _error.default("Could not retrieve a list of content entries from the model.", "ENTRIES_ERROR", {
45
+ error: ex,
46
+ model
47
+ });
48
+ }
49
+
50
+ if (entries.length > 0) {
51
+ throw new _error.default(`Cannot delete content model "${model.modelId}" because there are existing entries.`, "CONTENT_MODEL_BEFORE_DELETE_HOOK_FAILED");
52
+ }
53
+ });
54
+ };
55
+
56
+ exports.assignBeforeModelDelete = assignBeforeModelDelete;
@@ -0,0 +1,9 @@
1
+ import { Topic } from "@webiny/pubsub/types";
2
+ import { BeforeModelUpdateTopicParams, HeadlessCmsStorageOperations } from "../../../../types";
3
+ import { PluginsContainer } from "@webiny/plugins";
4
+ export interface Params {
5
+ onBeforeUpdate: Topic<BeforeModelUpdateTopicParams>;
6
+ storageOperations: HeadlessCmsStorageOperations;
7
+ plugins: PluginsContainer;
8
+ }
9
+ export declare const assignBeforeModelUpdate: (params: Params) => void;
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.assignBeforeModelUpdate = void 0;
9
+
10
+ var _error = _interopRequireDefault(require("@webiny/error"));
11
+
12
+ var _CmsModelPlugin = require("../../CmsModelPlugin");
13
+
14
+ const defaultTitleFieldId = "id";
15
+ const allowedTitleFieldTypes = ["text", "number"];
16
+
17
+ const getContentModelTitleFieldId = (fields, titleFieldId) => {
18
+ // if there is no title field defined either in input data or existing content model data
19
+ // we will take first text field that has no multiple values enabled
20
+ // or if initial titleFieldId is the default one also try to find first available text field
21
+ if (!titleFieldId || titleFieldId === defaultTitleFieldId) {
22
+ const titleField = fields.find(field => {
23
+ return field.type === "text" && !field.multipleValues;
24
+ });
25
+ return titleField ? titleField.fieldId : defaultTitleFieldId;
26
+ } // check existing titleFieldId for existence in the model
27
+ // for correct type
28
+ // and that it is not multiple values field
29
+
30
+
31
+ const target = fields.find(f => f.fieldId === titleFieldId);
32
+
33
+ if (!target) {
34
+ throw new _error.default(`Field does not exist in the model.`, "VALIDATION_ERROR", {
35
+ fieldId: titleFieldId
36
+ });
37
+ }
38
+
39
+ if (allowedTitleFieldTypes.includes(target.type) === false) {
40
+ throw new _error.default(`Only ${allowedTitleFieldTypes.join(", ")} and id fields can be used as an entry title.`, "ENTRY_TITLE_FIELD_TYPE", {
41
+ fieldId: target.fieldId,
42
+ type: target.type
43
+ });
44
+ }
45
+
46
+ if (target.multipleValues) {
47
+ throw new _error.default(`Fields that accept multiple values cannot be used as the entry title.`, "ENTRY_TITLE_FIELD_TYPE", {
48
+ fieldId: target.fieldId,
49
+ type: target.type
50
+ });
51
+ }
52
+
53
+ return target.fieldId;
54
+ };
55
+
56
+ const assignBeforeModelUpdate = params => {
57
+ const {
58
+ onBeforeUpdate,
59
+ plugins
60
+ } = params;
61
+ onBeforeUpdate.subscribe(async params => {
62
+ const {
63
+ model
64
+ } = params;
65
+ const modelPlugin = plugins.byType(_CmsModelPlugin.CmsModelPlugin.type).find(item => item.contentModel.modelId === model.modelId);
66
+
67
+ if (modelPlugin) {
68
+ throw new _error.default("Content models defined via plugins cannot be updated.", "CONTENT_MODEL_UPDATE_ERROR", {
69
+ modelId: model.modelId
70
+ });
71
+ }
72
+
73
+ const {
74
+ titleFieldId
75
+ } = model; // There should be fields/locked fields in either model or data to be updated.
76
+
77
+ const {
78
+ fields = [],
79
+ lockedFields = []
80
+ } = model; // Let's inspect the fields of the received content model. We prevent saving of a content model if it
81
+ // contains a field for which a "cms-model-field-to-graphql" plugin does not exist on the backend.
82
+
83
+ const fieldTypePlugins = plugins.byType("cms-model-field-to-graphql");
84
+
85
+ for (let i = 0; i < fields.length; i++) {
86
+ const field = fields[i];
87
+
88
+ if (!fieldTypePlugins.find(item => item.fieldType === field.type)) {
89
+ throw new Error(`Cannot update content model because of the unknown "${field.type}" field.`);
90
+ }
91
+ }
92
+
93
+ model.titleFieldId = getContentModelTitleFieldId(fields, titleFieldId);
94
+ const cmsLockedFieldPlugins = plugins.byType("cms-model-locked-field"); // We must not allow removal or changes in fields that are already in use in content entries.
95
+
96
+ for (const lockedField of lockedFields) {
97
+ const existingField = fields.find(item => item.fieldId === lockedField.fieldId);
98
+
99
+ if (!existingField) {
100
+ throw new _error.default(`Cannot remove the field "${lockedField.fieldId}" because it's already in use in created content.`, "ENTRY_FIELD_USED");
101
+ }
102
+
103
+ if (lockedField.multipleValues !== existingField.multipleValues) {
104
+ throw new _error.default(`Cannot change "multipleValues" for the "${lockedField.fieldId}" field because it's already in use in created content.`, "ENTRY_FIELD_USED");
105
+ }
106
+
107
+ if (lockedField.type !== existingField.type) {
108
+ throw new _error.default(`Cannot change field type for the "${lockedField.fieldId}" field because it's already in use in created content.`, "ENTRY_FIELD_USED");
109
+ } // Check `lockedField` invariant for specific field
110
+
111
+
112
+ const lockedFieldsByType = cmsLockedFieldPlugins.filter(pl => pl.fieldType === lockedField.type);
113
+
114
+ for (const plugin of lockedFieldsByType) {
115
+ if (typeof plugin.checkLockedField !== "function") {
116
+ continue;
117
+ }
118
+
119
+ plugin.checkLockedField({
120
+ lockedField,
121
+ field: existingField
122
+ });
123
+ }
124
+ }
125
+ });
126
+ };
127
+
128
+ exports.assignBeforeModelUpdate = assignBeforeModelUpdate;
@@ -0,0 +1,2 @@
1
+ import { CmsModel, CmsContext } from "../../../../types";
2
+ export declare const contentModelManagerFactory: (context: CmsContext, model: CmsModel) => Promise<import("../../../../types").CmsModelManager>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.contentModelManagerFactory = void 0;
7
+ const defaultName = "content-model-manager-default";
8
+
9
+ const contentModelManagerFactory = async (context, model) => {
10
+ const pluginsByType = context.plugins.byType("cms-content-model-manager").reverse();
11
+
12
+ for (const plugin of pluginsByType) {
13
+ const target = Array.isArray(plugin.modelId) ? plugin.modelId : [plugin.modelId];
14
+
15
+ if (target.includes(model.modelId) === true && plugin.name !== defaultName) {
16
+ return await plugin.create(context, model);
17
+ }
18
+ }
19
+
20
+ const plugin = pluginsByType.find(plugin => plugin.name === defaultName);
21
+
22
+ if (!plugin) {
23
+ throw new Error("There is no default plugin to create CmsModelManager");
24
+ }
25
+
26
+ return await plugin.create(context, model);
27
+ };
28
+
29
+ exports.contentModelManagerFactory = contentModelManagerFactory;
@@ -0,0 +1,2 @@
1
+ import { CmsModelField, CmsModel, CmsModelUpdateInput } from "../../../../types";
2
+ export declare const createFieldModels: (_: CmsModel, data: CmsModelUpdateInput) => Promise<CmsModelField[]>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createFieldModels = void 0;
7
+
8
+ var _models = require("./models");
9
+
10
+ const createFieldModels = async (_, data) => {
11
+ const fields = [];
12
+
13
+ for (const field of data.fields) {
14
+ const fieldData = new _models.ContentModelFieldModel().populate(field);
15
+ await fieldData.validate();
16
+ fields.push(await fieldData.toJSON());
17
+ }
18
+
19
+ return fields;
20
+ };
21
+
22
+ exports.createFieldModels = createFieldModels;
@@ -0,0 +1,2 @@
1
+ declare const _default: (value: string) => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _validation = require("@webiny/validation");
9
+
10
+ var _default = async value => {
11
+ await _validation.validation.validate(value, "required,maxLength:100");
12
+
13
+ if (!value.charAt(0).match(/[a-zA-Z]/)) {
14
+ throw new Error(`Provided ID ${value} is not valid - must not start with a number.`);
15
+ }
16
+
17
+ if (value.trim().toLowerCase() === "id") {
18
+ throw new Error(`Provided ID ${value} is not valid - "id" is an auto-generated field.`);
19
+ }
20
+ };
21
+
22
+ exports.default = _default;
@@ -0,0 +1,3 @@
1
+ export declare const CreateContentModelModel: any;
2
+ export declare const ContentModelFieldModel: any;
3
+ export declare const UpdateContentModelModel: any;
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.UpdateContentModelModel = exports.CreateContentModelModel = exports.ContentModelFieldModel = void 0;
9
+
10
+ var _validation = require("@webiny/validation");
11
+
12
+ var _flow = _interopRequireDefault(require("lodash/flow"));
13
+
14
+ var _commodoFieldsObject = require("commodo-fields-object");
15
+
16
+ var _fields = require("@commodo/fields");
17
+
18
+ var _idValidation = _interopRequireDefault(require("./idValidation"));
19
+
20
+ const requiredShortString = _validation.validation.create("required,maxLength:255");
21
+
22
+ const shortString = _validation.validation.create("maxLength:255");
23
+
24
+ const CreateContentModelModel = (0, _fields.withFields)({
25
+ name: (0, _fields.string)({
26
+ validation: requiredShortString
27
+ }),
28
+ modelId: (0, _fields.string)({
29
+ validation: shortString
30
+ }),
31
+ description: (0, _fields.string)({
32
+ validation: shortString
33
+ }),
34
+ group: (0, _fields.string)({
35
+ validation: requiredShortString
36
+ })
37
+ })();
38
+ exports.CreateContentModelModel = CreateContentModelModel;
39
+ const RendererModel = (0, _fields.withFields)({
40
+ name: (0, _fields.string)({
41
+ validation: requiredShortString
42
+ })
43
+ })();
44
+ const ContentModelFieldModel = (0, _fields.withFields)({
45
+ id: (0, _fields.string)({
46
+ validation: requiredShortString
47
+ }),
48
+ fieldId: (0, _flow.default)((0, _fields.onSet)(value => value && value.trim()), (0, _fields.setOnce)())((0, _fields.string)({
49
+ validation: _idValidation.default
50
+ })),
51
+ label: (0, _fields.string)({
52
+ validation: requiredShortString
53
+ }),
54
+ helpText: (0, _fields.string)({
55
+ validation: shortString
56
+ }),
57
+ placeholderText: (0, _fields.string)({
58
+ validation: shortString
59
+ }),
60
+ type: (0, _fields.setOnce)()((0, _fields.string)({
61
+ validation: requiredShortString
62
+ })),
63
+ multipleValues: (0, _fields.boolean)({
64
+ value: false
65
+ }),
66
+ predefinedValues: (0, _fields.fields)({
67
+ value: {},
68
+ instanceOf: (0, _fields.withFields)({
69
+ enabled: (0, _fields.boolean)(),
70
+ values: (0, _fields.fields)({
71
+ value: [],
72
+ list: true,
73
+ instanceOf: (0, _fields.withFields)({
74
+ label: (0, _fields.string)(),
75
+ value: (0, _fields.string)()
76
+ })()
77
+ })
78
+ })()
79
+ }),
80
+ renderer: (0, _fields.fields)({
81
+ instanceOf: RendererModel,
82
+ validation: shortString
83
+ }),
84
+ validation: (0, _fields.fields)({
85
+ list: true,
86
+ value: [],
87
+ instanceOf: (0, _fields.withFields)({
88
+ name: (0, _fields.string)({
89
+ validation: requiredShortString
90
+ }),
91
+ message: (0, _fields.string)({
92
+ validation: shortString
93
+ }),
94
+ settings: (0, _commodoFieldsObject.object)({
95
+ value: {}
96
+ })
97
+ })()
98
+ }),
99
+ listValidation: (0, _fields.fields)({
100
+ list: true,
101
+ value: [],
102
+ instanceOf: (0, _fields.withFields)({
103
+ name: (0, _fields.string)({
104
+ validation: requiredShortString
105
+ }),
106
+ message: (0, _fields.string)({
107
+ validation: shortString
108
+ }),
109
+ settings: (0, _commodoFieldsObject.object)({
110
+ value: {}
111
+ })
112
+ })()
113
+ }),
114
+ settings: (0, _commodoFieldsObject.object)({
115
+ value: {}
116
+ })
117
+ })();
118
+ exports.ContentModelFieldModel = ContentModelFieldModel;
119
+ const UpdateContentModelModel = (0, _fields.withFields)({
120
+ name: (0, _fields.string)({
121
+ validation: shortString
122
+ }),
123
+ description: (0, _fields.string)({
124
+ validation: shortString
125
+ }),
126
+ group: (0, _fields.string)({
127
+ validation: shortString
128
+ }),
129
+ titleFieldId: (0, _fields.string)(),
130
+ fields: (0, _fields.fields)({
131
+ instanceOf: ContentModelFieldModel,
132
+ value: [],
133
+ list: true,
134
+ required: true
135
+ }),
136
+ layout: (0, _commodoFieldsObject.object)({
137
+ value: [],
138
+ required: true
139
+ })
140
+ })();
141
+ exports.UpdateContentModelModel = UpdateContentModelModel;
@@ -0,0 +1,2 @@
1
+ import { CmsModelField, CmsModel } from "../../../../types";
2
+ export declare const validateLayout: ({ layout }: CmsModel, fields: CmsModelField[]) => void;