@extravirgin/payload-enchants-translator 1.0.8 → 1.1.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.
Files changed (59) hide show
  1. package/README.md +173 -20
  2. package/dist/client/components/GlossaryControls/index.d.ts +4 -0
  3. package/dist/client/components/GlossaryControls/index.d.ts.map +1 -0
  4. package/dist/client/components/GlossaryControls/index.js +43 -0
  5. package/dist/client/components/GlossaryControls/index.js.map +1 -0
  6. package/dist/client/providers/Translator/TranslatorProvider.d.ts.map +1 -1
  7. package/dist/client/providers/Translator/TranslatorProvider.js +2 -1
  8. package/dist/client/providers/Translator/TranslatorProvider.js.map +1 -1
  9. package/dist/exports/client.d.ts +1 -0
  10. package/dist/exports/client.d.ts.map +1 -1
  11. package/dist/exports/client.js +1 -0
  12. package/dist/exports/client.js.map +1 -1
  13. package/dist/glossary.d.ts +17 -0
  14. package/dist/glossary.d.ts.map +1 -0
  15. package/dist/glossary.js +52 -0
  16. package/dist/glossary.js.map +1 -0
  17. package/dist/glossaryCollection.d.ts +5 -0
  18. package/dist/glossaryCollection.d.ts.map +1 -0
  19. package/dist/glossaryCollection.js +114 -0
  20. package/dist/glossaryCollection.js.map +1 -0
  21. package/dist/i18n-translations.d.ts +84 -0
  22. package/dist/i18n-translations.d.ts.map +1 -1
  23. package/dist/i18n-translations.js +83 -0
  24. package/dist/i18n-translations.js.map +1 -1
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +53 -8
  28. package/dist/index.js.map +1 -1
  29. package/dist/resolvers/deepl.d.ts +12 -0
  30. package/dist/resolvers/deepl.d.ts.map +1 -0
  31. package/dist/resolvers/deepl.js +82 -0
  32. package/dist/resolvers/deepl.js.map +1 -0
  33. package/dist/resolvers/deeplGlossary.d.ts +19 -0
  34. package/dist/resolvers/deeplGlossary.d.ts.map +1 -0
  35. package/dist/resolvers/deeplGlossary.js +117 -0
  36. package/dist/resolvers/deeplGlossary.js.map +1 -0
  37. package/dist/resolvers/types.d.ts +3 -0
  38. package/dist/resolvers/types.d.ts.map +1 -1
  39. package/dist/resolvers/types.js.map +1 -1
  40. package/dist/translate/endpoint.d.ts.map +1 -1
  41. package/dist/translate/endpoint.js +2 -1
  42. package/dist/translate/endpoint.js.map +1 -1
  43. package/dist/translate/findEntityWithConfig.d.ts.map +1 -1
  44. package/dist/translate/findEntityWithConfig.js +4 -3
  45. package/dist/translate/findEntityWithConfig.js.map +1 -1
  46. package/dist/translate/operation.d.ts.map +1 -1
  47. package/dist/translate/operation.js +4 -1
  48. package/dist/translate/operation.js.map +1 -1
  49. package/dist/translate/traverseFields.d.ts.map +1 -1
  50. package/dist/translate/traverseFields.js +13 -0
  51. package/dist/translate/traverseFields.js.map +1 -1
  52. package/dist/translate/updateEntity.d.ts.map +1 -1
  53. package/dist/translate/updateEntity.js +3 -2
  54. package/dist/translate/updateEntity.js.map +1 -1
  55. package/dist/types.d.ts +10 -8
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/types.js.map +1 -1
  58. package/package.json +25 -12
  59. package/LICENSE +0 -21
@@ -0,0 +1,82 @@
1
+ import { chunkArray } from '../utils/chunkArray';
2
+ const hasSpecialUnicodeCharacters = (text)=>/[\u0300-\u036f\u0336]/.test(text);
3
+ export const deeplResolver = ({ apiKey, chunkLength = 100, glossary, glossaryId: configuredGlossaryId, sourceLocaleMap = {}, targetLocaleMap = {} })=>{
4
+ if (!Number.isInteger(chunkLength) || chunkLength < 1) {
5
+ throw new Error('DeepL chunkLength must be a positive integer.');
6
+ }
7
+ const glossaryId = configuredGlossaryId?.trim() || undefined;
8
+ if (glossaryId && !glossary) {
9
+ throw new Error('DeepL glossary options require glossary configuration.');
10
+ }
11
+ return {
12
+ ...glossary ? {
13
+ glossary: {
14
+ sync: async (req, entry)=>{
15
+ const { DeepLClient } = await import('deepl-node');
16
+ const { syncDeepLGlossary } = await import('./deeplGlossary');
17
+ return syncDeepLGlossary({
18
+ client: new DeepLClient(apiKey, {
19
+ maxRetries: 0,
20
+ minTimeout: 60000
21
+ }),
22
+ entry,
23
+ glossary,
24
+ glossaryId,
25
+ req,
26
+ sourceLocaleMap,
27
+ targetLocaleMap
28
+ });
29
+ }
30
+ }
31
+ } : {},
32
+ key: 'deepl',
33
+ resolve: async ({ localeFrom, localeTo, req, texts })=>{
34
+ if (!texts.some((text)=>text.trim())) {
35
+ return {
36
+ success: true,
37
+ translatedTexts: texts.map(()=>'')
38
+ };
39
+ }
40
+ // Optional peer dependency: other resolvers do not load the DeepL SDK.
41
+ const { DeepLClient } = await import('deepl-node');
42
+ const client = new DeepLClient(apiKey);
43
+ const sourceLang = sourceLocaleMap[localeFrom] ?? localeFrom;
44
+ const targetLang = targetLocaleMap[localeTo] ?? localeTo;
45
+ let translationGlossaryId;
46
+ if (glossary && localeFrom === glossary.sourceLocale && glossary.targetLocales.includes(localeTo)) {
47
+ const { getDeepLGlossaryId } = await import('./deeplGlossary');
48
+ translationGlossaryId = await getDeepLGlossaryId({
49
+ glossary,
50
+ glossaryId,
51
+ req,
52
+ sourceLocaleMap,
53
+ targetLocale: localeTo,
54
+ targetLocaleMap
55
+ });
56
+ }
57
+ const translatedTexts = [];
58
+ for (const batch of chunkArray(texts, chunkLength)){
59
+ const context = batch.filter((text)=>!hasSpecialUnicodeCharacters(text)).join(' ');
60
+ // Settle the batch before returning a result or propagating an error.
61
+ const results = await Promise.allSettled(batch.map((text)=>text.trim() ? client.translateText(text, sourceLang, targetLang, {
62
+ context,
63
+ glossary: translationGlossaryId,
64
+ modelType: hasSpecialUnicodeCharacters(text) ? 'latency_optimized' : 'prefer_quality_optimized',
65
+ tagHandling: 'html'
66
+ }) : Promise.resolve({
67
+ text: ''
68
+ })));
69
+ for (const result of results){
70
+ if (result.status === 'rejected') throw result.reason;
71
+ translatedTexts.push(result.value.text);
72
+ }
73
+ }
74
+ return {
75
+ success: true,
76
+ translatedTexts
77
+ };
78
+ }
79
+ };
80
+ };
81
+
82
+ //# sourceMappingURL=deepl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/resolvers/deepl.ts"],"sourcesContent":["import type { SourceLanguageCode, TargetLanguageCode } from 'deepl-node';\n\nimport type { GlossaryConfig } from '../glossary';\nimport { chunkArray } from '../utils/chunkArray';\nimport type { TranslateResolver } from './types';\n\nexport type DeepLResolverConfig = {\n apiKey: string;\n chunkLength?: number;\n glossary?: GlossaryConfig;\n glossaryId?: string;\n sourceLocaleMap?: Record<string, string>;\n targetLocaleMap?: Record<string, string>;\n};\n\nconst hasSpecialUnicodeCharacters = (text: string) => /[\\u0300-\\u036f\\u0336]/.test(text);\n\nexport const deeplResolver = ({\n apiKey,\n chunkLength = 100,\n glossary,\n glossaryId: configuredGlossaryId,\n sourceLocaleMap = {},\n targetLocaleMap = {},\n}: DeepLResolverConfig): TranslateResolver => {\n if (!Number.isInteger(chunkLength) || chunkLength < 1) {\n throw new Error('DeepL chunkLength must be a positive integer.');\n }\n\n const glossaryId = configuredGlossaryId?.trim() || undefined;\n\n if (glossaryId && !glossary) {\n throw new Error('DeepL glossary options require glossary configuration.');\n }\n\n return {\n ...(glossary\n ? {\n glossary: {\n sync: async (req, entry) => {\n const { DeepLClient } = await import('deepl-node');\n\n const { syncDeepLGlossary } = await import('./deeplGlossary');\n\n return syncDeepLGlossary({\n client: new DeepLClient(apiKey, { maxRetries: 0, minTimeout: 60000 }),\n entry,\n glossary,\n glossaryId,\n req,\n sourceLocaleMap,\n targetLocaleMap,\n });\n },\n },\n }\n : {}),\n key: 'deepl',\n resolve: async ({ localeFrom, localeTo, req, texts }) => {\n if (!texts.some((text) => text.trim())) {\n return { success: true, translatedTexts: texts.map(() => '') };\n }\n\n // Optional peer dependency: other resolvers do not load the DeepL SDK.\n const { DeepLClient } = await import('deepl-node');\n\n const client = new DeepLClient(apiKey);\n\n const sourceLang = (sourceLocaleMap[localeFrom] ?? localeFrom) as SourceLanguageCode;\n\n const targetLang = (targetLocaleMap[localeTo] ?? localeTo) as TargetLanguageCode;\n\n let translationGlossaryId: string | undefined;\n\n if (\n glossary &&\n localeFrom === glossary.sourceLocale &&\n glossary.targetLocales.includes(localeTo)\n ) {\n const { getDeepLGlossaryId } = await import('./deeplGlossary');\n\n translationGlossaryId = await getDeepLGlossaryId({\n glossary,\n glossaryId,\n req,\n sourceLocaleMap,\n targetLocale: localeTo,\n targetLocaleMap,\n });\n }\n\n const translatedTexts: string[] = [];\n\n for (const batch of chunkArray(texts, chunkLength)) {\n const context = batch.filter((text) => !hasSpecialUnicodeCharacters(text)).join(' ');\n\n // Settle the batch before returning a result or propagating an error.\n const results = await Promise.allSettled(\n batch.map((text) =>\n text.trim()\n ? client.translateText(text, sourceLang, targetLang, {\n context,\n glossary: translationGlossaryId,\n modelType: hasSpecialUnicodeCharacters(text)\n ? 'latency_optimized'\n : 'prefer_quality_optimized',\n tagHandling: 'html',\n })\n : Promise.resolve({ text: '' }),\n ),\n );\n\n for (const result of results) {\n if (result.status === 'rejected') throw result.reason;\n translatedTexts.push(result.value.text);\n }\n }\n\n return { success: true, translatedTexts };\n },\n };\n};\n"],"names":["chunkArray","hasSpecialUnicodeCharacters","text","test","deeplResolver","apiKey","chunkLength","glossary","glossaryId","configuredGlossaryId","sourceLocaleMap","targetLocaleMap","Number","isInteger","Error","trim","undefined","sync","req","entry","DeepLClient","syncDeepLGlossary","client","maxRetries","minTimeout","key","resolve","localeFrom","localeTo","texts","some","success","translatedTexts","map","sourceLang","targetLang","translationGlossaryId","sourceLocale","targetLocales","includes","getDeepLGlossaryId","targetLocale","batch","context","filter","join","results","Promise","allSettled","translateText","modelType","tagHandling","result","status","reason","push","value"],"mappings":"AAGA,SAASA,UAAU,QAAQ,sBAAsB;AAYjD,MAAMC,8BAA8B,CAACC,OAAiB,wBAAwBC,IAAI,CAACD;AAEnF,OAAO,MAAME,gBAAgB,CAAC,EAC5BC,MAAM,EACNC,cAAc,GAAG,EACjBC,QAAQ,EACRC,YAAYC,oBAAoB,EAChCC,kBAAkB,CAAC,CAAC,EACpBC,kBAAkB,CAAC,CAAC,EACA;IACpB,IAAI,CAACC,OAAOC,SAAS,CAACP,gBAAgBA,cAAc,GAAG;QACrD,MAAM,IAAIQ,MAAM;IAClB;IAEA,MAAMN,aAAaC,sBAAsBM,UAAUC;IAEnD,IAAIR,cAAc,CAACD,UAAU;QAC3B,MAAM,IAAIO,MAAM;IAClB;IAEA,OAAO;QACL,GAAIP,WACA;YACEA,UAAU;gBACRU,MAAM,OAAOC,KAAKC;oBAChB,MAAM,EAAEC,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC;oBAErC,MAAM,EAAEC,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC;oBAE3C,OAAOA,kBAAkB;wBACvBC,QAAQ,IAAIF,YAAYf,QAAQ;4BAAEkB,YAAY;4BAAGC,YAAY;wBAAM;wBACnEL;wBACAZ;wBACAC;wBACAU;wBACAR;wBACAC;oBACF;gBACF;YACF;QACF,IACA,CAAC,CAAC;QACNc,KAAK;QACLC,SAAS,OAAO,EAAEC,UAAU,EAAEC,QAAQ,EAAEV,GAAG,EAAEW,KAAK,EAAE;YAClD,IAAI,CAACA,MAAMC,IAAI,CAAC,CAAC5B,OAASA,KAAKa,IAAI,KAAK;gBACtC,OAAO;oBAAEgB,SAAS;oBAAMC,iBAAiBH,MAAMI,GAAG,CAAC,IAAM;gBAAI;YAC/D;YAEA,uEAAuE;YACvE,MAAM,EAAEb,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC;YAErC,MAAME,SAAS,IAAIF,YAAYf;YAE/B,MAAM6B,aAAcxB,eAAe,CAACiB,WAAW,IAAIA;YAEnD,MAAMQ,aAAcxB,eAAe,CAACiB,SAAS,IAAIA;YAEjD,IAAIQ;YAEJ,IACE7B,YACAoB,eAAepB,SAAS8B,YAAY,IACpC9B,SAAS+B,aAAa,CAACC,QAAQ,CAACX,WAChC;gBACA,MAAM,EAAEY,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC;gBAE5CJ,wBAAwB,MAAMI,mBAAmB;oBAC/CjC;oBACAC;oBACAU;oBACAR;oBACA+B,cAAcb;oBACdjB;gBACF;YACF;YAEA,MAAMqB,kBAA4B,EAAE;YAEpC,KAAK,MAAMU,SAAS1C,WAAW6B,OAAOvB,aAAc;gBAClD,MAAMqC,UAAUD,MAAME,MAAM,CAAC,CAAC1C,OAAS,CAACD,4BAA4BC,OAAO2C,IAAI,CAAC;gBAEhF,sEAAsE;gBACtE,MAAMC,UAAU,MAAMC,QAAQC,UAAU,CACtCN,MAAMT,GAAG,CAAC,CAAC/B,OACTA,KAAKa,IAAI,KACLO,OAAO2B,aAAa,CAAC/C,MAAMgC,YAAYC,YAAY;wBACjDQ;wBACApC,UAAU6B;wBACVc,WAAWjD,4BAA4BC,QACnC,sBACA;wBACJiD,aAAa;oBACf,KACAJ,QAAQrB,OAAO,CAAC;wBAAExB,MAAM;oBAAG;gBAInC,KAAK,MAAMkD,UAAUN,QAAS;oBAC5B,IAAIM,OAAOC,MAAM,KAAK,YAAY,MAAMD,OAAOE,MAAM;oBACrDtB,gBAAgBuB,IAAI,CAACH,OAAOI,KAAK,CAACtD,IAAI;gBACxC;YACF;YAEA,OAAO;gBAAE6B,SAAS;gBAAMC;YAAgB;QAC1C;IACF;AACF,EAAE"}
@@ -0,0 +1,19 @@
1
+ import type { DeepLClient } from 'deepl-node';
2
+ import type { PayloadRequest } from 'payload';
3
+ import type { GlossaryConfig } from '../glossary';
4
+ type Options = {
5
+ glossary: GlossaryConfig;
6
+ glossaryId?: string;
7
+ req: PayloadRequest;
8
+ sourceLocaleMap?: Record<string, string>;
9
+ targetLocaleMap?: Record<string, string>;
10
+ };
11
+ export declare const getDeepLGlossaryId: (options: {
12
+ targetLocale: string;
13
+ } & Options) => Promise<string | undefined>;
14
+ export declare const syncDeepLGlossary: (options: {
15
+ client: DeepLClient;
16
+ entry?: Record<string, string>;
17
+ } & Options) => Promise<void>;
18
+ export {};
19
+ //# sourceMappingURL=deeplGlossary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deeplGlossary.d.ts","sourceRoot":"","sources":["../../src/resolvers/deeplGlossary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,KAAK,OAAO,GAAG;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,cAAc,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C,CAAC;AAcF,eAAO,MAAM,kBAAkB,YAAmB;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,gCAqBnF,CAAC;AAGF,eAAO,MAAM,iBAAiB,YACnB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,OAAO,KACzE,OAAO,CAAC,IAAI,CAwFd,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { GlossaryEntries } from 'deepl-node';
2
+ import { APIError } from 'payload';
3
+ import { validateGlossaryEntries } from '../glossary';
4
+ import { getGlossaryEntriesSlug } from '../glossaryCollection';
5
+ import { translatorT } from '../i18n-translations';
6
+ const language = (locale)=>locale.toLowerCase().split('-')[0];
7
+ const requireAccess = async ({ glossary, req }, write = false)=>{
8
+ if (await glossary.access.read({
9
+ req
10
+ }) !== true || write && await glossary.access.update({
11
+ req
12
+ }) !== true) {
13
+ throw new APIError(translatorT(req.t, 'glossary_accessDenied'), 403, undefined, true);
14
+ }
15
+ };
16
+ // An omitted target translation does not require a DeepL dictionary.
17
+ export const getDeepLGlossaryId = async (options)=>{
18
+ await requireAccess(options);
19
+ const { glossary, glossaryId, req, targetLocale } = options;
20
+ const result = await req.payload.find({
21
+ collection: getGlossaryEntriesSlug(glossary),
22
+ depth: 0,
23
+ limit: 1,
24
+ overrideAccess: false,
25
+ req,
26
+ select: {
27
+ [targetLocale]: true
28
+ },
29
+ where: {
30
+ and: [
31
+ {
32
+ [targetLocale]: {
33
+ exists: true
34
+ }
35
+ },
36
+ {
37
+ [targetLocale]: {
38
+ not_equals: ''
39
+ }
40
+ }
41
+ ]
42
+ }
43
+ });
44
+ if (!result.docs.length) return undefined;
45
+ if (!glossaryId) throw new APIError(translatorT(req.t, 'glossary_missingID'), 400, undefined, true);
46
+ return glossaryId;
47
+ };
48
+ // Entry saves merge one item. Only the manual action reads and replaces full dictionaries.
49
+ export const syncDeepLGlossary = async (options)=>{
50
+ await requireAccess(options, true);
51
+ const { client, entry, glossary, glossaryId, req } = options;
52
+ if (!glossaryId) throw new APIError(translatorT(req.t, 'glossary_missingID'), 400, undefined, true);
53
+ const sourceLangCode = language(options.sourceLocaleMap?.[glossary.sourceLocale] ?? glossary.sourceLocale);
54
+ const dictionaries = glossary.targetLocales.map((locale)=>({
55
+ entries: new GlossaryEntries(),
56
+ locale,
57
+ sourceLangCode,
58
+ targetLangCode: language(options.targetLocaleMap?.[locale] ?? locale)
59
+ }));
60
+ if (new Set(dictionaries.map((item)=>item.targetLangCode)).size !== dictionaries.length) {
61
+ throw new APIError(translatorT(req.t, 'glossary_distinctLanguages'), 400, undefined, true);
62
+ }
63
+ let bytes = 0;
64
+ const add = (doc)=>{
65
+ const validation = validateGlossaryEntries([
66
+ doc
67
+ ], glossary, req.t);
68
+ if (validation !== true) throw new APIError(validation, 400, undefined, true);
69
+ const source = doc[glossary.sourceLocale].trim();
70
+ for (const dictionary of dictionaries){
71
+ const target = doc[dictionary.locale]?.trim();
72
+ if (!target) continue;
73
+ bytes += Buffer.byteLength(`${source}\t${target}\n`, 'utf8');
74
+ if (bytes > 10 * 1024 * 1024) throw new APIError(translatorT(req.t, 'glossary_tooLarge'), 400, undefined, true);
75
+ dictionary.entries.add(source, target);
76
+ }
77
+ };
78
+ if (entry) {
79
+ add(entry);
80
+ for (const dictionary of dictionaries){
81
+ if (Object.keys(dictionary.entries.entries()).length) {
82
+ await client.updateMultilingualGlossaryDictionary(glossaryId, dictionary);
83
+ }
84
+ }
85
+ return;
86
+ }
87
+ for(let page = 1;; page++){
88
+ const result = await req.payload.find({
89
+ collection: getGlossaryEntriesSlug(glossary),
90
+ depth: 0,
91
+ limit: 1000,
92
+ overrideAccess: false,
93
+ page,
94
+ req,
95
+ select: Object.fromEntries([
96
+ glossary.sourceLocale,
97
+ ...glossary.targetLocales
98
+ ].map((locale)=>[
99
+ locale,
100
+ true
101
+ ])),
102
+ sort: 'sourceKey'
103
+ });
104
+ for (const doc of result.docs)add(doc);
105
+ if (!result.hasNextPage) break;
106
+ }
107
+ const remote = await client.getMultilingualGlossary(glossaryId);
108
+ for (const dictionary of dictionaries){
109
+ if (Object.keys(dictionary.entries.entries()).length) {
110
+ await client.replaceMultilingualGlossaryDictionary(glossaryId, dictionary);
111
+ } else if (remote.dictionaries.some((item)=>language(item.sourceLangCode) === sourceLangCode && language(item.targetLangCode) === dictionary.targetLangCode)) {
112
+ await client.deleteMultilingualGlossaryDictionary(glossaryId, sourceLangCode, dictionary.targetLangCode);
113
+ }
114
+ }
115
+ };
116
+
117
+ //# sourceMappingURL=deeplGlossary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/resolvers/deeplGlossary.ts"],"sourcesContent":["import type { DeepLClient } from 'deepl-node';\nimport { GlossaryEntries } from 'deepl-node';\nimport type { CollectionSlug, PayloadRequest } from 'payload';\nimport { APIError } from 'payload';\n\nimport type { GlossaryConfig } from '../glossary';\nimport { validateGlossaryEntries } from '../glossary';\nimport { getGlossaryEntriesSlug } from '../glossaryCollection';\nimport { translatorT } from '../i18n-translations';\n\ntype Options = {\n glossary: GlossaryConfig;\n glossaryId?: string;\n req: PayloadRequest;\n sourceLocaleMap?: Record<string, string>;\n targetLocaleMap?: Record<string, string>;\n};\n\nconst language = (locale: string) => locale.toLowerCase().split('-')[0];\n\nconst requireAccess = async ({ glossary, req }: Options, write = false) => {\n if (\n (await glossary.access.read({ req })) !== true ||\n (write && (await glossary.access.update({ req })) !== true)\n ) {\n throw new APIError(translatorT(req.t, 'glossary_accessDenied'), 403, undefined, true);\n }\n};\n\n// An omitted target translation does not require a DeepL dictionary.\nexport const getDeepLGlossaryId = async (options: { targetLocale: string } & Options) => {\n await requireAccess(options);\n const { glossary, glossaryId, req, targetLocale } = options;\n\n const result = await req.payload.find({\n collection: getGlossaryEntriesSlug(glossary) as CollectionSlug,\n depth: 0,\n limit: 1,\n overrideAccess: false,\n req,\n select: { [targetLocale]: true },\n where: {\n and: [{ [targetLocale]: { exists: true } }, { [targetLocale]: { not_equals: '' } }],\n },\n });\n\n if (!result.docs.length) return undefined;\n if (!glossaryId)\n throw new APIError(translatorT(req.t, 'glossary_missingID'), 400, undefined, true);\n\n return glossaryId;\n};\n\n// Entry saves merge one item. Only the manual action reads and replaces full dictionaries.\nexport const syncDeepLGlossary = async (\n options: { client: DeepLClient; entry?: Record<string, string> } & Options,\n): Promise<void> => {\n await requireAccess(options, true);\n const { client, entry, glossary, glossaryId, req } = options;\n\n if (!glossaryId)\n throw new APIError(translatorT(req.t, 'glossary_missingID'), 400, undefined, true);\n\n const sourceLangCode = language(\n options.sourceLocaleMap?.[glossary.sourceLocale] ?? glossary.sourceLocale,\n );\n\n const dictionaries = glossary.targetLocales.map((locale) => ({\n entries: new GlossaryEntries(),\n locale,\n sourceLangCode,\n targetLangCode: language(options.targetLocaleMap?.[locale] ?? locale),\n }));\n\n if (new Set(dictionaries.map((item) => item.targetLangCode)).size !== dictionaries.length) {\n throw new APIError(translatorT(req.t, 'glossary_distinctLanguages'), 400, undefined, true);\n }\n let bytes = 0;\n\n const add = (doc: Record<string, string>) => {\n const validation = validateGlossaryEntries([doc], glossary, req.t);\n\n if (validation !== true) throw new APIError(validation, 400, undefined, true);\n const source = doc[glossary.sourceLocale].trim();\n\n for (const dictionary of dictionaries) {\n const target = doc[dictionary.locale]?.trim();\n\n if (!target) continue;\n bytes += Buffer.byteLength(`${source}\\t${target}\\n`, 'utf8');\n if (bytes > 10 * 1024 * 1024)\n throw new APIError(translatorT(req.t, 'glossary_tooLarge'), 400, undefined, true);\n dictionary.entries.add(source, target);\n }\n };\n\n if (entry) {\n add(entry);\n for (const dictionary of dictionaries) {\n if (Object.keys(dictionary.entries.entries()).length) {\n await client.updateMultilingualGlossaryDictionary(glossaryId, dictionary);\n }\n }\n\n return;\n }\n\n for (let page = 1; ; page++) {\n const result = await req.payload.find({\n collection: getGlossaryEntriesSlug(glossary) as CollectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: false,\n page,\n req,\n select: Object.fromEntries(\n [glossary.sourceLocale, ...glossary.targetLocales].map((locale) => [locale, true]),\n ),\n sort: 'sourceKey',\n });\n\n for (const doc of result.docs) add(doc as unknown as Record<string, string>);\n if (!result.hasNextPage) break;\n }\n\n const remote = await client.getMultilingualGlossary(glossaryId);\n\n for (const dictionary of dictionaries) {\n if (Object.keys(dictionary.entries.entries()).length) {\n await client.replaceMultilingualGlossaryDictionary(glossaryId, dictionary);\n } else if (\n remote.dictionaries.some(\n (item) =>\n language(item.sourceLangCode) === sourceLangCode &&\n language(item.targetLangCode) === dictionary.targetLangCode,\n )\n ) {\n await client.deleteMultilingualGlossaryDictionary(\n glossaryId,\n sourceLangCode,\n dictionary.targetLangCode,\n );\n }\n }\n};\n"],"names":["GlossaryEntries","APIError","validateGlossaryEntries","getGlossaryEntriesSlug","translatorT","language","locale","toLowerCase","split","requireAccess","glossary","req","write","access","read","update","t","undefined","getDeepLGlossaryId","options","glossaryId","targetLocale","result","payload","find","collection","depth","limit","overrideAccess","select","where","and","exists","not_equals","docs","length","syncDeepLGlossary","client","entry","sourceLangCode","sourceLocaleMap","sourceLocale","dictionaries","targetLocales","map","entries","targetLangCode","targetLocaleMap","Set","item","size","bytes","add","doc","validation","source","trim","dictionary","target","Buffer","byteLength","Object","keys","updateMultilingualGlossaryDictionary","page","fromEntries","sort","hasNextPage","remote","getMultilingualGlossary","replaceMultilingualGlossaryDictionary","some","deleteMultilingualGlossaryDictionary"],"mappings":"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"}
@@ -14,6 +14,9 @@ export type TranslateResolverResponse = {
14
14
  translatedTexts: string[];
15
15
  };
16
16
  export type TranslateResolver = {
17
+ glossary?: {
18
+ sync: (req: PayloadRequest, entry?: Record<string, string>) => Promise<void>;
19
+ };
17
20
  key: string;
18
21
  resolve: (args: TranslateResolverArgs) => Promise<TranslateResolverResponse> | TranslateResolverResponse;
19
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resolvers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,qBAAqB,GAAG;IAClC,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC;IACE,OAAO,EAAE,KAAK,CAAC;CAChB,GACD;IACE,OAAO,EAAE,IAAI,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEN,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CACP,IAAI,EAAE,qBAAqB,KACxB,OAAO,CAAC,yBAAyB,CAAC,GAAG,yBAAyB,CAAC;CACrE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resolvers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,qBAAqB,GAAG;IAClC,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC;IACE,OAAO,EAAE,KAAK,CAAC;CAChB,GACD;IACE,OAAO,EAAE,IAAI,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEN,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9E,CAAC;IACF,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CACP,IAAI,EAAE,qBAAqB,KACxB,OAAO,CAAC,yBAAyB,CAAC,GAAG,yBAAyB,CAAC;CACrE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/resolvers/types.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload';\n\nexport type TranslateResolverArgs = {\n /** Locale to translate from */\n localeFrom: string;\n /** Locale to translate to */\n localeTo: string;\n req: PayloadRequest;\n texts: string[];\n};\n\nexport type TranslateResolverResponse =\n | {\n success: false;\n }\n | {\n success: true;\n translatedTexts: string[];\n };\n\nexport type TranslateResolver = {\n key: string;\n resolve: (\n args: TranslateResolverArgs,\n ) => Promise<TranslateResolverResponse> | TranslateResolverResponse;\n};\n"],"names":[],"mappings":"AAoBA,WAKE"}
1
+ {"version":3,"sources":["../../src/resolvers/types.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload';\n\nexport type TranslateResolverArgs = {\n /** Locale to translate from */\n localeFrom: string;\n /** Locale to translate to */\n localeTo: string;\n req: PayloadRequest;\n texts: string[];\n};\n\nexport type TranslateResolverResponse =\n | {\n success: false;\n }\n | {\n success: true;\n translatedTexts: string[];\n };\n\nexport type TranslateResolver = {\n glossary?: {\n sync: (req: PayloadRequest, entry?: Record<string, string>) => Promise<void>;\n };\n key: string;\n resolve: (\n args: TranslateResolverArgs,\n ) => Promise<TranslateResolverResponse> | TranslateResolverResponse;\n};\n"],"names":[],"mappings":"AAoBA,WAQE"}
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../src/translate/endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAM9C,eAAO,MAAM,iBAAiB,EAAE,cAsB/B,CAAC"}
1
+ {"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../src/translate/endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO9C,eAAO,MAAM,iBAAiB,EAAE,cAsB/B,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { APIError } from 'payload';
2
+ import { translatorT } from '../i18n-translations';
2
3
  import { translateOperation } from './operation';
3
4
  export const translateEndpoint = async (req)=>{
4
- if (!req.json) throw new APIError('Content-Type should be json');
5
+ if (!req.json) throw new APIError(translatorT(req.t, 'error_jsonRequired'));
5
6
  const args = await req.json();
6
7
  const { collectionSlug, data, emptyOnly, globalSlug, id, locale, localeFrom, resolver } = args;
7
8
  const result = await translateOperation({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/translate/endpoint.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload';\nimport { APIError } from 'payload';\n\nimport { translateOperation } from './operation';\nimport type { TranslateEndpointArgs } from './types';\n\nexport const translateEndpoint: PayloadHandler = async (req) => {\n if (!req.json) throw new APIError('Content-Type should be json');\n\n const args: TranslateEndpointArgs = await req.json();\n\n const { collectionSlug, data, emptyOnly, globalSlug, id, locale, localeFrom, resolver } = args;\n\n const result = await translateOperation({\n collectionSlug,\n data,\n emptyOnly,\n globalSlug,\n id,\n locale,\n localeFrom,\n overrideAccess: false,\n req,\n resolver,\n update: false,\n });\n\n return Response.json(result);\n};\n"],"names":["APIError","translateOperation","translateEndpoint","req","json","args","collectionSlug","data","emptyOnly","globalSlug","id","locale","localeFrom","resolver","result","overrideAccess","update","Response"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAU;AAEnC,SAASC,kBAAkB,QAAQ,cAAc;AAGjD,OAAO,MAAMC,oBAAoC,OAAOC;IACtD,IAAI,CAACA,IAAIC,IAAI,EAAE,MAAM,IAAIJ,SAAS;IAElC,MAAMK,OAA8B,MAAMF,IAAIC,IAAI;IAElD,MAAM,EAAEE,cAAc,EAAEC,IAAI,EAAEC,SAAS,EAAEC,UAAU,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,QAAQ,EAAE,GAAGR;IAE1F,MAAMS,SAAS,MAAMb,mBAAmB;QACtCK;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAG,gBAAgB;QAChBZ;QACAU;QACAG,QAAQ;IACV;IAEA,OAAOC,SAASb,IAAI,CAACU;AACvB,EAAE"}
1
+ {"version":3,"sources":["../../src/translate/endpoint.ts"],"sourcesContent":["import type { PayloadHandler } from 'payload';\nimport { APIError } from 'payload';\n\nimport { translatorT } from '../i18n-translations';\nimport { translateOperation } from './operation';\nimport type { TranslateEndpointArgs } from './types';\n\nexport const translateEndpoint: PayloadHandler = async (req) => {\n if (!req.json) throw new APIError(translatorT(req.t, 'error_jsonRequired'));\n\n const args: TranslateEndpointArgs = await req.json();\n\n const { collectionSlug, data, emptyOnly, globalSlug, id, locale, localeFrom, resolver } = args;\n\n const result = await translateOperation({\n collectionSlug,\n data,\n emptyOnly,\n globalSlug,\n id,\n locale,\n localeFrom,\n overrideAccess: false,\n req,\n resolver,\n update: false,\n });\n\n return Response.json(result);\n};\n"],"names":["APIError","translatorT","translateOperation","translateEndpoint","req","json","t","args","collectionSlug","data","emptyOnly","globalSlug","id","locale","localeFrom","resolver","result","overrideAccess","update","Response"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAU;AAEnC,SAASC,WAAW,QAAQ,uBAAuB;AACnD,SAASC,kBAAkB,QAAQ,cAAc;AAGjD,OAAO,MAAMC,oBAAoC,OAAOC;IACtD,IAAI,CAACA,IAAIC,IAAI,EAAE,MAAM,IAAIL,SAASC,YAAYG,IAAIE,CAAC,EAAE;IAErD,MAAMC,OAA8B,MAAMH,IAAIC,IAAI;IAElD,MAAM,EAAEG,cAAc,EAAEC,IAAI,EAAEC,SAAS,EAAEC,UAAU,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,QAAQ,EAAE,GAAGR;IAE1F,MAAMS,SAAS,MAAMd,mBAAmB;QACtCM;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAG,gBAAgB;QAChBb;QACAW;QACAG,QAAQ;IACV;IAEA,OAAOC,SAASd,IAAI,CAACW;AACvB,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"findEntityWithConfig.d.ts","sourceRoot":"","sources":["../../src/translate/findEntityWithConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,UAAU,EACX,MAAM,SAAS,CAAC;AAGjB,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,cAAc,CAAC;CACrB,CAAC;AAOF,eAAO,MAAM,oBAAoB,SACzB,IAAI,KACT,OAAO,CAAC;IACT,MAAM,EAAE,yBAAyB,GAAG,qBAAqB,CAAC;IAC1D,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC;CAC3C,CA2CA,CAAC"}
1
+ {"version":3,"file":"findEntityWithConfig.d.ts","sourceRoot":"","sources":["../../src/translate/findEntityWithConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,UAAU,EACX,MAAM,SAAS,CAAC;AAGjB,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,cAAc,CAAC;CACrB,CAAC;AAOF,eAAO,MAAM,oBAAoB,SACzB,IAAI,KACT,OAAO,CAAC;IACT,MAAM,EAAE,yBAAyB,GAAG,qBAAqB,CAAC;IAC1D,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC;CAC3C,CA4CA,CAAC"}
@@ -1,14 +1,15 @@
1
+ import { translatorT } from '../i18n-translations';
1
2
  import { APIError } from 'payload';
2
3
  const findConfigBySlug = (slug, enities)=>enities.find((entity)=>entity.slug === slug);
3
4
  export const findEntityWithConfig = async (args)=>{
4
5
  const { collectionSlug, globalSlug, id, locale, overrideAccess, req } = args;
5
- if (!collectionSlug && !globalSlug) throw new APIError('Bad Request', 400);
6
+ if (!collectionSlug && !globalSlug) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
6
7
  const { payload } = req;
7
8
  const { config } = payload;
8
9
  const isGlobal = !!globalSlug;
9
- if (!isGlobal && !id) throw new APIError('Bad Request', 400);
10
+ if (!isGlobal && !id) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
10
11
  const entityConfig = isGlobal ? findConfigBySlug(globalSlug, config.globals) : findConfigBySlug(collectionSlug, config.collections);
11
- if (!entityConfig) throw new APIError('Bad Request', 400);
12
+ if (!entityConfig) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
12
13
  const docPromise = isGlobal ? payload.findGlobal({
13
14
  depth: 0,
14
15
  fallbackLocale: undefined,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/translate/findEntityWithConfig.ts"],"sourcesContent":["import type {\n CollectionSlug,\n GlobalSlug,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedGlobalConfig,\n TypeWithID,\n} from 'payload';\nimport { APIError } from 'payload';\n\ntype Args = {\n collectionSlug?: string;\n globalSlug?: string;\n id?: number | string;\n locale: string;\n overrideAccess?: boolean;\n req: PayloadRequest;\n};\n\nconst findConfigBySlug = (\n slug: string,\n enities: SanitizedCollectionConfig[] | SanitizedGlobalConfig[],\n) => enities.find((entity) => entity.slug === slug);\n\nexport const findEntityWithConfig = async (\n args: Args,\n): Promise<{\n config: SanitizedCollectionConfig | SanitizedGlobalConfig;\n doc: Record<string, unknown> & TypeWithID;\n}> => {\n const { collectionSlug, globalSlug, id, locale, overrideAccess, req } = args;\n\n if (!collectionSlug && !globalSlug) throw new APIError('Bad Request', 400);\n\n const { payload } = req;\n\n const { config } = payload;\n\n const isGlobal = !!globalSlug;\n\n if (!isGlobal && !id) throw new APIError('Bad Request', 400);\n\n const entityConfig = isGlobal\n ? findConfigBySlug(globalSlug, config.globals)\n : findConfigBySlug(collectionSlug as string, config.collections);\n\n if (!entityConfig) throw new APIError('Bad Request', 400);\n\n const docPromise = isGlobal\n ? payload.findGlobal({\n depth: 0,\n fallbackLocale: undefined,\n locale: locale as any,\n overrideAccess,\n req,\n slug: args.globalSlug as GlobalSlug,\n })\n : payload.findByID({\n collection: collectionSlug as CollectionSlug,\n depth: 0,\n fallbackLocale: undefined,\n id: id as number | string,\n locale: locale as any,\n overrideAccess,\n req,\n draft: true,\n });\n\n return {\n config: entityConfig,\n doc: (await docPromise) as any,\n };\n};\n"],"names":["APIError","findConfigBySlug","slug","enities","find","entity","findEntityWithConfig","args","collectionSlug","globalSlug","id","locale","overrideAccess","req","payload","config","isGlobal","entityConfig","globals","collections","docPromise","findGlobal","depth","fallbackLocale","undefined","findByID","collection","draft","doc"],"mappings":"AAQA,SAASA,QAAQ,QAAQ,UAAU;AAWnC,MAAMC,mBAAmB,CACvBC,MACAC,UACGA,QAAQC,IAAI,CAAC,CAACC,SAAWA,OAAOH,IAAI,KAAKA;AAE9C,OAAO,MAAMI,uBAAuB,OAClCC;IAKA,MAAM,EAAEC,cAAc,EAAEC,UAAU,EAAEC,EAAE,EAAEC,MAAM,EAAEC,cAAc,EAAEC,GAAG,EAAE,GAAGN;IAExE,IAAI,CAACC,kBAAkB,CAACC,YAAY,MAAM,IAAIT,SAAS,eAAe;IAEtE,MAAM,EAAEc,OAAO,EAAE,GAAGD;IAEpB,MAAM,EAAEE,MAAM,EAAE,GAAGD;IAEnB,MAAME,WAAW,CAAC,CAACP;IAEnB,IAAI,CAACO,YAAY,CAACN,IAAI,MAAM,IAAIV,SAAS,eAAe;IAExD,MAAMiB,eAAeD,WACjBf,iBAAiBQ,YAAYM,OAAOG,OAAO,IAC3CjB,iBAAiBO,gBAA0BO,OAAOI,WAAW;IAEjE,IAAI,CAACF,cAAc,MAAM,IAAIjB,SAAS,eAAe;IAErD,MAAMoB,aAAaJ,WACfF,QAAQO,UAAU,CAAC;QACjBC,OAAO;QACPC,gBAAgBC;QAChBb,QAAQA;QACRC;QACAC;QACAX,MAAMK,KAAKE,UAAU;IACvB,KACAK,QAAQW,QAAQ,CAAC;QACfC,YAAYlB;QACZc,OAAO;QACPC,gBAAgBC;QAChBd,IAAIA;QACJC,QAAQA;QACRC;QACAC;QACAc,OAAO;IACT;IAEJ,OAAO;QACLZ,QAAQE;QACRW,KAAM,MAAMR;IACd;AACF,EAAE"}
1
+ {"version":3,"sources":["../../src/translate/findEntityWithConfig.ts"],"sourcesContent":["import { translatorT } from '../i18n-translations';\nimport type {\n CollectionSlug,\n GlobalSlug,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedGlobalConfig,\n TypeWithID,\n} from 'payload';\nimport { APIError } from 'payload';\n\ntype Args = {\n collectionSlug?: string;\n globalSlug?: string;\n id?: number | string;\n locale: string;\n overrideAccess?: boolean;\n req: PayloadRequest;\n};\n\nconst findConfigBySlug = (\n slug: string,\n enities: SanitizedCollectionConfig[] | SanitizedGlobalConfig[],\n) => enities.find((entity) => entity.slug === slug);\n\nexport const findEntityWithConfig = async (\n args: Args,\n): Promise<{\n config: SanitizedCollectionConfig | SanitizedGlobalConfig;\n doc: Record<string, unknown> & TypeWithID;\n}> => {\n const { collectionSlug, globalSlug, id, locale, overrideAccess, req } = args;\n\n if (!collectionSlug && !globalSlug)\n throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const { payload } = req;\n\n const { config } = payload;\n\n const isGlobal = !!globalSlug;\n\n if (!isGlobal && !id) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const entityConfig = isGlobal\n ? findConfigBySlug(globalSlug, config.globals)\n : findConfigBySlug(collectionSlug as string, config.collections);\n\n if (!entityConfig) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const docPromise = isGlobal\n ? payload.findGlobal({\n depth: 0,\n fallbackLocale: undefined,\n locale: locale as any,\n overrideAccess,\n req,\n slug: args.globalSlug as GlobalSlug,\n })\n : payload.findByID({\n collection: collectionSlug as CollectionSlug,\n depth: 0,\n fallbackLocale: undefined,\n id: id as number | string,\n locale: locale as any,\n overrideAccess,\n req,\n draft: true,\n });\n\n return {\n config: entityConfig,\n doc: (await docPromise) as any,\n };\n};\n"],"names":["translatorT","APIError","findConfigBySlug","slug","enities","find","entity","findEntityWithConfig","args","collectionSlug","globalSlug","id","locale","overrideAccess","req","t","payload","config","isGlobal","entityConfig","globals","collections","docPromise","findGlobal","depth","fallbackLocale","undefined","findByID","collection","draft","doc"],"mappings":"AAAA,SAASA,WAAW,QAAQ,uBAAuB;AASnD,SAASC,QAAQ,QAAQ,UAAU;AAWnC,MAAMC,mBAAmB,CACvBC,MACAC,UACGA,QAAQC,IAAI,CAAC,CAACC,SAAWA,OAAOH,IAAI,KAAKA;AAE9C,OAAO,MAAMI,uBAAuB,OAClCC;IAKA,MAAM,EAAEC,cAAc,EAAEC,UAAU,EAAEC,EAAE,EAAEC,MAAM,EAAEC,cAAc,EAAEC,GAAG,EAAE,GAAGN;IAExE,IAAI,CAACC,kBAAkB,CAACC,YACtB,MAAM,IAAIT,SAASD,YAAYc,IAAIC,CAAC,EAAE,qBAAqB;IAE7D,MAAM,EAAEC,OAAO,EAAE,GAAGF;IAEpB,MAAM,EAAEG,MAAM,EAAE,GAAGD;IAEnB,MAAME,WAAW,CAAC,CAACR;IAEnB,IAAI,CAACQ,YAAY,CAACP,IAAI,MAAM,IAAIV,SAASD,YAAYc,IAAIC,CAAC,EAAE,qBAAqB;IAEjF,MAAMI,eAAeD,WACjBhB,iBAAiBQ,YAAYO,OAAOG,OAAO,IAC3ClB,iBAAiBO,gBAA0BQ,OAAOI,WAAW;IAEjE,IAAI,CAACF,cAAc,MAAM,IAAIlB,SAASD,YAAYc,IAAIC,CAAC,EAAE,qBAAqB;IAE9E,MAAMO,aAAaJ,WACfF,QAAQO,UAAU,CAAC;QACjBC,OAAO;QACPC,gBAAgBC;QAChBd,QAAQA;QACRC;QACAC;QACAX,MAAMK,KAAKE,UAAU;IACvB,KACAM,QAAQW,QAAQ,CAAC;QACfC,YAAYnB;QACZe,OAAO;QACPC,gBAAgBC;QAChBf,IAAIA;QACJC,QAAQA;QACRC;QACAC;QACAe,OAAO;IACT;IAEJ,OAAO;QACLZ,QAAQE;QACRW,KAAM,MAAMR;IACd;AACF,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/translate/operation.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAKtE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAGhF,MAAM,MAAM,sBAAsB,GAAG,CACjC;IACE,OAAO,EAAE,OAAO,CAAC;CAClB,GACD;IACE,GAAG,EAAE,cAAc,CAAC;CACrB,CACJ,GACC,aAAa,CAAC;AAEhB,eAAO,MAAM,kBAAkB,SAAgB,sBAAsB,6BAyFpE,CAAC"}
1
+ {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/translate/operation.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAMtE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAGhF,MAAM,MAAM,sBAAsB,GAAG,CACjC;IACE,OAAO,EAAE,OAAO,CAAC;CAClB,GACD;IACE,GAAG,EAAE,cAAc,CAAC;CACrB,CACJ,GACC,aAAa,CAAC;AAEhB,eAAO,MAAM,kBAAkB,SAAgB,sBAAsB,6BA0FpE,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import he from 'he';
2
2
  import { APIError } from 'payload';
3
+ import { translatorT } from '../i18n-translations';
3
4
  import { findEntityWithConfig } from './findEntityWithConfig';
4
5
  import { traverseFields } from './traverseFields';
5
6
  import { updateEntity } from './updateEntity';
@@ -16,7 +17,9 @@ export const translateOperation = async (args)=>{
16
17
  req
17
18
  });
18
19
  const resolver = (req.payload.config.custom?.translator?.resolvers ?? []).find((each)=>each.key === args.resolver);
19
- if (!resolver) throw new APIError(`Resolver with the key ${args.resolver} was not found`);
20
+ if (!resolver) throw new APIError(translatorT(req.t, 'error_missingResolver', {
21
+ resolver: args.resolver
22
+ }));
20
23
  const valuesToTranslate = [];
21
24
  let translatedData = args.data;
22
25
  if (!translatedData) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/translate/operation.ts"],"sourcesContent":["import he from 'he';\nimport { APIError, type Payload, type PayloadRequest } from 'payload';\n\nimport type { TranslateResolver } from '../resolvers/types';\nimport { findEntityWithConfig } from './findEntityWithConfig';\nimport { traverseFields } from './traverseFields';\nimport type { TranslateArgs, TranslateResult, ValueToTranslate } from './types';\nimport { updateEntity } from './updateEntity';\n\nexport type TranslateOperationArgs = (\n | {\n payload: Payload;\n }\n | {\n req: PayloadRequest;\n }\n) &\n TranslateArgs;\n\nexport const translateOperation = async (args: TranslateOperationArgs) => {\n const req: PayloadRequest =\n 'req' in args\n ? args.req\n : ({\n payload: args.payload,\n } as PayloadRequest);\n\n const { collectionSlug, globalSlug, id, locale, localeFrom, overrideAccess } = args;\n\n const { config, doc: dataFrom } = await findEntityWithConfig({\n collectionSlug,\n globalSlug,\n id,\n locale: localeFrom,\n req,\n });\n\n const resolver = (\n (req.payload.config.custom?.translator?.resolvers as TranslateResolver[]) ?? []\n ).find((each) => each.key === args.resolver);\n\n if (!resolver) throw new APIError(`Resolver with the key ${args.resolver} was not found`);\n\n const valuesToTranslate: ValueToTranslate[] = [];\n\n let translatedData = args.data;\n\n if (!translatedData) {\n const { doc } = await findEntityWithConfig({\n collectionSlug,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n });\n\n translatedData = doc;\n }\n\n traverseFields({\n dataFrom,\n emptyOnly: args.emptyOnly,\n fields: config.fields,\n translatedData,\n valuesToTranslate,\n });\n\n const resolveResult = await resolver.resolve({\n localeFrom: args.localeFrom,\n localeTo: args.locale,\n req,\n texts: valuesToTranslate.map((each) => each.value),\n });\n\n let result: TranslateResult;\n\n if (!resolveResult.success) {\n result = {\n success: false,\n };\n } else {\n resolveResult.translatedTexts.forEach((translated, index) => {\n const formattedValue = he.decode(translated);\n\n valuesToTranslate[index].onTranslate(formattedValue);\n });\n\n if (args.update) {\n await updateEntity({\n collectionSlug,\n data: translatedData,\n depth: 0,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n });\n }\n\n result = {\n success: true,\n translatedData,\n };\n }\n\n return result;\n};\n"],"names":["he","APIError","findEntityWithConfig","traverseFields","updateEntity","translateOperation","args","req","payload","collectionSlug","globalSlug","id","locale","localeFrom","overrideAccess","config","doc","dataFrom","resolver","custom","translator","resolvers","find","each","key","valuesToTranslate","translatedData","data","emptyOnly","fields","resolveResult","resolve","localeTo","texts","map","value","result","success","translatedTexts","forEach","translated","index","formattedValue","decode","onTranslate","update","depth"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,SAASC,QAAQ,QAA2C,UAAU;AAGtE,SAASC,oBAAoB,QAAQ,yBAAyB;AAC9D,SAASC,cAAc,QAAQ,mBAAmB;AAElD,SAASC,YAAY,QAAQ,iBAAiB;AAY9C,OAAO,MAAMC,qBAAqB,OAAOC;IACvC,MAAMC,MACJ,SAASD,OACLA,KAAKC,GAAG,GACP;QACCC,SAASF,KAAKE,OAAO;IACvB;IAEN,MAAM,EAAEC,cAAc,EAAEC,UAAU,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,cAAc,EAAE,GAAGR;IAE/E,MAAM,EAAES,MAAM,EAAEC,KAAKC,QAAQ,EAAE,GAAG,MAAMf,qBAAqB;QAC3DO;QACAC;QACAC;QACAC,QAAQC;QACRN;IACF;IAEA,MAAMW,WAAW,AACf,CAAA,AAACX,IAAIC,OAAO,CAACO,MAAM,CAACI,MAAM,EAAEC,YAAYC,aAAqC,EAAE,AAAD,EAC9EC,IAAI,CAAC,CAACC,OAASA,KAAKC,GAAG,KAAKlB,KAAKY,QAAQ;IAE3C,IAAI,CAACA,UAAU,MAAM,IAAIjB,SAAS,CAAC,sBAAsB,EAAEK,KAAKY,QAAQ,CAAC,cAAc,CAAC;IAExF,MAAMO,oBAAwC,EAAE;IAEhD,IAAIC,iBAAiBpB,KAAKqB,IAAI;IAE9B,IAAI,CAACD,gBAAgB;QACnB,MAAM,EAAEV,GAAG,EAAE,GAAG,MAAMd,qBAAqB;YACzCO;YACAC;YACAC;YACAC;YACAE;YACAP;QACF;QAEAmB,iBAAiBV;IACnB;IAEAb,eAAe;QACbc;QACAW,WAAWtB,KAAKsB,SAAS;QACzBC,QAAQd,OAAOc,MAAM;QACrBH;QACAD;IACF;IAEA,MAAMK,gBAAgB,MAAMZ,SAASa,OAAO,CAAC;QAC3ClB,YAAYP,KAAKO,UAAU;QAC3BmB,UAAU1B,KAAKM,MAAM;QACrBL;QACA0B,OAAOR,kBAAkBS,GAAG,CAAC,CAACX,OAASA,KAAKY,KAAK;IACnD;IAEA,IAAIC;IAEJ,IAAI,CAACN,cAAcO,OAAO,EAAE;QAC1BD,SAAS;YACPC,SAAS;QACX;IACF,OAAO;QACLP,cAAcQ,eAAe,CAACC,OAAO,CAAC,CAACC,YAAYC;YACjD,MAAMC,iBAAiB1C,GAAG2C,MAAM,CAACH;YAEjCf,iBAAiB,CAACgB,MAAM,CAACG,WAAW,CAACF;QACvC;QAEA,IAAIpC,KAAKuC,MAAM,EAAE;YACf,MAAMzC,aAAa;gBACjBK;gBACAkB,MAAMD;gBACNoB,OAAO;gBACPpC;gBACAC;gBACAC;gBACAE;gBACAP;YACF;QACF;QAEA6B,SAAS;YACPC,SAAS;YACTX;QACF;IACF;IAEA,OAAOU;AACT,EAAE"}
1
+ {"version":3,"sources":["../../src/translate/operation.ts"],"sourcesContent":["import he from 'he';\nimport { APIError, type Payload, type PayloadRequest } from 'payload';\n\nimport { translatorT } from '../i18n-translations';\nimport type { TranslateResolver } from '../resolvers/types';\nimport { findEntityWithConfig } from './findEntityWithConfig';\nimport { traverseFields } from './traverseFields';\nimport type { TranslateArgs, TranslateResult, ValueToTranslate } from './types';\nimport { updateEntity } from './updateEntity';\n\nexport type TranslateOperationArgs = (\n | {\n payload: Payload;\n }\n | {\n req: PayloadRequest;\n }\n) &\n TranslateArgs;\n\nexport const translateOperation = async (args: TranslateOperationArgs) => {\n const req: PayloadRequest =\n 'req' in args\n ? args.req\n : ({\n payload: args.payload,\n } as PayloadRequest);\n\n const { collectionSlug, globalSlug, id, locale, localeFrom, overrideAccess } = args;\n\n const { config, doc: dataFrom } = await findEntityWithConfig({\n collectionSlug,\n globalSlug,\n id,\n locale: localeFrom,\n req,\n });\n\n const resolver = (\n (req.payload.config.custom?.translator?.resolvers as TranslateResolver[]) ?? []\n ).find((each) => each.key === args.resolver);\n\n if (!resolver)\n throw new APIError(translatorT(req.t, 'error_missingResolver', { resolver: args.resolver }));\n\n const valuesToTranslate: ValueToTranslate[] = [];\n\n let translatedData = args.data;\n\n if (!translatedData) {\n const { doc } = await findEntityWithConfig({\n collectionSlug,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n });\n\n translatedData = doc;\n }\n\n traverseFields({\n dataFrom,\n emptyOnly: args.emptyOnly,\n fields: config.fields,\n translatedData,\n valuesToTranslate,\n });\n\n const resolveResult = await resolver.resolve({\n localeFrom: args.localeFrom,\n localeTo: args.locale,\n req,\n texts: valuesToTranslate.map((each) => each.value),\n });\n\n let result: TranslateResult;\n\n if (!resolveResult.success) {\n result = {\n success: false,\n };\n } else {\n resolveResult.translatedTexts.forEach((translated, index) => {\n const formattedValue = he.decode(translated);\n\n valuesToTranslate[index].onTranslate(formattedValue);\n });\n\n if (args.update) {\n await updateEntity({\n collectionSlug,\n data: translatedData,\n depth: 0,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n });\n }\n\n result = {\n success: true,\n translatedData,\n };\n }\n\n return result;\n};\n"],"names":["he","APIError","translatorT","findEntityWithConfig","traverseFields","updateEntity","translateOperation","args","req","payload","collectionSlug","globalSlug","id","locale","localeFrom","overrideAccess","config","doc","dataFrom","resolver","custom","translator","resolvers","find","each","key","t","valuesToTranslate","translatedData","data","emptyOnly","fields","resolveResult","resolve","localeTo","texts","map","value","result","success","translatedTexts","forEach","translated","index","formattedValue","decode","onTranslate","update","depth"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,SAASC,QAAQ,QAA2C,UAAU;AAEtE,SAASC,WAAW,QAAQ,uBAAuB;AAEnD,SAASC,oBAAoB,QAAQ,yBAAyB;AAC9D,SAASC,cAAc,QAAQ,mBAAmB;AAElD,SAASC,YAAY,QAAQ,iBAAiB;AAY9C,OAAO,MAAMC,qBAAqB,OAAOC;IACvC,MAAMC,MACJ,SAASD,OACLA,KAAKC,GAAG,GACP;QACCC,SAASF,KAAKE,OAAO;IACvB;IAEN,MAAM,EAAEC,cAAc,EAAEC,UAAU,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,cAAc,EAAE,GAAGR;IAE/E,MAAM,EAAES,MAAM,EAAEC,KAAKC,QAAQ,EAAE,GAAG,MAAMf,qBAAqB;QAC3DO;QACAC;QACAC;QACAC,QAAQC;QACRN;IACF;IAEA,MAAMW,WAAW,AACf,CAAA,AAACX,IAAIC,OAAO,CAACO,MAAM,CAACI,MAAM,EAAEC,YAAYC,aAAqC,EAAE,AAAD,EAC9EC,IAAI,CAAC,CAACC,OAASA,KAAKC,GAAG,KAAKlB,KAAKY,QAAQ;IAE3C,IAAI,CAACA,UACH,MAAM,IAAIlB,SAASC,YAAYM,IAAIkB,CAAC,EAAE,yBAAyB;QAAEP,UAAUZ,KAAKY,QAAQ;IAAC;IAE3F,MAAMQ,oBAAwC,EAAE;IAEhD,IAAIC,iBAAiBrB,KAAKsB,IAAI;IAE9B,IAAI,CAACD,gBAAgB;QACnB,MAAM,EAAEX,GAAG,EAAE,GAAG,MAAMd,qBAAqB;YACzCO;YACAC;YACAC;YACAC;YACAE;YACAP;QACF;QAEAoB,iBAAiBX;IACnB;IAEAb,eAAe;QACbc;QACAY,WAAWvB,KAAKuB,SAAS;QACzBC,QAAQf,OAAOe,MAAM;QACrBH;QACAD;IACF;IAEA,MAAMK,gBAAgB,MAAMb,SAASc,OAAO,CAAC;QAC3CnB,YAAYP,KAAKO,UAAU;QAC3BoB,UAAU3B,KAAKM,MAAM;QACrBL;QACA2B,OAAOR,kBAAkBS,GAAG,CAAC,CAACZ,OAASA,KAAKa,KAAK;IACnD;IAEA,IAAIC;IAEJ,IAAI,CAACN,cAAcO,OAAO,EAAE;QAC1BD,SAAS;YACPC,SAAS;QACX;IACF,OAAO;QACLP,cAAcQ,eAAe,CAACC,OAAO,CAAC,CAACC,YAAYC;YACjD,MAAMC,iBAAiB5C,GAAG6C,MAAM,CAACH;YAEjCf,iBAAiB,CAACgB,MAAM,CAACG,WAAW,CAACF;QACvC;QAEA,IAAIrC,KAAKwC,MAAM,EAAE;YACf,MAAM1C,aAAa;gBACjBK;gBACAmB,MAAMD;gBACNoB,OAAO;gBACPrC;gBACAC;gBACAC;gBACAE;gBACAP;YACF;QACF;QAEA8B,SAAS;YACPC,SAAS;YACTX;QACF;IACF;IAEA,OAAOU;AACT,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/translate/traverseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,eAAO,MAAM,cAAc,iIASxB;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC,SA+RA,CAAC"}
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/translate/traverseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,eAAO,MAAM,cAAc,iIASxB;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC,SA8SA,CAAC"}
@@ -27,6 +27,19 @@ export const traverseFields = ({ dataFrom, emptyOnly, fields, localizedParent, s
27
27
  break;
28
28
  case 'group':
29
29
  {
30
+ if (!('name' in field)) {
31
+ traverseFields({
32
+ dataFrom,
33
+ emptyOnly,
34
+ fields: field.fields,
35
+ localizedParent,
36
+ siblingDataFrom,
37
+ siblingDataTranslated,
38
+ translatedData,
39
+ valuesToTranslate
40
+ });
41
+ break;
42
+ }
30
43
  const groupDataFrom = siblingDataFrom[field.name];
31
44
  if (!groupDataFrom) break;
32
45
  let groupDataTranslated = siblingDataTranslated[field.name];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/translate/traverseFields.ts"],"sourcesContent":["import ObjectID from 'bson-objectid';\nimport type { Field } from 'payload';\nimport { tabHasName } from 'payload/shared';\n\nimport { isEmpty } from '../utils/isEmpty';\nimport { traverseRichText } from './traverseRichText';\nimport type { ValueToTranslate } from './types';\n\nexport const traverseFields = ({\n dataFrom,\n emptyOnly,\n fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n}: {\n dataFrom: Record<string, unknown>;\n emptyOnly?: boolean;\n fields: Field[];\n localizedParent?: boolean;\n siblingDataFrom?: Record<string, unknown>;\n siblingDataTranslated?: Record<string, unknown>;\n translatedData: Record<string, unknown>;\n valuesToTranslate: ValueToTranslate[];\n}) => {\n siblingDataFrom = siblingDataFrom ?? dataFrom;\n siblingDataTranslated = siblingDataTranslated ?? translatedData;\n\n for (const field of fields) {\n switch (field.type) {\n case 'tabs':\n for (const tab of field.tabs) {\n const hasName = tabHasName(tab);\n\n const tabDataFrom = hasName\n ? (siblingDataFrom[tab.name] as Record<string, unknown>)\n : siblingDataFrom;\n\n if (!tabDataFrom) return;\n\n const tabDataTranslated = hasName\n ? ((siblingDataTranslated[tab.name] as Record<string, unknown>) ?? {})\n : siblingDataTranslated;\n\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: tab.fields,\n localizedParent: tab.localized,\n siblingDataFrom: tabDataFrom,\n siblingDataTranslated: tabDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n }\n\n break;\n\n case 'group': {\n const groupDataFrom = siblingDataFrom[field.name] as Record<string, unknown>;\n\n if (!groupDataFrom) break;\n\n let groupDataTranslated =\n (siblingDataTranslated[field.name] as Record<string, unknown>);\n\n if (!groupDataTranslated) {\n groupDataTranslated = {id: ObjectID().toHexString()};\n siblingDataTranslated[field.name] = groupDataTranslated;\n }\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: groupDataFrom,\n siblingDataTranslated: groupDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n\n break;\n }\n\n case 'array': {\n const arrayDataFrom = siblingDataFrom[field.name] as {\n id: string;\n }[];\n\n if (isEmpty(arrayDataFrom)) break;\n\n let arrayDataTranslated =\n (siblingDataTranslated[field.name] as { id: string }[] | undefined) ?? [];\n\n if (field.localized || localizedParent) {\n if (arrayDataTranslated.length > 0 && emptyOnly) break;\n\n arrayDataTranslated = arrayDataFrom.map(() => ({\n id: ObjectID().toHexString(),\n }));\n }\n\n if (!Array.isArray(arrayDataTranslated)) {\n break;\n }\n arrayDataTranslated.forEach((item, index) => {\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: arrayDataFrom[index],\n siblingDataTranslated: item,\n translatedData,\n valuesToTranslate,\n });\n });\n\n siblingDataTranslated[field.name] = arrayDataTranslated;\n\n break;\n }\n\n case 'blocks': {\n const blocksDataFrom = siblingDataFrom[field.name] as {\n blockType: string;\n id: string;\n }[];\n\n if (isEmpty(blocksDataFrom)) break;\n\n let blocksDataTranslated =\n (siblingDataTranslated[field.name] as { blockType: string; id: string }[] | undefined) ??\n [];\n\n if (field.localized || localizedParent) {\n if (blocksDataTranslated.length > 0 && emptyOnly) break;\n\n blocksDataTranslated = blocksDataFrom.map(({ blockType }) => ({\n blockType,\n id: ObjectID().toHexString(),\n }));\n }\n\n blocksDataTranslated.forEach((item, index) => {\n const block = field.blocks.find((each: Record<string, unknown>) => each.slug === item.blockType);\n\n if (!block) return;\n\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: block.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: blocksDataFrom[index],\n siblingDataTranslated: item,\n translatedData,\n valuesToTranslate,\n });\n });\n\n siblingDataTranslated[field.name] = blocksDataTranslated;\n\n break;\n }\n\n case 'collapsible':\n case 'row':\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n break;\n\n // long ass cases here we have\n case 'date':\n case 'checkbox':\n case 'json':\n case 'code':\n case 'email':\n case 'number':\n case 'point':\n case 'radio':\n case 'relationship':\n case 'select':\n case 'upload':\n siblingDataTranslated[field.name] = siblingDataFrom[field.name];\n\n break;\n\n case 'text':\n case 'textarea':\n if (field.custom && typeof field.custom === 'object' && field.custom.translatorSkip) break;\n\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break;\n if (emptyOnly && siblingDataTranslated[field.name]) break;\n\n // do not translate the block ID or admin-facing label\n if (field.name === 'id') {\n break;\n }\n\n valuesToTranslate.push({\n onTranslate: (translated: string) => {\n siblingDataTranslated[field.name] = translated;\n },\n value: siblingDataFrom[field.name],\n });\n break;\n\n case 'richText': {\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break;\n if (emptyOnly && siblingDataTranslated[field.name]) break;\n\n const richTextDataFrom = siblingDataFrom[field.name] as object;\n\n siblingDataTranslated[field.name] = richTextDataFrom;\n\n if (!richTextDataFrom) break;\n\n const isSlate = Array.isArray(richTextDataFrom);\n\n const isLexical = 'root' in richTextDataFrom;\n\n if (!isSlate && !isLexical) break;\n\n if (isLexical) {\n const root = (siblingDataTranslated[field.name] as Record<string, unknown>)\n ?.root as Record<string, unknown>;\n\n if (root) {\n traverseRichText({\n onText: (siblingData)=>{\n valuesToTranslate.push({\n onTranslate: (translated: string)=>{\n siblingData.text = translated;\n },\n value: siblingData.text\n });\n },\n root\n });\n\n const richTextBlocksGetSubFields = (field.editor as any)?.editorConfig?.features?.getSubFields?.get('block');\n if (typeof richTextBlocksGetSubFields !== 'function') break;\n const richTextBlocks = richTextBlocksGetSubFields('block');\n const richTextBlockDataFrom = (richTextDataFrom.root as Record<string, unknown>)?.children;\n if (isEmpty(richTextBlockDataFrom) || !Array.isArray(richTextBlockDataFrom) || isEmpty(richTextBlocks)) break;\n let richTextBlocksDataTranslated = ((siblingDataTranslated[field.name] as Record<string, unknown>)?.root as Record<string, unknown>)?.children as Record<string, unknown>[] ?? [];\n\n if (field.localized || localizedParent) {\n if (richTextBlocksDataTranslated.length > 0 && emptyOnly) break;\n richTextBlocksDataTranslated = richTextBlockDataFrom.map((blockData)=>{\n if (blockData?.fields?.blockType) {\n return {\n ...blockData,\n fields: {\n blockType: blockData?.fields?.blockType,\n id: ObjectID().toHexString()\n }\n }\n }\n return blockData;\n });\n }\n\n richTextBlocksDataTranslated.forEach((item, index)=>{\n const block = richTextBlocks[0].blocks.find((each: Record<string, unknown>)=>each.slug && each.slug === (item.fields as Record<string, unknown>)?.blockType);\n if (!block) return;\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: block.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: richTextBlockDataFrom[index].fields,\n siblingDataTranslated: item.fields as Record<string, unknown>,\n translatedData,\n valuesToTranslate\n });\n });\n ((siblingDataTranslated[field.name] as Record<string, unknown>).root as Record<string, unknown>).children = richTextBlocksDataTranslated;\n }\n } else {\n for (const root of siblingDataTranslated[field.name] as unknown[]) {\n traverseRichText({\n onText: (siblingData) => {\n valuesToTranslate.push({\n onTranslate: (translated: string) => {\n siblingData.text = translated;\n },\n value: siblingData.text,\n });\n },\n root: root as Record<string, unknown>,\n });\n }\n }\n\n break;\n }\n\n default:\n break;\n }\n }\n};\n"],"names":["ObjectID","tabHasName","isEmpty","traverseRichText","traverseFields","dataFrom","emptyOnly","fields","localizedParent","siblingDataFrom","siblingDataTranslated","translatedData","valuesToTranslate","field","type","tab","tabs","hasName","tabDataFrom","name","tabDataTranslated","localized","groupDataFrom","groupDataTranslated","id","toHexString","arrayDataFrom","arrayDataTranslated","length","map","Array","isArray","forEach","item","index","blocksDataFrom","blocksDataTranslated","blockType","block","blocks","find","each","slug","custom","translatorSkip","push","onTranslate","translated","value","richTextDataFrom","isSlate","isLexical","root","onText","siblingData","text","richTextBlocksGetSubFields","editor","editorConfig","features","getSubFields","get","richTextBlocks","richTextBlockDataFrom","children","richTextBlocksDataTranslated","blockData"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/translate/traverseFields.ts"],"sourcesContent":["import ObjectID from 'bson-objectid';\nimport type { Field } from 'payload';\nimport { tabHasName } from 'payload/shared';\n\nimport { isEmpty } from '../utils/isEmpty';\nimport { traverseRichText } from './traverseRichText';\nimport type { ValueToTranslate } from './types';\n\nexport const traverseFields = ({\n dataFrom,\n emptyOnly,\n fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n}: {\n dataFrom: Record<string, unknown>;\n emptyOnly?: boolean;\n fields: Field[];\n localizedParent?: boolean;\n siblingDataFrom?: Record<string, unknown>;\n siblingDataTranslated?: Record<string, unknown>;\n translatedData: Record<string, unknown>;\n valuesToTranslate: ValueToTranslate[];\n}) => {\n siblingDataFrom = siblingDataFrom ?? dataFrom;\n siblingDataTranslated = siblingDataTranslated ?? translatedData;\n\n for (const field of fields) {\n switch (field.type) {\n case 'tabs':\n for (const tab of field.tabs) {\n const hasName = tabHasName(tab);\n\n const tabDataFrom = hasName\n ? (siblingDataFrom[tab.name] as Record<string, unknown>)\n : siblingDataFrom;\n\n if (!tabDataFrom) return;\n\n const tabDataTranslated = hasName\n ? ((siblingDataTranslated[tab.name] as Record<string, unknown>) ?? {})\n : siblingDataTranslated;\n\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: tab.fields,\n localizedParent: tab.localized,\n siblingDataFrom: tabDataFrom,\n siblingDataTranslated: tabDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n }\n\n break;\n\n case 'group': {\n if (!('name' in field)) {\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n\n break;\n }\n\n const groupDataFrom = siblingDataFrom[field.name] as Record<string, unknown>;\n\n if (!groupDataFrom) break;\n\n let groupDataTranslated =\n (siblingDataTranslated[field.name] as Record<string, unknown>);\n\n if (!groupDataTranslated) {\n groupDataTranslated = {id: ObjectID().toHexString()};\n siblingDataTranslated[field.name] = groupDataTranslated;\n }\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: groupDataFrom,\n siblingDataTranslated: groupDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n\n break;\n }\n\n case 'array': {\n const arrayDataFrom = siblingDataFrom[field.name] as {\n id: string;\n }[];\n\n if (isEmpty(arrayDataFrom)) break;\n\n let arrayDataTranslated =\n (siblingDataTranslated[field.name] as { id: string }[] | undefined) ?? [];\n\n if (field.localized || localizedParent) {\n if (arrayDataTranslated.length > 0 && emptyOnly) break;\n\n arrayDataTranslated = arrayDataFrom.map(() => ({\n id: ObjectID().toHexString(),\n }));\n }\n\n if (!Array.isArray(arrayDataTranslated)) {\n break;\n }\n arrayDataTranslated.forEach((item, index) => {\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: arrayDataFrom[index],\n siblingDataTranslated: item,\n translatedData,\n valuesToTranslate,\n });\n });\n\n siblingDataTranslated[field.name] = arrayDataTranslated;\n\n break;\n }\n\n case 'blocks': {\n const blocksDataFrom = siblingDataFrom[field.name] as {\n blockType: string;\n id: string;\n }[];\n\n if (isEmpty(blocksDataFrom)) break;\n\n let blocksDataTranslated =\n (siblingDataTranslated[field.name] as { blockType: string; id: string }[] | undefined) ??\n [];\n\n if (field.localized || localizedParent) {\n if (blocksDataTranslated.length > 0 && emptyOnly) break;\n\n blocksDataTranslated = blocksDataFrom.map(({ blockType }) => ({\n blockType,\n id: ObjectID().toHexString(),\n }));\n }\n\n blocksDataTranslated.forEach((item, index) => {\n const block = field.blocks.find((each: Record<string, unknown>) => each.slug === item.blockType);\n\n if (!block) return;\n\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: block.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: blocksDataFrom[index],\n siblingDataTranslated: item,\n translatedData,\n valuesToTranslate,\n });\n });\n\n siblingDataTranslated[field.name] = blocksDataTranslated;\n\n break;\n }\n\n case 'collapsible':\n case 'row':\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: field.fields,\n localizedParent,\n siblingDataFrom,\n siblingDataTranslated,\n translatedData,\n valuesToTranslate,\n });\n break;\n\n // long ass cases here we have\n case 'date':\n case 'checkbox':\n case 'json':\n case 'code':\n case 'email':\n case 'number':\n case 'point':\n case 'radio':\n case 'relationship':\n case 'select':\n case 'upload':\n siblingDataTranslated[field.name] = siblingDataFrom[field.name];\n\n break;\n\n case 'text':\n case 'textarea':\n if (field.custom && typeof field.custom === 'object' && field.custom.translatorSkip) break;\n\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break;\n if (emptyOnly && siblingDataTranslated[field.name]) break;\n\n // do not translate the block ID or admin-facing label\n if (field.name === 'id') {\n break;\n }\n\n valuesToTranslate.push({\n onTranslate: (translated: string) => {\n siblingDataTranslated[field.name] = translated;\n },\n value: siblingDataFrom[field.name],\n });\n break;\n\n case 'richText': {\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break;\n if (emptyOnly && siblingDataTranslated[field.name]) break;\n\n const richTextDataFrom = siblingDataFrom[field.name] as object;\n\n siblingDataTranslated[field.name] = richTextDataFrom;\n\n if (!richTextDataFrom) break;\n\n const isSlate = Array.isArray(richTextDataFrom);\n\n const isLexical = 'root' in richTextDataFrom;\n\n if (!isSlate && !isLexical) break;\n\n if (isLexical) {\n const root = (siblingDataTranslated[field.name] as Record<string, unknown>)\n ?.root as Record<string, unknown>;\n\n if (root) {\n traverseRichText({\n onText: (siblingData)=>{\n valuesToTranslate.push({\n onTranslate: (translated: string)=>{\n siblingData.text = translated;\n },\n value: siblingData.text\n });\n },\n root\n });\n\n const richTextBlocksGetSubFields = (field.editor as any)?.editorConfig?.features?.getSubFields?.get('block');\n if (typeof richTextBlocksGetSubFields !== 'function') break;\n const richTextBlocks = richTextBlocksGetSubFields('block');\n const richTextBlockDataFrom = (richTextDataFrom.root as Record<string, unknown>)?.children;\n if (isEmpty(richTextBlockDataFrom) || !Array.isArray(richTextBlockDataFrom) || isEmpty(richTextBlocks)) break;\n let richTextBlocksDataTranslated = ((siblingDataTranslated[field.name] as Record<string, unknown>)?.root as Record<string, unknown>)?.children as Record<string, unknown>[] ?? [];\n\n if (field.localized || localizedParent) {\n if (richTextBlocksDataTranslated.length > 0 && emptyOnly) break;\n richTextBlocksDataTranslated = richTextBlockDataFrom.map((blockData)=>{\n if (blockData?.fields?.blockType) {\n return {\n ...blockData,\n fields: {\n blockType: blockData?.fields?.blockType,\n id: ObjectID().toHexString()\n }\n }\n }\n return blockData;\n });\n }\n\n richTextBlocksDataTranslated.forEach((item, index)=>{\n const block = richTextBlocks[0].blocks.find((each: Record<string, unknown>)=>each.slug && each.slug === (item.fields as Record<string, unknown>)?.blockType);\n if (!block) return;\n traverseFields({\n dataFrom,\n emptyOnly,\n fields: block.fields,\n localizedParent: localizedParent ?? field.localized,\n siblingDataFrom: richTextBlockDataFrom[index].fields,\n siblingDataTranslated: item.fields as Record<string, unknown>,\n translatedData,\n valuesToTranslate\n });\n });\n ((siblingDataTranslated[field.name] as Record<string, unknown>).root as Record<string, unknown>).children = richTextBlocksDataTranslated;\n }\n } else {\n for (const root of siblingDataTranslated[field.name] as unknown[]) {\n traverseRichText({\n onText: (siblingData) => {\n valuesToTranslate.push({\n onTranslate: (translated: string) => {\n siblingData.text = translated;\n },\n value: siblingData.text,\n });\n },\n root: root as Record<string, unknown>,\n });\n }\n }\n\n break;\n }\n\n default:\n break;\n }\n }\n};\n"],"names":["ObjectID","tabHasName","isEmpty","traverseRichText","traverseFields","dataFrom","emptyOnly","fields","localizedParent","siblingDataFrom","siblingDataTranslated","translatedData","valuesToTranslate","field","type","tab","tabs","hasName","tabDataFrom","name","tabDataTranslated","localized","groupDataFrom","groupDataTranslated","id","toHexString","arrayDataFrom","arrayDataTranslated","length","map","Array","isArray","forEach","item","index","blocksDataFrom","blocksDataTranslated","blockType","block","blocks","find","each","slug","custom","translatorSkip","push","onTranslate","translated","value","richTextDataFrom","isSlate","isLexical","root","onText","siblingData","text","richTextBlocksGetSubFields","editor","editorConfig","features","getSubFields","get","richTextBlocks","richTextBlockDataFrom","children","richTextBlocksDataTranslated","blockData"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateEntity.d.ts","sourceRoot":"","sources":["../../src/translate/updateEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA8B,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtF,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,cAAc,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,YAAY,iGAStB,IAAI,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CA6BrD,CAAC"}
1
+ {"version":3,"file":"updateEntity.d.ts","sourceRoot":"","sources":["../../src/translate/updateEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA8B,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKtF,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,GAAG,EAAE,cAAc,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,YAAY,iGAStB,IAAI,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CA8BrD,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import { APIError } from 'payload';
2
+ import { translatorT } from '../i18n-translations';
2
3
  export const updateEntity = ({ collectionSlug, data, depth: incomingDepth, globalSlug, id, locale, overrideAccess, req })=>{
3
- if (!collectionSlug && !globalSlug) throw new APIError('Bad Request', 400);
4
+ if (!collectionSlug && !globalSlug) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
4
5
  const isGlobal = !!globalSlug;
5
- if (!isGlobal && !id) throw new APIError('Bad Request', 400);
6
+ if (!isGlobal && !id) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);
6
7
  const depth = incomingDepth ?? req.payload.config.defaultDepth;
7
8
  const promise = isGlobal ? req.payload.updateGlobal({
8
9
  data,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/translate/updateEntity.ts"],"sourcesContent":["import type { CollectionSlug, GlobalSlug, PayloadRequest, TypeWithID } from 'payload';\nimport { APIError } from 'payload';\n\ntype Args = {\n collectionSlug?: string;\n data: Record<string, any>;\n depth?: number;\n globalSlug?: string;\n id?: number | string;\n locale: string;\n overrideAccess?: boolean;\n req: PayloadRequest;\n};\n\nexport const updateEntity = ({\n collectionSlug,\n data,\n depth: incomingDepth,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n}: Args): Promise<Record<string, unknown> & TypeWithID> => {\n if (!collectionSlug && !globalSlug) throw new APIError('Bad Request', 400);\n\n const isGlobal = !!globalSlug;\n\n if (!isGlobal && !id) throw new APIError('Bad Request', 400);\n\n const depth = incomingDepth ?? req.payload.config.defaultDepth;\n\n const promise = isGlobal\n ? req.payload.updateGlobal({\n data,\n depth,\n locale: locale as any,\n overrideAccess,\n req,\n slug: globalSlug as GlobalSlug,\n })\n : req.payload.update({\n collection: collectionSlug as CollectionSlug,\n data,\n depth,\n id: id as number | string,\n locale: locale as any,\n overrideAccess,\n req,\n });\n\n return promise as any;\n};\n"],"names":["APIError","updateEntity","collectionSlug","data","depth","incomingDepth","globalSlug","id","locale","overrideAccess","req","isGlobal","payload","config","defaultDepth","promise","updateGlobal","slug","update","collection"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAU;AAanC,OAAO,MAAMC,eAAe,CAAC,EAC3BC,cAAc,EACdC,IAAI,EACJC,OAAOC,aAAa,EACpBC,UAAU,EACVC,EAAE,EACFC,MAAM,EACNC,cAAc,EACdC,GAAG,EACE;IACL,IAAI,CAACR,kBAAkB,CAACI,YAAY,MAAM,IAAIN,SAAS,eAAe;IAEtE,MAAMW,WAAW,CAAC,CAACL;IAEnB,IAAI,CAACK,YAAY,CAACJ,IAAI,MAAM,IAAIP,SAAS,eAAe;IAExD,MAAMI,QAAQC,iBAAiBK,IAAIE,OAAO,CAACC,MAAM,CAACC,YAAY;IAE9D,MAAMC,UAAUJ,WACZD,IAAIE,OAAO,CAACI,YAAY,CAAC;QACvBb;QACAC;QACAI,QAAQA;QACRC;QACAC;QACAO,MAAMX;IACR,KACAI,IAAIE,OAAO,CAACM,MAAM,CAAC;QACjBC,YAAYjB;QACZC;QACAC;QACAG,IAAIA;QACJC,QAAQA;QACRC;QACAC;IACF;IAEJ,OAAOK;AACT,EAAE"}
1
+ {"version":3,"sources":["../../src/translate/updateEntity.ts"],"sourcesContent":["import type { CollectionSlug, GlobalSlug, PayloadRequest, TypeWithID } from 'payload';\nimport { APIError } from 'payload';\n\nimport { translatorT } from '../i18n-translations';\n\ntype Args = {\n collectionSlug?: string;\n data: Record<string, any>;\n depth?: number;\n globalSlug?: string;\n id?: number | string;\n locale: string;\n overrideAccess?: boolean;\n req: PayloadRequest;\n};\n\nexport const updateEntity = ({\n collectionSlug,\n data,\n depth: incomingDepth,\n globalSlug,\n id,\n locale,\n overrideAccess,\n req,\n}: Args): Promise<Record<string, unknown> & TypeWithID> => {\n if (!collectionSlug && !globalSlug)\n throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const isGlobal = !!globalSlug;\n\n if (!isGlobal && !id) throw new APIError(translatorT(req.t, 'error_badRequest'), 400);\n\n const depth = incomingDepth ?? req.payload.config.defaultDepth;\n\n const promise = isGlobal\n ? req.payload.updateGlobal({\n data,\n depth,\n locale: locale as any,\n overrideAccess,\n req,\n slug: globalSlug as GlobalSlug,\n })\n : req.payload.update({\n collection: collectionSlug as CollectionSlug,\n data,\n depth,\n id: id as number | string,\n locale: locale as any,\n overrideAccess,\n req,\n });\n\n return promise as any;\n};\n"],"names":["APIError","translatorT","updateEntity","collectionSlug","data","depth","incomingDepth","globalSlug","id","locale","overrideAccess","req","t","isGlobal","payload","config","defaultDepth","promise","updateGlobal","slug","update","collection"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAU;AAEnC,SAASC,WAAW,QAAQ,uBAAuB;AAanD,OAAO,MAAMC,eAAe,CAAC,EAC3BC,cAAc,EACdC,IAAI,EACJC,OAAOC,aAAa,EACpBC,UAAU,EACVC,EAAE,EACFC,MAAM,EACNC,cAAc,EACdC,GAAG,EACE;IACL,IAAI,CAACR,kBAAkB,CAACI,YACtB,MAAM,IAAIP,SAASC,YAAYU,IAAIC,CAAC,EAAE,qBAAqB;IAE7D,MAAMC,WAAW,CAAC,CAACN;IAEnB,IAAI,CAACM,YAAY,CAACL,IAAI,MAAM,IAAIR,SAASC,YAAYU,IAAIC,CAAC,EAAE,qBAAqB;IAEjF,MAAMP,QAAQC,iBAAiBK,IAAIG,OAAO,CAACC,MAAM,CAACC,YAAY;IAE9D,MAAMC,UAAUJ,WACZF,IAAIG,OAAO,CAACI,YAAY,CAAC;QACvBd;QACAC;QACAI,QAAQA;QACRC;QACAC;QACAQ,MAAMZ;IACR,KACAI,IAAIG,OAAO,CAACM,MAAM,CAAC;QACjBC,YAAYlB;QACZC;QACAC;QACAG,IAAIA;QACJC,QAAQA;QACRC;QACAC;IACF;IAEJ,OAAOM;AACT,EAAE"}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,11 @@
1
1
  import type { CollectionSlug, GlobalSlug } from 'payload';
2
+ import type { GlossaryConfig } from './glossary';
2
3
  import type { TranslateResolver } from './resolvers/types';
3
4
  export type TranslatorConfig = {
5
+ /**
6
+ * Optional base path for the translator API endpoint
7
+ */
8
+ basePath?: string;
4
9
  /**
5
10
  * Collections with the enabled translator in the admin UI
6
11
  */
@@ -9,21 +14,18 @@ export type TranslatorConfig = {
9
14
  * Disable the plugin
10
15
  */
11
16
  disabled?: boolean;
17
+ /**
18
+ * Locales that should be excluded from translation (source and target)
19
+ */
20
+ disabledLocales?: string[];
12
21
  /**
13
22
  * Globals with the enabled translator in the admin UI
14
23
  */
15
24
  globals: GlobalSlug[];
25
+ glossary?: GlossaryConfig;
16
26
  /**
17
27
  * Add resolvers that you want to include, examples on how to write your own in ./plugin/src/resolvers
18
28
  */
19
29
  resolvers: TranslateResolver[];
20
- /**
21
- * Locales that should be excluded from translation (source and target)
22
- */
23
- disabledLocales?: string[];
24
- /**
25
- * Optional base path for the translator API endpoint
26
- */
27
- basePath?: string;
28
30
  };
29
31
  //# sourceMappingURL=types.d.ts.map