payload-ai 0.0.52 → 0.0.53
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/README.md +1 -0
- package/dist/aiTranslate.d.ts +1 -1
- package/dist/aiTranslate.js +2 -6
- package/dist/aiTranslate.js.map +1 -1
- package/dist/components/Translator/index.js +34 -8
- package/dist/components/Translator/index.js.map +1 -1
- package/dist/deepCompareAndMerge.d.ts +1 -1
- package/dist/deepCompareAndMerge.js +9 -4
- package/dist/deepCompareAndMerge.js.map +1 -1
- package/dist/handleTranslate.js +3 -1
- package/dist/handleTranslate.js.map +1 -1
- package/dist/translateTextAndObjects.d.ts +1 -1
- package/dist/translateTextAndObjects.js +35 -27
- package/dist/translateTextAndObjects.js.map +1 -1
- package/package.json +1 -1
- package/src/aiTranslate.ts +2 -9
- package/src/components/Translator/index.tsx +46 -8
- package/src/deepCompareAndMerge.ts +7 -3
- package/src/handleTranslate.ts +3 -0
- package/src/translateTextAndObjects.ts +21 -10
package/README.md
CHANGED
|
@@ -133,6 +133,7 @@ plugins: [
|
|
|
133
133
|
- custom access control
|
|
134
134
|
- custom overrides for translation
|
|
135
135
|
- generate images based on input
|
|
136
|
+
- generate Open Graph based on content
|
|
136
137
|
|
|
137
138
|
Payload is built with a robust infrastructure intended to support Plugins with ease. This provides a simple, modular, and reusable way for developers to extend the core capabilities of Payload.
|
|
138
139
|
|
package/dist/aiTranslate.d.ts
CHANGED
|
@@ -4,4 +4,4 @@ declare const aiTranslateHook: ({ collectionOptions, collection }: {
|
|
|
4
4
|
collection: object;
|
|
5
5
|
}, fallback?: string) => CollectionAfterChangeHook;
|
|
6
6
|
export default aiTranslateHook;
|
|
7
|
-
export declare function translateCollection({ req, doc, collection, previousDoc, context, collectionOptions, onlyMissing, codes, }: any): Promise<void>;
|
|
7
|
+
export declare function translateCollection({ req, doc, collection, previousDoc, context, collectionOptions, onlyMissing, codes, settings, }: any): Promise<void>;
|
package/dist/aiTranslate.js
CHANGED
|
@@ -72,7 +72,7 @@ var aiTranslateHook = function (_a, fallback) {
|
|
|
72
72
|
};
|
|
73
73
|
exports.default = aiTranslateHook;
|
|
74
74
|
function translateCollection(_a) {
|
|
75
|
-
var req = _a.req, doc = _a.doc, collection = _a.collection, previousDoc = _a.previousDoc, context = _a.context, collectionOptions = _a.collectionOptions, onlyMissing = _a.onlyMissing, codes = _a.codes;
|
|
75
|
+
var req = _a.req, doc = _a.doc, collection = _a.collection, previousDoc = _a.previousDoc, context = _a.context, collectionOptions = _a.collectionOptions, onlyMissing = _a.onlyMissing, codes = _a.codes, settings = _a.settings;
|
|
76
76
|
return __awaiter(this, void 0, void 0, function () {
|
|
77
77
|
var localCodes, translationPromises, translationResults, _i, translationResults_1, translatedContent, updatedLanguage;
|
|
78
78
|
var _this = this;
|
|
@@ -83,10 +83,6 @@ function translateCollection(_a) {
|
|
|
83
83
|
req.locale !== req.payload.config.localization.defaultLocale)
|
|
84
84
|
return [2 /*return*/];
|
|
85
85
|
localCodes = req.payload.config.localization.localeCodes;
|
|
86
|
-
console.log('filter codes', localCodes.filter(function (targetLanguage) {
|
|
87
|
-
return targetLanguage !== req.payload.config.localization.defaultLocale &&
|
|
88
|
-
(!codes || codes.includes(targetLanguage));
|
|
89
|
-
}));
|
|
90
86
|
translationPromises = localCodes
|
|
91
87
|
.filter(function (targetLanguage) {
|
|
92
88
|
return targetLanguage !== req.payload.config.localization.defaultLocale &&
|
|
@@ -106,7 +102,7 @@ function translateCollection(_a) {
|
|
|
106
102
|
})];
|
|
107
103
|
case 1:
|
|
108
104
|
targetDoc = _a.sent();
|
|
109
|
-
return [4 /*yield*/, (0, deepCompareAndMerge_1.deepCompareTranslateAndMerge)(doc, previousDoc, targetDoc, collectionOptions.fields, tL, previousDoc.id ? 'update' : 'create', onlyMissing, req.payload.config.localization.defaultLocale)];
|
|
105
|
+
return [4 /*yield*/, (0, deepCompareAndMerge_1.deepCompareTranslateAndMerge)(doc, previousDoc, targetDoc, collectionOptions.fields, tL, previousDoc.id ? 'update' : 'create', onlyMissing, req.payload.config.localization.defaultLocale, settings)];
|
|
110
106
|
case 2:
|
|
111
107
|
targetDocWithTranslation = _a.sent();
|
|
112
108
|
id = targetDocWithTranslation.id, _status = targetDocWithTranslation._status, updatedAt = targetDocWithTranslation.updatedAt, createdAt = targetDocWithTranslation.createdAt, publishedDate = targetDocWithTranslation.publishedDate, dataNew = __rest(targetDocWithTranslation, ["id", "_status", "updatedAt", "createdAt", "publishedDate"]);
|
package/dist/aiTranslate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiTranslate.js","sourceRoot":"","sources":["../src/aiTranslate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,6DAAoE;AAEpE,IAAM,eAAe,GACnB,UACE,EAAiF,EACjF,QAAiB;QADf,iBAAiB,uBAAA,EAAE,UAAU,gBAAA;IAGjC,OAAA,UAAO,EAA8C;YAA5C,GAAG,SAAA,EAAE,GAAG,SAAA,EAAE,WAAW,iBAAA,EAAE,OAAO,aAAA,EAAE,UAAU,gBAAA;;;;4BAC1C,qBAAM,mBAAmB,CAAC;4BAC/B,GAAG,KAAA;4BACH,GAAG,KAAA;4BACH,WAAW,aAAA;4BACX,OAAO,SAAA;4BACP,UAAU,YAAA;4BACV,iBAAiB,mBAAA;yBAClB,CAAC,EAAA;4BAPF,sBAAO,SAOL,EAAA;;;;KACH;AATD,CASC,CAAA;AAEH,kBAAe,eAAe,CAAA;AAE9B,SAAsB,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"aiTranslate.js","sourceRoot":"","sources":["../src/aiTranslate.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,6 +87,7 @@ var elements_1 = require("payload/components/elements");
|
|
|
87
87
|
var utilities_1 = require("payload/components/utilities");
|
|
88
88
|
var modal_1 = require("@faceless-ui/modal");
|
|
89
89
|
require("./Translator.scss");
|
|
90
|
+
var forms_1 = require("payload/components/forms");
|
|
90
91
|
var baseClass = 'after-dashboard';
|
|
91
92
|
// React.FC<TogglerProps>
|
|
92
93
|
/*
|
|
@@ -111,16 +112,21 @@ var DrawerTogglerAlt = function (_a) {
|
|
|
111
112
|
exports.DrawerTogglerAlt = DrawerTogglerAlt;
|
|
112
113
|
var Translator = function () {
|
|
113
114
|
var baseClass = 'ai-translator';
|
|
115
|
+
//const { fields, getDataByPath } = useForm()
|
|
114
116
|
var _a = react_1.default.useState(false), isLoading = _a[0], setIsLoading = _a[1];
|
|
117
|
+
var _b = react_1.default.useState('default'), selectedModel = _b[0], setSelectedModel = _b[1];
|
|
115
118
|
var locale = (0, utilities_1.useLocale)();
|
|
116
119
|
var documentInfo = (0, utilities_1.useDocumentInfo)();
|
|
117
120
|
var translate = function (_a) {
|
|
118
121
|
var codes = _a.codes;
|
|
119
122
|
return __awaiter(void 0, void 0, void 0, function () {
|
|
120
|
-
var response, translatedValues, error_1;
|
|
123
|
+
var settings, response, translatedValues, error_1;
|
|
121
124
|
return __generator(this, function (_b) {
|
|
122
125
|
switch (_b.label) {
|
|
123
126
|
case 0:
|
|
127
|
+
settings = {
|
|
128
|
+
model: selectedModel === 'default' ? undefined : selectedModel,
|
|
129
|
+
};
|
|
124
130
|
setIsLoading(true);
|
|
125
131
|
_b.label = 1;
|
|
126
132
|
case 1:
|
|
@@ -133,6 +139,7 @@ var Translator = function () {
|
|
|
133
139
|
body: JSON.stringify({
|
|
134
140
|
id: documentInfo.id,
|
|
135
141
|
codes: codes,
|
|
142
|
+
settings: settings,
|
|
136
143
|
}),
|
|
137
144
|
})];
|
|
138
145
|
case 2:
|
|
@@ -162,15 +169,34 @@ var Translator = function () {
|
|
|
162
169
|
/*
|
|
163
170
|
<Button onClick={handleClick}>Results are loading...</Button>
|
|
164
171
|
*/
|
|
172
|
+
var options = [
|
|
173
|
+
{
|
|
174
|
+
label: 'Default',
|
|
175
|
+
value: 'default',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
label: 'GPT-3.5 Turbo (1106)',
|
|
179
|
+
value: 'gpt-3.5-turbo-1106',
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
label: 'GPT-4',
|
|
183
|
+
value: 'gpt-4',
|
|
184
|
+
},
|
|
185
|
+
];
|
|
165
186
|
return (react_1.default.createElement("div", { className: baseClass },
|
|
166
187
|
react_1.default.createElement(elements_1.DrawerToggler, { slug: "ai-translator", className: "".concat(baseClass, "__drawer__toggler") }, "Translator"),
|
|
167
|
-
react_1.default.createElement(elements_1.Drawer, { title: "Translator", slug: "ai-translator" }, isLoading ? (react_1.default.createElement(elements_1.Button, { disabled: true }, "Results are loading...")) : (react_1.default.createElement(
|
|
168
|
-
react_1.default.createElement(
|
|
169
|
-
react_1.default.createElement(
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
188
|
+
react_1.default.createElement(elements_1.Drawer, { title: "Translator", slug: "ai-translator" }, isLoading ? (react_1.default.createElement(elements_1.Button, { disabled: true }, "Results are loading...")) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
189
|
+
react_1.default.createElement("div", null,
|
|
190
|
+
react_1.default.createElement(forms_1.SelectInput, { onChange: function (e) {
|
|
191
|
+
setSelectedModel(e.value);
|
|
192
|
+
}, name: "selectedModel", value: selectedModel, path: "model", options: options })),
|
|
193
|
+
react_1.default.createElement("div", { className: "".concat(baseClass, "__translation-buttons") },
|
|
194
|
+
react_1.default.createElement(elements_1.Button, { disabled: isLoading, onClick: function () { return translate({}); } },
|
|
195
|
+
react_1.default.createElement("span", null, "Translate content to all languages")),
|
|
196
|
+
react_1.default.createElement(elements_1.Button, { disabled: isLoading, onClick: function () { return translate({ codes: [locale.code] }); } },
|
|
197
|
+
react_1.default.createElement("span", null,
|
|
198
|
+
"Translate only ",
|
|
199
|
+
locale.label))))))));
|
|
174
200
|
};
|
|
175
201
|
exports.Translator = Translator;
|
|
176
202
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Translator/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA0C;AAE1C,wDAA2E;AAC3E,0DAAyE;AACzE,4CAA6C;AAC7C,6BAA0B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Translator/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
interface CollectionObjType {
|
|
2
2
|
[prop: string]: any;
|
|
3
3
|
}
|
|
4
|
-
export declare function deepCompareTranslateAndMerge(newOriginalObj: CollectionObjType, originalObj: CollectionObjType, targetObj: CollectionObjType, fields: string[], language: string, action?: 'create' | 'update', onlyMissing?: boolean, sourceLanguage?: string): Promise<CollectionObjType>;
|
|
4
|
+
export declare function deepCompareTranslateAndMerge(newOriginalObj: CollectionObjType, originalObj: CollectionObjType, targetObj: CollectionObjType, fields: string[], language: string, action?: 'create' | 'update', onlyMissing?: boolean, sourceLanguage?: string, settings?: any): Promise<CollectionObjType>;
|
|
5
5
|
export {};
|
|
@@ -39,7 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.deepCompareTranslateAndMerge = void 0;
|
|
40
40
|
var translateTextAndObjects_1 = require("./translateTextAndObjects");
|
|
41
41
|
var colllectionObj = {}; // Assuming targetObj is initialized somewhere
|
|
42
|
-
function deepCompareTranslateAndMerge(newOriginalObj, originalObj, targetObj, fields, language, action, onlyMissing, sourceLanguage) {
|
|
42
|
+
function deepCompareTranslateAndMerge(newOriginalObj, originalObj, targetObj, fields, language, action, onlyMissing, sourceLanguage, settings) {
|
|
43
43
|
return __awaiter(this, void 0, void 0, function () {
|
|
44
44
|
var promises;
|
|
45
45
|
var _this = this;
|
|
@@ -48,7 +48,7 @@ function deepCompareTranslateAndMerge(newOriginalObj, originalObj, targetObj, fi
|
|
|
48
48
|
case 0:
|
|
49
49
|
if (!Array.isArray(newOriginalObj)) return [3 /*break*/, 1];
|
|
50
50
|
return [2 /*return*/, Promise.all(newOriginalObj.map(function (item, index) {
|
|
51
|
-
return deepCompareTranslateAndMerge(item, originalObj === null || originalObj === void 0 ? void 0 : originalObj[index], targetObj === null || targetObj === void 0 ? void 0 : targetObj[index], fields, language, action, onlyMissing, sourceLanguage);
|
|
51
|
+
return deepCompareTranslateAndMerge(item, originalObj === null || originalObj === void 0 ? void 0 : originalObj[index], targetObj === null || targetObj === void 0 ? void 0 : targetObj[index], fields, language, action, onlyMissing, sourceLanguage, settings);
|
|
52
52
|
}))];
|
|
53
53
|
case 1:
|
|
54
54
|
if (!(typeof newOriginalObj === 'object' && newOriginalObj !== null)) return [3 /*break*/, 3];
|
|
@@ -65,7 +65,12 @@ function deepCompareTranslateAndMerge(newOriginalObj, originalObj, targetObj, fi
|
|
|
65
65
|
if (!(!onlyMissing || targetObj[prop] === undefined || targetObj[prop] === '')) return [3 /*break*/, 2];
|
|
66
66
|
_a = targetObj;
|
|
67
67
|
_b = prop;
|
|
68
|
-
return [4 /*yield*/, (0, translateTextAndObjects_1.translateTextOrObject)(
|
|
68
|
+
return [4 /*yield*/, (0, translateTextAndObjects_1.translateTextOrObject)({
|
|
69
|
+
text: newOriginalObj[prop],
|
|
70
|
+
language: language,
|
|
71
|
+
sourceLanguage: sourceLanguage,
|
|
72
|
+
settings: settings,
|
|
73
|
+
})];
|
|
69
74
|
case 1:
|
|
70
75
|
_a[_b] = _e.sent();
|
|
71
76
|
return [3 /*break*/, 2];
|
|
@@ -75,7 +80,7 @@ function deepCompareTranslateAndMerge(newOriginalObj, originalObj, targetObj, fi
|
|
|
75
80
|
typeof targetObj[prop] === 'object')) return [3 /*break*/, 5];
|
|
76
81
|
_c = targetObj;
|
|
77
82
|
_d = prop;
|
|
78
|
-
return [4 /*yield*/, deepCompareTranslateAndMerge(newOriginalObj[prop], (originalObj === null || originalObj === void 0 ? void 0 : originalObj[prop]) || null, targetObj[prop] || null, fields, language, action, onlyMissing, sourceLanguage)];
|
|
83
|
+
return [4 /*yield*/, deepCompareTranslateAndMerge(newOriginalObj[prop], (originalObj === null || originalObj === void 0 ? void 0 : originalObj[prop]) || null, targetObj[prop] || null, fields, language, action, onlyMissing, sourceLanguage, settings)];
|
|
79
84
|
case 4:
|
|
80
85
|
_c[_d] = _e.sent();
|
|
81
86
|
_e.label = 5;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepCompareAndMerge.js","sourceRoot":"","sources":["../src/deepCompareAndMerge.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qEAAiE;AAMjE,IAAI,cAAc,GAAsB,EAAE,CAAA,CAAC,8CAA8C;AAIzF,SAAsB,4BAA4B,CAChD,cAAiC,EACjC,WAA8B,EAC9B,SAA4B,EAC5B,MAAgB,EAChB,QAAgB,EAChB,MAA4B,EAC5B,WAAqB,EACrB,cAAuB;;;;;;;
|
|
1
|
+
{"version":3,"file":"deepCompareAndMerge.js","sourceRoot":"","sources":["../src/deepCompareAndMerge.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qEAAiE;AAMjE,IAAI,cAAc,GAAsB,EAAE,CAAA,CAAC,8CAA8C;AAIzF,SAAsB,4BAA4B,CAChD,cAAiC,EACjC,WAA8B,EAC9B,SAA4B,EAC5B,MAAgB,EAChB,QAAgB,EAChB,MAA4B,EAC5B,WAAqB,EACrB,cAAuB,EACvB,QAAc;;;;;;;yBAEV,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAA7B,wBAA6B;oBAC/B,sBAAO,OAAO,CAAC,GAAG,CAChB,cAAc,CAAC,GAAG,CAAC,UAAC,IAAI,EAAE,KAAK;4BAC7B,OAAA,4BAA4B,CAC1B,IAAI,EACJ,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAG,KAAK,CAAC,EACpB,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAG,KAAK,CAAC,EAClB,MAAM,EACN,QAAQ,EACR,MAAM,EACN,WAAW,EACX,cAAc,EACd,QAAQ,CACT;wBAVD,CAUC,CACF,CACF,EAAA;;yBACQ,CAAA,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,IAAI,CAAA,EAA7D,wBAA6D;oBAChE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,UAAM,IAAI;;;;;yCACrD,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,EAAnC,wBAAmC;yCACjC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,+CAA+C,EAArE,wBAAqB,CAAC,+CAA+C;yCAErE,CAAA,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAG,IAAI,CAAC,MAAK,SAAS;wCACjC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;wCAC1E,MAAM,KAAK,QAAQ,CAAA,EAFnB,wBAEmB;yCAIf,CAAA,CAAC,WAAW,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA,EAAvE,wBAAuE;oCACzE,KAAA,SAAS,CAAA;oCAAC,KAAA,IAAI,CAAA;oCAAI,qBAAM,IAAA,+CAAqB,EAAC;4CAC5C,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;4CAC1B,QAAQ,UAAA;4CACR,cAAc,gBAAA;4CACd,QAAQ,UAAA;yCACT,CAAC,EAAA;;oCALF,MAAe,GAAG,SAKhB,CAAA;;;;yCAMN,CAAA,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,QAAQ;wCACxC,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAA,EADnC,wBACmC;oCAEnC,KAAA,SAAS,CAAA;oCAAC,KAAA,IAAI,CAAA;oCAAI,qBAAM,4BAA4B,CAClD,cAAc,CAAC,IAAI,CAAC,EACpB,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAG,IAAI,CAAC,KAAI,IAAI,EAC3B,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,EACvB,MAAM,EACN,QAAQ,EACR,MAAM,EACN,WAAW,EACX,cAAc,EACd,QAAQ,CACT,EAAA;;oCAVD,MAAe,GAAG,SAUjB,CAAA;;;;;yBAGN,CAAC,CAAA;oBACF,qBAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAA;;oBAA3B,SAA2B,CAAA;;wBAE7B,sBAAO,SAAS,EAAA;;;;CACjB;AAtED,oEAsEC"}
|
package/dist/handleTranslate.js
CHANGED
|
@@ -40,7 +40,7 @@ exports.createTranslatorHandler = void 0;
|
|
|
40
40
|
var aiTranslate_1 = require("./aiTranslate");
|
|
41
41
|
var createTranslatorHandler = function (translatorConfig) {
|
|
42
42
|
return function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
|
|
43
|
-
var doc, collectionOptions, result, translated;
|
|
43
|
+
var doc, collectionOptions, settings, result, translated;
|
|
44
44
|
return __generator(this, function (_a) {
|
|
45
45
|
switch (_a.label) {
|
|
46
46
|
case 0: return [4 /*yield*/, req.payload.findByID({
|
|
@@ -52,6 +52,7 @@ var createTranslatorHandler = function (translatorConfig) {
|
|
|
52
52
|
if (!doc)
|
|
53
53
|
return [2 /*return*/, res.status(404).send()];
|
|
54
54
|
collectionOptions = translatorConfig.collections[req.collection.config.slug];
|
|
55
|
+
settings = req.body.settings || {};
|
|
55
56
|
return [4 /*yield*/, (0, aiTranslate_1.translateCollection)({
|
|
56
57
|
doc: doc,
|
|
57
58
|
req: req,
|
|
@@ -61,6 +62,7 @@ var createTranslatorHandler = function (translatorConfig) {
|
|
|
61
62
|
collection: req.collection.config,
|
|
62
63
|
onlyMissing: req.body.onlyMissing,
|
|
63
64
|
codes: req.body.codes,
|
|
65
|
+
settings: settings,
|
|
64
66
|
})
|
|
65
67
|
/*if (translatorConfig.access) {
|
|
66
68
|
const hasAccesses = await translatorConfig.access(req)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleTranslate.js","sourceRoot":"","sources":["../src/handleTranslate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAgE;AAIzD,IAAM,uBAAuB,GAAG,UAAC,gBAA6B;IACnE,OAAO,UAAO,GAAG,EAAE,GAAG;;;;wBACR,qBAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;wBACrC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI;wBACtC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;qBAChB,CAAC,EAAA;;oBAHI,GAAG,GAAG,SAGV;oBAEF,IAAI,CAAC,GAAG;wBAAE,sBAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAA;oBAEjC,iBAAiB,GAAG,gBAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"handleTranslate.js","sourceRoot":"","sources":["../src/handleTranslate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAgE;AAIzD,IAAM,uBAAuB,GAAG,UAAC,gBAA6B;IACnE,OAAO,UAAO,GAAG,EAAE,GAAG;;;;wBACR,qBAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;wBACrC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI;wBACtC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;qBAChB,CAAC,EAAA;;oBAHI,GAAG,GAAG,SAGV;oBAEF,IAAI,CAAC,GAAG;wBAAE,sBAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAA;oBAEjC,iBAAiB,GAAG,gBAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;oBAE5E,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAA;oBAIzB,qBAAM,IAAA,iCAAmB,EAAC;4BACvC,GAAG,KAAA;4BACH,GAAG,KAAA;4BACH,WAAW,EAAE,EAAE;4BACf,OAAO,EAAE,EAAE;4BACX,iBAAiB,mBAAA;4BACjB,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM;4BACjC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW;4BACjC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;4BACrB,QAAQ,UAAA;yBACT,CAAC;wBACF;;;;;;sBAMF;sBAPI;;oBAVI,MAAM,GAAG,SAUb;oBAQI,UAAU,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;oBAC3C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;;;;SACrB,CAAA;AACH,CAAC,CAAA;AApCY,QAAA,uBAAuB,2BAoCnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function translateTextOrObject(text
|
|
1
|
+
export declare function translateTextOrObject({ text, language, sourceLanguage, retryCount, settings, }: any): Promise<any>;
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
2
13
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
14
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
15
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -124,48 +135,39 @@ function reapplyText(node, path, textMap, isTargetProperty) {
|
|
|
124
135
|
});
|
|
125
136
|
}
|
|
126
137
|
}
|
|
127
|
-
function translateTextOrObject(
|
|
128
|
-
var
|
|
129
|
-
|
|
138
|
+
function translateTextOrObject(_a) {
|
|
139
|
+
var _b, _c, _d;
|
|
140
|
+
var text = _a.text, language = _a.language, sourceLanguage = _a.sourceLanguage, _e = _a.retryCount, retryCount = _e === void 0 ? 0 : _e, settings = _a.settings;
|
|
130
141
|
return __awaiter(this, void 0, void 0, function () {
|
|
131
142
|
function isTranslateNode(node, key) {
|
|
132
143
|
return (key === 'text' && typeof node[key] === 'string') || key === 'name';
|
|
133
144
|
}
|
|
134
145
|
var textAsString, openai, textMap, chatCompletion, newText, newItemResult, error_1, newResult;
|
|
135
|
-
return __generator(this, function (
|
|
136
|
-
switch (
|
|
146
|
+
return __generator(this, function (_f) {
|
|
147
|
+
switch (_f.label) {
|
|
137
148
|
case 0:
|
|
138
149
|
textAsString = typeof text === 'string' ? text : JSON.stringify(text, null, 2);
|
|
139
150
|
openai = new openai_1.default({
|
|
140
151
|
apiKey: process.env.OPENAI_API_KEY,
|
|
141
152
|
});
|
|
142
|
-
|
|
153
|
+
_f.label = 1;
|
|
143
154
|
case 1:
|
|
144
|
-
|
|
155
|
+
_f.trys.push([1, 3, , 8]);
|
|
145
156
|
textMap = {};
|
|
146
|
-
if ((
|
|
157
|
+
if ((_b = text === null || text === void 0 ? void 0 : text.root) === null || _b === void 0 ? void 0 : _b.children) {
|
|
147
158
|
extractAndCapitalizeText(text.root, ['root'], textMap, isTranslateNode);
|
|
148
159
|
}
|
|
149
|
-
|
|
150
|
-
return [4 /*yield*/, openai.chat.completions.create({
|
|
151
|
-
model: /* textAsString.length > 2000 ? 'gpt-3.5-turbo-16k' :*/ 'gpt-3.5-turbo-1106',
|
|
152
|
-
messages: typeof text === 'string' && text.length < 400
|
|
160
|
+
return [4 /*yield*/, openai.chat.completions.create(__assign({ model: /* textAsString.length > 2000 ? 'gpt-3.5-turbo-16k' :*/ 'gpt-3.5-turbo-1106', messages: typeof text === 'string' && text.length < 400
|
|
153
161
|
? messagesString({ sourceLanguage: sourceLanguage, text: text, language: language })
|
|
154
162
|
: typeof text === 'string'
|
|
155
163
|
? messagesMarkdown({ sourceLanguage: sourceLanguage, text: text, language: language })
|
|
156
|
-
: ((
|
|
164
|
+
: ((_c = text === null || text === void 0 ? void 0 : text.root) === null || _c === void 0 ? void 0 : _c.children)
|
|
157
165
|
? messagesWithJsonLexical({ sourceLanguage: sourceLanguage, text: textMap, language: language })
|
|
158
|
-
: messagesWithJson({ sourceLanguage: sourceLanguage, text: text, language: language }),
|
|
159
|
-
temperature: 0,
|
|
160
|
-
max_tokens: 4096,
|
|
161
|
-
top_p: 1,
|
|
162
|
-
frequency_penalty: 0,
|
|
163
|
-
presence_penalty: 0,
|
|
164
|
-
})];
|
|
166
|
+
: messagesWithJson({ sourceLanguage: sourceLanguage, text: text, language: language }), temperature: 0, max_tokens: 4096, top_p: 1, frequency_penalty: 0, presence_penalty: 0 }, settings))];
|
|
165
167
|
case 2:
|
|
166
|
-
chatCompletion =
|
|
168
|
+
chatCompletion = _f.sent();
|
|
167
169
|
console.log('chatCompletion.choices[0].message.content', chatCompletion.choices[0].message.content);
|
|
168
|
-
if ((
|
|
170
|
+
if ((_d = text === null || text === void 0 ? void 0 : text.root) === null || _d === void 0 ? void 0 : _d.children) {
|
|
169
171
|
newText = JSON.parse(JSON.stringify(text));
|
|
170
172
|
reapplyText(newText.root, ['root'], JSON.parse(chatCompletion.choices[0].message.content), isTranslateNode);
|
|
171
173
|
return [2 /*return*/, newText];
|
|
@@ -175,19 +177,25 @@ function translateTextOrObject(text, language, sourceLanguage, retryCount) {
|
|
|
175
177
|
: chatCompletion.choices[0].message.content;
|
|
176
178
|
return [2 /*return*/, newItemResult];
|
|
177
179
|
case 3:
|
|
178
|
-
error_1 =
|
|
180
|
+
error_1 = _f.sent();
|
|
179
181
|
if (!(error_1.status === 429)) return [3 /*break*/, 6];
|
|
180
182
|
console.log("Too many requests. Retry after ".concat(error_1.headers['retry-after-ms'], "ms. Retry count: ").concat(retryCount));
|
|
181
183
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, error_1.headers['retry-after-ms']); })];
|
|
182
184
|
case 4:
|
|
183
|
-
|
|
184
|
-
return [4 /*yield*/, translateTextOrObject(
|
|
185
|
+
_f.sent();
|
|
186
|
+
return [4 /*yield*/, translateTextOrObject({
|
|
187
|
+
text: text,
|
|
188
|
+
language: language,
|
|
189
|
+
sourceLanguage: sourceLanguage,
|
|
190
|
+
retryCount: retryCount + 1,
|
|
191
|
+
settings: settings,
|
|
192
|
+
})];
|
|
185
193
|
case 5:
|
|
186
|
-
newResult =
|
|
194
|
+
newResult = _f.sent();
|
|
187
195
|
return [2 /*return*/, newResult];
|
|
188
196
|
case 6:
|
|
189
197
|
console.log('Could not be translated', error_1 /* , chatCompletion.choices[0].message.content */);
|
|
190
|
-
|
|
198
|
+
_f.label = 7;
|
|
191
199
|
case 7: return [3 /*break*/, 8];
|
|
192
200
|
case 8: return [2 /*return*/];
|
|
193
201
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translateTextAndObjects.js","sourceRoot":"","sources":["../src/translateTextAndObjects.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"translateTextAndObjects.js","sourceRoot":"","sources":["../src/translateTextAndObjects.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/aiTranslate.ts
CHANGED
|
@@ -29,6 +29,7 @@ export async function translateCollection({
|
|
|
29
29
|
collectionOptions,
|
|
30
30
|
onlyMissing,
|
|
31
31
|
codes,
|
|
32
|
+
settings,
|
|
32
33
|
}: any) {
|
|
33
34
|
if (
|
|
34
35
|
context.triggerAfterChange === false ||
|
|
@@ -38,15 +39,6 @@ export async function translateCollection({
|
|
|
38
39
|
|
|
39
40
|
const localCodes: string[] = req.payload.config.localization.localeCodes
|
|
40
41
|
|
|
41
|
-
console.log(
|
|
42
|
-
'filter codes',
|
|
43
|
-
localCodes.filter(
|
|
44
|
-
targetLanguage =>
|
|
45
|
-
targetLanguage !== req.payload.config.localization.defaultLocale &&
|
|
46
|
-
(!codes || codes.includes(targetLanguage)),
|
|
47
|
-
),
|
|
48
|
-
)
|
|
49
|
-
|
|
50
42
|
const translationPromises = localCodes
|
|
51
43
|
.filter(
|
|
52
44
|
targetLanguage =>
|
|
@@ -72,6 +64,7 @@ export async function translateCollection({
|
|
|
72
64
|
previousDoc.id ? 'update' : 'create',
|
|
73
65
|
onlyMissing,
|
|
74
66
|
req.payload.config.localization.defaultLocale,
|
|
67
|
+
settings,
|
|
75
68
|
)
|
|
76
69
|
|
|
77
70
|
const { id, _status, updatedAt, createdAt, publishedDate, ...dataNew } =
|
|
@@ -4,6 +4,7 @@ import { Button, Drawer, DrawerToggler } from 'payload/components/elements'
|
|
|
4
4
|
import { useDocumentInfo, useLocale } from 'payload/components/utilities'
|
|
5
5
|
import { useModal } from '@faceless-ui/modal'
|
|
6
6
|
import './Translator.scss'
|
|
7
|
+
import { SelectInput, useForm } from 'payload/components/forms'
|
|
7
8
|
|
|
8
9
|
const baseClass = 'after-dashboard'
|
|
9
10
|
|
|
@@ -46,11 +47,18 @@ export const DrawerTogglerAlt: any = ({
|
|
|
46
47
|
|
|
47
48
|
export const Translator: React.FC = () => {
|
|
48
49
|
const baseClass = 'ai-translator'
|
|
50
|
+
|
|
51
|
+
//const { fields, getDataByPath } = useForm()
|
|
52
|
+
|
|
49
53
|
const [isLoading, setIsLoading] = React.useState(false)
|
|
54
|
+
const [selectedModel, setSelectedModel] = React.useState<string>('default')
|
|
50
55
|
|
|
51
56
|
const locale = useLocale()
|
|
52
57
|
const documentInfo: any = useDocumentInfo()
|
|
53
58
|
const translate = async ({ codes }: any) => {
|
|
59
|
+
const settings = {
|
|
60
|
+
model: selectedModel === 'default' ? undefined : selectedModel,
|
|
61
|
+
}
|
|
54
62
|
setIsLoading(true)
|
|
55
63
|
try {
|
|
56
64
|
const response = await fetch(`/api/${documentInfo.collection.slug}/translate`, {
|
|
@@ -61,6 +69,7 @@ export const Translator: React.FC = () => {
|
|
|
61
69
|
body: JSON.stringify({
|
|
62
70
|
id: documentInfo.id,
|
|
63
71
|
codes,
|
|
72
|
+
settings,
|
|
64
73
|
}),
|
|
65
74
|
})
|
|
66
75
|
|
|
@@ -87,23 +96,52 @@ export const Translator: React.FC = () => {
|
|
|
87
96
|
/*
|
|
88
97
|
<Button onClick={handleClick}>Results are loading...</Button>
|
|
89
98
|
*/
|
|
99
|
+
|
|
100
|
+
const options = [
|
|
101
|
+
{
|
|
102
|
+
label: 'Default',
|
|
103
|
+
value: 'default',
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
label: 'GPT-3.5 Turbo (1106)',
|
|
107
|
+
value: 'gpt-3.5-turbo-1106',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
label: 'GPT-4',
|
|
111
|
+
value: 'gpt-4',
|
|
112
|
+
},
|
|
113
|
+
]
|
|
90
114
|
return (
|
|
91
115
|
<div className={baseClass}>
|
|
92
116
|
<DrawerToggler slug="ai-translator" className={`${baseClass}__drawer__toggler`}>
|
|
93
117
|
Translator
|
|
94
118
|
</DrawerToggler>
|
|
119
|
+
|
|
95
120
|
<Drawer title="Translator" slug="ai-translator">
|
|
96
121
|
{isLoading ? (
|
|
97
122
|
<Button disabled={true}>Results are loading...</Button>
|
|
98
123
|
) : (
|
|
99
|
-
|
|
100
|
-
<
|
|
101
|
-
<
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
124
|
+
<>
|
|
125
|
+
<div>
|
|
126
|
+
<SelectInput
|
|
127
|
+
onChange={(e: any) => {
|
|
128
|
+
setSelectedModel(e.value)
|
|
129
|
+
}}
|
|
130
|
+
name="selectedModel"
|
|
131
|
+
value={selectedModel}
|
|
132
|
+
path="model"
|
|
133
|
+
options={options}
|
|
134
|
+
/>
|
|
135
|
+
</div>
|
|
136
|
+
<div className={`${baseClass}__translation-buttons`}>
|
|
137
|
+
<Button disabled={isLoading} onClick={() => translate({})}>
|
|
138
|
+
<span>Translate content to all languages</span>
|
|
139
|
+
</Button>
|
|
140
|
+
<Button disabled={isLoading} onClick={() => translate({ codes: [locale.code] })}>
|
|
141
|
+
<span>Translate only {locale.label as string}</span>
|
|
142
|
+
</Button>
|
|
143
|
+
</div>
|
|
144
|
+
</>
|
|
107
145
|
)}
|
|
108
146
|
</Drawer>
|
|
109
147
|
</div>
|
|
@@ -17,6 +17,7 @@ export async function deepCompareTranslateAndMerge(
|
|
|
17
17
|
action?: 'create' | 'update',
|
|
18
18
|
onlyMissing?: boolean,
|
|
19
19
|
sourceLanguage?: string,
|
|
20
|
+
settings?: any,
|
|
20
21
|
): Promise<CollectionObjType> {
|
|
21
22
|
if (Array.isArray(newOriginalObj)) {
|
|
22
23
|
return Promise.all(
|
|
@@ -30,6 +31,7 @@ export async function deepCompareTranslateAndMerge(
|
|
|
30
31
|
action,
|
|
31
32
|
onlyMissing,
|
|
32
33
|
sourceLanguage,
|
|
34
|
+
settings,
|
|
33
35
|
),
|
|
34
36
|
),
|
|
35
37
|
)
|
|
@@ -45,11 +47,12 @@ export async function deepCompareTranslateAndMerge(
|
|
|
45
47
|
// Translate the text and merge it into the English object
|
|
46
48
|
|
|
47
49
|
if (!onlyMissing || targetObj[prop] === undefined || targetObj[prop] === '') {
|
|
48
|
-
targetObj[prop] = await translateTextOrObject(
|
|
49
|
-
newOriginalObj[prop],
|
|
50
|
+
targetObj[prop] = await translateTextOrObject({
|
|
51
|
+
text: newOriginalObj[prop],
|
|
50
52
|
language,
|
|
51
53
|
sourceLanguage,
|
|
52
|
-
|
|
54
|
+
settings,
|
|
55
|
+
})
|
|
53
56
|
} else {
|
|
54
57
|
// targetObj[prop] = 'not translated'
|
|
55
58
|
}
|
|
@@ -67,6 +70,7 @@ export async function deepCompareTranslateAndMerge(
|
|
|
67
70
|
action,
|
|
68
71
|
onlyMissing,
|
|
69
72
|
sourceLanguage,
|
|
73
|
+
settings,
|
|
70
74
|
)
|
|
71
75
|
}
|
|
72
76
|
}
|
package/src/handleTranslate.ts
CHANGED
|
@@ -13,6 +13,8 @@ export const createTranslatorHandler = (translatorConfig: PluginTypes): PayloadH
|
|
|
13
13
|
|
|
14
14
|
const collectionOptions = translatorConfig.collections[req.collection.config.slug]
|
|
15
15
|
|
|
16
|
+
const settings = req.body.settings || {}
|
|
17
|
+
|
|
16
18
|
// const translator = aiTranslate({ collectionOptions, collection: req.collection }, 'fallback')
|
|
17
19
|
|
|
18
20
|
const result = await translateCollection({
|
|
@@ -24,6 +26,7 @@ export const createTranslatorHandler = (translatorConfig: PluginTypes): PayloadH
|
|
|
24
26
|
collection: req.collection.config,
|
|
25
27
|
onlyMissing: req.body.onlyMissing,
|
|
26
28
|
codes: req.body.codes,
|
|
29
|
+
settings,
|
|
27
30
|
})
|
|
28
31
|
/*if (translatorConfig.access) {
|
|
29
32
|
const hasAccesses = await translatorConfig.access(req)
|
|
@@ -94,12 +94,21 @@ function reapplyText(
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
text: any
|
|
99
|
-
language: string
|
|
100
|
-
sourceLanguage?: string
|
|
101
|
-
retryCount
|
|
102
|
-
|
|
97
|
+
interface TranslateTextOrObject {
|
|
98
|
+
text: any
|
|
99
|
+
language: string
|
|
100
|
+
sourceLanguage?: string
|
|
101
|
+
retryCount?: number
|
|
102
|
+
setting: any
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function translateTextOrObject({
|
|
106
|
+
text,
|
|
107
|
+
language,
|
|
108
|
+
sourceLanguage,
|
|
109
|
+
retryCount = 0,
|
|
110
|
+
settings,
|
|
111
|
+
}: any) {
|
|
103
112
|
function isTranslateNode(node: any, key: string) {
|
|
104
113
|
return (key === 'text' && typeof node[key] === 'string') || key === 'name'
|
|
105
114
|
}
|
|
@@ -115,7 +124,6 @@ export async function translateTextOrObject(
|
|
|
115
124
|
extractAndCapitalizeText(text.root, ['root'], textMap, isTranslateNode)
|
|
116
125
|
}
|
|
117
126
|
|
|
118
|
-
console.log('textMap', JSON.stringify(text, null, 2))
|
|
119
127
|
const chatCompletion = await openai.chat.completions.create({
|
|
120
128
|
model: /* textAsString.length > 2000 ? 'gpt-3.5-turbo-16k' :*/ 'gpt-3.5-turbo-1106', /// 'gpt-3.5-turbo', // gpt-3.5-turbo-1106 // gpt-3.5-turbo-16k-0613
|
|
121
129
|
messages:
|
|
@@ -131,6 +139,7 @@ export async function translateTextOrObject(
|
|
|
131
139
|
top_p: 1,
|
|
132
140
|
frequency_penalty: 0,
|
|
133
141
|
presence_penalty: 0,
|
|
142
|
+
...settings,
|
|
134
143
|
})
|
|
135
144
|
|
|
136
145
|
console.log(
|
|
@@ -162,12 +171,14 @@ export async function translateTextOrObject(
|
|
|
162
171
|
)
|
|
163
172
|
|
|
164
173
|
await new Promise(resolve => setTimeout(resolve, error.headers['retry-after-ms']))
|
|
165
|
-
const newResult: any = await translateTextOrObject(
|
|
174
|
+
const newResult: any = await translateTextOrObject({
|
|
166
175
|
text,
|
|
167
176
|
language,
|
|
168
177
|
sourceLanguage,
|
|
169
|
-
retryCount + 1,
|
|
170
|
-
|
|
178
|
+
retryCount: retryCount + 1,
|
|
179
|
+
settings,
|
|
180
|
+
})
|
|
181
|
+
|
|
171
182
|
return newResult
|
|
172
183
|
} else {
|
|
173
184
|
console.log(
|