@strapi/content-type-builder 5.54.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.
- 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
|
@@ -2,10 +2,23 @@ import _ from 'lodash';
|
|
|
2
2
|
import { getOr } from 'lodash/fp';
|
|
3
3
|
import { errors, contentTypes } from '@strapi/utils';
|
|
4
4
|
import { formatAttributes, replaceTemporaryUIDs } from '../utils/attributes.mjs';
|
|
5
|
+
import { getService } from '../utils/index.mjs';
|
|
5
6
|
import createBuilder from './schema-builder/index.mjs';
|
|
7
|
+
import { rollbackSchemaMutation, finalizeSchemaMutation } from './schema-mutation.mjs';
|
|
6
8
|
import { coreUids, pluginsUids } from './constants.mjs';
|
|
7
9
|
|
|
8
10
|
const { ApplicationError } = errors;
|
|
11
|
+
const isCTBOwnedApplicationContentType = (uid)=>uid.startsWith('api::');
|
|
12
|
+
const assertCTBOwnedApplicationContentType = (uid)=>{
|
|
13
|
+
if (!isCTBOwnedApplicationContentType(uid)) {
|
|
14
|
+
throw new ApplicationError(`Content type "${uid}" is not managed by CTB and cannot be deleted`);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const pruneFolderReferences = (uids)=>{
|
|
18
|
+
return getService('content-structure').commitFromUpdate({
|
|
19
|
+
deletedUids: new Set(uids)
|
|
20
|
+
});
|
|
21
|
+
};
|
|
9
22
|
const isContentTypeVisible = (model)=>getOr(true, 'pluginOptions.content-type-builder.visible', model) === true;
|
|
10
23
|
const getRestrictRelationsTo = (contentType)=>{
|
|
11
24
|
const { uid } = contentType;
|
|
@@ -47,12 +60,36 @@ const getRestrictRelationsTo = (contentType)=>{
|
|
|
47
60
|
const createContentTypes = async (contentTypes)=>{
|
|
48
61
|
const builder = createBuilder();
|
|
49
62
|
const createdContentTypes = [];
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
const generatedApiNames = [];
|
|
64
|
+
let schemaAlreadyRolledBack = false;
|
|
65
|
+
try {
|
|
66
|
+
for (const contentType of contentTypes){
|
|
67
|
+
createdContentTypes.push(await createContentType(contentType, {
|
|
68
|
+
defaultBuilder: builder,
|
|
69
|
+
generatedApiNames,
|
|
70
|
+
deferEvent: true
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
const schemaFilesWritten = await builder.writeFiles();
|
|
74
|
+
if (!schemaFilesWritten) {
|
|
75
|
+
schemaAlreadyRolledBack = true;
|
|
76
|
+
throw new ApplicationError('Invalid schema edition');
|
|
77
|
+
}
|
|
78
|
+
} catch (error) {
|
|
79
|
+
const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
|
|
80
|
+
await rollbackSchemaMutation({
|
|
81
|
+
builder,
|
|
82
|
+
apiHandler,
|
|
83
|
+
generatedApiNames,
|
|
84
|
+
schemaAlreadyRolledBack
|
|
85
|
+
});
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
for (const contentType of createdContentTypes){
|
|
89
|
+
strapi.eventHub.emit('content-type.create', {
|
|
90
|
+
contentType
|
|
91
|
+
});
|
|
54
92
|
}
|
|
55
|
-
await builder.writeFiles();
|
|
56
93
|
return createdContentTypes;
|
|
57
94
|
};
|
|
58
95
|
/**
|
|
@@ -79,19 +116,43 @@ const createContentTypes = async (contentTypes)=>{
|
|
|
79
116
|
}
|
|
80
117
|
return builder.editComponent(options);
|
|
81
118
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
119
|
+
const generatedApiNames = options.generatedApiNames ?? [];
|
|
120
|
+
let schemaAlreadyRolledBack = false;
|
|
121
|
+
try {
|
|
122
|
+
// Generate before writing the schema so a successful mutation retains the existing layout.
|
|
123
|
+
if (!contentType.plugin) {
|
|
124
|
+
generatedApiNames.push(contentType.singularName);
|
|
125
|
+
await generateAPI({
|
|
126
|
+
displayName: contentType.displayName || contentType.info.displayName,
|
|
127
|
+
singularName: contentType.singularName,
|
|
128
|
+
pluralName: contentType.pluralName,
|
|
129
|
+
kind: contentType.kind
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
if (!options.defaultBuilder) {
|
|
133
|
+
const schemaFilesWritten = await builder.writeFiles();
|
|
134
|
+
if (!schemaFilesWritten) {
|
|
135
|
+
schemaAlreadyRolledBack = true;
|
|
136
|
+
throw new ApplicationError('Invalid schema edition');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
} catch (error) {
|
|
140
|
+
if (!options.defaultBuilder) {
|
|
141
|
+
const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
|
|
142
|
+
await rollbackSchemaMutation({
|
|
143
|
+
builder,
|
|
144
|
+
apiHandler,
|
|
145
|
+
generatedApiNames,
|
|
146
|
+
schemaAlreadyRolledBack
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
if (!options.deferEvent) {
|
|
152
|
+
strapi.eventHub.emit('content-type.create', {
|
|
153
|
+
contentType: newContentType
|
|
154
|
+
});
|
|
91
155
|
}
|
|
92
|
-
strapi.eventHub.emit('content-type.create', {
|
|
93
|
-
contentType: newContentType
|
|
94
|
-
});
|
|
95
156
|
return newContentType;
|
|
96
157
|
};
|
|
97
158
|
/**
|
|
@@ -117,6 +178,7 @@ const createContentTypes = async (contentTypes)=>{
|
|
|
117
178
|
*/ const editContentType = async (uid, { contentType, components = [] })=>{
|
|
118
179
|
const builder = createBuilder();
|
|
119
180
|
const previousSchema = builder.contentTypes.get(uid).schema;
|
|
181
|
+
const isPluginContentType = Boolean(builder.contentTypes.get(uid).plugin);
|
|
120
182
|
const previousKind = previousSchema.kind;
|
|
121
183
|
const newKind = contentType.kind || previousKind;
|
|
122
184
|
// Restore non-visible attributes from previous schema
|
|
@@ -147,21 +209,48 @@ const createContentTypes = async (contentTypes)=>{
|
|
|
147
209
|
return builder.editComponent(replaceTmpUIDs(component));
|
|
148
210
|
});
|
|
149
211
|
if (newKind !== previousKind) {
|
|
212
|
+
let schemaAlreadyRolledBack = false;
|
|
150
213
|
const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
|
|
151
214
|
await apiHandler.backup(uid);
|
|
152
215
|
try {
|
|
153
|
-
await apiHandler.clear(uid
|
|
154
|
-
|
|
155
|
-
await generateAPI({
|
|
156
|
-
displayName: updatedContentType.schema.info.displayName,
|
|
157
|
-
singularName: updatedContentType.schema.info.singularName,
|
|
158
|
-
pluralName: updatedContentType.schema.info.pluralName,
|
|
159
|
-
kind: updatedContentType.schema.kind
|
|
216
|
+
await apiHandler.clear(uid, {
|
|
217
|
+
preserveBackup: true
|
|
160
218
|
});
|
|
161
|
-
|
|
219
|
+
if (!isPluginContentType) {
|
|
220
|
+
// generate new api skeleton
|
|
221
|
+
await generateAPI({
|
|
222
|
+
displayName: updatedContentType.schema.info.displayName,
|
|
223
|
+
singularName: updatedContentType.schema.info.singularName,
|
|
224
|
+
pluralName: updatedContentType.schema.info.pluralName,
|
|
225
|
+
kind: updatedContentType.schema.kind
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
const schemaFilesWritten = await builder.writeFiles();
|
|
229
|
+
if (!schemaFilesWritten) {
|
|
230
|
+
schemaAlreadyRolledBack = true;
|
|
231
|
+
throw new ApplicationError('Invalid schema edition');
|
|
232
|
+
}
|
|
233
|
+
await pruneFolderReferences([
|
|
234
|
+
uid
|
|
235
|
+
]);
|
|
162
236
|
} catch (error) {
|
|
237
|
+
await rollbackSchemaMutation({
|
|
238
|
+
builder,
|
|
239
|
+
apiHandler,
|
|
240
|
+
backedUpApiUids: [
|
|
241
|
+
uid
|
|
242
|
+
],
|
|
243
|
+
schemaAlreadyRolledBack
|
|
244
|
+
});
|
|
245
|
+
throw error;
|
|
246
|
+
}
|
|
247
|
+
for (const error of (await finalizeSchemaMutation({
|
|
248
|
+
apiHandler,
|
|
249
|
+
backedUpApiUids: [
|
|
250
|
+
uid
|
|
251
|
+
]
|
|
252
|
+
}))){
|
|
163
253
|
strapi.log.error(error);
|
|
164
|
-
await apiHandler.rollback(uid);
|
|
165
254
|
}
|
|
166
255
|
return updatedContentType;
|
|
167
256
|
}
|
|
@@ -172,42 +261,103 @@ const createContentTypes = async (contentTypes)=>{
|
|
|
172
261
|
return updatedContentType;
|
|
173
262
|
};
|
|
174
263
|
const deleteContentTypes = async (uids)=>{
|
|
264
|
+
uids.forEach(assertCTBOwnedApplicationContentType);
|
|
175
265
|
const builder = createBuilder();
|
|
176
266
|
const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
267
|
+
const deletedContentTypes = [];
|
|
268
|
+
const backedUpApiUids = [];
|
|
269
|
+
let schemaAlreadyRolledBack = false;
|
|
270
|
+
try {
|
|
271
|
+
for (const uid of uids){
|
|
272
|
+
await apiHandler.backup(uid);
|
|
273
|
+
backedUpApiUids.push(uid);
|
|
274
|
+
deletedContentTypes.push(builder.deleteContentType(uid));
|
|
275
|
+
}
|
|
276
|
+
const schemaFilesWritten = await builder.writeFiles();
|
|
277
|
+
if (!schemaFilesWritten) {
|
|
278
|
+
schemaAlreadyRolledBack = true;
|
|
279
|
+
throw new ApplicationError('Invalid schema edition');
|
|
280
|
+
}
|
|
281
|
+
for (const uid of uids){
|
|
282
|
+
await apiHandler.clear(uid, {
|
|
283
|
+
preserveBackup: true
|
|
284
|
+
});
|
|
187
285
|
}
|
|
286
|
+
await pruneFolderReferences(uids);
|
|
287
|
+
} catch (error) {
|
|
288
|
+
await rollbackSchemaMutation({
|
|
289
|
+
builder,
|
|
290
|
+
apiHandler,
|
|
291
|
+
backedUpApiUids,
|
|
292
|
+
schemaAlreadyRolledBack
|
|
293
|
+
});
|
|
294
|
+
throw error;
|
|
295
|
+
}
|
|
296
|
+
for (const error of (await finalizeSchemaMutation({
|
|
297
|
+
apiHandler,
|
|
298
|
+
backedUpApiUids
|
|
299
|
+
}))){
|
|
300
|
+
strapi.log.error(error);
|
|
301
|
+
}
|
|
302
|
+
for (const contentType of deletedContentTypes){
|
|
303
|
+
strapi.eventHub.emit('content-type.delete', {
|
|
304
|
+
contentType
|
|
305
|
+
});
|
|
188
306
|
}
|
|
189
307
|
};
|
|
190
308
|
/**
|
|
191
309
|
* Deletes a content type and the api files related to it
|
|
192
310
|
*/ const deleteContentType = async (uid, defaultBuilder = undefined)=>{
|
|
311
|
+
assertCTBOwnedApplicationContentType(uid);
|
|
193
312
|
const builder = defaultBuilder || createBuilder();
|
|
194
313
|
// make a backup
|
|
195
314
|
const apiHandler = strapi.plugin('content-type-builder').service('api-handler');
|
|
196
315
|
await apiHandler.backup(uid);
|
|
197
|
-
|
|
316
|
+
let contentType;
|
|
317
|
+
let schemaAlreadyRolledBack = false;
|
|
198
318
|
if (!defaultBuilder) {
|
|
199
319
|
try {
|
|
200
|
-
|
|
201
|
-
await
|
|
202
|
-
|
|
203
|
-
|
|
320
|
+
contentType = builder.deleteContentType(uid);
|
|
321
|
+
const schemaFilesWritten = await builder.writeFiles();
|
|
322
|
+
if (!schemaFilesWritten) {
|
|
323
|
+
schemaAlreadyRolledBack = true;
|
|
324
|
+
throw new ApplicationError('Invalid schema edition');
|
|
325
|
+
}
|
|
326
|
+
await apiHandler.clear(uid, {
|
|
327
|
+
preserveBackup: true
|
|
328
|
+
});
|
|
329
|
+
await pruneFolderReferences([
|
|
330
|
+
uid
|
|
331
|
+
]);
|
|
332
|
+
} catch (error) {
|
|
333
|
+
await rollbackSchemaMutation({
|
|
334
|
+
builder,
|
|
335
|
+
apiHandler,
|
|
336
|
+
backedUpApiUids: [
|
|
337
|
+
uid
|
|
338
|
+
],
|
|
339
|
+
schemaAlreadyRolledBack
|
|
340
|
+
});
|
|
341
|
+
throw error;
|
|
204
342
|
}
|
|
343
|
+
for (const error of (await finalizeSchemaMutation({
|
|
344
|
+
apiHandler,
|
|
345
|
+
backedUpApiUids: [
|
|
346
|
+
uid
|
|
347
|
+
]
|
|
348
|
+
}))){
|
|
349
|
+
strapi.log.error(error);
|
|
350
|
+
}
|
|
351
|
+
} else {
|
|
352
|
+
contentType = builder.deleteContentType(uid);
|
|
353
|
+
}
|
|
354
|
+
if (!defaultBuilder) {
|
|
355
|
+
strapi.eventHub.emit('content-type.delete', {
|
|
356
|
+
contentType
|
|
357
|
+
});
|
|
205
358
|
}
|
|
206
|
-
strapi.eventHub.emit('content-type.delete', {
|
|
207
|
-
contentType
|
|
208
|
-
});
|
|
209
359
|
return contentType;
|
|
210
360
|
};
|
|
211
361
|
|
|
212
|
-
export { createContentType, createContentTypes, deleteContentType, deleteContentTypes, editContentType, formatContentType, generateAPI, getRestrictRelationsTo, isContentTypeVisible };
|
|
362
|
+
export { assertCTBOwnedApplicationContentType, createContentType, createContentTypes, deleteContentType, deleteContentTypes, editContentType, formatContentType, generateAPI, getRestrictRelationsTo, isCTBOwnedApplicationContentType, isContentTypeVisible };
|
|
213
363
|
//# sourceMappingURL=content-types.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-types.mjs","sources":["../../../server/src/services/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { getOr } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { UID, Struct } from '@strapi/types';\nimport { formatAttributes, replaceTemporaryUIDs } from '../utils/attributes';\nimport createBuilder from './schema-builder';\nimport { coreUids, pluginsUids } from './constants';\n\nconst { ApplicationError } = errors;\n\nexport const isContentTypeVisible = (model: Struct.ContentTypeSchema) =>\n getOr(true, 'pluginOptions.content-type-builder.visible', model) === true;\n\nexport const getRestrictRelationsTo = (contentType: Struct.ContentTypeSchema) => {\n const { uid } = contentType;\n if (uid === coreUids.STRAPI_USER) {\n // TODO: replace with an obj { relation: 'x', bidirectional: true|false }\n return ['oneWay', 'manyWay'];\n }\n\n if (\n uid.startsWith(coreUids.PREFIX) ||\n uid === pluginsUids.UPLOAD_FILE ||\n !isContentTypeVisible(contentType)\n ) {\n return [];\n }\n\n return null;\n};\n\n/**\n * Format a contentType info to be used by the front-end\n */\nexport const formatContentType = (contentType: any) => {\n const { uid, kind, modelName, plugin, collectionName, info } = contentType;\n\n return {\n uid,\n plugin,\n apiID: modelName,\n schema: {\n ...contentTypesUtils.getOptions(contentType),\n displayName: info.displayName,\n singularName: info.singularName,\n pluralName: info.pluralName,\n description: _.get(info, 'description', ''),\n pluginOptions: contentType.pluginOptions,\n kind: kind || 'collectionType',\n collectionName,\n attributes: formatAttributes(contentType),\n visible: isContentTypeVisible(contentType),\n restrictRelationsTo: getRestrictRelationsTo(contentType),\n },\n };\n};\n\nexport const createContentTypes = async (contentTypes: any[]) => {\n const builder = createBuilder();\n const createdContentTypes: any[] = [];\n\n for (const contentType of contentTypes) {\n createdContentTypes.push(await createContentType(contentType, { defaultBuilder: builder }));\n }\n\n await builder.writeFiles();\n\n return createdContentTypes;\n};\n\ntype CreateContentTypeOptions = {\n defaultBuilder?: any; // TODO\n};\n\n/**\n * Creates a content type and handle the nested components sent with it\n */\nexport const createContentType = async (\n { contentType, components }: any,\n options: CreateContentTypeOptions = {}\n) => {\n const builder = options.defaultBuilder || createBuilder();\n const uidMap = builder.createNewComponentUIDMap(components || []);\n\n const replaceTmpUIDs = replaceTemporaryUIDs(uidMap);\n\n const newContentType = builder.createContentType(replaceTmpUIDs(contentType));\n\n // allow components to target the new contentType\n const targetContentType = (infos: any) => {\n Object.keys(infos.attributes).forEach((key) => {\n const { target } = infos.attributes[key];\n if (target === '__contentType__') {\n infos.attributes[key].target = newContentType.uid;\n }\n });\n\n return infos;\n };\n\n components?.forEach((component: any) => {\n const options = replaceTmpUIDs(targetContentType(component));\n\n if (!_.has(component, 'uid')) {\n return builder.createComponent(options);\n }\n\n return builder.editComponent(options);\n });\n\n // generate api skeleton\n await generateAPI({\n displayName: contentType!.displayName || contentType!.info.displayName,\n singularName: contentType!.singularName,\n pluralName: contentType!.pluralName,\n kind: contentType!.kind,\n });\n\n if (!options.defaultBuilder) {\n await builder.writeFiles();\n }\n\n strapi.eventHub.emit('content-type.create', { contentType: newContentType });\n\n return newContentType;\n};\n\n/**\n * Generate an API skeleton\n */\nexport const generateAPI = ({\n singularName,\n kind = 'collectionType',\n pluralName,\n displayName,\n}: any) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const strapiGenerators = require('@strapi/generators');\n return strapiGenerators.generate(\n 'content-type',\n {\n kind,\n singularName,\n id: singularName,\n pluralName,\n displayName,\n destination: 'new',\n bootstrapApi: true,\n attributes: [],\n },\n { dir: strapi.dirs.app.root }\n );\n};\n\n/**\n * Edits a contentType and handle the nested contentTypes sent with it\n */\nexport const editContentType = async (\n uid: UID.ContentType,\n { contentType, components = [] }: any\n) => {\n const builder = createBuilder();\n\n const previousSchema = builder.contentTypes.get(uid).schema;\n const previousKind = previousSchema.kind;\n const newKind = contentType.kind || previousKind;\n\n // Restore non-visible attributes from previous schema\n const previousAttributes = previousSchema.attributes;\n const prevNonVisibleAttributes = contentTypesUtils\n .getNonVisibleAttributes(previousSchema)\n .reduce((acc, key) => {\n if (key in previousAttributes) {\n acc[key] = previousAttributes[key];\n }\n\n return acc;\n }, {} as any);\n contentType.attributes = _.merge(prevNonVisibleAttributes, contentType.attributes);\n\n if (newKind !== previousKind && newKind === 'singleType') {\n const entryCount = await strapi.db.query(uid).count();\n if (entryCount > 1) {\n throw new ApplicationError(\n 'You cannot convert a collectionType to a singleType when having multiple entries in DB'\n );\n }\n }\n\n const uidMap = builder.createNewComponentUIDMap(components);\n const replaceTmpUIDs = replaceTemporaryUIDs(uidMap);\n\n const updatedContentType = builder.editContentType({\n uid,\n ...replaceTmpUIDs(contentType),\n });\n\n components.forEach((component: any) => {\n if (!_.has(component, 'uid')) {\n return builder.createComponent(replaceTmpUIDs(component));\n }\n\n return builder.editComponent(replaceTmpUIDs(component));\n });\n\n if (newKind !== previousKind) {\n const apiHandler = strapi.plugin('content-type-builder').service('api-handler');\n await apiHandler.backup(uid);\n\n try {\n await apiHandler.clear(uid);\n\n // generate new api skeleton\n await generateAPI({\n displayName: updatedContentType.schema.info.displayName,\n singularName: updatedContentType.schema.info.singularName,\n pluralName: updatedContentType.schema.info.pluralName,\n kind: updatedContentType.schema.kind,\n });\n\n await builder.writeFiles();\n } catch (error) {\n strapi.log.error(error);\n await apiHandler.rollback(uid);\n }\n\n return updatedContentType;\n }\n\n await builder.writeFiles();\n\n strapi.eventHub.emit('content-type.update', { contentType: updatedContentType });\n\n return updatedContentType;\n};\n\nexport const deleteContentTypes = async (uids: UID.ContentType[]) => {\n const builder = createBuilder();\n const apiHandler = strapi.plugin('content-type-builder').service('api-handler');\n\n for (const uid of uids) {\n await deleteContentType(uid, builder);\n }\n\n await builder.writeFiles();\n for (const uid of uids) {\n try {\n await apiHandler.clear(uid);\n } catch (error) {\n strapi.log.error(error);\n await apiHandler.rollback(uid);\n }\n }\n};\n\n/**\n * Deletes a content type and the api files related to it\n */\nexport const deleteContentType = async (uid: UID.ContentType, defaultBuilder: any = undefined) => {\n const builder = defaultBuilder || createBuilder();\n // make a backup\n const apiHandler = strapi.plugin('content-type-builder').service('api-handler');\n await apiHandler.backup(uid);\n\n const contentType = builder.deleteContentType(uid);\n\n if (!defaultBuilder) {\n try {\n await builder.writeFiles();\n await apiHandler.clear(uid);\n } catch {\n await apiHandler.rollback(uid);\n }\n }\n\n strapi.eventHub.emit('content-type.delete', { contentType });\n\n return contentType;\n};\n"],"names":["ApplicationError","errors","isContentTypeVisible","model","getOr","getRestrictRelationsTo","contentType","uid","coreUids","STRAPI_USER","startsWith","PREFIX","pluginsUids","UPLOAD_FILE","formatContentType","kind","modelName","plugin","collectionName","info","apiID","schema","contentTypesUtils","getOptions","displayName","singularName","pluralName","description","_","get","pluginOptions","attributes","formatAttributes","visible","restrictRelationsTo","createContentTypes","contentTypes","builder","createBuilder","createdContentTypes","push","createContentType","defaultBuilder","writeFiles","components","options","uidMap","createNewComponentUIDMap","replaceTmpUIDs","replaceTemporaryUIDs","newContentType","targetContentType","infos","Object","keys","forEach","key","target","component","has","createComponent","editComponent","generateAPI","strapi","eventHub","emit","strapiGenerators","require","generate","id","destination","bootstrapApi","dir","dirs","app","root","editContentType","previousSchema","previousKind","newKind","previousAttributes","prevNonVisibleAttributes","getNonVisibleAttributes","reduce","acc","merge","entryCount","db","query","count","updatedContentType","apiHandler","service","backup","clear","error","log","rollback","deleteContentTypes","uids","deleteContentType","undefined"],"mappings":";;;;;;;AAQA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;AAEtB,MAAMC,uBAAuB,CAACC,KAAAA,GACnCC,MAAM,IAAA,EAAM,4CAAA,EAA8CD,WAAW;AAEhE,MAAME,yBAAyB,CAACC,WAAAA,GAAAA;IACrC,MAAM,EAAEC,GAAG,EAAE,GAAGD,WAAAA;IAChB,IAAIC,GAAAA,KAAQC,QAAAA,CAASC,WAAW,EAAE;;QAEhC,OAAO;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA;AAC9B,IAAA;AAEA,IAAA,IACEF,GAAAA,CAAIG,UAAU,CAACF,QAAAA,CAASG,MAAM,CAAA,IAC9BJ,GAAAA,KAAQK,WAAAA,CAAYC,WAAW,IAC/B,CAACX,oBAAAA,CAAqBI,WAAAA,CAAAA,EACtB;AACA,QAAA,OAAO,EAAE;AACX,IAAA;IAEA,OAAO,IAAA;AACT;AAEA;;IAGO,MAAMQ,iBAAAA,GAAoB,CAACR,WAAAA,GAAAA;AAChC,IAAA,MAAM,EAAEC,GAAG,EAAEQ,IAAI,EAAEC,SAAS,EAAEC,MAAM,EAAEC,cAAc,EAAEC,IAAI,EAAE,GAAGb,WAAAA;IAE/D,OAAO;AACLC,QAAAA,GAAAA;AACAU,QAAAA,MAAAA;QACAG,KAAAA,EAAOJ,SAAAA;QACPK,MAAAA,EAAQ;YACN,GAAGC,YAAAA,CAAkBC,UAAU,CAACjB,WAAAA,CAAY;AAC5CkB,YAAAA,WAAAA,EAAaL,KAAKK,WAAW;AAC7BC,YAAAA,YAAAA,EAAcN,KAAKM,YAAY;AAC/BC,YAAAA,UAAAA,EAAYP,KAAKO,UAAU;AAC3BC,YAAAA,WAAAA,EAAaC,CAAAA,CAAEC,GAAG,CAACV,IAAAA,EAAM,aAAA,EAAe,EAAA,CAAA;AACxCW,YAAAA,aAAAA,EAAexB,YAAYwB,aAAa;AACxCf,YAAAA,IAAAA,EAAMA,IAAAA,IAAQ,gBAAA;AACdG,YAAAA,cAAAA;AACAa,YAAAA,UAAAA,EAAYC,gBAAAA,CAAiB1B,WAAAA,CAAAA;AAC7B2B,YAAAA,OAAAA,EAAS/B,oBAAAA,CAAqBI,WAAAA,CAAAA;AAC9B4B,YAAAA,mBAAAA,EAAqB7B,sBAAAA,CAAuBC,WAAAA;AAC9C;AACF,KAAA;AACF;AAEO,MAAM6B,qBAAqB,OAAOC,YAAAA,GAAAA;AACvC,IAAA,MAAMC,OAAAA,GAAUC,aAAAA,EAAAA;AAChB,IAAA,MAAMC,sBAA6B,EAAE;IAErC,KAAK,MAAMjC,eAAe8B,YAAAA,CAAc;AACtCG,QAAAA,mBAAAA,CAAoBC,IAAI,CAAC,MAAMC,iBAAAA,CAAkBnC,WAAAA,EAAa;YAAEoC,cAAAA,EAAgBL;AAAQ,SAAA,CAAA,CAAA;AAC1F,IAAA;AAEA,IAAA,MAAMA,QAAQM,UAAU,EAAA;IAExB,OAAOJ,mBAAAA;AACT;AAMA;;AAEC,IACM,MAAME,iBAAAA,GAAoB,OAC/B,EAAEnC,WAAW,EAAEsC,UAAU,EAAO,EAChCC,OAAAA,GAAoC,EAAE,GAAA;IAEtC,MAAMR,OAAAA,GAAUQ,OAAAA,CAAQH,cAAc,IAAIJ,aAAAA,EAAAA;AAC1C,IAAA,MAAMQ,MAAAA,GAAST,OAAAA,CAAQU,wBAAwB,CAACH,cAAc,EAAE,CAAA;AAEhE,IAAA,MAAMI,iBAAiBC,oBAAAA,CAAqBH,MAAAA,CAAAA;AAE5C,IAAA,MAAMI,cAAAA,GAAiBb,OAAAA,CAAQI,iBAAiB,CAACO,cAAAA,CAAe1C,WAAAA,CAAAA,CAAAA;;AAGhE,IAAA,MAAM6C,oBAAoB,CAACC,KAAAA,GAAAA;AACzBC,QAAAA,MAAAA,CAAOC,IAAI,CAACF,KAAAA,CAAMrB,UAAU,CAAA,CAAEwB,OAAO,CAAC,CAACC,GAAAA,GAAAA;AACrC,YAAA,MAAM,EAAEC,MAAM,EAAE,GAAGL,KAAAA,CAAMrB,UAAU,CAACyB,GAAAA,CAAI;AACxC,YAAA,IAAIC,WAAW,iBAAA,EAAmB;AAChCL,gBAAAA,KAAAA,CAAMrB,UAAU,CAACyB,GAAAA,CAAI,CAACC,MAAM,GAAGP,eAAe3C,GAAG;AACnD,YAAA;AACF,QAAA,CAAA,CAAA;QAEA,OAAO6C,KAAAA;AACT,IAAA,CAAA;AAEAR,IAAAA,UAAAA,EAAYW,QAAQ,CAACG,SAAAA,GAAAA;QACnB,MAAMb,OAAAA,GAAUG,eAAeG,iBAAAA,CAAkBO,SAAAA,CAAAA,CAAAA;AAEjD,QAAA,IAAI,CAAC9B,CAAAA,CAAE+B,GAAG,CAACD,WAAW,KAAA,CAAA,EAAQ;YAC5B,OAAOrB,OAAAA,CAAQuB,eAAe,CAACf,OAAAA,CAAAA;AACjC,QAAA;QAEA,OAAOR,OAAAA,CAAQwB,aAAa,CAAChB,OAAAA,CAAAA;AAC/B,IAAA,CAAA,CAAA;;AAGA,IAAA,MAAMiB,WAAAA,CAAY;AAChBtC,QAAAA,WAAAA,EAAalB,YAAakB,WAAW,IAAIlB,WAAAA,CAAaa,IAAI,CAACK,WAAW;AACtEC,QAAAA,YAAAA,EAAcnB,YAAamB,YAAY;AACvCC,QAAAA,UAAAA,EAAYpB,YAAaoB,UAAU;AACnCX,QAAAA,IAAAA,EAAMT,YAAaS;AACrB,KAAA,CAAA;IAEA,IAAI,CAAC8B,OAAAA,CAAQH,cAAc,EAAE;AAC3B,QAAA,MAAML,QAAQM,UAAU,EAAA;AAC1B,IAAA;AAEAoB,IAAAA,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAAC,qBAAA,EAAuB;QAAE3D,WAAAA,EAAa4C;AAAe,KAAA,CAAA;IAE1E,OAAOA,cAAAA;AACT;AAEA;;AAEC,IACM,MAAMY,WAAAA,GAAc,CAAC,EAC1BrC,YAAY,EACZV,IAAAA,GAAO,gBAAgB,EACvBW,UAAU,EACVF,WAAW,EACP,GAAA;;AAEJ,IAAA,MAAM0C,mBAAmBC,OAAAA,CAAQ,oBAAA,CAAA;IACjC,OAAOD,gBAAAA,CAAiBE,QAAQ,CAC9B,cAAA,EACA;AACErD,QAAAA,IAAAA;AACAU,QAAAA,YAAAA;QACA4C,EAAAA,EAAI5C,YAAAA;AACJC,QAAAA,UAAAA;AACAF,QAAAA,WAAAA;QACA8C,WAAAA,EAAa,KAAA;QACbC,YAAAA,EAAc,IAAA;AACdxC,QAAAA,UAAAA,EAAY;KACd,EACA;AAAEyC,QAAAA,GAAAA,EAAKT,MAAAA,CAAOU,IAAI,CAACC,GAAG,CAACC;AAAK,KAAA,CAAA;AAEhC;AAEA;;IAGO,MAAMC,eAAAA,GAAkB,OAC7BrE,GAAAA,EACA,EAAED,WAAW,EAAEsC,UAAAA,GAAa,EAAE,EAAO,GAAA;AAErC,IAAA,MAAMP,OAAAA,GAAUC,aAAAA,EAAAA;AAEhB,IAAA,MAAMuC,iBAAiBxC,OAAAA,CAAQD,YAAY,CAACP,GAAG,CAACtB,KAAKc,MAAM;IAC3D,MAAMyD,YAAAA,GAAeD,eAAe9D,IAAI;IACxC,MAAMgE,OAAAA,GAAUzE,WAAAA,CAAYS,IAAI,IAAI+D,YAAAA;;IAGpC,MAAME,kBAAAA,GAAqBH,eAAe9C,UAAU;IACpD,MAAMkD,wBAAAA,GAA2B3D,aAC9B4D,uBAAuB,CAACL,gBACxBM,MAAM,CAAC,CAACC,GAAAA,EAAK5B,GAAAA,GAAAA;AACZ,QAAA,IAAIA,OAAOwB,kBAAAA,EAAoB;AAC7BI,YAAAA,GAAG,CAAC5B,GAAAA,CAAI,GAAGwB,kBAAkB,CAACxB,GAAAA,CAAI;AACpC,QAAA;QAEA,OAAO4B,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN9E,IAAAA,WAAAA,CAAYyB,UAAU,GAAGH,CAAAA,CAAEyD,KAAK,CAACJ,wBAAAA,EAA0B3E,YAAYyB,UAAU,CAAA;IAEjF,IAAIgD,OAAAA,KAAYD,YAAAA,IAAgBC,OAAAA,KAAY,YAAA,EAAc;QACxD,MAAMO,UAAAA,GAAa,MAAMvB,MAAAA,CAAOwB,EAAE,CAACC,KAAK,CAACjF,KAAKkF,KAAK,EAAA;AACnD,QAAA,IAAIH,aAAa,CAAA,EAAG;AAClB,YAAA,MAAM,IAAItF,gBAAAA,CACR,wFAAA,CAAA;AAEJ,QAAA;AACF,IAAA;IAEA,MAAM8C,MAAAA,GAAST,OAAAA,CAAQU,wBAAwB,CAACH,UAAAA,CAAAA;AAChD,IAAA,MAAMI,iBAAiBC,oBAAAA,CAAqBH,MAAAA,CAAAA;IAE5C,MAAM4C,kBAAAA,GAAqBrD,OAAAA,CAAQuC,eAAe,CAAC;AACjDrE,QAAAA,GAAAA;AACA,QAAA,GAAGyC,eAAe1C,WAAAA;AACpB,KAAA,CAAA;IAEAsC,UAAAA,CAAWW,OAAO,CAAC,CAACG,SAAAA,GAAAA;AAClB,QAAA,IAAI,CAAC9B,CAAAA,CAAE+B,GAAG,CAACD,WAAW,KAAA,CAAA,EAAQ;YAC5B,OAAOrB,OAAAA,CAAQuB,eAAe,CAACZ,cAAAA,CAAeU,SAAAA,CAAAA,CAAAA;AAChD,QAAA;QAEA,OAAOrB,OAAAA,CAAQwB,aAAa,CAACb,cAAAA,CAAeU,SAAAA,CAAAA,CAAAA;AAC9C,IAAA,CAAA,CAAA;AAEA,IAAA,IAAIqB,YAAYD,YAAAA,EAAc;AAC5B,QAAA,MAAMa,aAAa5B,MAAAA,CAAO9C,MAAM,CAAC,sBAAA,CAAA,CAAwB2E,OAAO,CAAC,aAAA,CAAA;QACjE,MAAMD,UAAAA,CAAWE,MAAM,CAACtF,GAAAA,CAAAA;QAExB,IAAI;YACF,MAAMoF,UAAAA,CAAWG,KAAK,CAACvF,GAAAA,CAAAA;;AAGvB,YAAA,MAAMuD,WAAAA,CAAY;AAChBtC,gBAAAA,WAAAA,EAAakE,kBAAAA,CAAmBrE,MAAM,CAACF,IAAI,CAACK,WAAW;AACvDC,gBAAAA,YAAAA,EAAciE,kBAAAA,CAAmBrE,MAAM,CAACF,IAAI,CAACM,YAAY;AACzDC,gBAAAA,UAAAA,EAAYgE,kBAAAA,CAAmBrE,MAAM,CAACF,IAAI,CAACO,UAAU;gBACrDX,IAAAA,EAAM2E,kBAAAA,CAAmBrE,MAAM,CAACN;AAClC,aAAA,CAAA;AAEA,YAAA,MAAMsB,QAAQM,UAAU,EAAA;AAC1B,QAAA,CAAA,CAAE,OAAOoD,KAAAA,EAAO;YACdhC,MAAAA,CAAOiC,GAAG,CAACD,KAAK,CAACA,KAAAA,CAAAA;YACjB,MAAMJ,UAAAA,CAAWM,QAAQ,CAAC1F,GAAAA,CAAAA;AAC5B,QAAA;QAEA,OAAOmF,kBAAAA;AACT,IAAA;AAEA,IAAA,MAAMrD,QAAQM,UAAU,EAAA;AAExBoB,IAAAA,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAAC,qBAAA,EAAuB;QAAE3D,WAAAA,EAAaoF;AAAmB,KAAA,CAAA;IAE9E,OAAOA,kBAAAA;AACT;AAEO,MAAMQ,qBAAqB,OAAOC,IAAAA,GAAAA;AACvC,IAAA,MAAM9D,OAAAA,GAAUC,aAAAA,EAAAA;AAChB,IAAA,MAAMqD,aAAa5B,MAAAA,CAAO9C,MAAM,CAAC,sBAAA,CAAA,CAAwB2E,OAAO,CAAC,aAAA,CAAA;IAEjE,KAAK,MAAMrF,OAAO4F,IAAAA,CAAM;AACtB,QAAA,MAAMC,kBAAkB7F,GAAAA,EAAK8B,OAAAA,CAAAA;AAC/B,IAAA;AAEA,IAAA,MAAMA,QAAQM,UAAU,EAAA;IACxB,KAAK,MAAMpC,OAAO4F,IAAAA,CAAM;QACtB,IAAI;YACF,MAAMR,UAAAA,CAAWG,KAAK,CAACvF,GAAAA,CAAAA;AACzB,QAAA,CAAA,CAAE,OAAOwF,KAAAA,EAAO;YACdhC,MAAAA,CAAOiC,GAAG,CAACD,KAAK,CAACA,KAAAA,CAAAA;YACjB,MAAMJ,UAAAA,CAAWM,QAAQ,CAAC1F,GAAAA,CAAAA;AAC5B,QAAA;AACF,IAAA;AACF;AAEA;;AAEC,IACM,MAAM6F,iBAAAA,GAAoB,OAAO7F,GAAAA,EAAsBmC,iBAAsB2D,SAAS,GAAA;AAC3F,IAAA,MAAMhE,UAAUK,cAAAA,IAAkBJ,aAAAA,EAAAA;;AAElC,IAAA,MAAMqD,aAAa5B,MAAAA,CAAO9C,MAAM,CAAC,sBAAA,CAAA,CAAwB2E,OAAO,CAAC,aAAA,CAAA;IACjE,MAAMD,UAAAA,CAAWE,MAAM,CAACtF,GAAAA,CAAAA;IAExB,MAAMD,WAAAA,GAAc+B,OAAAA,CAAQ+D,iBAAiB,CAAC7F,GAAAA,CAAAA;AAE9C,IAAA,IAAI,CAACmC,cAAAA,EAAgB;QACnB,IAAI;AACF,YAAA,MAAML,QAAQM,UAAU,EAAA;YACxB,MAAMgD,UAAAA,CAAWG,KAAK,CAACvF,GAAAA,CAAAA;AACzB,QAAA,CAAA,CAAE,OAAM;YACN,MAAMoF,UAAAA,CAAWM,QAAQ,CAAC1F,GAAAA,CAAAA;AAC5B,QAAA;AACF,IAAA;AAEAwD,IAAAA,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAAC,qBAAA,EAAuB;AAAE3D,QAAAA;AAAY,KAAA,CAAA;IAE1D,OAAOA,WAAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"content-types.mjs","sources":["../../../server/src/services/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { getOr } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { UID, Struct } from '@strapi/types';\nimport { formatAttributes, replaceTemporaryUIDs } from '../utils/attributes';\nimport { getService } from '../utils';\nimport createBuilder from './schema-builder';\nimport { finalizeSchemaMutation, rollbackSchemaMutation } from './schema-mutation';\nimport { coreUids, pluginsUids } from './constants';\n\nconst { ApplicationError } = errors;\n\nexport const isCTBOwnedApplicationContentType = (uid: UID.ContentType): boolean =>\n uid.startsWith('api::');\n\nexport const assertCTBOwnedApplicationContentType = (uid: UID.ContentType): void => {\n if (!isCTBOwnedApplicationContentType(uid)) {\n throw new ApplicationError(`Content type \"${uid}\" is not managed by CTB and cannot be deleted`);\n }\n};\n\nconst pruneFolderReferences = (uids: UID.ContentType[]) => {\n return getService('content-structure').commitFromUpdate({ deletedUids: new Set(uids) });\n};\n\nexport const isContentTypeVisible = (model: Struct.ContentTypeSchema) =>\n getOr(true, 'pluginOptions.content-type-builder.visible', model) === true;\n\nexport const getRestrictRelationsTo = (contentType: Struct.ContentTypeSchema) => {\n const { uid } = contentType;\n if (uid === coreUids.STRAPI_USER) {\n // TODO: replace with an obj { relation: 'x', bidirectional: true|false }\n return ['oneWay', 'manyWay'];\n }\n\n if (\n uid.startsWith(coreUids.PREFIX) ||\n uid === pluginsUids.UPLOAD_FILE ||\n !isContentTypeVisible(contentType)\n ) {\n return [];\n }\n\n return null;\n};\n\n/**\n * Format a contentType info to be used by the front-end\n */\nexport const formatContentType = (contentType: any) => {\n const { uid, kind, modelName, plugin, collectionName, info } = contentType;\n\n return {\n uid,\n plugin,\n apiID: modelName,\n schema: {\n ...contentTypesUtils.getOptions(contentType),\n displayName: info.displayName,\n singularName: info.singularName,\n pluralName: info.pluralName,\n description: _.get(info, 'description', ''),\n pluginOptions: contentType.pluginOptions,\n kind: kind || 'collectionType',\n collectionName,\n attributes: formatAttributes(contentType),\n visible: isContentTypeVisible(contentType),\n restrictRelationsTo: getRestrictRelationsTo(contentType),\n },\n };\n};\n\nexport const createContentTypes = async (contentTypes: any[]) => {\n const builder = createBuilder();\n const createdContentTypes: any[] = [];\n const generatedApiNames: string[] = [];\n let schemaAlreadyRolledBack = false;\n\n try {\n for (const contentType of contentTypes) {\n createdContentTypes.push(\n await createContentType(contentType, {\n defaultBuilder: builder,\n generatedApiNames,\n deferEvent: true,\n })\n );\n }\n\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n } catch (error) {\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n generatedApiNames,\n schemaAlreadyRolledBack,\n });\n\n throw error;\n }\n\n for (const contentType of createdContentTypes) {\n strapi.eventHub.emit('content-type.create', { contentType });\n }\n\n return createdContentTypes;\n};\n\ntype CreateContentTypeOptions = {\n defaultBuilder?: any; // TODO\n generatedApiNames?: string[];\n deferEvent?: boolean;\n};\n\n/**\n * Creates a content type and handle the nested components sent with it\n */\nexport const createContentType = async (\n { contentType, components }: any,\n options: CreateContentTypeOptions = {}\n) => {\n const builder = options.defaultBuilder || createBuilder();\n const uidMap = builder.createNewComponentUIDMap(components || []);\n\n const replaceTmpUIDs = replaceTemporaryUIDs(uidMap);\n\n const newContentType = builder.createContentType(replaceTmpUIDs(contentType));\n\n // allow components to target the new contentType\n const targetContentType = (infos: any) => {\n Object.keys(infos.attributes).forEach((key) => {\n const { target } = infos.attributes[key];\n if (target === '__contentType__') {\n infos.attributes[key].target = newContentType.uid;\n }\n });\n\n return infos;\n };\n\n components?.forEach((component: any) => {\n const options = replaceTmpUIDs(targetContentType(component));\n\n if (!_.has(component, 'uid')) {\n return builder.createComponent(options);\n }\n\n return builder.editComponent(options);\n });\n\n const generatedApiNames = options.generatedApiNames ?? [];\n let schemaAlreadyRolledBack = false;\n\n try {\n // Generate before writing the schema so a successful mutation retains the existing layout.\n if (!contentType.plugin) {\n generatedApiNames.push(contentType.singularName);\n\n await generateAPI({\n displayName: contentType!.displayName || contentType!.info.displayName,\n singularName: contentType!.singularName,\n pluralName: contentType!.pluralName,\n kind: contentType!.kind,\n });\n }\n\n if (!options.defaultBuilder) {\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n }\n } catch (error) {\n if (!options.defaultBuilder) {\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n generatedApiNames,\n schemaAlreadyRolledBack,\n });\n }\n\n throw error;\n }\n\n if (!options.deferEvent) {\n strapi.eventHub.emit('content-type.create', { contentType: newContentType });\n }\n\n return newContentType;\n};\n\n/**\n * Generate an API skeleton\n */\nexport const generateAPI = ({\n singularName,\n kind = 'collectionType',\n pluralName,\n displayName,\n}: any) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const strapiGenerators = require('@strapi/generators');\n return strapiGenerators.generate(\n 'content-type',\n {\n kind,\n singularName,\n id: singularName,\n pluralName,\n displayName,\n destination: 'new',\n bootstrapApi: true,\n attributes: [],\n },\n { dir: strapi.dirs.app.root }\n );\n};\n\n/**\n * Edits a contentType and handle the nested contentTypes sent with it\n */\nexport const editContentType = async (\n uid: UID.ContentType,\n { contentType, components = [] }: any\n) => {\n const builder = createBuilder();\n\n const previousSchema = builder.contentTypes.get(uid).schema;\n const isPluginContentType = Boolean(builder.contentTypes.get(uid).plugin);\n const previousKind = previousSchema.kind;\n const newKind = contentType.kind || previousKind;\n\n // Restore non-visible attributes from previous schema\n const previousAttributes = previousSchema.attributes;\n const prevNonVisibleAttributes = contentTypesUtils\n .getNonVisibleAttributes(previousSchema)\n .reduce((acc, key) => {\n if (key in previousAttributes) {\n acc[key] = previousAttributes[key];\n }\n\n return acc;\n }, {} as any);\n contentType.attributes = _.merge(prevNonVisibleAttributes, contentType.attributes);\n\n if (newKind !== previousKind && newKind === 'singleType') {\n const entryCount = await strapi.db.query(uid).count();\n if (entryCount > 1) {\n throw new ApplicationError(\n 'You cannot convert a collectionType to a singleType when having multiple entries in DB'\n );\n }\n }\n\n const uidMap = builder.createNewComponentUIDMap(components);\n const replaceTmpUIDs = replaceTemporaryUIDs(uidMap);\n\n const updatedContentType = builder.editContentType({\n uid,\n ...replaceTmpUIDs(contentType),\n });\n\n components.forEach((component: any) => {\n if (!_.has(component, 'uid')) {\n return builder.createComponent(replaceTmpUIDs(component));\n }\n\n return builder.editComponent(replaceTmpUIDs(component));\n });\n\n if (newKind !== previousKind) {\n let schemaAlreadyRolledBack = false;\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n await apiHandler.backup(uid);\n\n try {\n await apiHandler.clear(uid, { preserveBackup: true });\n\n if (!isPluginContentType) {\n // generate new api skeleton\n await generateAPI({\n displayName: updatedContentType.schema.info.displayName,\n singularName: updatedContentType.schema.info.singularName,\n pluralName: updatedContentType.schema.info.pluralName,\n kind: updatedContentType.schema.kind,\n });\n }\n\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n await pruneFolderReferences([uid]);\n } catch (error) {\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n backedUpApiUids: [uid],\n schemaAlreadyRolledBack,\n });\n\n throw error;\n }\n\n for (const error of await finalizeSchemaMutation({ apiHandler, backedUpApiUids: [uid] })) {\n strapi.log.error(error);\n }\n\n return updatedContentType;\n }\n\n await builder.writeFiles();\n\n strapi.eventHub.emit('content-type.update', { contentType: updatedContentType });\n\n return updatedContentType;\n};\n\nexport const deleteContentTypes = async (uids: UID.ContentType[]) => {\n uids.forEach(assertCTBOwnedApplicationContentType);\n\n const builder = createBuilder();\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n\n const deletedContentTypes: any[] = [];\n const backedUpApiUids: UID.ContentType[] = [];\n let schemaAlreadyRolledBack = false;\n\n try {\n for (const uid of uids) {\n await apiHandler.backup(uid);\n backedUpApiUids.push(uid);\n deletedContentTypes.push(builder.deleteContentType(uid));\n }\n\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n\n for (const uid of uids) {\n await apiHandler.clear(uid, { preserveBackup: true });\n }\n\n await pruneFolderReferences(uids);\n } catch (error) {\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n backedUpApiUids,\n schemaAlreadyRolledBack,\n });\n\n throw error;\n }\n\n for (const error of await finalizeSchemaMutation({ apiHandler, backedUpApiUids })) {\n strapi.log.error(error);\n }\n\n for (const contentType of deletedContentTypes) {\n strapi.eventHub.emit('content-type.delete', { contentType });\n }\n};\n\n/**\n * Deletes a content type and the api files related to it\n */\nexport const deleteContentType = async (uid: UID.ContentType, defaultBuilder: any = undefined) => {\n assertCTBOwnedApplicationContentType(uid);\n\n const builder = defaultBuilder || createBuilder();\n // make a backup\n const apiHandler = strapi\n .plugin('content-type-builder')\n .service('api-handler') as typeof import('./api-handler');\n await apiHandler.backup(uid);\n\n let contentType;\n let schemaAlreadyRolledBack = false;\n\n if (!defaultBuilder) {\n try {\n contentType = builder.deleteContentType(uid);\n const schemaFilesWritten = await builder.writeFiles();\n if (!schemaFilesWritten) {\n schemaAlreadyRolledBack = true;\n throw new ApplicationError('Invalid schema edition');\n }\n await apiHandler.clear(uid, { preserveBackup: true });\n await pruneFolderReferences([uid]);\n } catch (error) {\n await rollbackSchemaMutation({\n builder,\n apiHandler,\n backedUpApiUids: [uid],\n schemaAlreadyRolledBack,\n });\n\n throw error;\n }\n\n for (const error of await finalizeSchemaMutation({ apiHandler, backedUpApiUids: [uid] })) {\n strapi.log.error(error);\n }\n } else {\n contentType = builder.deleteContentType(uid);\n }\n\n if (!defaultBuilder) {\n strapi.eventHub.emit('content-type.delete', { contentType });\n }\n\n return contentType;\n};\n"],"names":["ApplicationError","errors","isCTBOwnedApplicationContentType","uid","startsWith","assertCTBOwnedApplicationContentType","pruneFolderReferences","uids","getService","commitFromUpdate","deletedUids","Set","isContentTypeVisible","model","getOr","getRestrictRelationsTo","contentType","coreUids","STRAPI_USER","PREFIX","pluginsUids","UPLOAD_FILE","formatContentType","kind","modelName","plugin","collectionName","info","apiID","schema","contentTypesUtils","getOptions","displayName","singularName","pluralName","description","_","get","pluginOptions","attributes","formatAttributes","visible","restrictRelationsTo","createContentTypes","contentTypes","builder","createBuilder","createdContentTypes","generatedApiNames","schemaAlreadyRolledBack","push","createContentType","defaultBuilder","deferEvent","schemaFilesWritten","writeFiles","error","apiHandler","strapi","service","rollbackSchemaMutation","eventHub","emit","components","options","uidMap","createNewComponentUIDMap","replaceTmpUIDs","replaceTemporaryUIDs","newContentType","targetContentType","infos","Object","keys","forEach","key","target","component","has","createComponent","editComponent","generateAPI","strapiGenerators","require","generate","id","destination","bootstrapApi","dir","dirs","app","root","editContentType","previousSchema","isPluginContentType","Boolean","previousKind","newKind","previousAttributes","prevNonVisibleAttributes","getNonVisibleAttributes","reduce","acc","merge","entryCount","db","query","count","updatedContentType","backup","clear","preserveBackup","backedUpApiUids","finalizeSchemaMutation","log","deleteContentTypes","deletedContentTypes","deleteContentType","undefined"],"mappings":";;;;;;;;;AAUA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;MAEhBC,gCAAAA,GAAmC,CAACC,MAC/CA,GAAAA,CAAIC,UAAU,CAAC,OAAA;AAEV,MAAMC,uCAAuC,CAACF,GAAAA,GAAAA;IACnD,IAAI,CAACD,iCAAiCC,GAAAA,CAAAA,EAAM;AAC1C,QAAA,MAAM,IAAIH,gBAAAA,CAAiB,CAAC,cAAc,EAAEG,GAAAA,CAAI,6CAA6C,CAAC,CAAA;AAChG,IAAA;AACF;AAEA,MAAMG,wBAAwB,CAACC,IAAAA,GAAAA;IAC7B,OAAOC,UAAAA,CAAW,mBAAA,CAAA,CAAqBC,gBAAgB,CAAC;AAAEC,QAAAA,WAAAA,EAAa,IAAIC,GAAAA,CAAIJ,IAAAA;AAAM,KAAA,CAAA;AACvF,CAAA;AAEO,MAAMK,uBAAuB,CAACC,KAAAA,GACnCC,MAAM,IAAA,EAAM,4CAAA,EAA8CD,WAAW;AAEhE,MAAME,yBAAyB,CAACC,WAAAA,GAAAA;IACrC,MAAM,EAAEb,GAAG,EAAE,GAAGa,WAAAA;IAChB,IAAIb,GAAAA,KAAQc,QAAAA,CAASC,WAAW,EAAE;;QAEhC,OAAO;AAAC,YAAA,QAAA;AAAU,YAAA;AAAU,SAAA;AAC9B,IAAA;AAEA,IAAA,IACEf,GAAAA,CAAIC,UAAU,CAACa,QAAAA,CAASE,MAAM,CAAA,IAC9BhB,GAAAA,KAAQiB,WAAAA,CAAYC,WAAW,IAC/B,CAACT,oBAAAA,CAAqBI,WAAAA,CAAAA,EACtB;AACA,QAAA,OAAO,EAAE;AACX,IAAA;IAEA,OAAO,IAAA;AACT;AAEA;;IAGO,MAAMM,iBAAAA,GAAoB,CAACN,WAAAA,GAAAA;AAChC,IAAA,MAAM,EAAEb,GAAG,EAAEoB,IAAI,EAAEC,SAAS,EAAEC,MAAM,EAAEC,cAAc,EAAEC,IAAI,EAAE,GAAGX,WAAAA;IAE/D,OAAO;AACLb,QAAAA,GAAAA;AACAsB,QAAAA,MAAAA;QACAG,KAAAA,EAAOJ,SAAAA;QACPK,MAAAA,EAAQ;YACN,GAAGC,YAAAA,CAAkBC,UAAU,CAACf,WAAAA,CAAY;AAC5CgB,YAAAA,WAAAA,EAAaL,KAAKK,WAAW;AAC7BC,YAAAA,YAAAA,EAAcN,KAAKM,YAAY;AAC/BC,YAAAA,UAAAA,EAAYP,KAAKO,UAAU;AAC3BC,YAAAA,WAAAA,EAAaC,CAAAA,CAAEC,GAAG,CAACV,IAAAA,EAAM,aAAA,EAAe,EAAA,CAAA;AACxCW,YAAAA,aAAAA,EAAetB,YAAYsB,aAAa;AACxCf,YAAAA,IAAAA,EAAMA,IAAAA,IAAQ,gBAAA;AACdG,YAAAA,cAAAA;AACAa,YAAAA,UAAAA,EAAYC,gBAAAA,CAAiBxB,WAAAA,CAAAA;AAC7ByB,YAAAA,OAAAA,EAAS7B,oBAAAA,CAAqBI,WAAAA,CAAAA;AAC9B0B,YAAAA,mBAAAA,EAAqB3B,sBAAAA,CAAuBC,WAAAA;AAC9C;AACF,KAAA;AACF;AAEO,MAAM2B,qBAAqB,OAAOC,YAAAA,GAAAA;AACvC,IAAA,MAAMC,OAAAA,GAAUC,aAAAA,EAAAA;AAChB,IAAA,MAAMC,sBAA6B,EAAE;AACrC,IAAA,MAAMC,oBAA8B,EAAE;AACtC,IAAA,IAAIC,uBAAAA,GAA0B,KAAA;IAE9B,IAAI;QACF,KAAK,MAAMjC,eAAe4B,YAAAA,CAAc;AACtCG,YAAAA,mBAAAA,CAAoBG,IAAI,CACtB,MAAMC,iBAAAA,CAAkBnC,WAAAA,EAAa;gBACnCoC,cAAAA,EAAgBP,OAAAA;AAChBG,gBAAAA,iBAAAA;gBACAK,UAAAA,EAAY;AACd,aAAA,CAAA,CAAA;AAEJ,QAAA;QAEA,MAAMC,kBAAAA,GAAqB,MAAMT,OAAAA,CAAQU,UAAU,EAAA;AACnD,QAAA,IAAI,CAACD,kBAAAA,EAAoB;YACvBL,uBAAAA,GAA0B,IAAA;AAC1B,YAAA,MAAM,IAAIjD,gBAAAA,CAAiB,wBAAA,CAAA;AAC7B,QAAA;AACF,IAAA,CAAA,CAAE,OAAOwD,KAAAA,EAAO;AACd,QAAA,MAAMC,aAAaC,MAAAA,CAChBjC,MAAM,CAAC,sBAAA,CAAA,CACPkC,OAAO,CAAC,aAAA,CAAA;AACX,QAAA,MAAMC,sBAAAA,CAAuB;AAC3Bf,YAAAA,OAAAA;AACAY,YAAAA,UAAAA;AACAT,YAAAA,iBAAAA;AACAC,YAAAA;AACF,SAAA,CAAA;QAEA,MAAMO,KAAAA;AACR,IAAA;IAEA,KAAK,MAAMxC,eAAe+B,mBAAAA,CAAqB;AAC7CW,QAAAA,MAAAA,CAAOG,QAAQ,CAACC,IAAI,CAAC,qBAAA,EAAuB;AAAE9C,YAAAA;AAAY,SAAA,CAAA;AAC5D,IAAA;IAEA,OAAO+B,mBAAAA;AACT;AAQA;;AAEC,IACM,MAAMI,iBAAAA,GAAoB,OAC/B,EAAEnC,WAAW,EAAE+C,UAAU,EAAO,EAChCC,OAAAA,GAAoC,EAAE,GAAA;IAEtC,MAAMnB,OAAAA,GAAUmB,OAAAA,CAAQZ,cAAc,IAAIN,aAAAA,EAAAA;AAC1C,IAAA,MAAMmB,MAAAA,GAASpB,OAAAA,CAAQqB,wBAAwB,CAACH,cAAc,EAAE,CAAA;AAEhE,IAAA,MAAMI,iBAAiBC,oBAAAA,CAAqBH,MAAAA,CAAAA;AAE5C,IAAA,MAAMI,cAAAA,GAAiBxB,OAAAA,CAAQM,iBAAiB,CAACgB,cAAAA,CAAenD,WAAAA,CAAAA,CAAAA;;AAGhE,IAAA,MAAMsD,oBAAoB,CAACC,KAAAA,GAAAA;AACzBC,QAAAA,MAAAA,CAAOC,IAAI,CAACF,KAAAA,CAAMhC,UAAU,CAAA,CAAEmC,OAAO,CAAC,CAACC,GAAAA,GAAAA;AACrC,YAAA,MAAM,EAAEC,MAAM,EAAE,GAAGL,KAAAA,CAAMhC,UAAU,CAACoC,GAAAA,CAAI;AACxC,YAAA,IAAIC,WAAW,iBAAA,EAAmB;AAChCL,gBAAAA,KAAAA,CAAMhC,UAAU,CAACoC,GAAAA,CAAI,CAACC,MAAM,GAAGP,eAAelE,GAAG;AACnD,YAAA;AACF,QAAA,CAAA,CAAA;QAEA,OAAOoE,KAAAA;AACT,IAAA,CAAA;AAEAR,IAAAA,UAAAA,EAAYW,QAAQ,CAACG,SAAAA,GAAAA;QACnB,MAAMb,OAAAA,GAAUG,eAAeG,iBAAAA,CAAkBO,SAAAA,CAAAA,CAAAA;AAEjD,QAAA,IAAI,CAACzC,CAAAA,CAAE0C,GAAG,CAACD,WAAW,KAAA,CAAA,EAAQ;YAC5B,OAAOhC,OAAAA,CAAQkC,eAAe,CAACf,OAAAA,CAAAA;AACjC,QAAA;QAEA,OAAOnB,OAAAA,CAAQmC,aAAa,CAAChB,OAAAA,CAAAA;AAC/B,IAAA,CAAA,CAAA;AAEA,IAAA,MAAMhB,iBAAAA,GAAoBgB,OAAAA,CAAQhB,iBAAiB,IAAI,EAAE;AACzD,IAAA,IAAIC,uBAAAA,GAA0B,KAAA;IAE9B,IAAI;;QAEF,IAAI,CAACjC,WAAAA,CAAYS,MAAM,EAAE;YACvBuB,iBAAAA,CAAkBE,IAAI,CAAClC,WAAAA,CAAYiB,YAAY,CAAA;AAE/C,YAAA,MAAMgD,WAAAA,CAAY;AAChBjD,gBAAAA,WAAAA,EAAahB,YAAagB,WAAW,IAAIhB,WAAAA,CAAaW,IAAI,CAACK,WAAW;AACtEC,gBAAAA,YAAAA,EAAcjB,YAAaiB,YAAY;AACvCC,gBAAAA,UAAAA,EAAYlB,YAAakB,UAAU;AACnCX,gBAAAA,IAAAA,EAAMP,YAAaO;AACrB,aAAA,CAAA;AACF,QAAA;QAEA,IAAI,CAACyC,OAAAA,CAAQZ,cAAc,EAAE;YAC3B,MAAME,kBAAAA,GAAqB,MAAMT,OAAAA,CAAQU,UAAU,EAAA;AACnD,YAAA,IAAI,CAACD,kBAAAA,EAAoB;gBACvBL,uBAAAA,GAA0B,IAAA;AAC1B,gBAAA,MAAM,IAAIjD,gBAAAA,CAAiB,wBAAA,CAAA;AAC7B,YAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAE,OAAOwD,KAAAA,EAAO;QACd,IAAI,CAACQ,OAAAA,CAAQZ,cAAc,EAAE;AAC3B,YAAA,MAAMK,aAAaC,MAAAA,CAChBjC,MAAM,CAAC,sBAAA,CAAA,CACPkC,OAAO,CAAC,aAAA,CAAA;AACX,YAAA,MAAMC,sBAAAA,CAAuB;AAC3Bf,gBAAAA,OAAAA;AACAY,gBAAAA,UAAAA;AACAT,gBAAAA,iBAAAA;AACAC,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;QAEA,MAAMO,KAAAA;AACR,IAAA;IAEA,IAAI,CAACQ,OAAAA,CAAQX,UAAU,EAAE;AACvBK,QAAAA,MAAAA,CAAOG,QAAQ,CAACC,IAAI,CAAC,qBAAA,EAAuB;YAAE9C,WAAAA,EAAaqD;AAAe,SAAA,CAAA;AAC5E,IAAA;IAEA,OAAOA,cAAAA;AACT;AAEA;;AAEC,IACM,MAAMY,WAAAA,GAAc,CAAC,EAC1BhD,YAAY,EACZV,IAAAA,GAAO,gBAAgB,EACvBW,UAAU,EACVF,WAAW,EACP,GAAA;;AAEJ,IAAA,MAAMkD,mBAAmBC,OAAAA,CAAQ,oBAAA,CAAA;IACjC,OAAOD,gBAAAA,CAAiBE,QAAQ,CAC9B,cAAA,EACA;AACE7D,QAAAA,IAAAA;AACAU,QAAAA,YAAAA;QACAoD,EAAAA,EAAIpD,YAAAA;AACJC,QAAAA,UAAAA;AACAF,QAAAA,WAAAA;QACAsD,WAAAA,EAAa,KAAA;QACbC,YAAAA,EAAc,IAAA;AACdhD,QAAAA,UAAAA,EAAY;KACd,EACA;AAAEiD,QAAAA,GAAAA,EAAK9B,MAAAA,CAAO+B,IAAI,CAACC,GAAG,CAACC;AAAK,KAAA,CAAA;AAEhC;AAEA;;IAGO,MAAMC,eAAAA,GAAkB,OAC7BzF,GAAAA,EACA,EAAEa,WAAW,EAAE+C,UAAAA,GAAa,EAAE,EAAO,GAAA;AAErC,IAAA,MAAMlB,OAAAA,GAAUC,aAAAA,EAAAA;AAEhB,IAAA,MAAM+C,iBAAiBhD,OAAAA,CAAQD,YAAY,CAACP,GAAG,CAAClC,KAAK0B,MAAM;IAC3D,MAAMiE,mBAAAA,GAAsBC,QAAQlD,OAAAA,CAAQD,YAAY,CAACP,GAAG,CAAClC,KAAKsB,MAAM,CAAA;IACxE,MAAMuE,YAAAA,GAAeH,eAAetE,IAAI;IACxC,MAAM0E,OAAAA,GAAUjF,WAAAA,CAAYO,IAAI,IAAIyE,YAAAA;;IAGpC,MAAME,kBAAAA,GAAqBL,eAAetD,UAAU;IACpD,MAAM4D,wBAAAA,GAA2BrE,aAC9BsE,uBAAuB,CAACP,gBACxBQ,MAAM,CAAC,CAACC,GAAAA,EAAK3B,GAAAA,GAAAA;AACZ,QAAA,IAAIA,OAAOuB,kBAAAA,EAAoB;AAC7BI,YAAAA,GAAG,CAAC3B,GAAAA,CAAI,GAAGuB,kBAAkB,CAACvB,GAAAA,CAAI;AACpC,QAAA;QAEA,OAAO2B,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACNtF,IAAAA,WAAAA,CAAYuB,UAAU,GAAGH,CAAAA,CAAEmE,KAAK,CAACJ,wBAAAA,EAA0BnF,YAAYuB,UAAU,CAAA;IAEjF,IAAI0D,OAAAA,KAAYD,YAAAA,IAAgBC,OAAAA,KAAY,YAAA,EAAc;QACxD,MAAMO,UAAAA,GAAa,MAAM9C,MAAAA,CAAO+C,EAAE,CAACC,KAAK,CAACvG,KAAKwG,KAAK,EAAA;AACnD,QAAA,IAAIH,aAAa,CAAA,EAAG;AAClB,YAAA,MAAM,IAAIxG,gBAAAA,CACR,wFAAA,CAAA;AAEJ,QAAA;AACF,IAAA;IAEA,MAAMiE,MAAAA,GAASpB,OAAAA,CAAQqB,wBAAwB,CAACH,UAAAA,CAAAA;AAChD,IAAA,MAAMI,iBAAiBC,oBAAAA,CAAqBH,MAAAA,CAAAA;IAE5C,MAAM2C,kBAAAA,GAAqB/D,OAAAA,CAAQ+C,eAAe,CAAC;AACjDzF,QAAAA,GAAAA;AACA,QAAA,GAAGgE,eAAenD,WAAAA;AACpB,KAAA,CAAA;IAEA+C,UAAAA,CAAWW,OAAO,CAAC,CAACG,SAAAA,GAAAA;AAClB,QAAA,IAAI,CAACzC,CAAAA,CAAE0C,GAAG,CAACD,WAAW,KAAA,CAAA,EAAQ;YAC5B,OAAOhC,OAAAA,CAAQkC,eAAe,CAACZ,cAAAA,CAAeU,SAAAA,CAAAA,CAAAA;AAChD,QAAA;QAEA,OAAOhC,OAAAA,CAAQmC,aAAa,CAACb,cAAAA,CAAeU,SAAAA,CAAAA,CAAAA;AAC9C,IAAA,CAAA,CAAA;AAEA,IAAA,IAAIoB,YAAYD,YAAAA,EAAc;AAC5B,QAAA,IAAI/C,uBAAAA,GAA0B,KAAA;AAC9B,QAAA,MAAMQ,aAAaC,MAAAA,CAChBjC,MAAM,CAAC,sBAAA,CAAA,CACPkC,OAAO,CAAC,aAAA,CAAA;QACX,MAAMF,UAAAA,CAAWoD,MAAM,CAAC1G,GAAAA,CAAAA;QAExB,IAAI;YACF,MAAMsD,UAAAA,CAAWqD,KAAK,CAAC3G,GAAAA,EAAK;gBAAE4G,cAAAA,EAAgB;AAAK,aAAA,CAAA;AAEnD,YAAA,IAAI,CAACjB,mBAAAA,EAAqB;;AAExB,gBAAA,MAAMb,WAAAA,CAAY;AAChBjD,oBAAAA,WAAAA,EAAa4E,kBAAAA,CAAmB/E,MAAM,CAACF,IAAI,CAACK,WAAW;AACvDC,oBAAAA,YAAAA,EAAc2E,kBAAAA,CAAmB/E,MAAM,CAACF,IAAI,CAACM,YAAY;AACzDC,oBAAAA,UAAAA,EAAY0E,kBAAAA,CAAmB/E,MAAM,CAACF,IAAI,CAACO,UAAU;oBACrDX,IAAAA,EAAMqF,kBAAAA,CAAmB/E,MAAM,CAACN;AAClC,iBAAA,CAAA;AACF,YAAA;YAEA,MAAM+B,kBAAAA,GAAqB,MAAMT,OAAAA,CAAQU,UAAU,EAAA;AACnD,YAAA,IAAI,CAACD,kBAAAA,EAAoB;gBACvBL,uBAAAA,GAA0B,IAAA;AAC1B,gBAAA,MAAM,IAAIjD,gBAAAA,CAAiB,wBAAA,CAAA;AAC7B,YAAA;AACA,YAAA,MAAMM,qBAAAA,CAAsB;AAACH,gBAAAA;AAAI,aAAA,CAAA;AACnC,QAAA,CAAA,CAAE,OAAOqD,KAAAA,EAAO;AACd,YAAA,MAAMI,sBAAAA,CAAuB;AAC3Bf,gBAAAA,OAAAA;AACAY,gBAAAA,UAAAA;gBACAuD,eAAAA,EAAiB;AAAC7G,oBAAAA;AAAI,iBAAA;AACtB8C,gBAAAA;AACF,aAAA,CAAA;YAEA,MAAMO,KAAAA;AACR,QAAA;AAEA,QAAA,KAAK,MAAMA,KAAAA,KAAS,MAAMyD,sBAAAA,CAAuB;AAAExD,YAAAA,UAAAA;YAAYuD,eAAAA,EAAiB;AAAC7G,gBAAAA;AAAI;AAAC,SAAA,CAAC,EAAG;YACxFuD,MAAAA,CAAOwD,GAAG,CAAC1D,KAAK,CAACA,KAAAA,CAAAA;AACnB,QAAA;QAEA,OAAOoD,kBAAAA;AACT,IAAA;AAEA,IAAA,MAAM/D,QAAQU,UAAU,EAAA;AAExBG,IAAAA,MAAAA,CAAOG,QAAQ,CAACC,IAAI,CAAC,qBAAA,EAAuB;QAAE9C,WAAAA,EAAa4F;AAAmB,KAAA,CAAA;IAE9E,OAAOA,kBAAAA;AACT;AAEO,MAAMO,qBAAqB,OAAO5G,IAAAA,GAAAA;AACvCA,IAAAA,IAAAA,CAAKmE,OAAO,CAACrE,oCAAAA,CAAAA;AAEb,IAAA,MAAMwC,OAAAA,GAAUC,aAAAA,EAAAA;AAChB,IAAA,MAAMW,aAAaC,MAAAA,CAChBjC,MAAM,CAAC,sBAAA,CAAA,CACPkC,OAAO,CAAC,aAAA,CAAA;AAEX,IAAA,MAAMyD,sBAA6B,EAAE;AACrC,IAAA,MAAMJ,kBAAqC,EAAE;AAC7C,IAAA,IAAI/D,uBAAAA,GAA0B,KAAA;IAE9B,IAAI;QACF,KAAK,MAAM9C,OAAOI,IAAAA,CAAM;YACtB,MAAMkD,UAAAA,CAAWoD,MAAM,CAAC1G,GAAAA,CAAAA;AACxB6G,YAAAA,eAAAA,CAAgB9D,IAAI,CAAC/C,GAAAA,CAAAA;AACrBiH,YAAAA,mBAAAA,CAAoBlE,IAAI,CAACL,OAAAA,CAAQwE,iBAAiB,CAAClH,GAAAA,CAAAA,CAAAA;AACrD,QAAA;QAEA,MAAMmD,kBAAAA,GAAqB,MAAMT,OAAAA,CAAQU,UAAU,EAAA;AACnD,QAAA,IAAI,CAACD,kBAAAA,EAAoB;YACvBL,uBAAAA,GAA0B,IAAA;AAC1B,YAAA,MAAM,IAAIjD,gBAAAA,CAAiB,wBAAA,CAAA;AAC7B,QAAA;QAEA,KAAK,MAAMG,OAAOI,IAAAA,CAAM;YACtB,MAAMkD,UAAAA,CAAWqD,KAAK,CAAC3G,GAAAA,EAAK;gBAAE4G,cAAAA,EAAgB;AAAK,aAAA,CAAA;AACrD,QAAA;AAEA,QAAA,MAAMzG,qBAAAA,CAAsBC,IAAAA,CAAAA;AAC9B,IAAA,CAAA,CAAE,OAAOiD,KAAAA,EAAO;AACd,QAAA,MAAMI,sBAAAA,CAAuB;AAC3Bf,YAAAA,OAAAA;AACAY,YAAAA,UAAAA;AACAuD,YAAAA,eAAAA;AACA/D,YAAAA;AACF,SAAA,CAAA;QAEA,MAAMO,KAAAA;AACR,IAAA;AAEA,IAAA,KAAK,MAAMA,KAAAA,KAAS,MAAMyD,sBAAAA,CAAuB;AAAExD,QAAAA,UAAAA;AAAYuD,QAAAA;AAAgB,KAAA,CAAC,EAAG;QACjFtD,MAAAA,CAAOwD,GAAG,CAAC1D,KAAK,CAACA,KAAAA,CAAAA;AACnB,IAAA;IAEA,KAAK,MAAMxC,eAAeoG,mBAAAA,CAAqB;AAC7C1D,QAAAA,MAAAA,CAAOG,QAAQ,CAACC,IAAI,CAAC,qBAAA,EAAuB;AAAE9C,YAAAA;AAAY,SAAA,CAAA;AAC5D,IAAA;AACF;AAEA;;AAEC,IACM,MAAMqG,iBAAAA,GAAoB,OAAOlH,GAAAA,EAAsBiD,iBAAsBkE,SAAS,GAAA;IAC3FjH,oCAAAA,CAAqCF,GAAAA,CAAAA;AAErC,IAAA,MAAM0C,UAAUO,cAAAA,IAAkBN,aAAAA,EAAAA;;AAElC,IAAA,MAAMW,aAAaC,MAAAA,CAChBjC,MAAM,CAAC,sBAAA,CAAA,CACPkC,OAAO,CAAC,aAAA,CAAA;IACX,MAAMF,UAAAA,CAAWoD,MAAM,CAAC1G,GAAAA,CAAAA;IAExB,IAAIa,WAAAA;AACJ,IAAA,IAAIiC,uBAAAA,GAA0B,KAAA;AAE9B,IAAA,IAAI,CAACG,cAAAA,EAAgB;QACnB,IAAI;YACFpC,WAAAA,GAAc6B,OAAAA,CAAQwE,iBAAiB,CAAClH,GAAAA,CAAAA;YACxC,MAAMmD,kBAAAA,GAAqB,MAAMT,OAAAA,CAAQU,UAAU,EAAA;AACnD,YAAA,IAAI,CAACD,kBAAAA,EAAoB;gBACvBL,uBAAAA,GAA0B,IAAA;AAC1B,gBAAA,MAAM,IAAIjD,gBAAAA,CAAiB,wBAAA,CAAA;AAC7B,YAAA;YACA,MAAMyD,UAAAA,CAAWqD,KAAK,CAAC3G,GAAAA,EAAK;gBAAE4G,cAAAA,EAAgB;AAAK,aAAA,CAAA;AACnD,YAAA,MAAMzG,qBAAAA,CAAsB;AAACH,gBAAAA;AAAI,aAAA,CAAA;AACnC,QAAA,CAAA,CAAE,OAAOqD,KAAAA,EAAO;AACd,YAAA,MAAMI,sBAAAA,CAAuB;AAC3Bf,gBAAAA,OAAAA;AACAY,gBAAAA,UAAAA;gBACAuD,eAAAA,EAAiB;AAAC7G,oBAAAA;AAAI,iBAAA;AACtB8C,gBAAAA;AACF,aAAA,CAAA;YAEA,MAAMO,KAAAA;AACR,QAAA;AAEA,QAAA,KAAK,MAAMA,KAAAA,KAAS,MAAMyD,sBAAAA,CAAuB;AAAExD,YAAAA,UAAAA;YAAYuD,eAAAA,EAAiB;AAAC7G,gBAAAA;AAAI;AAAC,SAAA,CAAC,EAAG;YACxFuD,MAAAA,CAAOwD,GAAG,CAAC1D,KAAK,CAACA,KAAAA,CAAAA;AACnB,QAAA;IACF,CAAA,MAAO;QACLxC,WAAAA,GAAc6B,OAAAA,CAAQwE,iBAAiB,CAAClH,GAAAA,CAAAA;AAC1C,IAAA;AAEA,IAAA,IAAI,CAACiD,cAAAA,EAAgB;AACnBM,QAAAA,MAAAA,CAAOG,QAAQ,CAACC,IAAI,CAAC,qBAAA,EAAuB;AAAE9C,YAAAA;AAAY,SAAA,CAAA;AAC5D,IAAA;IAEA,OAAOA,WAAAA;AACT;;;;"}
|
|
@@ -6,6 +6,7 @@ var componentCategories = require('./component-categories.js');
|
|
|
6
6
|
var builder = require('./builder.js');
|
|
7
7
|
var apiHandler = require('./api-handler.js');
|
|
8
8
|
var schema = require('./schema.js');
|
|
9
|
+
var contentStructure = require('./content-structure.js');
|
|
9
10
|
|
|
10
11
|
var services = {
|
|
11
12
|
'content-types': contentTypes,
|
|
@@ -13,7 +14,8 @@ var services = {
|
|
|
13
14
|
'component-categories': componentCategories,
|
|
14
15
|
builder,
|
|
15
16
|
'api-handler': apiHandler,
|
|
16
|
-
schema
|
|
17
|
+
schema,
|
|
18
|
+
'content-structure': ({ strapi })=>contentStructure.createContentStructureService(strapi)
|
|
17
19
|
};
|
|
18
20
|
|
|
19
21
|
module.exports = services;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import * as contentTypes from './content-types';\nimport * as components from './components';\nimport * as componentCategories from './component-categories';\nimport * as builder from './builder';\nimport * as apiHandler from './api-handler';\nimport * as schema from './schema';\n\nexport default {\n 'content-types': contentTypes,\n components,\n 'component-categories': componentCategories,\n builder,\n 'api-handler': apiHandler,\n schema,\n};\n"],"names":["contentTypes","components","componentCategories","builder","apiHandler","schema"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport * as contentTypes from './content-types';\nimport * as components from './components';\nimport * as componentCategories from './component-categories';\nimport * as builder from './builder';\nimport * as apiHandler from './api-handler';\nimport * as schema from './schema';\nimport { createContentStructureService } from './content-structure';\n\nexport default {\n 'content-types': contentTypes,\n components,\n 'component-categories': componentCategories,\n builder,\n 'api-handler': apiHandler,\n schema,\n 'content-structure': ({ strapi }: { strapi: Core.Strapi }) =>\n createContentStructureService(strapi),\n};\n"],"names":["contentTypes","components","componentCategories","builder","apiHandler","schema","strapi","createContentStructureService"],"mappings":";;;;;;;;;;AAUA,eAAe;IACb,eAAA,EAAiBA,YAAAA;AACjBC,IAAAA,UAAAA;IACA,sBAAA,EAAwBC,mBAAAA;AACxBC,IAAAA,OAAAA;IACA,aAAA,EAAeC,UAAAA;AACfC,IAAAA,MAAAA;AACA,IAAA,mBAAA,EAAqB,CAAC,EAAEC,MAAM,EAA2B,GACvDC,8CAAAA,CAA8BD,MAAAA;AAClC,CAAA;;;;"}
|
|
@@ -4,6 +4,7 @@ import * as componentCategories from './component-categories.mjs';
|
|
|
4
4
|
import * as builder from './builder.mjs';
|
|
5
5
|
import * as apiHandler from './api-handler.mjs';
|
|
6
6
|
import * as schema from './schema.mjs';
|
|
7
|
+
import { createContentStructureService } from './content-structure.mjs';
|
|
7
8
|
|
|
8
9
|
var services = {
|
|
9
10
|
'content-types': contentTypes,
|
|
@@ -11,7 +12,8 @@ var services = {
|
|
|
11
12
|
'component-categories': componentCategories,
|
|
12
13
|
builder,
|
|
13
14
|
'api-handler': apiHandler,
|
|
14
|
-
schema
|
|
15
|
+
schema,
|
|
16
|
+
'content-structure': ({ strapi })=>createContentStructureService(strapi)
|
|
15
17
|
};
|
|
16
18
|
|
|
17
19
|
export { services as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import * as contentTypes from './content-types';\nimport * as components from './components';\nimport * as componentCategories from './component-categories';\nimport * as builder from './builder';\nimport * as apiHandler from './api-handler';\nimport * as schema from './schema';\n\nexport default {\n 'content-types': contentTypes,\n components,\n 'component-categories': componentCategories,\n builder,\n 'api-handler': apiHandler,\n schema,\n};\n"],"names":["contentTypes","components","componentCategories","builder","apiHandler","schema"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport * as contentTypes from './content-types';\nimport * as components from './components';\nimport * as componentCategories from './component-categories';\nimport * as builder from './builder';\nimport * as apiHandler from './api-handler';\nimport * as schema from './schema';\nimport { createContentStructureService } from './content-structure';\n\nexport default {\n 'content-types': contentTypes,\n components,\n 'component-categories': componentCategories,\n builder,\n 'api-handler': apiHandler,\n schema,\n 'content-structure': ({ strapi }: { strapi: Core.Strapi }) =>\n createContentStructureService(strapi),\n};\n"],"names":["contentTypes","components","componentCategories","builder","apiHandler","schema","strapi","createContentStructureService"],"mappings":";;;;;;;;AAUA,eAAe;IACb,eAAA,EAAiBA,YAAAA;AACjBC,IAAAA,UAAAA;IACA,sBAAA,EAAwBC,mBAAAA;AACxBC,IAAAA,OAAAA;IACA,aAAA,EAAeC,UAAAA;AACfC,IAAAA,MAAAA;AACA,IAAA,mBAAA,EAAqB,CAAC,EAAEC,MAAM,EAA2B,GACvDC,6BAAAA,CAA8BD,MAAAA;AAClC,CAAA;;;;"}
|
|
@@ -125,15 +125,17 @@ function createSchemaBuilder({ components, contentTypes }) {
|
|
|
125
125
|
...contentTypeBuilder(),
|
|
126
126
|
/**
|
|
127
127
|
* Write all type to files
|
|
128
|
+
* @returns boolean true if all files have been written correctly, false if an error occurred
|
|
129
|
+
* @throws ApplicationError if an error occurred and rollback failed
|
|
128
130
|
*/ writeFiles () {
|
|
129
131
|
const schemas = [
|
|
130
132
|
...Array.from(tmpComponents.values()),
|
|
131
133
|
...Array.from(tmpContentTypes.values())
|
|
132
134
|
];
|
|
133
|
-
return Promise.all(schemas.map((schema)=>schema.flush())).catch((error)=>{
|
|
135
|
+
return Promise.all(schemas.map((schema)=>schema.flush())).then(()=>true).catch((error)=>{
|
|
134
136
|
strapi.log.error('Error writing schema files');
|
|
135
137
|
strapi.log.error(error);
|
|
136
|
-
return this.rollback();
|
|
138
|
+
return this.rollback().then(()=>false);
|
|
137
139
|
}).catch((error)=>{
|
|
138
140
|
strapi.log.error('Error rolling back schema files. You might need to fix your files manually');
|
|
139
141
|
strapi.log.error(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../server/src/services/schema-builder/index.ts"],"sourcesContent":["import { join } from 'path';\nimport _ from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport createSchemaHandler from './schema-handler';\nimport createComponentBuilder from './component-builder';\nimport createContentTypeBuilder from './content-type-builder';\n\n/**\n * Creates a content type schema builder instance\n */\nexport default function createBuilder() {\n const components = Object.values(strapi.components).map((componentInput) => ({\n category: componentInput.category,\n modelName: componentInput.modelName,\n plugin: componentInput.modelName,\n uid: componentInput.uid,\n filename: componentInput.__filename__,\n dir: join(strapi.dirs.app.components, componentInput.category),\n schema: componentInput.__schema__,\n config: componentInput.config,\n }));\n\n const contentTypes = Object.values<any>(strapi.contentTypes).map((contentTypeInput) => {\n const dir = contentTypeInput.plugin\n ? join(\n strapi.dirs.app.extensions,\n contentTypeInput.plugin,\n 'content-types',\n contentTypeInput.info.singularName\n )\n : join(\n strapi.dirs.app.api,\n contentTypeInput.apiName,\n 'content-types',\n contentTypeInput.info.singularName\n );\n\n return {\n modelName: contentTypeInput.modelName,\n plugin: contentTypeInput.plugin,\n uid: contentTypeInput.uid,\n filename: 'schema.json',\n dir,\n schema: contentTypeInput.__schema__,\n config: contentTypeInput.config,\n };\n });\n\n return createSchemaBuilder({\n components,\n contentTypes,\n });\n}\n\ntype SchemaBuilderOptions = {\n components: any;\n contentTypes: any;\n};\n\nfunction createSchemaBuilder({ components, contentTypes }: SchemaBuilderOptions) {\n const tmpComponents = new Map();\n const tmpContentTypes = new Map();\n\n // init temporary ContentTypes\n Object.keys(contentTypes).forEach((key) => {\n tmpContentTypes.set(contentTypes[key].uid, createSchemaHandler(contentTypes[key]));\n });\n\n // init temporary components\n Object.keys(components).forEach((key) => {\n tmpComponents.set(components[key].uid, createSchemaHandler(components[key]));\n });\n\n return {\n get components() {\n return tmpComponents;\n },\n get contentTypes() {\n return tmpContentTypes;\n },\n\n /**\n * Convert Attributes received from the API to the right syntax\n */\n convertAttributes(attributes: any) {\n return Object.keys(attributes).reduce(\n (acc, key) => {\n acc[key] = this.convertAttribute(attributes[key]);\n return acc;\n },\n {} as Record<string, unknown>\n );\n },\n\n convertAttribute(attribute: any) {\n const { configurable, private: isPrivate, conditions } = attribute;\n\n const baseProperties = {\n private: isPrivate === true ? true : undefined,\n configurable: configurable === false ? false : undefined,\n // IMPORTANT: Preserve conditions only if they exist and are not undefined/null\n ...(conditions !== undefined && conditions !== null && { conditions }),\n };\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute, dominant, ...restOfProperties } = attribute;\n\n const attr = {\n type: 'relation',\n relation,\n target,\n ...restOfProperties,\n ...baseProperties,\n };\n\n // TODO: uncomment this when we pre-create empty types and targets exists if we create multiple types at once\n // if (target && !this.contentTypes.has(target)) {\n // throw new errors.ApplicationError(`target: ${target} does not exist`);\n // }\n\n if (_.isNil(targetAttribute)) {\n return attr;\n }\n\n if (['oneToOne', 'manyToMany'].includes(relation) && dominant === true) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToOne', 'manyToMany'].includes(relation) && dominant === false) {\n attr.mappedBy = targetAttribute;\n } else if (['oneToOne', 'manyToOne', 'manyToMany'].includes(relation)) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToMany'].includes(relation)) {\n attr.mappedBy = targetAttribute;\n }\n\n return attr;\n }\n\n return {\n ...attribute,\n ...baseProperties,\n };\n },\n\n ...createComponentBuilder(),\n ...createContentTypeBuilder(),\n\n /**\n * Write all type to files\n */\n writeFiles() {\n const schemas = [\n ...Array.from(tmpComponents.values()),\n ...Array.from(tmpContentTypes.values()),\n ];\n\n return Promise.all(schemas.map((schema) => schema.flush()))\n .catch((error) => {\n strapi.log.error('Error writing schema files');\n strapi.log.error(error);\n return this.rollback();\n })\n .catch((error) => {\n strapi.log.error(\n 'Error rolling back schema files. You might need to fix your files manually'\n );\n strapi.log.error(error);\n\n throw new errors.ApplicationError('Invalid schema edition');\n });\n },\n\n /**\n * rollback all files\n */\n rollback() {\n return Promise.all(\n [...Array.from(tmpComponents.values()), ...Array.from(tmpContentTypes.values())].map(\n (schema) => schema.rollback()\n )\n );\n },\n };\n}\n"],"names":["createBuilder","components","Object","values","strapi","map","componentInput","category","modelName","plugin","uid","filename","__filename__","dir","join","dirs","app","schema","__schema__","config","contentTypes","contentTypeInput","extensions","info","singularName","api","apiName","createSchemaBuilder","tmpComponents","Map","tmpContentTypes","keys","forEach","key","set","createSchemaHandler","convertAttributes","attributes","reduce","acc","convertAttribute","attribute","configurable","private","isPrivate","conditions","baseProperties","undefined","type","target","relation","targetAttribute","dominant","restOfProperties","attr","_","isNil","includes","inversedBy","mappedBy","createComponentBuilder","createContentTypeBuilder","writeFiles","schemas","Array","from","Promise","all","flush","catch","error","log","rollback","errors","ApplicationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../server/src/services/schema-builder/index.ts"],"sourcesContent":["import { join } from 'path';\nimport _ from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport createSchemaHandler from './schema-handler';\nimport createComponentBuilder from './component-builder';\nimport createContentTypeBuilder from './content-type-builder';\n\n/**\n * Creates a content type schema builder instance\n */\nexport default function createBuilder() {\n const components = Object.values(strapi.components).map((componentInput) => ({\n category: componentInput.category,\n modelName: componentInput.modelName,\n plugin: componentInput.modelName,\n uid: componentInput.uid,\n filename: componentInput.__filename__,\n dir: join(strapi.dirs.app.components, componentInput.category),\n schema: componentInput.__schema__,\n config: componentInput.config,\n }));\n\n const contentTypes = Object.values<any>(strapi.contentTypes).map((contentTypeInput) => {\n const dir = contentTypeInput.plugin\n ? join(\n strapi.dirs.app.extensions,\n contentTypeInput.plugin,\n 'content-types',\n contentTypeInput.info.singularName\n )\n : join(\n strapi.dirs.app.api,\n contentTypeInput.apiName,\n 'content-types',\n contentTypeInput.info.singularName\n );\n\n return {\n modelName: contentTypeInput.modelName,\n plugin: contentTypeInput.plugin,\n uid: contentTypeInput.uid,\n filename: 'schema.json',\n dir,\n schema: contentTypeInput.__schema__,\n config: contentTypeInput.config,\n };\n });\n\n return createSchemaBuilder({\n components,\n contentTypes,\n });\n}\n\ntype SchemaBuilderOptions = {\n components: any;\n contentTypes: any;\n};\n\nfunction createSchemaBuilder({ components, contentTypes }: SchemaBuilderOptions) {\n const tmpComponents = new Map();\n const tmpContentTypes = new Map();\n\n // init temporary ContentTypes\n Object.keys(contentTypes).forEach((key) => {\n tmpContentTypes.set(contentTypes[key].uid, createSchemaHandler(contentTypes[key]));\n });\n\n // init temporary components\n Object.keys(components).forEach((key) => {\n tmpComponents.set(components[key].uid, createSchemaHandler(components[key]));\n });\n\n return {\n get components() {\n return tmpComponents;\n },\n get contentTypes() {\n return tmpContentTypes;\n },\n\n /**\n * Convert Attributes received from the API to the right syntax\n */\n convertAttributes(attributes: any) {\n return Object.keys(attributes).reduce(\n (acc, key) => {\n acc[key] = this.convertAttribute(attributes[key]);\n return acc;\n },\n {} as Record<string, unknown>\n );\n },\n\n convertAttribute(attribute: any) {\n const { configurable, private: isPrivate, conditions } = attribute;\n\n const baseProperties = {\n private: isPrivate === true ? true : undefined,\n configurable: configurable === false ? false : undefined,\n // IMPORTANT: Preserve conditions only if they exist and are not undefined/null\n ...(conditions !== undefined && conditions !== null && { conditions }),\n };\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute, dominant, ...restOfProperties } = attribute;\n\n const attr = {\n type: 'relation',\n relation,\n target,\n ...restOfProperties,\n ...baseProperties,\n };\n\n // TODO: uncomment this when we pre-create empty types and targets exists if we create multiple types at once\n // if (target && !this.contentTypes.has(target)) {\n // throw new errors.ApplicationError(`target: ${target} does not exist`);\n // }\n\n if (_.isNil(targetAttribute)) {\n return attr;\n }\n\n if (['oneToOne', 'manyToMany'].includes(relation) && dominant === true) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToOne', 'manyToMany'].includes(relation) && dominant === false) {\n attr.mappedBy = targetAttribute;\n } else if (['oneToOne', 'manyToOne', 'manyToMany'].includes(relation)) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToMany'].includes(relation)) {\n attr.mappedBy = targetAttribute;\n }\n\n return attr;\n }\n\n return {\n ...attribute,\n ...baseProperties,\n };\n },\n\n ...createComponentBuilder(),\n ...createContentTypeBuilder(),\n\n /**\n * Write all type to files\n * @returns boolean true if all files have been written correctly, false if an error occurred\n * @throws ApplicationError if an error occurred and rollback failed\n */\n writeFiles() {\n const schemas = [\n ...Array.from(tmpComponents.values()),\n ...Array.from(tmpContentTypes.values()),\n ];\n\n return Promise.all(schemas.map((schema) => schema.flush()))\n .then(() => true)\n .catch((error) => {\n strapi.log.error('Error writing schema files');\n strapi.log.error(error);\n return this.rollback().then(() => false);\n })\n .catch((error) => {\n strapi.log.error(\n 'Error rolling back schema files. You might need to fix your files manually'\n );\n strapi.log.error(error);\n\n throw new errors.ApplicationError('Invalid schema edition');\n });\n },\n\n /**\n * rollback all files\n */\n rollback() {\n return Promise.all(\n [...Array.from(tmpComponents.values()), ...Array.from(tmpContentTypes.values())].map(\n (schema) => schema.rollback()\n )\n );\n },\n };\n}\n"],"names":["createBuilder","components","Object","values","strapi","map","componentInput","category","modelName","plugin","uid","filename","__filename__","dir","join","dirs","app","schema","__schema__","config","contentTypes","contentTypeInput","extensions","info","singularName","api","apiName","createSchemaBuilder","tmpComponents","Map","tmpContentTypes","keys","forEach","key","set","createSchemaHandler","convertAttributes","attributes","reduce","acc","convertAttribute","attribute","configurable","private","isPrivate","conditions","baseProperties","undefined","type","target","relation","targetAttribute","dominant","restOfProperties","attr","_","isNil","includes","inversedBy","mappedBy","createComponentBuilder","createContentTypeBuilder","writeFiles","schemas","Array","from","Promise","all","flush","then","catch","error","log","rollback","errors","ApplicationError"],"mappings":"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"}
|
|
@@ -119,15 +119,17 @@ function createSchemaBuilder({ components, contentTypes }) {
|
|
|
119
119
|
...createComponentBuilder(),
|
|
120
120
|
/**
|
|
121
121
|
* Write all type to files
|
|
122
|
+
* @returns boolean true if all files have been written correctly, false if an error occurred
|
|
123
|
+
* @throws ApplicationError if an error occurred and rollback failed
|
|
122
124
|
*/ writeFiles () {
|
|
123
125
|
const schemas = [
|
|
124
126
|
...Array.from(tmpComponents.values()),
|
|
125
127
|
...Array.from(tmpContentTypes.values())
|
|
126
128
|
];
|
|
127
|
-
return Promise.all(schemas.map((schema)=>schema.flush())).catch((error)=>{
|
|
129
|
+
return Promise.all(schemas.map((schema)=>schema.flush())).then(()=>true).catch((error)=>{
|
|
128
130
|
strapi.log.error('Error writing schema files');
|
|
129
131
|
strapi.log.error(error);
|
|
130
|
-
return this.rollback();
|
|
132
|
+
return this.rollback().then(()=>false);
|
|
131
133
|
}).catch((error)=>{
|
|
132
134
|
strapi.log.error('Error rolling back schema files. You might need to fix your files manually');
|
|
133
135
|
strapi.log.error(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../server/src/services/schema-builder/index.ts"],"sourcesContent":["import { join } from 'path';\nimport _ from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport createSchemaHandler from './schema-handler';\nimport createComponentBuilder from './component-builder';\nimport createContentTypeBuilder from './content-type-builder';\n\n/**\n * Creates a content type schema builder instance\n */\nexport default function createBuilder() {\n const components = Object.values(strapi.components).map((componentInput) => ({\n category: componentInput.category,\n modelName: componentInput.modelName,\n plugin: componentInput.modelName,\n uid: componentInput.uid,\n filename: componentInput.__filename__,\n dir: join(strapi.dirs.app.components, componentInput.category),\n schema: componentInput.__schema__,\n config: componentInput.config,\n }));\n\n const contentTypes = Object.values<any>(strapi.contentTypes).map((contentTypeInput) => {\n const dir = contentTypeInput.plugin\n ? join(\n strapi.dirs.app.extensions,\n contentTypeInput.plugin,\n 'content-types',\n contentTypeInput.info.singularName\n )\n : join(\n strapi.dirs.app.api,\n contentTypeInput.apiName,\n 'content-types',\n contentTypeInput.info.singularName\n );\n\n return {\n modelName: contentTypeInput.modelName,\n plugin: contentTypeInput.plugin,\n uid: contentTypeInput.uid,\n filename: 'schema.json',\n dir,\n schema: contentTypeInput.__schema__,\n config: contentTypeInput.config,\n };\n });\n\n return createSchemaBuilder({\n components,\n contentTypes,\n });\n}\n\ntype SchemaBuilderOptions = {\n components: any;\n contentTypes: any;\n};\n\nfunction createSchemaBuilder({ components, contentTypes }: SchemaBuilderOptions) {\n const tmpComponents = new Map();\n const tmpContentTypes = new Map();\n\n // init temporary ContentTypes\n Object.keys(contentTypes).forEach((key) => {\n tmpContentTypes.set(contentTypes[key].uid, createSchemaHandler(contentTypes[key]));\n });\n\n // init temporary components\n Object.keys(components).forEach((key) => {\n tmpComponents.set(components[key].uid, createSchemaHandler(components[key]));\n });\n\n return {\n get components() {\n return tmpComponents;\n },\n get contentTypes() {\n return tmpContentTypes;\n },\n\n /**\n * Convert Attributes received from the API to the right syntax\n */\n convertAttributes(attributes: any) {\n return Object.keys(attributes).reduce(\n (acc, key) => {\n acc[key] = this.convertAttribute(attributes[key]);\n return acc;\n },\n {} as Record<string, unknown>\n );\n },\n\n convertAttribute(attribute: any) {\n const { configurable, private: isPrivate, conditions } = attribute;\n\n const baseProperties = {\n private: isPrivate === true ? true : undefined,\n configurable: configurable === false ? false : undefined,\n // IMPORTANT: Preserve conditions only if they exist and are not undefined/null\n ...(conditions !== undefined && conditions !== null && { conditions }),\n };\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute, dominant, ...restOfProperties } = attribute;\n\n const attr = {\n type: 'relation',\n relation,\n target,\n ...restOfProperties,\n ...baseProperties,\n };\n\n // TODO: uncomment this when we pre-create empty types and targets exists if we create multiple types at once\n // if (target && !this.contentTypes.has(target)) {\n // throw new errors.ApplicationError(`target: ${target} does not exist`);\n // }\n\n if (_.isNil(targetAttribute)) {\n return attr;\n }\n\n if (['oneToOne', 'manyToMany'].includes(relation) && dominant === true) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToOne', 'manyToMany'].includes(relation) && dominant === false) {\n attr.mappedBy = targetAttribute;\n } else if (['oneToOne', 'manyToOne', 'manyToMany'].includes(relation)) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToMany'].includes(relation)) {\n attr.mappedBy = targetAttribute;\n }\n\n return attr;\n }\n\n return {\n ...attribute,\n ...baseProperties,\n };\n },\n\n ...createComponentBuilder(),\n ...createContentTypeBuilder(),\n\n /**\n * Write all type to files\n */\n writeFiles() {\n const schemas = [\n ...Array.from(tmpComponents.values()),\n ...Array.from(tmpContentTypes.values()),\n ];\n\n return Promise.all(schemas.map((schema) => schema.flush()))\n .catch((error) => {\n strapi.log.error('Error writing schema files');\n strapi.log.error(error);\n return this.rollback();\n })\n .catch((error) => {\n strapi.log.error(\n 'Error rolling back schema files. You might need to fix your files manually'\n );\n strapi.log.error(error);\n\n throw new errors.ApplicationError('Invalid schema edition');\n });\n },\n\n /**\n * rollback all files\n */\n rollback() {\n return Promise.all(\n [...Array.from(tmpComponents.values()), ...Array.from(tmpContentTypes.values())].map(\n (schema) => schema.rollback()\n )\n );\n },\n };\n}\n"],"names":["createBuilder","components","Object","values","strapi","map","componentInput","category","modelName","plugin","uid","filename","__filename__","dir","join","dirs","app","schema","__schema__","config","contentTypes","contentTypeInput","extensions","info","singularName","api","apiName","createSchemaBuilder","tmpComponents","Map","tmpContentTypes","keys","forEach","key","set","createSchemaHandler","convertAttributes","attributes","reduce","acc","convertAttribute","attribute","configurable","private","isPrivate","conditions","baseProperties","undefined","type","target","relation","targetAttribute","dominant","restOfProperties","attr","_","isNil","includes","inversedBy","mappedBy","createComponentBuilder","createContentTypeBuilder","writeFiles","schemas","Array","from","Promise","all","flush","catch","error","log","rollback","errors","ApplicationError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../server/src/services/schema-builder/index.ts"],"sourcesContent":["import { join } from 'path';\nimport _ from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport createSchemaHandler from './schema-handler';\nimport createComponentBuilder from './component-builder';\nimport createContentTypeBuilder from './content-type-builder';\n\n/**\n * Creates a content type schema builder instance\n */\nexport default function createBuilder() {\n const components = Object.values(strapi.components).map((componentInput) => ({\n category: componentInput.category,\n modelName: componentInput.modelName,\n plugin: componentInput.modelName,\n uid: componentInput.uid,\n filename: componentInput.__filename__,\n dir: join(strapi.dirs.app.components, componentInput.category),\n schema: componentInput.__schema__,\n config: componentInput.config,\n }));\n\n const contentTypes = Object.values<any>(strapi.contentTypes).map((contentTypeInput) => {\n const dir = contentTypeInput.plugin\n ? join(\n strapi.dirs.app.extensions,\n contentTypeInput.plugin,\n 'content-types',\n contentTypeInput.info.singularName\n )\n : join(\n strapi.dirs.app.api,\n contentTypeInput.apiName,\n 'content-types',\n contentTypeInput.info.singularName\n );\n\n return {\n modelName: contentTypeInput.modelName,\n plugin: contentTypeInput.plugin,\n uid: contentTypeInput.uid,\n filename: 'schema.json',\n dir,\n schema: contentTypeInput.__schema__,\n config: contentTypeInput.config,\n };\n });\n\n return createSchemaBuilder({\n components,\n contentTypes,\n });\n}\n\ntype SchemaBuilderOptions = {\n components: any;\n contentTypes: any;\n};\n\nfunction createSchemaBuilder({ components, contentTypes }: SchemaBuilderOptions) {\n const tmpComponents = new Map();\n const tmpContentTypes = new Map();\n\n // init temporary ContentTypes\n Object.keys(contentTypes).forEach((key) => {\n tmpContentTypes.set(contentTypes[key].uid, createSchemaHandler(contentTypes[key]));\n });\n\n // init temporary components\n Object.keys(components).forEach((key) => {\n tmpComponents.set(components[key].uid, createSchemaHandler(components[key]));\n });\n\n return {\n get components() {\n return tmpComponents;\n },\n get contentTypes() {\n return tmpContentTypes;\n },\n\n /**\n * Convert Attributes received from the API to the right syntax\n */\n convertAttributes(attributes: any) {\n return Object.keys(attributes).reduce(\n (acc, key) => {\n acc[key] = this.convertAttribute(attributes[key]);\n return acc;\n },\n {} as Record<string, unknown>\n );\n },\n\n convertAttribute(attribute: any) {\n const { configurable, private: isPrivate, conditions } = attribute;\n\n const baseProperties = {\n private: isPrivate === true ? true : undefined,\n configurable: configurable === false ? false : undefined,\n // IMPORTANT: Preserve conditions only if they exist and are not undefined/null\n ...(conditions !== undefined && conditions !== null && { conditions }),\n };\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute, dominant, ...restOfProperties } = attribute;\n\n const attr = {\n type: 'relation',\n relation,\n target,\n ...restOfProperties,\n ...baseProperties,\n };\n\n // TODO: uncomment this when we pre-create empty types and targets exists if we create multiple types at once\n // if (target && !this.contentTypes.has(target)) {\n // throw new errors.ApplicationError(`target: ${target} does not exist`);\n // }\n\n if (_.isNil(targetAttribute)) {\n return attr;\n }\n\n if (['oneToOne', 'manyToMany'].includes(relation) && dominant === true) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToOne', 'manyToMany'].includes(relation) && dominant === false) {\n attr.mappedBy = targetAttribute;\n } else if (['oneToOne', 'manyToOne', 'manyToMany'].includes(relation)) {\n attr.inversedBy = targetAttribute;\n } else if (['oneToMany'].includes(relation)) {\n attr.mappedBy = targetAttribute;\n }\n\n return attr;\n }\n\n return {\n ...attribute,\n ...baseProperties,\n };\n },\n\n ...createComponentBuilder(),\n ...createContentTypeBuilder(),\n\n /**\n * Write all type to files\n * @returns boolean true if all files have been written correctly, false if an error occurred\n * @throws ApplicationError if an error occurred and rollback failed\n */\n writeFiles() {\n const schemas = [\n ...Array.from(tmpComponents.values()),\n ...Array.from(tmpContentTypes.values()),\n ];\n\n return Promise.all(schemas.map((schema) => schema.flush()))\n .then(() => true)\n .catch((error) => {\n strapi.log.error('Error writing schema files');\n strapi.log.error(error);\n return this.rollback().then(() => false);\n })\n .catch((error) => {\n strapi.log.error(\n 'Error rolling back schema files. You might need to fix your files manually'\n );\n strapi.log.error(error);\n\n throw new errors.ApplicationError('Invalid schema edition');\n });\n },\n\n /**\n * rollback all files\n */\n rollback() {\n return Promise.all(\n [...Array.from(tmpComponents.values()), ...Array.from(tmpContentTypes.values())].map(\n (schema) => schema.rollback()\n )\n );\n },\n };\n}\n"],"names":["createBuilder","components","Object","values","strapi","map","componentInput","category","modelName","plugin","uid","filename","__filename__","dir","join","dirs","app","schema","__schema__","config","contentTypes","contentTypeInput","extensions","info","singularName","api","apiName","createSchemaBuilder","tmpComponents","Map","tmpContentTypes","keys","forEach","key","set","createSchemaHandler","convertAttributes","attributes","reduce","acc","convertAttribute","attribute","configurable","private","isPrivate","conditions","baseProperties","undefined","type","target","relation","targetAttribute","dominant","restOfProperties","attr","_","isNil","includes","inversedBy","mappedBy","createComponentBuilder","createContentTypeBuilder","writeFiles","schemas","Array","from","Promise","all","flush","then","catch","error","log","rollback","errors","ApplicationError"],"mappings":"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"}
|