@strapi/content-type-builder 5.53.0 → 5.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/dist/admin/components/AIChat/hooks/useAIFetch.js +6 -2
  2. package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -1
  3. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +7 -3
  4. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -1
  5. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js +20 -0
  6. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js.map +1 -0
  7. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs +18 -0
  8. package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs.map +1 -0
  9. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js +83 -59
  10. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js.map +1 -1
  11. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs +86 -62
  12. package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs.map +1 -1
  13. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js +112 -0
  14. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js.map +1 -0
  15. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs +110 -0
  16. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs.map +1 -0
  17. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js +159 -0
  18. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js.map +1 -0
  19. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs +157 -0
  20. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs.map +1 -0
  21. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js +311 -0
  22. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js.map +1 -0
  23. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs +309 -0
  24. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs.map +1 -0
  25. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js +379 -0
  26. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js.map +1 -0
  27. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs +376 -0
  28. package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs.map +1 -0
  29. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js +172 -0
  30. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js.map +1 -0
  31. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs +166 -0
  32. package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs.map +1 -0
  33. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js +62 -0
  34. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js.map +1 -0
  35. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs +60 -0
  36. package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs.map +1 -0
  37. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js +145 -0
  38. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js.map +1 -0
  39. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs +143 -0
  40. package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs.map +1 -0
  41. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js +176 -0
  42. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -0
  43. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs +169 -0
  44. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -0
  45. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js +277 -0
  46. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -0
  47. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs +273 -0
  48. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -0
  49. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js +62 -0
  50. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js.map +1 -0
  51. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs +58 -0
  52. package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs.map +1 -0
  53. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  54. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  55. package/dist/admin/components/DataManager/DataManagerProvider.js +70 -8
  56. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  57. package/dist/admin/components/DataManager/DataManagerProvider.mjs +70 -8
  58. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  59. package/dist/admin/components/DataManager/reducer.js +411 -33
  60. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  61. package/dist/admin/components/DataManager/reducer.mjs +411 -33
  62. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  63. package/dist/admin/components/DataManager/utils/cleanData.js +11 -2
  64. package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
  65. package/dist/admin/components/DataManager/utils/cleanData.mjs +11 -2
  66. package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
  67. package/dist/admin/components/DataManager/utils/contentStructure.js +150 -0
  68. package/dist/admin/components/DataManager/utils/contentStructure.js.map +1 -0
  69. package/dist/admin/components/DataManager/utils/contentStructure.mjs +133 -0
  70. package/dist/admin/components/DataManager/utils/contentStructure.mjs.map +1 -0
  71. package/dist/admin/components/FolderSelect.js +200 -0
  72. package/dist/admin/components/FolderSelect.js.map +1 -0
  73. package/dist/admin/components/FolderSelect.mjs +198 -0
  74. package/dist/admin/components/FolderSelect.mjs.map +1 -0
  75. package/dist/admin/components/FormModal/FormModal.js +23 -2
  76. package/dist/admin/components/FormModal/FormModal.js.map +1 -1
  77. package/dist/admin/components/FormModal/FormModal.mjs +23 -2
  78. package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
  79. package/dist/admin/components/FormModal/contentType/contentTypeForm.js +15 -18
  80. package/dist/admin/components/FormModal/contentType/contentTypeForm.js.map +1 -1
  81. package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs +15 -18
  82. package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs.map +1 -1
  83. package/dist/admin/components/FormModal/reducer.js +6 -0
  84. package/dist/admin/components/FormModal/reducer.js.map +1 -1
  85. package/dist/admin/components/FormModal/reducer.mjs +6 -0
  86. package/dist/admin/components/FormModal/reducer.mjs.map +1 -1
  87. package/dist/admin/pages/App/index.js +2 -5
  88. package/dist/admin/pages/App/index.js.map +1 -1
  89. package/dist/admin/pages/App/index.mjs +2 -5
  90. package/dist/admin/pages/App/index.mjs.map +1 -1
  91. package/dist/admin/src/components/AIChat/hooks/usePrefetchAIToken.d.ts +1 -0
  92. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.d.ts +16 -0
  93. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.d.ts +12 -0
  94. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.d.ts +14 -0
  95. package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.d.ts +38 -0
  96. package/dist/admin/src/components/ContentTypeBuilderNav/{useContentTypeBuilderMenu.d.ts → hooks/useContentTypeBuilderMenu.d.ts} +17 -7
  97. package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useFolderActions.d.ts +42 -0
  98. package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useSortableTree.d.ts +53 -0
  99. package/dist/admin/src/components/ContentTypeBuilderNav/lib/buildFolderTree.d.ts +42 -0
  100. package/dist/admin/src/components/ContentTypeBuilderNav/lib/dropProjection.d.ts +58 -0
  101. package/dist/admin/src/components/ContentTypeBuilderNav/lib/flatModel.d.ts +18 -0
  102. package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +41 -0
  103. package/dist/admin/src/components/DataManager/reducer.d.ts +105 -1
  104. package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +5 -1
  105. package/dist/admin/src/components/DataManager/utils/contentStructure.d.ts +68 -0
  106. package/dist/admin/src/components/FolderSelect.d.ts +18 -0
  107. package/dist/admin/src/components/FormModal/contentType/contentTypeForm.d.ts +0 -21
  108. package/dist/admin/src/components/FormModal/forms/forms.d.ts +0 -10
  109. package/dist/admin/src/components/FormModal/reducer.d.ts +7 -0
  110. package/dist/admin/src/utils/folderTelemetry.d.ts +5 -0
  111. package/dist/admin/translations/en.json.js +23 -0
  112. package/dist/admin/translations/en.json.js.map +1 -1
  113. package/dist/admin/translations/en.json.mjs +23 -0
  114. package/dist/admin/translations/en.json.mjs.map +1 -1
  115. package/dist/admin/utils/folderTelemetry.js +19 -0
  116. package/dist/admin/utils/folderTelemetry.js.map +1 -0
  117. package/dist/admin/utils/folderTelemetry.mjs +16 -0
  118. package/dist/admin/utils/folderTelemetry.mjs.map +1 -0
  119. package/dist/server/controllers/schema.js +1 -1
  120. package/dist/server/controllers/schema.js.map +1 -1
  121. package/dist/server/controllers/schema.mjs +1 -1
  122. package/dist/server/controllers/schema.mjs.map +1 -1
  123. package/dist/server/controllers/validation/common.js +3 -0
  124. package/dist/server/controllers/validation/common.js.map +1 -1
  125. package/dist/server/controllers/validation/common.mjs +3 -1
  126. package/dist/server/controllers/validation/common.mjs.map +1 -1
  127. package/dist/server/controllers/validation/content-structure.js +177 -0
  128. package/dist/server/controllers/validation/content-structure.js.map +1 -0
  129. package/dist/server/controllers/validation/content-structure.mjs +173 -0
  130. package/dist/server/controllers/validation/content-structure.mjs.map +1 -0
  131. package/dist/server/controllers/validation/schema.js +3 -1
  132. package/dist/server/controllers/validation/schema.js.map +1 -1
  133. package/dist/server/controllers/validation/schema.mjs +3 -1
  134. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  135. package/dist/server/register.js +1 -1
  136. package/dist/server/register.js.map +1 -1
  137. package/dist/server/register.mjs +1 -1
  138. package/dist/server/register.mjs.map +1 -1
  139. package/dist/server/routes/content-api.js +4 -4
  140. package/dist/server/routes/content-api.js.map +1 -1
  141. package/dist/server/routes/content-api.mjs +4 -4
  142. package/dist/server/routes/content-api.mjs.map +1 -1
  143. package/dist/server/services/api-handler.js +37 -4
  144. package/dist/server/services/api-handler.js.map +1 -1
  145. package/dist/server/services/api-handler.mjs +36 -5
  146. package/dist/server/services/api-handler.mjs.map +1 -1
  147. package/dist/server/services/content-structure.js +174 -0
  148. package/dist/server/services/content-structure.js.map +1 -0
  149. package/dist/server/services/content-structure.mjs +172 -0
  150. package/dist/server/services/content-structure.mjs.map +1 -0
  151. package/dist/server/services/content-types.js +196 -44
  152. package/dist/server/services/content-types.js.map +1 -1
  153. package/dist/server/services/content-types.mjs +195 -45
  154. package/dist/server/services/content-types.mjs.map +1 -1
  155. package/dist/server/services/index.js +3 -1
  156. package/dist/server/services/index.js.map +1 -1
  157. package/dist/server/services/index.mjs +3 -1
  158. package/dist/server/services/index.mjs.map +1 -1
  159. package/dist/server/services/schema-builder/index.js +4 -2
  160. package/dist/server/services/schema-builder/index.js.map +1 -1
  161. package/dist/server/services/schema-builder/index.mjs +4 -2
  162. package/dist/server/services/schema-builder/index.mjs.map +1 -1
  163. package/dist/server/services/schema-builder/schema-handler.js +19 -17
  164. package/dist/server/services/schema-builder/schema-handler.js.map +1 -1
  165. package/dist/server/services/schema-builder/schema-handler.mjs +19 -17
  166. package/dist/server/services/schema-builder/schema-handler.mjs.map +1 -1
  167. package/dist/server/services/schema-mutation.js +46 -0
  168. package/dist/server/services/schema-mutation.js.map +1 -0
  169. package/dist/server/services/schema-mutation.mjs +43 -0
  170. package/dist/server/services/schema-mutation.mjs.map +1 -0
  171. package/dist/server/services/schema.js +134 -79
  172. package/dist/server/services/schema.js.map +1 -1
  173. package/dist/server/services/schema.mjs +135 -80
  174. package/dist/server/services/schema.mjs.map +1 -1
  175. package/dist/server/src/controllers/schema.d.ts.map +1 -1
  176. package/dist/server/src/controllers/validation/common.d.ts +1 -0
  177. package/dist/server/src/controllers/validation/common.d.ts.map +1 -1
  178. package/dist/server/src/controllers/validation/content-structure.d.ts +56 -0
  179. package/dist/server/src/controllers/validation/content-structure.d.ts.map +1 -0
  180. package/dist/server/src/controllers/validation/schema.d.ts +35 -0
  181. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  182. package/dist/server/src/index.d.ts +3 -0
  183. package/dist/server/src/index.d.ts.map +1 -1
  184. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  185. package/dist/server/src/services/api-handler.d.ts +13 -1
  186. package/dist/server/src/services/api-handler.d.ts.map +1 -1
  187. package/dist/server/src/services/content-structure.d.ts +37 -0
  188. package/dist/server/src/services/content-structure.d.ts.map +1 -0
  189. package/dist/server/src/services/content-types.d.ts +4 -0
  190. package/dist/server/src/services/content-types.d.ts.map +1 -1
  191. package/dist/server/src/services/index.d.ts +4 -0
  192. package/dist/server/src/services/index.d.ts.map +1 -1
  193. package/dist/server/src/services/schema-builder/index.d.ts +3 -1
  194. package/dist/server/src/services/schema-builder/index.d.ts.map +1 -1
  195. package/dist/server/src/services/schema-builder/schema-handler.d.ts.map +1 -1
  196. package/dist/server/src/services/schema-mutation.d.ts +26 -0
  197. package/dist/server/src/services/schema-mutation.d.ts.map +1 -0
  198. package/dist/server/src/services/schema.d.ts +1 -0
  199. package/dist/server/src/services/schema.d.ts.map +1 -1
  200. package/dist/server/src/utils/index.d.ts +2 -0
  201. package/dist/server/src/utils/index.d.ts.map +1 -1
  202. package/dist/server/utils/index.js.map +1 -1
  203. package/dist/server/utils/index.mjs.map +1 -1
  204. package/package.json +8 -8
  205. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +0 -157
  206. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +0 -1
  207. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs +0 -151
  208. package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +0 -1
@@ -2,10 +2,23 @@ import _ from 'lodash';
2
2
  import { getOr } from 'lodash/fp';
3
3
  import { errors, contentTypes } from '@strapi/utils';
4
4
  import { formatAttributes, replaceTemporaryUIDs } from '../utils/attributes.mjs';
5
+ import { getService } from '../utils/index.mjs';
5
6
  import createBuilder from './schema-builder/index.mjs';
7
+ import { rollbackSchemaMutation, finalizeSchemaMutation } from './schema-mutation.mjs';
6
8
  import { coreUids, pluginsUids } from './constants.mjs';
7
9
 
8
10
  const { ApplicationError } = errors;
11
+ const isCTBOwnedApplicationContentType = (uid)=>uid.startsWith('api::');
12
+ const assertCTBOwnedApplicationContentType = (uid)=>{
13
+ if (!isCTBOwnedApplicationContentType(uid)) {
14
+ throw new ApplicationError(`Content type "${uid}" is not managed by CTB and cannot be deleted`);
15
+ }
16
+ };
17
+ const pruneFolderReferences = (uids)=>{
18
+ return getService('content-structure').commitFromUpdate({
19
+ deletedUids: new Set(uids)
20
+ });
21
+ };
9
22
  const isContentTypeVisible = (model)=>getOr(true, 'pluginOptions.content-type-builder.visible', model) === true;
10
23
  const getRestrictRelationsTo = (contentType)=>{
11
24
  const { uid } = contentType;
@@ -47,12 +60,36 @@ const getRestrictRelationsTo = (contentType)=>{
47
60
  const createContentTypes = async (contentTypes)=>{
48
61
  const builder = createBuilder();
49
62
  const createdContentTypes = [];
50
- for (const contentType of contentTypes){
51
- createdContentTypes.push(await createContentType(contentType, {
52
- defaultBuilder: builder
53
- }));
63
+ const generatedApiNames = [];
64
+ let schemaAlreadyRolledBack = false;
65
+ try {
66
+ for (const contentType of contentTypes){
67
+ createdContentTypes.push(await createContentType(contentType, {
68
+ defaultBuilder: builder,
69
+ generatedApiNames,
70
+ deferEvent: true
71
+ }));
72
+ }
73
+ const schemaFilesWritten = await builder.writeFiles();
74
+ if (!schemaFilesWritten) {
75
+ schemaAlreadyRolledBack = true;
76
+ throw new ApplicationError('Invalid schema edition');
77
+ }
78
+ } catch (error) {
79
+ const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
80
+ await rollbackSchemaMutation({
81
+ builder,
82
+ apiHandler,
83
+ generatedApiNames,
84
+ schemaAlreadyRolledBack
85
+ });
86
+ throw error;
87
+ }
88
+ for (const contentType of createdContentTypes){
89
+ strapi.eventHub.emit('content-type.create', {
90
+ contentType
91
+ });
54
92
  }
55
- await builder.writeFiles();
56
93
  return createdContentTypes;
57
94
  };
58
95
  /**
@@ -79,19 +116,43 @@ const createContentTypes = async (contentTypes)=>{
79
116
  }
80
117
  return builder.editComponent(options);
81
118
  });
82
- // generate api skeleton
83
- await generateAPI({
84
- displayName: contentType.displayName || contentType.info.displayName,
85
- singularName: contentType.singularName,
86
- pluralName: contentType.pluralName,
87
- kind: contentType.kind
88
- });
89
- if (!options.defaultBuilder) {
90
- await builder.writeFiles();
119
+ const generatedApiNames = options.generatedApiNames ?? [];
120
+ let schemaAlreadyRolledBack = false;
121
+ try {
122
+ // Generate before writing the schema so a successful mutation retains the existing layout.
123
+ if (!contentType.plugin) {
124
+ generatedApiNames.push(contentType.singularName);
125
+ await generateAPI({
126
+ displayName: contentType.displayName || contentType.info.displayName,
127
+ singularName: contentType.singularName,
128
+ pluralName: contentType.pluralName,
129
+ kind: contentType.kind
130
+ });
131
+ }
132
+ if (!options.defaultBuilder) {
133
+ const schemaFilesWritten = await builder.writeFiles();
134
+ if (!schemaFilesWritten) {
135
+ schemaAlreadyRolledBack = true;
136
+ throw new ApplicationError('Invalid schema edition');
137
+ }
138
+ }
139
+ } catch (error) {
140
+ if (!options.defaultBuilder) {
141
+ const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
142
+ await rollbackSchemaMutation({
143
+ builder,
144
+ apiHandler,
145
+ generatedApiNames,
146
+ schemaAlreadyRolledBack
147
+ });
148
+ }
149
+ throw error;
150
+ }
151
+ if (!options.deferEvent) {
152
+ strapi.eventHub.emit('content-type.create', {
153
+ contentType: newContentType
154
+ });
91
155
  }
92
- strapi.eventHub.emit('content-type.create', {
93
- contentType: newContentType
94
- });
95
156
  return newContentType;
96
157
  };
97
158
  /**
@@ -117,6 +178,7 @@ const createContentTypes = async (contentTypes)=>{
117
178
  */ const editContentType = async (uid, { contentType, components = [] })=>{
118
179
  const builder = createBuilder();
119
180
  const previousSchema = builder.contentTypes.get(uid).schema;
181
+ const isPluginContentType = Boolean(builder.contentTypes.get(uid).plugin);
120
182
  const previousKind = previousSchema.kind;
121
183
  const newKind = contentType.kind || previousKind;
122
184
  // Restore non-visible attributes from previous schema
@@ -147,21 +209,48 @@ const createContentTypes = async (contentTypes)=>{
147
209
  return builder.editComponent(replaceTmpUIDs(component));
148
210
  });
149
211
  if (newKind !== previousKind) {
212
+ let schemaAlreadyRolledBack = false;
150
213
  const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
151
214
  await apiHandler.backup(uid);
152
215
  try {
153
- await apiHandler.clear(uid);
154
- // generate new api skeleton
155
- await generateAPI({
156
- displayName: updatedContentType.schema.info.displayName,
157
- singularName: updatedContentType.schema.info.singularName,
158
- pluralName: updatedContentType.schema.info.pluralName,
159
- kind: updatedContentType.schema.kind
216
+ await apiHandler.clear(uid, {
217
+ preserveBackup: true
160
218
  });
161
- await builder.writeFiles();
219
+ if (!isPluginContentType) {
220
+ // generate new api skeleton
221
+ await generateAPI({
222
+ displayName: updatedContentType.schema.info.displayName,
223
+ singularName: updatedContentType.schema.info.singularName,
224
+ pluralName: updatedContentType.schema.info.pluralName,
225
+ kind: updatedContentType.schema.kind
226
+ });
227
+ }
228
+ const schemaFilesWritten = await builder.writeFiles();
229
+ if (!schemaFilesWritten) {
230
+ schemaAlreadyRolledBack = true;
231
+ throw new ApplicationError('Invalid schema edition');
232
+ }
233
+ await pruneFolderReferences([
234
+ uid
235
+ ]);
162
236
  } catch (error) {
237
+ await rollbackSchemaMutation({
238
+ builder,
239
+ apiHandler,
240
+ backedUpApiUids: [
241
+ uid
242
+ ],
243
+ schemaAlreadyRolledBack
244
+ });
245
+ throw error;
246
+ }
247
+ for (const error of (await finalizeSchemaMutation({
248
+ apiHandler,
249
+ backedUpApiUids: [
250
+ uid
251
+ ]
252
+ }))){
163
253
  strapi.log.error(error);
164
- await apiHandler.rollback(uid);
165
254
  }
166
255
  return updatedContentType;
167
256
  }
@@ -172,42 +261,103 @@ const createContentTypes = async (contentTypes)=>{
172
261
  return updatedContentType;
173
262
  };
174
263
  const deleteContentTypes = async (uids)=>{
264
+ uids.forEach(assertCTBOwnedApplicationContentType);
175
265
  const builder = createBuilder();
176
266
  const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
177
- for (const uid of uids){
178
- await deleteContentType(uid, builder);
179
- }
180
- await builder.writeFiles();
181
- for (const uid of uids){
182
- try {
183
- await apiHandler.clear(uid);
184
- } catch (error) {
185
- strapi.log.error(error);
186
- await apiHandler.rollback(uid);
267
+ const deletedContentTypes = [];
268
+ const backedUpApiUids = [];
269
+ let schemaAlreadyRolledBack = false;
270
+ try {
271
+ for (const uid of uids){
272
+ await apiHandler.backup(uid);
273
+ backedUpApiUids.push(uid);
274
+ deletedContentTypes.push(builder.deleteContentType(uid));
275
+ }
276
+ const schemaFilesWritten = await builder.writeFiles();
277
+ if (!schemaFilesWritten) {
278
+ schemaAlreadyRolledBack = true;
279
+ throw new ApplicationError('Invalid schema edition');
280
+ }
281
+ for (const uid of uids){
282
+ await apiHandler.clear(uid, {
283
+ preserveBackup: true
284
+ });
187
285
  }
286
+ await pruneFolderReferences(uids);
287
+ } catch (error) {
288
+ await rollbackSchemaMutation({
289
+ builder,
290
+ apiHandler,
291
+ backedUpApiUids,
292
+ schemaAlreadyRolledBack
293
+ });
294
+ throw error;
295
+ }
296
+ for (const error of (await finalizeSchemaMutation({
297
+ apiHandler,
298
+ backedUpApiUids
299
+ }))){
300
+ strapi.log.error(error);
301
+ }
302
+ for (const contentType of deletedContentTypes){
303
+ strapi.eventHub.emit('content-type.delete', {
304
+ contentType
305
+ });
188
306
  }
189
307
  };
190
308
  /**
191
309
  * Deletes a content type and the api files related to it
192
310
  */ const deleteContentType = async (uid, defaultBuilder = undefined)=>{
311
+ assertCTBOwnedApplicationContentType(uid);
193
312
  const builder = defaultBuilder || createBuilder();
194
313
  // make a backup
195
314
  const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
196
315
  await apiHandler.backup(uid);
197
- const contentType = builder.deleteContentType(uid);
316
+ let contentType;
317
+ let schemaAlreadyRolledBack = false;
198
318
  if (!defaultBuilder) {
199
319
  try {
200
- await builder.writeFiles();
201
- await apiHandler.clear(uid);
202
- } catch {
203
- await apiHandler.rollback(uid);
320
+ contentType = builder.deleteContentType(uid);
321
+ const schemaFilesWritten = await builder.writeFiles();
322
+ if (!schemaFilesWritten) {
323
+ schemaAlreadyRolledBack = true;
324
+ throw new ApplicationError('Invalid schema edition');
325
+ }
326
+ await apiHandler.clear(uid, {
327
+ preserveBackup: true
328
+ });
329
+ await pruneFolderReferences([
330
+ uid
331
+ ]);
332
+ } catch (error) {
333
+ await rollbackSchemaMutation({
334
+ builder,
335
+ apiHandler,
336
+ backedUpApiUids: [
337
+ uid
338
+ ],
339
+ schemaAlreadyRolledBack
340
+ });
341
+ throw error;
204
342
  }
343
+ for (const error of (await finalizeSchemaMutation({
344
+ apiHandler,
345
+ backedUpApiUids: [
346
+ uid
347
+ ]
348
+ }))){
349
+ strapi.log.error(error);
350
+ }
351
+ } else {
352
+ contentType = builder.deleteContentType(uid);
353
+ }
354
+ if (!defaultBuilder) {
355
+ strapi.eventHub.emit('content-type.delete', {
356
+ contentType
357
+ });
205
358
  }
206
- strapi.eventHub.emit('content-type.delete', {
207
- contentType
208
- });
209
359
  return contentType;
210
360
  };
211
361
 
212
- export { createContentType, createContentTypes, deleteContentType, deleteContentTypes, editContentType, formatContentType, generateAPI, getRestrictRelationsTo, isContentTypeVisible };
362
+ export { assertCTBOwnedApplicationContentType, createContentType, createContentTypes, deleteContentType, deleteContentTypes, editContentType, formatContentType, generateAPI, getRestrictRelationsTo, isCTBOwnedApplicationContentType, isContentTypeVisible };
213
363
  //# sourceMappingURL=content-types.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.mjs","sources":["../../../server/src/services/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { getOr } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { UID, Struct } from '@strapi/types';\nimport { formatAttributes, replaceTemporaryUIDs } from '../utils/attributes';\nimport createBuilder from './schema-builder';\nimport { coreUids, pluginsUids } from './constants';\n\nconst { ApplicationError } = errors;\n\nexport const isContentTypeVisible = (model: Struct.ContentTypeSchema) =>\n getOr(true, 'pluginOptions.content-type-builder.visible', model) === true;\n\nexport const getRestrictRelationsTo = (contentType: Struct.ContentTypeSchema) => {\n const { uid } = contentType;\n if (uid === coreUids.STRAPI_USER) {\n // TODO: replace with an obj { relation: 'x', bidirectional: true|false }\n return ['oneWay', 'manyWay'];\n }\n\n if (\n uid.startsWith(coreUids.PREFIX) ||\n uid === pluginsUids.UPLOAD_FILE ||\n !isContentTypeVisible(contentType)\n ) {\n return [];\n }\n\n return null;\n};\n\n/**\n * Format a contentType info to be used by the front-end\n */\nexport const formatContentType = (contentType: any) => {\n const { uid, kind, modelName, plugin, collectionName, info } = contentType;\n\n return {\n uid,\n plugin,\n apiID: modelName,\n schema: {\n ...contentTypesUtils.getOptions(contentType),\n displayName: info.displayName,\n singularName: info.singularName,\n pluralName: info.pluralName,\n description: _.get(info, 'description', ''),\n pluginOptions: contentType.pluginOptions,\n kind: kind || 'collectionType',\n collectionName,\n attributes: formatAttributes(contentType),\n visible: isContentTypeVisible(contentType),\n restrictRelationsTo: getRestrictRelationsTo(contentType),\n },\n };\n};\n\nexport const createContentTypes = async (contentTypes: any[]) => {\n const builder = createBuilder();\n const createdContentTypes: any[] = [];\n\n for (const contentType of contentTypes) {\n createdContentTypes.push(await createContentType(contentType, { defaultBuilder: builder }));\n }\n\n await builder.writeFiles();\n\n return createdContentTypes;\n};\n\ntype CreateContentTypeOptions = {\n defaultBuilder?: any; // TODO\n};\n\n/**\n * Creates a content type and handle the nested components sent with it\n */\nexport const createContentType = async (\n { contentType, components }: any,\n options: CreateContentTypeOptions = {}\n) => {\n const builder = options.defaultBuilder || createBuilder();\n const uidMap = builder.createNewComponentUIDMap(components || []);\n\n const replaceTmpUIDs = replaceTemporaryUIDs(uidMap);\n\n const newContentType = builder.createContentType(replaceTmpUIDs(contentType));\n\n // allow components to target the new contentType\n const targetContentType = (infos: any) => {\n Object.keys(infos.attributes).forEach((key) => {\n const { target } = infos.attributes[key];\n if (target === '__contentType__') {\n infos.attributes[key].target = newContentType.uid;\n }\n });\n\n return infos;\n };\n\n components?.forEach((component: any) => {\n const options = replaceTmpUIDs(targetContentType(component));\n\n if (!_.has(component, 'uid')) {\n return builder.createComponent(options);\n }\n\n return builder.editComponent(options);\n });\n\n // generate api skeleton\n await generateAPI({\n displayName: contentType!.displayName || contentType!.info.displayName,\n singularName: contentType!.singularName,\n pluralName: contentType!.pluralName,\n kind: contentType!.kind,\n });\n\n if (!options.defaultBuilder) {\n await builder.writeFiles();\n }\n\n strapi.eventHub.emit('content-type.create', { contentType: newContentType });\n\n return newContentType;\n};\n\n/**\n * Generate an API skeleton\n */\nexport const generateAPI = ({\n singularName,\n kind = 'collectionType',\n pluralName,\n displayName,\n}: any) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const strapiGenerators = require('@strapi/generators');\n return strapiGenerators.generate(\n 'content-type',\n {\n kind,\n singularName,\n id: singularName,\n pluralName,\n displayName,\n destination: 'new',\n bootstrapApi: true,\n attributes: [],\n },\n { dir: strapi.dirs.app.root }\n );\n};\n\n/**\n * Edits a contentType and handle the nested contentTypes sent with it\n */\nexport const editContentType = async (\n uid: UID.ContentType,\n { contentType, components = [] }: any\n) => {\n const builder = createBuilder();\n\n const previousSchema = builder.contentTypes.get(uid).schema;\n const previousKind = previousSchema.kind;\n const newKind = contentType.kind || previousKind;\n\n // Restore non-visible attributes from previous schema\n const previousAttributes = previousSchema.attributes;\n const prevNonVisibleAttributes = contentTypesUtils\n .getNonVisibleAttributes(previousSchema)\n .reduce((acc, key) => {\n if (key in previousAttributes) {\n acc[key] = previousAttributes[key];\n }\n\n return acc;\n }, {} as any);\n contentType.attributes = _.merge(prevNonVisibleAttributes, contentType.attributes);\n\n if (newKind !== previousKind && newKind === 'singleType') {\n const entryCount = await strapi.db.query(uid).count();\n if (entryCount > 1) {\n throw new ApplicationError(\n 'You cannot convert a collectionType to a singleType when having multiple entries in DB'\n );\n }\n }\n\n const uidMap = builder.createNewComponentUIDMap(components);\n const replaceTmpUIDs = replaceTemporaryUIDs(uidMap);\n\n const updatedContentType = builder.editContentType({\n uid,\n ...replaceTmpUIDs(contentType),\n });\n\n components.forEach((component: any) => {\n if (!_.has(component, 'uid')) {\n return builder.createComponent(replaceTmpUIDs(component));\n }\n\n return builder.editComponent(replaceTmpUIDs(component));\n });\n\n if (newKind !== previousKind) {\n const apiHandler = strapi.plugin('content-type-builder').service('api-handler');\n await apiHandler.backup(uid);\n\n try {\n await apiHandler.clear(uid);\n\n // generate new api skeleton\n await generateAPI({\n displayName: updatedContentType.schema.info.displayName,\n singularName: updatedContentType.schema.info.singularName,\n pluralName: updatedContentType.schema.info.pluralName,\n kind: updatedContentType.schema.kind,\n });\n\n await builder.writeFiles();\n } catch (error) {\n strapi.log.error(error);\n await apiHandler.rollback(uid);\n }\n\n return updatedContentType;\n }\n\n await builder.writeFiles();\n\n strapi.eventHub.emit('content-type.update', { contentType: updatedContentType });\n\n return updatedContentType;\n};\n\nexport const deleteContentTypes = async (uids: UID.ContentType[]) => {\n const builder = createBuilder();\n const apiHandler = strapi.plugin('content-type-builder').service('api-handler');\n\n for (const uid of uids) {\n await deleteContentType(uid, builder);\n }\n\n await builder.writeFiles();\n for (const uid of uids) {\n try {\n await apiHandler.clear(uid);\n } catch (error) {\n strapi.log.error(error);\n await apiHandler.rollback(uid);\n }\n }\n};\n\n/**\n * Deletes a content type and the api files related to it\n */\nexport const deleteContentType = async (uid: UID.ContentType, defaultBuilder: any = undefined) => {\n const builder = defaultBuilder || createBuilder();\n // make a backup\n const apiHandler = strapi.plugin('content-type-builder').service('api-handler');\n await apiHandler.backup(uid);\n\n const contentType = builder.deleteContentType(uid);\n\n if (!defaultBuilder) {\n try {\n await builder.writeFiles();\n await apiHandler.clear(uid);\n } catch {\n await apiHandler.rollback(uid);\n }\n }\n\n strapi.eventHub.emit('content-type.delete', { contentType });\n\n return contentType;\n};\n"],"names":["ApplicationError","errors","isContentTypeVisible","model","getOr","getRestrictRelationsTo","contentType","uid","coreUids","STRAPI_USER","startsWith","PREFIX","pluginsUids","UPLOAD_FILE","formatContentType","kind","modelName","plugin","collectionName","info","apiID","schema","contentTypesUtils","getOptions","displayName","singularName","pluralName","description","_","get","pluginOptions","attributes","formatAttributes","visible","restrictRelationsTo","createContentTypes","contentTypes","builder","createBuilder","createdContentTypes","push","createContentType","defaultBuilder","writeFiles","components","options","uidMap","createNewComponentUIDMap","replaceTmpUIDs","replaceTemporaryUIDs","newContentType","targetContentType","infos","Object","keys","forEach","key","target","component","has","createComponent","editComponent","generateAPI","strapi","eventHub","emit","strapiGenerators","require","generate","id","destination","bootstrapApi","dir","dirs","app","root","editContentType","previousSchema","previousKind","newKind","previousAttributes","prevNonVisibleAttributes","getNonVisibleAttributes","reduce","acc","merge","entryCount","db","query","count","updatedContentType","apiHandler","service","backup","clear","error","log","rollback","deleteContentTypes","uids","deleteContentType","undefined"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.mjs","sources":["../../../server/src/services/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { getOr } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { UID, Struct } from '@strapi/types';\nimport { formatAttributes, replaceTemporaryUIDs } from '../utils/attributes';\nimport { getService } from '../utils';\nimport createBuilder from './schema-builder';\nimport { finalizeSchemaMutation, rollbackSchemaMutation } from './schema-mutation';\nimport { coreUids, pluginsUids } from './constants';\n\nconst { ApplicationError } = errors;\n\nexport const isCTBOwnedApplicationContentType = (uid: UID.ContentType): boolean =>\n uid.startsWith('api::');\n\nexport const assertCTBOwnedApplicationContentType = (uid: UID.ContentType): void => {\n if (!isCTBOwnedApplicationContentType(uid)) {\n throw new ApplicationError(`Content type \"${uid}\" is not managed by CTB and cannot be deleted`);\n }\n};\n\nconst pruneFolderReferences = (uids: UID.ContentType[]) => {\n return getService('content-structure').commitFromUpdate({ deletedUids: new Set(uids) });\n};\n\nexport const isContentTypeVisible = (model: Struct.ContentTypeSchema) =>\n getOr(true, 'pluginOptions.content-type-builder.visible', model) === true;\n\nexport const getRestrictRelationsTo = (contentType: Struct.ContentTypeSchema) => {\n const { uid } = contentType;\n if (uid === coreUids.STRAPI_USER) {\n // TODO: replace with an obj { relation: 'x', bidirectional: true|false }\n return ['oneWay', 'manyWay'];\n }\n\n if (\n uid.startsWith(coreUids.PREFIX) ||\n uid === pluginsUids.UPLOAD_FILE ||\n !isContentTypeVisible(contentType)\n ) {\n return [];\n }\n\n return null;\n};\n\n/**\n * Format a contentType info to be used by the front-end\n */\nexport const formatContentType = (contentType: any) => {\n const { uid, kind, modelName, plugin, collectionName, info } = contentType;\n\n return {\n uid,\n plugin,\n apiID: modelName,\n schema: {\n ...contentTypesUtils.getOptions(contentType),\n displayName: info.displayName,\n singularName: info.singularName,\n pluralName: info.pluralName,\n description: _.get(info, 'description', ''),\n pluginOptions: contentType.pluginOptions,\n kind: kind || 'collectionType',\n collectionName,\n attributes: formatAttributes(contentType),\n visible: isContentTypeVisible(contentType),\n restrictRelationsTo: getRestrictRelationsTo(contentType),\n },\n };\n};\n\nexport const createContentTypes = async (contentTypes: any[]) => {\n const builder = createBuilder();\n const createdContentTypes: any[] = [];\n const generatedApiNames: string[] = [];\n let schemaAlreadyRolledBack = false;\n\n try {\n for (const contentType of contentTypes) {\n createdContentTypes.push(\n await createContentType(contentType, {\n defaultBuilder: builder,\n generatedApiNames,\n deferEvent: true,\n })\n );\n }\n\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n } catch (error) {\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n generatedApiNames,\n schemaAlreadyRolledBack,\n });\n\n throw error;\n }\n\n for (const contentType of createdContentTypes) {\n strapi.eventHub.emit('content-type.create', { contentType });\n }\n\n return createdContentTypes;\n};\n\ntype CreateContentTypeOptions = {\n defaultBuilder?: any; // TODO\n generatedApiNames?: string[];\n deferEvent?: boolean;\n};\n\n/**\n * Creates a content type and handle the nested components sent with it\n */\nexport const createContentType = async (\n { contentType, components }: any,\n options: CreateContentTypeOptions = {}\n) => {\n const builder = options.defaultBuilder || createBuilder();\n const uidMap = builder.createNewComponentUIDMap(components || []);\n\n const replaceTmpUIDs = replaceTemporaryUIDs(uidMap);\n\n const newContentType = builder.createContentType(replaceTmpUIDs(contentType));\n\n // allow components to target the new contentType\n const targetContentType = (infos: any) => {\n Object.keys(infos.attributes).forEach((key) => {\n const { target } = infos.attributes[key];\n if (target === '__contentType__') {\n infos.attributes[key].target = newContentType.uid;\n }\n });\n\n return infos;\n };\n\n components?.forEach((component: any) => {\n const options = replaceTmpUIDs(targetContentType(component));\n\n if (!_.has(component, 'uid')) {\n return builder.createComponent(options);\n }\n\n return builder.editComponent(options);\n });\n\n const generatedApiNames = options.generatedApiNames ?? [];\n let schemaAlreadyRolledBack = false;\n\n try {\n // Generate before writing the schema so a successful mutation retains the existing layout.\n if (!contentType.plugin) {\n generatedApiNames.push(contentType.singularName);\n\n await generateAPI({\n displayName: contentType!.displayName || contentType!.info.displayName,\n singularName: contentType!.singularName,\n pluralName: contentType!.pluralName,\n kind: contentType!.kind,\n });\n }\n\n if (!options.defaultBuilder) {\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n }\n } catch (error) {\n if (!options.defaultBuilder) {\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n generatedApiNames,\n schemaAlreadyRolledBack,\n });\n }\n\n throw error;\n }\n\n if (!options.deferEvent) {\n strapi.eventHub.emit('content-type.create', { contentType: newContentType });\n }\n\n return newContentType;\n};\n\n/**\n * Generate an API skeleton\n */\nexport const generateAPI = ({\n singularName,\n kind = 'collectionType',\n pluralName,\n displayName,\n}: any) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const strapiGenerators = require('@strapi/generators');\n return strapiGenerators.generate(\n 'content-type',\n {\n kind,\n singularName,\n id: singularName,\n pluralName,\n displayName,\n destination: 'new',\n bootstrapApi: true,\n attributes: [],\n },\n { dir: strapi.dirs.app.root }\n );\n};\n\n/**\n * Edits a contentType and handle the nested contentTypes sent with it\n */\nexport const editContentType = async (\n uid: UID.ContentType,\n { contentType, components = [] }: any\n) => {\n const builder = createBuilder();\n\n const previousSchema = builder.contentTypes.get(uid).schema;\n const isPluginContentType = Boolean(builder.contentTypes.get(uid).plugin);\n const previousKind = previousSchema.kind;\n const newKind = contentType.kind || previousKind;\n\n // Restore non-visible attributes from previous schema\n const previousAttributes = previousSchema.attributes;\n const prevNonVisibleAttributes = contentTypesUtils\n .getNonVisibleAttributes(previousSchema)\n .reduce((acc, key) => {\n if (key in previousAttributes) {\n acc[key] = previousAttributes[key];\n }\n\n return acc;\n }, {} as any);\n contentType.attributes = _.merge(prevNonVisibleAttributes, contentType.attributes);\n\n if (newKind !== previousKind && newKind === 'singleType') {\n const entryCount = await strapi.db.query(uid).count();\n if (entryCount > 1) {\n throw new ApplicationError(\n 'You cannot convert a collectionType to a singleType when having multiple entries in DB'\n );\n }\n }\n\n const uidMap = builder.createNewComponentUIDMap(components);\n const replaceTmpUIDs = replaceTemporaryUIDs(uidMap);\n\n const updatedContentType = builder.editContentType({\n uid,\n ...replaceTmpUIDs(contentType),\n });\n\n components.forEach((component: any) => {\n if (!_.has(component, 'uid')) {\n return builder.createComponent(replaceTmpUIDs(component));\n }\n\n return builder.editComponent(replaceTmpUIDs(component));\n });\n\n if (newKind !== previousKind) {\n let schemaAlreadyRolledBack = false;\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n await apiHandler.backup(uid);\n\n try {\n await apiHandler.clear(uid, { preserveBackup: true });\n\n if (!isPluginContentType) {\n // generate new api skeleton\n await generateAPI({\n displayName: updatedContentType.schema.info.displayName,\n singularName: updatedContentType.schema.info.singularName,\n pluralName: updatedContentType.schema.info.pluralName,\n kind: updatedContentType.schema.kind,\n });\n }\n\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n await pruneFolderReferences([uid]);\n } catch (error) {\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n backedUpApiUids: [uid],\n schemaAlreadyRolledBack,\n });\n\n throw error;\n }\n\n for (const error of await finalizeSchemaMutation({ apiHandler, backedUpApiUids: [uid] })) {\n strapi.log.error(error);\n }\n\n return updatedContentType;\n }\n\n await builder.writeFiles();\n\n strapi.eventHub.emit('content-type.update', { contentType: updatedContentType });\n\n return updatedContentType;\n};\n\nexport const deleteContentTypes = async (uids: UID.ContentType[]) => {\n uids.forEach(assertCTBOwnedApplicationContentType);\n\n const builder = createBuilder();\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n\n const deletedContentTypes: any[] = [];\n const backedUpApiUids: UID.ContentType[] = [];\n let schemaAlreadyRolledBack = false;\n\n try {\n for (const uid of uids) {\n await apiHandler.backup(uid);\n backedUpApiUids.push(uid);\n deletedContentTypes.push(builder.deleteContentType(uid));\n }\n\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n\n for (const uid of uids) {\n await apiHandler.clear(uid, { preserveBackup: true });\n }\n\n await pruneFolderReferences(uids);\n } catch (error) {\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n backedUpApiUids,\n schemaAlreadyRolledBack,\n });\n\n throw error;\n }\n\n for (const error of await finalizeSchemaMutation({ apiHandler, backedUpApiUids })) {\n strapi.log.error(error);\n }\n\n for (const contentType of deletedContentTypes) {\n strapi.eventHub.emit('content-type.delete', { contentType });\n }\n};\n\n/**\n * Deletes a content type and the api files related to it\n */\nexport const deleteContentType = async (uid: UID.ContentType, defaultBuilder: any = undefined) => {\n assertCTBOwnedApplicationContentType(uid);\n\n const builder = defaultBuilder || createBuilder();\n // make a backup\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n await apiHandler.backup(uid);\n\n let contentType;\n let schemaAlreadyRolledBack = false;\n\n if (!defaultBuilder) {\n try {\n contentType = builder.deleteContentType(uid);\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n await apiHandler.clear(uid, { preserveBackup: true });\n await pruneFolderReferences([uid]);\n } catch (error) {\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n backedUpApiUids: [uid],\n schemaAlreadyRolledBack,\n });\n\n throw error;\n }\n\n for (const error of await finalizeSchemaMutation({ apiHandler, backedUpApiUids: [uid] })) {\n strapi.log.error(error);\n }\n } else {\n contentType = builder.deleteContentType(uid);\n }\n\n if (!defaultBuilder) {\n strapi.eventHub.emit('content-type.delete', { contentType });\n }\n\n return contentType;\n};\n"],"names":["ApplicationError","errors","isCTBOwnedApplicationContentType","uid","startsWith","assertCTBOwnedApplicationContentType","pruneFolderReferences","uids","getService","commitFromUpdate","deletedUids","Set","isContentTypeVisible","model","getOr","getRestrictRelationsTo","contentType","coreUids","STRAPI_USER","PREFIX","pluginsUids","UPLOAD_FILE","formatContentType","kind","modelName","plugin","collectionName","info","apiID","schema","contentTypesUtils","getOptions","displayName","singularName","pluralName","description","_","get","pluginOptions","attributes","formatAttributes","visible","restrictRelationsTo","createContentTypes","contentTypes","builder","createBuilder","createdContentTypes","generatedApiNames","schemaAlreadyRolledBack","push","createContentType","defaultBuilder","deferEvent","schemaFilesWritten","writeFiles","error","apiHandler","strapi","service","rollbackSchemaMutation","eventHub","emit","components","options","uidMap","createNewComponentUIDMap","replaceTmpUIDs","replaceTemporaryUIDs","newContentType","targetContentType","infos","Object","keys","forEach","key","target","component","has","createComponent","editComponent","generateAPI","strapiGenerators","require","generate","id","destination","bootstrapApi","dir","dirs","app","root","editContentType","previousSchema","isPluginContentType","Boolean","previousKind","newKind","previousAttributes","prevNonVisibleAttributes","getNonVisibleAttributes","reduce","acc","merge","entryCount","db","query","count","updatedContentType","backup","clear","preserveBackup","backedUpApiUids","finalizeSchemaMutation","log","deleteContentTypes","deletedContentTypes","deleteContentType","undefined"],"mappings":"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"}
@@ -6,6 +6,7 @@ var componentCategories = require('./component-categories.js');
6
6
  var builder = require('./builder.js');
7
7
  var apiHandler = require('./api-handler.js');
8
8
  var schema = require('./schema.js');
9
+ var contentStructure = require('./content-structure.js');
9
10
 
10
11
  var services = {
11
12
  'content-types': contentTypes,
@@ -13,7 +14,8 @@ var services = {
13
14
  'component-categories': componentCategories,
14
15
  builder,
15
16
  'api-handler': apiHandler,
16
- schema
17
+ schema,
18
+ 'content-structure': ({ strapi })=>contentStructure.createContentStructureService(strapi)
17
19
  };
18
20
 
19
21
  module.exports = services;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import * as contentTypes from './content-types';\nimport * as components from './components';\nimport * as componentCategories from './component-categories';\nimport * as builder from './builder';\nimport * as apiHandler from './api-handler';\nimport * as schema from './schema';\n\nexport default {\n 'content-types': contentTypes,\n components,\n 'component-categories': componentCategories,\n builder,\n 'api-handler': apiHandler,\n schema,\n};\n"],"names":["contentTypes","components","componentCategories","builder","apiHandler","schema"],"mappings":";;;;;;;;;AAOA,eAAe;IACb,eAAA,EAAiBA,YAAAA;AACjBC,IAAAA,UAAAA;IACA,sBAAA,EAAwBC,mBAAAA;AACxBC,IAAAA,OAAAA;IACA,aAAA,EAAeC,UAAAA;AACfC,IAAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport * as contentTypes from './content-types';\nimport * as components from './components';\nimport * as componentCategories from './component-categories';\nimport * as builder from './builder';\nimport * as apiHandler from './api-handler';\nimport * as schema from './schema';\nimport { createContentStructureService } from './content-structure';\n\nexport default {\n 'content-types': contentTypes,\n components,\n 'component-categories': componentCategories,\n builder,\n 'api-handler': apiHandler,\n schema,\n 'content-structure': ({ strapi }: { strapi: Core.Strapi }) =>\n createContentStructureService(strapi),\n};\n"],"names":["contentTypes","components","componentCategories","builder","apiHandler","schema","strapi","createContentStructureService"],"mappings":";;;;;;;;;;AAUA,eAAe;IACb,eAAA,EAAiBA,YAAAA;AACjBC,IAAAA,UAAAA;IACA,sBAAA,EAAwBC,mBAAAA;AACxBC,IAAAA,OAAAA;IACA,aAAA,EAAeC,UAAAA;AACfC,IAAAA,MAAAA;AACA,IAAA,mBAAA,EAAqB,CAAC,EAAEC,MAAM,EAA2B,GACvDC,8CAAAA,CAA8BD,MAAAA;AAClC,CAAA;;;;"}
@@ -4,6 +4,7 @@ import * as componentCategories from './component-categories.mjs';
4
4
  import * as builder from './builder.mjs';
5
5
  import * as apiHandler from './api-handler.mjs';
6
6
  import * as schema from './schema.mjs';
7
+ import { createContentStructureService } from './content-structure.mjs';
7
8
 
8
9
  var services = {
9
10
  'content-types': contentTypes,
@@ -11,7 +12,8 @@ var services = {
11
12
  'component-categories': componentCategories,
12
13
  builder,
13
14
  'api-handler': apiHandler,
14
- schema
15
+ schema,
16
+ 'content-structure': ({ strapi })=>createContentStructureService(strapi)
15
17
  };
16
18
 
17
19
  export { services as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import * as contentTypes from './content-types';\nimport * as components from './components';\nimport * as componentCategories from './component-categories';\nimport * as builder from './builder';\nimport * as apiHandler from './api-handler';\nimport * as schema from './schema';\n\nexport default {\n 'content-types': contentTypes,\n components,\n 'component-categories': componentCategories,\n builder,\n 'api-handler': apiHandler,\n schema,\n};\n"],"names":["contentTypes","components","componentCategories","builder","apiHandler","schema"],"mappings":";;;;;;;AAOA,eAAe;IACb,eAAA,EAAiBA,YAAAA;AACjBC,IAAAA,UAAAA;IACA,sBAAA,EAAwBC,mBAAAA;AACxBC,IAAAA,OAAAA;IACA,aAAA,EAAeC,UAAAA;AACfC,IAAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport * as contentTypes from './content-types';\nimport * as components from './components';\nimport * as componentCategories from './component-categories';\nimport * as builder from './builder';\nimport * as apiHandler from './api-handler';\nimport * as schema from './schema';\nimport { createContentStructureService } from './content-structure';\n\nexport default {\n 'content-types': contentTypes,\n components,\n 'component-categories': componentCategories,\n builder,\n 'api-handler': apiHandler,\n schema,\n 'content-structure': ({ strapi }: { strapi: Core.Strapi }) =>\n createContentStructureService(strapi),\n};\n"],"names":["contentTypes","components","componentCategories","builder","apiHandler","schema","strapi","createContentStructureService"],"mappings":";;;;;;;;AAUA,eAAe;IACb,eAAA,EAAiBA,YAAAA;AACjBC,IAAAA,UAAAA;IACA,sBAAA,EAAwBC,mBAAAA;AACxBC,IAAAA,OAAAA;IACA,aAAA,EAAeC,UAAAA;AACfC,IAAAA,MAAAA;AACA,IAAA,mBAAA,EAAqB,CAAC,EAAEC,MAAM,EAA2B,GACvDC,6BAAAA,CAA8BD,MAAAA;AAClC,CAAA;;;;"}
@@ -125,15 +125,17 @@ function createSchemaBuilder({ components, contentTypes }) {
125
125
  ...contentTypeBuilder(),
126
126
  /**
127
127
  * Write all type to files
128
+ * @returns boolean true if all files have been written correctly, false if an error occurred
129
+ * @throws ApplicationError if an error occurred and rollback failed
128
130
  */ writeFiles () {
129
131
  const schemas = [
130
132
  ...Array.from(tmpComponents.values()),
131
133
  ...Array.from(tmpContentTypes.values())
132
134
  ];
133
- return Promise.all(schemas.map((schema)=>schema.flush())).catch((error)=>{
135
+ return Promise.all(schemas.map((schema)=>schema.flush())).then(()=>true).catch((error)=>{
134
136
  strapi.log.error('Error writing schema files');
135
137
  strapi.log.error(error);
136
- return this.rollback();
138
+ return this.rollback().then(()=>false);
137
139
  }).catch((error)=>{
138
140
  strapi.log.error('Error rolling back schema files. You might need to fix your files manually');
139
141
  strapi.log.error(error);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../server/src/services/schema-builder/index.ts"],"sourcesContent":["import { join } from 'path';\nimport _ from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport createSchemaHandler from './schema-handler';\nimport createComponentBuilder from './component-builder';\nimport createContentTypeBuilder from './content-type-builder';\n\n/**\n * Creates a content type schema builder instance\n */\nexport default function createBuilder() {\n const components = Object.values(strapi.components).map((componentInput) => ({\n category: componentInput.category,\n modelName: componentInput.modelName,\n plugin: componentInput.modelName,\n uid: componentInput.uid,\n filename: componentInput.__filename__,\n dir: join(strapi.dirs.app.components, componentInput.category),\n schema: componentInput.__schema__,\n config: componentInput.config,\n }));\n\n const contentTypes = Object.values<any>(strapi.contentTypes).map((contentTypeInput) => {\n const dir = contentTypeInput.plugin\n ? join(\n strapi.dirs.app.extensions,\n contentTypeInput.plugin,\n 'content-types',\n contentTypeInput.info.singularName\n )\n : join(\n strapi.dirs.app.api,\n contentTypeInput.apiName,\n 'content-types',\n contentTypeInput.info.singularName\n );\n\n return {\n modelName: contentTypeInput.modelName,\n plugin: contentTypeInput.plugin,\n uid: contentTypeInput.uid,\n filename: 'schema.json',\n dir,\n schema: contentTypeInput.__schema__,\n config: contentTypeInput.config,\n };\n });\n\n return createSchemaBuilder({\n components,\n contentTypes,\n });\n}\n\ntype SchemaBuilderOptions = {\n components: any;\n contentTypes: any;\n};\n\nfunction createSchemaBuilder({ components, contentTypes }: SchemaBuilderOptions) {\n const tmpComponents = new Map();\n const tmpContentTypes = new Map();\n\n // init temporary ContentTypes\n Object.keys(contentTypes).forEach((key) => {\n tmpContentTypes.set(contentTypes[key].uid, createSchemaHandler(contentTypes[key]));\n });\n\n // init temporary components\n Object.keys(components).forEach((key) => {\n tmpComponents.set(components[key].uid, createSchemaHandler(components[key]));\n });\n\n return {\n get components() {\n return tmpComponents;\n },\n get contentTypes() {\n return tmpContentTypes;\n },\n\n /**\n * Convert Attributes received from the API to the right syntax\n */\n convertAttributes(attributes: any) {\n return Object.keys(attributes).reduce(\n (acc, key) => {\n acc[key] = this.convertAttribute(attributes[key]);\n return acc;\n },\n {} as Record<string, unknown>\n );\n },\n\n convertAttribute(attribute: any) {\n const { configurable, private: isPrivate, conditions } = attribute;\n\n const baseProperties = {\n private: isPrivate === true ? true : undefined,\n configurable: configurable === false ? false : undefined,\n // IMPORTANT: Preserve conditions only if they exist and are not undefined/null\n ...(conditions !== undefined && conditions !== null && { conditions }),\n };\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute, dominant, ...restOfProperties } = attribute;\n\n const attr = {\n type: 'relation',\n relation,\n target,\n ...restOfProperties,\n ...baseProperties,\n };\n\n // TODO: uncomment this when we pre-create empty types and targets exists if we create multiple types at once\n // if (target && !this.contentTypes.has(target)) {\n // throw new errors.ApplicationError(`target: ${target} does not exist`);\n // }\n\n if (_.isNil(targetAttribute)) {\n return attr;\n }\n\n if (['oneToOne', 'manyToMany'].includes(relation) && dominant === true) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToOne', 'manyToMany'].includes(relation) && dominant === false) {\n attr.mappedBy = targetAttribute;\n } else if (['oneToOne', 'manyToOne', 'manyToMany'].includes(relation)) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToMany'].includes(relation)) {\n attr.mappedBy = targetAttribute;\n }\n\n return attr;\n }\n\n return {\n ...attribute,\n ...baseProperties,\n };\n },\n\n ...createComponentBuilder(),\n ...createContentTypeBuilder(),\n\n /**\n * Write all type to files\n */\n writeFiles() {\n const schemas = [\n ...Array.from(tmpComponents.values()),\n ...Array.from(tmpContentTypes.values()),\n ];\n\n return Promise.all(schemas.map((schema) => schema.flush()))\n .catch((error) => {\n strapi.log.error('Error writing schema files');\n strapi.log.error(error);\n return this.rollback();\n })\n .catch((error) => {\n strapi.log.error(\n 'Error rolling back schema files. You might need to fix your files manually'\n );\n strapi.log.error(error);\n\n throw new errors.ApplicationError('Invalid schema edition');\n });\n },\n\n /**\n * rollback all files\n */\n rollback() {\n return Promise.all(\n [...Array.from(tmpComponents.values()), ...Array.from(tmpContentTypes.values())].map(\n (schema) => schema.rollback()\n )\n );\n },\n };\n}\n"],"names":["createBuilder","components","Object","values","strapi","map","componentInput","category","modelName","plugin","uid","filename","__filename__","dir","join","dirs","app","schema","__schema__","config","contentTypes","contentTypeInput","extensions","info","singularName","api","apiName","createSchemaBuilder","tmpComponents","Map","tmpContentTypes","keys","forEach","key","set","createSchemaHandler","convertAttributes","attributes","reduce","acc","convertAttribute","attribute","configurable","private","isPrivate","conditions","baseProperties","undefined","type","target","relation","targetAttribute","dominant","restOfProperties","attr","_","isNil","includes","inversedBy","mappedBy","createComponentBuilder","createContentTypeBuilder","writeFiles","schemas","Array","from","Promise","all","flush","catch","error","log","rollback","errors","ApplicationError"],"mappings":";;;;;;;;;;;;;AAQA;;AAEC,IACc,SAASA,aAAAA,GAAAA;IACtB,MAAMC,UAAAA,GAAaC,MAAAA,CAAOC,MAAM,CAACC,MAAAA,CAAOH,UAAU,CAAA,CAAEI,GAAG,CAAC,CAACC,cAAAA,IAAoB;AAC3EC,YAAAA,QAAAA,EAAUD,eAAeC,QAAQ;AACjCC,YAAAA,SAAAA,EAAWF,eAAeE,SAAS;AACnCC,YAAAA,MAAAA,EAAQH,eAAeE,SAAS;AAChCE,YAAAA,GAAAA,EAAKJ,eAAeI,GAAG;AACvBC,YAAAA,QAAAA,EAAUL,eAAeM,YAAY;YACrCC,GAAAA,EAAKC,SAAAA,CAAKV,OAAOW,IAAI,CAACC,GAAG,CAACf,UAAU,EAAEK,cAAAA,CAAeC,QAAQ,CAAA;AAC7DU,YAAAA,MAAAA,EAAQX,eAAeY,UAAU;AACjCC,YAAAA,MAAAA,EAAQb,eAAea;SACzB,CAAA,CAAA;IAEA,MAAMC,YAAAA,GAAelB,OAAOC,MAAM,CAAMC,OAAOgB,YAAY,CAAA,CAAEf,GAAG,CAAC,CAACgB,gBAAAA,GAAAA;AAChE,QAAA,MAAMR,MAAMQ,gBAAAA,CAAiBZ,MAAM,GAC/BK,SAAAA,CACEV,OAAOW,IAAI,CAACC,GAAG,CAACM,UAAU,EAC1BD,gBAAAA,CAAiBZ,MAAM,EACvB,iBACAY,gBAAAA,CAAiBE,IAAI,CAACC,YAAY,IAEpCV,SAAAA,CACEV,MAAAA,CAAOW,IAAI,CAACC,GAAG,CAACS,GAAG,EACnBJ,gBAAAA,CAAiBK,OAAO,EACxB,eAAA,EACAL,gBAAAA,CAAiBE,IAAI,CAACC,YAAY,CAAA;QAGxC,OAAO;AACLhB,YAAAA,SAAAA,EAAWa,iBAAiBb,SAAS;AACrCC,YAAAA,MAAAA,EAAQY,iBAAiBZ,MAAM;AAC/BC,YAAAA,GAAAA,EAAKW,iBAAiBX,GAAG;YACzBC,QAAAA,EAAU,aAAA;AACVE,YAAAA,GAAAA;AACAI,YAAAA,MAAAA,EAAQI,iBAAiBH,UAAU;AACnCC,YAAAA,MAAAA,EAAQE,iBAAiBF;AAC3B,SAAA;AACF,IAAA,CAAA,CAAA;AAEA,IAAA,OAAOQ,mBAAAA,CAAoB;AACzB1B,QAAAA,UAAAA;AACAmB,QAAAA;AACF,KAAA,CAAA;AACF;AAOA,SAASO,mBAAAA,CAAoB,EAAE1B,UAAU,EAAEmB,YAAY,EAAwB,EAAA;AAC7E,IAAA,MAAMQ,gBAAgB,IAAIC,GAAAA,EAAAA;AAC1B,IAAA,MAAMC,kBAAkB,IAAID,GAAAA,EAAAA;;AAG5B3B,IAAAA,MAAAA,CAAO6B,IAAI,CAACX,YAAAA,CAAAA,CAAcY,OAAO,CAAC,CAACC,GAAAA,GAAAA;QACjCH,eAAAA,CAAgBI,GAAG,CAACd,YAAY,CAACa,GAAAA,CAAI,CAACvB,GAAG,EAAEyB,aAAAA,CAAoBf,YAAY,CAACa,GAAAA,CAAI,CAAA,CAAA;AAClF,IAAA,CAAA,CAAA;;AAGA/B,IAAAA,MAAAA,CAAO6B,IAAI,CAAC9B,UAAAA,CAAAA,CAAY+B,OAAO,CAAC,CAACC,GAAAA,GAAAA;QAC/BL,aAAAA,CAAcM,GAAG,CAACjC,UAAU,CAACgC,GAAAA,CAAI,CAACvB,GAAG,EAAEyB,aAAAA,CAAoBlC,UAAU,CAACgC,GAAAA,CAAI,CAAA,CAAA;AAC5E,IAAA,CAAA,CAAA;IAEA,OAAO;AACL,QAAA,IAAIhC,UAAAA,CAAAA,GAAa;YACf,OAAO2B,aAAAA;AACT,QAAA,CAAA;AACA,QAAA,IAAIR,YAAAA,CAAAA,GAAe;YACjB,OAAOU,eAAAA;AACT,QAAA,CAAA;AAEA;;AAEC,QACDM,mBAAkBC,UAAe,EAAA;AAC/B,YAAA,OAAOnC,OAAO6B,IAAI,CAACM,YAAYC,MAAM,CACnC,CAACC,GAAAA,EAAKN,GAAAA,GAAAA;gBACJM,GAAG,CAACN,IAAI,GAAG,IAAI,CAACO,gBAAgB,CAACH,UAAU,CAACJ,GAAAA,CAAI,CAAA;gBAChD,OAAOM,GAAAA;AACT,YAAA,CAAA,EACA,EAAC,CAAA;AAEL,QAAA,CAAA;AAEAC,QAAAA,gBAAAA,CAAAA,CAAiBC,SAAc,EAAA;YAC7B,MAAM,EAAEC,YAAY,EAAEC,OAAAA,EAASC,SAAS,EAAEC,UAAU,EAAE,GAAGJ,SAAAA;AAEzD,YAAA,MAAMK,cAAAA,GAAiB;gBACrBH,OAAAA,EAASC,SAAAA,KAAc,OAAO,IAAA,GAAOG,SAAAA;gBACrCL,YAAAA,EAAcA,YAAAA,KAAiB,QAAQ,KAAA,GAAQK,SAAAA;;gBAE/C,GAAIF,UAAAA,KAAeE,SAAAA,IAAaF,UAAAA,KAAe,IAAA,IAAQ;AAAEA,oBAAAA;;AAC3D,aAAA;YAEA,IAAIJ,SAAAA,CAAUO,IAAI,KAAK,UAAA,EAAY;gBACjC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,eAAe,EAAEC,QAAQ,EAAE,GAAGC,gBAAAA,EAAkB,GAAGZ,SAAAA;AAE7E,gBAAA,MAAMa,IAAAA,GAAO;oBACXN,IAAAA,EAAM,UAAA;AACNE,oBAAAA,QAAAA;AACAD,oBAAAA,MAAAA;AACA,oBAAA,GAAGI,gBAAgB;AACnB,oBAAA,GAAGP;AACL,iBAAA;;;;;gBAOA,IAAIS,kBAAAA,CAAEC,KAAK,CAACL,eAAAA,CAAAA,EAAkB;oBAC5B,OAAOG,IAAAA;AACT,gBAAA;gBAEA,IAAI;AAAC,oBAAA,UAAA;AAAY,oBAAA;AAAa,iBAAA,CAACG,QAAQ,CAACP,QAAAA,CAAAA,IAAaE,QAAAA,KAAa,IAAA,EAAM;AACtEE,oBAAAA,IAAAA,CAAKI,UAAU,GAAGP,eAAAA;AACpB,gBAAA,CAAA,MAAO,IAAI;AAAC,oBAAA,UAAA;AAAY,oBAAA;AAAa,iBAAA,CAACM,QAAQ,CAACP,QAAAA,CAAAA,IAAaE,QAAAA,KAAa,KAAA,EAAO;AAC9EE,oBAAAA,IAAAA,CAAKK,QAAQ,GAAGR,eAAAA;AAClB,gBAAA,CAAA,MAAO,IAAI;AAAC,oBAAA,UAAA;AAAY,oBAAA,WAAA;AAAa,oBAAA;iBAAa,CAACM,QAAQ,CAACP,QAAAA,CAAAA,EAAW;AACrEI,oBAAAA,IAAAA,CAAKI,UAAU,GAAGP,eAAAA;AACpB,gBAAA,CAAA,MAAO,IAAI;AAAC,oBAAA;iBAAY,CAACM,QAAQ,CAACP,QAAAA,CAAAA,EAAW;AAC3CI,oBAAAA,IAAAA,CAAKK,QAAQ,GAAGR,eAAAA;AAClB,gBAAA;gBAEA,OAAOG,IAAAA;AACT,YAAA;YAEA,OAAO;AACL,gBAAA,GAAGb,SAAS;AACZ,gBAAA,GAAGK;AACL,aAAA;AACF,QAAA,CAAA;AAEA,QAAA,GAAGc,gBAAAA,EAAwB;AAC3B,QAAA,GAAGC,kBAAAA,EAA0B;AAE7B;;QAGAC,UAAAA,CAAAA,GAAAA;AACE,YAAA,MAAMC,OAAAA,GAAU;mBACXC,KAAAA,CAAMC,IAAI,CAACrC,aAAAA,CAAczB,MAAM,EAAA,CAAA;mBAC/B6D,KAAAA,CAAMC,IAAI,CAACnC,eAAAA,CAAgB3B,MAAM,EAAA;AACrC,aAAA;AAED,YAAA,OAAO+D,OAAAA,CAAQC,GAAG,CAACJ,OAAAA,CAAQ1D,GAAG,CAAC,CAACY,MAAAA,GAAWA,MAAAA,CAAOmD,KAAK,EAAA,CAAA,CAAA,CACpDC,KAAK,CAAC,CAACC,KAAAA,GAAAA;gBACNlE,MAAAA,CAAOmE,GAAG,CAACD,KAAK,CAAC,4BAAA,CAAA;gBACjBlE,MAAAA,CAAOmE,GAAG,CAACD,KAAK,CAACA,KAAAA,CAAAA;gBACjB,OAAO,IAAI,CAACE,QAAQ,EAAA;YACtB,CAAA,CAAA,CACCH,KAAK,CAAC,CAACC,KAAAA,GAAAA;gBACNlE,MAAAA,CAAOmE,GAAG,CAACD,KAAK,CACd,4EAAA,CAAA;gBAEFlE,MAAAA,CAAOmE,GAAG,CAACD,KAAK,CAACA,KAAAA,CAAAA;gBAEjB,MAAM,IAAIG,YAAAA,CAAOC,gBAAgB,CAAC,wBAAA,CAAA;AACpC,YAAA,CAAA,CAAA;AACJ,QAAA,CAAA;AAEA;;QAGAF,QAAAA,CAAAA,GAAAA;YACE,OAAON,OAAAA,CAAQC,GAAG,CAChB;mBAAIH,KAAAA,CAAMC,IAAI,CAACrC,aAAAA,CAAczB,MAAM,EAAA,CAAA;mBAAQ6D,KAAAA,CAAMC,IAAI,CAACnC,eAAAA,CAAgB3B,MAAM,EAAA;AAAI,aAAA,CAACE,GAAG,CAClF,CAACY,MAAAA,GAAWA,OAAOuD,QAAQ,EAAA,CAAA,CAAA;AAGjC,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/services/schema-builder/index.ts"],"sourcesContent":["import { join } from 'path';\nimport _ from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport createSchemaHandler from './schema-handler';\nimport createComponentBuilder from './component-builder';\nimport createContentTypeBuilder from './content-type-builder';\n\n/**\n * Creates a content type schema builder instance\n */\nexport default function createBuilder() {\n const components = Object.values(strapi.components).map((componentInput) => ({\n category: componentInput.category,\n modelName: componentInput.modelName,\n plugin: componentInput.modelName,\n uid: componentInput.uid,\n filename: componentInput.__filename__,\n dir: join(strapi.dirs.app.components, componentInput.category),\n schema: componentInput.__schema__,\n config: componentInput.config,\n }));\n\n const contentTypes = Object.values<any>(strapi.contentTypes).map((contentTypeInput) => {\n const dir = contentTypeInput.plugin\n ? join(\n strapi.dirs.app.extensions,\n contentTypeInput.plugin,\n 'content-types',\n contentTypeInput.info.singularName\n )\n : join(\n strapi.dirs.app.api,\n contentTypeInput.apiName,\n 'content-types',\n contentTypeInput.info.singularName\n );\n\n return {\n modelName: contentTypeInput.modelName,\n plugin: contentTypeInput.plugin,\n uid: contentTypeInput.uid,\n filename: 'schema.json',\n dir,\n schema: contentTypeInput.__schema__,\n config: contentTypeInput.config,\n };\n });\n\n return createSchemaBuilder({\n components,\n contentTypes,\n });\n}\n\ntype SchemaBuilderOptions = {\n components: any;\n contentTypes: any;\n};\n\nfunction createSchemaBuilder({ components, contentTypes }: SchemaBuilderOptions) {\n const tmpComponents = new Map();\n const tmpContentTypes = new Map();\n\n // init temporary ContentTypes\n Object.keys(contentTypes).forEach((key) => {\n tmpContentTypes.set(contentTypes[key].uid, createSchemaHandler(contentTypes[key]));\n });\n\n // init temporary components\n Object.keys(components).forEach((key) => {\n tmpComponents.set(components[key].uid, createSchemaHandler(components[key]));\n });\n\n return {\n get components() {\n return tmpComponents;\n },\n get contentTypes() {\n return tmpContentTypes;\n },\n\n /**\n * Convert Attributes received from the API to the right syntax\n */\n convertAttributes(attributes: any) {\n return Object.keys(attributes).reduce(\n (acc, key) => {\n acc[key] = this.convertAttribute(attributes[key]);\n return acc;\n },\n {} as Record<string, unknown>\n );\n },\n\n convertAttribute(attribute: any) {\n const { configurable, private: isPrivate, conditions } = attribute;\n\n const baseProperties = {\n private: isPrivate === true ? true : undefined,\n configurable: configurable === false ? false : undefined,\n // IMPORTANT: Preserve conditions only if they exist and are not undefined/null\n ...(conditions !== undefined && conditions !== null && { conditions }),\n };\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute, dominant, ...restOfProperties } = attribute;\n\n const attr = {\n type: 'relation',\n relation,\n target,\n ...restOfProperties,\n ...baseProperties,\n };\n\n // TODO: uncomment this when we pre-create empty types and targets exists if we create multiple types at once\n // if (target && !this.contentTypes.has(target)) {\n // throw new errors.ApplicationError(`target: ${target} does not exist`);\n // }\n\n if (_.isNil(targetAttribute)) {\n return attr;\n }\n\n if (['oneToOne', 'manyToMany'].includes(relation) && dominant === true) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToOne', 'manyToMany'].includes(relation) && dominant === false) {\n attr.mappedBy = targetAttribute;\n } else if (['oneToOne', 'manyToOne', 'manyToMany'].includes(relation)) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToMany'].includes(relation)) {\n attr.mappedBy = targetAttribute;\n }\n\n return attr;\n }\n\n return {\n ...attribute,\n ...baseProperties,\n };\n },\n\n ...createComponentBuilder(),\n ...createContentTypeBuilder(),\n\n /**\n * Write all type to files\n * @returns boolean true if all files have been written correctly, false if an error occurred\n * @throws ApplicationError if an error occurred and rollback failed\n */\n writeFiles() {\n const schemas = [\n ...Array.from(tmpComponents.values()),\n ...Array.from(tmpContentTypes.values()),\n ];\n\n return Promise.all(schemas.map((schema) => schema.flush()))\n .then(() => true)\n .catch((error) => {\n strapi.log.error('Error writing schema files');\n strapi.log.error(error);\n return this.rollback().then(() => false);\n })\n .catch((error) => {\n strapi.log.error(\n 'Error rolling back schema files. You might need to fix your files manually'\n );\n strapi.log.error(error);\n\n throw new errors.ApplicationError('Invalid schema edition');\n });\n },\n\n /**\n * rollback all files\n */\n rollback() {\n return Promise.all(\n [...Array.from(tmpComponents.values()), ...Array.from(tmpContentTypes.values())].map(\n (schema) => schema.rollback()\n )\n );\n },\n };\n}\n"],"names":["createBuilder","components","Object","values","strapi","map","componentInput","category","modelName","plugin","uid","filename","__filename__","dir","join","dirs","app","schema","__schema__","config","contentTypes","contentTypeInput","extensions","info","singularName","api","apiName","createSchemaBuilder","tmpComponents","Map","tmpContentTypes","keys","forEach","key","set","createSchemaHandler","convertAttributes","attributes","reduce","acc","convertAttribute","attribute","configurable","private","isPrivate","conditions","baseProperties","undefined","type","target","relation","targetAttribute","dominant","restOfProperties","attr","_","isNil","includes","inversedBy","mappedBy","createComponentBuilder","createContentTypeBuilder","writeFiles","schemas","Array","from","Promise","all","flush","then","catch","error","log","rollback","errors","ApplicationError"],"mappings":"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"}
@@ -119,15 +119,17 @@ function createSchemaBuilder({ components, contentTypes }) {
119
119
  ...createComponentBuilder(),
120
120
  /**
121
121
  * Write all type to files
122
+ * @returns boolean true if all files have been written correctly, false if an error occurred
123
+ * @throws ApplicationError if an error occurred and rollback failed
122
124
  */ writeFiles () {
123
125
  const schemas = [
124
126
  ...Array.from(tmpComponents.values()),
125
127
  ...Array.from(tmpContentTypes.values())
126
128
  ];
127
- return Promise.all(schemas.map((schema)=>schema.flush())).catch((error)=>{
129
+ return Promise.all(schemas.map((schema)=>schema.flush())).then(()=>true).catch((error)=>{
128
130
  strapi.log.error('Error writing schema files');
129
131
  strapi.log.error(error);
130
- return this.rollback();
132
+ return this.rollback().then(()=>false);
131
133
  }).catch((error)=>{
132
134
  strapi.log.error('Error rolling back schema files. You might need to fix your files manually');
133
135
  strapi.log.error(error);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../server/src/services/schema-builder/index.ts"],"sourcesContent":["import { join } from 'path';\nimport _ from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport createSchemaHandler from './schema-handler';\nimport createComponentBuilder from './component-builder';\nimport createContentTypeBuilder from './content-type-builder';\n\n/**\n * Creates a content type schema builder instance\n */\nexport default function createBuilder() {\n const components = Object.values(strapi.components).map((componentInput) => ({\n category: componentInput.category,\n modelName: componentInput.modelName,\n plugin: componentInput.modelName,\n uid: componentInput.uid,\n filename: componentInput.__filename__,\n dir: join(strapi.dirs.app.components, componentInput.category),\n schema: componentInput.__schema__,\n config: componentInput.config,\n }));\n\n const contentTypes = Object.values<any>(strapi.contentTypes).map((contentTypeInput) => {\n const dir = contentTypeInput.plugin\n ? join(\n strapi.dirs.app.extensions,\n contentTypeInput.plugin,\n 'content-types',\n contentTypeInput.info.singularName\n )\n : join(\n strapi.dirs.app.api,\n contentTypeInput.apiName,\n 'content-types',\n contentTypeInput.info.singularName\n );\n\n return {\n modelName: contentTypeInput.modelName,\n plugin: contentTypeInput.plugin,\n uid: contentTypeInput.uid,\n filename: 'schema.json',\n dir,\n schema: contentTypeInput.__schema__,\n config: contentTypeInput.config,\n };\n });\n\n return createSchemaBuilder({\n components,\n contentTypes,\n });\n}\n\ntype SchemaBuilderOptions = {\n components: any;\n contentTypes: any;\n};\n\nfunction createSchemaBuilder({ components, contentTypes }: SchemaBuilderOptions) {\n const tmpComponents = new Map();\n const tmpContentTypes = new Map();\n\n // init temporary ContentTypes\n Object.keys(contentTypes).forEach((key) => {\n tmpContentTypes.set(contentTypes[key].uid, createSchemaHandler(contentTypes[key]));\n });\n\n // init temporary components\n Object.keys(components).forEach((key) => {\n tmpComponents.set(components[key].uid, createSchemaHandler(components[key]));\n });\n\n return {\n get components() {\n return tmpComponents;\n },\n get contentTypes() {\n return tmpContentTypes;\n },\n\n /**\n * Convert Attributes received from the API to the right syntax\n */\n convertAttributes(attributes: any) {\n return Object.keys(attributes).reduce(\n (acc, key) => {\n acc[key] = this.convertAttribute(attributes[key]);\n return acc;\n },\n {} as Record<string, unknown>\n );\n },\n\n convertAttribute(attribute: any) {\n const { configurable, private: isPrivate, conditions } = attribute;\n\n const baseProperties = {\n private: isPrivate === true ? true : undefined,\n configurable: configurable === false ? false : undefined,\n // IMPORTANT: Preserve conditions only if they exist and are not undefined/null\n ...(conditions !== undefined && conditions !== null && { conditions }),\n };\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute, dominant, ...restOfProperties } = attribute;\n\n const attr = {\n type: 'relation',\n relation,\n target,\n ...restOfProperties,\n ...baseProperties,\n };\n\n // TODO: uncomment this when we pre-create empty types and targets exists if we create multiple types at once\n // if (target && !this.contentTypes.has(target)) {\n // throw new errors.ApplicationError(`target: ${target} does not exist`);\n // }\n\n if (_.isNil(targetAttribute)) {\n return attr;\n }\n\n if (['oneToOne', 'manyToMany'].includes(relation) && dominant === true) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToOne', 'manyToMany'].includes(relation) && dominant === false) {\n attr.mappedBy = targetAttribute;\n } else if (['oneToOne', 'manyToOne', 'manyToMany'].includes(relation)) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToMany'].includes(relation)) {\n attr.mappedBy = targetAttribute;\n }\n\n return attr;\n }\n\n return {\n ...attribute,\n ...baseProperties,\n };\n },\n\n ...createComponentBuilder(),\n ...createContentTypeBuilder(),\n\n /**\n * Write all type to files\n */\n writeFiles() {\n const schemas = [\n ...Array.from(tmpComponents.values()),\n ...Array.from(tmpContentTypes.values()),\n ];\n\n return Promise.all(schemas.map((schema) => schema.flush()))\n .catch((error) => {\n strapi.log.error('Error writing schema files');\n strapi.log.error(error);\n return this.rollback();\n })\n .catch((error) => {\n strapi.log.error(\n 'Error rolling back schema files. You might need to fix your files manually'\n );\n strapi.log.error(error);\n\n throw new errors.ApplicationError('Invalid schema edition');\n });\n },\n\n /**\n * rollback all files\n */\n rollback() {\n return Promise.all(\n [...Array.from(tmpComponents.values()), ...Array.from(tmpContentTypes.values())].map(\n (schema) => schema.rollback()\n )\n );\n },\n };\n}\n"],"names":["createBuilder","components","Object","values","strapi","map","componentInput","category","modelName","plugin","uid","filename","__filename__","dir","join","dirs","app","schema","__schema__","config","contentTypes","contentTypeInput","extensions","info","singularName","api","apiName","createSchemaBuilder","tmpComponents","Map","tmpContentTypes","keys","forEach","key","set","createSchemaHandler","convertAttributes","attributes","reduce","acc","convertAttribute","attribute","configurable","private","isPrivate","conditions","baseProperties","undefined","type","target","relation","targetAttribute","dominant","restOfProperties","attr","_","isNil","includes","inversedBy","mappedBy","createComponentBuilder","createContentTypeBuilder","writeFiles","schemas","Array","from","Promise","all","flush","catch","error","log","rollback","errors","ApplicationError"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/services/schema-builder/index.ts"],"sourcesContent":["import { join } from 'path';\nimport _ from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport createSchemaHandler from './schema-handler';\nimport createComponentBuilder from './component-builder';\nimport createContentTypeBuilder from './content-type-builder';\n\n/**\n * Creates a content type schema builder instance\n */\nexport default function createBuilder() {\n const components = Object.values(strapi.components).map((componentInput) => ({\n category: componentInput.category,\n modelName: componentInput.modelName,\n plugin: componentInput.modelName,\n uid: componentInput.uid,\n filename: componentInput.__filename__,\n dir: join(strapi.dirs.app.components, componentInput.category),\n schema: componentInput.__schema__,\n config: componentInput.config,\n }));\n\n const contentTypes = Object.values<any>(strapi.contentTypes).map((contentTypeInput) => {\n const dir = contentTypeInput.plugin\n ? join(\n strapi.dirs.app.extensions,\n contentTypeInput.plugin,\n 'content-types',\n contentTypeInput.info.singularName\n )\n : join(\n strapi.dirs.app.api,\n contentTypeInput.apiName,\n 'content-types',\n contentTypeInput.info.singularName\n );\n\n return {\n modelName: contentTypeInput.modelName,\n plugin: contentTypeInput.plugin,\n uid: contentTypeInput.uid,\n filename: 'schema.json',\n dir,\n schema: contentTypeInput.__schema__,\n config: contentTypeInput.config,\n };\n });\n\n return createSchemaBuilder({\n components,\n contentTypes,\n });\n}\n\ntype SchemaBuilderOptions = {\n components: any;\n contentTypes: any;\n};\n\nfunction createSchemaBuilder({ components, contentTypes }: SchemaBuilderOptions) {\n const tmpComponents = new Map();\n const tmpContentTypes = new Map();\n\n // init temporary ContentTypes\n Object.keys(contentTypes).forEach((key) => {\n tmpContentTypes.set(contentTypes[key].uid, createSchemaHandler(contentTypes[key]));\n });\n\n // init temporary components\n Object.keys(components).forEach((key) => {\n tmpComponents.set(components[key].uid, createSchemaHandler(components[key]));\n });\n\n return {\n get components() {\n return tmpComponents;\n },\n get contentTypes() {\n return tmpContentTypes;\n },\n\n /**\n * Convert Attributes received from the API to the right syntax\n */\n convertAttributes(attributes: any) {\n return Object.keys(attributes).reduce(\n (acc, key) => {\n acc[key] = this.convertAttribute(attributes[key]);\n return acc;\n },\n {} as Record<string, unknown>\n );\n },\n\n convertAttribute(attribute: any) {\n const { configurable, private: isPrivate, conditions } = attribute;\n\n const baseProperties = {\n private: isPrivate === true ? true : undefined,\n configurable: configurable === false ? false : undefined,\n // IMPORTANT: Preserve conditions only if they exist and are not undefined/null\n ...(conditions !== undefined && conditions !== null && { conditions }),\n };\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute, dominant, ...restOfProperties } = attribute;\n\n const attr = {\n type: 'relation',\n relation,\n target,\n ...restOfProperties,\n ...baseProperties,\n };\n\n // TODO: uncomment this when we pre-create empty types and targets exists if we create multiple types at once\n // if (target && !this.contentTypes.has(target)) {\n // throw new errors.ApplicationError(`target: ${target} does not exist`);\n // }\n\n if (_.isNil(targetAttribute)) {\n return attr;\n }\n\n if (['oneToOne', 'manyToMany'].includes(relation) && dominant === true) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToOne', 'manyToMany'].includes(relation) && dominant === false) {\n attr.mappedBy = targetAttribute;\n } else if (['oneToOne', 'manyToOne', 'manyToMany'].includes(relation)) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToMany'].includes(relation)) {\n attr.mappedBy = targetAttribute;\n }\n\n return attr;\n }\n\n return {\n ...attribute,\n ...baseProperties,\n };\n },\n\n ...createComponentBuilder(),\n ...createContentTypeBuilder(),\n\n /**\n * Write all type to files\n * @returns boolean true if all files have been written correctly, false if an error occurred\n * @throws ApplicationError if an error occurred and rollback failed\n */\n writeFiles() {\n const schemas = [\n ...Array.from(tmpComponents.values()),\n ...Array.from(tmpContentTypes.values()),\n ];\n\n return Promise.all(schemas.map((schema) => schema.flush()))\n .then(() => true)\n .catch((error) => {\n strapi.log.error('Error writing schema files');\n strapi.log.error(error);\n return this.rollback().then(() => false);\n })\n .catch((error) => {\n strapi.log.error(\n 'Error rolling back schema files. You might need to fix your files manually'\n );\n strapi.log.error(error);\n\n throw new errors.ApplicationError('Invalid schema edition');\n });\n },\n\n /**\n * rollback all files\n */\n rollback() {\n return Promise.all(\n [...Array.from(tmpComponents.values()), ...Array.from(tmpContentTypes.values())].map(\n (schema) => schema.rollback()\n )\n );\n },\n };\n}\n"],"names":["createBuilder","components","Object","values","strapi","map","componentInput","category","modelName","plugin","uid","filename","__filename__","dir","join","dirs","app","schema","__schema__","config","contentTypes","contentTypeInput","extensions","info","singularName","api","apiName","createSchemaBuilder","tmpComponents","Map","tmpContentTypes","keys","forEach","key","set","createSchemaHandler","convertAttributes","attributes","reduce","acc","convertAttribute","attribute","configurable","private","isPrivate","conditions","baseProperties","undefined","type","target","relation","targetAttribute","dominant","restOfProperties","attr","_","isNil","includes","inversedBy","mappedBy","createComponentBuilder","createContentTypeBuilder","writeFiles","schemas","Array","from","Promise","all","flush","then","catch","error","log","rollback","errors","ApplicationError"],"mappings":"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"}