@strapi/content-manager 5.47.1 → 5.48.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/admin/features/DocumentRBAC.js +9 -1
  2. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  3. package/dist/admin/features/DocumentRBAC.mjs +9 -1
  4. package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
  5. package/dist/admin/hooks/useContentTypeSchema.js +37 -17
  6. package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
  7. package/dist/admin/hooks/useContentTypeSchema.mjs +37 -17
  8. package/dist/admin/hooks/useContentTypeSchema.mjs.map +1 -1
  9. package/dist/admin/hooks/useDocumentLayout.js +43 -4
  10. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  11. package/dist/admin/hooks/useDocumentLayout.mjs +43 -4
  12. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  13. package/dist/admin/pages/ComponentConfigurationPage.js +6 -3
  14. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  15. package/dist/admin/pages/ComponentConfigurationPage.mjs +6 -3
  16. package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +1 -0
  18. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs +1 -0
  20. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +5 -2
  22. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +5 -2
  24. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  26. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +11 -2
  28. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +11 -2
  30. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +9 -4
  32. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +9 -4
  34. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +2 -26
  36. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs +2 -26
  38. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +72 -0
  40. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -0
  41. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs +70 -0
  42. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs.map +1 -0
  43. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +4 -8
  44. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  45. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +5 -9
  46. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  47. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +6 -10
  48. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  49. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +6 -10
  50. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
  51. package/dist/admin/pages/ListView/components/Filters.js +7 -9
  52. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  53. package/dist/admin/pages/ListView/components/Filters.mjs +7 -9
  54. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  55. package/dist/admin/pages/ListView/components/TableCells/Media.js +5 -4
  56. package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
  57. package/dist/admin/pages/ListView/components/TableCells/Media.mjs +5 -4
  58. package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
  59. package/dist/admin/pages/formatComponentConfigurationEditLayout.js +15 -9
  60. package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -1
  61. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +15 -9
  62. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -1
  63. package/dist/admin/services/components.js +3 -2
  64. package/dist/admin/services/components.js.map +1 -1
  65. package/dist/admin/services/components.mjs +3 -2
  66. package/dist/admin/services/components.mjs.map +1 -1
  67. package/dist/admin/services/contentTypes.js +4 -3
  68. package/dist/admin/services/contentTypes.js.map +1 -1
  69. package/dist/admin/services/contentTypes.mjs +4 -3
  70. package/dist/admin/services/contentTypes.mjs.map +1 -1
  71. package/dist/admin/src/pages/EditView/components/FormInputs/Component/Input.d.ts +1 -1
  72. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +1 -1
  73. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.d.ts +2 -0
  74. package/dist/admin/src/pages/ListConfiguration/components/SortDisplayedFields.d.ts +2 -2
  75. package/dist/admin/src/pages/ListView/components/TableCells/Media.d.ts +2 -2
  76. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +3 -1
  77. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +24 -0
  78. package/dist/admin/translations/en.json.js +1 -0
  79. package/dist/admin/translations/en.json.js.map +1 -1
  80. package/dist/admin/translations/en.json.mjs +1 -0
  81. package/dist/admin/translations/en.json.mjs.map +1 -1
  82. package/dist/admin/utils/attributes.js +17 -2
  83. package/dist/admin/utils/attributes.js.map +1 -1
  84. package/dist/admin/utils/attributes.mjs +17 -2
  85. package/dist/admin/utils/attributes.mjs.map +1 -1
  86. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js +329 -0
  87. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js.map +1 -0
  88. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs +321 -0
  89. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs.map +1 -0
  90. package/dist/server/controllers/collection-types.js +7 -2
  91. package/dist/server/controllers/collection-types.js.map +1 -1
  92. package/dist/server/controllers/collection-types.mjs +7 -2
  93. package/dist/server/controllers/collection-types.mjs.map +1 -1
  94. package/dist/server/homepage/services/homepage-query-utils.js +56 -0
  95. package/dist/server/homepage/services/homepage-query-utils.js.map +1 -0
  96. package/dist/server/homepage/services/homepage-query-utils.mjs +50 -0
  97. package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -0
  98. package/dist/server/homepage/services/homepage.js +29 -29
  99. package/dist/server/homepage/services/homepage.js.map +1 -1
  100. package/dist/server/homepage/services/homepage.mjs +29 -29
  101. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  102. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  103. package/dist/server/src/homepage/services/homepage-query-utils.d.ts +28 -0
  104. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -0
  105. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  106. package/package.json +8 -8
@@ -0,0 +1,321 @@
1
+ const DEFAULT_RESPONSE_SETTINGS = {
2
+ bulkable: true,
3
+ filterable: true,
4
+ searchable: true,
5
+ pageSize: 10,
6
+ mainField: 'id',
7
+ defaultSortBy: '',
8
+ defaultSortOrder: 'ASC'
9
+ };
10
+ const isRecord = (value)=>{
11
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
12
+ };
13
+ const warnOnceInDevelopment = (()=>{
14
+ const warnings = new Set();
15
+ return (message)=>{
16
+ if (process.env.NODE_ENV !== 'development' || warnings.has(message)) {
17
+ return;
18
+ }
19
+ warnings.add(message);
20
+ console.warn(`[Content Manager] ${message}`);
21
+ };
22
+ })();
23
+ const normalizeResponseSettings = (settings, path)=>{
24
+ if (!isRecord(settings)) {
25
+ warnOnceInDevelopment(`Received malformed settings at "${path}". Falling back to defaults.`);
26
+ }
27
+ return {
28
+ ...DEFAULT_RESPONSE_SETTINGS,
29
+ ...isRecord(settings) ? settings : {}
30
+ };
31
+ };
32
+ const normalizeResponseMetadatas = (metadatas, path)=>{
33
+ if (!isRecord(metadatas)) {
34
+ warnOnceInDevelopment(`Received malformed metadatas at "${path}". Falling back to empty.`);
35
+ return {};
36
+ }
37
+ return Object.entries(metadatas).reduce((acc, [name, metadata])=>{
38
+ const metadataRecord = isRecord(metadata) ? metadata : {};
39
+ if (!isRecord(metadata)) {
40
+ warnOnceInDevelopment(`Received malformed metadata for "${path}.${name}". Repairing entry.`);
41
+ }
42
+ if (!isRecord(metadataRecord.edit)) {
43
+ warnOnceInDevelopment(`Received malformed edit metadata for "${path}.${name}". Falling back to empty.`);
44
+ }
45
+ if (!isRecord(metadataRecord.list)) {
46
+ warnOnceInDevelopment(`Received malformed list metadata for "${path}.${name}". Falling back to empty.`);
47
+ }
48
+ acc[name] = {
49
+ edit: isRecord(metadataRecord.edit) ? metadataRecord.edit : {},
50
+ list: isRecord(metadataRecord.list) ? metadataRecord.list : {}
51
+ };
52
+ return acc;
53
+ }, {});
54
+ };
55
+ const normalizeResponseLayouts = (layouts, path)=>{
56
+ if (!isRecord(layouts)) {
57
+ warnOnceInDevelopment(`Received malformed layouts at "${path}". Falling back to empty.`);
58
+ return {
59
+ edit: [],
60
+ list: []
61
+ };
62
+ }
63
+ if (!Array.isArray(layouts.edit)) {
64
+ warnOnceInDevelopment(`Received malformed edit layout at "${path}". Falling back to empty.`);
65
+ }
66
+ if (!Array.isArray(layouts.list)) {
67
+ warnOnceInDevelopment(`Received malformed list layout at "${path}". Falling back to empty.`);
68
+ }
69
+ return {
70
+ edit: Array.isArray(layouts.edit) ? layouts.edit.map((row, rowIndex)=>{
71
+ if (!Array.isArray(row)) {
72
+ warnOnceInDevelopment(`Dropped malformed edit layout row "${path}.edit.${rowIndex}".`);
73
+ return [];
74
+ }
75
+ return row.filter((field, fieldIndex)=>{
76
+ const isValidField = isRecord(field) && typeof field.name === 'string' && typeof field.size === 'number';
77
+ if (!isValidField) {
78
+ warnOnceInDevelopment(`Dropped malformed edit layout field "${path}.edit.${rowIndex}.${fieldIndex}".`);
79
+ }
80
+ return isValidField;
81
+ });
82
+ }) : [],
83
+ list: Array.isArray(layouts.list) ? layouts.list.filter((field, index)=>{
84
+ const isValidField = typeof field === 'string';
85
+ if (!isValidField) {
86
+ warnOnceInDevelopment(`Dropped malformed list layout field "${path}.list.${index}".`);
87
+ }
88
+ return isValidField;
89
+ }) : []
90
+ };
91
+ };
92
+ const normalizeConfigurationResponse = (configuration, uid, path = uid ?? 'configuration')=>{
93
+ if (!isRecord(configuration)) {
94
+ warnOnceInDevelopment(`Received malformed configuration at "${path}". Repairing entry.`);
95
+ }
96
+ const configurationRecord = isRecord(configuration) ? configuration : {};
97
+ return {
98
+ ...configurationRecord,
99
+ ...uid ? {
100
+ uid
101
+ } : {},
102
+ settings: normalizeResponseSettings(configurationRecord.settings, `${path}.settings`),
103
+ metadatas: normalizeResponseMetadatas(configurationRecord.metadatas, `${path}.metadatas`),
104
+ layouts: normalizeResponseLayouts(configurationRecord.layouts, `${path}.layouts`)
105
+ };
106
+ };
107
+ const normalizeComponentsRecord = (components)=>{
108
+ if (!isRecord(components)) {
109
+ warnOnceInDevelopment('Received malformed component configuration record. Falling back to empty.');
110
+ return {};
111
+ }
112
+ return Object.entries(components).reduce((acc, [uid, configuration])=>{
113
+ acc[uid] = normalizeConfigurationResponse(configuration, uid, `components.${uid}`);
114
+ return acc;
115
+ }, {});
116
+ };
117
+ const normalizeContentTypeConfigurationResponse = (data, uid)=>{
118
+ if (!isRecord(data)) {
119
+ warnOnceInDevelopment('Received malformed content-type configuration response. Repairing data.');
120
+ }
121
+ const dataRecord = isRecord(data) ? data : {};
122
+ return {
123
+ contentType: normalizeConfigurationResponse(dataRecord.contentType, uid, 'contentType'),
124
+ components: normalizeComponentsRecord(dataRecord.components)
125
+ };
126
+ };
127
+ const normalizeContentTypeConfigurationUpdateResponse = (data)=>{
128
+ if (!isRecord(data)) {
129
+ warnOnceInDevelopment('Received malformed content-type configuration update response. Repairing data.');
130
+ }
131
+ const dataRecord = isRecord(data) ? data : {};
132
+ return {
133
+ contentType: normalizeConfigurationResponse(dataRecord.contentType, undefined, 'contentType'),
134
+ components: normalizeComponentsRecord(dataRecord.components)
135
+ };
136
+ };
137
+ const normalizeComponentConfigurationResponse = (data, uid)=>{
138
+ if (!isRecord(data)) {
139
+ warnOnceInDevelopment('Received malformed component configuration response. Repairing data.');
140
+ }
141
+ const dataRecord = isRecord(data) ? data : {};
142
+ return {
143
+ component: normalizeConfigurationResponse(dataRecord.component, uid, 'component'),
144
+ components: normalizeComponentsRecord(dataRecord.components)
145
+ };
146
+ };
147
+ const normalizeComponentConfigurationUpdateResponse = (data)=>{
148
+ return normalizeConfigurationResponse(data, undefined, 'component');
149
+ };
150
+ const normalizeContentTypeSettingsResponse = (data)=>{
151
+ if (!Array.isArray(data)) {
152
+ warnOnceInDevelopment('Received malformed content-type settings response. Falling back to empty.');
153
+ return [];
154
+ }
155
+ return data.filter((entry, index)=>{
156
+ const isValidEntry = isRecord(entry);
157
+ if (!isValidEntry) {
158
+ warnOnceInDevelopment(`Dropped malformed content-type settings entry "${index}".`);
159
+ }
160
+ return isValidEntry;
161
+ }).filter((entry)=>{
162
+ const hasUid = typeof entry.uid === 'string';
163
+ if (!hasUid) {
164
+ warnOnceInDevelopment('Dropped content-type settings entry without a uid.');
165
+ }
166
+ return hasUid;
167
+ }).map((entry)=>({
168
+ uid: entry.uid,
169
+ settings: normalizeResponseSettings(entry.settings, `contentTypeSettings.${entry.uid}`)
170
+ }));
171
+ };
172
+ const hasAttribute = (attributes, name)=>{
173
+ return Boolean(name && attributes?.[name]);
174
+ };
175
+ const getTargetAttributes = (attribute, { components, schemas })=>{
176
+ if (attribute.type === 'component') {
177
+ return components[attribute.component]?.attributes;
178
+ }
179
+ if (attribute.type === 'relation') {
180
+ const target = 'targetModel' in attribute ? attribute.targetModel : 'target' in attribute ? attribute.target : undefined;
181
+ return schemas.find((schema)=>schema.uid === target)?.attributes;
182
+ }
183
+ return undefined;
184
+ };
185
+ const hasTargetSchema = (attribute, { schemas })=>{
186
+ if (attribute.type !== 'relation') {
187
+ return true;
188
+ }
189
+ const target = 'targetModel' in attribute ? attribute.targetModel : 'target' in attribute ? attribute.target : undefined;
190
+ return schemas.some((schema)=>schema.uid === target);
191
+ };
192
+ const normalizeMainField = (attribute, mainField, context, path)=>{
193
+ if (!mainField) {
194
+ return mainField;
195
+ }
196
+ const targetAttributes = getTargetAttributes(attribute, context);
197
+ if (!targetAttributes) {
198
+ if (attribute.type === 'relation' && !hasTargetSchema(attribute, context)) {
199
+ return mainField;
200
+ }
201
+ if (attribute.type !== 'component' && attribute.type !== 'relation') {
202
+ return mainField;
203
+ }
204
+ warnOnceInDevelopment(`Reset invalid mainField "${mainField}" at "${path}" to "id".`);
205
+ return 'id';
206
+ }
207
+ if (hasAttribute(targetAttributes, mainField)) {
208
+ return mainField;
209
+ }
210
+ warnOnceInDevelopment(`Reset invalid mainField "${mainField}" at "${path}" to "id".`);
211
+ return 'id';
212
+ };
213
+ const normalizeSettings = (settings, attributes, path)=>{
214
+ if (!settings.mainField || hasAttribute(attributes, settings.mainField) || settings.mainField === 'id') {
215
+ return settings;
216
+ }
217
+ warnOnceInDevelopment(`Reset invalid mainField "${settings.mainField}" at "${path}" to "id".`);
218
+ return {
219
+ ...settings,
220
+ mainField: 'id'
221
+ };
222
+ };
223
+ const hasResolvableComponent = (attribute, context)=>{
224
+ if (!attribute || !('component' in attribute) || typeof attribute.component !== 'string') {
225
+ return true;
226
+ }
227
+ return Boolean(context.components[attribute.component]);
228
+ };
229
+ const normalizeMetadatas = (metadatas, attributes, context, path)=>{
230
+ return Object.entries(metadatas).reduce((acc, [name, metadata])=>{
231
+ const attribute = attributes?.[name];
232
+ if (!attribute) {
233
+ warnOnceInDevelopment(`Dropped metadata for unknown field "${path}.metadatas.${name}".`);
234
+ return acc;
235
+ }
236
+ if (!hasResolvableComponent(attribute, context)) {
237
+ warnOnceInDevelopment(`Dropped metadata for field "${path}.metadatas.${name}" because its component schema is unavailable.`);
238
+ return acc;
239
+ }
240
+ acc[name] = {
241
+ edit: {
242
+ ...metadata.edit,
243
+ // `mainField` is present at runtime for component/relation edit metadata.
244
+ ...'mainField' in metadata.edit ? {
245
+ mainField: normalizeMainField(attribute, metadata.edit.mainField, context, `${path}.metadatas.${name}.edit.mainField`)
246
+ } : {}
247
+ },
248
+ list: {
249
+ ...metadata.list,
250
+ mainField: normalizeMainField(attribute, metadata.list.mainField, context, `${path}.metadatas.${name}.list.mainField`)
251
+ }
252
+ };
253
+ return acc;
254
+ }, {});
255
+ };
256
+ const normalizeLayouts = (layouts, attributes, metadatas, context, path)=>{
257
+ const hasRenderableField = (name)=>{
258
+ const attribute = attributes?.[name];
259
+ return Boolean(attribute && metadatas[name] && hasResolvableComponent(attribute, context));
260
+ };
261
+ return {
262
+ edit: (layouts.edit ?? []).map((row, rowIndex)=>row.filter((field)=>{
263
+ const isRenderable = hasRenderableField(field.name);
264
+ if (!isRenderable) {
265
+ warnOnceInDevelopment(`Dropped non-renderable edit layout field "${path}.layouts.edit.${rowIndex}.${field.name}".`);
266
+ }
267
+ return isRenderable;
268
+ })).filter((row)=>row.length > 0),
269
+ list: (layouts.list ?? []).filter((name, index)=>{
270
+ const isRenderable = hasRenderableField(name);
271
+ if (!isRenderable) {
272
+ warnOnceInDevelopment(`Dropped non-renderable list layout field "${path}.layouts.list.${index}.${name}".`);
273
+ }
274
+ return isRenderable;
275
+ })
276
+ };
277
+ };
278
+ const normalizeConfiguration = (configuration, attributes, context)=>{
279
+ const path = configuration.uid ?? 'configuration';
280
+ const metadatas = normalizeMetadatas(configuration.metadatas, attributes, context, path);
281
+ const layouts = normalizeLayouts(configuration.layouts, attributes, metadatas, context, path);
282
+ return {
283
+ ...configuration,
284
+ settings: normalizeSettings(configuration.settings, attributes, `${path}.settings.mainField`),
285
+ metadatas,
286
+ layouts
287
+ };
288
+ };
289
+ const normalizeComponents = (componentConfigurations, context)=>{
290
+ return Object.entries(componentConfigurations).reduce((acc, [uid, configuration])=>{
291
+ const componentSchema = context.components[uid];
292
+ if (!componentSchema) {
293
+ return acc;
294
+ }
295
+ acc[uid] = normalizeConfiguration(configuration, componentSchema.attributes, context);
296
+ return acc;
297
+ }, {});
298
+ };
299
+ const normalizeContentManagerLayout = (data, context)=>{
300
+ const normalizedComponents = normalizeComponents(data.components, context);
301
+ return {
302
+ contentType: normalizeConfiguration(data.contentType, context.schema?.attributes, context),
303
+ components: normalizedComponents
304
+ };
305
+ };
306
+ const normalizeComponentConfigurationLayout = (data, context)=>{
307
+ const normalizedComponents = normalizeComponents(data.components, {
308
+ components: context.components,
309
+ schemas: context.schemas
310
+ });
311
+ return {
312
+ component: normalizeConfiguration(data.component, context.schema?.attributes, {
313
+ components: context.components,
314
+ schemas: context.schemas
315
+ }),
316
+ components: normalizedComponents
317
+ };
318
+ };
319
+
320
+ export { normalizeComponentConfigurationLayout, normalizeComponentConfigurationResponse, normalizeComponentConfigurationUpdateResponse, normalizeContentManagerLayout, normalizeContentTypeConfigurationResponse, normalizeContentTypeConfigurationUpdateResponse, normalizeContentTypeSettingsResponse };
321
+ //# sourceMappingURL=normalizeContentManagerLayout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeContentManagerLayout.mjs","sources":["../../../../admin/src/utils/layouts/normalizeContentManagerLayout.ts"],"sourcesContent":["import type {\n Component,\n ComponentConfiguration,\n FindComponentConfiguration,\n} from '../../../../shared/contracts/components';\nimport type {\n Configuration,\n FindContentTypeConfiguration,\n FindContentTypesSettings,\n Layouts,\n Metadatas,\n Settings,\n UpdateContentTypeConfiguration,\n} from '../../../../shared/contracts/content-types';\nimport type { ComponentsDictionary, Schema } from '../../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\n\ntype ContentTypeConfigurationData = FindContentTypeConfiguration.Response['data'];\ntype ComponentConfigurationData = FindComponentConfiguration.Response['data'];\ntype ComponentConfigurationResponseData = ComponentConfigurationData['component'];\n\ntype NormalizationContext = {\n components: ComponentsDictionary;\n schema?: Schema | Component;\n schemas: Schema[];\n};\n\ntype ComponentNormalizationContext = {\n components: ComponentsDictionary;\n schema?: Component;\n schemas: Schema[];\n};\n\ntype Attributes = Schema['attributes'] | Component['attributes'];\n\nconst DEFAULT_RESPONSE_SETTINGS: Settings = {\n bulkable: true,\n filterable: true,\n searchable: true,\n pageSize: 10,\n mainField: 'id',\n defaultSortBy: '',\n defaultSortOrder: 'ASC',\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n};\n\nconst warnOnceInDevelopment = (() => {\n const warnings = new Set<string>();\n\n return (message: string) => {\n if (process.env.NODE_ENV !== 'development' || warnings.has(message)) {\n return;\n }\n\n warnings.add(message);\n console.warn(`[Content Manager] ${message}`);\n };\n})();\n\nconst normalizeResponseSettings = (settings: unknown, path: string): Settings => {\n if (!isRecord(settings)) {\n warnOnceInDevelopment(`Received malformed settings at \"${path}\". Falling back to defaults.`);\n }\n\n return {\n ...DEFAULT_RESPONSE_SETTINGS,\n ...(isRecord(settings) ? settings : {}),\n } as Settings;\n};\n\nconst normalizeResponseMetadatas = (metadatas: unknown, path: string): Metadatas => {\n if (!isRecord(metadatas)) {\n warnOnceInDevelopment(`Received malformed metadatas at \"${path}\". Falling back to empty.`);\n return {};\n }\n\n return Object.entries(metadatas).reduce<Metadatas>((acc, [name, metadata]) => {\n const metadataRecord = isRecord(metadata) ? metadata : {};\n\n if (!isRecord(metadata)) {\n warnOnceInDevelopment(`Received malformed metadata for \"${path}.${name}\". Repairing entry.`);\n }\n\n if (!isRecord(metadataRecord.edit)) {\n warnOnceInDevelopment(\n `Received malformed edit metadata for \"${path}.${name}\". Falling back to empty.`\n );\n }\n\n if (!isRecord(metadataRecord.list)) {\n warnOnceInDevelopment(\n `Received malformed list metadata for \"${path}.${name}\". Falling back to empty.`\n );\n }\n\n acc[name] = {\n edit: isRecord(metadataRecord.edit) ? metadataRecord.edit : {},\n list: isRecord(metadataRecord.list) ? metadataRecord.list : {},\n } as Metadatas[string];\n\n return acc;\n }, {});\n};\n\nconst normalizeResponseLayouts = (layouts: unknown, path: string): Layouts => {\n if (!isRecord(layouts)) {\n warnOnceInDevelopment(`Received malformed layouts at \"${path}\". Falling back to empty.`);\n return {\n edit: [],\n list: [],\n };\n }\n\n if (!Array.isArray(layouts.edit)) {\n warnOnceInDevelopment(`Received malformed edit layout at \"${path}\". Falling back to empty.`);\n }\n\n if (!Array.isArray(layouts.list)) {\n warnOnceInDevelopment(`Received malformed list layout at \"${path}\". Falling back to empty.`);\n }\n\n return {\n edit: Array.isArray(layouts.edit)\n ? layouts.edit.map((row, rowIndex) => {\n if (!Array.isArray(row)) {\n warnOnceInDevelopment(`Dropped malformed edit layout row \"${path}.edit.${rowIndex}\".`);\n return [];\n }\n\n return row.filter((field, fieldIndex): field is { name: string; size: number } => {\n const isValidField =\n isRecord(field) && typeof field.name === 'string' && typeof field.size === 'number';\n\n if (!isValidField) {\n warnOnceInDevelopment(\n `Dropped malformed edit layout field \"${path}.edit.${rowIndex}.${fieldIndex}\".`\n );\n }\n\n return isValidField;\n });\n })\n : [],\n list: Array.isArray(layouts.list)\n ? layouts.list.filter((field, index): field is string => {\n const isValidField = typeof field === 'string';\n\n if (!isValidField) {\n warnOnceInDevelopment(`Dropped malformed list layout field \"${path}.list.${index}\".`);\n }\n\n return isValidField;\n })\n : [],\n };\n};\n\nconst normalizeConfigurationResponse = <TConfiguration extends Configuration>(\n configuration: unknown,\n uid?: string,\n path = uid ?? 'configuration'\n): TConfiguration => {\n if (!isRecord(configuration)) {\n warnOnceInDevelopment(`Received malformed configuration at \"${path}\". Repairing entry.`);\n }\n\n const configurationRecord = isRecord(configuration) ? configuration : {};\n\n return {\n ...configurationRecord,\n ...(uid ? { uid } : {}),\n settings: normalizeResponseSettings(configurationRecord.settings, `${path}.settings`),\n metadatas: normalizeResponseMetadatas(configurationRecord.metadatas, `${path}.metadatas`),\n layouts: normalizeResponseLayouts(configurationRecord.layouts, `${path}.layouts`),\n } as TConfiguration;\n};\n\nconst normalizeComponentsRecord = (components: unknown): Record<string, ComponentConfiguration> => {\n if (!isRecord(components)) {\n warnOnceInDevelopment(\n 'Received malformed component configuration record. Falling back to empty.'\n );\n return {};\n }\n\n return Object.entries(components).reduce<Record<string, ComponentConfiguration>>(\n (acc, [uid, configuration]) => {\n acc[uid] = normalizeConfigurationResponse<ComponentConfiguration>(\n configuration,\n uid,\n `components.${uid}`\n );\n\n return acc;\n },\n {}\n );\n};\n\nconst normalizeContentTypeConfigurationResponse = (\n data: unknown,\n uid?: string\n): FindContentTypeConfiguration.Response['data'] => {\n if (!isRecord(data)) {\n warnOnceInDevelopment(\n 'Received malformed content-type configuration response. Repairing data.'\n );\n }\n\n const dataRecord = isRecord(data) ? data : {};\n\n return {\n contentType: normalizeConfigurationResponse(dataRecord.contentType, uid, 'contentType'),\n components: normalizeComponentsRecord(dataRecord.components),\n };\n};\n\nconst normalizeContentTypeConfigurationUpdateResponse = (\n data: unknown\n): UpdateContentTypeConfiguration.Response['data'] => {\n if (!isRecord(data)) {\n warnOnceInDevelopment(\n 'Received malformed content-type configuration update response. Repairing data.'\n );\n }\n\n const dataRecord = isRecord(data) ? data : {};\n\n return {\n contentType: normalizeConfigurationResponse(dataRecord.contentType, undefined, 'contentType'),\n components: normalizeComponentsRecord(dataRecord.components),\n };\n};\n\nconst normalizeComponentConfigurationResponse = (\n data: unknown,\n uid?: string\n): FindComponentConfiguration.Response['data'] => {\n if (!isRecord(data)) {\n warnOnceInDevelopment('Received malformed component configuration response. Repairing data.');\n }\n\n const dataRecord = isRecord(data) ? data : {};\n\n return {\n component: normalizeConfigurationResponse<ComponentConfigurationResponseData>(\n dataRecord.component,\n uid,\n 'component'\n ),\n components: normalizeComponentsRecord(dataRecord.components),\n };\n};\n\nconst normalizeComponentConfigurationUpdateResponse = (\n data: unknown\n): ComponentConfigurationResponseData => {\n return normalizeConfigurationResponse<ComponentConfigurationResponseData>(\n data,\n undefined,\n 'component'\n );\n};\n\nconst normalizeContentTypeSettingsResponse = (\n data: unknown\n): FindContentTypesSettings.Response['data'] => {\n if (!Array.isArray(data)) {\n warnOnceInDevelopment(\n 'Received malformed content-type settings response. Falling back to empty.'\n );\n return [];\n }\n\n return data\n .filter((entry, index): entry is Record<string, unknown> => {\n const isValidEntry = isRecord(entry);\n\n if (!isValidEntry) {\n warnOnceInDevelopment(`Dropped malformed content-type settings entry \"${index}\".`);\n }\n\n return isValidEntry;\n })\n .filter((entry): entry is Record<string, unknown> & { uid: string } => {\n const hasUid = typeof entry.uid === 'string';\n\n if (!hasUid) {\n warnOnceInDevelopment('Dropped content-type settings entry without a uid.');\n }\n\n return hasUid;\n })\n .map((entry) => ({\n uid: entry.uid,\n settings: normalizeResponseSettings(entry.settings, `contentTypeSettings.${entry.uid}`),\n }));\n};\n\nconst hasAttribute = (attributes: Attributes | undefined, name: string | undefined) => {\n return Boolean(name && attributes?.[name]);\n};\n\nconst getTargetAttributes = (\n attribute: SchemaUtils.Attribute.AnyAttribute,\n { components, schemas }: Pick<NormalizationContext, 'components' | 'schemas'>\n) => {\n if (attribute.type === 'component') {\n return components[attribute.component]?.attributes;\n }\n\n if (attribute.type === 'relation') {\n const target =\n 'targetModel' in attribute\n ? attribute.targetModel\n : 'target' in attribute\n ? attribute.target\n : undefined;\n\n return schemas.find((schema) => schema.uid === target)?.attributes;\n }\n\n return undefined;\n};\n\nconst hasTargetSchema = (\n attribute: SchemaUtils.Attribute.AnyAttribute,\n { schemas }: Pick<NormalizationContext, 'schemas'>\n) => {\n if (attribute.type !== 'relation') {\n return true;\n }\n\n const target =\n 'targetModel' in attribute\n ? attribute.targetModel\n : 'target' in attribute\n ? attribute.target\n : undefined;\n\n return schemas.some((schema) => schema.uid === target);\n};\n\nconst normalizeMainField = (\n attribute: SchemaUtils.Attribute.AnyAttribute,\n mainField: string | undefined,\n context: Pick<NormalizationContext, 'components' | 'schemas'>,\n path: string\n) => {\n if (!mainField) {\n return mainField;\n }\n\n const targetAttributes = getTargetAttributes(attribute, context);\n\n if (!targetAttributes) {\n if (attribute.type === 'relation' && !hasTargetSchema(attribute, context)) {\n return mainField;\n }\n\n if (attribute.type !== 'component' && attribute.type !== 'relation') {\n return mainField;\n }\n\n warnOnceInDevelopment(`Reset invalid mainField \"${mainField}\" at \"${path}\" to \"id\".`);\n\n return 'id';\n }\n\n if (hasAttribute(targetAttributes, mainField)) {\n return mainField;\n }\n\n warnOnceInDevelopment(`Reset invalid mainField \"${mainField}\" at \"${path}\" to \"id\".`);\n\n return 'id';\n};\n\nconst normalizeSettings = (\n settings: Settings,\n attributes: Attributes | undefined,\n path: string\n) => {\n if (\n !settings.mainField ||\n hasAttribute(attributes, settings.mainField) ||\n settings.mainField === 'id'\n ) {\n return settings;\n }\n\n warnOnceInDevelopment(`Reset invalid mainField \"${settings.mainField}\" at \"${path}\" to \"id\".`);\n\n return {\n ...settings,\n mainField: 'id',\n };\n};\n\nconst hasResolvableComponent = (\n attribute: SchemaUtils.Attribute.AnyAttribute | undefined,\n context: Pick<NormalizationContext, 'components'>\n) => {\n if (!attribute || !('component' in attribute) || typeof attribute.component !== 'string') {\n return true;\n }\n\n return Boolean(context.components[attribute.component]);\n};\n\nconst normalizeMetadatas = (\n metadatas: Metadatas,\n attributes: Attributes | undefined,\n context: Pick<NormalizationContext, 'components' | 'schemas'>,\n path: string\n) => {\n return Object.entries(metadatas).reduce<Metadatas>((acc, [name, metadata]) => {\n const attribute = attributes?.[name];\n\n if (!attribute) {\n warnOnceInDevelopment(`Dropped metadata for unknown field \"${path}.metadatas.${name}\".`);\n return acc;\n }\n\n if (!hasResolvableComponent(attribute, context)) {\n warnOnceInDevelopment(\n `Dropped metadata for field \"${path}.metadatas.${name}\" because its component schema is unavailable.`\n );\n return acc;\n }\n\n acc[name] = {\n edit: {\n ...metadata.edit,\n // `mainField` is present at runtime for component/relation edit metadata.\n ...('mainField' in metadata.edit\n ? {\n mainField: normalizeMainField(\n attribute,\n (metadata.edit as { mainField?: string }).mainField,\n context,\n `${path}.metadatas.${name}.edit.mainField`\n ),\n }\n : {}),\n },\n list: {\n ...metadata.list,\n mainField: normalizeMainField(\n attribute,\n metadata.list.mainField,\n context,\n `${path}.metadatas.${name}.list.mainField`\n ),\n },\n };\n\n return acc;\n }, {});\n};\n\nconst normalizeLayouts = (\n layouts: Layouts,\n attributes: Attributes | undefined,\n metadatas: Metadatas,\n context: Pick<NormalizationContext, 'components'>,\n path: string\n) => {\n const hasRenderableField = (name: string) => {\n const attribute = attributes?.[name];\n\n return Boolean(attribute && metadatas[name] && hasResolvableComponent(attribute, context));\n };\n\n return {\n edit: (layouts.edit ?? [])\n .map((row, rowIndex) =>\n row.filter((field) => {\n const isRenderable = hasRenderableField(field.name);\n\n if (!isRenderable) {\n warnOnceInDevelopment(\n `Dropped non-renderable edit layout field \"${path}.layouts.edit.${rowIndex}.${field.name}\".`\n );\n }\n\n return isRenderable;\n })\n )\n .filter((row) => row.length > 0),\n list: (layouts.list ?? []).filter((name, index) => {\n const isRenderable = hasRenderableField(name);\n\n if (!isRenderable) {\n warnOnceInDevelopment(\n `Dropped non-renderable list layout field \"${path}.layouts.list.${index}.${name}\".`\n );\n }\n\n return isRenderable;\n }),\n };\n};\n\nconst normalizeConfiguration = <TConfiguration extends Configuration>(\n configuration: TConfiguration,\n attributes: Attributes | undefined,\n context: Pick<NormalizationContext, 'components' | 'schemas'>\n) => {\n const path = configuration.uid ?? 'configuration';\n const metadatas = normalizeMetadatas(configuration.metadatas, attributes, context, path);\n const layouts = normalizeLayouts(configuration.layouts, attributes, metadatas, context, path);\n\n return {\n ...configuration,\n settings: normalizeSettings(configuration.settings, attributes, `${path}.settings.mainField`),\n metadatas,\n layouts,\n };\n};\n\nconst normalizeComponents = (\n componentConfigurations: Record<string, ComponentConfiguration>,\n context: Pick<NormalizationContext, 'components' | 'schemas'>\n) => {\n return Object.entries(componentConfigurations).reduce<Record<string, ComponentConfiguration>>(\n (acc, [uid, configuration]) => {\n const componentSchema = context.components[uid];\n\n if (!componentSchema) {\n return acc;\n }\n\n acc[uid] = normalizeConfiguration(configuration, componentSchema.attributes, context);\n\n return acc;\n },\n {}\n );\n};\n\nconst normalizeContentManagerLayout = (\n data: ContentTypeConfigurationData,\n context: NormalizationContext\n): ContentTypeConfigurationData => {\n const normalizedComponents = normalizeComponents(data.components, context);\n\n return {\n contentType: normalizeConfiguration(data.contentType, context.schema?.attributes, context),\n components: normalizedComponents,\n };\n};\n\nconst normalizeComponentConfigurationLayout = (\n data: ComponentConfigurationData,\n context: ComponentNormalizationContext\n): ComponentConfigurationData => {\n const normalizedComponents = normalizeComponents(data.components, {\n components: context.components,\n schemas: context.schemas,\n });\n\n return {\n component: normalizeConfiguration(data.component, context.schema?.attributes, {\n components: context.components,\n schemas: context.schemas,\n }),\n components: normalizedComponents,\n };\n};\n\nexport {\n normalizeContentManagerLayout,\n normalizeComponentConfigurationLayout,\n normalizeContentTypeConfigurationResponse,\n normalizeContentTypeConfigurationUpdateResponse,\n normalizeComponentConfigurationResponse,\n normalizeComponentConfigurationUpdateResponse,\n normalizeContentTypeSettingsResponse,\n};\n"],"names":["DEFAULT_RESPONSE_SETTINGS","bulkable","filterable","searchable","pageSize","mainField","defaultSortBy","defaultSortOrder","isRecord","value","Boolean","Array","isArray","warnOnceInDevelopment","warnings","Set","message","process","env","NODE_ENV","has","add","console","warn","normalizeResponseSettings","settings","path","normalizeResponseMetadatas","metadatas","Object","entries","reduce","acc","name","metadata","metadataRecord","edit","list","normalizeResponseLayouts","layouts","map","row","rowIndex","filter","field","fieldIndex","isValidField","size","index","normalizeConfigurationResponse","configuration","uid","configurationRecord","normalizeComponentsRecord","components","normalizeContentTypeConfigurationResponse","data","dataRecord","contentType","normalizeContentTypeConfigurationUpdateResponse","undefined","normalizeComponentConfigurationResponse","component","normalizeComponentConfigurationUpdateResponse","normalizeContentTypeSettingsResponse","entry","isValidEntry","hasUid","hasAttribute","attributes","getTargetAttributes","attribute","schemas","type","target","targetModel","find","schema","hasTargetSchema","some","normalizeMainField","context","targetAttributes","normalizeSettings","hasResolvableComponent","normalizeMetadatas","normalizeLayouts","hasRenderableField","isRenderable","length","normalizeConfiguration","normalizeComponents","componentConfigurations","componentSchema","normalizeContentManagerLayout","normalizedComponents","normalizeComponentConfigurationLayout"],"mappings":"AAmCA,MAAMA,yBAAAA,GAAsC;IAC1CC,QAAAA,EAAU,IAAA;IACVC,UAAAA,EAAY,IAAA;IACZC,UAAAA,EAAY,IAAA;IACZC,QAAAA,EAAU,EAAA;IACVC,SAAAA,EAAW,IAAA;IACXC,aAAAA,EAAe,EAAA;IACfC,gBAAAA,EAAkB;AACpB,CAAA;AAEA,MAAMC,WAAW,CAACC,KAAAA,GAAAA;IAChB,OAAOC,OAAAA,CAAQD,UAAU,OAAOA,KAAAA,KAAU,YAAY,CAACE,KAAAA,CAAMC,OAAO,CAACH,KAAAA,CAAAA;AACvE,CAAA;AAEA,MAAMI,qBAAAA,GAAwB,CAAC,IAAA;AAC7B,IAAA,MAAMC,WAAW,IAAIC,GAAAA,EAAAA;AAErB,IAAA,OAAO,CAACC,OAAAA,GAAAA;QACN,IAAIC,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,aAAA,IAAiBL,QAAAA,CAASM,GAAG,CAACJ,OAAAA,CAAAA,EAAU;AACnE,YAAA;AACF,QAAA;AAEAF,QAAAA,QAAAA,CAASO,GAAG,CAACL,OAAAA,CAAAA;AACbM,QAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAC,kBAAkB,EAAEP,OAAAA,CAAAA,CAAS,CAAA;AAC7C,IAAA,CAAA;AACF,CAAA,GAAA;AAEA,MAAMQ,yBAAAA,GAA4B,CAACC,QAAAA,EAAmBC,IAAAA,GAAAA;IACpD,IAAI,CAAClB,SAASiB,QAAAA,CAAAA,EAAW;AACvBZ,QAAAA,qBAAAA,CAAsB,CAAC,gCAAgC,EAAEa,IAAAA,CAAK,4BAA4B,CAAC,CAAA;AAC7F,IAAA;IAEA,OAAO;AACL,QAAA,GAAG1B,yBAAyB;AAC5B,QAAA,GAAIQ,QAAAA,CAASiB,QAAAA,CAAAA,GAAYA,QAAAA,GAAW;AACtC,KAAA;AACF,CAAA;AAEA,MAAME,0BAAAA,GAA6B,CAACC,SAAAA,EAAoBF,IAAAA,GAAAA;IACtD,IAAI,CAAClB,SAASoB,SAAAA,CAAAA,EAAY;AACxBf,QAAAA,qBAAAA,CAAsB,CAAC,iCAAiC,EAAEa,IAAAA,CAAK,yBAAyB,CAAC,CAAA;AACzF,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,OAAOG,MAAAA,CAAOC,OAAO,CAACF,SAAAA,CAAAA,CAAWG,MAAM,CAAY,CAACC,GAAAA,EAAK,CAACC,IAAAA,EAAMC,QAAAA,CAAS,GAAA;AACvE,QAAA,MAAMC,cAAAA,GAAiB3B,QAAAA,CAAS0B,QAAAA,CAAAA,GAAYA,QAAAA,GAAW,EAAC;QAExD,IAAI,CAAC1B,SAAS0B,QAAAA,CAAAA,EAAW;YACvBrB,qBAAAA,CAAsB,CAAC,iCAAiC,EAAEa,IAAAA,CAAK,CAAC,EAAEO,IAAAA,CAAK,mBAAmB,CAAC,CAAA;AAC7F,QAAA;AAEA,QAAA,IAAI,CAACzB,QAAAA,CAAS2B,cAAAA,CAAeC,IAAI,CAAA,EAAG;YAClCvB,qBAAAA,CACE,CAAC,sCAAsC,EAAEa,IAAAA,CAAK,CAAC,EAAEO,IAAAA,CAAK,yBAAyB,CAAC,CAAA;AAEpF,QAAA;AAEA,QAAA,IAAI,CAACzB,QAAAA,CAAS2B,cAAAA,CAAeE,IAAI,CAAA,EAAG;YAClCxB,qBAAAA,CACE,CAAC,sCAAsC,EAAEa,IAAAA,CAAK,CAAC,EAAEO,IAAAA,CAAK,yBAAyB,CAAC,CAAA;AAEpF,QAAA;QAEAD,GAAG,CAACC,KAAK,GAAG;AACVG,YAAAA,IAAAA,EAAM5B,SAAS2B,cAAAA,CAAeC,IAAI,IAAID,cAAAA,CAAeC,IAAI,GAAG,EAAC;AAC7DC,YAAAA,IAAAA,EAAM7B,SAAS2B,cAAAA,CAAeE,IAAI,IAAIF,cAAAA,CAAeE,IAAI,GAAG;AAC9D,SAAA;QAEA,OAAOL,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN,CAAA;AAEA,MAAMM,wBAAAA,GAA2B,CAACC,OAAAA,EAAkBb,IAAAA,GAAAA;IAClD,IAAI,CAAClB,SAAS+B,OAAAA,CAAAA,EAAU;AACtB1B,QAAAA,qBAAAA,CAAsB,CAAC,+BAA+B,EAAEa,IAAAA,CAAK,yBAAyB,CAAC,CAAA;QACvF,OAAO;AACLU,YAAAA,IAAAA,EAAM,EAAE;AACRC,YAAAA,IAAAA,EAAM;AACR,SAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAAC1B,KAAAA,CAAMC,OAAO,CAAC2B,OAAAA,CAAQH,IAAI,CAAA,EAAG;AAChCvB,QAAAA,qBAAAA,CAAsB,CAAC,mCAAmC,EAAEa,IAAAA,CAAK,yBAAyB,CAAC,CAAA;AAC7F,IAAA;AAEA,IAAA,IAAI,CAACf,KAAAA,CAAMC,OAAO,CAAC2B,OAAAA,CAAQF,IAAI,CAAA,EAAG;AAChCxB,QAAAA,qBAAAA,CAAsB,CAAC,mCAAmC,EAAEa,IAAAA,CAAK,yBAAyB,CAAC,CAAA;AAC7F,IAAA;IAEA,OAAO;AACLU,QAAAA,IAAAA,EAAMzB,KAAAA,CAAMC,OAAO,CAAC2B,OAAAA,CAAQH,IAAI,CAAA,GAC5BG,OAAAA,CAAQH,IAAI,CAACI,GAAG,CAAC,CAACC,GAAAA,EAAKC,QAAAA,GAAAA;AACrB,YAAA,IAAI,CAAC/B,KAAAA,CAAMC,OAAO,CAAC6B,GAAAA,CAAAA,EAAM;gBACvB5B,qBAAAA,CAAsB,CAAC,mCAAmC,EAAEa,IAAAA,CAAK,MAAM,EAAEgB,QAAAA,CAAS,EAAE,CAAC,CAAA;AACrF,gBAAA,OAAO,EAAE;AACX,YAAA;AAEA,YAAA,OAAOD,GAAAA,CAAIE,MAAM,CAAC,CAACC,KAAAA,EAAOC,UAAAA,GAAAA;gBACxB,MAAMC,YAAAA,GACJtC,QAAAA,CAASoC,KAAAA,CAAAA,IAAU,OAAOA,KAAAA,CAAMX,IAAI,KAAK,QAAA,IAAY,OAAOW,KAAAA,CAAMG,IAAI,KAAK,QAAA;AAE7E,gBAAA,IAAI,CAACD,YAAAA,EAAc;oBACjBjC,qBAAAA,CACE,CAAC,qCAAqC,EAAEa,IAAAA,CAAK,MAAM,EAAEgB,QAAAA,CAAS,CAAC,EAAEG,UAAAA,CAAW,EAAE,CAAC,CAAA;AAEnF,gBAAA;gBAEA,OAAOC,YAAAA;AACT,YAAA,CAAA,CAAA;AACF,QAAA,CAAA,CAAA,GACA,EAAE;AACNT,QAAAA,IAAAA,EAAM1B,KAAAA,CAAMC,OAAO,CAAC2B,OAAAA,CAAQF,IAAI,CAAA,GAC5BE,OAAAA,CAAQF,IAAI,CAACM,MAAM,CAAC,CAACC,KAAAA,EAAOI,KAAAA,GAAAA;YAC1B,MAAMF,YAAAA,GAAe,OAAOF,KAAAA,KAAU,QAAA;AAEtC,YAAA,IAAI,CAACE,YAAAA,EAAc;gBACjBjC,qBAAAA,CAAsB,CAAC,qCAAqC,EAAEa,IAAAA,CAAK,MAAM,EAAEsB,KAAAA,CAAM,EAAE,CAAC,CAAA;AACtF,YAAA;YAEA,OAAOF,YAAAA;AACT,QAAA,CAAA,CAAA,GACA;AACN,KAAA;AACF,CAAA;AAEA,MAAMG,iCAAiC,CACrCC,aAAAA,EACAC,GAAAA,EACAzB,IAAAA,GAAOyB,OAAO,eAAe,GAAA;IAE7B,IAAI,CAAC3C,SAAS0C,aAAAA,CAAAA,EAAgB;AAC5BrC,QAAAA,qBAAAA,CAAsB,CAAC,qCAAqC,EAAEa,IAAAA,CAAK,mBAAmB,CAAC,CAAA;AACzF,IAAA;AAEA,IAAA,MAAM0B,mBAAAA,GAAsB5C,QAAAA,CAAS0C,aAAAA,CAAAA,GAAiBA,aAAAA,GAAgB,EAAC;IAEvE,OAAO;AACL,QAAA,GAAGE,mBAAmB;AACtB,QAAA,GAAID,GAAAA,GAAM;AAAEA,YAAAA;AAAI,SAAA,GAAI,EAAE;AACtB1B,QAAAA,QAAAA,EAAUD,0BAA0B4B,mBAAAA,CAAoB3B,QAAQ,EAAE,CAAA,EAAGC,IAAAA,CAAK,SAAS,CAAC,CAAA;AACpFE,QAAAA,SAAAA,EAAWD,2BAA2ByB,mBAAAA,CAAoBxB,SAAS,EAAE,CAAA,EAAGF,IAAAA,CAAK,UAAU,CAAC,CAAA;AACxFa,QAAAA,OAAAA,EAASD,yBAAyBc,mBAAAA,CAAoBb,OAAO,EAAE,CAAA,EAAGb,IAAAA,CAAK,QAAQ,CAAC;AAClF,KAAA;AACF,CAAA;AAEA,MAAM2B,4BAA4B,CAACC,UAAAA,GAAAA;IACjC,IAAI,CAAC9C,SAAS8C,UAAAA,CAAAA,EAAa;QACzBzC,qBAAAA,CACE,2EAAA,CAAA;AAEF,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,OAAOgB,MAAAA,CAAOC,OAAO,CAACwB,UAAAA,CAAAA,CAAYvB,MAAM,CACtC,CAACC,GAAAA,EAAK,CAACmB,GAAAA,EAAKD,aAAAA,CAAc,GAAA;QACxBlB,GAAG,CAACmB,IAAI,GAAGF,8BAAAA,CACTC,eACAC,GAAAA,EACA,CAAC,WAAW,EAAEA,GAAAA,CAAAA,CAAK,CAAA;QAGrB,OAAOnB,GAAAA;AACT,IAAA,CAAA,EACA,EAAC,CAAA;AAEL,CAAA;AAEA,MAAMuB,yCAAAA,GAA4C,CAChDC,IAAAA,EACAL,GAAAA,GAAAA;IAEA,IAAI,CAAC3C,SAASgD,IAAAA,CAAAA,EAAO;QACnB3C,qBAAAA,CACE,yEAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,MAAM4C,UAAAA,GAAajD,QAAAA,CAASgD,IAAAA,CAAAA,GAAQA,IAAAA,GAAO,EAAC;IAE5C,OAAO;AACLE,QAAAA,WAAAA,EAAaT,8BAAAA,CAA+BQ,UAAAA,CAAWC,WAAW,EAAEP,GAAAA,EAAK,aAAA,CAAA;QACzEG,UAAAA,EAAYD,yBAAAA,CAA0BI,WAAWH,UAAU;AAC7D,KAAA;AACF;AAEA,MAAMK,kDAAkD,CACtDH,IAAAA,GAAAA;IAEA,IAAI,CAAChD,SAASgD,IAAAA,CAAAA,EAAO;QACnB3C,qBAAAA,CACE,gFAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,MAAM4C,UAAAA,GAAajD,QAAAA,CAASgD,IAAAA,CAAAA,GAAQA,IAAAA,GAAO,EAAC;IAE5C,OAAO;AACLE,QAAAA,WAAAA,EAAaT,8BAAAA,CAA+BQ,UAAAA,CAAWC,WAAW,EAAEE,SAAAA,EAAW,aAAA,CAAA;QAC/EN,UAAAA,EAAYD,yBAAAA,CAA0BI,WAAWH,UAAU;AAC7D,KAAA;AACF;AAEA,MAAMO,uCAAAA,GAA0C,CAC9CL,IAAAA,EACAL,GAAAA,GAAAA;IAEA,IAAI,CAAC3C,SAASgD,IAAAA,CAAAA,EAAO;QACnB3C,qBAAAA,CAAsB,sEAAA,CAAA;AACxB,IAAA;AAEA,IAAA,MAAM4C,UAAAA,GAAajD,QAAAA,CAASgD,IAAAA,CAAAA,GAAQA,IAAAA,GAAO,EAAC;IAE5C,OAAO;AACLM,QAAAA,SAAAA,EAAWb,8BAAAA,CACTQ,UAAAA,CAAWK,SAAS,EACpBX,GAAAA,EACA,WAAA,CAAA;QAEFG,UAAAA,EAAYD,yBAAAA,CAA0BI,WAAWH,UAAU;AAC7D,KAAA;AACF;AAEA,MAAMS,gDAAgD,CACpDP,IAAAA,GAAAA;IAEA,OAAOP,8BAAAA,CACLO,MACAI,SAAAA,EACA,WAAA,CAAA;AAEJ;AAEA,MAAMI,uCAAuC,CAC3CR,IAAAA,GAAAA;AAEA,IAAA,IAAI,CAAC7C,KAAAA,CAAMC,OAAO,CAAC4C,IAAAA,CAAAA,EAAO;QACxB3C,qBAAAA,CACE,2EAAA,CAAA;AAEF,QAAA,OAAO,EAAE;AACX,IAAA;AAEA,IAAA,OAAO2C,IAAAA,CACJb,MAAM,CAAC,CAACsB,KAAAA,EAAOjB,KAAAA,GAAAA;AACd,QAAA,MAAMkB,eAAe1D,QAAAA,CAASyD,KAAAA,CAAAA;AAE9B,QAAA,IAAI,CAACC,YAAAA,EAAc;AACjBrD,YAAAA,qBAAAA,CAAsB,CAAC,+CAA+C,EAAEmC,KAAAA,CAAM,EAAE,CAAC,CAAA;AACnF,QAAA;QAEA,OAAOkB,YAAAA;IACT,CAAA,CAAA,CACCvB,MAAM,CAAC,CAACsB,KAAAA,GAAAA;AACP,QAAA,MAAME,MAAAA,GAAS,OAAOF,KAAAA,CAAMd,GAAG,KAAK,QAAA;AAEpC,QAAA,IAAI,CAACgB,MAAAA,EAAQ;YACXtD,qBAAAA,CAAsB,oDAAA,CAAA;AACxB,QAAA;QAEA,OAAOsD,MAAAA;AACT,IAAA,CAAA,CAAA,CACC3B,GAAG,CAAC,CAACyB,KAAAA,IAAW;AACfd,YAAAA,GAAAA,EAAKc,MAAMd,GAAG;YACd1B,QAAAA,EAAUD,yBAAAA,CAA0ByC,MAAMxC,QAAQ,EAAE,CAAC,oBAAoB,EAAEwC,KAAAA,CAAMd,GAAG,CAAA,CAAE;SACxF,CAAA,CAAA;AACJ;AAEA,MAAMiB,YAAAA,GAAe,CAACC,UAAAA,EAAoCpC,IAAAA,GAAAA;AACxD,IAAA,OAAOvB,OAAAA,CAAQuB,IAAAA,IAAQoC,UAAAA,GAAapC,IAAAA,CAAK,CAAA;AAC3C,CAAA;AAEA,MAAMqC,sBAAsB,CAC1BC,SAAAA,EACA,EAAEjB,UAAU,EAAEkB,OAAO,EAAwD,GAAA;IAE7E,IAAID,SAAAA,CAAUE,IAAI,KAAK,WAAA,EAAa;AAClC,QAAA,OAAOnB,UAAU,CAACiB,SAAAA,CAAUT,SAAS,CAAC,EAAEO,UAAAA;AAC1C,IAAA;IAEA,IAAIE,SAAAA,CAAUE,IAAI,KAAK,UAAA,EAAY;QACjC,MAAMC,MAAAA,GACJ,aAAA,IAAiBH,SAAAA,GACbA,SAAAA,CAAUI,WAAW,GACrB,QAAA,IAAYJ,SAAAA,GACVA,SAAAA,CAAUG,MAAM,GAChBd,SAAAA;QAER,OAAOY,OAAAA,CAAQI,IAAI,CAAC,CAACC,SAAWA,MAAAA,CAAO1B,GAAG,KAAKuB,MAAAA,CAAAA,EAASL,UAAAA;AAC1D,IAAA;IAEA,OAAOT,SAAAA;AACT,CAAA;AAEA,MAAMkB,eAAAA,GAAkB,CACtBP,SAAAA,EACA,EAAEC,OAAO,EAAyC,GAAA;IAElD,IAAID,SAAAA,CAAUE,IAAI,KAAK,UAAA,EAAY;QACjC,OAAO,IAAA;AACT,IAAA;IAEA,MAAMC,MAAAA,GACJ,aAAA,IAAiBH,SAAAA,GACbA,SAAAA,CAAUI,WAAW,GACrB,QAAA,IAAYJ,SAAAA,GACVA,SAAAA,CAAUG,MAAM,GAChBd,SAAAA;AAER,IAAA,OAAOY,QAAQO,IAAI,CAAC,CAACF,MAAAA,GAAWA,MAAAA,CAAO1B,GAAG,KAAKuB,MAAAA,CAAAA;AACjD,CAAA;AAEA,MAAMM,kBAAAA,GAAqB,CACzBT,SAAAA,EACAlE,SAAAA,EACA4E,OAAAA,EACAvD,IAAAA,GAAAA;AAEA,IAAA,IAAI,CAACrB,SAAAA,EAAW;QACd,OAAOA,SAAAA;AACT,IAAA;IAEA,MAAM6E,gBAAAA,GAAmBZ,oBAAoBC,SAAAA,EAAWU,OAAAA,CAAAA;AAExD,IAAA,IAAI,CAACC,gBAAAA,EAAkB;AACrB,QAAA,IAAIX,UAAUE,IAAI,KAAK,cAAc,CAACK,eAAAA,CAAgBP,WAAWU,OAAAA,CAAAA,EAAU;YACzE,OAAO5E,SAAAA;AACT,QAAA;AAEA,QAAA,IAAIkE,UAAUE,IAAI,KAAK,eAAeF,SAAAA,CAAUE,IAAI,KAAK,UAAA,EAAY;YACnE,OAAOpE,SAAAA;AACT,QAAA;QAEAQ,qBAAAA,CAAsB,CAAC,yBAAyB,EAAER,SAAAA,CAAU,MAAM,EAAEqB,IAAAA,CAAK,UAAU,CAAC,CAAA;QAEpF,OAAO,IAAA;AACT,IAAA;IAEA,IAAI0C,YAAAA,CAAac,kBAAkB7E,SAAAA,CAAAA,EAAY;QAC7C,OAAOA,SAAAA;AACT,IAAA;IAEAQ,qBAAAA,CAAsB,CAAC,yBAAyB,EAAER,SAAAA,CAAU,MAAM,EAAEqB,IAAAA,CAAK,UAAU,CAAC,CAAA;IAEpF,OAAO,IAAA;AACT,CAAA;AAEA,MAAMyD,iBAAAA,GAAoB,CACxB1D,QAAAA,EACA4C,UAAAA,EACA3C,IAAAA,GAAAA;AAEA,IAAA,IACE,CAACD,QAAAA,CAASpB,SAAS,IACnB+D,YAAAA,CAAaC,UAAAA,EAAY5C,QAAAA,CAASpB,SAAS,CAAA,IAC3CoB,QAAAA,CAASpB,SAAS,KAAK,IAAA,EACvB;QACA,OAAOoB,QAAAA;AACT,IAAA;IAEAZ,qBAAAA,CAAsB,CAAC,yBAAyB,EAAEY,QAAAA,CAASpB,SAAS,CAAC,MAAM,EAAEqB,IAAAA,CAAK,UAAU,CAAC,CAAA;IAE7F,OAAO;AACL,QAAA,GAAGD,QAAQ;QACXpB,SAAAA,EAAW;AACb,KAAA;AACF,CAAA;AAEA,MAAM+E,sBAAAA,GAAyB,CAC7Bb,SAAAA,EACAU,OAAAA,GAAAA;IAEA,IAAI,CAACV,SAAAA,IAAa,EAAE,WAAA,IAAeA,SAAQ,CAAA,IAAM,OAAOA,SAAAA,CAAUT,SAAS,KAAK,QAAA,EAAU;QACxF,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,OAAOpD,QAAQuE,OAAAA,CAAQ3B,UAAU,CAACiB,SAAAA,CAAUT,SAAS,CAAC,CAAA;AACxD,CAAA;AAEA,MAAMuB,kBAAAA,GAAqB,CACzBzD,SAAAA,EACAyC,UAAAA,EACAY,OAAAA,EACAvD,IAAAA,GAAAA;IAEA,OAAOG,MAAAA,CAAOC,OAAO,CAACF,SAAAA,CAAAA,CAAWG,MAAM,CAAY,CAACC,GAAAA,EAAK,CAACC,IAAAA,EAAMC,QAAAA,CAAS,GAAA;QACvE,MAAMqC,SAAAA,GAAYF,UAAAA,GAAapC,IAAAA,CAAK;AAEpC,QAAA,IAAI,CAACsC,SAAAA,EAAW;YACd1D,qBAAAA,CAAsB,CAAC,oCAAoC,EAAEa,IAAAA,CAAK,WAAW,EAAEO,IAAAA,CAAK,EAAE,CAAC,CAAA;YACvF,OAAOD,GAAAA;AACT,QAAA;QAEA,IAAI,CAACoD,sBAAAA,CAAuBb,SAAAA,EAAWU,OAAAA,CAAAA,EAAU;YAC/CpE,qBAAAA,CACE,CAAC,4BAA4B,EAAEa,IAAAA,CAAK,WAAW,EAAEO,IAAAA,CAAK,8CAA8C,CAAC,CAAA;YAEvG,OAAOD,GAAAA;AACT,QAAA;QAEAA,GAAG,CAACC,KAAK,GAAG;YACVG,IAAAA,EAAM;AACJ,gBAAA,GAAGF,SAASE,IAAI;;gBAEhB,GAAI,WAAA,IAAeF,QAAAA,CAASE,IAAI,GAC5B;AACE/B,oBAAAA,SAAAA,EAAW2E,kBAAAA,CACTT,SAAAA,EACA,QAACrC,CAASE,IAAI,CAA4B/B,SAAS,EACnD4E,OAAAA,EACA,GAAGvD,IAAAA,CAAK,WAAW,EAAEO,IAAAA,CAAK,eAAe,CAAC;AAE9C,iBAAA,GACA;AACN,aAAA;YACAI,IAAAA,EAAM;AACJ,gBAAA,GAAGH,SAASG,IAAI;AAChBhC,gBAAAA,SAAAA,EAAW2E,kBAAAA,CACTT,SAAAA,EACArC,QAAAA,CAASG,IAAI,CAAChC,SAAS,EACvB4E,OAAAA,EACA,CAAA,EAAGvD,IAAAA,CAAK,WAAW,EAAEO,IAAAA,CAAK,eAAe,CAAC;AAE9C;AACF,SAAA;QAEA,OAAOD,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN,CAAA;AAEA,MAAMsD,gBAAAA,GAAmB,CACvB/C,OAAAA,EACA8B,UAAAA,EACAzC,WACAqD,OAAAA,EACAvD,IAAAA,GAAAA;AAEA,IAAA,MAAM6D,qBAAqB,CAACtD,IAAAA,GAAAA;QAC1B,MAAMsC,SAAAA,GAAYF,UAAAA,GAAapC,IAAAA,CAAK;AAEpC,QAAA,OAAOvB,QAAQ6D,SAAAA,IAAa3C,SAAS,CAACK,IAAAA,CAAK,IAAImD,uBAAuBb,SAAAA,EAAWU,OAAAA,CAAAA,CAAAA;AACnF,IAAA,CAAA;IAEA,OAAO;AACL7C,QAAAA,IAAAA,EAAM,CAACG,OAAAA,CAAQH,IAAI,IAAI,EAAE,EACtBI,GAAG,CAAC,CAACC,GAAAA,EAAKC,QAAAA,GACTD,GAAAA,CAAIE,MAAM,CAAC,CAACC,KAAAA,GAAAA;gBACV,MAAM4C,YAAAA,GAAeD,kBAAAA,CAAmB3C,KAAAA,CAAMX,IAAI,CAAA;AAElD,gBAAA,IAAI,CAACuD,YAAAA,EAAc;AACjB3E,oBAAAA,qBAAAA,CACE,CAAC,0CAA0C,EAAEa,IAAAA,CAAK,cAAc,EAAEgB,QAAAA,CAAS,CAAC,EAAEE,KAAAA,CAAMX,IAAI,CAAC,EAAE,CAAC,CAAA;AAEhG,gBAAA;gBAEA,OAAOuD,YAAAA;AACT,YAAA,CAAA,CAAA,CAAA,CAED7C,MAAM,CAAC,CAACF,GAAAA,GAAQA,GAAAA,CAAIgD,MAAM,GAAG,CAAA,CAAA;QAChCpD,IAAAA,EAAOE,CAAAA,OAAAA,CAAQF,IAAI,IAAI,EAAC,EAAGM,MAAM,CAAC,CAACV,IAAAA,EAAMe,KAAAA,GAAAA;AACvC,YAAA,MAAMwC,eAAeD,kBAAAA,CAAmBtD,IAAAA,CAAAA;AAExC,YAAA,IAAI,CAACuD,YAAAA,EAAc;gBACjB3E,qBAAAA,CACE,CAAC,0CAA0C,EAAEa,IAAAA,CAAK,cAAc,EAAEsB,KAAAA,CAAM,CAAC,EAAEf,IAAAA,CAAK,EAAE,CAAC,CAAA;AAEvF,YAAA;YAEA,OAAOuD,YAAAA;AACT,QAAA,CAAA;AACF,KAAA;AACF,CAAA;AAEA,MAAME,sBAAAA,GAAyB,CAC7BxC,aAAAA,EACAmB,UAAAA,EACAY,OAAAA,GAAAA;IAEA,MAAMvD,IAAAA,GAAOwB,aAAAA,CAAcC,GAAG,IAAI,eAAA;AAClC,IAAA,MAAMvB,YAAYyD,kBAAAA,CAAmBnC,aAAAA,CAActB,SAAS,EAAEyC,YAAYY,OAAAA,EAASvD,IAAAA,CAAAA;AACnF,IAAA,MAAMa,UAAU+C,gBAAAA,CAAiBpC,aAAAA,CAAcX,OAAO,EAAE8B,UAAAA,EAAYzC,WAAWqD,OAAAA,EAASvD,IAAAA,CAAAA;IAExF,OAAO;AACL,QAAA,GAAGwB,aAAa;QAChBzB,QAAAA,EAAU0D,iBAAAA,CAAkBjC,cAAczB,QAAQ,EAAE4C,YAAY,CAAA,EAAG3C,IAAAA,CAAK,mBAAmB,CAAC,CAAA;AAC5FE,QAAAA,SAAAA;AACAW,QAAAA;AACF,KAAA;AACF,CAAA;AAEA,MAAMoD,mBAAAA,GAAsB,CAC1BC,uBAAAA,EACAX,OAAAA,GAAAA;IAEA,OAAOpD,MAAAA,CAAOC,OAAO,CAAC8D,uBAAAA,CAAAA,CAAyB7D,MAAM,CACnD,CAACC,GAAAA,EAAK,CAACmB,GAAAA,EAAKD,aAAAA,CAAc,GAAA;AACxB,QAAA,MAAM2C,eAAAA,GAAkBZ,OAAAA,CAAQ3B,UAAU,CAACH,GAAAA,CAAI;AAE/C,QAAA,IAAI,CAAC0C,eAAAA,EAAiB;YACpB,OAAO7D,GAAAA;AACT,QAAA;AAEAA,QAAAA,GAAG,CAACmB,GAAAA,CAAI,GAAGuC,uBAAuBxC,aAAAA,EAAe2C,eAAAA,CAAgBxB,UAAU,EAAEY,OAAAA,CAAAA;QAE7E,OAAOjD,GAAAA;AACT,IAAA,CAAA,EACA,EAAC,CAAA;AAEL,CAAA;AAEA,MAAM8D,6BAAAA,GAAgC,CACpCtC,IAAAA,EACAyB,OAAAA,GAAAA;AAEA,IAAA,MAAMc,oBAAAA,GAAuBJ,mBAAAA,CAAoBnC,IAAAA,CAAKF,UAAU,EAAE2B,OAAAA,CAAAA;IAElE,OAAO;AACLvB,QAAAA,WAAAA,EAAagC,uBAAuBlC,IAAAA,CAAKE,WAAW,EAAEuB,OAAAA,CAAQJ,MAAM,EAAER,UAAAA,EAAYY,OAAAA,CAAAA;QAClF3B,UAAAA,EAAYyC;AACd,KAAA;AACF;AAEA,MAAMC,qCAAAA,GAAwC,CAC5CxC,IAAAA,EACAyB,OAAAA,GAAAA;AAEA,IAAA,MAAMc,oBAAAA,GAAuBJ,mBAAAA,CAAoBnC,IAAAA,CAAKF,UAAU,EAAE;AAChEA,QAAAA,UAAAA,EAAY2B,QAAQ3B,UAAU;AAC9BkB,QAAAA,OAAAA,EAASS,QAAQT;AACnB,KAAA,CAAA;IAEA,OAAO;AACLV,QAAAA,SAAAA,EAAW4B,uBAAuBlC,IAAAA,CAAKM,SAAS,EAAEmB,OAAAA,CAAQJ,MAAM,EAAER,UAAAA,EAAY;AAC5Ef,YAAAA,UAAAA,EAAY2B,QAAQ3B,UAAU;AAC9BkB,YAAAA,OAAAA,EAASS,QAAQT;AACnB,SAAA,CAAA;QACAlB,UAAAA,EAAYyC;AACd,KAAA;AACF;;;;"}
@@ -839,8 +839,13 @@ var collectionTypes = {
839
839
  return ctx.forbidden();
840
840
  }
841
841
  }
842
- // We filter out documentsIds that maybe doesn't exist in a specific locale
843
- const localeDocumentsIds = documentLocales.map((document)=>document.documentId);
842
+ // We filter out documentsIds that maybe doesn't exist in a specific locale.
843
+ // With draft & publish, findLocales returns a row per publication state, so the
844
+ // same documentId can appear twice (draft + published). Deduplicate to avoid
845
+ // deleting (and running document service middleware for) the same document twice.
846
+ const localeDocumentsIds = [
847
+ ...new Set(documentLocales.map((document)=>document.documentId))
848
+ ];
844
849
  const { count } = await documentManager.deleteMany(localeDocumentsIds, model, {
845
850
  locale
846
851
  });