payload-ai 0.0.1 → 0.0.3

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 (54) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +70 -22
  3. package/dev/package.json +3 -3
  4. package/dev/src/collections/ExamplesWithVersions.ts +21 -0
  5. package/dev/src/payload.config.ts +6 -3
  6. package/dist/access/admins.d.ts +4 -0
  7. package/dist/access/admins.js +12 -0
  8. package/dist/access/admins.js.map +1 -0
  9. package/dist/access/adminsOrPublished.d.ts +2 -0
  10. package/dist/access/adminsOrPublished.js +18 -0
  11. package/dist/access/adminsOrPublished.js.map +1 -0
  12. package/dist/access/anyone.d.ts +2 -0
  13. package/dist/access/anyone.js +6 -0
  14. package/dist/access/anyone.js.map +1 -0
  15. package/dist/access/checkRole.d.ts +1 -0
  16. package/dist/access/checkRole.js +18 -0
  17. package/dist/access/checkRole.js.map +1 -0
  18. package/dist/aiTranslate.d.ts +4 -2
  19. package/dist/aiTranslate.js +85 -152
  20. package/dist/aiTranslate.js.map +1 -1
  21. package/dist/components/Translator/index.js +17 -13
  22. package/dist/components/Translator/index.js.map +1 -1
  23. package/dist/deepCompareAndMerge.d.ts +5 -0
  24. package/dist/deepCompareAndMerge.js +101 -0
  25. package/dist/deepCompareAndMerge.js.map +1 -0
  26. package/dist/handleTranslate.d.ts +2 -2
  27. package/dist/handleTranslate.js +35 -8
  28. package/dist/handleTranslate.js.map +1 -1
  29. package/dist/plugin.js +27 -28
  30. package/dist/plugin.js.map +1 -1
  31. package/dist/stringTranslations.d.ts +3 -0
  32. package/dist/stringTranslations.js +162 -0
  33. package/dist/stringTranslations.js.map +1 -0
  34. package/dist/translateTextAndObjects.d.ts +1 -0
  35. package/dist/translateTextAndObjects.js +81 -0
  36. package/dist/translateTextAndObjects.js.map +1 -0
  37. package/package.json +3 -3
  38. package/src/access/admins.ts +11 -0
  39. package/src/access/adminsOrPublished.ts +16 -0
  40. package/src/access/anyone.ts +3 -0
  41. package/src/access/checkRole.ts +16 -0
  42. package/src/aiTranslate.ts +76 -140
  43. package/src/components/Translator/index.tsx +7 -7
  44. package/src/deepCompareAndMerge.ts +77 -0
  45. package/src/handleTranslate.ts +23 -27
  46. package/src/plugin.ts +37 -42
  47. package/src/stringTranslations.ts +133 -0
  48. package/src/translateTextAndObjects.ts +35 -0
  49. package/.github/workflows/publish.yml +0 -21
  50. package/.github/workflows/test.yml +0 -20
  51. package/dist/newCollection.d.ts +0 -3
  52. package/dist/newCollection.js +0 -16
  53. package/dist/newCollection.js.map +0 -1
  54. package/src/newCollection.ts +0 -16
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Payload
3
+ Copyright (c) 2024 wirewire
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,12 +1,77 @@
1
- # Payload Plugin Template
1
+ # Payload AI
2
2
 
3
- Translate content to different languages using GPT.
3
+ Translate content to different languages using OpenAI's GPT.
4
4
 
5
- Planned features:
5
+
6
+ ### How to install the plugin
7
+
8
+ Install via npm:
9
+
10
+
11
+ ```
12
+ npm install payload-ai
13
+ ```
14
+
15
+ Or yarn:
16
+ ```
17
+ yarn add payload-ai
18
+ ```
19
+
20
+ To install the plugin, simply add it to your payload.config() in the Plugin array.
21
+
22
+ ```ts
23
+ import payloadAi from 'payload-ai';
24
+
25
+ export const config = buildConfig({
26
+ plugins: [
27
+ // You can pass options to the plugin
28
+ payloadAi({
29
+ enabled: true,
30
+ }),
31
+ ]
32
+ });
33
+ ```
34
+
35
+ ### Collection translation
36
+
37
+ Add the `collections` where you want to enable the translation and the `fields`. It will translate each field (also nested fields) on every update of the default language.
38
+
39
+ ```jsx
40
+ plugins: [
41
+ aiTranslatorPlugin({
42
+ enabled: true,
43
+ collections: {
44
+ examples: {
45
+ fields: ['stringText', 'richText'],
46
+ },
47
+ },
48
+ }),
49
+ ],
50
+ ```
51
+
52
+
53
+ ### String translation
54
+
55
+ Use this to provide a [backend](https://github.com/i18next/i18next-http-backend) for [i18next](https://www.i18next.com) string translations.
56
+
57
+
58
+ ```jsx
59
+ plugins: [
60
+ aiTranslatorPlugin({
61
+ enabled: true,
62
+ stringTranslation: {
63
+ enabled: true
64
+ }
65
+ }),
66
+ ],
67
+ ```
68
+
69
+ ### Generate SEO
70
+
71
+
72
+ ### Planned features
6
73
 
7
74
  - generate image alt text from GPT
8
- - generate by field
9
- - string translation using i18next
10
75
  - generate SEO Text
11
76
  - generate structured content
12
77
  - custom access control
@@ -20,26 +85,9 @@ To build your own Payload plugin, all you need is:
20
85
  * An understanding of the basic Payload concepts
21
86
  * And some JavaScript/Typescript experience
22
87
 
23
- ## Background
24
-
25
- Here is a short recap on how to integrate plugins with Payload, to learn more visit the [plugin overview page](https://payloadcms.com/docs/plugins/overview).
26
-
27
- ### How to install a plugin
28
88
 
29
- To install any plugin, simply add it to your payload.config() in the Plugin array.
30
89
 
31
- ```ts
32
- import samplePlugin from 'sample-plugin';
33
90
 
34
- export const config = buildConfig({
35
- plugins: [
36
- // You can pass options to the plugin
37
- samplePlugin({
38
- enabled: true,
39
- }),
40
- ]
41
- });
42
- ```
43
91
 
44
92
  ### Initialization
45
93
 
package/dev/package.json CHANGED
@@ -17,13 +17,13 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@payloadcms/bundler-webpack": "^1.0.0",
20
- "@payloadcms/db-mongodb": "^1.0.0",
20
+ "@payloadcms/db-mongodb": "^1.2.0",
21
21
  "@payloadcms/plugin-cloud": "^2.0.0",
22
- "@payloadcms/richtext-slate": "^1.0.0",
22
+ "@payloadcms/richtext-slate": "^1.3.1",
23
23
  "cross-env": "^7.0.3",
24
24
  "dotenv": "^8.2.0",
25
25
  "express": "^4.17.1",
26
- "payload": "^2.0.0"
26
+ "payload": "^2.6.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/express": "^4.17.9",
@@ -0,0 +1,21 @@
1
+ import { CollectionConfig } from 'payload/types'
2
+
3
+ // Example Collection - For reference only, this must be added to payload.config.ts to be used.
4
+ const ExamplesWithVersions: CollectionConfig = {
5
+ slug: 'examples-with-versions',
6
+ admin: {
7
+ useAsTitle: 'someField',
8
+ },
9
+ versions: {
10
+ drafts: true,
11
+ },
12
+ fields: [
13
+ {
14
+ name: 'richText',
15
+ type: 'text',
16
+ localized: true,
17
+ },
18
+ ],
19
+ }
20
+
21
+ export default ExamplesWithVersions
@@ -6,6 +6,7 @@ import { mongooseAdapter } from '@payloadcms/db-mongodb'
6
6
  import { webpackBundler } from '@payloadcms/bundler-webpack'
7
7
  import { slateEditor } from '@payloadcms/richtext-slate'
8
8
  import { aiTranslatorPlugin } from '../../src/index'
9
+ import ExamplesWithVersions from './collections/ExamplesWithVersions'
9
10
 
10
11
  export default buildConfig({
11
12
  admin: {
@@ -28,7 +29,7 @@ export default buildConfig({
28
29
  },
29
30
  },
30
31
  editor: slateEditor({}),
31
- collections: [Examples, Users],
32
+ collections: [Examples, ExamplesWithVersions, Users],
32
33
  localization: {
33
34
  locales: ['en', 'es', 'de'],
34
35
  defaultLocale: 'en',
@@ -45,8 +46,10 @@ export default buildConfig({
45
46
  enabled: true,
46
47
  collections: {
47
48
  examples: {
48
- fields: ['richText'],
49
- // adapter: theAdapterToUse, // see docs for the adapter you want to use
49
+ fields: ['stringText', 'richText'],
50
+ },
51
+ 'examples-with-versions': {
52
+ fields: ['stringText', 'richText'],
50
53
  },
51
54
  },
52
55
  }),
@@ -0,0 +1,4 @@
1
+ import type { AccessArgs } from 'payload/config';
2
+ type isAdmin = (args: AccessArgs<unknown, any>) => boolean;
3
+ export declare const admins: isAdmin;
4
+ export {};
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.admins = void 0;
4
+ var checkRole_1 = require("./checkRole");
5
+ var admins = function (_a) {
6
+ var user = _a.req.user;
7
+ if (!user)
8
+ return false;
9
+ return (0, checkRole_1.checkRole)(['admin'], user);
10
+ };
11
+ exports.admins = admins;
12
+ //# sourceMappingURL=admins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admins.js","sourceRoot":"","sources":["../../src/access/admins.ts"],"names":[],"mappings":";;;AAEA,yCAAuC;AAKhC,IAAM,MAAM,GAAY,UAAC,EAAiB;QAAR,IAAI,cAAA;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IACvB,OAAO,IAAA,qBAAS,EAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAA;AACnC,CAAC,CAAA;AAHY,QAAA,MAAM,UAGlB"}
@@ -0,0 +1,2 @@
1
+ import type { Access } from 'payload/config';
2
+ export declare const adminsOrPublished: Access;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.adminsOrPublished = void 0;
4
+ var checkRole_1 = require("./checkRole");
5
+ var adminsOrPublished = function (_a) {
6
+ var user = _a.req.user;
7
+ if (user && (0, checkRole_1.checkRole)(['admin'], user)) {
8
+ return true;
9
+ }
10
+ return true;
11
+ return {
12
+ _status: {
13
+ equals: 'published',
14
+ },
15
+ };
16
+ };
17
+ exports.adminsOrPublished = adminsOrPublished;
18
+ //# sourceMappingURL=adminsOrPublished.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adminsOrPublished.js","sourceRoot":"","sources":["../../src/access/adminsOrPublished.ts"],"names":[],"mappings":";;;AAEA,yCAAuC;AAEhC,IAAM,iBAAiB,GAAW,UAAC,EAAiB;QAAR,IAAI,cAAA;IACrD,IAAI,IAAI,IAAI,IAAA,qBAAS,EAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;QACtC,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,IAAI,CAAA;IACX,OAAO;QACL,OAAO,EAAE;YACP,MAAM,EAAE,WAAW;SACpB;KACF,CAAA;AACH,CAAC,CAAA;AAXY,QAAA,iBAAiB,qBAW7B"}
@@ -0,0 +1,2 @@
1
+ import type { Access } from 'payload/config';
2
+ export declare const anyone: Access;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.anyone = void 0;
4
+ var anyone = function () { return true; };
5
+ exports.anyone = anyone;
6
+ //# sourceMappingURL=anyone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anyone.js","sourceRoot":"","sources":["../../src/access/anyone.ts"],"names":[],"mappings":";;;AAEO,IAAM,MAAM,GAAW,cAAM,OAAA,IAAI,EAAJ,CAAI,CAAA;AAA3B,QAAA,MAAM,UAAqB"}
@@ -0,0 +1 @@
1
+ export declare const checkRole: (allRoles: any, user?: any) => boolean;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ //import type { User } from '../../payload-types'
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.checkRole = void 0;
5
+ var checkRole = function (allRoles /* User['roles'] = [] */, user) {
6
+ if (user) {
7
+ if (allRoles.some(function (role) {
8
+ var _a;
9
+ return (_a = user === null || user === void 0 ? void 0 : user.roles) === null || _a === void 0 ? void 0 : _a.some(function (individualRole) {
10
+ return individualRole === role;
11
+ });
12
+ }))
13
+ return true;
14
+ }
15
+ return false;
16
+ };
17
+ exports.checkRole = checkRole;
18
+ //# sourceMappingURL=checkRole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkRole.js","sourceRoot":"","sources":["../../src/access/checkRole.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAE1C,IAAM,SAAS,GAAG,UAAC,QAAa,CAAC,wBAAwB,EAAE,IAAU;IAC1E,IAAI,IAAI,EAAE;QACR,IACE,QAAQ,CAAC,IAAI,CAAC,UAAC,IAAS;;YACtB,OAAO,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,0CAAE,IAAI,CAAC,UAAC,cAAmB;gBAC3C,OAAO,cAAc,KAAK,IAAI,CAAA;YAChC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC;YAEF,OAAO,IAAI,CAAA;KACd;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAbY,QAAA,SAAS,aAarB"}
@@ -1,5 +1,7 @@
1
1
  import type { CollectionAfterChangeHook } from 'payload/types';
2
- declare const aiTranslate: ({ collection }: {
2
+ declare const aiTranslateHook: ({ collectionOptions, collection }: {
3
+ collectionOptions: any;
3
4
  collection: object;
4
5
  }, fallback?: string) => CollectionAfterChangeHook;
5
- export default aiTranslate;
6
+ export default aiTranslateHook;
7
+ export declare function translateCollection({ req, doc, collection, previousDoc, context, collectionOptions, onlyMissing, }: any): Promise<void>;
@@ -35,172 +35,105 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
36
  }
37
37
  };
38
- var __importDefault = (this && this.__importDefault) || function (mod) {
39
- return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ var __rest = (this && this.__rest) || function (s, e) {
39
+ var t = {};
40
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
41
+ t[p] = s[p];
42
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
43
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
44
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
45
+ t[p[i]] = s[p[i]];
46
+ }
47
+ return t;
40
48
  };
41
49
  Object.defineProperty(exports, "__esModule", { value: true });
42
- var openai_1 = __importDefault(require("openai"));
43
- function translateText(text, language) {
44
- return __awaiter(this, void 0, void 0, function () {
45
- var openai, content, chatCompletion, newItemResult;
46
- return __generator(this, function (_a) {
47
- switch (_a.label) {
48
- case 0:
49
- if (typeof text !== 'string') {
50
- return [2 /*return*/, text];
51
- }
52
- openai = new openai_1.default({
53
- apiKey: process.env.OPENAI_API_KEY,
54
- });
55
- content = "Translate to ".concat(language, " (ISO-2-Code). ").concat(typeof text !== 'string'
56
- ? 'Keep the json structure. Only return the json'
57
- : 'Only return the translated text without any comment', ": ").concat(typeof text !== 'string' ? JSON.stringify(text) : text);
58
- return [4 /*yield*/, openai.chat.completions.create({
59
- messages: [
60
- {
61
- role: 'user',
62
- content: content,
63
- },
64
- ],
65
- model: 'gpt-3.5-turbo',
66
- })
67
- //console.log('Translated', language, content, chatCompletion.choices[0].message.content)
68
- ];
69
- case 1:
70
- chatCompletion = _a.sent();
71
- newItemResult = typeof text !== 'string'
72
- ? JSON.parse(chatCompletion.choices[0].message.content)
73
- : chatCompletion.choices[0].message.content;
74
- return [2 /*return*/, newItemResult];
75
- }
50
+ exports.translateCollection = void 0;
51
+ var deepCompareAndMerge_1 = require("./deepCompareAndMerge");
52
+ var aiTranslateHook = function (_a, fallback) {
53
+ var collectionOptions = _a.collectionOptions, collection = _a.collection;
54
+ return function (_a) {
55
+ var doc = _a.doc, req = _a.req, previousDoc = _a.previousDoc, context = _a.context, collection = _a.collection;
56
+ return __awaiter(void 0, void 0, void 0, function () {
57
+ return __generator(this, function (_b) {
58
+ switch (_b.label) {
59
+ case 0: return [4 /*yield*/, translateCollection({
60
+ doc: doc,
61
+ req: req,
62
+ previousDoc: previousDoc,
63
+ context: context,
64
+ collection: collection,
65
+ collectionOptions: collectionOptions,
66
+ })];
67
+ case 1: return [2 /*return*/, _b.sent()];
68
+ }
69
+ });
76
70
  });
77
- });
78
- }
79
- var colllectionObj = {}; // Assuming targetObj is initialized somewhere
80
- function deepCompareTranslateAndMerge(newOriginalObj, originalObj, targetObj, key, language) {
71
+ };
72
+ };
73
+ exports.default = aiTranslateHook;
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;
81
76
  return __awaiter(this, void 0, void 0, function () {
82
- var promises;
77
+ var localCodes, translationPromises, results, error_1;
83
78
  var _this = this;
84
- return __generator(this, function (_a) {
85
- switch (_a.label) {
79
+ return __generator(this, function (_b) {
80
+ switch (_b.label) {
86
81
  case 0:
87
- if (!Array.isArray(newOriginalObj)) return [3 /*break*/, 1];
88
- return [2 /*return*/, Promise.all(newOriginalObj.map(function (item, index) {
89
- return deepCompareTranslateAndMerge(item, originalObj === null || originalObj === void 0 ? void 0 : originalObj[index], targetObj === null || targetObj === void 0 ? void 0 : targetObj[index], key, language);
90
- }))];
91
- case 1:
92
- if (!(typeof newOriginalObj === 'object' && newOriginalObj !== null)) return [3 /*break*/, 3];
93
- promises = Object.keys(newOriginalObj).map(function (prop) { return __awaiter(_this, void 0, void 0, function () {
94
- var _a, _b, _c, _d;
95
- return __generator(this, function (_e) {
96
- switch (_e.label) {
97
- case 0:
98
- if (!newOriginalObj.hasOwnProperty(prop)) return [3 /*break*/, 5];
99
- if (!(prop === key) /*&& typeof newOriginalObj[prop] === 'string'*/) return [3 /*break*/, 3]; /*&& typeof newOriginalObj[prop] === 'string'*/
100
- if (!((originalObj === null || originalObj === void 0 ? void 0 : originalObj[prop]) === undefined ||
101
- JSON.stringify(newOriginalObj[prop]) !== JSON.stringify(originalObj[prop]))) return [3 /*break*/, 2];
102
- console.log('sewsddsaaddasdsada', newOriginalObj, prop, key);
103
- // Translate the text and merge it into the English object
104
- _a = targetObj;
105
- _b = prop;
106
- return [4 /*yield*/, translateText(newOriginalObj[prop], language)];
82
+ _b.trys.push([0, 2, , 3]);
83
+ if (context.triggerAfterChange === false ||
84
+ req.locale !== req.payload.config.localization.defaultLocale)
85
+ return [2 /*return*/];
86
+ localCodes = req.payload.config.localization.localeCodes;
87
+ translationPromises = localCodes
88
+ .filter(function (targetLanguage) { return targetLanguage !== req.payload.config.localization.defaultLocale; })
89
+ .map(function (tL) { return __awaiter(_this, void 0, void 0, function () {
90
+ var targetDoc, targetDocWithTranslation, id, _status, updatedAt, createdAt, publishedDate, dataNew, updatedLanguage;
91
+ return __generator(this, function (_a) {
92
+ switch (_a.label) {
93
+ case 0: return [4 /*yield*/, req.payload.findByID({
94
+ collection: collection.slug,
95
+ id: doc.id,
96
+ locale: tL,
97
+ fallbackLocale: false,
98
+ limit: 0,
99
+ depth: 0,
100
+ })];
107
101
  case 1:
108
- // Translate the text and merge it into the English object
109
- _a[_b] = _e.sent();
110
- _e.label = 2;
111
- case 2: return [3 /*break*/, 5];
102
+ targetDoc = _a.sent();
103
+ return [4 /*yield*/, (0, deepCompareAndMerge_1.deepCompareTranslateAndMerge)(doc, previousDoc, targetDoc, collectionOptions.fields, tL, previousDoc.id ? 'update' : 'create', onlyMissing)];
104
+ case 2:
105
+ targetDocWithTranslation = _a.sent();
106
+ id = targetDocWithTranslation.id, _status = targetDocWithTranslation._status, updatedAt = targetDocWithTranslation.updatedAt, createdAt = targetDocWithTranslation.createdAt, publishedDate = targetDocWithTranslation.publishedDate, dataNew = __rest(targetDocWithTranslation, ["id", "_status", "updatedAt", "createdAt", "publishedDate"]);
107
+ return [4 /*yield*/, req.payload.update({
108
+ req: req,
109
+ collection: collection.slug,
110
+ id: doc.id,
111
+ data: dataNew,
112
+ locale: tL,
113
+ limit: 1,
114
+ depth: 0,
115
+ context: {
116
+ triggerAfterChange: false,
117
+ },
118
+ })];
112
119
  case 3:
113
- if (!(typeof newOriginalObj[prop] === 'object' &&
114
- typeof targetObj[prop] === 'object')) return [3 /*break*/, 5];
115
- // console.log('propaaaaaaa', targetObj?.[prop], targetObj, prop)
116
- _c = targetObj;
117
- _d = prop;
118
- return [4 /*yield*/, deepCompareTranslateAndMerge(newOriginalObj[prop], (originalObj === null || originalObj === void 0 ? void 0 : originalObj[prop]) || null, targetObj[prop] || null, key, language)];
119
- case 4:
120
- // console.log('propaaaaaaa', targetObj?.[prop], targetObj, prop)
121
- _c[_d] = _e.sent();
122
- _e.label = 5;
123
- case 5: return [2 /*return*/];
120
+ updatedLanguage = _a.sent();
121
+ return [2 /*return*/, updatedLanguage];
124
122
  }
125
123
  });
126
124
  }); });
127
- return [4 /*yield*/, Promise.all(promises)];
125
+ return [4 /*yield*/, Promise.all(translationPromises)];
126
+ case 1:
127
+ results = _b.sent();
128
+ return [3 /*break*/, 3];
128
129
  case 2:
129
- _a.sent();
130
- _a.label = 3;
131
- case 3: return [2 /*return*/, targetObj];
130
+ error_1 = _b.sent();
131
+ console.log('error while generating languages', error_1);
132
+ return [3 /*break*/, 3];
133
+ case 3: return [2 /*return*/];
132
134
  }
133
135
  });
134
136
  });
135
137
  }
136
- var aiTranslate = function (_a, fallback) {
137
- var collection = _a.collection;
138
- return function (_a) {
139
- var doc = _a.doc, req = _a.req, previousDoc = _a.previousDoc, context = _a.context, collection = _a.collection;
140
- return __awaiter(void 0, void 0, void 0, function () {
141
- var originalDoc_1, localCodes, translationPromises, results, error_1;
142
- return __generator(this, function (_b) {
143
- switch (_b.label) {
144
- case 0:
145
- _b.trys.push([0, 2, , 3]);
146
- originalDoc_1 = previousDoc;
147
- if (context.triggerAfterChange === false ||
148
- req.locale !== req.payload.config.localization.defaultLocale ||
149
- !(originalDoc_1 === null || originalDoc_1 === void 0 ? void 0 : originalDoc_1.id)) {
150
- return [2 /*return*/];
151
- }
152
- localCodes = req.payload.config.localization.localeCodes;
153
- translationPromises = localCodes
154
- .filter(function (targetLanguage) { return targetLanguage !== req.payload.config.localization.defaultLocale; })
155
- .map(function (targetLanguage) { return __awaiter(void 0, void 0, void 0, function () {
156
- var targetDoc, targetDocWithTranslation, updatedLanguage;
157
- return __generator(this, function (_a) {
158
- switch (_a.label) {
159
- case 0: return [4 /*yield*/, req.payload.findByID({
160
- req: req,
161
- collection: collection.slug,
162
- id: originalDoc_1.id,
163
- locale: targetLanguage,
164
- limit: 0,
165
- depth: 0,
166
- })];
167
- case 1:
168
- targetDoc = _a.sent();
169
- return [4 /*yield*/, deepCompareTranslateAndMerge(doc, originalDoc_1, targetDoc, 'richText', targetLanguage)];
170
- case 2:
171
- targetDocWithTranslation = _a.sent();
172
- console.log('targetDocWithTranslation', targetDocWithTranslation);
173
- return [4 /*yield*/, req.payload.update({
174
- req: req,
175
- collection: collection.slug,
176
- id: originalDoc_1.id,
177
- data: targetDocWithTranslation,
178
- locale: targetLanguage,
179
- limit: 0,
180
- depth: 0,
181
- context: {
182
- triggerAfterChange: false,
183
- },
184
- })];
185
- case 3:
186
- updatedLanguage = _a.sent();
187
- return [2 /*return*/, updatedLanguage];
188
- }
189
- });
190
- }); });
191
- return [4 /*yield*/, Promise.all(translationPromises)];
192
- case 1:
193
- results = _b.sent();
194
- return [3 /*break*/, 3];
195
- case 2:
196
- error_1 = _b.sent();
197
- console.log('error while generating languages', error_1);
198
- return [3 /*break*/, 3];
199
- case 3: return [2 /*return*/];
200
- }
201
- });
202
- });
203
- };
204
- };
205
- exports.default = aiTranslate;
138
+ exports.translateCollection = translateCollection;
206
139
  //# sourceMappingURL=aiTranslate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"aiTranslate.js","sourceRoot":"","sources":["../src/aiTranslate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aiTranslate.js","sourceRoot":"","sources":["../src/aiTranslate.ts"],"names":[],"mappings":"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"}
@@ -41,47 +41,51 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
42
  exports.Translator = void 0;
43
43
  var react_1 = __importDefault(require("react"));
44
- // import './index.scss';
45
44
  var elements_1 = require("payload/components/elements");
45
+ var utilities_1 = require("payload/components/utilities");
46
46
  var baseClass = 'after-dashboard';
47
47
  var Translator = function () {
48
48
  var _a = react_1.default.useState(false), isLoading = _a[0], setIsLoading = _a[1];
49
+ var locale = (0, utilities_1.useLocale)();
50
+ var documentInfo = (0, utilities_1.useDocumentInfo)();
49
51
  var translate = function () { return __awaiter(void 0, void 0, void 0, function () {
50
52
  var response, translatedValues, error_1;
51
53
  return __generator(this, function (_a) {
52
54
  switch (_a.label) {
53
55
  case 0:
54
- _a.trys.push([0, 3, , 4]);
55
- return [4 /*yield*/, fetch('/api/ai-translator', {
56
+ setIsLoading(true);
57
+ _a.label = 1;
58
+ case 1:
59
+ _a.trys.push([1, 4, , 5]);
60
+ return [4 /*yield*/, fetch("/api/".concat(documentInfo.collection.slug, "/translate"), {
56
61
  method: 'POST',
57
62
  headers: {
58
63
  'Content-Type': 'application/json',
59
64
  },
60
65
  body: JSON.stringify({
61
- texts: 'sss', // valuesToTranslate.map(({ value }) => value),
62
- // from: localeTranslateFrom,
63
- // to: locale,
66
+ id: documentInfo.id,
64
67
  }),
65
68
  })];
66
- case 1:
69
+ case 2:
67
70
  response = _a.sent();
68
71
  return [4 /*yield*/, response.json()];
69
- case 2:
72
+ case 3:
70
73
  translatedValues = _a.sent();
71
74
  setIsLoading(false);
72
- return [3 /*break*/, 4];
73
- case 3:
75
+ return [3 /*break*/, 5];
76
+ case 4:
74
77
  error_1 = _a.sent();
75
78
  setIsLoading(false);
76
79
  console.error(error_1);
77
- return [3 /*break*/, 4];
78
- case 4: return [2 /*return*/];
80
+ return [3 /*break*/, 5];
81
+ case 5: return [2 /*return*/];
79
82
  }
80
83
  });
81
84
  }); };
82
85
  return (react_1.default.createElement("div", { className: baseClass },
83
86
  react_1.default.createElement(elements_1.Button, { disabled: isLoading, size: "small", onClick: translate },
84
- react_1.default.createElement("span", null, "Translate content from default language"))));
87
+ react_1.default.createElement("span", null, "Translate content from default language"),
88
+ isLoading && react_1.default.createElement(react_1.default.Fragment, null, "Loading..."))));
85
89
  };
86
90
  exports.Translator = Translator;
87
91
  //# sourceMappingURL=index.js.map