@strapi/content-manager 5.57.0 → 5.59.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/ConfigurationForm/Fields.js +4 -3
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +4 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/components/RelativeTime.js +2 -1
- package/dist/admin/components/RelativeTime.js.map +1 -1
- package/dist/admin/components/RelativeTime.mjs +2 -1
- package/dist/admin/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/content-manager.js.map +1 -1
- package/dist/admin/content-manager.mjs.map +1 -1
- package/dist/admin/history/components/VersionContent.js +8 -8
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionContent.mjs +8 -8
- package/dist/admin/history/components/VersionContent.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +7 -6
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +7 -6
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +31 -11
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +32 -12
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +4 -4
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +4 -4
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
- package/dist/admin/pages/EditView/components/Panels.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +3 -3
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +3 -3
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -3
- package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs +3 -3
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +2 -2
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +2 -2
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +73 -13
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +74 -14
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js.map +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +4 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +4 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +12 -10
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +12 -10
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.js +2 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs +2 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -1
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.js +68 -0
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.js.map +1 -0
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs +64 -0
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs.map +1 -0
- package/dist/admin/preview/components/PreviewHeader.js +3 -1
- package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs +3 -1
- package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
- package/dist/admin/services/relations.js +5 -2
- package/dist/admin/services/relations.js.map +1 -1
- package/dist/admin/services/relations.mjs +5 -2
- package/dist/admin/services/relations.mjs.map +1 -1
- package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +1 -1
- package/dist/admin/src/pages/ListView/utils/applyAttributeRenames.d.ts +12 -0
- package/dist/admin/translations/eu.json.js +3 -3
- package/dist/admin/translations/eu.json.mjs +3 -3
- package/dist/admin/translations/gu.json.js +4 -4
- package/dist/admin/translations/gu.json.mjs +4 -4
- package/dist/admin/translations/hi.json.js +9 -9
- package/dist/admin/translations/hi.json.mjs +9 -9
- package/dist/admin/translations/ml.json.js +6 -6
- package/dist/admin/translations/ml.json.mjs +6 -6
- package/dist/admin/translations/sa.json.js +10 -10
- package/dist/admin/translations/sa.json.mjs +10 -10
- package/dist/server/history/entitlements.js +26 -0
- package/dist/server/history/entitlements.js.map +1 -0
- package/dist/server/history/entitlements.mjs +24 -0
- package/dist/server/history/entitlements.mjs.map +1 -0
- package/dist/server/history/index.js +3 -0
- package/dist/server/history/index.js.map +1 -1
- package/dist/server/history/index.mjs +3 -0
- package/dist/server/history/index.mjs.map +1 -1
- package/dist/server/history/services/utils.js +19 -8
- package/dist/server/history/services/utils.js.map +1 -1
- package/dist/server/history/services/utils.mjs +18 -9
- package/dist/server/history/services/utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/preview/services/preview-config.js.map +1 -1
- package/dist/server/preview/services/preview-config.mjs.map +1 -1
- package/dist/server/register.js +6 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +6 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/components.js.map +1 -1
- package/dist/server/services/components.mjs.map +1 -1
- package/dist/server/services/configuration/rename-fields.js +68 -0
- package/dist/server/services/configuration/rename-fields.js.map +1 -0
- package/dist/server/services/configuration/rename-fields.mjs +66 -0
- package/dist/server/services/configuration/rename-fields.mjs.map +1 -0
- package/dist/server/services/utils/configuration/attribute-renames.js +164 -0
- package/dist/server/services/utils/configuration/attribute-renames.js.map +1 -0
- package/dist/server/services/utils/configuration/attribute-renames.mjs +161 -0
- package/dist/server/services/utils/configuration/attribute-renames.mjs.map +1 -0
- package/dist/server/services/utils/configuration/attributes.js +12 -12
- package/dist/server/services/utils/configuration/attributes.js.map +1 -1
- package/dist/server/services/utils/configuration/attributes.mjs +12 -12
- package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
- package/dist/server/src/history/entitlements.d.ts +9 -0
- package/dist/server/src/history/entitlements.d.ts.map +1 -0
- package/dist/server/src/history/index.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts +6 -0
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +2 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/components.d.ts +2 -0
- package/dist/server/src/services/components.d.ts.map +1 -1
- package/dist/server/src/services/configuration/rename-fields.d.ts +15 -0
- package/dist/server/src/services/configuration/rename-fields.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +2 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/attribute-renames.d.ts +57 -0
- package/dist/server/src/services/utils/configuration/attribute-renames.d.ts.map +1 -0
- package/dist/shared/contracts/content-types.d.ts +5 -0
- package/dist/shared/contracts/content-types.d.ts.map +1 -1
- package/dist/shared/contracts/relations.d.ts +1 -0
- package/dist/shared/contracts/relations.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Old attribute name to the name it has after this save and every earlier
|
|
5
|
+
* save whose map is still stored. Identity entries are omitted: a field that
|
|
6
|
+
* was renamed back to its original name must not keep rewriting itself.
|
|
7
|
+
*/ const composeAttributeRenames = (previous = {}, next = {})=>{
|
|
8
|
+
const composed = {};
|
|
9
|
+
for (const [from, to] of Object.entries(previous)){
|
|
10
|
+
composed[from] = next[to] ?? to;
|
|
11
|
+
}
|
|
12
|
+
for (const [from, to] of Object.entries(next)){
|
|
13
|
+
composed[from] = to;
|
|
14
|
+
}
|
|
15
|
+
for (const [from, to] of Object.entries(composed)){
|
|
16
|
+
if (from === to) {
|
|
17
|
+
delete composed[from];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return composed;
|
|
21
|
+
};
|
|
22
|
+
const renamePath = (path, renames)=>{
|
|
23
|
+
if (!path) {
|
|
24
|
+
return path;
|
|
25
|
+
}
|
|
26
|
+
if (renames[path]) {
|
|
27
|
+
return renames[path];
|
|
28
|
+
}
|
|
29
|
+
const [head, ...rest] = path.split('.');
|
|
30
|
+
if (rest.length > 0 && renames[head]) {
|
|
31
|
+
return [
|
|
32
|
+
renames[head],
|
|
33
|
+
...rest
|
|
34
|
+
].join('.');
|
|
35
|
+
}
|
|
36
|
+
return path;
|
|
37
|
+
};
|
|
38
|
+
const replaceNames = (names, renames)=>{
|
|
39
|
+
const seen = new Set();
|
|
40
|
+
const next = [];
|
|
41
|
+
for (const name of names){
|
|
42
|
+
const renamed = renames[name] ?? name;
|
|
43
|
+
if (seen.has(renamed)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
seen.add(renamed);
|
|
47
|
+
next.push(renamed);
|
|
48
|
+
}
|
|
49
|
+
return next;
|
|
50
|
+
};
|
|
51
|
+
const movedMetadata = (metadata, from, to)=>{
|
|
52
|
+
return {
|
|
53
|
+
...metadata,
|
|
54
|
+
edit: metadata.edit ? {
|
|
55
|
+
...metadata.edit,
|
|
56
|
+
label: metadata.edit.label === from ? to : metadata.edit.label
|
|
57
|
+
} : metadata.edit,
|
|
58
|
+
list: metadata.list ? {
|
|
59
|
+
...metadata.list,
|
|
60
|
+
label: metadata.list.label === from ? to : metadata.list.label
|
|
61
|
+
} : metadata.list
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* One pass over the original metadata. Applying the map in place deletes one
|
|
66
|
+
* side of a swap (`title -> slug`, `slug -> title`), because the destination
|
|
67
|
+
* key is still occupied when the source is moved.
|
|
68
|
+
*/ const renameMetadata = (metadatas, renames)=>{
|
|
69
|
+
const next = {};
|
|
70
|
+
for (const [name, metadata] of Object.entries(metadatas)){
|
|
71
|
+
const to = renames[name];
|
|
72
|
+
if (!to || to === name || next[to]) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
next[to] = movedMetadata(metadata, name, to);
|
|
76
|
+
}
|
|
77
|
+
for (const [name, metadata] of Object.entries(metadatas)){
|
|
78
|
+
const to = renames[name];
|
|
79
|
+
if (to && to !== name || next[name]) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
next[name] = metadata;
|
|
83
|
+
}
|
|
84
|
+
return next;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* A relation's `mainField` names a field on the target, so a rename of that
|
|
88
|
+
* target has to be applied from the configuration of whoever owns the relation.
|
|
89
|
+
*/ const renameRelationMainFields = (metadatas, attributes, allRenames)=>{
|
|
90
|
+
const next = {
|
|
91
|
+
...metadatas
|
|
92
|
+
};
|
|
93
|
+
for (const [name, attribute] of Object.entries(attributes ?? {})){
|
|
94
|
+
if (attribute?.type !== 'relation') {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const targetRenames = allRenames[attribute.target ?? attribute.targetModel ?? ''];
|
|
98
|
+
const metadata = next[name];
|
|
99
|
+
if (!targetRenames || !metadata) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
next[name] = {
|
|
103
|
+
...metadata,
|
|
104
|
+
edit: metadata.edit ? {
|
|
105
|
+
...metadata.edit,
|
|
106
|
+
mainField: typeof metadata.edit.mainField === 'string' ? targetRenames[metadata.edit.mainField] ?? metadata.edit.mainField : metadata.edit.mainField
|
|
107
|
+
} : metadata.edit,
|
|
108
|
+
list: metadata.list ? {
|
|
109
|
+
...metadata.list,
|
|
110
|
+
mainField: typeof metadata.list.mainField === 'string' ? targetRenames[metadata.list.mainField] ?? metadata.list.mainField : metadata.list.mainField
|
|
111
|
+
} : metadata.list
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return next;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Rewrites one stored Content Manager configuration for a rename save.
|
|
118
|
+
*
|
|
119
|
+
* Returns null when there is nothing to store. A model that has never been
|
|
120
|
+
* opened still gets a configuration when one of its own attributes was
|
|
121
|
+
* renamed, so the browser can repair a column list saved before the rename.
|
|
122
|
+
*/ const rewriteContentManagerConfiguration = (configuration, { attributes, ownRenames = {}, allRenames })=>{
|
|
123
|
+
const hasOwnRenames = Object.keys(ownRenames).length > 0;
|
|
124
|
+
if (!configuration && !hasOwnRenames) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const current = configuration ?? {};
|
|
128
|
+
const attributeRenames = composeAttributeRenames(current.attributeRenames, ownRenames);
|
|
129
|
+
const metadatas = renameRelationMainFields(renameMetadata(current.metadatas ?? {}, ownRenames), attributes, allRenames);
|
|
130
|
+
const next = {
|
|
131
|
+
...current,
|
|
132
|
+
settings: current.settings ? {
|
|
133
|
+
...current.settings,
|
|
134
|
+
mainField: renamePath(current.settings.mainField, ownRenames),
|
|
135
|
+
defaultSortBy: renamePath(current.settings.defaultSortBy, ownRenames)
|
|
136
|
+
} : current.settings,
|
|
137
|
+
metadatas,
|
|
138
|
+
layouts: current.layouts ? {
|
|
139
|
+
...current.layouts,
|
|
140
|
+
...Array.isArray(current.layouts.list) ? {
|
|
141
|
+
list: replaceNames(current.layouts.list, ownRenames)
|
|
142
|
+
} : {},
|
|
143
|
+
...Array.isArray(current.layouts.edit) ? {
|
|
144
|
+
edit: current.layouts.edit.map((row)=>row.map((field)=>({
|
|
145
|
+
...field,
|
|
146
|
+
name: ownRenames[field.name] ?? field.name
|
|
147
|
+
})))
|
|
148
|
+
} : {},
|
|
149
|
+
...Array.isArray(current.layouts.editRelations) ? {
|
|
150
|
+
editRelations: replaceNames(current.layouts.editRelations, ownRenames)
|
|
151
|
+
} : {}
|
|
152
|
+
} : current.layouts
|
|
153
|
+
};
|
|
154
|
+
if (Object.keys(attributeRenames).length > 0) {
|
|
155
|
+
next.attributeRenames = attributeRenames;
|
|
156
|
+
} else {
|
|
157
|
+
delete next.attributeRenames;
|
|
158
|
+
}
|
|
159
|
+
return next;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
exports.composeAttributeRenames = composeAttributeRenames;
|
|
163
|
+
exports.rewriteContentManagerConfiguration = rewriteContentManagerConfiguration;
|
|
164
|
+
//# sourceMappingURL=attribute-renames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-renames.js","sources":["../../../../../server/src/services/utils/configuration/attribute-renames.ts"],"sourcesContent":["/**\n * Old attribute name to the name it has after this save and every earlier\n * save whose map is still stored. Identity entries are omitted: a field that\n * was renamed back to its original name must not keep rewriting itself.\n */\nconst composeAttributeRenames = (\n previous: Record<string, string> = {},\n next: Record<string, string> = {}\n): Record<string, string> => {\n const composed: Record<string, string> = {};\n\n for (const [from, to] of Object.entries(previous)) {\n composed[from] = next[to] ?? to;\n }\n\n for (const [from, to] of Object.entries(next)) {\n composed[from] = to;\n }\n\n for (const [from, to] of Object.entries(composed)) {\n if (from === to) {\n delete composed[from];\n }\n }\n\n return composed;\n};\n\nconst renamePath = (\n path: string | undefined,\n renames: Record<string, string>\n): string | undefined => {\n if (!path) {\n return path;\n }\n\n if (renames[path]) {\n return renames[path];\n }\n\n const [head, ...rest] = path.split('.');\n\n if (rest.length > 0 && renames[head]) {\n return [renames[head], ...rest].join('.');\n }\n\n return path;\n};\n\ntype FieldMetadata = {\n edit?: { label?: string; mainField?: unknown; [key: string]: unknown };\n list?: { label?: string; mainField?: unknown; [key: string]: unknown };\n};\n\ntype StoredConfiguration = {\n settings?: {\n mainField?: string;\n defaultSortBy?: string;\n [key: string]: unknown;\n };\n metadatas?: Record<string, FieldMetadata>;\n layouts?: {\n list?: string[];\n edit?: { name: string; size: number }[][];\n editRelations?: string[];\n [key: string]: unknown;\n };\n attributeRenames?: Record<string, string>;\n [key: string]: unknown;\n};\n\ntype RelationAttribute = {\n type?: string;\n target?: string;\n targetModel?: string;\n};\n\nconst replaceNames = (names: string[], renames: Record<string, string>): string[] => {\n const seen = new Set<string>();\n const next: string[] = [];\n\n for (const name of names) {\n const renamed = renames[name] ?? name;\n\n if (seen.has(renamed)) {\n continue;\n }\n\n seen.add(renamed);\n next.push(renamed);\n }\n\n return next;\n};\n\nconst movedMetadata = (metadata: FieldMetadata, from: string, to: string): FieldMetadata => {\n return {\n ...metadata,\n edit: metadata.edit\n ? { ...metadata.edit, label: metadata.edit.label === from ? to : metadata.edit.label }\n : metadata.edit,\n list: metadata.list\n ? { ...metadata.list, label: metadata.list.label === from ? to : metadata.list.label }\n : metadata.list,\n };\n};\n\n/**\n * One pass over the original metadata. Applying the map in place deletes one\n * side of a swap (`title -> slug`, `slug -> title`), because the destination\n * key is still occupied when the source is moved.\n */\nconst renameMetadata = (\n metadatas: Record<string, FieldMetadata>,\n renames: Record<string, string>\n): Record<string, FieldMetadata> => {\n const next: Record<string, FieldMetadata> = {};\n\n for (const [name, metadata] of Object.entries(metadatas)) {\n const to = renames[name];\n\n if (!to || to === name || next[to]) {\n continue;\n }\n\n next[to] = movedMetadata(metadata, name, to);\n }\n\n for (const [name, metadata] of Object.entries(metadatas)) {\n const to = renames[name];\n\n if ((to && to !== name) || next[name]) {\n continue;\n }\n\n next[name] = metadata;\n }\n\n return next;\n};\n\n/**\n * A relation's `mainField` names a field on the target, so a rename of that\n * target has to be applied from the configuration of whoever owns the relation.\n */\nconst renameRelationMainFields = (\n metadatas: Record<string, FieldMetadata>,\n attributes: Record<string, RelationAttribute> | undefined,\n allRenames: Record<string, Record<string, string>>\n): Record<string, FieldMetadata> => {\n const next: Record<string, FieldMetadata> = { ...metadatas };\n\n for (const [name, attribute] of Object.entries(attributes ?? {})) {\n if (attribute?.type !== 'relation') {\n continue;\n }\n\n const targetRenames = allRenames[attribute.target ?? attribute.targetModel ?? ''];\n const metadata = next[name];\n\n if (!targetRenames || !metadata) {\n continue;\n }\n\n next[name] = {\n ...metadata,\n edit: metadata.edit\n ? {\n ...metadata.edit,\n mainField:\n typeof metadata.edit.mainField === 'string'\n ? (targetRenames[metadata.edit.mainField] ?? metadata.edit.mainField)\n : metadata.edit.mainField,\n }\n : metadata.edit,\n list: metadata.list\n ? {\n ...metadata.list,\n mainField:\n typeof metadata.list.mainField === 'string'\n ? (targetRenames[metadata.list.mainField] ?? metadata.list.mainField)\n : metadata.list.mainField,\n }\n : metadata.list,\n };\n }\n\n return next;\n};\n\n/**\n * Rewrites one stored Content Manager configuration for a rename save.\n *\n * Returns null when there is nothing to store. A model that has never been\n * opened still gets a configuration when one of its own attributes was\n * renamed, so the browser can repair a column list saved before the rename.\n */\nconst rewriteContentManagerConfiguration = (\n configuration: StoredConfiguration | null | undefined,\n {\n attributes,\n ownRenames = {},\n allRenames,\n }: {\n attributes?: Record<string, RelationAttribute>;\n ownRenames?: Record<string, string>;\n allRenames: Record<string, Record<string, string>>;\n }\n): StoredConfiguration | null => {\n const hasOwnRenames = Object.keys(ownRenames).length > 0;\n\n if (!configuration && !hasOwnRenames) {\n return null;\n }\n\n const current = configuration ?? {};\n const attributeRenames = composeAttributeRenames(current.attributeRenames, ownRenames);\n const metadatas = renameRelationMainFields(\n renameMetadata(current.metadatas ?? {}, ownRenames),\n attributes,\n allRenames\n );\n const next: StoredConfiguration = {\n ...current,\n settings: current.settings\n ? {\n ...current.settings,\n mainField: renamePath(current.settings.mainField, ownRenames),\n defaultSortBy: renamePath(current.settings.defaultSortBy, ownRenames),\n }\n : current.settings,\n metadatas,\n layouts: current.layouts\n ? {\n ...current.layouts,\n ...(Array.isArray(current.layouts.list)\n ? { list: replaceNames(current.layouts.list, ownRenames) }\n : {}),\n ...(Array.isArray(current.layouts.edit)\n ? {\n edit: current.layouts.edit.map((row) =>\n row.map((field) => ({ ...field, name: ownRenames[field.name] ?? field.name }))\n ),\n }\n : {}),\n ...(Array.isArray(current.layouts.editRelations)\n ? { editRelations: replaceNames(current.layouts.editRelations, ownRenames) }\n : {}),\n }\n : current.layouts,\n };\n\n if (Object.keys(attributeRenames).length > 0) {\n next.attributeRenames = attributeRenames;\n } else {\n delete next.attributeRenames;\n }\n\n return next;\n};\n\nexport { composeAttributeRenames, rewriteContentManagerConfiguration };\nexport type { StoredConfiguration };\n"],"names":["composeAttributeRenames","previous","next","composed","from","to","Object","entries","renamePath","path","renames","head","rest","split","length","join","replaceNames","names","seen","Set","name","renamed","has","add","push","movedMetadata","metadata","edit","label","list","renameMetadata","metadatas","renameRelationMainFields","attributes","allRenames","attribute","type","targetRenames","target","targetModel","mainField","rewriteContentManagerConfiguration","configuration","ownRenames","hasOwnRenames","keys","current","attributeRenames","settings","defaultSortBy","layouts","Array","isArray","map","row","field","editRelations"],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Old attribute name to the name it has after this save and every earlier
|
|
3
|
+
* save whose map is still stored. Identity entries are omitted: a field that
|
|
4
|
+
* was renamed back to its original name must not keep rewriting itself.
|
|
5
|
+
*/ const composeAttributeRenames = (previous = {}, next = {})=>{
|
|
6
|
+
const composed = {};
|
|
7
|
+
for (const [from, to] of Object.entries(previous)){
|
|
8
|
+
composed[from] = next[to] ?? to;
|
|
9
|
+
}
|
|
10
|
+
for (const [from, to] of Object.entries(next)){
|
|
11
|
+
composed[from] = to;
|
|
12
|
+
}
|
|
13
|
+
for (const [from, to] of Object.entries(composed)){
|
|
14
|
+
if (from === to) {
|
|
15
|
+
delete composed[from];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return composed;
|
|
19
|
+
};
|
|
20
|
+
const renamePath = (path, renames)=>{
|
|
21
|
+
if (!path) {
|
|
22
|
+
return path;
|
|
23
|
+
}
|
|
24
|
+
if (renames[path]) {
|
|
25
|
+
return renames[path];
|
|
26
|
+
}
|
|
27
|
+
const [head, ...rest] = path.split('.');
|
|
28
|
+
if (rest.length > 0 && renames[head]) {
|
|
29
|
+
return [
|
|
30
|
+
renames[head],
|
|
31
|
+
...rest
|
|
32
|
+
].join('.');
|
|
33
|
+
}
|
|
34
|
+
return path;
|
|
35
|
+
};
|
|
36
|
+
const replaceNames = (names, renames)=>{
|
|
37
|
+
const seen = new Set();
|
|
38
|
+
const next = [];
|
|
39
|
+
for (const name of names){
|
|
40
|
+
const renamed = renames[name] ?? name;
|
|
41
|
+
if (seen.has(renamed)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
seen.add(renamed);
|
|
45
|
+
next.push(renamed);
|
|
46
|
+
}
|
|
47
|
+
return next;
|
|
48
|
+
};
|
|
49
|
+
const movedMetadata = (metadata, from, to)=>{
|
|
50
|
+
return {
|
|
51
|
+
...metadata,
|
|
52
|
+
edit: metadata.edit ? {
|
|
53
|
+
...metadata.edit,
|
|
54
|
+
label: metadata.edit.label === from ? to : metadata.edit.label
|
|
55
|
+
} : metadata.edit,
|
|
56
|
+
list: metadata.list ? {
|
|
57
|
+
...metadata.list,
|
|
58
|
+
label: metadata.list.label === from ? to : metadata.list.label
|
|
59
|
+
} : metadata.list
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* One pass over the original metadata. Applying the map in place deletes one
|
|
64
|
+
* side of a swap (`title -> slug`, `slug -> title`), because the destination
|
|
65
|
+
* key is still occupied when the source is moved.
|
|
66
|
+
*/ const renameMetadata = (metadatas, renames)=>{
|
|
67
|
+
const next = {};
|
|
68
|
+
for (const [name, metadata] of Object.entries(metadatas)){
|
|
69
|
+
const to = renames[name];
|
|
70
|
+
if (!to || to === name || next[to]) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
next[to] = movedMetadata(metadata, name, to);
|
|
74
|
+
}
|
|
75
|
+
for (const [name, metadata] of Object.entries(metadatas)){
|
|
76
|
+
const to = renames[name];
|
|
77
|
+
if (to && to !== name || next[name]) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
next[name] = metadata;
|
|
81
|
+
}
|
|
82
|
+
return next;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* A relation's `mainField` names a field on the target, so a rename of that
|
|
86
|
+
* target has to be applied from the configuration of whoever owns the relation.
|
|
87
|
+
*/ const renameRelationMainFields = (metadatas, attributes, allRenames)=>{
|
|
88
|
+
const next = {
|
|
89
|
+
...metadatas
|
|
90
|
+
};
|
|
91
|
+
for (const [name, attribute] of Object.entries(attributes ?? {})){
|
|
92
|
+
if (attribute?.type !== 'relation') {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const targetRenames = allRenames[attribute.target ?? attribute.targetModel ?? ''];
|
|
96
|
+
const metadata = next[name];
|
|
97
|
+
if (!targetRenames || !metadata) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
next[name] = {
|
|
101
|
+
...metadata,
|
|
102
|
+
edit: metadata.edit ? {
|
|
103
|
+
...metadata.edit,
|
|
104
|
+
mainField: typeof metadata.edit.mainField === 'string' ? targetRenames[metadata.edit.mainField] ?? metadata.edit.mainField : metadata.edit.mainField
|
|
105
|
+
} : metadata.edit,
|
|
106
|
+
list: metadata.list ? {
|
|
107
|
+
...metadata.list,
|
|
108
|
+
mainField: typeof metadata.list.mainField === 'string' ? targetRenames[metadata.list.mainField] ?? metadata.list.mainField : metadata.list.mainField
|
|
109
|
+
} : metadata.list
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return next;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Rewrites one stored Content Manager configuration for a rename save.
|
|
116
|
+
*
|
|
117
|
+
* Returns null when there is nothing to store. A model that has never been
|
|
118
|
+
* opened still gets a configuration when one of its own attributes was
|
|
119
|
+
* renamed, so the browser can repair a column list saved before the rename.
|
|
120
|
+
*/ const rewriteContentManagerConfiguration = (configuration, { attributes, ownRenames = {}, allRenames })=>{
|
|
121
|
+
const hasOwnRenames = Object.keys(ownRenames).length > 0;
|
|
122
|
+
if (!configuration && !hasOwnRenames) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const current = configuration ?? {};
|
|
126
|
+
const attributeRenames = composeAttributeRenames(current.attributeRenames, ownRenames);
|
|
127
|
+
const metadatas = renameRelationMainFields(renameMetadata(current.metadatas ?? {}, ownRenames), attributes, allRenames);
|
|
128
|
+
const next = {
|
|
129
|
+
...current,
|
|
130
|
+
settings: current.settings ? {
|
|
131
|
+
...current.settings,
|
|
132
|
+
mainField: renamePath(current.settings.mainField, ownRenames),
|
|
133
|
+
defaultSortBy: renamePath(current.settings.defaultSortBy, ownRenames)
|
|
134
|
+
} : current.settings,
|
|
135
|
+
metadatas,
|
|
136
|
+
layouts: current.layouts ? {
|
|
137
|
+
...current.layouts,
|
|
138
|
+
...Array.isArray(current.layouts.list) ? {
|
|
139
|
+
list: replaceNames(current.layouts.list, ownRenames)
|
|
140
|
+
} : {},
|
|
141
|
+
...Array.isArray(current.layouts.edit) ? {
|
|
142
|
+
edit: current.layouts.edit.map((row)=>row.map((field)=>({
|
|
143
|
+
...field,
|
|
144
|
+
name: ownRenames[field.name] ?? field.name
|
|
145
|
+
})))
|
|
146
|
+
} : {},
|
|
147
|
+
...Array.isArray(current.layouts.editRelations) ? {
|
|
148
|
+
editRelations: replaceNames(current.layouts.editRelations, ownRenames)
|
|
149
|
+
} : {}
|
|
150
|
+
} : current.layouts
|
|
151
|
+
};
|
|
152
|
+
if (Object.keys(attributeRenames).length > 0) {
|
|
153
|
+
next.attributeRenames = attributeRenames;
|
|
154
|
+
} else {
|
|
155
|
+
delete next.attributeRenames;
|
|
156
|
+
}
|
|
157
|
+
return next;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export { composeAttributeRenames, rewriteContentManagerConfiguration };
|
|
161
|
+
//# sourceMappingURL=attribute-renames.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-renames.mjs","sources":["../../../../../server/src/services/utils/configuration/attribute-renames.ts"],"sourcesContent":["/**\n * Old attribute name to the name it has after this save and every earlier\n * save whose map is still stored. Identity entries are omitted: a field that\n * was renamed back to its original name must not keep rewriting itself.\n */\nconst composeAttributeRenames = (\n previous: Record<string, string> = {},\n next: Record<string, string> = {}\n): Record<string, string> => {\n const composed: Record<string, string> = {};\n\n for (const [from, to] of Object.entries(previous)) {\n composed[from] = next[to] ?? to;\n }\n\n for (const [from, to] of Object.entries(next)) {\n composed[from] = to;\n }\n\n for (const [from, to] of Object.entries(composed)) {\n if (from === to) {\n delete composed[from];\n }\n }\n\n return composed;\n};\n\nconst renamePath = (\n path: string | undefined,\n renames: Record<string, string>\n): string | undefined => {\n if (!path) {\n return path;\n }\n\n if (renames[path]) {\n return renames[path];\n }\n\n const [head, ...rest] = path.split('.');\n\n if (rest.length > 0 && renames[head]) {\n return [renames[head], ...rest].join('.');\n }\n\n return path;\n};\n\ntype FieldMetadata = {\n edit?: { label?: string; mainField?: unknown; [key: string]: unknown };\n list?: { label?: string; mainField?: unknown; [key: string]: unknown };\n};\n\ntype StoredConfiguration = {\n settings?: {\n mainField?: string;\n defaultSortBy?: string;\n [key: string]: unknown;\n };\n metadatas?: Record<string, FieldMetadata>;\n layouts?: {\n list?: string[];\n edit?: { name: string; size: number }[][];\n editRelations?: string[];\n [key: string]: unknown;\n };\n attributeRenames?: Record<string, string>;\n [key: string]: unknown;\n};\n\ntype RelationAttribute = {\n type?: string;\n target?: string;\n targetModel?: string;\n};\n\nconst replaceNames = (names: string[], renames: Record<string, string>): string[] => {\n const seen = new Set<string>();\n const next: string[] = [];\n\n for (const name of names) {\n const renamed = renames[name] ?? name;\n\n if (seen.has(renamed)) {\n continue;\n }\n\n seen.add(renamed);\n next.push(renamed);\n }\n\n return next;\n};\n\nconst movedMetadata = (metadata: FieldMetadata, from: string, to: string): FieldMetadata => {\n return {\n ...metadata,\n edit: metadata.edit\n ? { ...metadata.edit, label: metadata.edit.label === from ? to : metadata.edit.label }\n : metadata.edit,\n list: metadata.list\n ? { ...metadata.list, label: metadata.list.label === from ? to : metadata.list.label }\n : metadata.list,\n };\n};\n\n/**\n * One pass over the original metadata. Applying the map in place deletes one\n * side of a swap (`title -> slug`, `slug -> title`), because the destination\n * key is still occupied when the source is moved.\n */\nconst renameMetadata = (\n metadatas: Record<string, FieldMetadata>,\n renames: Record<string, string>\n): Record<string, FieldMetadata> => {\n const next: Record<string, FieldMetadata> = {};\n\n for (const [name, metadata] of Object.entries(metadatas)) {\n const to = renames[name];\n\n if (!to || to === name || next[to]) {\n continue;\n }\n\n next[to] = movedMetadata(metadata, name, to);\n }\n\n for (const [name, metadata] of Object.entries(metadatas)) {\n const to = renames[name];\n\n if ((to && to !== name) || next[name]) {\n continue;\n }\n\n next[name] = metadata;\n }\n\n return next;\n};\n\n/**\n * A relation's `mainField` names a field on the target, so a rename of that\n * target has to be applied from the configuration of whoever owns the relation.\n */\nconst renameRelationMainFields = (\n metadatas: Record<string, FieldMetadata>,\n attributes: Record<string, RelationAttribute> | undefined,\n allRenames: Record<string, Record<string, string>>\n): Record<string, FieldMetadata> => {\n const next: Record<string, FieldMetadata> = { ...metadatas };\n\n for (const [name, attribute] of Object.entries(attributes ?? {})) {\n if (attribute?.type !== 'relation') {\n continue;\n }\n\n const targetRenames = allRenames[attribute.target ?? attribute.targetModel ?? ''];\n const metadata = next[name];\n\n if (!targetRenames || !metadata) {\n continue;\n }\n\n next[name] = {\n ...metadata,\n edit: metadata.edit\n ? {\n ...metadata.edit,\n mainField:\n typeof metadata.edit.mainField === 'string'\n ? (targetRenames[metadata.edit.mainField] ?? metadata.edit.mainField)\n : metadata.edit.mainField,\n }\n : metadata.edit,\n list: metadata.list\n ? {\n ...metadata.list,\n mainField:\n typeof metadata.list.mainField === 'string'\n ? (targetRenames[metadata.list.mainField] ?? metadata.list.mainField)\n : metadata.list.mainField,\n }\n : metadata.list,\n };\n }\n\n return next;\n};\n\n/**\n * Rewrites one stored Content Manager configuration for a rename save.\n *\n * Returns null when there is nothing to store. A model that has never been\n * opened still gets a configuration when one of its own attributes was\n * renamed, so the browser can repair a column list saved before the rename.\n */\nconst rewriteContentManagerConfiguration = (\n configuration: StoredConfiguration | null | undefined,\n {\n attributes,\n ownRenames = {},\n allRenames,\n }: {\n attributes?: Record<string, RelationAttribute>;\n ownRenames?: Record<string, string>;\n allRenames: Record<string, Record<string, string>>;\n }\n): StoredConfiguration | null => {\n const hasOwnRenames = Object.keys(ownRenames).length > 0;\n\n if (!configuration && !hasOwnRenames) {\n return null;\n }\n\n const current = configuration ?? {};\n const attributeRenames = composeAttributeRenames(current.attributeRenames, ownRenames);\n const metadatas = renameRelationMainFields(\n renameMetadata(current.metadatas ?? {}, ownRenames),\n attributes,\n allRenames\n );\n const next: StoredConfiguration = {\n ...current,\n settings: current.settings\n ? {\n ...current.settings,\n mainField: renamePath(current.settings.mainField, ownRenames),\n defaultSortBy: renamePath(current.settings.defaultSortBy, ownRenames),\n }\n : current.settings,\n metadatas,\n layouts: current.layouts\n ? {\n ...current.layouts,\n ...(Array.isArray(current.layouts.list)\n ? { list: replaceNames(current.layouts.list, ownRenames) }\n : {}),\n ...(Array.isArray(current.layouts.edit)\n ? {\n edit: current.layouts.edit.map((row) =>\n row.map((field) => ({ ...field, name: ownRenames[field.name] ?? field.name }))\n ),\n }\n : {}),\n ...(Array.isArray(current.layouts.editRelations)\n ? { editRelations: replaceNames(current.layouts.editRelations, ownRenames) }\n : {}),\n }\n : current.layouts,\n };\n\n if (Object.keys(attributeRenames).length > 0) {\n next.attributeRenames = attributeRenames;\n } else {\n delete next.attributeRenames;\n }\n\n return next;\n};\n\nexport { composeAttributeRenames, rewriteContentManagerConfiguration };\nexport type { StoredConfiguration };\n"],"names":["composeAttributeRenames","previous","next","composed","from","to","Object","entries","renamePath","path","renames","head","rest","split","length","join","replaceNames","names","seen","Set","name","renamed","has","add","push","movedMetadata","metadata","edit","label","list","renameMetadata","metadatas","renameRelationMainFields","attributes","allRenames","attribute","type","targetRenames","target","targetModel","mainField","rewriteContentManagerConfiguration","configuration","ownRenames","hasOwnRenames","keys","current","attributeRenames","settings","defaultSortBy","layouts","Array","isArray","map","row","field","editRelations"],"mappings":"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"}
|
|
@@ -9,31 +9,31 @@ var ___default = /*#__PURE__*/_interopDefault(_);
|
|
|
9
9
|
|
|
10
10
|
const { getNonVisibleAttributes, getWritableAttributes } = strapiUtils.contentTypes;
|
|
11
11
|
const { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = strapiUtils.contentTypes.constants;
|
|
12
|
-
const NON_SORTABLES = [
|
|
12
|
+
const NON_SORTABLES = new Set([
|
|
13
13
|
'component',
|
|
14
14
|
'json',
|
|
15
15
|
'media',
|
|
16
16
|
'richtext',
|
|
17
17
|
'dynamiczone',
|
|
18
18
|
'blocks'
|
|
19
|
-
];
|
|
20
|
-
const SORTABLE_RELATIONS = [
|
|
19
|
+
]);
|
|
20
|
+
const SORTABLE_RELATIONS = new Set([
|
|
21
21
|
'oneToOne',
|
|
22
22
|
'manyToOne'
|
|
23
|
-
];
|
|
24
|
-
const NON_LISTABLES = [
|
|
23
|
+
]);
|
|
24
|
+
const NON_LISTABLES = new Set([
|
|
25
25
|
'json',
|
|
26
26
|
'password',
|
|
27
27
|
'richtext',
|
|
28
28
|
'dynamiczone',
|
|
29
29
|
'blocks'
|
|
30
|
-
];
|
|
31
|
-
const LISTABLE_RELATIONS = [
|
|
30
|
+
]);
|
|
31
|
+
const LISTABLE_RELATIONS = new Set([
|
|
32
32
|
'oneToOne',
|
|
33
33
|
'oneToMany',
|
|
34
34
|
'manyToOne',
|
|
35
35
|
'manyToMany'
|
|
36
|
-
];
|
|
36
|
+
]);
|
|
37
37
|
// hidden fields are fields that are configured to be hidden from list, and edit views
|
|
38
38
|
const isHidden = (schema, name)=>{
|
|
39
39
|
if (!___default.default.has(schema.attributes, name)) {
|
|
@@ -58,10 +58,10 @@ const isListable = (schema, name)=>{
|
|
|
58
58
|
return false;
|
|
59
59
|
}
|
|
60
60
|
const attribute = schema.attributes[name];
|
|
61
|
-
if (NON_LISTABLES.
|
|
61
|
+
if (NON_LISTABLES.has(attribute.type)) {
|
|
62
62
|
return false;
|
|
63
63
|
}
|
|
64
|
-
if (isRelation(attribute) && !LISTABLE_RELATIONS.
|
|
64
|
+
if (isRelation(attribute) && !LISTABLE_RELATIONS.has(attribute.relationType)) {
|
|
65
65
|
return false;
|
|
66
66
|
}
|
|
67
67
|
return true;
|
|
@@ -72,10 +72,10 @@ const isSortable = (schema, name)=>{
|
|
|
72
72
|
}
|
|
73
73
|
if (schema.modelType === 'component' && name === 'id') return false;
|
|
74
74
|
const attribute = schema.attributes[name];
|
|
75
|
-
if (NON_SORTABLES.
|
|
75
|
+
if (NON_SORTABLES.has(attribute.type)) {
|
|
76
76
|
return false;
|
|
77
77
|
}
|
|
78
|
-
if (isRelation(attribute) && !SORTABLE_RELATIONS.
|
|
78
|
+
if (isRelation(attribute) && !SORTABLE_RELATIONS.has(attribute.relationType)) {
|
|
79
79
|
return false;
|
|
80
80
|
}
|
|
81
81
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.js","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"attributes.js","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = new Set(['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks']);\nconst SORTABLE_RELATIONS = new Set(['oneToOne', 'manyToOne']);\n\nconst NON_LISTABLES = new Set(['json', 'password', 'richtext', 'dynamiczone', 'blocks']);\nconst LISTABLE_RELATIONS = new Set(['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany']);\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.has(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.has(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.has(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.has(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","Set","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","includes","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
|
|
@@ -3,31 +3,31 @@ import { contentTypes } from '@strapi/utils';
|
|
|
3
3
|
|
|
4
4
|
const { getNonVisibleAttributes, getWritableAttributes } = contentTypes;
|
|
5
5
|
const { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypes.constants;
|
|
6
|
-
const NON_SORTABLES = [
|
|
6
|
+
const NON_SORTABLES = new Set([
|
|
7
7
|
'component',
|
|
8
8
|
'json',
|
|
9
9
|
'media',
|
|
10
10
|
'richtext',
|
|
11
11
|
'dynamiczone',
|
|
12
12
|
'blocks'
|
|
13
|
-
];
|
|
14
|
-
const SORTABLE_RELATIONS = [
|
|
13
|
+
]);
|
|
14
|
+
const SORTABLE_RELATIONS = new Set([
|
|
15
15
|
'oneToOne',
|
|
16
16
|
'manyToOne'
|
|
17
|
-
];
|
|
18
|
-
const NON_LISTABLES = [
|
|
17
|
+
]);
|
|
18
|
+
const NON_LISTABLES = new Set([
|
|
19
19
|
'json',
|
|
20
20
|
'password',
|
|
21
21
|
'richtext',
|
|
22
22
|
'dynamiczone',
|
|
23
23
|
'blocks'
|
|
24
|
-
];
|
|
25
|
-
const LISTABLE_RELATIONS = [
|
|
24
|
+
]);
|
|
25
|
+
const LISTABLE_RELATIONS = new Set([
|
|
26
26
|
'oneToOne',
|
|
27
27
|
'oneToMany',
|
|
28
28
|
'manyToOne',
|
|
29
29
|
'manyToMany'
|
|
30
|
-
];
|
|
30
|
+
]);
|
|
31
31
|
// hidden fields are fields that are configured to be hidden from list, and edit views
|
|
32
32
|
const isHidden = (schema, name)=>{
|
|
33
33
|
if (!_.has(schema.attributes, name)) {
|
|
@@ -52,10 +52,10 @@ const isListable = (schema, name)=>{
|
|
|
52
52
|
return false;
|
|
53
53
|
}
|
|
54
54
|
const attribute = schema.attributes[name];
|
|
55
|
-
if (NON_LISTABLES.
|
|
55
|
+
if (NON_LISTABLES.has(attribute.type)) {
|
|
56
56
|
return false;
|
|
57
57
|
}
|
|
58
|
-
if (isRelation(attribute) && !LISTABLE_RELATIONS.
|
|
58
|
+
if (isRelation(attribute) && !LISTABLE_RELATIONS.has(attribute.relationType)) {
|
|
59
59
|
return false;
|
|
60
60
|
}
|
|
61
61
|
return true;
|
|
@@ -66,10 +66,10 @@ const isSortable = (schema, name)=>{
|
|
|
66
66
|
}
|
|
67
67
|
if (schema.modelType === 'component' && name === 'id') return false;
|
|
68
68
|
const attribute = schema.attributes[name];
|
|
69
|
-
if (NON_SORTABLES.
|
|
69
|
+
if (NON_SORTABLES.has(attribute.type)) {
|
|
70
70
|
return false;
|
|
71
71
|
}
|
|
72
|
-
if (isRelation(attribute) && !SORTABLE_RELATIONS.
|
|
72
|
+
if (isRelation(attribute) && !SORTABLE_RELATIONS.has(attribute.relationType)) {
|
|
73
73
|
return false;
|
|
74
74
|
}
|
|
75
75
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.mjs","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":";;;AAIA,MAAM,EAAEA,uBAAuB,EAAEC,qBAAqB,EAAE,GAAGC,YAAAA;AAC3D,MAAM,EAAEC,sBAAsB,EAAEC,oBAAoB,EAAEC,oBAAoB,EAAE,GAC1EH,YAAAA,CAAkBI,SAAS;AAE7B,MAAMC,aAAAA,GAAgB;AAAC,IAAA,WAAA;AAAa,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,UAAA;AAAY,IAAA,aAAA;AAAe,IAAA;AAAS,CAAA;AACzF,MAAMC,kBAAAA,GAAqB;AAAC,IAAA,UAAA;AAAY,IAAA;AAAY,CAAA;AAEpD,MAAMC,aAAAA,GAAgB;AAAC,IAAA,MAAA;AAAQ,IAAA,UAAA;AAAY,IAAA,UAAA;AAAY,IAAA,aAAA;AAAe,IAAA;AAAS,CAAA;AAC/E,MAAMC,kBAAAA,GAAqB;AAAC,IAAA,UAAA;AAAY,IAAA,WAAA;AAAa,IAAA,WAAA;AAAa,IAAA;AAAa,CAAA;AAE/E;AACA,MAAMC,QAAAA,GAAW,CAACC,MAAAA,EAAaC,IAAAA,GAAAA;AAC7B,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,MAAMF,QAAAA,GAAWG,CAAAA,CAAEG,GAAG,CAACL,MAAAA,EAAQ;AAAC,QAAA,QAAA;AAAU,QAAA,YAAA;AAAcC,QAAAA,IAAAA;AAAM,QAAA;KAAS,EAAE,KAAA,CAAA;AACzE,IAAA,IAAIF,aAAa,IAAA,EAAM;QACrB,OAAO,IAAA;AACT,IAAA;IAEA,OAAO,KAAA;AACT,CAAA;AAEA,MAAMO,UAAAA,GAAa,CAACN,MAAAA,EAAaC,IAAAA,GAAAA;AAC/B,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIF,QAAAA,CAASC,QAAQC,IAAAA,CAAAA,EAAO;QAC1B,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,MAAMM,SAAAA,GAAYP,MAAAA,CAAOI,UAAU,CAACH,IAAAA,CAAK;AACzC,IAAA,IAAIJ,aAAAA,CAAcW,QAAQ,CAACD,SAAAA,CAAUE,IAAI,CAAA,EAAG;QAC1C,OAAO,KAAA;AACT,IAAA;IAEA,IAAIC,UAAAA,CAAWH,cAAc,CAACT,kBAAAA,CAAmBU,QAAQ,CAACD,SAAAA,CAAUI,YAAY,CAAA,EAAG;QACjF,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEA,MAAMC,UAAAA,GAAa,CAACZ,MAAAA,EAAaC,IAAAA,GAAAA;AAC/B,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,IAAID,OAAOa,SAAS,KAAK,WAAA,IAAeZ,IAAAA,KAAS,MAAM,OAAO,KAAA;AAE9D,IAAA,MAAMM,SAAAA,GAAYP,MAAAA,CAAOI,UAAU,CAACH,IAAAA,CAAK;AACzC,IAAA,IAAIN,aAAAA,CAAca,QAAQ,CAACD,SAAAA,CAAUE,IAAI,CAAA,EAAG;QAC1C,OAAO,KAAA;AACT,IAAA;IAEA,IAAIC,UAAAA,CAAWH,cAAc,CAACX,kBAAAA,CAAmBY,QAAQ,CAACD,SAAAA,CAAUI,YAAY,CAAA,EAAG;QACjF,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEA,MAAMG,YAAAA,GAAe,CAACd,MAAAA,EAAaC,IAAAA,GAAAA;AACjC,IAAA,OAAOW,WAAWZ,MAAAA,EAAQC,IAAAA,CAAAA;AAC5B;AAEA,MAAMc,SAAAA,GAAY,CAACf,MAAAA,EAAaC,IAAAA,GAAAA;AAC9B,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIF,QAAAA,CAASC,QAAQC,IAAAA,CAAAA,EAAO;QAC1B,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,IAAIe,YAAYhB,MAAAA,EAAQC,IAAAA,CAAAA,IAASA,IAAAA,KAAS,IAAA,IAAQA,SAAS,YAAA,EAAc;QACvE,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,IAAIgB,mBAAmBhB,IAAAA,CAAAA,EAAO;QAC5B,OAAO,KAAA;AACT,IAAA;IAEA,IAAIiB,cAAAA,CAAelB,QAAQC,IAAAA,CAAAA,EAAO;QAChC,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEA,MAAMgB,kBAAAA,GAAqB,CAAChB,IAAAA,GAAcV,sBAAAA,KAA2BU,IAAAA;AAErE,MAAMe,WAAAA,GAAc,CAAChB,MAAAA,EAAaC,IAAAA,GAAAA;AAChC,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,MAAMkB,UAAAA,GAAa7B,YAAAA,CAAkB8B,aAAa,CAACpB,MAAAA,CAAAA;AACnD,IAAA,IAAI,CAACmB,UAAAA,IAAc,CAACE,KAAAA,CAAMC,OAAO,CAACH,UAAAA,CAAAA,EAAa;QAC7C,OAAO,KAAA;AACT,IAAA;IAEA,IAAIA,UAAAA,CAAWX,QAAQ,CAACP,IAAAA,CAAAA,EAAO;QAC7B,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEA,MAAMiB,cAAAA,GAAiB,CAAClB,MAAAA,EAAaC,IAAAA,GAAAA;AACnC,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,MAAMsB,aAAAA,GAAgBjC,YAAAA,CAAkBkC,gBAAgB,CAACxB,MAAAA,CAAAA;AACzD,IAAA,IAAI,CAACuB,aAAAA,IAAiB,CAACF,KAAAA,CAAMC,OAAO,CAACC,aAAAA,CAAAA,EAAgB;QACnD,OAAO,KAAA;AACT,IAAA;IAEA,IAAIA,aAAAA,CAAcf,QAAQ,CAACP,IAAAA,CAAAA,EAAO;QAChC,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEA,MAAMS,UAAAA,GAAa,CAACH,SAAAA,GAAmBA,SAAAA,CAAUE,IAAI,KAAK;AAE1D,MAAMgB,oBAAAA,GAAuB,CAACzB,MAAAA,EAAaC,IAAAA,GAAAA;AACzC,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIF,QAAAA,CAASC,QAAQC,IAAAA,CAAAA,EAAO;QAC1B,OAAO,KAAA;AACT,IAAA;IAEA,IAAI,CAACc,SAAAA,CAAUf,MAAAA,EAAQC,IAAAA,CAAAA,EAAO;QAC5B,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,OAAOS,UAAAA,CAAWV,MAAAA,CAAOI,UAAU,CAACH,IAAAA,CAAK,CAAA;AAC3C;AAEA,MAAMyB,oBAAAA,GAAuB,CAAC1B,MAAAA,EAAaC,IAAAA,GAAAA;AACzC,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIF,QAAAA,CAASC,QAAQC,IAAAA,CAAAA,EAAO;QAC1B,OAAO,KAAA;AACT,IAAA;IAEA,IAAI,CAACc,SAAAA,CAAUf,MAAAA,EAAQC,IAAAA,CAAAA,EAAO;QAC5B,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEA,MAAM0B,2BAA2B,CAAC3B,MAAAA,GAAAA;IAChC,OAAO4B,MAAAA,CAAOC,IAAI,CAAC7B,MAAAA,CAAOI,UAAU,IAAI,EAAC,CAAA,CAAG0B,IAAI,CAAC,CAACC,GAAAA,GAAAA;AAChD,QAAA,MAAM,EAAEtB,IAAI,EAAE,GAAGT,MAAAA,CAAOI,UAAU,CAAC2B,GAAAA,CAAI;QACvC,OAAOtB,IAAAA,KAAS,YAAYsB,GAAAA,KAAQ,IAAA;AACtC,IAAA,CAAA,CAAA;AACF,CAAA;AAEA,MAAMC,mBAAAA,GAAsB,CAAChC,MAAAA,GAAgB2B,wBAAAA,CAAyB3B,MAAAA,CAAAA,IAAW;AAEjF;;;;;IAMA,MAAMiC,wBAAwB,CAACjC,MAAAA,GAAAA;AAC7B,IAAA,MAAMkC,eAAAA,GAAkBN,MAAAA,CAAOC,IAAI,CAAC7B,MAAAA,CAAOI,UAAU,CAAA,CAAE+B,MAAM,CAAC,CAACJ,GAAAA,GAAQzB,UAAAA,CAAWN,MAAAA,EAAQ+B,GAAAA,CAAAA,CAAAA;AAE1F,IAAA,MAAMK,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACtC,OAAOuC,GAAG,CAAA;AACxC,IAAA,MAAMC,4BAAAA,GAA+BC,YAAAA,CACnCpD,qBAAAA,CAAsB+C,KAAAA,CAAAA,EACtBhD,uBAAAA,CAAwBgD,KAAAA,CAAAA,CAAAA;IAG1B,MAAMM,eAAAA,GAAkBxC,EAAEC,GAAG,CAACH,OAAOI,UAAU,EAAE,gBAAgB,YAAA,GAAe,IAAA;IAChF,OAAO;AACLsC,QAAAA,eAAAA;AACGR,QAAAA,GAAAA,eAAAA;AACAM,QAAAA,GAAAA,4BAAAA;AACHhD,QAAAA,oBAAAA;AACAC,QAAAA;AACD,KAAA;AACH;;;;"}
|
|
1
|
+
{"version":3,"file":"attributes.mjs","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = new Set(['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks']);\nconst SORTABLE_RELATIONS = new Set(['oneToOne', 'manyToOne']);\n\nconst NON_LISTABLES = new Set(['json', 'password', 'richtext', 'dynamiczone', 'blocks']);\nconst LISTABLE_RELATIONS = new Set(['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany']);\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.has(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.has(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.has(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.has(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","Set","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","includes","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":";;;AAIA,MAAM,EAAEA,uBAAuB,EAAEC,qBAAqB,EAAE,GAAGC,YAAAA;AAC3D,MAAM,EAAEC,sBAAsB,EAAEC,oBAAoB,EAAEC,oBAAoB,EAAE,GAC1EH,YAAAA,CAAkBI,SAAS;AAE7B,MAAMC,aAAAA,GAAgB,IAAIC,GAAAA,CAAI;AAAC,IAAA,WAAA;AAAa,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,UAAA;AAAY,IAAA,aAAA;AAAe,IAAA;AAAS,CAAA,CAAA;AACjG,MAAMC,kBAAAA,GAAqB,IAAID,GAAAA,CAAI;AAAC,IAAA,UAAA;AAAY,IAAA;AAAY,CAAA,CAAA;AAE5D,MAAME,aAAAA,GAAgB,IAAIF,GAAAA,CAAI;AAAC,IAAA,MAAA;AAAQ,IAAA,UAAA;AAAY,IAAA,UAAA;AAAY,IAAA,aAAA;AAAe,IAAA;AAAS,CAAA,CAAA;AACvF,MAAMG,kBAAAA,GAAqB,IAAIH,GAAAA,CAAI;AAAC,IAAA,UAAA;AAAY,IAAA,WAAA;AAAa,IAAA,WAAA;AAAa,IAAA;AAAa,CAAA,CAAA;AAEvF;AACA,MAAMI,QAAAA,GAAW,CAACC,MAAAA,EAAaC,IAAAA,GAAAA;AAC7B,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,MAAMF,QAAAA,GAAWG,CAAAA,CAAEG,GAAG,CAACL,MAAAA,EAAQ;AAAC,QAAA,QAAA;AAAU,QAAA,YAAA;AAAcC,QAAAA,IAAAA;AAAM,QAAA;KAAS,EAAE,KAAA,CAAA;AACzE,IAAA,IAAIF,aAAa,IAAA,EAAM;QACrB,OAAO,IAAA;AACT,IAAA;IAEA,OAAO,KAAA;AACT,CAAA;AAEA,MAAMO,UAAAA,GAAa,CAACN,MAAAA,EAAaC,IAAAA,GAAAA;AAC/B,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIF,QAAAA,CAASC,QAAQC,IAAAA,CAAAA,EAAO;QAC1B,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,MAAMM,SAAAA,GAAYP,MAAAA,CAAOI,UAAU,CAACH,IAAAA,CAAK;AACzC,IAAA,IAAIJ,aAAAA,CAAcM,GAAG,CAACI,SAAAA,CAAUC,IAAI,CAAA,EAAG;QACrC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIC,UAAAA,CAAWF,cAAc,CAACT,kBAAAA,CAAmBK,GAAG,CAACI,SAAAA,CAAUG,YAAY,CAAA,EAAG;QAC5E,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEA,MAAMC,UAAAA,GAAa,CAACX,MAAAA,EAAaC,IAAAA,GAAAA;AAC/B,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,IAAID,OAAOY,SAAS,KAAK,WAAA,IAAeX,IAAAA,KAAS,MAAM,OAAO,KAAA;AAE9D,IAAA,MAAMM,SAAAA,GAAYP,MAAAA,CAAOI,UAAU,CAACH,IAAAA,CAAK;AACzC,IAAA,IAAIP,aAAAA,CAAcS,GAAG,CAACI,SAAAA,CAAUC,IAAI,CAAA,EAAG;QACrC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIC,UAAAA,CAAWF,cAAc,CAACX,kBAAAA,CAAmBO,GAAG,CAACI,SAAAA,CAAUG,YAAY,CAAA,EAAG;QAC5E,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEA,MAAMG,YAAAA,GAAe,CAACb,MAAAA,EAAaC,IAAAA,GAAAA;AACjC,IAAA,OAAOU,WAAWX,MAAAA,EAAQC,IAAAA,CAAAA;AAC5B;AAEA,MAAMa,SAAAA,GAAY,CAACd,MAAAA,EAAaC,IAAAA,GAAAA;AAC9B,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIF,QAAAA,CAASC,QAAQC,IAAAA,CAAAA,EAAO;QAC1B,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,IAAIc,YAAYf,MAAAA,EAAQC,IAAAA,CAAAA,IAASA,IAAAA,KAAS,IAAA,IAAQA,SAAS,YAAA,EAAc;QACvE,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,IAAIe,mBAAmBf,IAAAA,CAAAA,EAAO;QAC5B,OAAO,KAAA;AACT,IAAA;IAEA,IAAIgB,cAAAA,CAAejB,QAAQC,IAAAA,CAAAA,EAAO;QAChC,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEA,MAAMe,kBAAAA,GAAqB,CAACf,IAAAA,GAAcX,sBAAAA,KAA2BW,IAAAA;AAErE,MAAMc,WAAAA,GAAc,CAACf,MAAAA,EAAaC,IAAAA,GAAAA;AAChC,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,MAAMiB,UAAAA,GAAa7B,YAAAA,CAAkB8B,aAAa,CAACnB,MAAAA,CAAAA;AACnD,IAAA,IAAI,CAACkB,UAAAA,IAAc,CAACE,KAAAA,CAAMC,OAAO,CAACH,UAAAA,CAAAA,EAAa;QAC7C,OAAO,KAAA;AACT,IAAA;IAEA,IAAIA,UAAAA,CAAWI,QAAQ,CAACrB,IAAAA,CAAAA,EAAO;QAC7B,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEA,MAAMgB,cAAAA,GAAiB,CAACjB,MAAAA,EAAaC,IAAAA,GAAAA;AACnC,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,MAAMsB,aAAAA,GAAgBlC,YAAAA,CAAkBmC,gBAAgB,CAACxB,MAAAA,CAAAA;AACzD,IAAA,IAAI,CAACuB,aAAAA,IAAiB,CAACH,KAAAA,CAAMC,OAAO,CAACE,aAAAA,CAAAA,EAAgB;QACnD,OAAO,KAAA;AACT,IAAA;IAEA,IAAIA,aAAAA,CAAcD,QAAQ,CAACrB,IAAAA,CAAAA,EAAO;QAChC,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEA,MAAMQ,UAAAA,GAAa,CAACF,SAAAA,GAAmBA,SAAAA,CAAUC,IAAI,KAAK;AAE1D,MAAMiB,oBAAAA,GAAuB,CAACzB,MAAAA,EAAaC,IAAAA,GAAAA;AACzC,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIF,QAAAA,CAASC,QAAQC,IAAAA,CAAAA,EAAO;QAC1B,OAAO,KAAA;AACT,IAAA;IAEA,IAAI,CAACa,SAAAA,CAAUd,MAAAA,EAAQC,IAAAA,CAAAA,EAAO;QAC5B,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,OAAOQ,UAAAA,CAAWT,MAAAA,CAAOI,UAAU,CAACH,IAAAA,CAAK,CAAA;AAC3C;AAEA,MAAMyB,oBAAAA,GAAuB,CAAC1B,MAAAA,EAAaC,IAAAA,GAAAA;AACzC,IAAA,IAAI,CAACC,CAAAA,CAAEC,GAAG,CAACH,MAAAA,CAAOI,UAAU,EAAEH,IAAAA,CAAAA,EAAO;QACnC,OAAO,KAAA;AACT,IAAA;IAEA,IAAIF,QAAAA,CAASC,QAAQC,IAAAA,CAAAA,EAAO;QAC1B,OAAO,KAAA;AACT,IAAA;IAEA,IAAI,CAACa,SAAAA,CAAUd,MAAAA,EAAQC,IAAAA,CAAAA,EAAO;QAC5B,OAAO,KAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEA,MAAM0B,2BAA2B,CAAC3B,MAAAA,GAAAA;IAChC,OAAO4B,MAAAA,CAAOC,IAAI,CAAC7B,MAAAA,CAAOI,UAAU,IAAI,EAAC,CAAA,CAAG0B,IAAI,CAAC,CAACC,GAAAA,GAAAA;AAChD,QAAA,MAAM,EAAEvB,IAAI,EAAE,GAAGR,MAAAA,CAAOI,UAAU,CAAC2B,GAAAA,CAAI;QACvC,OAAOvB,IAAAA,KAAS,YAAYuB,GAAAA,KAAQ,IAAA;AACtC,IAAA,CAAA,CAAA;AACF,CAAA;AAEA,MAAMC,mBAAAA,GAAsB,CAAChC,MAAAA,GAAgB2B,wBAAAA,CAAyB3B,MAAAA,CAAAA,IAAW;AAEjF;;;;;IAMA,MAAMiC,wBAAwB,CAACjC,MAAAA,GAAAA;AAC7B,IAAA,MAAMkC,eAAAA,GAAkBN,MAAAA,CAAOC,IAAI,CAAC7B,MAAAA,CAAOI,UAAU,CAAA,CAAE+B,MAAM,CAAC,CAACJ,GAAAA,GAAQzB,UAAAA,CAAWN,MAAAA,EAAQ+B,GAAAA,CAAAA,CAAAA;AAE1F,IAAA,MAAMK,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACtC,OAAOuC,GAAG,CAAA;AACxC,IAAA,MAAMC,4BAAAA,GAA+BC,YAAAA,CACnCrD,qBAAAA,CAAsBgD,KAAAA,CAAAA,EACtBjD,uBAAAA,CAAwBiD,KAAAA,CAAAA,CAAAA;IAG1B,MAAMM,eAAAA,GAAkBxC,EAAEC,GAAG,CAACH,OAAOI,UAAU,EAAE,gBAAgB,YAAA,GAAe,IAAA;IAChF,OAAO;AACLsC,QAAAA,eAAAA;AACGR,QAAAA,GAAAA,eAAAA;AACAM,QAAAA,GAAAA,4BAAAA;AACHjD,QAAAA,oBAAAA;AACAC,QAAAA;AACD,KAAA;AACH;;;;"}
|