@justanarthur/payload-plugin-translator 1.3.9 → 1.3.11-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/resolvers/openAI.d.ts +3 -2
- package/dist/resolvers/openAI.d.ts.map +1 -1
- package/dist/resolvers/openAI.js +23 -3
- package/dist/resolvers/openAI.js.map +1 -1
- package/dist/translate/operation.d.ts.map +1 -1
- package/dist/translate/operation.js +2 -1
- package/dist/translate/operation.js.map +1 -1
- package/dist/translate/traverseFields.d.ts +5 -1
- package/dist/translate/traverseFields.d.ts.map +1 -1
- package/dist/translate/traverseFields.js +24 -13
- package/dist/translate/traverseFields.js.map +1 -1
- package/dist/translate/traverseRichText.d.ts +6 -2
- package/dist/translate/traverseRichText.d.ts.map +1 -1
- package/dist/translate/traverseRichText.js +4 -4
- package/dist/translate/traverseRichText.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { TranslateResolver } from './types';
|
|
2
|
+
export type OpenAIMessageExchange = Record<string | number, string>;
|
|
2
3
|
export type OpenAIPrompt = (args: {
|
|
3
4
|
localeFrom: string;
|
|
4
5
|
localeTo: string;
|
|
5
|
-
texts:
|
|
6
|
+
texts: OpenAIMessageExchange;
|
|
6
7
|
}) => string;
|
|
7
8
|
export type OpenAIResolverConfig = {
|
|
8
9
|
apiKey: string;
|
|
@@ -18,5 +19,5 @@ export type OpenAIResolverConfig = {
|
|
|
18
19
|
model?: string;
|
|
19
20
|
prompt?: OpenAIPrompt;
|
|
20
21
|
};
|
|
21
|
-
export declare const openAIResolver: ({ apiKey, baseUrl, chunkLength, model, prompt
|
|
22
|
+
export declare const openAIResolver: ({ apiKey, baseUrl, chunkLength, model, prompt }: OpenAIResolverConfig) => TranslateResolver;
|
|
22
23
|
//# sourceMappingURL=openAI.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openAI.d.ts","sourceRoot":"","sources":["../../src/resolvers/openAI.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"openAI.d.ts","sourceRoot":"","sources":["../../src/resolvers/openAI.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,CAAA;AAEnE,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,qBAAqB,CAAA;CAC7B,KAAK,MAAM,CAAA;AAEZ,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,YAAY,CAAA;CACtB,CAAA;AA6BD,eAAO,MAAM,cAAc,GAAI,iDAMG,oBAAoB,KAAG,iBAyHxD,CAAA"}
|
package/dist/resolvers/openAI.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { chunkArray } from '../utils/chunkArray';
|
|
2
2
|
const defaultPrompt = ({ localeFrom, localeTo, texts })=>{
|
|
3
|
-
return `
|
|
3
|
+
return `You are a machine translation service. Your task is to translate values in a strict JSON of key value pairs from ${localeFrom} to ${localeTo}.
|
|
4
|
+
|
|
5
|
+
**INSTRUCTIONS:**
|
|
6
|
+
1. **Translate each value**.
|
|
7
|
+
2. The output **must valid JSON**.
|
|
8
|
+
3. The output array **must have the exact same number of elements** as the input.
|
|
9
|
+
4. Preserve the structure of the JSON array.
|
|
10
|
+
5. Preserve JSON keys without translation.
|
|
11
|
+
6. The **order of the elements must not change**.
|
|
12
|
+
7. **Do not include any text, explanations, or remarks outside of the JSON array.**
|
|
13
|
+
8. **Preserve any special characters, HTML tags, or formatting** present in the original strings.
|
|
14
|
+
9. **Preserve urls, hrefs, and email addresses** without translation.
|
|
15
|
+
10. RETURN ONLY THE RAW JSON, DO NOT RESPOND WITH ANYTHING ELSE, AND NO FORMATTING.
|
|
16
|
+
|
|
17
|
+
**INPUT JSON TO TRANSLATE:**
|
|
18
|
+
${JSON.stringify(texts)}`;
|
|
4
19
|
};
|
|
5
20
|
export const openAIResolver = ({ apiKey, baseUrl, chunkLength = 100, model = 'gpt-3.5-turbo', prompt = defaultPrompt })=>{
|
|
6
21
|
return {
|
|
@@ -9,6 +24,10 @@ export const openAIResolver = ({ apiKey, baseUrl, chunkLength = 100, model = 'gp
|
|
|
9
24
|
const apiUrl = `${baseUrl || 'https://api.openai.com'}/v1/chat/completions`;
|
|
10
25
|
try {
|
|
11
26
|
const response = await Promise.all(chunkArray(texts, chunkLength).map((texts)=>{
|
|
27
|
+
const structuredTexts = texts.reduce((acc, curr, index)=>{
|
|
28
|
+
acc[index + 1] = curr;
|
|
29
|
+
return acc;
|
|
30
|
+
}, {});
|
|
12
31
|
return fetch(apiUrl, {
|
|
13
32
|
body: JSON.stringify({
|
|
14
33
|
messages: [
|
|
@@ -16,7 +35,7 @@ export const openAIResolver = ({ apiKey, baseUrl, chunkLength = 100, model = 'gp
|
|
|
16
35
|
content: prompt({
|
|
17
36
|
localeFrom,
|
|
18
37
|
localeTo,
|
|
19
|
-
texts
|
|
38
|
+
texts: structuredTexts
|
|
20
39
|
}),
|
|
21
40
|
role: 'user'
|
|
22
41
|
}
|
|
@@ -52,7 +71,8 @@ export const openAIResolver = ({ apiKey, baseUrl, chunkLength = 100, model = 'gp
|
|
|
52
71
|
success: false
|
|
53
72
|
};
|
|
54
73
|
}
|
|
55
|
-
const
|
|
74
|
+
const translatedStructuredTexts = JSON.parse(content);
|
|
75
|
+
const translatedChunk = Object.values(translatedStructuredTexts);
|
|
56
76
|
if (!Array.isArray(translatedChunk)) {
|
|
57
77
|
req.payload.logger.error({
|
|
58
78
|
data: translatedChunk,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/resolvers/openAI.ts"],"sourcesContent":["import { chunkArray } from '../utils/chunkArray'\r\nimport type { TranslateResolver } from './types'\r\n\r\nexport type OpenAIPrompt = (args: {\r\n localeFrom: string\r\n localeTo: string\r\n texts:
|
|
1
|
+
{"version":3,"sources":["../../src/resolvers/openAI.ts"],"sourcesContent":["import { chunkArray } from '../utils/chunkArray'\r\nimport type { TranslateResolver } from './types'\r\n\r\nexport type OpenAIMessageExchange = Record<string | number, string>\r\n\r\nexport type OpenAIPrompt = (args: {\r\n localeFrom: string\r\n localeTo: string\r\n texts: OpenAIMessageExchange\r\n}) => string\r\n\r\nexport type OpenAIResolverConfig = {\r\n apiKey: string\r\n baseUrl?: string\r\n /**\r\n * How many texts to include into 1 request\r\n * @default 100\r\n */\r\n chunkLength?: number\r\n /**\r\n * @default \"gpt-3.5-turbo\"\r\n */\r\n model?: string\r\n prompt?: OpenAIPrompt\r\n}\r\n\r\ntype OpenAIResponse = {\r\n choices: {\r\n message: {\r\n content: string\r\n }\r\n }[]\r\n}\r\n\r\nconst defaultPrompt: OpenAIPrompt = ({ localeFrom, localeTo, texts }) => {\r\n return `You are a machine translation service. Your task is to translate values in a strict JSON of key value pairs from ${localeFrom} to ${localeTo}.\r\n\r\n**INSTRUCTIONS:**\r\n1. **Translate each value**.\r\n2. The output **must valid JSON**.\r\n3. The output array **must have the exact same number of elements** as the input.\r\n4. Preserve the structure of the JSON array.\r\n5. Preserve JSON keys without translation.\r\n6. The **order of the elements must not change**.\r\n7. **Do not include any text, explanations, or remarks outside of the JSON array.**\r\n8. **Preserve any special characters, HTML tags, or formatting** present in the original strings.\r\n9. **Preserve urls, hrefs, and email addresses** without translation.\r\n10. RETURN ONLY THE RAW JSON, DO NOT RESPOND WITH ANYTHING ELSE, AND NO FORMATTING.\r\n\r\n**INPUT JSON TO TRANSLATE:**\r\n${JSON.stringify(texts)}`\r\n}\r\n\r\nexport const openAIResolver = ({\r\n apiKey,\r\n baseUrl,\r\n chunkLength = 100,\r\n model = 'gpt-3.5-turbo',\r\n prompt = defaultPrompt\r\n }: OpenAIResolverConfig): TranslateResolver => {\r\n return {\r\n key: 'openai',\r\n resolve: async ({ localeFrom, localeTo, req, texts }) => {\r\n const apiUrl = `${baseUrl || 'https://api.openai.com'}/v1/chat/completions`\r\n\r\n try {\r\n const response: {\r\n data: OpenAIResponse\r\n success: boolean\r\n }[] = await Promise.all(\r\n chunkArray(texts, chunkLength).map((texts) => {\r\n const structuredTexts = texts.reduce((acc, curr, index) => {\r\n acc[index + 1] = curr\r\n return acc\r\n }, {} as Record<number, string>)\r\n\r\n return fetch(apiUrl, {\r\n body: JSON.stringify({\r\n messages: [\r\n {\r\n content: prompt({ localeFrom, localeTo, texts: structuredTexts }),\r\n role: 'user'\r\n }\r\n ],\r\n model\r\n }),\r\n headers: {\r\n Authorization: `Bearer ${apiKey}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n method: 'post'\r\n }).then(async (res) => {\r\n const data = await res.json()\r\n\r\n if (!res.ok)\r\n req.payload.logger.info({\r\n message: 'An error occurred when trying to translate the data using OpenAI API',\r\n openAIresponse: data\r\n })\r\n\r\n return {\r\n data,\r\n success: res.ok\r\n }\r\n })\r\n })\r\n )\r\n\r\n const translated: string[] = []\r\n\r\n for (const { data, success } of response) {\r\n if (!success)\r\n return {\r\n success: false as const\r\n }\r\n\r\n const content = data?.choices?.[0]?.message?.content\r\n\r\n if (!content) {\r\n req.payload.logger.error(\r\n 'An error occurred when trying to translate the data using OpenAI API - missing content in the response'\r\n )\r\n\r\n return {\r\n success: false as const\r\n }\r\n }\r\n\r\n const translatedStructuredTexts: OpenAIMessageExchange = JSON.parse(content)\r\n\r\n const translatedChunk: string[] = Object.values(translatedStructuredTexts)\r\n\r\n if (!Array.isArray(translatedChunk)) {\r\n req.payload.logger.error({\r\n data: translatedChunk,\r\n fullContent: content,\r\n message:\r\n 'An error occurred when trying to translate the data using OpenAI API - parsed content is not an array'\r\n })\r\n\r\n return {\r\n success: false as const\r\n }\r\n }\r\n\r\n for (const text of translatedChunk) {\r\n if (text && typeof text !== 'string') {\r\n req.payload.logger.error({\r\n chunkData: translatedChunk,\r\n data: text,\r\n fullContent: content,\r\n message:\r\n 'An error occurred when trying to translate the data using OpenAI API - parsed content is not a string'\r\n })\r\n\r\n return {\r\n success: false as const\r\n }\r\n }\r\n\r\n translated.push(text)\r\n }\r\n }\r\n\r\n return {\r\n success: true as const,\r\n translatedTexts: translated\r\n }\r\n } catch (e) {\r\n if (e instanceof Error) {\r\n req.payload.logger.info({\r\n message: 'An error occurred when trying to translate the data using OpenAI API',\r\n originalErr: e.message\r\n })\r\n }\r\n\r\n return { success: false as const }\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["chunkArray","defaultPrompt","localeFrom","localeTo","texts","JSON","stringify","openAIResolver","apiKey","baseUrl","chunkLength","model","prompt","key","resolve","req","apiUrl","response","Promise","all","map","structuredTexts","reduce","acc","curr","index","fetch","body","messages","content","role","headers","Authorization","method","then","res","data","json","ok","payload","logger","info","message","openAIresponse","success","translated","choices","error","translatedStructuredTexts","parse","translatedChunk","Object","values","Array","isArray","fullContent","text","chunkData","push","translatedTexts","e","Error","originalErr"],"mappings":"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"}
|
|
@@ -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,CAAA;AAKrE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAA;AAG/E,MAAM,MAAM,sBAAsB,GAAG,CACjC;IACE,OAAO,EAAE,OAAO,CAAA;CACjB,GACD;IACE,GAAG,EAAE,cAAc,CAAA;CACpB,CACJ,GACC,aAAa,CAAA;AAEf,eAAO,MAAM,kBAAkB,GAAU,MAAM,sBAAsB,
|
|
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,CAAA;AAKrE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAA;AAG/E,MAAM,MAAM,sBAAsB,GAAG,CACjC;IACE,OAAO,EAAE,OAAO,CAAA;CACjB,GACD;IACE,GAAG,EAAE,cAAc,CAAA;CACpB,CACJ,GACC,aAAa,CAAA;AAEf,eAAO,MAAM,kBAAkB,GAAU,MAAM,sBAAsB,6BA2FpE,CAAA"}
|
|
@@ -35,7 +35,8 @@ export const translateOperation = async (args)=>{
|
|
|
35
35
|
emptyOnly: args.emptyOnly,
|
|
36
36
|
fields: config.fields,
|
|
37
37
|
translatedData,
|
|
38
|
-
valuesToTranslate
|
|
38
|
+
valuesToTranslate,
|
|
39
|
+
_options: req.payload.config.custom?.translator?._options
|
|
39
40
|
});
|
|
40
41
|
const resolveResult = await resolver.resolve({
|
|
41
42
|
localeFrom: args.localeFrom,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translate/operation.ts"],"sourcesContent":["import he from 'he'\r\nimport { APIError, type Payload, type PayloadRequest } from 'payload'\r\n\r\nimport type { TranslateResolver } from '../resolvers/types'\r\nimport { findEntityWithConfig } from './findEntityWithConfig'\r\nimport { traverseFields } from './traverseFields'\r\nimport type { TranslateArgs, TranslateResult, ValueToTranslate } from './types'\r\nimport { updateEntity } from './updateEntity'\r\n\r\nexport type TranslateOperationArgs = (\r\n | {\r\n payload: Payload\r\n }\r\n | {\r\n req: PayloadRequest\r\n }\r\n) &\r\n TranslateArgs\r\n\r\nexport const translateOperation = async (args: TranslateOperationArgs) => {\r\n const req: PayloadRequest =\r\n 'req' in args\r\n ? args.req\r\n : ({\r\n payload: args.payload,\r\n } as PayloadRequest)\r\n\r\n const { collectionSlug, globalSlug, id, locale, localeFrom, overrideAccess } = args\r\n\r\n const { config, doc: dataFrom } = await findEntityWithConfig({\r\n collectionSlug,\r\n globalSlug,\r\n id,\r\n locale: localeFrom,\r\n req,\r\n })\r\n\r\n const resolver = (\r\n (req.payload.config.custom?.translator?.resolvers as TranslateResolver[]) ?? []\r\n ).find((each) => each.key === args.resolver)\r\n\r\n if (!resolver) throw new APIError(`Resolver with the key ${args.resolver} was not found`)\r\n\r\n const valuesToTranslate: ValueToTranslate[] = []\r\n\r\n let translatedData = args.data\r\n\r\n if (!translatedData) {\r\n const { doc } = await findEntityWithConfig({\r\n collectionSlug,\r\n globalSlug,\r\n id,\r\n locale,\r\n overrideAccess,\r\n req,\r\n })\r\n\r\n translatedData = doc\r\n }\r\n\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly: args.emptyOnly,\r\n fields: config.fields,\r\n translatedData,\r\n valuesToTranslate,\r\n })\r\n\r\n const resolveResult = await resolver.resolve({\r\n localeFrom: args.localeFrom,\r\n localeTo: args.locale,\r\n req,\r\n texts: valuesToTranslate.map((each) => each.value),\r\n })\r\n\r\n let result: TranslateResult\r\n\r\n if (!resolveResult.success) {\r\n result = {\r\n success: false,\r\n }\r\n } else {\r\n resolveResult.translatedTexts.forEach((translated, index) => {\r\n const formattedValue = he.decode(translated)\r\n\r\n valuesToTranslate[index].onTranslate(formattedValue)\r\n })\r\n\r\n if (args.update) {\r\n await updateEntity({\r\n collectionSlug,\r\n data: translatedData,\r\n depth: 0,\r\n globalSlug,\r\n id,\r\n locale,\r\n overrideAccess,\r\n req,\r\n })\r\n }\r\n\r\n result = {\r\n success: true,\r\n translatedData,\r\n }\r\n }\r\n\r\n return result\r\n}\r\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,KAAI;AACnB,SAASC,QAAQ,QAA2C,UAAS;AAGrE,SAASC,oBAAoB,QAAQ,yBAAwB;AAC7D,SAASC,cAAc,QAAQ,mBAAkB;AAEjD,SAASC,YAAY,QAAQ,iBAAgB;AAY7C,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;
|
|
1
|
+
{"version":3,"sources":["../../src/translate/operation.ts"],"sourcesContent":["import he from 'he'\r\nimport { APIError, type Payload, type PayloadRequest } from 'payload'\r\n\r\nimport type { TranslateResolver } from '../resolvers/types'\r\nimport { findEntityWithConfig } from './findEntityWithConfig'\r\nimport { traverseFields } from './traverseFields'\r\nimport type { TranslateArgs, TranslateResult, ValueToTranslate } from './types'\r\nimport { updateEntity } from './updateEntity'\r\n\r\nexport type TranslateOperationArgs = (\r\n | {\r\n payload: Payload\r\n }\r\n | {\r\n req: PayloadRequest\r\n }\r\n) &\r\n TranslateArgs\r\n\r\nexport const translateOperation = async (args: TranslateOperationArgs) => {\r\n const req: PayloadRequest =\r\n 'req' in args\r\n ? args.req\r\n : ({\r\n payload: args.payload,\r\n } as PayloadRequest)\r\n\r\n const { collectionSlug, globalSlug, id, locale, localeFrom, overrideAccess } = args\r\n\r\n const { config, doc: dataFrom } = await findEntityWithConfig({\r\n collectionSlug,\r\n globalSlug,\r\n id,\r\n locale: localeFrom,\r\n req,\r\n })\r\n\r\n const resolver = (\r\n (req.payload.config.custom?.translator?.resolvers as TranslateResolver[]) ?? []\r\n ).find((each) => each.key === args.resolver)\r\n\r\n if (!resolver) throw new APIError(`Resolver with the key ${args.resolver} was not found`)\r\n\r\n const valuesToTranslate: ValueToTranslate[] = []\r\n\r\n let translatedData = args.data\r\n\r\n if (!translatedData) {\r\n const { doc } = await findEntityWithConfig({\r\n collectionSlug,\r\n globalSlug,\r\n id,\r\n locale,\r\n overrideAccess,\r\n req,\r\n })\r\n\r\n translatedData = doc\r\n }\r\n\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly: args.emptyOnly,\r\n fields: config.fields,\r\n translatedData,\r\n valuesToTranslate,\r\n\r\n _options: req.payload.config.custom?.translator?._options\r\n })\r\n\r\n const resolveResult = await resolver.resolve({\r\n localeFrom: args.localeFrom,\r\n localeTo: args.locale,\r\n req,\r\n texts: valuesToTranslate.map((each) => each.value),\r\n })\r\n\r\n let result: TranslateResult\r\n\r\n if (!resolveResult.success) {\r\n result = {\r\n success: false,\r\n }\r\n } else {\r\n resolveResult.translatedTexts.forEach((translated, index) => {\r\n const formattedValue = he.decode(translated)\r\n\r\n valuesToTranslate[index].onTranslate(formattedValue)\r\n })\r\n\r\n if (args.update) {\r\n await updateEntity({\r\n collectionSlug,\r\n data: translatedData,\r\n depth: 0,\r\n globalSlug,\r\n id,\r\n locale,\r\n overrideAccess,\r\n req,\r\n })\r\n }\r\n\r\n result = {\r\n success: true,\r\n translatedData,\r\n }\r\n }\r\n\r\n return result\r\n}\r\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","_options","resolveResult","resolve","localeTo","texts","map","value","result","success","translatedTexts","forEach","translated","index","formattedValue","decode","onTranslate","update","depth"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,SAASC,QAAQ,QAA2C,UAAS;AAGrE,SAASC,oBAAoB,QAAQ,yBAAwB;AAC7D,SAASC,cAAc,QAAQ,mBAAkB;AAEjD,SAASC,YAAY,QAAQ,iBAAgB;AAY7C,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;QAEAK,UAAUvB,IAAIC,OAAO,CAACO,MAAM,CAACI,MAAM,EAAEC,YAAYU;IACnD;IAEA,MAAMC,gBAAgB,MAAMb,SAASc,OAAO,CAAC;QAC3CnB,YAAYP,KAAKO,UAAU;QAC3BoB,UAAU3B,KAAKM,MAAM;QACrBL;QACA2B,OAAOT,kBAAkBU,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,iBAAiB3C,GAAG4C,MAAM,CAACH;YAEjChB,iBAAiB,CAACiB,MAAM,CAACG,WAAW,CAACF;QACvC;QAEA,IAAIrC,KAAKwC,MAAM,EAAE;YACf,MAAM1C,aAAa;gBACjBK;gBACAkB,MAAMD;gBACNqB,OAAO;gBACPrC;gBACAC;gBACAC;gBACAE;gBACAP;YACF;QACF;QAEA8B,SAAS;YACPC,SAAS;YACTZ;QACF;IACF;IAEA,OAAOW;AACT,EAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Field } from 'payload';
|
|
2
|
+
import { traverseRichText } from './traverseRichText';
|
|
2
3
|
import type { ValueToTranslate } from './types';
|
|
3
|
-
export declare const traverseFields: ({ dataFrom, emptyOnly, fields, localizedParent, siblingDataFrom, siblingDataTranslated, translatedData, valuesToTranslate, }: {
|
|
4
|
+
export declare const traverseFields: ({ dataFrom, emptyOnly, fields, localizedParent, siblingDataFrom, siblingDataTranslated, translatedData, valuesToTranslate, _options: { additionalTraverseRichText } }: {
|
|
4
5
|
dataFrom: Record<string, unknown>;
|
|
5
6
|
emptyOnly?: boolean;
|
|
6
7
|
fields: Field[];
|
|
@@ -9,5 +10,8 @@ export declare const traverseFields: ({ dataFrom, emptyOnly, fields, localizedPa
|
|
|
9
10
|
siblingDataTranslated?: Record<string, unknown>;
|
|
10
11
|
translatedData: Record<string, unknown>;
|
|
11
12
|
valuesToTranslate: ValueToTranslate[];
|
|
13
|
+
_options?: {
|
|
14
|
+
additionalTraverseRichText?: typeof traverseRichText;
|
|
15
|
+
};
|
|
12
16
|
}) => void;
|
|
13
17
|
//# sourceMappingURL=traverseFields.d.ts.map
|
|
@@ -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,CAAA;
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/translate/traverseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAIpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,eAAO,MAAM,cAAc,GAAI,uKAWG;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/C,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAEtC,QAAQ,CAAC,EAAE;QACT,0BAA0B,CAAC,EAAE,OAAO,gBAAgB,CAAA;KACrD,CAAA;CACF,SAkQA,CAAA"}
|
|
@@ -2,7 +2,7 @@ import ObjectID from 'bson-objectid';
|
|
|
2
2
|
import { tabHasName } from 'payload/shared';
|
|
3
3
|
import { isEmpty } from '../utils/isEmpty';
|
|
4
4
|
import { traverseRichText } from './traverseRichText';
|
|
5
|
-
export const traverseFields = ({ dataFrom, emptyOnly, fields, localizedParent, siblingDataFrom, siblingDataTranslated, translatedData, valuesToTranslate })=>{
|
|
5
|
+
export const traverseFields = ({ dataFrom, emptyOnly, fields, localizedParent, siblingDataFrom, siblingDataTranslated, translatedData, valuesToTranslate, _options: { additionalTraverseRichText } = {} })=>{
|
|
6
6
|
siblingDataFrom = siblingDataFrom ?? dataFrom;
|
|
7
7
|
siblingDataTranslated = siblingDataTranslated ?? translatedData;
|
|
8
8
|
for (const field of fields){
|
|
@@ -12,7 +12,13 @@ export const traverseFields = ({ dataFrom, emptyOnly, fields, localizedParent, s
|
|
|
12
12
|
const hasName = tabHasName(tab);
|
|
13
13
|
const tabDataFrom = hasName ? siblingDataFrom[tab.name] : siblingDataFrom;
|
|
14
14
|
if (!tabDataFrom) return;
|
|
15
|
-
|
|
15
|
+
let tabDataTranslated;
|
|
16
|
+
if (hasName) {
|
|
17
|
+
if (!siblingDataTranslated[tab.name]) siblingDataTranslated[tab.name] = {};
|
|
18
|
+
tabDataTranslated = siblingDataTranslated[tab.name];
|
|
19
|
+
} else {
|
|
20
|
+
tabDataTranslated = siblingDataTranslated;
|
|
21
|
+
}
|
|
16
22
|
traverseFields({
|
|
17
23
|
dataFrom,
|
|
18
24
|
emptyOnly,
|
|
@@ -30,7 +36,8 @@ export const traverseFields = ({ dataFrom, emptyOnly, fields, localizedParent, s
|
|
|
30
36
|
if (!('name' in field)) break;
|
|
31
37
|
const groupDataFrom = siblingDataFrom[field.name];
|
|
32
38
|
if (!groupDataFrom) break;
|
|
33
|
-
|
|
39
|
+
if (!siblingDataTranslated[field.name]) siblingDataTranslated[field.name] = {};
|
|
40
|
+
const groupDataTranslated = siblingDataTranslated[field.name];
|
|
34
41
|
traverseFields({
|
|
35
42
|
dataFrom,
|
|
36
43
|
emptyOnly,
|
|
@@ -47,7 +54,8 @@ export const traverseFields = ({ dataFrom, emptyOnly, fields, localizedParent, s
|
|
|
47
54
|
{
|
|
48
55
|
const arrayDataFrom = siblingDataFrom[field.name];
|
|
49
56
|
if (isEmpty(arrayDataFrom)) break;
|
|
50
|
-
|
|
57
|
+
if (!siblingDataTranslated[field.name]) siblingDataTranslated[field.name] = [];
|
|
58
|
+
let arrayDataTranslated = siblingDataTranslated[field.name];
|
|
51
59
|
if (field.localized || localizedParent) {
|
|
52
60
|
if (arrayDataTranslated.length > 0 && emptyOnly) break;
|
|
53
61
|
arrayDataTranslated = arrayDataFrom.map(()=>({
|
|
@@ -73,7 +81,8 @@ export const traverseFields = ({ dataFrom, emptyOnly, fields, localizedParent, s
|
|
|
73
81
|
{
|
|
74
82
|
const blocksDataFrom = siblingDataFrom[field.name];
|
|
75
83
|
if (isEmpty(blocksDataFrom)) break;
|
|
76
|
-
|
|
84
|
+
if (!siblingDataTranslated[field.name]) siblingDataTranslated[field.name] = [];
|
|
85
|
+
let blocksDataTranslated = siblingDataTranslated[field.name];
|
|
77
86
|
if (field.localized || localizedParent) {
|
|
78
87
|
if (blocksDataTranslated.length > 0 && emptyOnly) break;
|
|
79
88
|
blocksDataTranslated = blocksDataFrom.map(({ blockType })=>({
|
|
@@ -154,28 +163,30 @@ export const traverseFields = ({ dataFrom, emptyOnly, fields, localizedParent, s
|
|
|
154
163
|
if (isLexical) {
|
|
155
164
|
const root = siblingDataTranslated[field.name]?.root;
|
|
156
165
|
if (root) traverseRichText({
|
|
157
|
-
onText: (siblingData)=>{
|
|
166
|
+
onText: (siblingData, attribute = 'text')=>{
|
|
158
167
|
valuesToTranslate.push({
|
|
159
168
|
onTranslate: (translated)=>{
|
|
160
|
-
siblingData
|
|
169
|
+
siblingData[attribute] = translated;
|
|
161
170
|
},
|
|
162
|
-
value: siblingData
|
|
171
|
+
value: siblingData[attribute]
|
|
163
172
|
});
|
|
164
173
|
},
|
|
165
|
-
root
|
|
174
|
+
root,
|
|
175
|
+
additionalTraverseRichText
|
|
166
176
|
});
|
|
167
177
|
} else {
|
|
168
178
|
for (const root of siblingDataTranslated[field.name]){
|
|
169
179
|
traverseRichText({
|
|
170
|
-
onText: (siblingData)=>{
|
|
180
|
+
onText: (siblingData, attribute = 'text')=>{
|
|
171
181
|
valuesToTranslate.push({
|
|
172
182
|
onTranslate: (translated)=>{
|
|
173
|
-
siblingData
|
|
183
|
+
siblingData[attribute] = translated;
|
|
174
184
|
},
|
|
175
|
-
value: siblingData
|
|
185
|
+
value: siblingData[attribute]
|
|
176
186
|
});
|
|
177
187
|
},
|
|
178
|
-
root: root
|
|
188
|
+
root: root,
|
|
189
|
+
additionalTraverseRichText
|
|
179
190
|
});
|
|
180
191
|
}
|
|
181
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translate/traverseFields.ts"],"sourcesContent":["import ObjectID from 'bson-objectid'\r\nimport type { Field } from 'payload'\r\nimport { tabHasName } from 'payload/shared'\r\n\r\nimport { isEmpty } from '../utils/isEmpty'\r\nimport { traverseRichText } from './traverseRichText'\r\nimport type { ValueToTranslate } from './types'\r\n\r\nexport const traverseFields = ({\r\n dataFrom,\r\n emptyOnly,\r\n fields,\r\n localizedParent,\r\n siblingDataFrom,\r\n siblingDataTranslated,\r\n translatedData,\r\n valuesToTranslate,\r\n}: {\r\n dataFrom: Record<string, unknown>\r\n emptyOnly?: boolean\r\n fields: Field[]\r\n localizedParent?: boolean\r\n siblingDataFrom?: Record<string, unknown>\r\n siblingDataTranslated?: Record<string, unknown>\r\n translatedData: Record<string, unknown>\r\n valuesToTranslate: ValueToTranslate[]\r\n}) => {\r\n siblingDataFrom = siblingDataFrom ?? dataFrom\r\n siblingDataTranslated = siblingDataTranslated ?? translatedData\r\n\r\n for (const field of fields) {\r\n switch (field.type) {\r\n case 'tabs':\r\n for (const tab of field.tabs) {\r\n const hasName = tabHasName(tab)\r\n\r\n const tabDataFrom = hasName\r\n ? (siblingDataFrom[tab.name] as Record<string, unknown>)\r\n : siblingDataFrom\r\n\r\n if (!tabDataFrom) return\r\n\r\n const tabDataTranslated = hasName\r\n ? ((siblingDataTranslated[tab.name] as Record<string, unknown>) ?? {})\r\n : siblingDataTranslated\r\n\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: tab.fields,\r\n localizedParent: tab.localized,\r\n siblingDataFrom: tabDataFrom,\r\n siblingDataTranslated: tabDataTranslated,\r\n translatedData,\r\n valuesToTranslate,\r\n })\r\n }\r\n\r\n break\r\n\r\n case 'group': {\r\n if (!('name' in field)) break\r\n\r\n const groupDataFrom = siblingDataFrom[field.name] as Record<string, unknown>\r\n\r\n if (!groupDataFrom) break\r\n\r\n const groupDataTranslated =\r\n (siblingDataTranslated[field.name] as Record<string, unknown>) ?? {}\r\n\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: field.fields,\r\n localizedParent: field.localized,\r\n siblingDataFrom: groupDataFrom,\r\n siblingDataTranslated: groupDataTranslated,\r\n translatedData,\r\n valuesToTranslate,\r\n })\r\n\r\n break\r\n }\r\n\r\n case 'array': {\r\n const arrayDataFrom = siblingDataFrom[field.name] as {\r\n id: string\r\n }[]\r\n\r\n if (isEmpty(arrayDataFrom)) break\r\n\r\n let arrayDataTranslated =\r\n (siblingDataTranslated[field.name] as { id: string }[] | undefined) ?? []\r\n\r\n if (field.localized || localizedParent) {\r\n if (arrayDataTranslated.length > 0 && emptyOnly) break\r\n\r\n arrayDataTranslated = arrayDataFrom.map(() => ({\r\n id: ObjectID().toHexString(),\r\n }))\r\n }\r\n\r\n arrayDataTranslated.forEach((item, index) => {\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: field.fields,\r\n localizedParent: localizedParent ?? field.localized,\r\n siblingDataFrom: arrayDataFrom[index],\r\n siblingDataTranslated: item,\r\n translatedData,\r\n valuesToTranslate,\r\n })\r\n })\r\n\r\n siblingDataTranslated[field.name] = arrayDataTranslated\r\n\r\n break\r\n }\r\n\r\n case 'blocks': {\r\n const blocksDataFrom = siblingDataFrom[field.name] as {\r\n blockType: string\r\n id: string\r\n }[]\r\n\r\n if (isEmpty(blocksDataFrom)) break\r\n\r\n let blocksDataTranslated =\r\n (siblingDataTranslated[field.name] as { blockType: string; id: string }[] | undefined) ??\r\n []\r\n\r\n if (field.localized || localizedParent) {\r\n if (blocksDataTranslated.length > 0 && emptyOnly) break\r\n\r\n blocksDataTranslated = blocksDataFrom.map(({ blockType }) => ({\r\n blockType,\r\n id: ObjectID().toHexString(),\r\n }))\r\n }\r\n\r\n blocksDataTranslated.forEach((item, index) => {\r\n const block = field.blocks.find((each) => each.slug === item.blockType)\r\n\r\n if (!block) return\r\n\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: block.fields,\r\n localizedParent: localizedParent ?? field.localized,\r\n siblingDataFrom: blocksDataFrom[index],\r\n siblingDataTranslated: item,\r\n translatedData,\r\n valuesToTranslate,\r\n })\r\n })\r\n\r\n siblingDataTranslated[field.name] = blocksDataTranslated\r\n\r\n break\r\n }\r\n\r\n case 'collapsible':\r\n case 'row':\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: field.fields,\r\n localizedParent,\r\n siblingDataFrom,\r\n siblingDataTranslated,\r\n translatedData,\r\n valuesToTranslate,\r\n })\r\n break\r\n\r\n // long ass cases here we have\r\n case 'date':\r\n case 'checkbox':\r\n case 'json':\r\n case 'code':\r\n case 'email':\r\n case 'number':\r\n case 'point':\r\n case 'radio':\r\n case 'relationship':\r\n case 'select':\r\n case 'upload':\r\n siblingDataTranslated[field.name] = siblingDataFrom[field.name]\r\n\r\n break\r\n\r\n case 'text':\r\n case 'textarea':\r\n if (field.custom && typeof field.custom === 'object' && field.custom.translatorSkip) break\r\n\r\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break\r\n if (emptyOnly && siblingDataTranslated[field.name]) break\r\n\r\n // do not translate the block ID or admin-facing label\r\n if (field.name === 'blockName' || field.name === 'id') {\r\n break\r\n }\r\n\r\n valuesToTranslate.push({\r\n onTranslate: (translated: string) => {\r\n siblingDataTranslated[field.name] = translated\r\n },\r\n value: siblingDataFrom[field.name],\r\n })\r\n break\r\n\r\n case 'richText': {\r\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break\r\n if (emptyOnly && siblingDataTranslated[field.name]) break\r\n\r\n const richTextDataFrom = siblingDataFrom[field.name] as object\r\n\r\n siblingDataTranslated[field.name] = richTextDataFrom\r\n\r\n if (!richTextDataFrom) break\r\n\r\n const isSlate = Array.isArray(richTextDataFrom)\r\n\r\n const isLexical = 'root' in richTextDataFrom\r\n\r\n if (!isSlate && !isLexical) break\r\n\r\n if (isLexical) {\r\n const root = (siblingDataTranslated[field.name] as Record<string, unknown>)\r\n ?.root as Record<string, unknown>\r\n\r\n if (root)\r\n traverseRichText({\r\n onText: (siblingData) => {\r\n valuesToTranslate.push({\r\n onTranslate: (translated: string) => {\r\n siblingData.text = translated\r\n },\r\n value: siblingData.text,\r\n })\r\n },\r\n root,\r\n })\r\n } else {\r\n for (const root of siblingDataTranslated[field.name] as unknown[]) {\r\n traverseRichText({\r\n onText: (siblingData) => {\r\n valuesToTranslate.push({\r\n onTranslate: (translated: string) => {\r\n siblingData.text = translated\r\n },\r\n value: siblingData.text,\r\n })\r\n },\r\n root: root as Record<string, unknown>,\r\n })\r\n }\r\n }\r\n\r\n break\r\n }\r\n\r\n default:\r\n break\r\n }\r\n }\r\n}\r\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","arrayDataFrom","arrayDataTranslated","length","map","id","toHexString","forEach","item","index","blocksDataFrom","blocksDataTranslated","blockType","block","blocks","find","each","slug","custom","translatorSkip","push","onTranslate","translated","value","richTextDataFrom","isSlate","Array","isArray","isLexical","root","onText","siblingData","text"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/translate/traverseFields.ts"],"sourcesContent":["import ObjectID from 'bson-objectid'\r\nimport type { Field } from 'payload'\r\nimport { tabHasName } from 'payload/shared'\r\n\r\nimport { isEmpty } from '../utils/isEmpty'\r\nimport { traverseRichText } from './traverseRichText'\r\nimport type { ValueToTranslate } from './types'\r\n\r\nexport const traverseFields = ({\r\n dataFrom,\r\n emptyOnly,\r\n fields,\r\n localizedParent,\r\n siblingDataFrom,\r\n siblingDataTranslated,\r\n translatedData,\r\n valuesToTranslate,\r\n\r\n _options: { additionalTraverseRichText } = {}\r\n }: {\r\n dataFrom: Record<string, unknown>\r\n emptyOnly?: boolean\r\n fields: Field[]\r\n localizedParent?: boolean\r\n siblingDataFrom?: Record<string, unknown>\r\n siblingDataTranslated?: Record<string, unknown>\r\n translatedData: Record<string, unknown>\r\n valuesToTranslate: ValueToTranslate[],\r\n\r\n _options?: {\r\n additionalTraverseRichText?: typeof traverseRichText\r\n }\r\n}) => {\r\n siblingDataFrom = siblingDataFrom ?? dataFrom\r\n siblingDataTranslated = siblingDataTranslated ?? translatedData\r\n\r\n for (const field of fields) {\r\n switch (field.type) {\r\n case 'tabs':\r\n for (const tab of field.tabs) {\r\n const hasName = tabHasName(tab)\r\n\r\n const tabDataFrom = hasName\r\n ? (siblingDataFrom[tab.name] as Record<string, unknown>)\r\n : siblingDataFrom\r\n\r\n if (!tabDataFrom) return\r\n\r\n let tabDataTranslated: Record<string, unknown>\r\n\r\n if (hasName) {\r\n if (!siblingDataTranslated[tab.name])\r\n siblingDataTranslated[tab.name] = {}\r\n\r\n tabDataTranslated = siblingDataTranslated[tab.name] as Record<string, unknown>\r\n } else {\r\n tabDataTranslated = siblingDataTranslated\r\n }\r\n\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: tab.fields,\r\n localizedParent: tab.localized,\r\n siblingDataFrom: tabDataFrom,\r\n siblingDataTranslated: tabDataTranslated,\r\n translatedData,\r\n valuesToTranslate\r\n })\r\n }\r\n\r\n break\r\n\r\n case 'group': {\r\n if (!('name' in field)) break\r\n\r\n const groupDataFrom = siblingDataFrom[field.name] as Record<string, unknown>\r\n\r\n if (!groupDataFrom) break\r\n\r\n if(!siblingDataTranslated[field.name])\r\n siblingDataTranslated[field.name] = {}\r\n\r\n const groupDataTranslated = siblingDataTranslated[field.name] as Record<string, unknown>\r\n\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: field.fields,\r\n localizedParent: field.localized,\r\n siblingDataFrom: groupDataFrom,\r\n siblingDataTranslated: groupDataTranslated,\r\n translatedData,\r\n valuesToTranslate\r\n })\r\n\r\n break\r\n }\r\n\r\n case 'array': {\r\n const arrayDataFrom = siblingDataFrom[field.name] as {\r\n id: string\r\n }[]\r\n\r\n if (isEmpty(arrayDataFrom)) break\r\n\r\n if(!siblingDataTranslated[field.name])\r\n siblingDataTranslated[field.name] = []\r\n\r\n let arrayDataTranslated = siblingDataTranslated[field.name] as { id: string }[]\r\n\r\n if (field.localized || localizedParent) {\r\n if (arrayDataTranslated.length > 0 && emptyOnly) break\r\n\r\n arrayDataTranslated = arrayDataFrom.map(() => ({\r\n id: ObjectID().toHexString()\r\n }))\r\n }\r\n\r\n arrayDataTranslated.forEach((item, index) => {\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: field.fields,\r\n localizedParent: localizedParent ?? field.localized,\r\n siblingDataFrom: arrayDataFrom[index],\r\n siblingDataTranslated: item,\r\n translatedData,\r\n valuesToTranslate\r\n })\r\n })\r\n\r\n siblingDataTranslated[field.name] = arrayDataTranslated\r\n\r\n break\r\n }\r\n\r\n case 'blocks': {\r\n const blocksDataFrom = siblingDataFrom[field.name] as {\r\n blockType: string\r\n id: string\r\n }[]\r\n\r\n if (isEmpty(blocksDataFrom)) break\r\n\r\n if (!siblingDataTranslated[field.name])\r\n siblingDataTranslated[field.name] = []\r\n\r\n let blocksDataTranslated = siblingDataTranslated[field.name] as { blockType: string; id: string }[]\r\n\r\n if (field.localized || localizedParent) {\r\n if (blocksDataTranslated.length > 0 && emptyOnly) break\r\n\r\n blocksDataTranslated = blocksDataFrom.map(({ blockType }) => ({\r\n blockType,\r\n id: ObjectID().toHexString()\r\n }))\r\n }\r\n\r\n blocksDataTranslated.forEach((item, index) => {\r\n const block = field.blocks.find((each) => each.slug === item.blockType)\r\n\r\n if (!block) return\r\n\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: block.fields,\r\n localizedParent: localizedParent ?? field.localized,\r\n siblingDataFrom: blocksDataFrom[index],\r\n siblingDataTranslated: item,\r\n translatedData,\r\n valuesToTranslate\r\n })\r\n })\r\n\r\n siblingDataTranslated[field.name] = blocksDataTranslated\r\n\r\n break\r\n }\r\n\r\n case 'collapsible':\r\n case 'row':\r\n traverseFields({\r\n dataFrom,\r\n emptyOnly,\r\n fields: field.fields,\r\n localizedParent,\r\n siblingDataFrom,\r\n siblingDataTranslated,\r\n translatedData,\r\n valuesToTranslate\r\n })\r\n break\r\n\r\n // long ass cases here we have\r\n case 'date':\r\n case 'checkbox':\r\n case 'json':\r\n case 'code':\r\n case 'email':\r\n case 'number':\r\n case 'point':\r\n case 'radio':\r\n case 'relationship':\r\n case 'select':\r\n case 'upload':\r\n siblingDataTranslated[field.name] = siblingDataFrom[field.name]\r\n\r\n break\r\n\r\n case 'text':\r\n case 'textarea':\r\n if (field.custom && typeof field.custom === 'object' && field.custom.translatorSkip) break\r\n\r\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break\r\n if (emptyOnly && siblingDataTranslated[field.name]) break\r\n\r\n // do not translate the block ID or admin-facing label\r\n if (field.name === 'blockName' || field.name === 'id') {\r\n break\r\n }\r\n\r\n valuesToTranslate.push({\r\n onTranslate: (translated: string) => {\r\n siblingDataTranslated[field.name] = translated\r\n },\r\n value: siblingDataFrom[field.name]\r\n })\r\n break\r\n\r\n case 'richText': {\r\n if (!(field.localized || localizedParent) || isEmpty(siblingDataFrom[field.name])) break\r\n if (emptyOnly && siblingDataTranslated[field.name]) break\r\n\r\n const richTextDataFrom = siblingDataFrom[field.name] as object\r\n\r\n siblingDataTranslated[field.name] = richTextDataFrom\r\n\r\n if (!richTextDataFrom) break\r\n\r\n const isSlate = Array.isArray(richTextDataFrom)\r\n\r\n const isLexical = 'root' in richTextDataFrom\r\n\r\n if (!isSlate && !isLexical) break\r\n\r\n if (isLexical) {\r\n const root = (siblingDataTranslated[field.name] as Record<string, unknown>)\r\n ?.root as Record<string, unknown>\r\n\r\n if (root)\r\n traverseRichText({\r\n onText: (siblingData, attribute = 'text') => {\r\n valuesToTranslate.push({\r\n onTranslate: (translated: string) => {\r\n siblingData[attribute] = translated\r\n },\r\n value: siblingData[attribute]\r\n })\r\n },\r\n root,\r\n\r\n additionalTraverseRichText\r\n })\r\n } else {\r\n for (const root of siblingDataTranslated[field.name] as unknown[]) {\r\n traverseRichText({\r\n onText: (siblingData, attribute = 'text') => {\r\n valuesToTranslate.push({\r\n onTranslate: (translated: string) => {\r\n siblingData[attribute] = translated\r\n },\r\n value: siblingData[attribute]\r\n })\r\n },\r\n root: root as Record<string, unknown>,\r\n\r\n additionalTraverseRichText\r\n })\r\n }\r\n }\r\n\r\n break\r\n }\r\n\r\n default:\r\n break\r\n }\r\n }\r\n}\r\n"],"names":["ObjectID","tabHasName","isEmpty","traverseRichText","traverseFields","dataFrom","emptyOnly","fields","localizedParent","siblingDataFrom","siblingDataTranslated","translatedData","valuesToTranslate","_options","additionalTraverseRichText","field","type","tab","tabs","hasName","tabDataFrom","name","tabDataTranslated","localized","groupDataFrom","groupDataTranslated","arrayDataFrom","arrayDataTranslated","length","map","id","toHexString","forEach","item","index","blocksDataFrom","blocksDataTranslated","blockType","block","blocks","find","each","slug","custom","translatorSkip","push","onTranslate","translated","value","richTextDataFrom","isSlate","Array","isArray","isLexical","root","onText","siblingData","attribute"],"mappings":"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"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
onText: (siblingData: Record<string, unknown
|
|
1
|
+
type TraverseRichTextParams = {
|
|
2
|
+
onText: (siblingData: Record<string, unknown>, attribute?: string) => void;
|
|
3
3
|
root: Record<string, unknown>;
|
|
4
4
|
siblingData?: Record<string, unknown>;
|
|
5
|
+
};
|
|
6
|
+
export declare const traverseRichText: ({ onText, root, siblingData, additionalTraverseRichText }: TraverseRichTextParams & {
|
|
7
|
+
additionalTraverseRichText?: (args: TraverseRichTextParams) => void;
|
|
5
8
|
}) => void;
|
|
9
|
+
export {};
|
|
6
10
|
//# sourceMappingURL=traverseRichText.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverseRichText.d.ts","sourceRoot":"","sources":["../../src/translate/traverseRichText.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"traverseRichText.d.ts","sourceRoot":"","sources":["../../src/translate/traverseRichText.ts"],"names":[],"mappings":"AAAA,KAAK,sBAAsB,GAAG;IAC5B,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACtC,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,2DAMG,sBAAsB,GAAG;IAC3D,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,IAAI,CAAA;CACpE,SAkBA,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const traverseRichText = ({ onText, root, siblingData })=>{
|
|
1
|
+
export const traverseRichText = ({ onText, root, siblingData, additionalTraverseRichText })=>{
|
|
2
2
|
siblingData = siblingData ?? root;
|
|
3
3
|
if (siblingData.text) {
|
|
4
4
|
onText(siblingData);
|
|
@@ -11,11 +11,11 @@ export const traverseRichText = ({ onText, root, siblingData })=>{
|
|
|
11
11
|
siblingData: child
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
|
-
} else
|
|
15
|
-
|
|
14
|
+
} else {
|
|
15
|
+
additionalTraverseRichText?.({
|
|
16
16
|
onText,
|
|
17
17
|
root,
|
|
18
|
-
siblingData
|
|
18
|
+
siblingData
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
21
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translate/traverseRichText.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/translate/traverseRichText.ts"],"sourcesContent":["type TraverseRichTextParams = {\r\n onText: (siblingData: Record<string, unknown>, attribute?: string) => void\r\n root: Record<string, unknown>\r\n siblingData?: Record<string, unknown>\r\n}\r\n\r\nexport const traverseRichText = ({\r\n onText,\r\n root,\r\n siblingData,\r\n\r\n additionalTraverseRichText\r\n }: TraverseRichTextParams & {\r\n additionalTraverseRichText?: (args: TraverseRichTextParams) => void\r\n}) => {\r\n siblingData = siblingData ?? root\r\n\r\n if (siblingData.text) {\r\n onText(siblingData)\r\n }\r\n\r\n if (Array.isArray(siblingData?.children)) {\r\n for (const child of siblingData.children) {\r\n traverseRichText({\r\n onText,\r\n root,\r\n siblingData: child\r\n })\r\n }\r\n } else {\r\n additionalTraverseRichText?.({ onText, root, siblingData })\r\n }\r\n}\r\n"],"names":["traverseRichText","onText","root","siblingData","additionalTraverseRichText","text","Array","isArray","children","child"],"mappings":"AAMA,OAAO,MAAMA,mBAAmB,CAAC,EACEC,MAAM,EACNC,IAAI,EACJC,WAAW,EAEXC,0BAA0B,EAG5D;IACCD,cAAcA,eAAeD;IAE7B,IAAIC,YAAYE,IAAI,EAAE;QACpBJ,OAAOE;IACT;IAEA,IAAIG,MAAMC,OAAO,CAACJ,aAAaK,WAAW;QACxC,KAAK,MAAMC,SAASN,YAAYK,QAAQ,CAAE;YACxCR,iBAAiB;gBACfC;gBACAC;gBACAC,aAAaM;YACf;QACF;IACF,OAAO;QACLL,6BAA6B;YAAEH;YAAQC;YAAMC;QAAY;IAC3D;AACF,EAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CollectionSlug, GlobalSlug } from 'payload';
|
|
2
2
|
import type { TranslateResolver } from './resolvers/types';
|
|
3
|
+
import { traverseFields } from "./translate/traverseFields";
|
|
3
4
|
export type TranslatorConfig = {
|
|
4
5
|
/**
|
|
5
6
|
* Collections with the enabled translator in the admin UI
|
|
@@ -17,5 +18,6 @@ export type TranslatorConfig = {
|
|
|
17
18
|
* Add resolvers that you want to include, examples on how to write your own in ./plugin/src/resolvers
|
|
18
19
|
*/
|
|
19
20
|
resolvers: TranslateResolver[];
|
|
21
|
+
_options?: Parameters<typeof traverseFields>[0]['_options'];
|
|
20
22
|
};
|
|
21
23
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,WAAW,EAAE,cAAc,EAAE,CAAA;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB;;OAEG;IACH,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAE/B,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;CAC5D,CAAA"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CollectionSlug, GlobalSlug } from 'payload'\r\n\r\nimport type { TranslateResolver } from './resolvers/types'\r\n\r\nexport type TranslatorConfig = {\r\n /**\r\n * Collections with the enabled translator in the admin UI\r\n */\r\n collections: CollectionSlug[]\r\n /**\r\n * Disable the plugin\r\n */\r\n disabled?: boolean\r\n /**\r\n * Globals with the enabled translator in the admin UI\r\n */\r\n globals: GlobalSlug[]\r\n /**\r\n * Add resolvers that you want to include, examples on how to write your own in ./plugin/src/resolvers\r\n */\r\n resolvers: TranslateResolver[]\r\n}\r\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CollectionSlug, GlobalSlug } from 'payload'\r\n\r\nimport type { TranslateResolver } from './resolvers/types'\r\nimport { traverseFields } from \"./translate/traverseFields\"\r\n\r\nexport type TranslatorConfig = {\r\n /**\r\n * Collections with the enabled translator in the admin UI\r\n */\r\n collections: CollectionSlug[]\r\n /**\r\n * Disable the plugin\r\n */\r\n disabled?: boolean\r\n /**\r\n * Globals with the enabled translator in the admin UI\r\n */\r\n globals: GlobalSlug[]\r\n /**\r\n * Add resolvers that you want to include, examples on how to write your own in ./plugin/src/resolvers\r\n */\r\n resolvers: TranslateResolver[],\r\n\r\n _options?: Parameters<typeof traverseFields>[0]['_options']\r\n}\r\n"],"names":[],"mappings":"AAKA,WAmBC"}
|