@strapi/content-type-builder 5.54.0 → 5.55.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/AIChat/hooks/useAIFetch.js +6 -2
- package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -1
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +7 -3
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -1
- package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js +20 -0
- package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs +18 -0
- package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js +83 -59
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs +86 -62
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js +112 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs +110 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js +159 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs +157 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js +311 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs +309 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js +379 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs +376 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js +172 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs +166 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js +62 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs +60 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js +145 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs +143 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js +176 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs +169 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js +277 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs +273 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js +62 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs +58 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs.map +1 -0
- package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +70 -8
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.mjs +70 -8
- package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +411 -33
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +411 -33
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/DataManager/utils/cleanData.js +11 -2
- package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
- package/dist/admin/components/DataManager/utils/cleanData.mjs +11 -2
- package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
- package/dist/admin/components/DataManager/utils/contentStructure.js +150 -0
- package/dist/admin/components/DataManager/utils/contentStructure.js.map +1 -0
- package/dist/admin/components/DataManager/utils/contentStructure.mjs +133 -0
- package/dist/admin/components/DataManager/utils/contentStructure.mjs.map +1 -0
- package/dist/admin/components/FolderSelect.js +200 -0
- package/dist/admin/components/FolderSelect.js.map +1 -0
- package/dist/admin/components/FolderSelect.mjs +198 -0
- package/dist/admin/components/FolderSelect.mjs.map +1 -0
- package/dist/admin/components/FormModal/FormModal.js +23 -2
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs +23 -2
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModal/contentType/contentTypeForm.js +15 -18
- package/dist/admin/components/FormModal/contentType/contentTypeForm.js.map +1 -1
- package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs +15 -18
- package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/reducer.js +6 -0
- package/dist/admin/components/FormModal/reducer.js.map +1 -1
- package/dist/admin/components/FormModal/reducer.mjs +6 -0
- package/dist/admin/components/FormModal/reducer.mjs.map +1 -1
- package/dist/admin/pages/App/index.js +2 -5
- package/dist/admin/pages/App/index.js.map +1 -1
- package/dist/admin/pages/App/index.mjs +2 -5
- package/dist/admin/pages/App/index.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/hooks/usePrefetchAIToken.d.ts +1 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.d.ts +16 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.d.ts +12 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.d.ts +14 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.d.ts +38 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/{useContentTypeBuilderMenu.d.ts → hooks/useContentTypeBuilderMenu.d.ts} +17 -7
- package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useFolderActions.d.ts +42 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useSortableTree.d.ts +53 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/lib/buildFolderTree.d.ts +42 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/lib/dropProjection.d.ts +58 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/lib/flatModel.d.ts +18 -0
- package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +41 -0
- package/dist/admin/src/components/DataManager/reducer.d.ts +105 -1
- package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +5 -1
- package/dist/admin/src/components/DataManager/utils/contentStructure.d.ts +68 -0
- package/dist/admin/src/components/FolderSelect.d.ts +18 -0
- package/dist/admin/src/components/FormModal/contentType/contentTypeForm.d.ts +0 -21
- package/dist/admin/src/components/FormModal/forms/forms.d.ts +0 -10
- package/dist/admin/src/components/FormModal/reducer.d.ts +7 -0
- package/dist/admin/src/utils/folderTelemetry.d.ts +5 -0
- package/dist/admin/translations/en.json.js +23 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +23 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/folderTelemetry.js +19 -0
- package/dist/admin/utils/folderTelemetry.js.map +1 -0
- package/dist/admin/utils/folderTelemetry.mjs +16 -0
- package/dist/admin/utils/folderTelemetry.mjs.map +1 -0
- package/dist/server/controllers/schema.js +1 -1
- package/dist/server/controllers/schema.js.map +1 -1
- package/dist/server/controllers/schema.mjs +1 -1
- package/dist/server/controllers/schema.mjs.map +1 -1
- package/dist/server/controllers/validation/common.js +3 -0
- package/dist/server/controllers/validation/common.js.map +1 -1
- package/dist/server/controllers/validation/common.mjs +3 -1
- package/dist/server/controllers/validation/common.mjs.map +1 -1
- package/dist/server/controllers/validation/content-structure.js +177 -0
- package/dist/server/controllers/validation/content-structure.js.map +1 -0
- package/dist/server/controllers/validation/content-structure.mjs +173 -0
- package/dist/server/controllers/validation/content-structure.mjs.map +1 -0
- package/dist/server/controllers/validation/schema.js +3 -1
- package/dist/server/controllers/validation/schema.js.map +1 -1
- package/dist/server/controllers/validation/schema.mjs +3 -1
- package/dist/server/controllers/validation/schema.mjs.map +1 -1
- package/dist/server/register.js +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/content-api.js +4 -4
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/content-api.mjs +4 -4
- package/dist/server/routes/content-api.mjs.map +1 -1
- package/dist/server/services/api-handler.js +37 -4
- package/dist/server/services/api-handler.js.map +1 -1
- package/dist/server/services/api-handler.mjs +36 -5
- package/dist/server/services/api-handler.mjs.map +1 -1
- package/dist/server/services/content-structure.js +174 -0
- package/dist/server/services/content-structure.js.map +1 -0
- package/dist/server/services/content-structure.mjs +172 -0
- package/dist/server/services/content-structure.mjs.map +1 -0
- package/dist/server/services/content-types.js +196 -44
- package/dist/server/services/content-types.js.map +1 -1
- package/dist/server/services/content-types.mjs +195 -45
- package/dist/server/services/content-types.mjs.map +1 -1
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/schema-builder/index.js +4 -2
- package/dist/server/services/schema-builder/index.js.map +1 -1
- package/dist/server/services/schema-builder/index.mjs +4 -2
- package/dist/server/services/schema-builder/index.mjs.map +1 -1
- package/dist/server/services/schema-builder/schema-handler.js +16 -16
- package/dist/server/services/schema-builder/schema-handler.js.map +1 -1
- package/dist/server/services/schema-builder/schema-handler.mjs +16 -16
- package/dist/server/services/schema-builder/schema-handler.mjs.map +1 -1
- package/dist/server/services/schema-mutation.js +46 -0
- package/dist/server/services/schema-mutation.js.map +1 -0
- package/dist/server/services/schema-mutation.mjs +43 -0
- package/dist/server/services/schema-mutation.mjs.map +1 -0
- package/dist/server/services/schema.js +134 -79
- package/dist/server/services/schema.js.map +1 -1
- package/dist/server/services/schema.mjs +135 -80
- package/dist/server/services/schema.mjs.map +1 -1
- package/dist/server/src/controllers/schema.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/common.d.ts +1 -0
- package/dist/server/src/controllers/validation/common.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/content-structure.d.ts +56 -0
- package/dist/server/src/controllers/validation/content-structure.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/schema.d.ts +35 -0
- package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/content-api.d.ts.map +1 -1
- package/dist/server/src/services/api-handler.d.ts +13 -1
- package/dist/server/src/services/api-handler.d.ts.map +1 -1
- package/dist/server/src/services/content-structure.d.ts +37 -0
- package/dist/server/src/services/content-structure.d.ts.map +1 -0
- package/dist/server/src/services/content-types.d.ts +4 -0
- package/dist/server/src/services/content-types.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/schema-builder/index.d.ts +3 -1
- package/dist/server/src/services/schema-builder/index.d.ts.map +1 -1
- package/dist/server/src/services/schema-builder/schema-handler.d.ts.map +1 -1
- package/dist/server/src/services/schema-mutation.d.ts +26 -0
- package/dist/server/src/services/schema-mutation.d.ts.map +1 -0
- package/dist/server/src/services/schema.d.ts +1 -0
- package/dist/server/src/services/schema.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/package.json +6 -6
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +0 -157
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +0 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs +0 -151
- 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
|
-
|
|
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) {
|
|
@@ -210,10 +219,7 @@ function createSchemaHandler(infos) {
|
|
|
210
219
|
// remove from oldPath
|
|
211
220
|
if (initialPath !== filePath) {
|
|
212
221
|
await fse__default.default.remove(initialPath);
|
|
213
|
-
|
|
214
|
-
if (list.length === 0) {
|
|
215
|
-
await fse__default.default.remove(initialState.dir);
|
|
216
|
-
}
|
|
222
|
+
await removeDirectoryIfEmpty(initialState.dir);
|
|
217
223
|
}
|
|
218
224
|
return;
|
|
219
225
|
}
|
|
@@ -229,10 +235,7 @@ function createSchemaHandler(infos) {
|
|
|
229
235
|
// it was a creation so it needs to be deleted
|
|
230
236
|
if (!initialState.uid) {
|
|
231
237
|
await fse__default.default.remove(filePath);
|
|
232
|
-
|
|
233
|
-
if (list.length === 0) {
|
|
234
|
-
await fse__default.default.remove(state.dir);
|
|
235
|
-
}
|
|
238
|
+
await removeDirectoryIfEmpty(state.dir);
|
|
236
239
|
return;
|
|
237
240
|
}
|
|
238
241
|
if (modified || deleted) {
|
|
@@ -243,10 +246,7 @@ function createSchemaHandler(infos) {
|
|
|
243
246
|
// remove
|
|
244
247
|
if (initialPath !== filePath) {
|
|
245
248
|
await fse__default.default.remove(filePath);
|
|
246
|
-
|
|
247
|
-
if (list.length === 0) {
|
|
248
|
-
await fse__default.default.remove(state.dir);
|
|
249
|
-
}
|
|
249
|
+
await removeDirectoryIfEmpty(state.dir);
|
|
250
250
|
}
|
|
251
251
|
}
|
|
252
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 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 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","indexes","foreignKeys","spaces","rollback"],"mappings":"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"}
|
|
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
|
-
|
|
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) {
|
|
@@ -202,10 +211,7 @@ function createSchemaHandler(infos) {
|
|
|
202
211
|
// remove from oldPath
|
|
203
212
|
if (initialPath !== filePath) {
|
|
204
213
|
await fse__default.remove(initialPath);
|
|
205
|
-
|
|
206
|
-
if (list.length === 0) {
|
|
207
|
-
await fse__default.remove(initialState.dir);
|
|
208
|
-
}
|
|
214
|
+
await removeDirectoryIfEmpty(initialState.dir);
|
|
209
215
|
}
|
|
210
216
|
return;
|
|
211
217
|
}
|
|
@@ -221,10 +227,7 @@ function createSchemaHandler(infos) {
|
|
|
221
227
|
// it was a creation so it needs to be deleted
|
|
222
228
|
if (!initialState.uid) {
|
|
223
229
|
await fse__default.remove(filePath);
|
|
224
|
-
|
|
225
|
-
if (list.length === 0) {
|
|
226
|
-
await fse__default.remove(state.dir);
|
|
227
|
-
}
|
|
230
|
+
await removeDirectoryIfEmpty(state.dir);
|
|
228
231
|
return;
|
|
229
232
|
}
|
|
230
233
|
if (modified || deleted) {
|
|
@@ -235,10 +238,7 @@ function createSchemaHandler(infos) {
|
|
|
235
238
|
// remove
|
|
236
239
|
if (initialPath !== filePath) {
|
|
237
240
|
await fse__default.remove(filePath);
|
|
238
|
-
|
|
239
|
-
if (list.length === 0) {
|
|
240
|
-
await fse__default.remove(state.dir);
|
|
241
|
-
}
|
|
241
|
+
await removeDirectoryIfEmpty(state.dir);
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
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 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 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","indexes","foreignKeys","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;;;;"}
|