@roxxel/payload-multilang 0.0.4 → 0.0.6

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 (43) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +50 -14
  3. package/dist/components/LanguageListToolbar.js +4 -3
  4. package/dist/components/LanguageListToolbar.js.map +1 -1
  5. package/dist/components/LanguageMetabox.js +18 -17
  6. package/dist/components/LanguageMetabox.js.map +1 -1
  7. package/dist/components/TranslationActionsClient.js +16 -14
  8. package/dist/components/TranslationActionsClient.js.map +1 -1
  9. package/dist/components/TranslationColumnCell.js +4 -1
  10. package/dist/components/TranslationColumnCell.js.map +1 -1
  11. package/dist/components/TranslationColumnCellClient.js +16 -7
  12. package/dist/components/TranslationColumnCellClient.js.map +1 -1
  13. package/dist/components/TranslationsTab.js +9 -8
  14. package/dist/components/TranslationsTab.js.map +1 -1
  15. package/dist/constants.d.ts +4 -1
  16. package/dist/constants.js +4 -1
  17. package/dist/constants.js.map +1 -1
  18. package/dist/endpoints/translations.js +4 -6
  19. package/dist/endpoints/translations.js.map +1 -1
  20. package/dist/hooks/translatedCollection.d.ts +2 -1
  21. package/dist/hooks/translatedCollection.js +122 -15
  22. package/dist/hooks/translatedCollection.js.map +1 -1
  23. package/dist/hooks/translatedGlobal.js +5 -1
  24. package/dist/hooks/translatedGlobal.js.map +1 -1
  25. package/dist/index.d.ts +4 -1
  26. package/dist/index.js +27 -3
  27. package/dist/index.js.map +1 -1
  28. package/dist/lib/config.js +2 -10
  29. package/dist/lib/config.js.map +1 -1
  30. package/dist/lib/data.d.ts +72 -35
  31. package/dist/lib/data.js +118 -60
  32. package/dist/lib/data.js.map +1 -1
  33. package/dist/translations.d.ts +72 -0
  34. package/dist/translations.js +72 -0
  35. package/dist/translations.js.map +1 -0
  36. package/dist/types.d.ts +0 -19
  37. package/dist/types.js.map +1 -1
  38. package/docs/configuration.md +75 -10
  39. package/docs/helpers.md +95 -121
  40. package/docs/usage.md +115 -120
  41. package/package.json +1 -1
  42. package/dist/payload-config.d.js +0 -2
  43. package/dist/payload-config.d.js.map +0 -1
@@ -11,18 +11,17 @@ type ConfigWithMultilang = Pick<Config, 'admin'> | Pick<Payload['config'], 'admi
11
11
  export declare const getLanguagesFromCustom: (custom: unknown) => MultilangLanguage[];
12
12
  /**
13
13
  * Returns the languages configured for payload-multilang.
14
- *
15
- * Pass `languages` or a Payload `config` object when you already have them. Otherwise the helper
16
- * resolves the cached Payload config from `@payload-config`.
17
14
  */
18
- export declare const getLanguages: ({ config, languages, }?: {
15
+ export declare const getLanguages: ({ config, languages, payload, }?: {
19
16
  config?: ConfigWithMultilang;
20
17
  languages?: MultilangLanguage[];
21
- }) => Promise<MultilangLanguage[]>;
22
- export declare const getDefaultLanguage: ({ config, languages, }: {
18
+ payload?: Payload;
19
+ }) => MultilangLanguage[];
20
+ export declare const getDefaultLanguage: ({ config, languages, payload, }: {
23
21
  config?: ConfigWithMultilang;
24
22
  languages?: MultilangLanguage[];
25
- }) => Promise<MultilangLanguage | undefined>;
23
+ payload?: Payload;
24
+ }) => MultilangLanguage | undefined;
26
25
  /**
27
26
  * Adds a language constraint to a Payload `where` query.
28
27
  *
@@ -30,6 +29,36 @@ export declare const getDefaultLanguage: ({ config, languages, }: {
30
29
  * payload-multilang language.
31
30
  */
32
31
  export declare const withLanguage: ({ fieldName, language, where, }: WithLanguageArgs) => Where;
32
+ export type MultilangDocumentLanguageArgs = {
33
+ data?: unknown;
34
+ doc?: unknown;
35
+ fallback?: string;
36
+ fieldName?: string;
37
+ };
38
+ /**
39
+ * Resolves a document's payload-multilang language from draft/form data first, then persisted doc data.
40
+ *
41
+ * Useful in Payload admin preview and livePreview URL builders where unsaved form data may already
42
+ * contain the selected language.
43
+ */
44
+ export declare const getMultilangDocumentLanguage: ({ data, doc, fallback, fieldName, }: MultilangDocumentLanguageArgs) => string | undefined;
45
+ export type LocalizedSlugQueryStatus = 'any' | 'draft' | 'published';
46
+ export type LocalizedSlugQueryArgs = {
47
+ fieldName?: string;
48
+ language: string;
49
+ slug: string;
50
+ slugFieldName?: string;
51
+ status?: LocalizedSlugQueryStatus;
52
+ where?: Where;
53
+ };
54
+ export type LocalizedSlugQuery = {
55
+ draft?: boolean;
56
+ where: Where;
57
+ };
58
+ /**
59
+ * Builds the common Payload Local API query for per-language documents addressed by slug.
60
+ */
61
+ export declare const localizedSlugQuery: ({ slug, fieldName, language, slugFieldName, status, where, }: LocalizedSlugQueryArgs) => LocalizedSlugQuery;
33
62
  export declare const getDocumentTranslationsWithPayload: <TDoc extends DocumentData = DocumentData>({ id, collection, fieldNames, overrideAccess, payload, req, }: {
34
63
  collection: CollectionSlug;
35
64
  fieldNames?: MultilangFieldNames;
@@ -48,26 +77,15 @@ export declare const getGroupTranslationsWithPayload: <TDoc extends DocumentData
48
77
  }) => Promise<TranslationState<TDoc>>;
49
78
  /**
50
79
  * Returns the source document and every document in the same translation group, keyed by language.
51
- *
52
- * The helper resolves Payload with the cached project config, so callers only need to pass the
53
- * collection slug and document id.
54
- */
55
- export declare const getDocumentTranslations: <TDoc extends DocumentData = DocumentData>({ id, collection, fieldNames, }: {
56
- collection: CollectionSlug;
57
- fieldNames?: MultilangFieldNames;
58
- id: number | string;
59
- }) => Promise<TranslationState<TDoc>>;
60
- /**
61
- * Returns one target-language document from the source document's translation group.
62
- *
63
- * The helper resolves Payload with the cached project config, so callers only need to pass the
64
- * collection slug, source document id, and target language code.
65
80
  */
66
- export declare const getDocumentTranslation: <TDoc extends DocumentData = DocumentData>({ id, collection, fieldNames, language, }: {
81
+ export declare const getDocumentTranslationWithPayload: <TDoc extends DocumentData = DocumentData>({ id, collection, fieldNames, language, overrideAccess, payload, req, }: {
67
82
  collection: CollectionSlug;
68
83
  fieldNames?: MultilangFieldNames;
69
84
  id: number | string;
70
85
  language: string;
86
+ overrideAccess?: boolean;
87
+ payload: Payload;
88
+ req?: PayloadRequest;
71
89
  }) => Promise<TDoc | undefined>;
72
90
  export declare const findGlobalByLanguageWithPayload: <TDoc extends DocumentData = DocumentData>({ slug, depth, language, overrideAccess, payload, req, }: {
73
91
  depth?: number;
@@ -86,22 +104,41 @@ export declare const updateGlobalByLanguageWithPayload: <TDoc extends DocumentDa
86
104
  req?: PayloadRequest;
87
105
  slug: GlobalSlug;
88
106
  }) => Promise<TDoc>;
89
- export declare const findGlobalByLanguage: <TDoc extends DocumentData = DocumentData>({ slug, depth, language, }: {
90
- depth?: number;
91
- language: string;
92
- slug: GlobalSlug;
93
- }) => Promise<TDoc>;
94
- export declare const updateGlobalByLanguage: <TDoc extends DocumentData = DocumentData>({ slug, data, depth, language, }: {
95
- data: Record<string, unknown>;
96
- depth?: number;
97
- language: string;
98
- slug: GlobalSlug;
99
- }) => Promise<TDoc>;
100
- export declare const duplicateDocumentData: ({ collection, doc, duplicateExcludeFields, fieldNames, targetLanguage, }: {
107
+ export declare const duplicateDocumentData: ({ collection, doc, fieldNames, targetLanguage, }: {
101
108
  collection: CollectionConfig;
102
109
  doc: DocumentData;
103
- duplicateExcludeFields: string[];
104
110
  fieldNames: MultilangFieldNames;
105
111
  targetLanguage: string;
106
112
  }) => DocumentData;
113
+ export type PayloadFactory = () => Payload | Promise<Payload>;
114
+ export type GetDocumentTranslationsArgs = {
115
+ collection: CollectionSlug;
116
+ fieldNames?: MultilangFieldNames;
117
+ id: number | string;
118
+ overrideAccess?: boolean;
119
+ req?: PayloadRequest;
120
+ };
121
+ export type GetDocumentTranslationArgs = {
122
+ language: string;
123
+ } & GetDocumentTranslationsArgs;
124
+ export type FindGlobalByLanguageArgs = {
125
+ depth?: number;
126
+ language: string;
127
+ overrideAccess?: boolean;
128
+ req?: PayloadRequest;
129
+ slug: GlobalSlug;
130
+ };
131
+ export type UpdateGlobalByLanguageArgs = {
132
+ data: Record<string, unknown>;
133
+ } & FindGlobalByLanguageArgs;
134
+ export type MultilangHelpers = {
135
+ findGlobalByLanguage: <TDoc extends DocumentData = DocumentData>(args: FindGlobalByLanguageArgs) => Promise<TDoc>;
136
+ getDocumentTranslation: <TDoc extends DocumentData = DocumentData>(args: GetDocumentTranslationArgs) => Promise<TDoc | undefined>;
137
+ getDocumentTranslations: <TDoc extends DocumentData = DocumentData>(args: GetDocumentTranslationsArgs) => Promise<TranslationState<TDoc>>;
138
+ getLanguages: () => Promise<MultilangLanguage[]>;
139
+ updateGlobalByLanguage: <TDoc extends DocumentData = DocumentData>(args: UpdateGlobalByLanguageArgs) => Promise<TDoc>;
140
+ };
141
+ export declare const createMultilangHelpers: ({ getPayload, }: {
142
+ getPayload: PayloadFactory;
143
+ }) => MultilangHelpers;
107
144
  export {};
package/dist/lib/data.js CHANGED
@@ -1,6 +1,4 @@
1
- import payloadConfig from '@payload-config';
2
- import { getPayload } from 'payload';
3
- import { DEFAULT_FIELD_NAMES } from '../constants.js';
1
+ import { DEFAULT_FIELD_NAMES, SYSTEM_DUPLICATION_EXCLUDED_FIELDS } from '../constants.js';
4
2
  export const asDocument = (value)=>value && typeof value === 'object' ? value : {};
5
3
  export const getStringValue = (value)=>typeof value === 'string' && value.length > 0 ? value : undefined;
6
4
  export const getID = (value)=>typeof value === 'number' || typeof value === 'string' ? value : undefined;
@@ -29,25 +27,23 @@ export const getLanguagesFromCustom = (custom)=>{
29
27
  };
30
28
  /**
31
29
  * Returns the languages configured for payload-multilang.
32
- *
33
- * Pass `languages` or a Payload `config` object when you already have them. Otherwise the helper
34
- * resolves the cached Payload config from `@payload-config`.
35
- */ export const getLanguages = async ({ config, languages } = {})=>{
30
+ */ export const getLanguages = ({ config, languages, payload } = {})=>{
36
31
  if (languages) {
37
32
  return languages.map(normalizeLanguage).filter((language)=>language.code);
38
33
  }
34
+ if (payload) {
35
+ return getLanguagesFromCustom(payload.config.admin?.custom);
36
+ }
39
37
  if (config) {
40
38
  return getLanguagesFromCustom(config.admin?.custom);
41
39
  }
42
- const payload = await getPayload({
43
- config: payloadConfig
44
- });
45
- return getLanguagesFromCustom(payload.config.admin?.custom);
40
+ throw new Error('getLanguages requires languages, config, or payload. Use createMultilangHelpers({ getPayload }) for app-level convenience.');
46
41
  };
47
- export const getDefaultLanguage = async ({ config, languages })=>{
48
- const configuredLanguages = await getLanguages({
42
+ export const getDefaultLanguage = ({ config, languages, payload })=>{
43
+ const configuredLanguages = getLanguages({
49
44
  config,
50
- languages
45
+ languages,
46
+ payload
51
47
  });
52
48
  return configuredLanguages.find((language)=>language.isDefault) || configuredLanguages[0];
53
49
  };
@@ -72,6 +68,46 @@ export const getDefaultLanguage = async ({ config, languages })=>{
72
68
  ]
73
69
  };
74
70
  };
71
+ /**
72
+ * Resolves a document's payload-multilang language from draft/form data first, then persisted doc data.
73
+ *
74
+ * Useful in Payload admin preview and livePreview URL builders where unsaved form data may already
75
+ * contain the selected language.
76
+ */ export const getMultilangDocumentLanguage = ({ data, doc, fallback, fieldName = DEFAULT_FIELD_NAMES.language })=>getStringValue(asDocument(data)[fieldName]) || getStringValue(asDocument(doc)[fieldName]) || fallback;
77
+ /**
78
+ * Builds the common Payload Local API query for per-language documents addressed by slug.
79
+ */ export const localizedSlugQuery = ({ slug, fieldName = DEFAULT_FIELD_NAMES.language, language, slugFieldName = 'slug', status = 'published', where })=>{
80
+ const constraints = [
81
+ {
82
+ [slugFieldName]: {
83
+ equals: slug
84
+ }
85
+ },
86
+ {
87
+ [fieldName]: {
88
+ equals: language
89
+ }
90
+ }
91
+ ];
92
+ if (where) {
93
+ constraints.unshift(where);
94
+ }
95
+ if (status !== 'any') {
96
+ constraints.push({
97
+ _status: {
98
+ equals: status
99
+ }
100
+ });
101
+ }
102
+ return {
103
+ ...status === 'draft' ? {
104
+ draft: true
105
+ } : {},
106
+ where: constraints.length === 1 ? constraints[0] : {
107
+ and: constraints
108
+ }
109
+ };
110
+ };
75
111
  export const getDocumentTranslationsWithPayload = async ({ id, collection, fieldNames = DEFAULT_FIELD_NAMES, overrideAccess = true, payload, req })=>{
76
112
  const source = asDocument(await payload.findByID({
77
113
  id,
@@ -146,30 +182,14 @@ export const getGroupTranslationsWithPayload = async ({ collection, fieldNames =
146
182
  };
147
183
  /**
148
184
  * Returns the source document and every document in the same translation group, keyed by language.
149
- *
150
- * The helper resolves Payload with the cached project config, so callers only need to pass the
151
- * collection slug and document id.
152
- */ export const getDocumentTranslations = async ({ id, collection, fieldNames })=>{
153
- const payload = await getPayload({
154
- config: payloadConfig
155
- });
156
- return getDocumentTranslationsWithPayload({
185
+ */ export const getDocumentTranslationWithPayload = async ({ id, collection, fieldNames, language, overrideAccess = true, payload, req })=>{
186
+ const state = await getDocumentTranslationsWithPayload({
157
187
  id,
158
188
  collection,
159
189
  fieldNames,
160
- payload
161
- });
162
- };
163
- /**
164
- * Returns one target-language document from the source document's translation group.
165
- *
166
- * The helper resolves Payload with the cached project config, so callers only need to pass the
167
- * collection slug, source document id, and target language code.
168
- */ export const getDocumentTranslation = async ({ id, collection, fieldNames, language })=>{
169
- const state = await getDocumentTranslations({
170
- id,
171
- collection,
172
- fieldNames
190
+ overrideAccess,
191
+ payload,
192
+ req
173
193
  });
174
194
  return state.translations[language];
175
195
  };
@@ -257,36 +277,41 @@ export const updateGlobalByLanguageWithPayload = async ({ slug, data, depth, lan
257
277
  language
258
278
  });
259
279
  };
260
- export const findGlobalByLanguage = async ({ slug, depth, language })=>{
261
- const payload = await getPayload({
262
- config: payloadConfig
263
- });
264
- return findGlobalByLanguageWithPayload({
265
- slug,
266
- depth,
267
- language,
268
- payload
269
- });
280
+ const fieldAffectsData = (field)=>'name' in field && typeof field.name === 'string' && field.type !== 'ui';
281
+ const duplicateFieldValue = (field, value)=>{
282
+ if (field.type === 'array' && Array.isArray(value)) {
283
+ return value.map((row)=>duplicateRowValue(asDocument(row), field.fields));
284
+ }
285
+ if (field.type === 'blocks' && Array.isArray(value)) {
286
+ return value.map((row)=>{
287
+ const rowData = asDocument(row);
288
+ const block = field.blocks.find((candidate)=>candidate.slug === getStringValue(rowData.blockType));
289
+ return duplicateRowValue(rowData, block?.fields || []);
290
+ });
291
+ }
292
+ return value;
270
293
  };
271
- export const updateGlobalByLanguage = async ({ slug, data, depth, language })=>{
272
- const payload = await getPayload({
273
- config: payloadConfig
274
- });
275
- return updateGlobalByLanguageWithPayload({
276
- slug,
277
- data,
278
- depth,
279
- language,
280
- payload
281
- });
294
+ const duplicateRowValue = (row, fields)=>{
295
+ const data = Object.entries(row).reduce((acc, [key, value])=>{
296
+ if (key !== 'id') {
297
+ acc[key] = value;
298
+ }
299
+ return acc;
300
+ }, {});
301
+ for (const field of fields){
302
+ if (!fieldAffectsData(field) || !(field.name in data)) {
303
+ continue;
304
+ }
305
+ data[field.name] = duplicateFieldValue(field, data[field.name]);
306
+ }
307
+ return data;
282
308
  };
283
- const fieldAffectsData = (field)=>'name' in field && typeof field.name === 'string' && field.type !== 'ui';
284
- export const duplicateDocumentData = ({ collection, doc, duplicateExcludeFields, fieldNames, targetLanguage })=>{
309
+ export const duplicateDocumentData = ({ collection, doc, fieldNames, targetLanguage })=>{
285
310
  const excluded = new Set([
286
311
  fieldNames.group,
287
312
  fieldNames.language,
288
313
  fieldNames.meta,
289
- ...duplicateExcludeFields
314
+ ...SYSTEM_DUPLICATION_EXCLUDED_FIELDS
290
315
  ]);
291
316
  const data = {};
292
317
  for (const field of collection.fields || []){
@@ -296,12 +321,45 @@ export const duplicateDocumentData = ({ collection, doc, duplicateExcludeFields,
296
321
  if (!(field.name in doc)) {
297
322
  continue;
298
323
  }
299
- data[field.name] = doc[field.name];
324
+ data[field.name] = duplicateFieldValue(field, doc[field.name]);
300
325
  }
301
326
  if (typeof data.slug === 'string' && data.slug.length > 0) {
302
327
  data.slug = `${data.slug}-${targetLanguage}`;
303
328
  }
304
329
  return data;
305
330
  };
331
+ export const createMultilangHelpers = ({ getPayload })=>{
332
+ const resolvePayload = async ()=>getPayload();
333
+ return {
334
+ findGlobalByLanguage: async ({ slug, depth, language, overrideAccess, req })=>findGlobalByLanguageWithPayload({
335
+ slug,
336
+ depth,
337
+ language,
338
+ overrideAccess,
339
+ payload: await resolvePayload(),
340
+ req
341
+ }),
342
+ getDocumentTranslation: async (args)=>getDocumentTranslationWithPayload({
343
+ ...args,
344
+ payload: await resolvePayload()
345
+ }),
346
+ getDocumentTranslations: async (args)=>getDocumentTranslationsWithPayload({
347
+ ...args,
348
+ payload: await resolvePayload()
349
+ }),
350
+ getLanguages: async ()=>getLanguages({
351
+ payload: await resolvePayload()
352
+ }),
353
+ updateGlobalByLanguage: async ({ slug, data, depth, language, overrideAccess, req })=>updateGlobalByLanguageWithPayload({
354
+ slug,
355
+ data,
356
+ depth,
357
+ language,
358
+ overrideAccess,
359
+ payload: await resolvePayload(),
360
+ req
361
+ })
362
+ };
363
+ };
306
364
 
307
365
  //# sourceMappingURL=data.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/data.ts"],"sourcesContent":["import type {\n CollectionConfig,\n CollectionSlug,\n Config,\n Field,\n GlobalSlug,\n Payload,\n PayloadRequest,\n Where,\n} from 'payload'\n\nimport payloadConfig from '@payload-config'\nimport { getPayload } from 'payload'\n\nimport type {\n MultilangFieldNames,\n MultilangLanguage,\n TranslationState,\n WithLanguageArgs,\n} from '../types.js'\n\nimport { DEFAULT_FIELD_NAMES } from '../constants.js'\n\nexport type DocumentData = {\n id?: number | string\n} & Record<string, unknown>\n\nexport const asDocument = (value: unknown): DocumentData =>\n value && typeof value === 'object' ? (value as DocumentData) : {}\n\nexport const getStringValue = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined\n\nexport const getID = (value: unknown): number | string | undefined =>\n typeof value === 'number' || typeof value === 'string' ? value : undefined\n\nexport const normalizeLanguage = (doc: unknown): MultilangLanguage => {\n const data = asDocument(doc)\n const code = getStringValue(data.code)?.trim().toLowerCase() || ''\n\n return {\n id: getID(data.id),\n name: getStringValue(data.name)?.trim() || code,\n active: data.active !== false,\n code,\n direction: data.direction === 'rtl' ? 'rtl' : 'ltr',\n flagLabel: getStringValue(data.flagLabel),\n isDefault: data.isDefault === true,\n locale: getStringValue(data.locale),\n order: typeof data.order === 'number' ? data.order : 0,\n }\n}\n\ntype ConfigWithMultilang = Pick<Config, 'admin'> | Pick<Payload['config'], 'admin'>\n\nexport const getLanguagesFromCustom = (custom: unknown): MultilangLanguage[] => {\n const payloadMultilang = asDocument(asDocument(custom).payloadMultilang)\n const languages = payloadMultilang.languages\n\n if (!Array.isArray(languages)) {\n return []\n }\n\n return languages.map(normalizeLanguage).filter((language) => language.code)\n}\n\n/**\n * Returns the languages configured for payload-multilang.\n *\n * Pass `languages` or a Payload `config` object when you already have them. Otherwise the helper\n * resolves the cached Payload config from `@payload-config`.\n */\nexport const getLanguages = async ({\n config,\n languages,\n}: {\n config?: ConfigWithMultilang\n languages?: MultilangLanguage[]\n} = {}): Promise<MultilangLanguage[]> => {\n if (languages) {\n return languages.map(normalizeLanguage).filter((language) => language.code)\n }\n\n if (config) {\n return getLanguagesFromCustom(config.admin?.custom)\n }\n\n const payload = await getPayload({ config: payloadConfig })\n\n return getLanguagesFromCustom(payload.config.admin?.custom)\n}\n\nexport const getDefaultLanguage = async ({\n config,\n languages,\n}: {\n config?: ConfigWithMultilang\n languages?: MultilangLanguage[]\n}): Promise<MultilangLanguage | undefined> => {\n const configuredLanguages = await getLanguages({ config, languages })\n\n return configuredLanguages.find((language) => language.isDefault) || configuredLanguages[0]\n}\n\n/**\n * Adds a language constraint to a Payload `where` query.\n *\n * Use this when querying an enabled collection directly and you only want documents for one\n * payload-multilang language.\n */\nexport const withLanguage = ({\n fieldName = DEFAULT_FIELD_NAMES.language,\n language,\n where,\n}: WithLanguageArgs): Where => {\n const languageWhere: Where = {\n [fieldName]: {\n equals: language,\n },\n }\n\n if (!where) {\n return languageWhere\n }\n\n return {\n and: [where, languageWhere],\n }\n}\n\nexport const getDocumentTranslationsWithPayload = async <TDoc extends DocumentData = DocumentData>({\n id,\n collection,\n fieldNames = DEFAULT_FIELD_NAMES,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TranslationState<TDoc>> => {\n const source = asDocument(\n await payload.findByID({\n id,\n collection,\n depth: 0,\n overrideAccess,\n req,\n }),\n ) as TDoc\n\n const group = getStringValue(source[fieldNames.group])\n const language = getStringValue(source[fieldNames.language])\n\n if (!group) {\n return {\n language,\n source,\n translations: language ? { [language]: source } : {},\n }\n }\n\n const result = await payload.find({\n collection,\n depth: 0,\n limit: 200,\n overrideAccess,\n req,\n where: {\n [fieldNames.group]: {\n equals: group,\n },\n },\n })\n\n const translations = result.docs.reduce<TranslationState<TDoc>['translations']>((acc, doc) => {\n const translation = asDocument(doc) as TDoc\n const code = getStringValue(translation[fieldNames.language])\n\n if (code) {\n acc[code] = translation\n }\n\n return acc\n }, {})\n\n return {\n group,\n language,\n source,\n translations,\n }\n}\n\nexport const getGroupTranslationsWithPayload = async <TDoc extends DocumentData = DocumentData>({\n collection,\n fieldNames = DEFAULT_FIELD_NAMES,\n group,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n group: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TranslationState<TDoc>> => {\n const result = await payload.find({\n collection,\n depth: 0,\n limit: 200,\n overrideAccess,\n req,\n where: {\n [fieldNames.group]: {\n equals: group,\n },\n },\n })\n\n const translations = result.docs.reduce<TranslationState<TDoc>['translations']>((acc, doc) => {\n const translation = asDocument(doc) as TDoc\n const code = getStringValue(translation[fieldNames.language])\n\n if (code) {\n acc[code] = translation\n }\n\n return acc\n }, {})\n\n return {\n group,\n translations,\n }\n}\n\n/**\n * Returns the source document and every document in the same translation group, keyed by language.\n *\n * The helper resolves Payload with the cached project config, so callers only need to pass the\n * collection slug and document id.\n */\nexport const getDocumentTranslations = async <TDoc extends DocumentData = DocumentData>({\n id,\n collection,\n fieldNames,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n}): Promise<TranslationState<TDoc>> => {\n const payload = await getPayload({ config: payloadConfig })\n\n return getDocumentTranslationsWithPayload<TDoc>({\n id,\n collection,\n fieldNames,\n payload,\n })\n}\n\n/**\n * Returns one target-language document from the source document's translation group.\n *\n * The helper resolves Payload with the cached project config, so callers only need to pass the\n * collection slug, source document id, and target language code.\n */\nexport const getDocumentTranslation = async <TDoc extends DocumentData = DocumentData>({\n id,\n collection,\n fieldNames,\n language,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n language: string\n}): Promise<TDoc | undefined> => {\n const state = await getDocumentTranslations<TDoc>({\n id,\n collection,\n fieldNames,\n })\n\n return state.translations[language]\n}\n\nconst GLOBAL_SYSTEM_FIELDS = new Set(['_status', 'createdAt', 'globalType', 'id', 'updatedAt'])\n\nconst getGlobalPayloadMultilangCustom = ({\n slug,\n payload,\n}: {\n payload: Payload\n slug: GlobalSlug\n}): {\n defaultLanguage?: MultilangLanguage\n languages?: MultilangLanguage[]\n} => {\n const global = payload.config.globals.find((item) => item.slug === slug)\n const payloadMultilang = asDocument(asDocument(global?.admin?.custom).payloadMultilang)\n\n return payloadMultilang as {\n defaultLanguage?: MultilangLanguage\n languages?: MultilangLanguage[]\n }\n}\n\nconst validateGlobalLanguage = ({\n slug,\n language,\n payload,\n}: {\n language: string\n payload: Payload\n slug: GlobalSlug\n}): void => {\n const languages = getGlobalPayloadMultilangCustom({ slug, payload }).languages\n\n if (!Array.isArray(languages) || languages.length === 0) {\n return\n }\n\n if (!languages.some((candidate) => candidate.code === language)) {\n throw new Error(`Language \"${language}\" is not configured for ${slug}.`)\n }\n}\n\nconst getGlobalLanguageTab = <TDoc extends DocumentData = DocumentData>({\n doc,\n language,\n}: {\n doc: DocumentData\n language: string\n}): TDoc => {\n const languageData = asDocument(doc[language])\n const systemData = Object.entries(doc).reduce<DocumentData>((acc, [key, value]) => {\n if (GLOBAL_SYSTEM_FIELDS.has(key)) {\n acc[key] = value\n }\n\n return acc\n }, {})\n\n return {\n ...systemData,\n ...languageData,\n } as TDoc\n}\n\nexport const findGlobalByLanguageWithPayload = async <TDoc extends DocumentData = DocumentData>({\n slug,\n depth,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n depth?: number\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n slug: GlobalSlug\n}): Promise<TDoc> => {\n validateGlobalLanguage({ slug, language, payload })\n\n const doc = asDocument(\n await payload.findGlobal({\n slug,\n depth,\n overrideAccess,\n req,\n } as never),\n )\n\n return getGlobalLanguageTab<TDoc>({\n doc,\n language,\n })\n}\n\nexport const updateGlobalByLanguageWithPayload = async <TDoc extends DocumentData = DocumentData>({\n slug,\n data,\n depth,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n data: Record<string, unknown>\n depth?: number\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n slug: GlobalSlug\n}): Promise<TDoc> => {\n validateGlobalLanguage({ slug, language, payload })\n\n const currentDoc = asDocument(\n await payload.findGlobal({\n slug,\n depth: 0,\n overrideAccess,\n req,\n } as never),\n )\n const currentLanguageData = asDocument(currentDoc[language])\n\n const doc = asDocument(\n await payload.updateGlobal({\n slug,\n data: {\n [language]: {\n ...currentLanguageData,\n ...data,\n },\n },\n depth,\n overrideAccess,\n req,\n } as never),\n )\n\n return getGlobalLanguageTab<TDoc>({\n doc,\n language,\n })\n}\n\nexport const findGlobalByLanguage = async <TDoc extends DocumentData = DocumentData>({\n slug,\n depth,\n language,\n}: {\n depth?: number\n language: string\n slug: GlobalSlug\n}): Promise<TDoc> => {\n const payload = await getPayload({ config: payloadConfig })\n\n return findGlobalByLanguageWithPayload<TDoc>({\n slug,\n depth,\n language,\n payload,\n })\n}\n\nexport const updateGlobalByLanguage = async <TDoc extends DocumentData = DocumentData>({\n slug,\n data,\n depth,\n language,\n}: {\n data: Record<string, unknown>\n depth?: number\n language: string\n slug: GlobalSlug\n}): Promise<TDoc> => {\n const payload = await getPayload({ config: payloadConfig })\n\n return updateGlobalByLanguageWithPayload<TDoc>({\n slug,\n data,\n depth,\n language,\n payload,\n })\n}\n\nconst fieldAffectsData = (field: Field): field is { name: string } & Field =>\n 'name' in field && typeof field.name === 'string' && field.type !== 'ui'\n\nexport const duplicateDocumentData = ({\n collection,\n doc,\n duplicateExcludeFields,\n fieldNames,\n targetLanguage,\n}: {\n collection: CollectionConfig\n doc: DocumentData\n duplicateExcludeFields: string[]\n fieldNames: MultilangFieldNames\n targetLanguage: string\n}): DocumentData => {\n const excluded = new Set([\n fieldNames.group,\n fieldNames.language,\n fieldNames.meta,\n ...duplicateExcludeFields,\n ])\n\n const data: DocumentData = {}\n\n for (const field of collection.fields || []) {\n if (!fieldAffectsData(field) || excluded.has(field.name)) {\n continue\n }\n\n if (!(field.name in doc)) {\n continue\n }\n\n data[field.name] = doc[field.name]\n }\n\n if (typeof data.slug === 'string' && data.slug.length > 0) {\n data.slug = `${data.slug}-${targetLanguage}`\n }\n\n return data\n}\n"],"names":["payloadConfig","getPayload","DEFAULT_FIELD_NAMES","asDocument","value","getStringValue","length","undefined","getID","normalizeLanguage","doc","data","code","trim","toLowerCase","id","name","active","direction","flagLabel","isDefault","locale","order","getLanguagesFromCustom","custom","payloadMultilang","languages","Array","isArray","map","filter","language","getLanguages","config","admin","payload","getDefaultLanguage","configuredLanguages","find","withLanguage","fieldName","where","languageWhere","equals","and","getDocumentTranslationsWithPayload","collection","fieldNames","overrideAccess","req","source","findByID","depth","group","translations","result","limit","docs","reduce","acc","translation","getGroupTranslationsWithPayload","getDocumentTranslations","getDocumentTranslation","state","GLOBAL_SYSTEM_FIELDS","Set","getGlobalPayloadMultilangCustom","slug","global","globals","item","validateGlobalLanguage","some","candidate","Error","getGlobalLanguageTab","languageData","systemData","Object","entries","key","has","findGlobalByLanguageWithPayload","findGlobal","updateGlobalByLanguageWithPayload","currentDoc","currentLanguageData","updateGlobal","findGlobalByLanguage","updateGlobalByLanguage","fieldAffectsData","field","type","duplicateDocumentData","duplicateExcludeFields","targetLanguage","excluded","meta","fields"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/data.ts"],"sourcesContent":["import type {\n CollectionConfig,\n CollectionSlug,\n Config,\n Field,\n GlobalSlug,\n Payload,\n PayloadRequest,\n Where,\n} from 'payload'\n\nimport type {\n MultilangFieldNames,\n MultilangLanguage,\n TranslationState,\n WithLanguageArgs,\n} from '../types.js'\n\nimport { DEFAULT_FIELD_NAMES, SYSTEM_DUPLICATION_EXCLUDED_FIELDS } from '../constants.js'\n\nexport type DocumentData = {\n id?: number | string\n} & Record<string, unknown>\n\nexport const asDocument = (value: unknown): DocumentData =>\n value && typeof value === 'object' ? (value as DocumentData) : {}\n\nexport const getStringValue = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined\n\nexport const getID = (value: unknown): number | string | undefined =>\n typeof value === 'number' || typeof value === 'string' ? value : undefined\n\nexport const normalizeLanguage = (doc: unknown): MultilangLanguage => {\n const data = asDocument(doc)\n const code = getStringValue(data.code)?.trim().toLowerCase() || ''\n\n return {\n id: getID(data.id),\n name: getStringValue(data.name)?.trim() || code,\n active: data.active !== false,\n code,\n direction: data.direction === 'rtl' ? 'rtl' : 'ltr',\n flagLabel: getStringValue(data.flagLabel),\n isDefault: data.isDefault === true,\n locale: getStringValue(data.locale),\n order: typeof data.order === 'number' ? data.order : 0,\n }\n}\n\ntype ConfigWithMultilang = Pick<Config, 'admin'> | Pick<Payload['config'], 'admin'>\n\nexport const getLanguagesFromCustom = (custom: unknown): MultilangLanguage[] => {\n const payloadMultilang = asDocument(asDocument(custom).payloadMultilang)\n const languages = payloadMultilang.languages\n\n if (!Array.isArray(languages)) {\n return []\n }\n\n return languages.map(normalizeLanguage).filter((language) => language.code)\n}\n\n/**\n * Returns the languages configured for payload-multilang.\n */\nexport const getLanguages = ({\n config,\n languages,\n payload,\n}: {\n config?: ConfigWithMultilang\n languages?: MultilangLanguage[]\n payload?: Payload\n} = {}): MultilangLanguage[] => {\n if (languages) {\n return languages.map(normalizeLanguage).filter((language) => language.code)\n }\n\n if (payload) {\n return getLanguagesFromCustom(payload.config.admin?.custom)\n }\n\n if (config) {\n return getLanguagesFromCustom(config.admin?.custom)\n }\n\n throw new Error(\n 'getLanguages requires languages, config, or payload. Use createMultilangHelpers({ getPayload }) for app-level convenience.',\n )\n}\n\nexport const getDefaultLanguage = ({\n config,\n languages,\n payload,\n}: {\n config?: ConfigWithMultilang\n languages?: MultilangLanguage[]\n payload?: Payload\n}): MultilangLanguage | undefined => {\n const configuredLanguages = getLanguages({ config, languages, payload })\n\n return configuredLanguages.find((language) => language.isDefault) || configuredLanguages[0]\n}\n\n/**\n * Adds a language constraint to a Payload `where` query.\n *\n * Use this when querying an enabled collection directly and you only want documents for one\n * payload-multilang language.\n */\nexport const withLanguage = ({\n fieldName = DEFAULT_FIELD_NAMES.language,\n language,\n where,\n}: WithLanguageArgs): Where => {\n const languageWhere: Where = {\n [fieldName]: {\n equals: language,\n },\n }\n\n if (!where) {\n return languageWhere\n }\n\n return {\n and: [where, languageWhere],\n }\n}\n\nexport type MultilangDocumentLanguageArgs = {\n data?: unknown\n doc?: unknown\n fallback?: string\n fieldName?: string\n}\n\n/**\n * Resolves a document's payload-multilang language from draft/form data first, then persisted doc data.\n *\n * Useful in Payload admin preview and livePreview URL builders where unsaved form data may already\n * contain the selected language.\n */\nexport const getMultilangDocumentLanguage = ({\n data,\n doc,\n fallback,\n fieldName = DEFAULT_FIELD_NAMES.language,\n}: MultilangDocumentLanguageArgs): string | undefined =>\n getStringValue(asDocument(data)[fieldName]) ||\n getStringValue(asDocument(doc)[fieldName]) ||\n fallback\n\nexport type LocalizedSlugQueryStatus = 'any' | 'draft' | 'published'\n\nexport type LocalizedSlugQueryArgs = {\n fieldName?: string\n language: string\n slug: string\n slugFieldName?: string\n status?: LocalizedSlugQueryStatus\n where?: Where\n}\n\nexport type LocalizedSlugQuery = {\n draft?: boolean\n where: Where\n}\n\n/**\n * Builds the common Payload Local API query for per-language documents addressed by slug.\n */\nexport const localizedSlugQuery = ({\n slug,\n fieldName = DEFAULT_FIELD_NAMES.language,\n language,\n slugFieldName = 'slug',\n status = 'published',\n where,\n}: LocalizedSlugQueryArgs): LocalizedSlugQuery => {\n const constraints: Where[] = [\n {\n [slugFieldName]: {\n equals: slug,\n },\n },\n {\n [fieldName]: {\n equals: language,\n },\n },\n ]\n\n if (where) {\n constraints.unshift(where)\n }\n\n if (status !== 'any') {\n constraints.push({\n _status: {\n equals: status,\n },\n })\n }\n\n return {\n ...(status === 'draft' ? { draft: true } : {}),\n where:\n constraints.length === 1\n ? constraints[0]\n : {\n and: constraints,\n },\n }\n}\n\nexport const getDocumentTranslationsWithPayload = async <TDoc extends DocumentData = DocumentData>({\n id,\n collection,\n fieldNames = DEFAULT_FIELD_NAMES,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TranslationState<TDoc>> => {\n const source = asDocument(\n await payload.findByID({\n id,\n collection,\n depth: 0,\n overrideAccess,\n req,\n }),\n ) as TDoc\n\n const group = getStringValue(source[fieldNames.group])\n const language = getStringValue(source[fieldNames.language])\n\n if (!group) {\n return {\n language,\n source,\n translations: language ? { [language]: source } : {},\n }\n }\n\n const result = await payload.find({\n collection,\n depth: 0,\n limit: 200,\n overrideAccess,\n req,\n where: {\n [fieldNames.group]: {\n equals: group,\n },\n },\n })\n\n const translations = result.docs.reduce<TranslationState<TDoc>['translations']>((acc, doc) => {\n const translation = asDocument(doc) as TDoc\n const code = getStringValue(translation[fieldNames.language])\n\n if (code) {\n acc[code] = translation\n }\n\n return acc\n }, {})\n\n return {\n group,\n language,\n source,\n translations,\n }\n}\n\nexport const getGroupTranslationsWithPayload = async <TDoc extends DocumentData = DocumentData>({\n collection,\n fieldNames = DEFAULT_FIELD_NAMES,\n group,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n group: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TranslationState<TDoc>> => {\n const result = await payload.find({\n collection,\n depth: 0,\n limit: 200,\n overrideAccess,\n req,\n where: {\n [fieldNames.group]: {\n equals: group,\n },\n },\n })\n\n const translations = result.docs.reduce<TranslationState<TDoc>['translations']>((acc, doc) => {\n const translation = asDocument(doc) as TDoc\n const code = getStringValue(translation[fieldNames.language])\n\n if (code) {\n acc[code] = translation\n }\n\n return acc\n }, {})\n\n return {\n group,\n translations,\n }\n}\n\n/**\n * Returns the source document and every document in the same translation group, keyed by language.\n */\nexport const getDocumentTranslationWithPayload = async <TDoc extends DocumentData = DocumentData>({\n id,\n collection,\n fieldNames,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TDoc | undefined> => {\n const state = await getDocumentTranslationsWithPayload<TDoc>({\n id,\n collection,\n fieldNames,\n overrideAccess,\n payload,\n req,\n })\n\n return state.translations[language]\n}\n\nconst GLOBAL_SYSTEM_FIELDS = new Set(['_status', 'createdAt', 'globalType', 'id', 'updatedAt'])\n\nconst getGlobalPayloadMultilangCustom = ({\n slug,\n payload,\n}: {\n payload: Payload\n slug: GlobalSlug\n}): {\n defaultLanguage?: MultilangLanguage\n languages?: MultilangLanguage[]\n} => {\n const global = payload.config.globals.find((item) => item.slug === slug)\n const payloadMultilang = asDocument(asDocument(global?.admin?.custom).payloadMultilang)\n\n return payloadMultilang as {\n defaultLanguage?: MultilangLanguage\n languages?: MultilangLanguage[]\n }\n}\n\nconst validateGlobalLanguage = ({\n slug,\n language,\n payload,\n}: {\n language: string\n payload: Payload\n slug: GlobalSlug\n}): void => {\n const languages = getGlobalPayloadMultilangCustom({ slug, payload }).languages\n\n if (!Array.isArray(languages) || languages.length === 0) {\n return\n }\n\n if (!languages.some((candidate) => candidate.code === language)) {\n throw new Error(`Language \"${language}\" is not configured for ${slug}.`)\n }\n}\n\nconst getGlobalLanguageTab = <TDoc extends DocumentData = DocumentData>({\n doc,\n language,\n}: {\n doc: DocumentData\n language: string\n}): TDoc => {\n const languageData = asDocument(doc[language])\n const systemData = Object.entries(doc).reduce<DocumentData>((acc, [key, value]) => {\n if (GLOBAL_SYSTEM_FIELDS.has(key)) {\n acc[key] = value\n }\n\n return acc\n }, {})\n\n return {\n ...systemData,\n ...languageData,\n } as TDoc\n}\n\nexport const findGlobalByLanguageWithPayload = async <TDoc extends DocumentData = DocumentData>({\n slug,\n depth,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n depth?: number\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n slug: GlobalSlug\n}): Promise<TDoc> => {\n validateGlobalLanguage({ slug, language, payload })\n\n const doc = asDocument(\n await payload.findGlobal({\n slug,\n depth,\n overrideAccess,\n req,\n } as never),\n )\n\n return getGlobalLanguageTab<TDoc>({\n doc,\n language,\n })\n}\n\nexport const updateGlobalByLanguageWithPayload = async <TDoc extends DocumentData = DocumentData>({\n slug,\n data,\n depth,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n data: Record<string, unknown>\n depth?: number\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n slug: GlobalSlug\n}): Promise<TDoc> => {\n validateGlobalLanguage({ slug, language, payload })\n\n const currentDoc = asDocument(\n await payload.findGlobal({\n slug,\n depth: 0,\n overrideAccess,\n req,\n } as never),\n )\n const currentLanguageData = asDocument(currentDoc[language])\n\n const doc = asDocument(\n await payload.updateGlobal({\n slug,\n data: {\n [language]: {\n ...currentLanguageData,\n ...data,\n },\n },\n depth,\n overrideAccess,\n req,\n } as never),\n )\n\n return getGlobalLanguageTab<TDoc>({\n doc,\n language,\n })\n}\n\nconst fieldAffectsData = (field: Field): field is { name: string } & Field =>\n 'name' in field && typeof field.name === 'string' && field.type !== 'ui'\n\nconst duplicateFieldValue = (field: Field, value: unknown): unknown => {\n if (field.type === 'array' && Array.isArray(value)) {\n return value.map((row) =>\n duplicateRowValue(asDocument(row), field.fields),\n )\n }\n\n if (field.type === 'blocks' && Array.isArray(value)) {\n return value.map((row) => {\n const rowData = asDocument(row)\n const block = field.blocks.find(\n (candidate) => candidate.slug === getStringValue(rowData.blockType),\n )\n\n return duplicateRowValue(rowData, block?.fields || [])\n })\n }\n\n return value\n}\n\nconst duplicateRowValue = (\n row: Record<string, unknown>,\n fields: Field[],\n): Record<string, unknown> => {\n const data = Object.entries(row).reduce<Record<string, unknown>>(\n (acc, [key, value]) => {\n if (key !== 'id') {\n acc[key] = value\n }\n\n return acc\n },\n {},\n )\n\n for (const field of fields) {\n if (!fieldAffectsData(field) || !(field.name in data)) {\n continue\n }\n\n data[field.name] = duplicateFieldValue(field, data[field.name])\n }\n\n return data\n}\n\nexport const duplicateDocumentData = ({\n collection,\n doc,\n fieldNames,\n targetLanguage,\n}: {\n collection: CollectionConfig\n doc: DocumentData\n fieldNames: MultilangFieldNames\n targetLanguage: string\n}): DocumentData => {\n const excluded = new Set([\n fieldNames.group,\n fieldNames.language,\n fieldNames.meta,\n ...SYSTEM_DUPLICATION_EXCLUDED_FIELDS,\n ])\n\n const data: DocumentData = {}\n\n for (const field of collection.fields || []) {\n if (!fieldAffectsData(field) || excluded.has(field.name)) {\n continue\n }\n\n if (!(field.name in doc)) {\n continue\n }\n\n data[field.name] = duplicateFieldValue(field, doc[field.name])\n }\n\n if (typeof data.slug === 'string' && data.slug.length > 0) {\n data.slug = `${data.slug}-${targetLanguage}`\n }\n\n return data\n}\n\nexport type PayloadFactory = () => Payload | Promise<Payload>\n\nexport type GetDocumentTranslationsArgs = {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n overrideAccess?: boolean\n req?: PayloadRequest\n}\n\nexport type GetDocumentTranslationArgs = {\n language: string\n} & GetDocumentTranslationsArgs\n\nexport type FindGlobalByLanguageArgs = {\n depth?: number\n language: string\n overrideAccess?: boolean\n req?: PayloadRequest\n slug: GlobalSlug\n}\n\nexport type UpdateGlobalByLanguageArgs = {\n data: Record<string, unknown>\n} & FindGlobalByLanguageArgs\n\nexport type MultilangHelpers = {\n findGlobalByLanguage: <TDoc extends DocumentData = DocumentData>(\n args: FindGlobalByLanguageArgs,\n ) => Promise<TDoc>\n getDocumentTranslation: <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationArgs,\n ) => Promise<TDoc | undefined>\n getDocumentTranslations: <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationsArgs,\n ) => Promise<TranslationState<TDoc>>\n getLanguages: () => Promise<MultilangLanguage[]>\n updateGlobalByLanguage: <TDoc extends DocumentData = DocumentData>(\n args: UpdateGlobalByLanguageArgs,\n ) => Promise<TDoc>\n}\n\nexport const createMultilangHelpers = ({\n getPayload,\n}: {\n getPayload: PayloadFactory\n}): MultilangHelpers => {\n const resolvePayload = async () => getPayload()\n\n return {\n findGlobalByLanguage: async <TDoc extends DocumentData = DocumentData>({\n slug,\n depth,\n language,\n overrideAccess,\n req,\n }: FindGlobalByLanguageArgs): Promise<TDoc> =>\n findGlobalByLanguageWithPayload<TDoc>({\n slug,\n depth,\n language,\n overrideAccess,\n payload: await resolvePayload(),\n req,\n }),\n\n getDocumentTranslation: async <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationArgs,\n ): Promise<TDoc | undefined> =>\n getDocumentTranslationWithPayload<TDoc>({\n ...args,\n payload: await resolvePayload(),\n }),\n\n getDocumentTranslations: async <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationsArgs,\n ): Promise<TranslationState<TDoc>> =>\n getDocumentTranslationsWithPayload<TDoc>({\n ...args,\n payload: await resolvePayload(),\n }),\n\n getLanguages: async (): Promise<MultilangLanguage[]> =>\n getLanguages({ payload: await resolvePayload() }),\n\n updateGlobalByLanguage: async <TDoc extends DocumentData = DocumentData>({\n slug,\n data,\n depth,\n language,\n overrideAccess,\n req,\n }: UpdateGlobalByLanguageArgs): Promise<TDoc> =>\n updateGlobalByLanguageWithPayload<TDoc>({\n slug,\n data,\n depth,\n language,\n overrideAccess,\n payload: await resolvePayload(),\n req,\n }),\n }\n}\n"],"names":["DEFAULT_FIELD_NAMES","SYSTEM_DUPLICATION_EXCLUDED_FIELDS","asDocument","value","getStringValue","length","undefined","getID","normalizeLanguage","doc","data","code","trim","toLowerCase","id","name","active","direction","flagLabel","isDefault","locale","order","getLanguagesFromCustom","custom","payloadMultilang","languages","Array","isArray","map","filter","language","getLanguages","config","payload","admin","Error","getDefaultLanguage","configuredLanguages","find","withLanguage","fieldName","where","languageWhere","equals","and","getMultilangDocumentLanguage","fallback","localizedSlugQuery","slug","slugFieldName","status","constraints","unshift","push","_status","draft","getDocumentTranslationsWithPayload","collection","fieldNames","overrideAccess","req","source","findByID","depth","group","translations","result","limit","docs","reduce","acc","translation","getGroupTranslationsWithPayload","getDocumentTranslationWithPayload","state","GLOBAL_SYSTEM_FIELDS","Set","getGlobalPayloadMultilangCustom","global","globals","item","validateGlobalLanguage","some","candidate","getGlobalLanguageTab","languageData","systemData","Object","entries","key","has","findGlobalByLanguageWithPayload","findGlobal","updateGlobalByLanguageWithPayload","currentDoc","currentLanguageData","updateGlobal","fieldAffectsData","field","type","duplicateFieldValue","row","duplicateRowValue","fields","rowData","block","blocks","blockType","duplicateDocumentData","targetLanguage","excluded","meta","createMultilangHelpers","getPayload","resolvePayload","findGlobalByLanguage","getDocumentTranslation","args","getDocumentTranslations","updateGlobalByLanguage"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export declare const payloadMultilangTranslations: {
2
+ readonly en: {
3
+ readonly payloadMultilang: {
4
+ readonly allLanguages: "All languages";
5
+ readonly chooseLanguage: "Choose language";
6
+ readonly chooseTargetLanguage: "Choose a target language.";
7
+ readonly connectExisting: "Connect existing";
8
+ readonly createOrConnectDocuments: "Create or connect separate localized documents.";
9
+ readonly createTranslation: "Create translation";
10
+ readonly createTranslationFor: "Create {{language}} translation";
11
+ readonly current: "Current";
12
+ readonly disconnectDocument: "Disconnect this document";
13
+ readonly documentID: "Document ID";
14
+ readonly editTranslationFor: "Edit {{language}} translation";
15
+ readonly existingDocumentID: "Existing document ID";
16
+ readonly language: "Language";
17
+ readonly linkedDocuments: "Linked documents";
18
+ readonly localized: "Localized";
19
+ readonly localizedContent: "Localized content";
20
+ readonly missing: "Missing";
21
+ readonly saveBeforeAddingTranslations: "Save before adding translations.";
22
+ readonly saveBeforeCreatingTranslations: "Save the document before creating translations.";
23
+ readonly saveBeforeManagingTranslations: "Save the document before managing translations.";
24
+ readonly targetIDAndLanguageRequired: "Target ID and language are required.";
25
+ readonly translationActions: "Translation actions";
26
+ readonly translationConnected: "Translation connected.";
27
+ readonly translationCouldNotBeConnected: "Translation could not be connected.";
28
+ readonly translationCouldNotBeCreated: "Translation could not be created.";
29
+ readonly translationCouldNotBeDisconnected: "Translation could not be disconnected.";
30
+ readonly translationDisconnected: "Translation disconnected.";
31
+ readonly translations: "Translations";
32
+ readonly unassigned: "Unassigned";
33
+ readonly unassignedStoredLanguageNotConfigured: "Unassigned; stored language \"{{language}}\" is not configured";
34
+ };
35
+ };
36
+ readonly uk: {
37
+ readonly payloadMultilang: {
38
+ readonly allLanguages: "Усі мови";
39
+ readonly chooseLanguage: "Оберіть мову";
40
+ readonly chooseTargetLanguage: "Оберіть цільову мову.";
41
+ readonly connectExisting: "Підключити наявний";
42
+ readonly createOrConnectDocuments: "Створюйте або підключайте окремі локалізовані документи.";
43
+ readonly createTranslation: "Створити переклад";
44
+ readonly createTranslationFor: "Створити переклад: {{language}}";
45
+ readonly current: "Поточний";
46
+ readonly disconnectDocument: "Від’єднати цей документ";
47
+ readonly documentID: "ID документа";
48
+ readonly editTranslationFor: "Редагувати переклад: {{language}}";
49
+ readonly existingDocumentID: "ID наявного документа";
50
+ readonly language: "Мова";
51
+ readonly linkedDocuments: "Пов’язані документи";
52
+ readonly localized: "Локалізовано";
53
+ readonly localizedContent: "Локалізований вміст";
54
+ readonly missing: "Відсутній";
55
+ readonly saveBeforeAddingTranslations: "Збережіть перед додаванням перекладів.";
56
+ readonly saveBeforeCreatingTranslations: "Збережіть документ перед створенням перекладів.";
57
+ readonly saveBeforeManagingTranslations: "Збережіть документ перед керуванням перекладами.";
58
+ readonly targetIDAndLanguageRequired: "Потрібні ID цільового документа та мова.";
59
+ readonly translationActions: "Дії з перекладами";
60
+ readonly translationConnected: "Переклад підключено.";
61
+ readonly translationCouldNotBeConnected: "Не вдалося підключити переклад.";
62
+ readonly translationCouldNotBeCreated: "Не вдалося створити переклад.";
63
+ readonly translationCouldNotBeDisconnected: "Не вдалося від’єднати переклад.";
64
+ readonly translationDisconnected: "Переклад від’єднано.";
65
+ readonly translations: "Переклади";
66
+ readonly unassigned: "Не призначено";
67
+ readonly unassignedStoredLanguageNotConfigured: "Не призначено; збережена мова \"{{language}}\" не налаштована";
68
+ };
69
+ };
70
+ };
71
+ export type PayloadMultilangTranslations = (typeof payloadMultilangTranslations)['en'];
72
+ export type PayloadMultilangTranslationKey = `payloadMultilang:${keyof PayloadMultilangTranslations['payloadMultilang']}`;
@@ -0,0 +1,72 @@
1
+ export const payloadMultilangTranslations = {
2
+ en: {
3
+ payloadMultilang: {
4
+ allLanguages: 'All languages',
5
+ chooseLanguage: 'Choose language',
6
+ chooseTargetLanguage: 'Choose a target language.',
7
+ connectExisting: 'Connect existing',
8
+ createOrConnectDocuments: 'Create or connect separate localized documents.',
9
+ createTranslation: 'Create translation',
10
+ createTranslationFor: 'Create {{language}} translation',
11
+ current: 'Current',
12
+ disconnectDocument: 'Disconnect this document',
13
+ documentID: 'Document ID',
14
+ editTranslationFor: 'Edit {{language}} translation',
15
+ existingDocumentID: 'Existing document ID',
16
+ language: 'Language',
17
+ linkedDocuments: 'Linked documents',
18
+ localized: 'Localized',
19
+ localizedContent: 'Localized content',
20
+ missing: 'Missing',
21
+ saveBeforeAddingTranslations: 'Save before adding translations.',
22
+ saveBeforeCreatingTranslations: 'Save the document before creating translations.',
23
+ saveBeforeManagingTranslations: 'Save the document before managing translations.',
24
+ targetIDAndLanguageRequired: 'Target ID and language are required.',
25
+ translationActions: 'Translation actions',
26
+ translationConnected: 'Translation connected.',
27
+ translationCouldNotBeConnected: 'Translation could not be connected.',
28
+ translationCouldNotBeCreated: 'Translation could not be created.',
29
+ translationCouldNotBeDisconnected: 'Translation could not be disconnected.',
30
+ translationDisconnected: 'Translation disconnected.',
31
+ translations: 'Translations',
32
+ unassigned: 'Unassigned',
33
+ unassignedStoredLanguageNotConfigured: 'Unassigned; stored language "{{language}}" is not configured'
34
+ }
35
+ },
36
+ uk: {
37
+ payloadMultilang: {
38
+ allLanguages: 'Усі мови',
39
+ chooseLanguage: 'Оберіть мову',
40
+ chooseTargetLanguage: 'Оберіть цільову мову.',
41
+ connectExisting: 'Підключити наявний',
42
+ createOrConnectDocuments: 'Створюйте або підключайте окремі локалізовані документи.',
43
+ createTranslation: 'Створити переклад',
44
+ createTranslationFor: 'Створити переклад: {{language}}',
45
+ current: 'Поточний',
46
+ disconnectDocument: 'Від’єднати цей документ',
47
+ documentID: 'ID документа',
48
+ editTranslationFor: 'Редагувати переклад: {{language}}',
49
+ existingDocumentID: 'ID наявного документа',
50
+ language: 'Мова',
51
+ linkedDocuments: 'Пов’язані документи',
52
+ localized: 'Локалізовано',
53
+ localizedContent: 'Локалізований вміст',
54
+ missing: 'Відсутній',
55
+ saveBeforeAddingTranslations: 'Збережіть перед додаванням перекладів.',
56
+ saveBeforeCreatingTranslations: 'Збережіть документ перед створенням перекладів.',
57
+ saveBeforeManagingTranslations: 'Збережіть документ перед керуванням перекладами.',
58
+ targetIDAndLanguageRequired: 'Потрібні ID цільового документа та мова.',
59
+ translationActions: 'Дії з перекладами',
60
+ translationConnected: 'Переклад підключено.',
61
+ translationCouldNotBeConnected: 'Не вдалося підключити переклад.',
62
+ translationCouldNotBeCreated: 'Не вдалося створити переклад.',
63
+ translationCouldNotBeDisconnected: 'Не вдалося від’єднати переклад.',
64
+ translationDisconnected: 'Переклад від’єднано.',
65
+ translations: 'Переклади',
66
+ unassigned: 'Не призначено',
67
+ unassignedStoredLanguageNotConfigured: 'Не призначено; збережена мова "{{language}}" не налаштована'
68
+ }
69
+ }
70
+ };
71
+
72
+ //# sourceMappingURL=translations.js.map