@strapi/i18n 5.42.0 → 5.43.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/CMHeaderActions.js +28 -25
- package/dist/admin/components/CMHeaderActions.js.map +1 -1
- package/dist/admin/components/CMHeaderActions.mjs +26 -23
- package/dist/admin/components/CMHeaderActions.mjs.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/services/fillFromLocale.js +21 -0
- package/dist/admin/services/fillFromLocale.js.map +1 -0
- package/dist/admin/services/fillFromLocale.mjs +18 -0
- package/dist/admin/services/fillFromLocale.mjs.map +1 -0
- package/dist/admin/services/settings.js +1 -1
- package/dist/admin/services/settings.js.map +1 -1
- package/dist/admin/services/settings.mjs +1 -1
- package/dist/admin/services/settings.mjs.map +1 -1
- package/dist/admin/src/services/aiLocalizationJobs.d.ts +1 -1
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/fillFromLocale.d.ts +2 -0
- package/dist/admin/src/services/locales.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +1 -1
- package/dist/admin/src/services/settings.d.ts +2 -2
- package/dist/admin/translations/nl.json.js +91 -0
- package/dist/admin/translations/nl.json.js.map +1 -0
- package/dist/admin/translations/nl.json.mjs +89 -0
- package/dist/admin/translations/nl.json.mjs.map +1 -0
- package/dist/admin/translations/pl.json.js +48 -23
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +48 -23
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/server/bootstrap.js +3 -1
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +3 -1
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/ai-localization-jobs.js +8 -0
- package/dist/server/controllers/ai-localization-jobs.js.map +1 -1
- package/dist/server/controllers/ai-localization-jobs.mjs +8 -0
- package/dist/server/controllers/ai-localization-jobs.mjs.map +1 -1
- package/dist/server/controllers/content-types.js +42 -2
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +43 -3
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/routes/admin.js +18 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +18 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/services/ai-localizations.js +3 -13
- package/dist/server/services/ai-localizations.js.map +1 -1
- package/dist/server/services/ai-localizations.mjs +3 -13
- package/dist/server/services/ai-localizations.mjs.map +1 -1
- package/dist/server/services/fill-from-locale.js +435 -0
- package/dist/server/services/fill-from-locale.js.map +1 -0
- package/dist/server/services/fill-from-locale.mjs +433 -0
- package/dist/server/services/fill-from-locale.mjs.map +1 -0
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/ai-localization-jobs.d.ts.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts +1 -0
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +7 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/ai-localizations.d.ts.map +1 -1
- package/dist/server/src/services/fill-from-locale.d.ts +16 -0
- package/dist/server/src/services/fill-from-locale.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +6 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/validation/content-types.d.ts +2 -1
- package/dist/server/src/validation/content-types.d.ts.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/server/validation/content-types.js +15 -0
- package/dist/server/validation/content-types.js.map +1 -1
- package/dist/server/validation/content-types.mjs +15 -1
- package/dist/server/validation/content-types.mjs.map +1 -1
- package/dist/shared/contracts/content-manager.d.ts +27 -0
- package/dist/shared/contracts/content-manager.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/admin/src/utils/clean.d.ts +0 -4
- package/dist/admin/utils/clean.js +0 -70
- package/dist/admin/utils/clean.js.map +0 -1
- package/dist/admin/utils/clean.mjs +0 -68
- package/dist/admin/utils/clean.mjs.map +0 -1
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import { isArray } from 'lodash/fp';
|
|
2
|
+
import { contentTypes } from '@strapi/utils';
|
|
3
|
+
|
|
4
|
+
const READ_ACTION = 'plugin::content-manager.explorer.read';
|
|
5
|
+
/**
|
|
6
|
+
* Returns the main display field for a model (e.g. title, name).
|
|
7
|
+
* Uses content-manager configuration when available, falls back to first string attribute or 'id'.
|
|
8
|
+
*/ const getMainField = async (targetUid)=>{
|
|
9
|
+
const contentManagerContentTypeService = strapi.plugin('content-manager').service('content-types');
|
|
10
|
+
const configuration = await contentManagerContentTypeService.findConfiguration({
|
|
11
|
+
uid: targetUid
|
|
12
|
+
});
|
|
13
|
+
return configuration.settings.mainField;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Returns the display label for a relation.
|
|
17
|
+
* Matches the logic of the getRelationLabel function in the content-manager plugin.
|
|
18
|
+
*/ const getRelationLabel = (relation, mainField)=>{
|
|
19
|
+
const label = relation[mainField];
|
|
20
|
+
if (typeof label === 'string') return label;
|
|
21
|
+
return String(relation.documentId ?? '');
|
|
22
|
+
};
|
|
23
|
+
const FIELDS_TO_IGNORE = new Set([
|
|
24
|
+
'createdAt',
|
|
25
|
+
'createdBy',
|
|
26
|
+
'updatedAt',
|
|
27
|
+
'updatedBy',
|
|
28
|
+
'id',
|
|
29
|
+
'documentId',
|
|
30
|
+
'publishedAt',
|
|
31
|
+
'strapi_stage',
|
|
32
|
+
'strapi_assignee',
|
|
33
|
+
'locale',
|
|
34
|
+
'status',
|
|
35
|
+
'localizations'
|
|
36
|
+
]);
|
|
37
|
+
const STATUS_FIELDS = new Set([
|
|
38
|
+
'id',
|
|
39
|
+
'documentId',
|
|
40
|
+
'locale',
|
|
41
|
+
'updatedAt',
|
|
42
|
+
'publishedAt'
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* Normalizes a value to an array: arrays pass through, single values become [value], null/undefined become [].
|
|
46
|
+
*/ const normalizeToArray = (value)=>{
|
|
47
|
+
if (isArray(value)) return value;
|
|
48
|
+
if (value) return [
|
|
49
|
+
value
|
|
50
|
+
];
|
|
51
|
+
return [];
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Type guard: returns true if the value is a valid relation object with documentId.
|
|
55
|
+
*/ const isValidRelation = (rel)=>typeof rel === 'object' && rel !== null && 'documentId' in rel && !!rel.documentId;
|
|
56
|
+
/**
|
|
57
|
+
* Maps relations from the source locale to target locale (batched for better performance).
|
|
58
|
+
*/ const resolveRelationsForLocaleBatch = async (relations, targetUid, targetLocale)=>{
|
|
59
|
+
const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');
|
|
60
|
+
const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(strapi.getModel(targetUid));
|
|
61
|
+
if (!isTargetLocalized) {
|
|
62
|
+
return relations.map((rel)=>{
|
|
63
|
+
if (rel.id === undefined) return null;
|
|
64
|
+
return {
|
|
65
|
+
documentId: rel.documentId,
|
|
66
|
+
id: rel.id
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const documentIds = [
|
|
71
|
+
...new Set(relations.map((r)=>r.documentId))
|
|
72
|
+
];
|
|
73
|
+
const targetEntriesQuery = {
|
|
74
|
+
where: {
|
|
75
|
+
documentId: {
|
|
76
|
+
$in: documentIds
|
|
77
|
+
},
|
|
78
|
+
locale: targetLocale
|
|
79
|
+
},
|
|
80
|
+
select: [
|
|
81
|
+
...STATUS_FIELDS
|
|
82
|
+
]
|
|
83
|
+
};
|
|
84
|
+
const targetEntries = await strapi.db.query(targetUid).findMany(targetEntriesQuery);
|
|
85
|
+
const byDocumentId = new Map();
|
|
86
|
+
for (const e of targetEntries){
|
|
87
|
+
const existing = byDocumentId.get(e.documentId);
|
|
88
|
+
if (!existing || e.publishedAt === null && existing.publishedAt !== null) {
|
|
89
|
+
byDocumentId.set(e.documentId, e);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return relations.map((rel)=>{
|
|
93
|
+
const entry = byDocumentId.get(rel.documentId);
|
|
94
|
+
if (!entry) return null;
|
|
95
|
+
return {
|
|
96
|
+
documentId: entry.documentId,
|
|
97
|
+
id: entry.id,
|
|
98
|
+
locale: entry.locale
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Builds the where clause for relation queries: documentIds + locales (when target model is localized).
|
|
104
|
+
*/ const buildWhereForRelations = (relations, documentIds, targetUid)=>{
|
|
105
|
+
const where = {
|
|
106
|
+
documentId: {
|
|
107
|
+
$in: documentIds
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');
|
|
111
|
+
const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(strapi.getModel(targetUid));
|
|
112
|
+
if (isTargetLocalized) {
|
|
113
|
+
const locales = [
|
|
114
|
+
...new Set(relations.map((r)=>r.locale).filter(Boolean))
|
|
115
|
+
];
|
|
116
|
+
if (locales.length > 0) {
|
|
117
|
+
where.locale = {
|
|
118
|
+
$in: locales
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return where;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Walk the full document tree and collect all valid relation objects grouped by targetUid.
|
|
126
|
+
*/ const collectRelationsByUid = (data, schema, components)=>{
|
|
127
|
+
const result = new Map();
|
|
128
|
+
const addRels = (uid, rels)=>{
|
|
129
|
+
const existing = result.get(uid) ?? [];
|
|
130
|
+
result.set(uid, existing.concat(rels));
|
|
131
|
+
};
|
|
132
|
+
const collect = (d, s)=>{
|
|
133
|
+
if (!d || typeof d !== 'object') return;
|
|
134
|
+
for (const [key, value] of Object.entries(d)){
|
|
135
|
+
const attribute = s?.attributes?.[key];
|
|
136
|
+
if (!attribute) continue;
|
|
137
|
+
if (attribute.type === 'relation') {
|
|
138
|
+
const attr = attribute;
|
|
139
|
+
if (attr.relation?.toLowerCase().includes('morph') || !attr.target) continue;
|
|
140
|
+
const validRels = normalizeToArray(value).filter(isValidRelation);
|
|
141
|
+
if (validRels.length > 0) addRels(attr.target, validRels);
|
|
142
|
+
} else if (attribute.type === 'component') {
|
|
143
|
+
const compSchema = components[attribute.component] ?? {
|
|
144
|
+
attributes: {}
|
|
145
|
+
};
|
|
146
|
+
if (attribute.repeatable && isArray(value)) {
|
|
147
|
+
for (const item of value){
|
|
148
|
+
collect(item, compSchema);
|
|
149
|
+
}
|
|
150
|
+
} else if (value) {
|
|
151
|
+
collect(value, compSchema);
|
|
152
|
+
}
|
|
153
|
+
} else if (attribute.type === 'dynamiczone' && isArray(value)) {
|
|
154
|
+
for (const item of value){
|
|
155
|
+
const compUid = item?.__component;
|
|
156
|
+
const compSchema = components[compUid] ?? {
|
|
157
|
+
attributes: {}
|
|
158
|
+
};
|
|
159
|
+
collect(item, compSchema);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
collect(data, schema);
|
|
165
|
+
return result;
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Resolves all relation targets for the requested locale in batches (per related content-type UID):
|
|
169
|
+
* locale mapping, permissions, status, and labels.
|
|
170
|
+
*/ const resolveAllRelationsBatched = async (relationsByUid, targetLocale, userAbility)=>{
|
|
171
|
+
const result = new Map();
|
|
172
|
+
await Promise.all([
|
|
173
|
+
...relationsByUid.entries()
|
|
174
|
+
].map(async ([targetUid, allRels])=>{
|
|
175
|
+
const empty = {
|
|
176
|
+
blocked: !userAbility.can(READ_ACTION, targetUid),
|
|
177
|
+
mainField: '',
|
|
178
|
+
bySourceDocumentId: new Map(),
|
|
179
|
+
statusById: new Map(),
|
|
180
|
+
labelById: new Map()
|
|
181
|
+
};
|
|
182
|
+
if (empty.blocked) {
|
|
183
|
+
result.set(targetUid, empty);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const mainField = await getMainField(targetUid);
|
|
187
|
+
const validRels = allRels.filter(isValidRelation);
|
|
188
|
+
if (validRels.length === 0) {
|
|
189
|
+
result.set(targetUid, {
|
|
190
|
+
...empty,
|
|
191
|
+
mainField
|
|
192
|
+
});
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Deduplicate by documentId before querying
|
|
196
|
+
const uniqueRels = [
|
|
197
|
+
...new Map(validRels.map((r)=>[
|
|
198
|
+
r.documentId,
|
|
199
|
+
r
|
|
200
|
+
])).values()
|
|
201
|
+
];
|
|
202
|
+
const resolvedList = await resolveRelationsForLocaleBatch(uniqueRels, targetUid, targetLocale);
|
|
203
|
+
const bySourceDocumentId = new Map();
|
|
204
|
+
for(let i = 0; i < uniqueRels.length; i += 1){
|
|
205
|
+
bySourceDocumentId.set(uniqueRels[i].documentId, resolvedList[i]);
|
|
206
|
+
}
|
|
207
|
+
const resolvedEntries = resolvedList.filter((r)=>r !== null);
|
|
208
|
+
if (resolvedEntries.length === 0) {
|
|
209
|
+
result.set(targetUid, {
|
|
210
|
+
blocked: false,
|
|
211
|
+
mainField,
|
|
212
|
+
bySourceDocumentId,
|
|
213
|
+
statusById: new Map(),
|
|
214
|
+
labelById: new Map()
|
|
215
|
+
});
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const documentIds = [
|
|
219
|
+
...new Set(resolvedEntries.map((r)=>r.documentId))
|
|
220
|
+
];
|
|
221
|
+
const where = buildWhereForRelations(resolvedEntries, documentIds, targetUid);
|
|
222
|
+
const [allStatusEntries, labelEntries] = await Promise.all([
|
|
223
|
+
contentTypes.hasDraftAndPublish(strapi.getModel(targetUid)) ? strapi.db.query(targetUid).findMany({
|
|
224
|
+
where,
|
|
225
|
+
select: [
|
|
226
|
+
...STATUS_FIELDS
|
|
227
|
+
]
|
|
228
|
+
}) : Promise.resolve([]),
|
|
229
|
+
strapi.db.query(targetUid).findMany({
|
|
230
|
+
where,
|
|
231
|
+
select: [
|
|
232
|
+
'documentId',
|
|
233
|
+
'id',
|
|
234
|
+
'locale',
|
|
235
|
+
mainField
|
|
236
|
+
]
|
|
237
|
+
})
|
|
238
|
+
]);
|
|
239
|
+
// Build status map
|
|
240
|
+
const statusById = new Map();
|
|
241
|
+
if (allStatusEntries.length > 0) {
|
|
242
|
+
const documentMetadata = strapi.plugin('content-manager')?.service('document-metadata');
|
|
243
|
+
if (documentMetadata) {
|
|
244
|
+
const model = strapi.getModel(targetUid);
|
|
245
|
+
const isLocalized = strapi.plugin('i18n')?.service('content-types')?.isLocalizedContentType(model);
|
|
246
|
+
const groupKey = (e)=>isLocalized && e.locale ? `${e.documentId}:${e.locale}` : e.documentId;
|
|
247
|
+
const byGroup = new Map();
|
|
248
|
+
for (const e of allStatusEntries){
|
|
249
|
+
const key = groupKey(e);
|
|
250
|
+
const list = byGroup.get(key) ?? [];
|
|
251
|
+
list.push(e);
|
|
252
|
+
byGroup.set(key, list);
|
|
253
|
+
}
|
|
254
|
+
for (const entry of resolvedEntries){
|
|
255
|
+
const key = groupKey(entry);
|
|
256
|
+
const entries = byGroup.get(key) ?? [];
|
|
257
|
+
if (!entries.length) continue;
|
|
258
|
+
const version = entries.find((e)=>e.id === entry.id) ?? entries[0];
|
|
259
|
+
const otherVersions = entries.filter((e)=>e.id !== version.id);
|
|
260
|
+
statusById.set(entry.id, documentMetadata.getStatus(version, otherVersions));
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Build label map
|
|
265
|
+
const labelById = new Map();
|
|
266
|
+
for (const entry of labelEntries){
|
|
267
|
+
labelById.set(entry.id, entry[mainField]);
|
|
268
|
+
}
|
|
269
|
+
result.set(targetUid, {
|
|
270
|
+
blocked: false,
|
|
271
|
+
mainField,
|
|
272
|
+
bySourceDocumentId,
|
|
273
|
+
statusById,
|
|
274
|
+
labelById
|
|
275
|
+
});
|
|
276
|
+
}));
|
|
277
|
+
return result;
|
|
278
|
+
};
|
|
279
|
+
/**
|
|
280
|
+
* Build the { connect, disconnect } for a single relation attribute using pre-fetched data.
|
|
281
|
+
*/ const buildConnectFromPreResolved = (value, attribute, preResolved)=>{
|
|
282
|
+
const attr = attribute;
|
|
283
|
+
if (attr.relation?.toLowerCase().includes('morph') || !attr.target) {
|
|
284
|
+
return {
|
|
285
|
+
connect: [],
|
|
286
|
+
disconnect: []
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const uidData = preResolved.get(attr.target);
|
|
290
|
+
if (!uidData || uidData.blocked) {
|
|
291
|
+
return {
|
|
292
|
+
connect: [],
|
|
293
|
+
disconnect: []
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
const validRels = normalizeToArray(value).filter(isValidRelation);
|
|
297
|
+
if (validRels.length === 0) {
|
|
298
|
+
return {
|
|
299
|
+
connect: [],
|
|
300
|
+
disconnect: []
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
const connect = validRels.map((rel, index)=>{
|
|
304
|
+
const resolved = uidData.bySourceDocumentId.get(rel.documentId);
|
|
305
|
+
if (!resolved) return null;
|
|
306
|
+
const status = uidData.statusById.get(resolved.id);
|
|
307
|
+
const mainFieldValue = uidData.labelById.get(resolved.id);
|
|
308
|
+
const relationWithMainField = {
|
|
309
|
+
...resolved,
|
|
310
|
+
[uidData.mainField]: mainFieldValue
|
|
311
|
+
};
|
|
312
|
+
if (status !== undefined) {
|
|
313
|
+
relationWithMainField.status = status;
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
...relationWithMainField,
|
|
317
|
+
__temp_key__: `a${index}`,
|
|
318
|
+
label: getRelationLabel(relationWithMainField, uidData.mainField)
|
|
319
|
+
};
|
|
320
|
+
}).filter((r)=>r !== null);
|
|
321
|
+
return {
|
|
322
|
+
connect,
|
|
323
|
+
disconnect: []
|
|
324
|
+
};
|
|
325
|
+
};
|
|
326
|
+
/**
|
|
327
|
+
* Recursively process document data: remove internal fields and resolve relations using
|
|
328
|
+
* pre-fetched resolution data (no additional DB calls).
|
|
329
|
+
*/ const processDocumentData = async (data, schema, components, preResolved)=>{
|
|
330
|
+
if (!data) {
|
|
331
|
+
return {};
|
|
332
|
+
}
|
|
333
|
+
const result = {};
|
|
334
|
+
for (const [key, value] of Object.entries(data)){
|
|
335
|
+
if (FIELDS_TO_IGNORE.has(key)) {
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
const attribute = schema?.attributes?.[key];
|
|
339
|
+
if (!attribute) {
|
|
340
|
+
result[key] = value;
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
if (attribute.type === 'password') {
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (attribute.type === 'relation') {
|
|
347
|
+
result[key] = buildConnectFromPreResolved(value, attribute, preResolved);
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
if (attribute.type === 'component') {
|
|
351
|
+
const compSchema = components[attribute.component] || {
|
|
352
|
+
attributes: {}
|
|
353
|
+
};
|
|
354
|
+
if (attribute.repeatable && isArray(value)) {
|
|
355
|
+
result[key] = await Promise.all(value.map(async (item, index)=>{
|
|
356
|
+
const processed = await processDocumentData(item, compSchema, components, preResolved);
|
|
357
|
+
return {
|
|
358
|
+
...processed,
|
|
359
|
+
__temp_key__: index + 1
|
|
360
|
+
};
|
|
361
|
+
}));
|
|
362
|
+
} else if (value) {
|
|
363
|
+
const processed = await processDocumentData(value, compSchema, components, preResolved);
|
|
364
|
+
result[key] = processed;
|
|
365
|
+
} else {
|
|
366
|
+
result[key] = value;
|
|
367
|
+
}
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
if (attribute.type === 'dynamiczone' && isArray(value)) {
|
|
371
|
+
result[key] = await Promise.all(value.map(async (item, index)=>{
|
|
372
|
+
const compSchema = components[item?.__component] || {
|
|
373
|
+
attributes: {}
|
|
374
|
+
};
|
|
375
|
+
const processed = await processDocumentData(item, compSchema, components, preResolved);
|
|
376
|
+
return {
|
|
377
|
+
...processed,
|
|
378
|
+
__temp_key__: index + 1
|
|
379
|
+
};
|
|
380
|
+
}));
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
result[key] = value;
|
|
384
|
+
}
|
|
385
|
+
return result;
|
|
386
|
+
};
|
|
387
|
+
const createFillFromLocaleService = ({ strapi: strapi1 })=>{
|
|
388
|
+
return {
|
|
389
|
+
/**
|
|
390
|
+
* Fetch the raw populated document for the given locale without any transformation.
|
|
391
|
+
* The caller is responsible for sanitizing the output before passing it to transformDocument.
|
|
392
|
+
*/ async fetchRawDocument (model, sourceLocale, documentId) {
|
|
393
|
+
const populateBuilderService = strapi1.plugin('content-manager').service('populate-builder');
|
|
394
|
+
const modelDef = strapi1.getModel(model);
|
|
395
|
+
if (!modelDef) {
|
|
396
|
+
throw new Error(`Model ${model} not found`);
|
|
397
|
+
}
|
|
398
|
+
// Build populate WITHOUT countRelations so we get full relation objects
|
|
399
|
+
const populate = await populateBuilderService(model).populateDeep(Infinity).build();
|
|
400
|
+
const docs = strapi1.documents(model);
|
|
401
|
+
const baseParams = {
|
|
402
|
+
locale: sourceLocale,
|
|
403
|
+
populate: populate
|
|
404
|
+
};
|
|
405
|
+
return documentId ? docs.findOne({
|
|
406
|
+
...baseParams,
|
|
407
|
+
documentId
|
|
408
|
+
}) : docs.findFirst({
|
|
409
|
+
...baseParams
|
|
410
|
+
});
|
|
411
|
+
},
|
|
412
|
+
/**
|
|
413
|
+
* Transform a (sanitized) document: strip internal fields, resolve relations to the target
|
|
414
|
+
* locale, and skip relations to content types the user cannot read.
|
|
415
|
+
*/ async transformDocument (document, model, targetLocale, userAbility) {
|
|
416
|
+
const schema = strapi1.getModel(model);
|
|
417
|
+
const getComponentSchema = (uid)=>strapi1.getModel(uid) ?? {
|
|
418
|
+
attributes: {}
|
|
419
|
+
};
|
|
420
|
+
const components = new Proxy({}, {
|
|
421
|
+
get (_, uid) {
|
|
422
|
+
return getComponentSchema(uid);
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
const relsByUid = collectRelationsByUid(document, schema, components);
|
|
426
|
+
const preResolved = await resolveAllRelationsBatched(relsByUid, targetLocale, userAbility);
|
|
427
|
+
return processDocumentData(document, schema, components, preResolved);
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
export { createFillFromLocaleService };
|
|
433
|
+
//# sourceMappingURL=fill-from-locale.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill-from-locale.mjs","sources":["../../../server/src/services/fill-from-locale.ts"],"sourcesContent":["import { isArray } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { UID, Schema, Core } from '@strapi/types';\n\nconst READ_ACTION = 'plugin::content-manager.explorer.read';\n\n/**\n * Returns the main display field for a model (e.g. title, name).\n * Uses content-manager configuration when available, falls back to first string attribute or 'id'.\n */\nconst getMainField = async (targetUid: UID.Schema): Promise<string> => {\n const contentManagerContentTypeService = strapi\n .plugin('content-manager')\n .service('content-types');\n const configuration = await contentManagerContentTypeService.findConfiguration({\n uid: targetUid,\n });\n return configuration.settings.mainField;\n};\n\n/**\n * Returns the display label for a relation.\n * Matches the logic of the getRelationLabel function in the content-manager plugin.\n */\nconst getRelationLabel = (relation: Record<string, unknown>, mainField: string): string => {\n const label = relation[mainField];\n if (typeof label === 'string') return label;\n return String(relation.documentId ?? '');\n};\n\nconst FIELDS_TO_IGNORE = new Set([\n 'createdAt',\n 'createdBy',\n 'updatedAt',\n 'updatedBy',\n 'id',\n 'documentId',\n 'publishedAt',\n 'strapi_stage',\n 'strapi_assignee',\n 'locale',\n 'status',\n 'localizations',\n]);\n\nconst STATUS_FIELDS = new Set(['id', 'documentId', 'locale', 'updatedAt', 'publishedAt']);\n\n/**\n * Normalizes a value to an array: arrays pass through, single values become [value], null/undefined become [].\n */\nconst normalizeToArray = (value: unknown): unknown[] => {\n if (isArray(value)) return value;\n if (value) return [value];\n return [];\n};\n\n/**\n * Type guard: returns true if the value is a valid relation object with documentId.\n */\nconst isValidRelation = (\n rel: unknown\n): rel is { documentId: string; id?: number; locale?: string } =>\n typeof rel === 'object' && rel !== null && 'documentId' in rel && !!(rel as any).documentId;\n\n/**\n * Maps relations from the source locale to target locale (batched for better performance).\n */\nconst resolveRelationsForLocaleBatch = async (\n relations: Array<{ documentId: string; id?: number; locale?: string }>,\n targetUid: UID.Schema,\n targetLocale: string\n): Promise<Array<{ documentId: string; id: number | string; locale?: string } | null>> => {\n const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');\n const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(\n strapi.getModel(targetUid)\n );\n\n if (!isTargetLocalized) {\n return relations.map((rel) => {\n if (rel.id === undefined) return null;\n return { documentId: rel.documentId, id: rel.id };\n });\n }\n\n const documentIds = [...new Set(relations.map((r) => r.documentId))];\n const targetEntriesQuery = {\n where: { documentId: { $in: documentIds }, locale: targetLocale },\n select: [...STATUS_FIELDS],\n };\n const targetEntries = await strapi.db.query(targetUid).findMany(targetEntriesQuery);\n const byDocumentId = new Map<string, (typeof targetEntries)[0]>();\n for (const e of targetEntries) {\n const existing = byDocumentId.get(e.documentId);\n if (!existing || (e.publishedAt === null && existing.publishedAt !== null)) {\n byDocumentId.set(e.documentId, e);\n }\n }\n\n return relations.map((rel) => {\n const entry = byDocumentId.get(rel.documentId);\n if (!entry) return null;\n return {\n documentId: entry.documentId,\n id: entry.id,\n locale: entry.locale,\n };\n });\n};\n\n/**\n * Builds the where clause for relation queries: documentIds + locales (when target model is localized).\n */\nconst buildWhereForRelations = (\n relations: Array<{ documentId: string; locale?: string }>,\n documentIds: string[],\n targetUid: UID.Schema\n): { documentId: { $in: string[] }; locale?: { $in: string[] } } => {\n const where: { documentId: { $in: string[] }; locale?: { $in: string[] } } = {\n documentId: { $in: documentIds },\n };\n const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');\n const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(\n strapi.getModel(targetUid)\n );\n if (isTargetLocalized) {\n const locales = [...new Set(relations.map((r) => r.locale).filter(Boolean))] as string[];\n if (locales.length > 0) {\n where.locale = { $in: locales };\n }\n }\n return where;\n};\n\n// ---------------------------------------------------------------------------\n// Batch pre-resolution\n// ---------------------------------------------------------------------------\n\ntype ValidRelation = { documentId: string; id?: number; locale?: string };\ntype ResolvedRelation = { documentId: string; id: number | string; locale?: string };\ntype RelationsByUid = Map<string, ValidRelation[]>;\n\ninterface UidResolutionData {\n blocked: boolean;\n mainField: string;\n /** sourceDocumentId → resolved entry in targetLocale (null if not found) */\n bySourceDocumentId: Map<string, ResolvedRelation | null>;\n /** resolvedEntry.id → status string */\n statusById: Map<number | string, string | undefined>;\n /** resolvedEntry.id → mainField value */\n labelById: Map<number | string, unknown>;\n}\n\n/**\n * Walk the full document tree and collect all valid relation objects grouped by targetUid.\n */\nconst collectRelationsByUid = (\n data: Record<string, unknown>,\n schema: Schema.ContentType | Schema.Component,\n components: Record<string, Schema.Component>\n): RelationsByUid => {\n const result: RelationsByUid = new Map();\n\n const addRels = (uid: string, rels: ValidRelation[]) => {\n const existing = result.get(uid) ?? [];\n result.set(uid, existing.concat(rels));\n };\n\n const collect = (d: Record<string, unknown>, s: Schema.ContentType | Schema.Component) => {\n if (!d || typeof d !== 'object') return;\n for (const [key, value] of Object.entries(d)) {\n const attribute = s?.attributes?.[key];\n if (!attribute) continue;\n\n if (attribute.type === 'relation') {\n const attr = attribute as Schema.Attribute.Relation & {\n relation?: string;\n target?: string;\n };\n if (attr.relation?.toLowerCase().includes('morph') || !attr.target) continue;\n const validRels = normalizeToArray(value).filter(isValidRelation);\n if (validRels.length > 0) addRels(attr.target, validRels);\n } else if (attribute.type === 'component') {\n const compSchema = (components[attribute.component] ?? {\n attributes: {},\n }) as Schema.Component;\n if (attribute.repeatable && isArray(value)) {\n for (const item of value as Record<string, unknown>[]) {\n collect(item, compSchema);\n }\n } else if (value) {\n collect(value as Record<string, unknown>, compSchema);\n }\n } else if (attribute.type === 'dynamiczone' && isArray(value)) {\n for (const item of value as Record<string, unknown>[]) {\n const compUid = (item as any)?.__component as string;\n const compSchema = (components[compUid] ?? { attributes: {} }) as Schema.Component;\n collect(item as Record<string, unknown>, compSchema);\n }\n }\n }\n };\n\n collect(data, schema);\n return result;\n};\n\n/**\n * Resolves all relation targets for the requested locale in batches (per related content-type UID):\n * locale mapping, permissions, status, and labels.\n */\nconst resolveAllRelationsBatched = async (\n relationsByUid: RelationsByUid,\n targetLocale: string,\n userAbility: any\n): Promise<Map<string, UidResolutionData>> => {\n const result = new Map<string, UidResolutionData>();\n await Promise.all(\n [...relationsByUid.entries()].map(async ([targetUid, allRels]) => {\n const empty: UidResolutionData = {\n blocked: !userAbility.can(READ_ACTION, targetUid),\n mainField: '',\n bySourceDocumentId: new Map(),\n statusById: new Map(),\n labelById: new Map(),\n };\n\n if (empty.blocked) {\n result.set(targetUid, empty);\n return;\n }\n\n const mainField = await getMainField(targetUid as UID.Schema);\n const validRels = allRels.filter(isValidRelation);\n\n if (validRels.length === 0) {\n result.set(targetUid, { ...empty, mainField });\n return;\n }\n\n // Deduplicate by documentId before querying\n const uniqueRels = [...new Map(validRels.map((r) => [r.documentId, r])).values()];\n const resolvedList = await resolveRelationsForLocaleBatch(\n uniqueRels,\n targetUid as UID.Schema,\n targetLocale\n );\n\n const bySourceDocumentId = new Map<string, ResolvedRelation | null>();\n for (let i = 0; i < uniqueRels.length; i += 1) {\n bySourceDocumentId.set(uniqueRels[i].documentId, resolvedList[i]);\n }\n\n const resolvedEntries = resolvedList.filter((r): r is ResolvedRelation => r !== null);\n\n if (resolvedEntries.length === 0) {\n result.set(targetUid, {\n blocked: false,\n mainField,\n bySourceDocumentId,\n statusById: new Map(),\n labelById: new Map(),\n });\n return;\n }\n\n const documentIds = [...new Set(resolvedEntries.map((r) => r.documentId))];\n const where = buildWhereForRelations(resolvedEntries, documentIds, targetUid as UID.Schema);\n\n const [allStatusEntries, labelEntries] = await Promise.all([\n contentTypes.hasDraftAndPublish(strapi.getModel(targetUid as UID.Schema))\n ? strapi.db.query(targetUid).findMany({ where, select: [...STATUS_FIELDS] })\n : Promise.resolve([]),\n strapi.db.query(targetUid).findMany({\n where,\n select: ['documentId', 'id', 'locale', mainField],\n }),\n ]);\n\n // Build status map\n const statusById = new Map<number | string, string | undefined>();\n if (allStatusEntries.length > 0) {\n const documentMetadata = strapi.plugin('content-manager')?.service('document-metadata');\n if (documentMetadata) {\n const model = strapi.getModel(targetUid as UID.Schema);\n const isLocalized = strapi\n .plugin('i18n')\n ?.service('content-types')\n ?.isLocalizedContentType(model);\n const groupKey = (e: { documentId: string; locale?: string }) =>\n isLocalized && e.locale ? `${e.documentId}:${e.locale}` : e.documentId;\n\n const byGroup = new Map<string, typeof allStatusEntries>();\n for (const e of allStatusEntries) {\n const key = groupKey(e);\n const list = byGroup.get(key) ?? [];\n list.push(e);\n byGroup.set(key, list);\n }\n\n for (const entry of resolvedEntries) {\n const key = groupKey(entry);\n const entries = byGroup.get(key) ?? [];\n if (!entries.length) continue;\n const version = entries.find((e) => e.id === entry.id) ?? entries[0];\n const otherVersions = entries.filter((e) => e.id !== version.id);\n statusById.set(entry.id, documentMetadata.getStatus(version, otherVersions));\n }\n }\n }\n\n // Build label map\n const labelById = new Map<number | string, unknown>();\n for (const entry of labelEntries) {\n labelById.set(entry.id, entry[mainField]);\n }\n\n result.set(targetUid, {\n blocked: false,\n mainField,\n bySourceDocumentId,\n statusById,\n labelById,\n });\n })\n );\n\n return result;\n};\n\n/**\n * Build the { connect, disconnect } for a single relation attribute using pre-fetched data.\n */\nconst buildConnectFromPreResolved = (\n value: unknown,\n attribute: Schema.Attribute.Relation,\n preResolved: Map<string, UidResolutionData>\n): { connect: unknown[]; disconnect: unknown[] } => {\n const attr = attribute as Schema.Attribute.Relation & { relation?: string; target?: string };\n if (attr.relation?.toLowerCase().includes('morph') || !attr.target) {\n return { connect: [], disconnect: [] };\n }\n\n const uidData = preResolved.get(attr.target);\n if (!uidData || uidData.blocked) {\n return { connect: [], disconnect: [] };\n }\n\n const validRels = normalizeToArray(value).filter(isValidRelation);\n if (validRels.length === 0) {\n return { connect: [], disconnect: [] };\n }\n\n const connect = validRels\n .map((rel, index) => {\n const resolved = uidData.bySourceDocumentId.get(rel.documentId);\n if (!resolved) return null;\n\n const status = uidData.statusById.get(resolved.id);\n const mainFieldValue = uidData.labelById.get(resolved.id);\n const relationWithMainField: Record<string, unknown> = {\n ...resolved,\n [uidData.mainField]: mainFieldValue,\n };\n if (status !== undefined) {\n relationWithMainField.status = status;\n }\n\n return {\n ...relationWithMainField,\n __temp_key__: `a${index}`,\n label: getRelationLabel(relationWithMainField, uidData.mainField),\n };\n })\n .filter((r): r is NonNullable<typeof r> => r !== null);\n\n return { connect, disconnect: [] };\n};\n\n/**\n * Recursively process document data: remove internal fields and resolve relations using\n * pre-fetched resolution data (no additional DB calls).\n */\nconst processDocumentData = async (\n data: Record<string, unknown>,\n schema: Schema.ContentType | Schema.Component,\n components: Record<string, Schema.Component>,\n preResolved: Map<string, UidResolutionData>\n): Promise<Record<string, unknown>> => {\n if (!data) {\n return {};\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (FIELDS_TO_IGNORE.has(key)) {\n continue;\n }\n\n const attribute = schema?.attributes?.[key];\n if (!attribute) {\n result[key] = value;\n continue;\n }\n\n if (attribute.type === 'password') {\n continue;\n }\n\n if (attribute.type === 'relation') {\n result[key] = buildConnectFromPreResolved(\n value,\n attribute as Schema.Attribute.Relation,\n preResolved\n );\n continue;\n }\n\n if (attribute.type === 'component') {\n const compSchema = (components[attribute.component] || {\n attributes: {},\n }) as Schema.Component;\n if (attribute.repeatable && isArray(value)) {\n result[key] = await Promise.all(\n value.map(async (item: Record<string, unknown>, index: number) => {\n const processed = await processDocumentData(item, compSchema, components, preResolved);\n return { ...processed, __temp_key__: index + 1 };\n })\n );\n } else if (value) {\n const processed = await processDocumentData(\n value as Record<string, unknown>,\n compSchema,\n components,\n preResolved\n );\n result[key] = processed;\n } else {\n result[key] = value;\n }\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n result[key] = await Promise.all(\n value.map(async (item: Record<string, unknown>, index: number) => {\n const compSchema = (components[item?.__component as string] || {\n attributes: {},\n }) as Schema.Component;\n const processed = await processDocumentData(item, compSchema, components, preResolved);\n return { ...processed, __temp_key__: index + 1 };\n })\n );\n continue;\n }\n\n result[key] = value;\n }\n\n return result;\n};\n\nexport const createFillFromLocaleService = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n /**\n * Fetch the raw populated document for the given locale without any transformation.\n * The caller is responsible for sanitizing the output before passing it to transformDocument.\n */\n async fetchRawDocument(model: UID.ContentType, sourceLocale: string, documentId?: string) {\n const populateBuilderService = strapi\n .plugin('content-manager')\n .service('populate-builder') as (uid: UID.ContentType) => {\n populateDeep: (level: number) => { build: () => Promise<unknown> };\n };\n const modelDef = strapi.getModel(model);\n\n if (!modelDef) {\n throw new Error(`Model ${model} not found`);\n }\n\n // Build populate WITHOUT countRelations so we get full relation objects\n const populate = await populateBuilderService(model).populateDeep(Infinity).build();\n\n const docs = strapi.documents(model);\n const baseParams = {\n locale: sourceLocale,\n populate: populate as never,\n };\n\n return documentId\n ? docs.findOne({ ...baseParams, documentId })\n : docs.findFirst({ ...baseParams });\n },\n\n /**\n * Transform a (sanitized) document: strip internal fields, resolve relations to the target\n * locale, and skip relations to content types the user cannot read.\n */\n async transformDocument(\n document: Record<string, unknown>,\n model: UID.ContentType,\n targetLocale: string,\n userAbility: any\n ) {\n const schema = strapi.getModel(model) as Schema.ContentType;\n const getComponentSchema = (uid: string) =>\n (strapi.getModel(uid as UID.Schema) ?? { attributes: {} }) as Schema.Component;\n const components = new Proxy({} as Record<string, Schema.Component>, {\n get(_, uid: string) {\n return getComponentSchema(uid);\n },\n });\n\n const relsByUid = collectRelationsByUid(document, schema, components);\n const preResolved = await resolveAllRelationsBatched(relsByUid, targetLocale, userAbility);\n return processDocumentData(document, schema, components, preResolved);\n },\n };\n};\n"],"names":["READ_ACTION","getMainField","targetUid","contentManagerContentTypeService","strapi","plugin","service","configuration","findConfiguration","uid","settings","mainField","getRelationLabel","relation","label","String","documentId","FIELDS_TO_IGNORE","Set","STATUS_FIELDS","normalizeToArray","value","isArray","isValidRelation","rel","resolveRelationsForLocaleBatch","relations","targetLocale","i18nContentTypesService","isTargetLocalized","isLocalizedContentType","getModel","map","id","undefined","documentIds","r","targetEntriesQuery","where","$in","locale","select","targetEntries","db","query","findMany","byDocumentId","Map","e","existing","get","publishedAt","set","entry","buildWhereForRelations","locales","filter","Boolean","length","collectRelationsByUid","data","schema","components","result","addRels","rels","concat","collect","d","s","key","Object","entries","attribute","attributes","type","attr","toLowerCase","includes","target","validRels","compSchema","component","repeatable","item","compUid","__component","resolveAllRelationsBatched","relationsByUid","userAbility","Promise","all","allRels","empty","blocked","can","bySourceDocumentId","statusById","labelById","uniqueRels","values","resolvedList","i","resolvedEntries","allStatusEntries","labelEntries","contentTypes","hasDraftAndPublish","resolve","documentMetadata","model","isLocalized","groupKey","byGroup","list","push","version","find","otherVersions","getStatus","buildConnectFromPreResolved","preResolved","connect","disconnect","uidData","index","resolved","status","mainFieldValue","relationWithMainField","__temp_key__","processDocumentData","has","processed","createFillFromLocaleService","fetchRawDocument","sourceLocale","populateBuilderService","modelDef","Error","populate","populateDeep","Infinity","build","docs","documents","baseParams","findOne","findFirst","transformDocument","document","getComponentSchema","Proxy","_","relsByUid"],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ var index = require('./sanitize/index.js');
|
|
|
10
10
|
var settings = require('./settings.js');
|
|
11
11
|
var aiLocalizations = require('./ai-localizations.js');
|
|
12
12
|
var aiLocalizationJobs = require('./ai-localization-jobs.js');
|
|
13
|
+
var fillFromLocale = require('./fill-from-locale.js');
|
|
13
14
|
|
|
14
15
|
var services = {
|
|
15
16
|
permissions,
|
|
@@ -21,7 +22,8 @@ var services = {
|
|
|
21
22
|
'content-types': contentTypes,
|
|
22
23
|
'ai-localizations': aiLocalizations.createAILocalizationsService,
|
|
23
24
|
'ai-localization-jobs': aiLocalizationJobs.createAILocalizationJobsService,
|
|
24
|
-
settings: settings.createSettingsService
|
|
25
|
+
settings: settings.createSettingsService,
|
|
26
|
+
'fill-from-locale': fillFromLocale.createFillFromLocaleService
|
|
25
27
|
};
|
|
26
28
|
|
|
27
29
|
module.exports = services;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import permissions from './permissions';\nimport metrics from './metrics';\nimport localizations from './localizations';\nimport locales from './locales';\nimport isoLocales from './iso-locales';\nimport contentTypes from './content-types';\nimport sanitize from './sanitize';\nimport { createSettingsService } from './settings';\nimport { createAILocalizationsService } from './ai-localizations';\nimport { createAILocalizationJobsService } from './ai-localization-jobs';\n\nexport default {\n permissions,\n metrics,\n localizations,\n locales,\n sanitize,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n 'ai-localizations': createAILocalizationsService,\n 'ai-localization-jobs': createAILocalizationJobsService,\n settings: createSettingsService,\n};\n"],"names":["permissions","metrics","localizations","locales","sanitize","isoLocales","contentTypes","createAILocalizationsService","createAILocalizationJobsService","settings","createSettingsService"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import permissions from './permissions';\nimport metrics from './metrics';\nimport localizations from './localizations';\nimport locales from './locales';\nimport isoLocales from './iso-locales';\nimport contentTypes from './content-types';\nimport sanitize from './sanitize';\nimport { createSettingsService } from './settings';\nimport { createAILocalizationsService } from './ai-localizations';\nimport { createAILocalizationJobsService } from './ai-localization-jobs';\nimport { createFillFromLocaleService } from './fill-from-locale';\n\nexport default {\n permissions,\n metrics,\n localizations,\n locales,\n sanitize,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n 'ai-localizations': createAILocalizationsService,\n 'ai-localization-jobs': createAILocalizationJobsService,\n settings: createSettingsService,\n 'fill-from-locale': createFillFromLocaleService,\n};\n"],"names":["permissions","metrics","localizations","locales","sanitize","isoLocales","contentTypes","createAILocalizationsService","createAILocalizationJobsService","settings","createSettingsService","createFillFromLocaleService"],"mappings":";;;;;;;;;;;;;;AAYA,eAAe;AACbA,IAAAA,WAAAA;AACAC,IAAAA,OAAAA;AACAC,IAAAA,aAAAA;AACAC,IAAAA,OAAAA;AACAC,cAAAA,KAAAA;IACA,aAAA,EAAeC,UAAAA;IACf,eAAA,EAAiBC,YAAAA;IACjB,kBAAA,EAAoBC,4CAAAA;IACpB,sBAAA,EAAwBC,kDAAAA;IACxBC,QAAAA,EAAUC,8BAAAA;IACV,kBAAA,EAAoBC;AACtB,CAAA;;;;"}
|
|
@@ -8,6 +8,7 @@ import sanitize from './sanitize/index.mjs';
|
|
|
8
8
|
import { createSettingsService } from './settings.mjs';
|
|
9
9
|
import { createAILocalizationsService } from './ai-localizations.mjs';
|
|
10
10
|
import { createAILocalizationJobsService } from './ai-localization-jobs.mjs';
|
|
11
|
+
import { createFillFromLocaleService } from './fill-from-locale.mjs';
|
|
11
12
|
|
|
12
13
|
var services = {
|
|
13
14
|
permissions,
|
|
@@ -19,7 +20,8 @@ var services = {
|
|
|
19
20
|
'content-types': contentTypes,
|
|
20
21
|
'ai-localizations': createAILocalizationsService,
|
|
21
22
|
'ai-localization-jobs': createAILocalizationJobsService,
|
|
22
|
-
settings: createSettingsService
|
|
23
|
+
settings: createSettingsService,
|
|
24
|
+
'fill-from-locale': createFillFromLocaleService
|
|
23
25
|
};
|
|
24
26
|
|
|
25
27
|
export { services as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import permissions from './permissions';\nimport metrics from './metrics';\nimport localizations from './localizations';\nimport locales from './locales';\nimport isoLocales from './iso-locales';\nimport contentTypes from './content-types';\nimport sanitize from './sanitize';\nimport { createSettingsService } from './settings';\nimport { createAILocalizationsService } from './ai-localizations';\nimport { createAILocalizationJobsService } from './ai-localization-jobs';\n\nexport default {\n permissions,\n metrics,\n localizations,\n locales,\n sanitize,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n 'ai-localizations': createAILocalizationsService,\n 'ai-localization-jobs': createAILocalizationJobsService,\n settings: createSettingsService,\n};\n"],"names":["permissions","metrics","localizations","locales","sanitize","isoLocales","contentTypes","createAILocalizationsService","createAILocalizationJobsService","settings","createSettingsService"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../server/src/services/index.ts"],"sourcesContent":["import permissions from './permissions';\nimport metrics from './metrics';\nimport localizations from './localizations';\nimport locales from './locales';\nimport isoLocales from './iso-locales';\nimport contentTypes from './content-types';\nimport sanitize from './sanitize';\nimport { createSettingsService } from './settings';\nimport { createAILocalizationsService } from './ai-localizations';\nimport { createAILocalizationJobsService } from './ai-localization-jobs';\nimport { createFillFromLocaleService } from './fill-from-locale';\n\nexport default {\n permissions,\n metrics,\n localizations,\n locales,\n sanitize,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n 'ai-localizations': createAILocalizationsService,\n 'ai-localization-jobs': createAILocalizationJobsService,\n settings: createSettingsService,\n 'fill-from-locale': createFillFromLocaleService,\n};\n"],"names":["permissions","metrics","localizations","locales","sanitize","isoLocales","contentTypes","createAILocalizationsService","createAILocalizationJobsService","settings","createSettingsService","createFillFromLocaleService"],"mappings":";;;;;;;;;;;;AAYA,eAAe;AACbA,IAAAA,WAAAA;AACAC,IAAAA,OAAAA;AACAC,IAAAA,aAAAA;AACAC,IAAAA,OAAAA;AACAC,IAAAA,QAAAA;IACA,aAAA,EAAeC,iBAAAA;IACf,eAAA,EAAiBC,YAAAA;IACjB,kBAAA,EAAoBC,4BAAAA;IACpB,sBAAA,EAAwBC,+BAAAA;IACxBC,QAAAA,EAAUC,qBAAAA;IACV,kBAAA,EAAoBC;AACtB,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":";AAiFA,
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":";AAiFA,wBA4BE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-localization-jobs.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/ai-localization-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,QAAA,MAAM,kCAAkC,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;IAK3E;;;OAGG;6BAC4B,GAAG;
|
|
1
|
+
{"version":3,"file":"ai-localization-jobs.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/ai-localization-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,QAAA,MAAM,kCAAkC,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;IAK3E;;;OAGG;6BAC4B,GAAG;IAuBlC;;;OAGG;iCACgC,GAAG;CAwBzC,CAAC;AAEF,eAAe,kCAAkC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="koa" />
|
|
2
2
|
declare const controller: {
|
|
3
3
|
getNonLocalizedAttributes(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
|
|
4
|
+
getFillFromLocaleData(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
|
|
4
5
|
};
|
|
5
6
|
export default controller;
|
|
6
7
|
//# sourceMappingURL=content-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/content-types.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/content-types.ts"],"names":[],"mappings":";AAmBA,QAAA,MAAM,UAAU;;;CAyIW,CAAC;AAE5B,eAAe,UAAU,CAAC"}
|
|
@@ -4,6 +4,7 @@ declare const _default: {
|
|
|
4
4
|
'iso-locales': import("@strapi/types/dist/core").Controller;
|
|
5
5
|
'content-types': {
|
|
6
6
|
getNonLocalizedAttributes(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
|
|
7
|
+
getFillFromLocaleData(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
|
|
7
8
|
};
|
|
8
9
|
settings: {
|
|
9
10
|
updateSettings(ctx: import("koa").Context): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAMA,wBAME"}
|
|
@@ -32,6 +32,7 @@ declare const _default: () => {
|
|
|
32
32
|
'iso-locales': import("@strapi/types/dist/core").Controller;
|
|
33
33
|
'content-types': {
|
|
34
34
|
getNonLocalizedAttributes(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
|
|
35
|
+
getFillFromLocaleData(ctx: import("koa").Context): Promise<import("koa").Context | undefined>;
|
|
35
36
|
};
|
|
36
37
|
settings: {
|
|
37
38
|
updateSettings(ctx: import("koa").Context): Promise<void>;
|
|
@@ -189,6 +190,12 @@ declare const _default: () => {
|
|
|
189
190
|
aiLocalizations: import("yup").BooleanSchema<boolean, Record<string, any>, boolean>;
|
|
190
191
|
}>) => Promise<void>;
|
|
191
192
|
};
|
|
193
|
+
'fill-from-locale': ({ strapi }: {
|
|
194
|
+
strapi: import("@strapi/types/dist/core").Strapi;
|
|
195
|
+
}) => {
|
|
196
|
+
fetchRawDocument(model: import("@strapi/types/dist/uid").ContentType, sourceLocale: string, documentId?: string | undefined): Promise<import("@strapi/types/dist/modules/documents").AnyDocument | null>;
|
|
197
|
+
transformDocument(document: Record<string, unknown>, model: import("@strapi/types/dist/uid").ContentType, targetLocale: string, userAbility: any): Promise<Record<string, unknown>>;
|
|
198
|
+
};
|
|
192
199
|
};
|
|
193
200
|
};
|
|
194
201
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,wBAOG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wBA0HE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-localizations.d.ts","sourceRoot":"","sources":["../../../../server/src/services/ai-localizations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAiEhE;;;;;;GAMG;AACH,QAAA,MAAM,sBAAsB,eACd,OAAO,MAAM,EAAE,GAAG,CAAC,aACpB,OAAO,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,UAC7B,OAAO,MAAM,YACX,CAAC,GAAG,EAAE,IAAI,MAAM,KAAK,OAAO,MAAM,GAAG,SAAS,KACvD,QAAQ,OAAO,MAAM,EAAE,GAAG,CAAC,CA4D7B,CAAC;AAEF,QAAA,MAAM,4BAA4B,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;;
|
|
1
|
+
{"version":3,"file":"ai-localizations.d.ts","sourceRoot":"","sources":["../../../../server/src/services/ai-localizations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAiEhE;;;;;;GAMG;AACH,QAAA,MAAM,sBAAsB,eACd,OAAO,MAAM,EAAE,GAAG,CAAC,aACpB,OAAO,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,UAC7B,OAAO,MAAM,YACX,CAAC,GAAG,EAAE,IAAI,MAAM,KAAK,OAAO,MAAM,GAAG,SAAS,KACvD,QAAQ,OAAO,MAAM,EAAE,GAAG,CAAC,CA4D7B,CAAC;AAEF,QAAA,MAAM,4BAA4B,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;;IAgBrE;;;;OAIG;wDAIA;QACD,KAAK,EAAE,IAAI,WAAW,CAAC;QACvB,QAAQ,EAAE,QAAQ,SAAS,CAAC,WAAW,CAAC;KACzC;;CAyQJ,CAAC;AAEF,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,CAAC"}
|