@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
@@ -11,6 +11,18 @@ var path__default = /*#__PURE__*/_interopDefault(path);
11
11
  var fse__default = /*#__PURE__*/_interopDefault(fse);
12
12
  var ___default = /*#__PURE__*/_interopDefault(_);
13
13
 
14
+ const removeDirectoryIfEmpty = async (dir)=>{
15
+ try {
16
+ const list = await fse__default.default.readdir(dir);
17
+ if (list.length === 0) {
18
+ await fse__default.default.remove(dir);
19
+ }
20
+ } catch (error) {
21
+ if (error.code !== 'ENOENT') {
22
+ throw error;
23
+ }
24
+ }
25
+ };
14
26
  function createSchemaHandler(infos) {
15
27
  const { category, modelName, plugin, uid, dir, filename, schema } = infos;
16
28
  const initialState = {
@@ -185,10 +197,7 @@ function createSchemaHandler(infos) {
185
197
  const filePath = path__default.default.join(state.dir, state.filename);
186
198
  if (deleted) {
187
199
  await fse__default.default.remove(initialPath);
188
- const list = await fse__default.default.readdir(initialState.dir);
189
- if (list.length === 0) {
190
- await fse__default.default.remove(initialState.dir);
191
- }
200
+ await removeDirectoryIfEmpty(initialState.dir);
192
201
  return;
193
202
  }
194
203
  if (modified) {
@@ -201,17 +210,16 @@ function createSchemaHandler(infos) {
201
210
  options: state.schema.options,
202
211
  pluginOptions: state.schema.pluginOptions,
203
212
  attributes: state.schema.attributes,
204
- config: state.schema.config
213
+ config: state.schema.config,
214
+ indexes: state.schema.indexes,
215
+ foreignKeys: state.schema.foreignKeys
205
216
  }, {
206
217
  spaces: 2
207
218
  });
208
219
  // remove from oldPath
209
220
  if (initialPath !== filePath) {
210
221
  await fse__default.default.remove(initialPath);
211
- const list = await fse__default.default.readdir(initialState.dir);
212
- if (list.length === 0) {
213
- await fse__default.default.remove(initialState.dir);
214
- }
222
+ await removeDirectoryIfEmpty(initialState.dir);
215
223
  }
216
224
  return;
217
225
  }
@@ -227,10 +235,7 @@ function createSchemaHandler(infos) {
227
235
  // it was a creation so it needs to be deleted
228
236
  if (!initialState.uid) {
229
237
  await fse__default.default.remove(filePath);
230
- const list = await fse__default.default.readdir(state.dir);
231
- if (list.length === 0) {
232
- await fse__default.default.remove(state.dir);
233
- }
238
+ await removeDirectoryIfEmpty(state.dir);
234
239
  return;
235
240
  }
236
241
  if (modified || deleted) {
@@ -241,10 +246,7 @@ function createSchemaHandler(infos) {
241
246
  // remove
242
247
  if (initialPath !== filePath) {
243
248
  await fse__default.default.remove(filePath);
244
- const list = await fse__default.default.readdir(state.dir);
245
- if (list.length === 0) {
246
- await fse__default.default.remove(state.dir);
247
- }
249
+ await removeDirectoryIfEmpty(state.dir);
248
250
  }
249
251
  }
250
252
  return Promise.resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"schema-handler.js","sources":["../../../../server/src/services/schema-builder/schema-handler.ts"],"sourcesContent":["import path from 'path';\nimport type { Internal, Struct } from '@strapi/types';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\n\nimport { isConfigurable } from '../../utils/attributes';\n\nexport type Infos = {\n category?: string;\n modelName?: string;\n plugin?: string;\n uid?: Internal.UID.ContentType;\n dir: string;\n filename: string;\n schema?: Struct.ContentTypeSchema;\n};\n\nexport type SchemaHandler = ReturnType<typeof createSchemaHandler>;\n\nexport default function createSchemaHandler(infos: Infos) {\n const { category, modelName, plugin, uid, dir, filename, schema } = infos;\n\n const initialState = {\n modelName,\n plugin,\n category,\n uid,\n dir,\n filename,\n schema:\n schema ||\n ({\n info: {},\n options: {},\n attributes: {},\n } as Struct.ContentTypeSchema),\n };\n\n const state = _.cloneDeep(initialState);\n\n // always keep it the same to rollback\n Object.freeze(initialState.schema);\n\n let modified = false;\n let deleted = false;\n\n return {\n get modelName() {\n return initialState.modelName;\n },\n\n get plugin() {\n return initialState.plugin;\n },\n\n get category() {\n return initialState.category;\n },\n\n get kind() {\n return _.get(state.schema, 'kind', 'collectionType');\n },\n\n get uid() {\n return state.uid;\n },\n\n get writable() {\n return _.get(state, 'plugin') !== 'admin';\n },\n\n setUID(val: Internal.UID.ContentType) {\n modified = true;\n\n state.uid = val;\n return this;\n },\n\n setDir(val: string) {\n modified = true;\n\n state.dir = val;\n return this;\n },\n\n get schema() {\n return _.cloneDeep(state.schema);\n },\n\n setSchema(val: Struct.ContentTypeSchema) {\n modified = true;\n\n state.schema = _.cloneDeep(val);\n return this;\n },\n\n // get a particular path inside the schema\n get(path: string[]) {\n return _.get(state.schema, path);\n },\n\n // set a particular path inside the schema\n set(path: string[] | string, val: unknown) {\n if (!state.schema) return this;\n\n modified = true;\n\n const value = _.defaultTo(val, _.get(state.schema, path));\n _.set(state.schema, path, value);\n\n return this;\n },\n\n // delete a particular path inside the schema\n unset(path: string[]) {\n modified = true;\n\n _.unset(state.schema, path);\n\n return this;\n },\n\n delete() {\n deleted = true;\n return this;\n },\n\n getAttribute(key: string) {\n return this.get(['attributes', key]);\n },\n\n setAttribute(key: string, attribute: any) {\n return this.set(['attributes', key], attribute);\n },\n\n deleteAttribute(key: string) {\n return this.unset(['attributes', key]);\n },\n\n setAttributes(newAttributes: Struct.SchemaAttributes) {\n if (!this.schema) return this;\n\n // delete old configurable attributes\n for (const key in this.schema.attributes) {\n if (isConfigurable((this.schema.attributes as any)[key])) {\n this.deleteAttribute(key);\n }\n }\n\n // set new Attributes\n for (const key of Object.keys(newAttributes)) {\n this.setAttribute(key, newAttributes[key as keyof Struct.SchemaAttributes]);\n }\n\n return this;\n },\n\n removeContentType(uid: Internal.UID.ContentType) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attribute = attributes[key];\n\n if (attribute.target === uid) {\n this.deleteAttribute(key);\n }\n });\n\n return this;\n },\n\n // utils\n removeComponent(uid: Internal.UID.Component) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attr = attributes[key];\n\n if (attr.type === 'component' && attr.component === uid) {\n this.deleteAttribute(key);\n }\n\n if (\n attr.type === 'dynamiczone' &&\n Array.isArray(attr.components) &&\n attr.components.includes(uid)\n ) {\n const updatedComponentList = attributes[key].components.filter(\n (val: string) => val !== uid\n );\n this.set(['attributes', key, 'components'], updatedComponentList);\n }\n });\n\n return this;\n },\n\n updateComponent(uid: Internal.UID.Component, newUID: Internal.UID.Component) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attr = attributes[key];\n\n if (attr.type === 'component' && attr.component === uid) {\n this.set(['attributes', key, 'component'], newUID);\n }\n\n if (\n attr.type === 'dynamiczone' &&\n Array.isArray(attr.components) &&\n attr.components.includes(uid)\n ) {\n const updatedComponentList = attr.components.map((val: string) =>\n val === uid ? newUID : val\n );\n\n this.set(['attributes', key, 'components'], updatedComponentList);\n }\n });\n\n return this;\n },\n\n // save the schema to disk\n async flush() {\n if (!this.writable) {\n return;\n }\n\n const initialPath = path.join(initialState.dir, initialState.filename);\n const filePath = path.join(state.dir, state.filename);\n\n if (deleted) {\n await fse.remove(initialPath);\n\n const list = await fse.readdir(initialState.dir);\n if (list.length === 0) {\n await fse.remove(initialState.dir);\n }\n\n return;\n }\n\n if (modified) {\n if (!state.schema) return Promise.resolve();\n\n await fse.ensureFile(filePath);\n\n await fse.writeJSON(\n filePath,\n {\n kind: state.schema.kind,\n collectionName: state.schema.collectionName,\n info: state.schema.info,\n options: state.schema.options,\n pluginOptions: state.schema.pluginOptions,\n attributes: state.schema.attributes,\n config: (state.schema as any).config,\n },\n { spaces: 2 }\n );\n\n // remove from oldPath\n if (initialPath !== filePath) {\n await fse.remove(initialPath);\n\n const list = await fse.readdir(initialState.dir);\n if (list.length === 0) {\n await fse.remove(initialState.dir);\n }\n }\n\n return;\n }\n\n return Promise.resolve();\n },\n\n // reset the schema to its initial value\n async rollback() {\n if (!this.writable) {\n return;\n }\n\n const initialPath = path.join(initialState.dir, initialState.filename);\n const filePath = path.join(state.dir, state.filename);\n\n // it was a creation so it needs to be deleted\n if (!initialState.uid) {\n await fse.remove(filePath);\n\n const list = await fse.readdir(state.dir);\n if (list.length === 0) {\n await fse.remove(state.dir);\n }\n return;\n }\n\n if (modified || deleted) {\n await fse.ensureFile(initialPath);\n await fse.writeJSON(initialPath, initialState.schema, { spaces: 2 });\n\n // remove\n if (initialPath !== filePath) {\n await fse.remove(filePath);\n\n const list = await fse.readdir(state.dir);\n if (list.length === 0) {\n await fse.remove(state.dir);\n }\n }\n }\n\n return Promise.resolve();\n },\n };\n}\n"],"names":["createSchemaHandler","infos","category","modelName","plugin","uid","dir","filename","schema","initialState","info","options","attributes","state","_","cloneDeep","Object","freeze","modified","deleted","kind","get","writable","setUID","val","setDir","setSchema","path","set","value","defaultTo","unset","delete","getAttribute","key","setAttribute","attribute","deleteAttribute","setAttributes","newAttributes","isConfigurable","keys","removeContentType","forEach","target","removeComponent","attr","type","component","Array","isArray","components","includes","updatedComponentList","filter","updateComponent","newUID","map","flush","initialPath","join","filePath","fse","remove","list","readdir","length","Promise","resolve","ensureFile","writeJSON","collectionName","pluginOptions","config","spaces","rollback"],"mappings":";;;;;;;;;;;;;AAmBe,SAASA,oBAAoBC,KAAY,EAAA;AACtD,IAAA,MAAM,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,MAAM,EAAEC,GAAG,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,MAAM,EAAE,GAAGP,KAAAA;AAEpE,IAAA,MAAMQ,YAAAA,GAAe;AACnBN,QAAAA,SAAAA;AACAC,QAAAA,MAAAA;AACAF,QAAAA,QAAAA;AACAG,QAAAA,GAAAA;AACAC,QAAAA,GAAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,MAAAA,EACEA,MAAAA,IACC;AACCE,YAAAA,IAAAA,EAAM,EAAC;AACPC,YAAAA,OAAAA,EAAS,EAAC;AACVC,YAAAA,UAAAA,EAAY;AACd;AACJ,KAAA;IAEA,MAAMC,KAAAA,GAAQC,kBAAAA,CAAEC,SAAS,CAACN,YAAAA,CAAAA;;IAG1BO,MAAAA,CAAOC,MAAM,CAACR,YAAAA,CAAaD,MAAM,CAAA;AAEjC,IAAA,IAAIU,QAAAA,GAAW,KAAA;AACf,IAAA,IAAIC,OAAAA,GAAU,KAAA;IAEd,OAAO;AACL,QAAA,IAAIhB,SAAAA,CAAAA,GAAY;AACd,YAAA,OAAOM,aAAaN,SAAS;AAC/B,QAAA,CAAA;AAEA,QAAA,IAAIC,MAAAA,CAAAA,GAAS;AACX,YAAA,OAAOK,aAAaL,MAAM;AAC5B,QAAA,CAAA;AAEA,QAAA,IAAIF,QAAAA,CAAAA,GAAW;AACb,YAAA,OAAOO,aAAaP,QAAQ;AAC9B,QAAA,CAAA;AAEA,QAAA,IAAIkB,IAAAA,CAAAA,GAAO;AACT,YAAA,OAAON,mBAAEO,GAAG,CAACR,KAAAA,CAAML,MAAM,EAAE,MAAA,EAAQ,gBAAA,CAAA;AACrC,QAAA,CAAA;AAEA,QAAA,IAAIH,GAAAA,CAAAA,GAAM;AACR,YAAA,OAAOQ,MAAMR,GAAG;AAClB,QAAA,CAAA;AAEA,QAAA,IAAIiB,QAAAA,CAAAA,GAAW;AACb,YAAA,OAAOR,kBAAAA,CAAEO,GAAG,CAACR,KAAAA,EAAO,QAAA,CAAA,KAAc,OAAA;AACpC,QAAA,CAAA;AAEAU,QAAAA,MAAAA,CAAAA,CAAOC,GAA6B,EAAA;YAClCN,QAAAA,GAAW,IAAA;AAEXL,YAAAA,KAAAA,CAAMR,GAAG,GAAGmB,GAAAA;AACZ,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAC,QAAAA,MAAAA,CAAAA,CAAOD,GAAW,EAAA;YAChBN,QAAAA,GAAW,IAAA;AAEXL,YAAAA,KAAAA,CAAMP,GAAG,GAAGkB,GAAAA;AACZ,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEA,QAAA,IAAIhB,MAAAA,CAAAA,GAAS;AACX,YAAA,OAAOM,kBAAAA,CAAEC,SAAS,CAACF,KAAAA,CAAML,MAAM,CAAA;AACjC,QAAA,CAAA;AAEAkB,QAAAA,SAAAA,CAAAA,CAAUF,GAA6B,EAAA;YACrCN,QAAAA,GAAW,IAAA;AAEXL,YAAAA,KAAAA,CAAML,MAAM,GAAGM,kBAAAA,CAAEC,SAAS,CAACS,GAAAA,CAAAA;AAC3B,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;;AAGAH,QAAAA,GAAAA,CAAAA,CAAIM,IAAc,EAAA;AAChB,YAAA,OAAOb,kBAAAA,CAAEO,GAAG,CAACR,KAAAA,CAAML,MAAM,EAAEmB,IAAAA,CAAAA;AAC7B,QAAA,CAAA;;QAGAC,GAAAA,CAAAA,CAAID,IAAuB,EAAEH,GAAY,EAAA;AACvC,YAAA,IAAI,CAACX,KAAAA,CAAML,MAAM,EAAE,OAAO,IAAI;YAE9BU,QAAAA,GAAW,IAAA;YAEX,MAAMW,KAAAA,GAAQf,kBAAAA,CAAEgB,SAAS,CAACN,GAAAA,EAAKV,mBAAEO,GAAG,CAACR,KAAAA,CAAML,MAAM,EAAEmB,IAAAA,CAAAA,CAAAA;AACnDb,YAAAA,kBAAAA,CAAEc,GAAG,CAACf,KAAAA,CAAML,MAAM,EAAEmB,IAAAA,EAAME,KAAAA,CAAAA;AAE1B,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;;AAGAE,QAAAA,KAAAA,CAAAA,CAAMJ,IAAc,EAAA;YAClBT,QAAAA,GAAW,IAAA;AAEXJ,YAAAA,kBAAAA,CAAEiB,KAAK,CAAClB,KAAAA,CAAML,MAAM,EAAEmB,IAAAA,CAAAA;AAEtB,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAK,QAAAA,MAAAA,CAAAA,GAAAA;YACEb,OAAAA,GAAU,IAAA;AACV,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAc,QAAAA,YAAAA,CAAAA,CAAaC,GAAW,EAAA;YACtB,OAAO,IAAI,CAACb,GAAG,CAAC;AAAC,gBAAA,YAAA;AAAca,gBAAAA;AAAI,aAAA,CAAA;AACrC,QAAA,CAAA;QAEAC,YAAAA,CAAAA,CAAaD,GAAW,EAAEE,SAAc,EAAA;YACtC,OAAO,IAAI,CAACR,GAAG,CAAC;AAAC,gBAAA,YAAA;AAAcM,gBAAAA;aAAI,EAAEE,SAAAA,CAAAA;AACvC,QAAA,CAAA;AAEAC,QAAAA,eAAAA,CAAAA,CAAgBH,GAAW,EAAA;YACzB,OAAO,IAAI,CAACH,KAAK,CAAC;AAAC,gBAAA,YAAA;AAAcG,gBAAAA;AAAI,aAAA,CAAA;AACvC,QAAA,CAAA;AAEAI,QAAAA,aAAAA,CAAAA,CAAcC,aAAsC,EAAA;AAClD,YAAA,IAAI,CAAC,IAAI,CAAC/B,MAAM,EAAE,OAAO,IAAI;;AAG7B,YAAA,IAAK,MAAM0B,GAAAA,IAAO,IAAI,CAAC1B,MAAM,CAACI,UAAU,CAAE;gBACxC,IAAI4B,yBAAAA,CAAe,IAAK,CAAChC,MAAM,CAACI,UAAkB,CAACsB,GAAAA,CAAI,CAAA,EAAG;oBACxD,IAAI,CAACG,eAAe,CAACH,GAAAA,CAAAA;AACvB,gBAAA;AACF,YAAA;;AAGA,YAAA,KAAK,MAAMA,GAAAA,IAAOlB,MAAAA,CAAOyB,IAAI,CAACF,aAAAA,CAAAA,CAAgB;AAC5C,gBAAA,IAAI,CAACJ,YAAY,CAACD,GAAAA,EAAKK,aAAa,CAACL,GAAAA,CAAqC,CAAA;AAC5E,YAAA;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAQ,QAAAA,iBAAAA,CAAAA,CAAkBrC,GAA6B,EAAA;AAC7C,YAAA,IAAI,CAACQ,KAAAA,CAAML,MAAM,EAAE,OAAO,IAAI;AAE9B,YAAA,MAAMI,UAAAA,GAAaC,KAAAA,CAAML,MAAM,CAACI,UAAU;AAE1CI,YAAAA,MAAAA,CAAOyB,IAAI,CAAC7B,UAAAA,CAAAA,CAAY+B,OAAO,CAAC,CAACT,GAAAA,GAAAA;gBAC/B,MAAME,SAAAA,GAAYxB,UAAU,CAACsB,GAAAA,CAAI;gBAEjC,IAAIE,SAAAA,CAAUQ,MAAM,KAAKvC,GAAAA,EAAK;oBAC5B,IAAI,CAACgC,eAAe,CAACH,GAAAA,CAAAA;AACvB,gBAAA;AACF,YAAA,CAAA,CAAA;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;;AAGAW,QAAAA,eAAAA,CAAAA,CAAgBxC,GAA2B,EAAA;AACzC,YAAA,IAAI,CAACQ,KAAAA,CAAML,MAAM,EAAE,OAAO,IAAI;AAE9B,YAAA,MAAMI,UAAAA,GAAaC,KAAAA,CAAML,MAAM,CAACI,UAAU;AAE1CI,YAAAA,MAAAA,CAAOyB,IAAI,CAAC7B,UAAAA,CAAAA,CAAY+B,OAAO,CAAC,CAACT,GAAAA,GAAAA;gBAC/B,MAAMY,IAAAA,GAAOlC,UAAU,CAACsB,GAAAA,CAAI;AAE5B,gBAAA,IAAIY,KAAKC,IAAI,KAAK,eAAeD,IAAAA,CAAKE,SAAS,KAAK3C,GAAAA,EAAK;oBACvD,IAAI,CAACgC,eAAe,CAACH,GAAAA,CAAAA;AACvB,gBAAA;AAEA,gBAAA,IACEY,IAAAA,CAAKC,IAAI,KAAK,aAAA,IACdE,MAAMC,OAAO,CAACJ,IAAAA,CAAKK,UAAU,KAC7BL,IAAAA,CAAKK,UAAU,CAACC,QAAQ,CAAC/C,GAAAA,CAAAA,EACzB;oBACA,MAAMgD,oBAAAA,GAAuBzC,UAAU,CAACsB,GAAAA,CAAI,CAACiB,UAAU,CAACG,MAAM,CAC5D,CAAC9B,GAAAA,GAAgBA,GAAAA,KAAQnB,GAAAA,CAAAA;oBAE3B,IAAI,CAACuB,GAAG,CAAC;AAAC,wBAAA,YAAA;AAAcM,wBAAAA,GAAAA;AAAK,wBAAA;qBAAa,EAAEmB,oBAAAA,CAAAA;AAC9C,gBAAA;AACF,YAAA,CAAA,CAAA;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;QAEAE,eAAAA,CAAAA,CAAgBlD,GAA2B,EAAEmD,MAA8B,EAAA;AACzE,YAAA,IAAI,CAAC3C,KAAAA,CAAML,MAAM,EAAE,OAAO,IAAI;AAE9B,YAAA,MAAMI,UAAAA,GAAaC,KAAAA,CAAML,MAAM,CAACI,UAAU;AAE1CI,YAAAA,MAAAA,CAAOyB,IAAI,CAAC7B,UAAAA,CAAAA,CAAY+B,OAAO,CAAC,CAACT,GAAAA,GAAAA;gBAC/B,MAAMY,IAAAA,GAAOlC,UAAU,CAACsB,GAAAA,CAAI;AAE5B,gBAAA,IAAIY,KAAKC,IAAI,KAAK,eAAeD,IAAAA,CAAKE,SAAS,KAAK3C,GAAAA,EAAK;oBACvD,IAAI,CAACuB,GAAG,CAAC;AAAC,wBAAA,YAAA;AAAcM,wBAAAA,GAAAA;AAAK,wBAAA;qBAAY,EAAEsB,MAAAA,CAAAA;AAC7C,gBAAA;AAEA,gBAAA,IACEV,IAAAA,CAAKC,IAAI,KAAK,aAAA,IACdE,MAAMC,OAAO,CAACJ,IAAAA,CAAKK,UAAU,KAC7BL,IAAAA,CAAKK,UAAU,CAACC,QAAQ,CAAC/C,GAAAA,CAAAA,EACzB;oBACA,MAAMgD,oBAAAA,GAAuBP,IAAAA,CAAKK,UAAU,CAACM,GAAG,CAAC,CAACjC,GAAAA,GAChDA,GAAAA,KAAQnB,GAAAA,GAAMmD,MAAAA,GAAShC,GAAAA,CAAAA;oBAGzB,IAAI,CAACI,GAAG,CAAC;AAAC,wBAAA,YAAA;AAAcM,wBAAAA,GAAAA;AAAK,wBAAA;qBAAa,EAAEmB,oBAAAA,CAAAA;AAC9C,gBAAA;AACF,YAAA,CAAA,CAAA;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;;QAGA,MAAMK,KAAAA,CAAAA,GAAAA;AACJ,YAAA,IAAI,CAAC,IAAI,CAACpC,QAAQ,EAAE;AAClB,gBAAA;AACF,YAAA;YAEA,MAAMqC,WAAAA,GAAchC,sBAAKiC,IAAI,CAACnD,aAAaH,GAAG,EAAEG,aAAaF,QAAQ,CAAA;YACrE,MAAMsD,QAAAA,GAAWlC,sBAAKiC,IAAI,CAAC/C,MAAMP,GAAG,EAAEO,MAAMN,QAAQ,CAAA;AAEpD,YAAA,IAAIY,OAAAA,EAAS;gBACX,MAAM2C,oBAAAA,CAAIC,MAAM,CAACJ,WAAAA,CAAAA;AAEjB,gBAAA,MAAMK,OAAO,MAAMF,oBAAAA,CAAIG,OAAO,CAACxD,aAAaH,GAAG,CAAA;gBAC/C,IAAI0D,IAAAA,CAAKE,MAAM,KAAK,CAAA,EAAG;AACrB,oBAAA,MAAMJ,oBAAAA,CAAIC,MAAM,CAACtD,YAAAA,CAAaH,GAAG,CAAA;AACnC,gBAAA;AAEA,gBAAA;AACF,YAAA;AAEA,YAAA,IAAIY,QAAAA,EAAU;AACZ,gBAAA,IAAI,CAACL,KAAAA,CAAML,MAAM,EAAE,OAAO2D,QAAQC,OAAO,EAAA;gBAEzC,MAAMN,oBAAAA,CAAIO,UAAU,CAACR,QAAAA,CAAAA;gBAErB,MAAMC,oBAAAA,CAAIQ,SAAS,CACjBT,QAAAA,EACA;oBACEzC,IAAAA,EAAMP,KAAAA,CAAML,MAAM,CAACY,IAAI;oBACvBmD,cAAAA,EAAgB1D,KAAAA,CAAML,MAAM,CAAC+D,cAAc;oBAC3C7D,IAAAA,EAAMG,KAAAA,CAAML,MAAM,CAACE,IAAI;oBACvBC,OAAAA,EAASE,KAAAA,CAAML,MAAM,CAACG,OAAO;oBAC7B6D,aAAAA,EAAe3D,KAAAA,CAAML,MAAM,CAACgE,aAAa;oBACzC5D,UAAAA,EAAYC,KAAAA,CAAML,MAAM,CAACI,UAAU;AACnC6D,oBAAAA,MAAAA,EAAQ,KAAC5D,CAAML,MAAM,CAASiE;iBAChC,EACA;oBAAEC,MAAAA,EAAQ;AAAE,iBAAA,CAAA;;AAId,gBAAA,IAAIf,gBAAgBE,QAAAA,EAAU;oBAC5B,MAAMC,oBAAAA,CAAIC,MAAM,CAACJ,WAAAA,CAAAA;AAEjB,oBAAA,MAAMK,OAAO,MAAMF,oBAAAA,CAAIG,OAAO,CAACxD,aAAaH,GAAG,CAAA;oBAC/C,IAAI0D,IAAAA,CAAKE,MAAM,KAAK,CAAA,EAAG;AACrB,wBAAA,MAAMJ,oBAAAA,CAAIC,MAAM,CAACtD,YAAAA,CAAaH,GAAG,CAAA;AACnC,oBAAA;AACF,gBAAA;AAEA,gBAAA;AACF,YAAA;AAEA,YAAA,OAAO6D,QAAQC,OAAO,EAAA;AACxB,QAAA,CAAA;;QAGA,MAAMO,QAAAA,CAAAA,GAAAA;AACJ,YAAA,IAAI,CAAC,IAAI,CAACrD,QAAQ,EAAE;AAClB,gBAAA;AACF,YAAA;YAEA,MAAMqC,WAAAA,GAAchC,sBAAKiC,IAAI,CAACnD,aAAaH,GAAG,EAAEG,aAAaF,QAAQ,CAAA;YACrE,MAAMsD,QAAAA,GAAWlC,sBAAKiC,IAAI,CAAC/C,MAAMP,GAAG,EAAEO,MAAMN,QAAQ,CAAA;;YAGpD,IAAI,CAACE,YAAAA,CAAaJ,GAAG,EAAE;gBACrB,MAAMyD,oBAAAA,CAAIC,MAAM,CAACF,QAAAA,CAAAA;AAEjB,gBAAA,MAAMG,OAAO,MAAMF,oBAAAA,CAAIG,OAAO,CAACpD,MAAMP,GAAG,CAAA;gBACxC,IAAI0D,IAAAA,CAAKE,MAAM,KAAK,CAAA,EAAG;AACrB,oBAAA,MAAMJ,oBAAAA,CAAIC,MAAM,CAAClD,KAAAA,CAAMP,GAAG,CAAA;AAC5B,gBAAA;AACA,gBAAA;AACF,YAAA;AAEA,YAAA,IAAIY,YAAYC,OAAAA,EAAS;gBACvB,MAAM2C,oBAAAA,CAAIO,UAAU,CAACV,WAAAA,CAAAA;AACrB,gBAAA,MAAMG,qBAAIQ,SAAS,CAACX,WAAAA,EAAalD,YAAAA,CAAaD,MAAM,EAAE;oBAAEkE,MAAAA,EAAQ;AAAE,iBAAA,CAAA;;AAGlE,gBAAA,IAAIf,gBAAgBE,QAAAA,EAAU;oBAC5B,MAAMC,oBAAAA,CAAIC,MAAM,CAACF,QAAAA,CAAAA;AAEjB,oBAAA,MAAMG,OAAO,MAAMF,oBAAAA,CAAIG,OAAO,CAACpD,MAAMP,GAAG,CAAA;oBACxC,IAAI0D,IAAAA,CAAKE,MAAM,KAAK,CAAA,EAAG;AACrB,wBAAA,MAAMJ,oBAAAA,CAAIC,MAAM,CAAClD,KAAAA,CAAMP,GAAG,CAAA;AAC5B,oBAAA;AACF,gBAAA;AACF,YAAA;AAEA,YAAA,OAAO6D,QAAQC,OAAO,EAAA;AACxB,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"schema-handler.js","sources":["../../../../server/src/services/schema-builder/schema-handler.ts"],"sourcesContent":["import path from 'path';\nimport type { Internal, Struct } from '@strapi/types';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\n\nimport { isConfigurable } from '../../utils/attributes';\n\nexport type Infos = {\n category?: string;\n modelName?: string;\n plugin?: string;\n uid?: Internal.UID.ContentType;\n dir: string;\n filename: string;\n schema?: Struct.ContentTypeSchema;\n};\n\nexport type SchemaHandler = ReturnType<typeof createSchemaHandler>;\n\nconst removeDirectoryIfEmpty = async (dir: string) => {\n try {\n const list = await fse.readdir(dir);\n if (list.length === 0) {\n await fse.remove(dir);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n};\n\nexport default function createSchemaHandler(infos: Infos) {\n const { category, modelName, plugin, uid, dir, filename, schema } = infos;\n\n const initialState = {\n modelName,\n plugin,\n category,\n uid,\n dir,\n filename,\n schema:\n schema ||\n ({\n info: {},\n options: {},\n attributes: {},\n } as Struct.ContentTypeSchema),\n };\n\n const state = _.cloneDeep(initialState);\n\n // always keep it the same to rollback\n Object.freeze(initialState.schema);\n\n let modified = false;\n let deleted = false;\n\n return {\n get modelName() {\n return initialState.modelName;\n },\n\n get plugin() {\n return initialState.plugin;\n },\n\n get category() {\n return initialState.category;\n },\n\n get kind() {\n return _.get(state.schema, 'kind', 'collectionType');\n },\n\n get uid() {\n return state.uid;\n },\n\n get writable() {\n return _.get(state, 'plugin') !== 'admin';\n },\n\n setUID(val: Internal.UID.ContentType) {\n modified = true;\n\n state.uid = val;\n return this;\n },\n\n setDir(val: string) {\n modified = true;\n\n state.dir = val;\n return this;\n },\n\n get schema() {\n return _.cloneDeep(state.schema);\n },\n\n setSchema(val: Struct.ContentTypeSchema) {\n modified = true;\n\n state.schema = _.cloneDeep(val);\n return this;\n },\n\n // get a particular path inside the schema\n get(path: string[]) {\n return _.get(state.schema, path);\n },\n\n // set a particular path inside the schema\n set(path: string[] | string, val: unknown) {\n if (!state.schema) return this;\n\n modified = true;\n\n const value = _.defaultTo(val, _.get(state.schema, path));\n _.set(state.schema, path, value);\n\n return this;\n },\n\n // delete a particular path inside the schema\n unset(path: string[]) {\n modified = true;\n\n _.unset(state.schema, path);\n\n return this;\n },\n\n delete() {\n deleted = true;\n return this;\n },\n\n getAttribute(key: string) {\n return this.get(['attributes', key]);\n },\n\n setAttribute(key: string, attribute: any) {\n return this.set(['attributes', key], attribute);\n },\n\n deleteAttribute(key: string) {\n return this.unset(['attributes', key]);\n },\n\n setAttributes(newAttributes: Struct.SchemaAttributes) {\n if (!this.schema) return this;\n\n // delete old configurable attributes\n for (const key in this.schema.attributes) {\n if (isConfigurable((this.schema.attributes as any)[key])) {\n this.deleteAttribute(key);\n }\n }\n\n // set new Attributes\n for (const key of Object.keys(newAttributes)) {\n this.setAttribute(key, newAttributes[key as keyof Struct.SchemaAttributes]);\n }\n\n return this;\n },\n\n removeContentType(uid: Internal.UID.ContentType) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attribute = attributes[key];\n\n if (attribute.target === uid) {\n this.deleteAttribute(key);\n }\n });\n\n return this;\n },\n\n // utils\n removeComponent(uid: Internal.UID.Component) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attr = attributes[key];\n\n if (attr.type === 'component' && attr.component === uid) {\n this.deleteAttribute(key);\n }\n\n if (\n attr.type === 'dynamiczone' &&\n Array.isArray(attr.components) &&\n attr.components.includes(uid)\n ) {\n const updatedComponentList = attributes[key].components.filter(\n (val: string) => val !== uid\n );\n this.set(['attributes', key, 'components'], updatedComponentList);\n }\n });\n\n return this;\n },\n\n updateComponent(uid: Internal.UID.Component, newUID: Internal.UID.Component) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attr = attributes[key];\n\n if (attr.type === 'component' && attr.component === uid) {\n this.set(['attributes', key, 'component'], newUID);\n }\n\n if (\n attr.type === 'dynamiczone' &&\n Array.isArray(attr.components) &&\n attr.components.includes(uid)\n ) {\n const updatedComponentList = attr.components.map((val: string) =>\n val === uid ? newUID : val\n );\n\n this.set(['attributes', key, 'components'], updatedComponentList);\n }\n });\n\n return this;\n },\n\n // save the schema to disk\n async flush() {\n if (!this.writable) {\n return;\n }\n\n const initialPath = path.join(initialState.dir, initialState.filename);\n const filePath = path.join(state.dir, state.filename);\n\n if (deleted) {\n await fse.remove(initialPath);\n\n await removeDirectoryIfEmpty(initialState.dir);\n\n return;\n }\n\n if (modified) {\n if (!state.schema) return Promise.resolve();\n\n await fse.ensureFile(filePath);\n\n await fse.writeJSON(\n filePath,\n {\n kind: state.schema.kind,\n collectionName: state.schema.collectionName,\n info: state.schema.info,\n options: state.schema.options,\n pluginOptions: state.schema.pluginOptions,\n attributes: state.schema.attributes,\n config: (state.schema as any).config,\n indexes: (state.schema as Struct.ContentTypeSchema).indexes,\n foreignKeys: (state.schema as Struct.ContentTypeSchema).foreignKeys,\n },\n { spaces: 2 }\n );\n\n // remove from oldPath\n if (initialPath !== filePath) {\n await fse.remove(initialPath);\n\n await removeDirectoryIfEmpty(initialState.dir);\n }\n\n return;\n }\n\n return Promise.resolve();\n },\n\n // reset the schema to its initial value\n async rollback() {\n if (!this.writable) {\n return;\n }\n\n const initialPath = path.join(initialState.dir, initialState.filename);\n const filePath = path.join(state.dir, state.filename);\n\n // it was a creation so it needs to be deleted\n if (!initialState.uid) {\n await fse.remove(filePath);\n\n await removeDirectoryIfEmpty(state.dir);\n return;\n }\n\n if (modified || deleted) {\n await fse.ensureFile(initialPath);\n await fse.writeJSON(initialPath, initialState.schema, { spaces: 2 });\n\n // remove\n if (initialPath !== filePath) {\n await fse.remove(filePath);\n\n await removeDirectoryIfEmpty(state.dir);\n }\n }\n\n return Promise.resolve();\n },\n };\n}\n"],"names":["removeDirectoryIfEmpty","dir","list","fse","readdir","length","remove","error","code","createSchemaHandler","infos","category","modelName","plugin","uid","filename","schema","initialState","info","options","attributes","state","_","cloneDeep","Object","freeze","modified","deleted","kind","get","writable","setUID","val","setDir","setSchema","path","set","value","defaultTo","unset","delete","getAttribute","key","setAttribute","attribute","deleteAttribute","setAttributes","newAttributes","isConfigurable","keys","removeContentType","forEach","target","removeComponent","attr","type","component","Array","isArray","components","includes","updatedComponentList","filter","updateComponent","newUID","map","flush","initialPath","join","filePath","Promise","resolve","ensureFile","writeJSON","collectionName","pluginOptions","config","indexes","foreignKeys","spaces","rollback"],"mappings":"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"}
@@ -3,6 +3,18 @@ import fse__default from 'fs-extra';
3
3
  import _ from 'lodash';
4
4
  import { isConfigurable } from '../../utils/attributes.mjs';
5
5
 
6
+ const removeDirectoryIfEmpty = async (dir)=>{
7
+ try {
8
+ const list = await fse__default.readdir(dir);
9
+ if (list.length === 0) {
10
+ await fse__default.remove(dir);
11
+ }
12
+ } catch (error) {
13
+ if (error.code !== 'ENOENT') {
14
+ throw error;
15
+ }
16
+ }
17
+ };
6
18
  function createSchemaHandler(infos) {
7
19
  const { category, modelName, plugin, uid, dir, filename, schema } = infos;
8
20
  const initialState = {
@@ -177,10 +189,7 @@ function createSchemaHandler(infos) {
177
189
  const filePath = path__default.join(state.dir, state.filename);
178
190
  if (deleted) {
179
191
  await fse__default.remove(initialPath);
180
- const list = await fse__default.readdir(initialState.dir);
181
- if (list.length === 0) {
182
- await fse__default.remove(initialState.dir);
183
- }
192
+ await removeDirectoryIfEmpty(initialState.dir);
184
193
  return;
185
194
  }
186
195
  if (modified) {
@@ -193,17 +202,16 @@ function createSchemaHandler(infos) {
193
202
  options: state.schema.options,
194
203
  pluginOptions: state.schema.pluginOptions,
195
204
  attributes: state.schema.attributes,
196
- config: state.schema.config
205
+ config: state.schema.config,
206
+ indexes: state.schema.indexes,
207
+ foreignKeys: state.schema.foreignKeys
197
208
  }, {
198
209
  spaces: 2
199
210
  });
200
211
  // remove from oldPath
201
212
  if (initialPath !== filePath) {
202
213
  await fse__default.remove(initialPath);
203
- const list = await fse__default.readdir(initialState.dir);
204
- if (list.length === 0) {
205
- await fse__default.remove(initialState.dir);
206
- }
214
+ await removeDirectoryIfEmpty(initialState.dir);
207
215
  }
208
216
  return;
209
217
  }
@@ -219,10 +227,7 @@ function createSchemaHandler(infos) {
219
227
  // it was a creation so it needs to be deleted
220
228
  if (!initialState.uid) {
221
229
  await fse__default.remove(filePath);
222
- const list = await fse__default.readdir(state.dir);
223
- if (list.length === 0) {
224
- await fse__default.remove(state.dir);
225
- }
230
+ await removeDirectoryIfEmpty(state.dir);
226
231
  return;
227
232
  }
228
233
  if (modified || deleted) {
@@ -233,10 +238,7 @@ function createSchemaHandler(infos) {
233
238
  // remove
234
239
  if (initialPath !== filePath) {
235
240
  await fse__default.remove(filePath);
236
- const list = await fse__default.readdir(state.dir);
237
- if (list.length === 0) {
238
- await fse__default.remove(state.dir);
239
- }
241
+ await removeDirectoryIfEmpty(state.dir);
240
242
  }
241
243
  }
242
244
  return Promise.resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"schema-handler.mjs","sources":["../../../../server/src/services/schema-builder/schema-handler.ts"],"sourcesContent":["import path from 'path';\nimport type { Internal, Struct } from '@strapi/types';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\n\nimport { isConfigurable } from '../../utils/attributes';\n\nexport type Infos = {\n category?: string;\n modelName?: string;\n plugin?: string;\n uid?: Internal.UID.ContentType;\n dir: string;\n filename: string;\n schema?: Struct.ContentTypeSchema;\n};\n\nexport type SchemaHandler = ReturnType<typeof createSchemaHandler>;\n\nexport default function createSchemaHandler(infos: Infos) {\n const { category, modelName, plugin, uid, dir, filename, schema } = infos;\n\n const initialState = {\n modelName,\n plugin,\n category,\n uid,\n dir,\n filename,\n schema:\n schema ||\n ({\n info: {},\n options: {},\n attributes: {},\n } as Struct.ContentTypeSchema),\n };\n\n const state = _.cloneDeep(initialState);\n\n // always keep it the same to rollback\n Object.freeze(initialState.schema);\n\n let modified = false;\n let deleted = false;\n\n return {\n get modelName() {\n return initialState.modelName;\n },\n\n get plugin() {\n return initialState.plugin;\n },\n\n get category() {\n return initialState.category;\n },\n\n get kind() {\n return _.get(state.schema, 'kind', 'collectionType');\n },\n\n get uid() {\n return state.uid;\n },\n\n get writable() {\n return _.get(state, 'plugin') !== 'admin';\n },\n\n setUID(val: Internal.UID.ContentType) {\n modified = true;\n\n state.uid = val;\n return this;\n },\n\n setDir(val: string) {\n modified = true;\n\n state.dir = val;\n return this;\n },\n\n get schema() {\n return _.cloneDeep(state.schema);\n },\n\n setSchema(val: Struct.ContentTypeSchema) {\n modified = true;\n\n state.schema = _.cloneDeep(val);\n return this;\n },\n\n // get a particular path inside the schema\n get(path: string[]) {\n return _.get(state.schema, path);\n },\n\n // set a particular path inside the schema\n set(path: string[] | string, val: unknown) {\n if (!state.schema) return this;\n\n modified = true;\n\n const value = _.defaultTo(val, _.get(state.schema, path));\n _.set(state.schema, path, value);\n\n return this;\n },\n\n // delete a particular path inside the schema\n unset(path: string[]) {\n modified = true;\n\n _.unset(state.schema, path);\n\n return this;\n },\n\n delete() {\n deleted = true;\n return this;\n },\n\n getAttribute(key: string) {\n return this.get(['attributes', key]);\n },\n\n setAttribute(key: string, attribute: any) {\n return this.set(['attributes', key], attribute);\n },\n\n deleteAttribute(key: string) {\n return this.unset(['attributes', key]);\n },\n\n setAttributes(newAttributes: Struct.SchemaAttributes) {\n if (!this.schema) return this;\n\n // delete old configurable attributes\n for (const key in this.schema.attributes) {\n if (isConfigurable((this.schema.attributes as any)[key])) {\n this.deleteAttribute(key);\n }\n }\n\n // set new Attributes\n for (const key of Object.keys(newAttributes)) {\n this.setAttribute(key, newAttributes[key as keyof Struct.SchemaAttributes]);\n }\n\n return this;\n },\n\n removeContentType(uid: Internal.UID.ContentType) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attribute = attributes[key];\n\n if (attribute.target === uid) {\n this.deleteAttribute(key);\n }\n });\n\n return this;\n },\n\n // utils\n removeComponent(uid: Internal.UID.Component) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attr = attributes[key];\n\n if (attr.type === 'component' && attr.component === uid) {\n this.deleteAttribute(key);\n }\n\n if (\n attr.type === 'dynamiczone' &&\n Array.isArray(attr.components) &&\n attr.components.includes(uid)\n ) {\n const updatedComponentList = attributes[key].components.filter(\n (val: string) => val !== uid\n );\n this.set(['attributes', key, 'components'], updatedComponentList);\n }\n });\n\n return this;\n },\n\n updateComponent(uid: Internal.UID.Component, newUID: Internal.UID.Component) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attr = attributes[key];\n\n if (attr.type === 'component' && attr.component === uid) {\n this.set(['attributes', key, 'component'], newUID);\n }\n\n if (\n attr.type === 'dynamiczone' &&\n Array.isArray(attr.components) &&\n attr.components.includes(uid)\n ) {\n const updatedComponentList = attr.components.map((val: string) =>\n val === uid ? newUID : val\n );\n\n this.set(['attributes', key, 'components'], updatedComponentList);\n }\n });\n\n return this;\n },\n\n // save the schema to disk\n async flush() {\n if (!this.writable) {\n return;\n }\n\n const initialPath = path.join(initialState.dir, initialState.filename);\n const filePath = path.join(state.dir, state.filename);\n\n if (deleted) {\n await fse.remove(initialPath);\n\n const list = await fse.readdir(initialState.dir);\n if (list.length === 0) {\n await fse.remove(initialState.dir);\n }\n\n return;\n }\n\n if (modified) {\n if (!state.schema) return Promise.resolve();\n\n await fse.ensureFile(filePath);\n\n await fse.writeJSON(\n filePath,\n {\n kind: state.schema.kind,\n collectionName: state.schema.collectionName,\n info: state.schema.info,\n options: state.schema.options,\n pluginOptions: state.schema.pluginOptions,\n attributes: state.schema.attributes,\n config: (state.schema as any).config,\n },\n { spaces: 2 }\n );\n\n // remove from oldPath\n if (initialPath !== filePath) {\n await fse.remove(initialPath);\n\n const list = await fse.readdir(initialState.dir);\n if (list.length === 0) {\n await fse.remove(initialState.dir);\n }\n }\n\n return;\n }\n\n return Promise.resolve();\n },\n\n // reset the schema to its initial value\n async rollback() {\n if (!this.writable) {\n return;\n }\n\n const initialPath = path.join(initialState.dir, initialState.filename);\n const filePath = path.join(state.dir, state.filename);\n\n // it was a creation so it needs to be deleted\n if (!initialState.uid) {\n await fse.remove(filePath);\n\n const list = await fse.readdir(state.dir);\n if (list.length === 0) {\n await fse.remove(state.dir);\n }\n return;\n }\n\n if (modified || deleted) {\n await fse.ensureFile(initialPath);\n await fse.writeJSON(initialPath, initialState.schema, { spaces: 2 });\n\n // remove\n if (initialPath !== filePath) {\n await fse.remove(filePath);\n\n const list = await fse.readdir(state.dir);\n if (list.length === 0) {\n await fse.remove(state.dir);\n }\n }\n }\n\n return Promise.resolve();\n },\n };\n}\n"],"names":["createSchemaHandler","infos","category","modelName","plugin","uid","dir","filename","schema","initialState","info","options","attributes","state","_","cloneDeep","Object","freeze","modified","deleted","kind","get","writable","setUID","val","setDir","setSchema","path","set","value","defaultTo","unset","delete","getAttribute","key","setAttribute","attribute","deleteAttribute","setAttributes","newAttributes","isConfigurable","keys","removeContentType","forEach","target","removeComponent","attr","type","component","Array","isArray","components","includes","updatedComponentList","filter","updateComponent","newUID","map","flush","initialPath","join","filePath","fse","remove","list","readdir","length","Promise","resolve","ensureFile","writeJSON","collectionName","pluginOptions","config","spaces","rollback"],"mappings":"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"}
1
+ {"version":3,"file":"schema-handler.mjs","sources":["../../../../server/src/services/schema-builder/schema-handler.ts"],"sourcesContent":["import path from 'path';\nimport type { Internal, Struct } from '@strapi/types';\nimport fse from 'fs-extra';\nimport _ from 'lodash';\n\nimport { isConfigurable } from '../../utils/attributes';\n\nexport type Infos = {\n category?: string;\n modelName?: string;\n plugin?: string;\n uid?: Internal.UID.ContentType;\n dir: string;\n filename: string;\n schema?: Struct.ContentTypeSchema;\n};\n\nexport type SchemaHandler = ReturnType<typeof createSchemaHandler>;\n\nconst removeDirectoryIfEmpty = async (dir: string) => {\n try {\n const list = await fse.readdir(dir);\n if (list.length === 0) {\n await fse.remove(dir);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n};\n\nexport default function createSchemaHandler(infos: Infos) {\n const { category, modelName, plugin, uid, dir, filename, schema } = infos;\n\n const initialState = {\n modelName,\n plugin,\n category,\n uid,\n dir,\n filename,\n schema:\n schema ||\n ({\n info: {},\n options: {},\n attributes: {},\n } as Struct.ContentTypeSchema),\n };\n\n const state = _.cloneDeep(initialState);\n\n // always keep it the same to rollback\n Object.freeze(initialState.schema);\n\n let modified = false;\n let deleted = false;\n\n return {\n get modelName() {\n return initialState.modelName;\n },\n\n get plugin() {\n return initialState.plugin;\n },\n\n get category() {\n return initialState.category;\n },\n\n get kind() {\n return _.get(state.schema, 'kind', 'collectionType');\n },\n\n get uid() {\n return state.uid;\n },\n\n get writable() {\n return _.get(state, 'plugin') !== 'admin';\n },\n\n setUID(val: Internal.UID.ContentType) {\n modified = true;\n\n state.uid = val;\n return this;\n },\n\n setDir(val: string) {\n modified = true;\n\n state.dir = val;\n return this;\n },\n\n get schema() {\n return _.cloneDeep(state.schema);\n },\n\n setSchema(val: Struct.ContentTypeSchema) {\n modified = true;\n\n state.schema = _.cloneDeep(val);\n return this;\n },\n\n // get a particular path inside the schema\n get(path: string[]) {\n return _.get(state.schema, path);\n },\n\n // set a particular path inside the schema\n set(path: string[] | string, val: unknown) {\n if (!state.schema) return this;\n\n modified = true;\n\n const value = _.defaultTo(val, _.get(state.schema, path));\n _.set(state.schema, path, value);\n\n return this;\n },\n\n // delete a particular path inside the schema\n unset(path: string[]) {\n modified = true;\n\n _.unset(state.schema, path);\n\n return this;\n },\n\n delete() {\n deleted = true;\n return this;\n },\n\n getAttribute(key: string) {\n return this.get(['attributes', key]);\n },\n\n setAttribute(key: string, attribute: any) {\n return this.set(['attributes', key], attribute);\n },\n\n deleteAttribute(key: string) {\n return this.unset(['attributes', key]);\n },\n\n setAttributes(newAttributes: Struct.SchemaAttributes) {\n if (!this.schema) return this;\n\n // delete old configurable attributes\n for (const key in this.schema.attributes) {\n if (isConfigurable((this.schema.attributes as any)[key])) {\n this.deleteAttribute(key);\n }\n }\n\n // set new Attributes\n for (const key of Object.keys(newAttributes)) {\n this.setAttribute(key, newAttributes[key as keyof Struct.SchemaAttributes]);\n }\n\n return this;\n },\n\n removeContentType(uid: Internal.UID.ContentType) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attribute = attributes[key];\n\n if (attribute.target === uid) {\n this.deleteAttribute(key);\n }\n });\n\n return this;\n },\n\n // utils\n removeComponent(uid: Internal.UID.Component) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attr = attributes[key];\n\n if (attr.type === 'component' && attr.component === uid) {\n this.deleteAttribute(key);\n }\n\n if (\n attr.type === 'dynamiczone' &&\n Array.isArray(attr.components) &&\n attr.components.includes(uid)\n ) {\n const updatedComponentList = attributes[key].components.filter(\n (val: string) => val !== uid\n );\n this.set(['attributes', key, 'components'], updatedComponentList);\n }\n });\n\n return this;\n },\n\n updateComponent(uid: Internal.UID.Component, newUID: Internal.UID.Component) {\n if (!state.schema) return this;\n\n const attributes = state.schema.attributes as Record<string, any>;\n\n Object.keys(attributes).forEach((key) => {\n const attr = attributes[key];\n\n if (attr.type === 'component' && attr.component === uid) {\n this.set(['attributes', key, 'component'], newUID);\n }\n\n if (\n attr.type === 'dynamiczone' &&\n Array.isArray(attr.components) &&\n attr.components.includes(uid)\n ) {\n const updatedComponentList = attr.components.map((val: string) =>\n val === uid ? newUID : val\n );\n\n this.set(['attributes', key, 'components'], updatedComponentList);\n }\n });\n\n return this;\n },\n\n // save the schema to disk\n async flush() {\n if (!this.writable) {\n return;\n }\n\n const initialPath = path.join(initialState.dir, initialState.filename);\n const filePath = path.join(state.dir, state.filename);\n\n if (deleted) {\n await fse.remove(initialPath);\n\n await removeDirectoryIfEmpty(initialState.dir);\n\n return;\n }\n\n if (modified) {\n if (!state.schema) return Promise.resolve();\n\n await fse.ensureFile(filePath);\n\n await fse.writeJSON(\n filePath,\n {\n kind: state.schema.kind,\n collectionName: state.schema.collectionName,\n info: state.schema.info,\n options: state.schema.options,\n pluginOptions: state.schema.pluginOptions,\n attributes: state.schema.attributes,\n config: (state.schema as any).config,\n indexes: (state.schema as Struct.ContentTypeSchema).indexes,\n foreignKeys: (state.schema as Struct.ContentTypeSchema).foreignKeys,\n },\n { spaces: 2 }\n );\n\n // remove from oldPath\n if (initialPath !== filePath) {\n await fse.remove(initialPath);\n\n await removeDirectoryIfEmpty(initialState.dir);\n }\n\n return;\n }\n\n return Promise.resolve();\n },\n\n // reset the schema to its initial value\n async rollback() {\n if (!this.writable) {\n return;\n }\n\n const initialPath = path.join(initialState.dir, initialState.filename);\n const filePath = path.join(state.dir, state.filename);\n\n // it was a creation so it needs to be deleted\n if (!initialState.uid) {\n await fse.remove(filePath);\n\n await removeDirectoryIfEmpty(state.dir);\n return;\n }\n\n if (modified || deleted) {\n await fse.ensureFile(initialPath);\n await fse.writeJSON(initialPath, initialState.schema, { spaces: 2 });\n\n // remove\n if (initialPath !== filePath) {\n await fse.remove(filePath);\n\n await removeDirectoryIfEmpty(state.dir);\n }\n }\n\n return Promise.resolve();\n },\n };\n}\n"],"names":["removeDirectoryIfEmpty","dir","list","fse","readdir","length","remove","error","code","createSchemaHandler","infos","category","modelName","plugin","uid","filename","schema","initialState","info","options","attributes","state","_","cloneDeep","Object","freeze","modified","deleted","kind","get","writable","setUID","val","setDir","setSchema","path","set","value","defaultTo","unset","delete","getAttribute","key","setAttribute","attribute","deleteAttribute","setAttributes","newAttributes","isConfigurable","keys","removeContentType","forEach","target","removeComponent","attr","type","component","Array","isArray","components","includes","updatedComponentList","filter","updateComponent","newUID","map","flush","initialPath","join","filePath","Promise","resolve","ensureFile","writeJSON","collectionName","pluginOptions","config","indexes","foreignKeys","spaces","rollback"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ const finalizeSchemaMutation = async ({ apiHandler, backedUpApiUids = [] })=>{
4
+ const errors = [];
5
+ for (const uid of backedUpApiUids){
6
+ try {
7
+ await apiHandler.finalize(uid);
8
+ } catch (error) {
9
+ errors.push(error);
10
+ }
11
+ }
12
+ return errors;
13
+ };
14
+ /**
15
+ * Restores the filesystem artifacts touched before content-structure reconciliation.
16
+ * Folder reconciliation is deliberately the final mutation, so groups.json never needs a
17
+ * compensating write when an earlier schema or API operation fails.
18
+ */ const rollbackSchemaMutation = async ({ builder, apiHandler, backedUpApiUids = [], generatedApiNames = [], schemaAlreadyRolledBack = false })=>{
19
+ const errors = [];
20
+ const attempt = async (operation)=>{
21
+ try {
22
+ await operation();
23
+ } catch (error) {
24
+ errors.push(error);
25
+ }
26
+ };
27
+ // A generator can fail before a schema directory exists, so remove its partial API before
28
+ // asking the schema handler to roll back. Every action is attempted even if an earlier one
29
+ // fails, ensuring compensation is best-effort rather than short-circuiting.
30
+ for (const apiName of generatedApiNames){
31
+ await attempt(()=>apiHandler.clearGenerated(apiName));
32
+ }
33
+ if (!schemaAlreadyRolledBack) {
34
+ await attempt(()=>builder.rollback());
35
+ }
36
+ for (const uid of backedUpApiUids){
37
+ await attempt(()=>apiHandler.rollback(uid));
38
+ }
39
+ if (errors.length > 0) {
40
+ throw errors[0];
41
+ }
42
+ };
43
+
44
+ exports.finalizeSchemaMutation = finalizeSchemaMutation;
45
+ exports.rollbackSchemaMutation = rollbackSchemaMutation;
46
+ //# sourceMappingURL=schema-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-mutation.js","sources":["../../../server/src/services/schema-mutation.ts"],"sourcesContent":["type SchemaBuilder = {\n rollback(): Promise<unknown>;\n};\n\ntype ApiHandler = {\n rollback(uid: string): Promise<void>;\n clearGenerated(apiName: string): Promise<void>;\n finalize(uid: string): Promise<void>;\n};\n\nexport const finalizeSchemaMutation = async ({\n apiHandler,\n backedUpApiUids = [],\n}: {\n apiHandler: ApiHandler;\n backedUpApiUids?: string[];\n}) => {\n const errors: unknown[] = [];\n\n for (const uid of backedUpApiUids) {\n try {\n await apiHandler.finalize(uid);\n } catch (error) {\n errors.push(error);\n }\n }\n\n return errors;\n};\n\n/**\n * Restores the filesystem artifacts touched before content-structure reconciliation.\n * Folder reconciliation is deliberately the final mutation, so groups.json never needs a\n * compensating write when an earlier schema or API operation fails.\n */\nexport const rollbackSchemaMutation = async ({\n builder,\n apiHandler,\n backedUpApiUids = [],\n generatedApiNames = [],\n schemaAlreadyRolledBack = false,\n}: {\n builder: SchemaBuilder;\n apiHandler: ApiHandler;\n backedUpApiUids?: string[];\n generatedApiNames?: string[];\n schemaAlreadyRolledBack?: boolean;\n}) => {\n const errors: unknown[] = [];\n const attempt = async (operation: () => Promise<unknown>) => {\n try {\n await operation();\n } catch (error) {\n errors.push(error);\n }\n };\n\n // A generator can fail before a schema directory exists, so remove its partial API before\n // asking the schema handler to roll back. Every action is attempted even if an earlier one\n // fails, ensuring compensation is best-effort rather than short-circuiting.\n for (const apiName of generatedApiNames) {\n await attempt(() => apiHandler.clearGenerated(apiName));\n }\n\n if (!schemaAlreadyRolledBack) {\n await attempt(() => builder.rollback());\n }\n\n for (const uid of backedUpApiUids) {\n await attempt(() => apiHandler.rollback(uid));\n }\n\n if (errors.length > 0) {\n throw errors[0];\n }\n};\n"],"names":["finalizeSchemaMutation","apiHandler","backedUpApiUids","errors","uid","finalize","error","push","rollbackSchemaMutation","builder","generatedApiNames","schemaAlreadyRolledBack","attempt","operation","apiName","clearGenerated","rollback","length"],"mappings":";;AAUO,MAAMA,yBAAyB,OAAO,EAC3CC,UAAU,EACVC,eAAAA,GAAkB,EAAE,EAIrB,GAAA;AACC,IAAA,MAAMC,SAAoB,EAAE;IAE5B,KAAK,MAAMC,OAAOF,eAAAA,CAAiB;QACjC,IAAI;YACF,MAAMD,UAAAA,CAAWI,QAAQ,CAACD,GAAAA,CAAAA;AAC5B,QAAA,CAAA,CAAE,OAAOE,KAAAA,EAAO;AACdH,YAAAA,MAAAA,CAAOI,IAAI,CAACD,KAAAA,CAAAA;AACd,QAAA;AACF,IAAA;IAEA,OAAOH,MAAAA;AACT;AAEA;;;;AAIC,IACM,MAAMK,sBAAAA,GAAyB,OAAO,EAC3CC,OAAO,EACPR,UAAU,EACVC,eAAAA,GAAkB,EAAE,EACpBQ,iBAAAA,GAAoB,EAAE,EACtBC,uBAAAA,GAA0B,KAAK,EAOhC,GAAA;AACC,IAAA,MAAMR,SAAoB,EAAE;AAC5B,IAAA,MAAMS,UAAU,OAAOC,SAAAA,GAAAA;QACrB,IAAI;YACF,MAAMA,SAAAA,EAAAA;AACR,QAAA,CAAA,CAAE,OAAOP,KAAAA,EAAO;AACdH,YAAAA,MAAAA,CAAOI,IAAI,CAACD,KAAAA,CAAAA;AACd,QAAA;AACF,IAAA,CAAA;;;;IAKA,KAAK,MAAMQ,WAAWJ,iBAAAA,CAAmB;AACvC,QAAA,MAAME,OAAAA,CAAQ,IAAMX,UAAAA,CAAWc,cAAc,CAACD,OAAAA,CAAAA,CAAAA;AAChD,IAAA;AAEA,IAAA,IAAI,CAACH,uBAAAA,EAAyB;QAC5B,MAAMC,OAAAA,CAAQ,IAAMH,OAAAA,CAAQO,QAAQ,EAAA,CAAA;AACtC,IAAA;IAEA,KAAK,MAAMZ,OAAOF,eAAAA,CAAiB;AACjC,QAAA,MAAMU,OAAAA,CAAQ,IAAMX,UAAAA,CAAWe,QAAQ,CAACZ,GAAAA,CAAAA,CAAAA;AAC1C,IAAA;IAEA,IAAID,MAAAA,CAAOc,MAAM,GAAG,CAAA,EAAG;QACrB,MAAMd,MAAM,CAAC,CAAA,CAAE;AACjB,IAAA;AACF;;;;;"}
@@ -0,0 +1,43 @@
1
+ const finalizeSchemaMutation = async ({ apiHandler, backedUpApiUids = [] })=>{
2
+ const errors = [];
3
+ for (const uid of backedUpApiUids){
4
+ try {
5
+ await apiHandler.finalize(uid);
6
+ } catch (error) {
7
+ errors.push(error);
8
+ }
9
+ }
10
+ return errors;
11
+ };
12
+ /**
13
+ * Restores the filesystem artifacts touched before content-structure reconciliation.
14
+ * Folder reconciliation is deliberately the final mutation, so groups.json never needs a
15
+ * compensating write when an earlier schema or API operation fails.
16
+ */ const rollbackSchemaMutation = async ({ builder, apiHandler, backedUpApiUids = [], generatedApiNames = [], schemaAlreadyRolledBack = false })=>{
17
+ const errors = [];
18
+ const attempt = async (operation)=>{
19
+ try {
20
+ await operation();
21
+ } catch (error) {
22
+ errors.push(error);
23
+ }
24
+ };
25
+ // A generator can fail before a schema directory exists, so remove its partial API before
26
+ // asking the schema handler to roll back. Every action is attempted even if an earlier one
27
+ // fails, ensuring compensation is best-effort rather than short-circuiting.
28
+ for (const apiName of generatedApiNames){
29
+ await attempt(()=>apiHandler.clearGenerated(apiName));
30
+ }
31
+ if (!schemaAlreadyRolledBack) {
32
+ await attempt(()=>builder.rollback());
33
+ }
34
+ for (const uid of backedUpApiUids){
35
+ await attempt(()=>apiHandler.rollback(uid));
36
+ }
37
+ if (errors.length > 0) {
38
+ throw errors[0];
39
+ }
40
+ };
41
+
42
+ export { finalizeSchemaMutation, rollbackSchemaMutation };
43
+ //# sourceMappingURL=schema-mutation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-mutation.mjs","sources":["../../../server/src/services/schema-mutation.ts"],"sourcesContent":["type SchemaBuilder = {\n rollback(): Promise<unknown>;\n};\n\ntype ApiHandler = {\n rollback(uid: string): Promise<void>;\n clearGenerated(apiName: string): Promise<void>;\n finalize(uid: string): Promise<void>;\n};\n\nexport const finalizeSchemaMutation = async ({\n apiHandler,\n backedUpApiUids = [],\n}: {\n apiHandler: ApiHandler;\n backedUpApiUids?: string[];\n}) => {\n const errors: unknown[] = [];\n\n for (const uid of backedUpApiUids) {\n try {\n await apiHandler.finalize(uid);\n } catch (error) {\n errors.push(error);\n }\n }\n\n return errors;\n};\n\n/**\n * Restores the filesystem artifacts touched before content-structure reconciliation.\n * Folder reconciliation is deliberately the final mutation, so groups.json never needs a\n * compensating write when an earlier schema or API operation fails.\n */\nexport const rollbackSchemaMutation = async ({\n builder,\n apiHandler,\n backedUpApiUids = [],\n generatedApiNames = [],\n schemaAlreadyRolledBack = false,\n}: {\n builder: SchemaBuilder;\n apiHandler: ApiHandler;\n backedUpApiUids?: string[];\n generatedApiNames?: string[];\n schemaAlreadyRolledBack?: boolean;\n}) => {\n const errors: unknown[] = [];\n const attempt = async (operation: () => Promise<unknown>) => {\n try {\n await operation();\n } catch (error) {\n errors.push(error);\n }\n };\n\n // A generator can fail before a schema directory exists, so remove its partial API before\n // asking the schema handler to roll back. Every action is attempted even if an earlier one\n // fails, ensuring compensation is best-effort rather than short-circuiting.\n for (const apiName of generatedApiNames) {\n await attempt(() => apiHandler.clearGenerated(apiName));\n }\n\n if (!schemaAlreadyRolledBack) {\n await attempt(() => builder.rollback());\n }\n\n for (const uid of backedUpApiUids) {\n await attempt(() => apiHandler.rollback(uid));\n }\n\n if (errors.length > 0) {\n throw errors[0];\n }\n};\n"],"names":["finalizeSchemaMutation","apiHandler","backedUpApiUids","errors","uid","finalize","error","push","rollbackSchemaMutation","builder","generatedApiNames","schemaAlreadyRolledBack","attempt","operation","apiName","clearGenerated","rollback","length"],"mappings":"AAUO,MAAMA,yBAAyB,OAAO,EAC3CC,UAAU,EACVC,eAAAA,GAAkB,EAAE,EAIrB,GAAA;AACC,IAAA,MAAMC,SAAoB,EAAE;IAE5B,KAAK,MAAMC,OAAOF,eAAAA,CAAiB;QACjC,IAAI;YACF,MAAMD,UAAAA,CAAWI,QAAQ,CAACD,GAAAA,CAAAA;AAC5B,QAAA,CAAA,CAAE,OAAOE,KAAAA,EAAO;AACdH,YAAAA,MAAAA,CAAOI,IAAI,CAACD,KAAAA,CAAAA;AACd,QAAA;AACF,IAAA;IAEA,OAAOH,MAAAA;AACT;AAEA;;;;AAIC,IACM,MAAMK,sBAAAA,GAAyB,OAAO,EAC3CC,OAAO,EACPR,UAAU,EACVC,eAAAA,GAAkB,EAAE,EACpBQ,iBAAAA,GAAoB,EAAE,EACtBC,uBAAAA,GAA0B,KAAK,EAOhC,GAAA;AACC,IAAA,MAAMR,SAAoB,EAAE;AAC5B,IAAA,MAAMS,UAAU,OAAOC,SAAAA,GAAAA;QACrB,IAAI;YACF,MAAMA,SAAAA,EAAAA;AACR,QAAA,CAAA,CAAE,OAAOP,KAAAA,EAAO;AACdH,YAAAA,MAAAA,CAAOI,IAAI,CAACD,KAAAA,CAAAA;AACd,QAAA;AACF,IAAA,CAAA;;;;IAKA,KAAK,MAAMQ,WAAWJ,iBAAAA,CAAmB;AACvC,QAAA,MAAME,OAAAA,CAAQ,IAAMX,UAAAA,CAAWc,cAAc,CAACD,OAAAA,CAAAA,CAAAA;AAChD,IAAA;AAEA,IAAA,IAAI,CAACH,uBAAAA,EAAyB;QAC5B,MAAMC,OAAAA,CAAQ,IAAMH,OAAAA,CAAQO,QAAQ,EAAA,CAAA;AACtC,IAAA;IAEA,KAAK,MAAMZ,OAAOF,eAAAA,CAAiB;AACjC,QAAA,MAAMU,OAAAA,CAAQ,IAAMX,UAAAA,CAAWe,QAAQ,CAACZ,GAAAA,CAAAA,CAAAA;AAC1C,IAAA;IAEA,IAAID,MAAAA,CAAOc,MAAM,GAAG,CAAA,EAAG;QACrB,MAAMd,MAAM,CAAC,CAAA,CAAE;AACjB,IAAA;AACF;;;;"}