payload 3.71.1 → 3.72.0-internal.3e70d4c
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/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +19 -4
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/endpoints/create.d.ts.map +1 -1
- package/dist/collections/endpoints/create.js +2 -1
- package/dist/collections/endpoints/create.js.map +1 -1
- package/dist/collections/endpoints/update.d.ts.map +1 -1
- package/dist/collections/endpoints/update.js +3 -1
- package/dist/collections/endpoints/update.js.map +1 -1
- package/dist/collections/endpoints/updateByID.d.ts.map +1 -1
- package/dist/collections/endpoints/updateByID.js +4 -2
- package/dist/collections/endpoints/updateByID.js.map +1 -1
- package/dist/collections/operations/create.d.ts +1 -0
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +23 -3
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/local/create.d.ts +4 -0
- package/dist/collections/operations/local/create.d.ts.map +1 -1
- package/dist/collections/operations/local/create.js +2 -1
- package/dist/collections/operations/local/create.js.map +1 -1
- package/dist/collections/operations/local/update.d.ts +12 -0
- package/dist/collections/operations/local/update.d.ts.map +1 -1
- package/dist/collections/operations/local/update.js +3 -1
- package/dist/collections/operations/local/update.js.map +1 -1
- package/dist/collections/operations/update.d.ts +2 -0
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +4 -3
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/updateByID.d.ts +2 -0
- package/dist/collections/operations/updateByID.d.ts.map +1 -1
- package/dist/collections/operations/updateByID.js +4 -3
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/collections/operations/utilities/update.d.ts +4 -3
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +81 -31
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/config/types.d.ts +16 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/migrations/templates/localizeStatus.d.ts +10 -0
- package/dist/database/migrations/templates/localizeStatus.d.ts.map +1 -0
- package/dist/database/migrations/templates/localizeStatus.js +54 -0
- package/dist/database/migrations/templates/localizeStatus.js.map +1 -0
- package/dist/exports/migrations.d.ts +19 -0
- package/dist/exports/migrations.d.ts.map +1 -0
- package/dist/exports/migrations.js +19 -0
- package/dist/exports/migrations.js.map +1 -0
- package/dist/exports/shared.d.ts +1 -1
- package/dist/exports/shared.d.ts.map +1 -1
- package/dist/exports/shared.js +1 -1
- package/dist/exports/shared.js.map +1 -1
- package/dist/globals/config/sanitize.d.ts.map +1 -1
- package/dist/globals/config/sanitize.js +11 -1
- package/dist/globals/config/sanitize.js.map +1 -1
- package/dist/globals/endpoints/update.d.ts.map +1 -1
- package/dist/globals/endpoints/update.js +5 -1
- package/dist/globals/endpoints/update.js.map +1 -1
- package/dist/globals/operations/local/update.d.ts +10 -0
- package/dist/globals/operations/local/update.d.ts.map +1 -1
- package/dist/globals/operations/local/update.js +4 -2
- package/dist/globals/operations/local/update.js.map +1 -1
- package/dist/globals/operations/update.d.ts +2 -0
- package/dist/globals/operations/update.d.ts.map +1 -1
- package/dist/globals/operations/update.js +63 -15
- package/dist/globals/operations/update.js.map +1 -1
- package/dist/index.bundled.d.ts +102 -3
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/utilities/getVersionsConfig.d.ts +4 -0
- package/dist/utilities/getVersionsConfig.d.ts.map +1 -1
- package/dist/utilities/getVersionsConfig.js +7 -2
- package/dist/utilities/getVersionsConfig.js.map +1 -1
- package/dist/utilities/mergeLocalizedData.d.ts +20 -0
- package/dist/utilities/mergeLocalizedData.d.ts.map +1 -0
- package/dist/utilities/mergeLocalizedData.js +277 -0
- package/dist/utilities/mergeLocalizedData.js.map +1 -0
- package/dist/utilities/mergeLocalizedData.spec.js +784 -0
- package/dist/utilities/mergeLocalizedData.spec.js.map +1 -0
- package/dist/utilities/miniChalk.d.ts +15 -0
- package/dist/utilities/miniChalk.d.ts.map +1 -0
- package/dist/utilities/miniChalk.js +34 -0
- package/dist/utilities/miniChalk.js.map +1 -0
- package/dist/utilities/parseParams/index.d.ts +24 -20
- package/dist/utilities/parseParams/index.d.ts.map +1 -1
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/traverseForLocalizedFields.d.ts +3 -0
- package/dist/utilities/traverseForLocalizedFields.d.ts.map +1 -0
- package/dist/utilities/traverseForLocalizedFields.js +41 -0
- package/dist/utilities/traverseForLocalizedFields.js.map +1 -0
- package/dist/versions/baseFields.d.ts +3 -1
- package/dist/versions/baseFields.d.ts.map +1 -1
- package/dist/versions/baseFields.js +16 -15
- package/dist/versions/baseFields.js.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js +28 -2
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
- package/dist/versions/migrations/localizeStatus/index.d.ts +12 -0
- package/dist/versions/migrations/localizeStatus/index.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/index.js +33 -0
- package/dist/versions/migrations/localizeStatus/index.js.map +1 -0
- package/dist/versions/migrations/localizeStatus/mongo/down.d.ts +9 -0
- package/dist/versions/migrations/localizeStatus/mongo/down.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/mongo/down.js +112 -0
- package/dist/versions/migrations/localizeStatus/mongo/down.js.map +1 -0
- package/dist/versions/migrations/localizeStatus/mongo/index.d.ts +8 -0
- package/dist/versions/migrations/localizeStatus/mongo/index.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/mongo/index.js +8 -0
- package/dist/versions/migrations/localizeStatus/mongo/index.js.map +1 -0
- package/dist/versions/migrations/localizeStatus/mongo/up.d.ts +9 -0
- package/dist/versions/migrations/localizeStatus/mongo/up.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/mongo/up.js +220 -0
- package/dist/versions/migrations/localizeStatus/mongo/up.js.map +1 -0
- package/dist/versions/migrations/localizeStatus/shared.d.ts +59 -0
- package/dist/versions/migrations/localizeStatus/shared.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/shared.js +122 -0
- package/dist/versions/migrations/localizeStatus/shared.js.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/down.d.ts +11 -0
- package/dist/versions/migrations/localizeStatus/sql/down.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/down.js +213 -0
- package/dist/versions/migrations/localizeStatus/sql/down.js.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/index.d.ts +8 -0
- package/dist/versions/migrations/localizeStatus/sql/index.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/index.js +8 -0
- package/dist/versions/migrations/localizeStatus/sql/index.js.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts +13 -0
- package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js +51 -0
- package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts +13 -0
- package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js +54 -0
- package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/up.d.ts +11 -0
- package/dist/versions/migrations/localizeStatus/sql/up.d.ts.map +1 -0
- package/dist/versions/migrations/localizeStatus/sql/up.js +277 -0
- package/dist/versions/migrations/localizeStatus/sql/up.js.map +1 -0
- package/dist/versions/saveSnapshot.d.ts.map +1 -1
- package/dist/versions/saveSnapshot.js +0 -1
- package/dist/versions/saveSnapshot.js.map +1 -1
- package/dist/versions/saveVersion.js +0 -3
- package/dist/versions/saveVersion.js.map +1 -1
- package/dist/versions/types.d.ts +18 -0
- package/dist/versions/types.d.ts.map +1 -1
- package/dist/versions/types.js.map +1 -1
- package/package.json +7 -2
- package/dist/uploads/imageResizer.d.ts +0 -40
- package/dist/uploads/imageResizer.d.ts.map +0 -1
- package/dist/uploads/imageResizer.js +0 -356
- package/dist/uploads/imageResizer.js.map +0 -1
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Merges data from dataWithLocales onto docWithLocales for specified locales.
|
|
4
|
+
* For localized fields, merges only the specified locales while preserving others.
|
|
5
|
+
* For non-localized fields, keeps existing values from docWithLocales unchanged.
|
|
6
|
+
* Returns a new object without mutating the original.
|
|
7
|
+
*/ export function mergeLocalizedData({ configBlockReferences, dataWithLocales, docWithLocales, fields, parentIsLocalized = false, selectedLocales }) {
|
|
8
|
+
if (!docWithLocales || typeof docWithLocales !== 'object') {
|
|
9
|
+
return dataWithLocales || docWithLocales;
|
|
10
|
+
}
|
|
11
|
+
const result = {
|
|
12
|
+
...docWithLocales
|
|
13
|
+
};
|
|
14
|
+
for (const field of fields){
|
|
15
|
+
if (fieldAffectsData(field)) {
|
|
16
|
+
// If the parent is localized, all children are inherently "localized"
|
|
17
|
+
if (parentIsLocalized && dataWithLocales[field.name]) {
|
|
18
|
+
result[field.name] = dataWithLocales[field.name];
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const fieldIsLocalized = fieldShouldBeLocalized({
|
|
22
|
+
field,
|
|
23
|
+
parentIsLocalized
|
|
24
|
+
});
|
|
25
|
+
switch(field.type){
|
|
26
|
+
case 'array':
|
|
27
|
+
{
|
|
28
|
+
if (field.name in dataWithLocales) {
|
|
29
|
+
const newValue = dataWithLocales[field.name];
|
|
30
|
+
const existingValue = docWithLocales[field.name];
|
|
31
|
+
if (fieldIsLocalized) {
|
|
32
|
+
// If localized, handle locale keys
|
|
33
|
+
if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {
|
|
34
|
+
const updatedArray = {
|
|
35
|
+
...existingValue || {}
|
|
36
|
+
};
|
|
37
|
+
for (const locale of selectedLocales){
|
|
38
|
+
if (locale in newValue) {
|
|
39
|
+
updatedArray[locale] = newValue[locale];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
result[field.name] = updatedArray;
|
|
43
|
+
} else {
|
|
44
|
+
// Preserve existing value if new value is not a valid object
|
|
45
|
+
result[field.name] = existingValue;
|
|
46
|
+
}
|
|
47
|
+
} else if (Array.isArray(newValue)) {
|
|
48
|
+
// Non-localized array - still process children for any localized fields
|
|
49
|
+
result[field.name] = newValue.map((newItem, index)=>{
|
|
50
|
+
const existingItem = existingValue?.[index] || {};
|
|
51
|
+
return mergeLocalizedData({
|
|
52
|
+
configBlockReferences,
|
|
53
|
+
dataWithLocales: newItem,
|
|
54
|
+
docWithLocales: existingItem,
|
|
55
|
+
fields: field.fields,
|
|
56
|
+
parentIsLocalized,
|
|
57
|
+
selectedLocales
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case 'blocks':
|
|
65
|
+
{
|
|
66
|
+
if (field.name in dataWithLocales) {
|
|
67
|
+
const newValue = dataWithLocales[field.name];
|
|
68
|
+
const existingValue = docWithLocales[field.name];
|
|
69
|
+
if (fieldIsLocalized) {
|
|
70
|
+
// If localized, handle locale keys
|
|
71
|
+
if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {
|
|
72
|
+
const updatedData = {
|
|
73
|
+
...existingValue || {}
|
|
74
|
+
};
|
|
75
|
+
for (const locale of selectedLocales){
|
|
76
|
+
if (locale in newValue) {
|
|
77
|
+
updatedData[locale] = newValue[locale];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
result[field.name] = updatedData;
|
|
81
|
+
} else {
|
|
82
|
+
// Preserve existing value if new value is not a valid object
|
|
83
|
+
result[field.name] = existingValue;
|
|
84
|
+
}
|
|
85
|
+
} else if (Array.isArray(newValue)) {
|
|
86
|
+
// Non-localized blocks - still process children for any localized fields
|
|
87
|
+
result[field.name] = newValue.map((newBlockData, index)=>{
|
|
88
|
+
let block;
|
|
89
|
+
if (configBlockReferences && field.blockReferences) {
|
|
90
|
+
for (const blockOrReference of field.blockReferences){
|
|
91
|
+
if (typeof blockOrReference === 'string') {
|
|
92
|
+
block = configBlockReferences.find((b)=>b.slug === newBlockData.blockType);
|
|
93
|
+
} else {
|
|
94
|
+
block = blockOrReference;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
} else if (field.blocks) {
|
|
98
|
+
block = field.blocks.find((b)=>b.slug === newBlockData.blockType);
|
|
99
|
+
}
|
|
100
|
+
if (block) {
|
|
101
|
+
const blockData = Array.isArray(existingValue) && existingValue[index] ? existingValue[index] : {};
|
|
102
|
+
return mergeLocalizedData({
|
|
103
|
+
configBlockReferences,
|
|
104
|
+
dataWithLocales: newBlockData,
|
|
105
|
+
docWithLocales: blockData,
|
|
106
|
+
fields: block?.fields || [],
|
|
107
|
+
parentIsLocalized,
|
|
108
|
+
selectedLocales
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return newBlockData;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case 'group':
|
|
118
|
+
{
|
|
119
|
+
if (fieldAffectsData(field) && field.name) {
|
|
120
|
+
// Named groups create a nested data structure
|
|
121
|
+
if (field.name in dataWithLocales) {
|
|
122
|
+
const newValue = dataWithLocales[field.name];
|
|
123
|
+
const existingValue = docWithLocales[field.name];
|
|
124
|
+
if (fieldIsLocalized) {
|
|
125
|
+
if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {
|
|
126
|
+
const groupData = {
|
|
127
|
+
...existingValue || {}
|
|
128
|
+
};
|
|
129
|
+
for (const locale of selectedLocales){
|
|
130
|
+
if (locale in newValue && typeof newValue[locale] === 'object') {
|
|
131
|
+
groupData[locale] = newValue[locale];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
result[field.name] = groupData;
|
|
135
|
+
} else {
|
|
136
|
+
// Preserve existing value if new value is not a valid object
|
|
137
|
+
result[field.name] = existingValue;
|
|
138
|
+
}
|
|
139
|
+
} else if (typeof newValue === 'object' && !Array.isArray(newValue)) {
|
|
140
|
+
// Non-localized group - still process children for any localized fields
|
|
141
|
+
result[field.name] = mergeLocalizedData({
|
|
142
|
+
configBlockReferences,
|
|
143
|
+
dataWithLocales: newValue,
|
|
144
|
+
docWithLocales: existingValue || {},
|
|
145
|
+
fields: field.fields,
|
|
146
|
+
parentIsLocalized,
|
|
147
|
+
selectedLocales
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
// Unnamed groups pass through the same data level
|
|
153
|
+
const merged = mergeLocalizedData({
|
|
154
|
+
configBlockReferences,
|
|
155
|
+
dataWithLocales,
|
|
156
|
+
docWithLocales: result,
|
|
157
|
+
fields: field.fields,
|
|
158
|
+
parentIsLocalized,
|
|
159
|
+
selectedLocales
|
|
160
|
+
});
|
|
161
|
+
Object.assign(result, merged);
|
|
162
|
+
}
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
default:
|
|
166
|
+
{
|
|
167
|
+
// For all other data-affecting fields (text, number, select, etc.)
|
|
168
|
+
if (fieldIsLocalized) {
|
|
169
|
+
if (field.name in dataWithLocales) {
|
|
170
|
+
const newValue = dataWithLocales[field.name];
|
|
171
|
+
const existingValue = docWithLocales[field.name] || {};
|
|
172
|
+
// If localized, handle locale keys
|
|
173
|
+
if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {
|
|
174
|
+
const merged = {
|
|
175
|
+
...existingValue
|
|
176
|
+
};
|
|
177
|
+
for (const locale of selectedLocales){
|
|
178
|
+
if (locale in newValue) {
|
|
179
|
+
merged[locale] = newValue[locale];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
result[field.name] = merged;
|
|
183
|
+
} else if (parentIsLocalized) {
|
|
184
|
+
// Child of localized parent - replace with new value
|
|
185
|
+
result[field.name] = newValue;
|
|
186
|
+
} else {
|
|
187
|
+
// Preserve existing value if new value is not a valid object
|
|
188
|
+
result[field.name] = existingValue;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
} else if (parentIsLocalized) {
|
|
192
|
+
result[field.name] = dataWithLocales[field.name];
|
|
193
|
+
} else {
|
|
194
|
+
result[field.name] = field.name in dataWithLocales ? dataWithLocales[field.name] : docWithLocales[field.name];
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
} else {
|
|
200
|
+
// Layout-only fields that don't affect data structure
|
|
201
|
+
switch(field.type){
|
|
202
|
+
case 'collapsible':
|
|
203
|
+
case 'row':
|
|
204
|
+
{
|
|
205
|
+
// These pass through the same data level
|
|
206
|
+
const merged = mergeLocalizedData({
|
|
207
|
+
configBlockReferences,
|
|
208
|
+
dataWithLocales,
|
|
209
|
+
docWithLocales: result,
|
|
210
|
+
fields: field.fields,
|
|
211
|
+
parentIsLocalized,
|
|
212
|
+
selectedLocales
|
|
213
|
+
});
|
|
214
|
+
Object.assign(result, merged);
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
case 'tabs':
|
|
218
|
+
{
|
|
219
|
+
for (const tab of field.tabs){
|
|
220
|
+
if (tabHasName(tab)) {
|
|
221
|
+
// Named tabs create a nested data structure and can be localized
|
|
222
|
+
const tabIsLocalized = fieldShouldBeLocalized({
|
|
223
|
+
field: tab,
|
|
224
|
+
parentIsLocalized
|
|
225
|
+
});
|
|
226
|
+
if (tab.name in dataWithLocales) {
|
|
227
|
+
const newValue = dataWithLocales[tab.name];
|
|
228
|
+
const existingValue = docWithLocales[tab.name];
|
|
229
|
+
if (tabIsLocalized) {
|
|
230
|
+
if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {
|
|
231
|
+
const merged = {
|
|
232
|
+
...existingValue || {}
|
|
233
|
+
};
|
|
234
|
+
for (const locale of selectedLocales){
|
|
235
|
+
if (locale in newValue && typeof newValue[locale] === 'object') {
|
|
236
|
+
merged[locale] = newValue[locale];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
result[tab.name] = merged;
|
|
240
|
+
} else {
|
|
241
|
+
// Preserve existing value if new value is not a valid object
|
|
242
|
+
result[tab.name] = existingValue;
|
|
243
|
+
}
|
|
244
|
+
} else if (typeof newValue === 'object' && !Array.isArray(newValue)) {
|
|
245
|
+
// Non-localized tab - still process children for any localized fields
|
|
246
|
+
result[tab.name] = mergeLocalizedData({
|
|
247
|
+
configBlockReferences,
|
|
248
|
+
dataWithLocales: newValue,
|
|
249
|
+
docWithLocales: existingValue || {},
|
|
250
|
+
fields: tab.fields,
|
|
251
|
+
parentIsLocalized,
|
|
252
|
+
selectedLocales
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
} else {
|
|
257
|
+
// Unnamed tabs pass through the same data level
|
|
258
|
+
const merged = mergeLocalizedData({
|
|
259
|
+
configBlockReferences,
|
|
260
|
+
dataWithLocales,
|
|
261
|
+
docWithLocales: result,
|
|
262
|
+
fields: tab.fields,
|
|
263
|
+
parentIsLocalized,
|
|
264
|
+
selectedLocales
|
|
265
|
+
});
|
|
266
|
+
Object.assign(result, merged);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return result;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
//# sourceMappingURL=mergeLocalizedData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/mergeLocalizedData.ts"],"sourcesContent":["import type { Block, Field, FlattenedBlock } from '../fields/config/types.js'\nimport type { SanitizedConfig } from '../index.js'\nimport type { JsonObject } from '../types/index.js'\n\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js'\n\ntype MergeDataToSelectedLocalesArgs = {\n configBlockReferences: SanitizedConfig['blocks']\n dataWithLocales: JsonObject\n docWithLocales: JsonObject\n fields: Field[]\n parentIsLocalized?: boolean\n selectedLocales: string[]\n}\n\n/**\n * Merges data from dataWithLocales onto docWithLocales for specified locales.\n * For localized fields, merges only the specified locales while preserving others.\n * For non-localized fields, keeps existing values from docWithLocales unchanged.\n * Returns a new object without mutating the original.\n */\nexport function mergeLocalizedData({\n configBlockReferences,\n dataWithLocales,\n docWithLocales,\n fields,\n parentIsLocalized = false,\n selectedLocales,\n}: MergeDataToSelectedLocalesArgs): JsonObject {\n if (!docWithLocales || typeof docWithLocales !== 'object') {\n return dataWithLocales || docWithLocales\n }\n\n const result: JsonObject = { ...docWithLocales }\n\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n // If the parent is localized, all children are inherently \"localized\"\n if (parentIsLocalized && dataWithLocales[field.name]) {\n result[field.name] = dataWithLocales[field.name]\n continue\n }\n\n const fieldIsLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n switch (field.type) {\n case 'array': {\n if (field.name in dataWithLocales) {\n const newValue = dataWithLocales[field.name]\n const existingValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n // If localized, handle locale keys\n if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {\n const updatedArray: Record<string, unknown> = { ...(existingValue || {}) }\n\n for (const locale of selectedLocales) {\n if (locale in newValue) {\n updatedArray[locale] = newValue[locale]\n }\n }\n\n result[field.name] = updatedArray\n } else {\n // Preserve existing value if new value is not a valid object\n result[field.name] = existingValue\n }\n } else if (Array.isArray(newValue)) {\n // Non-localized array - still process children for any localized fields\n result[field.name] = newValue.map((newItem: JsonObject, index: number) => {\n const existingItem = existingValue?.[index] || {}\n\n return mergeLocalizedData({\n configBlockReferences,\n dataWithLocales: newItem,\n docWithLocales: existingItem,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n })\n }\n }\n break\n }\n\n case 'blocks': {\n if (field.name in dataWithLocales) {\n const newValue = dataWithLocales[field.name]\n const existingValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n // If localized, handle locale keys\n if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {\n const updatedData: Record<string, unknown> = { ...(existingValue || {}) }\n\n for (const locale of selectedLocales) {\n if (locale in newValue) {\n updatedData[locale] = newValue[locale]\n }\n }\n\n result[field.name] = updatedData\n } else {\n // Preserve existing value if new value is not a valid object\n result[field.name] = existingValue\n }\n } else if (Array.isArray(newValue)) {\n // Non-localized blocks - still process children for any localized fields\n result[field.name] = newValue.map((newBlockData: JsonObject, index: number) => {\n let block: Block | FlattenedBlock | undefined\n if (configBlockReferences && field.blockReferences) {\n for (const blockOrReference of field.blockReferences) {\n if (typeof blockOrReference === 'string') {\n block = configBlockReferences.find((b) => b.slug === newBlockData.blockType)\n } else {\n block = blockOrReference\n }\n }\n } else if (field.blocks) {\n block = field.blocks.find((b) => b.slug === newBlockData.blockType)\n }\n\n if (block) {\n const blockData =\n Array.isArray(existingValue) && existingValue[index]\n ? (existingValue[index] as JsonObject)\n : {}\n\n return mergeLocalizedData({\n configBlockReferences,\n dataWithLocales: newBlockData,\n docWithLocales: blockData,\n fields: block?.fields || [],\n parentIsLocalized,\n selectedLocales,\n })\n }\n\n return newBlockData\n })\n }\n }\n break\n }\n\n case 'group': {\n if (fieldAffectsData(field) && field.name) {\n // Named groups create a nested data structure\n if (field.name in dataWithLocales) {\n const newValue = dataWithLocales[field.name]\n const existingValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {\n const groupData: Record<string, unknown> = { ...(existingValue || {}) }\n\n for (const locale of selectedLocales) {\n if (locale in newValue && typeof newValue[locale] === 'object') {\n groupData[locale] = newValue[locale]\n }\n }\n\n result[field.name] = groupData\n } else {\n // Preserve existing value if new value is not a valid object\n result[field.name] = existingValue\n }\n } else if (typeof newValue === 'object' && !Array.isArray(newValue)) {\n // Non-localized group - still process children for any localized fields\n result[field.name] = mergeLocalizedData({\n configBlockReferences,\n dataWithLocales: newValue,\n docWithLocales: existingValue || {},\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n }\n }\n } else {\n // Unnamed groups pass through the same data level\n const merged = mergeLocalizedData({\n configBlockReferences,\n dataWithLocales,\n docWithLocales: result, // Use current result to avoid re-processing already-handled fields\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, merged)\n }\n break\n }\n\n default: {\n // For all other data-affecting fields (text, number, select, etc.)\n if (fieldIsLocalized) {\n if (field.name in dataWithLocales) {\n const newValue = dataWithLocales[field.name]\n const existingValue = docWithLocales[field.name] || {}\n\n // If localized, handle locale keys\n if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {\n const merged: Record<string, unknown> = { ...existingValue }\n\n for (const locale of selectedLocales) {\n if (locale in newValue) {\n merged[locale] = newValue[locale]\n }\n }\n\n result[field.name] = merged\n } else if (parentIsLocalized) {\n // Child of localized parent - replace with new value\n result[field.name] = newValue\n } else {\n // Preserve existing value if new value is not a valid object\n result[field.name] = existingValue\n }\n }\n } else if (parentIsLocalized) {\n result[field.name] = dataWithLocales[field.name]\n } else {\n result[field.name] =\n field.name in dataWithLocales\n ? dataWithLocales[field.name]\n : docWithLocales[field.name]\n }\n break\n }\n }\n } else {\n // Layout-only fields that don't affect data structure\n switch (field.type) {\n case 'collapsible':\n case 'row': {\n // These pass through the same data level\n const merged = mergeLocalizedData({\n configBlockReferences,\n dataWithLocales,\n docWithLocales: result, // Use current result to avoid re-processing already-handled fields\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, merged)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n // Named tabs create a nested data structure and can be localized\n const tabIsLocalized = fieldShouldBeLocalized({ field: tab, parentIsLocalized })\n\n if (tab.name in dataWithLocales) {\n const newValue = dataWithLocales[tab.name]\n const existingValue = docWithLocales[tab.name]\n\n if (tabIsLocalized) {\n if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {\n const merged: Record<string, unknown> = { ...(existingValue || {}) }\n\n for (const locale of selectedLocales) {\n if (locale in newValue && typeof newValue[locale] === 'object') {\n merged[locale] = newValue[locale]\n }\n }\n\n result[tab.name] = merged\n } else {\n // Preserve existing value if new value is not a valid object\n result[tab.name] = existingValue\n }\n } else if (typeof newValue === 'object' && !Array.isArray(newValue)) {\n // Non-localized tab - still process children for any localized fields\n result[tab.name] = mergeLocalizedData({\n configBlockReferences,\n dataWithLocales: newValue as JsonObject,\n docWithLocales: existingValue || {},\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n }\n }\n } else {\n // Unnamed tabs pass through the same data level\n const merged = mergeLocalizedData({\n configBlockReferences,\n dataWithLocales,\n docWithLocales: result, // Use current result to avoid re-processing already-handled fields\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, merged)\n }\n }\n break\n }\n }\n }\n }\n\n return result\n}\n"],"names":["fieldAffectsData","fieldShouldBeLocalized","tabHasName","mergeLocalizedData","configBlockReferences","dataWithLocales","docWithLocales","fields","parentIsLocalized","selectedLocales","result","field","name","fieldIsLocalized","type","newValue","existingValue","Array","isArray","updatedArray","locale","map","newItem","index","existingItem","updatedData","newBlockData","block","blockReferences","blockOrReference","find","b","slug","blockType","blocks","blockData","groupData","merged","Object","assign","tab","tabs","tabIsLocalized"],"mappings":"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"}
|