@justanarthur/payload-plugin-seo 1.3.7 → 1.3.8
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 +16 -16
- package/dist/defaults.js.map +1 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/fields-components.js.map +1 -0
- package/dist/exports/fields.js.map +1 -0
- package/dist/exports/types.js.map +1 -0
- package/dist/fields/MetaDescription/MetaDescriptionComponent.js.map +1 -0
- package/dist/fields/MetaDescription/index.js.map +1 -0
- package/dist/fields/MetaImage/MetaImageComponent.js.map +1 -0
- package/dist/fields/MetaImage/index.js.map +1 -0
- package/dist/fields/MetaTitle/MetaTitleComponent.js.map +1 -0
- package/dist/fields/MetaTitle/index.js.map +1 -0
- package/dist/fields/Overview/OverviewComponent.js.map +1 -0
- package/dist/fields/Overview/index.js.map +1 -0
- package/dist/fields/Preview/PreviewComponent.js.map +1 -0
- package/dist/fields/Preview/index.js.map +1 -0
- package/dist/fields/index.scss +7 -7
- package/dist/index.js.map +1 -0
- package/dist/openai/message.js.map +1 -0
- package/dist/translations/cs.js.map +1 -0
- package/dist/translations/de.js.map +1 -0
- package/dist/translations/en.js.map +1 -0
- package/dist/translations/es.js.map +1 -0
- package/dist/translations/fa.js.map +1 -0
- package/dist/translations/fr.js.map +1 -0
- package/dist/translations/index.js.map +1 -0
- package/dist/translations/it.js.map +1 -0
- package/dist/translations/nb.js.map +1 -0
- package/dist/translations/pl.js.map +1 -0
- package/dist/translations/ru.js.map +1 -0
- package/dist/translations/sv.js.map +1 -0
- package/dist/translations/tr.js.map +1 -0
- package/dist/translations/translation-schema.json +96 -96
- package/dist/translations/uk.js.map +1 -0
- package/dist/translations/vi.js.map +1 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/LengthIndicator.js.map +1 -0
- package/dist/ui/Pill.js.map +1 -0
- package/package.json +25 -5
- package/dist/src/defaults.js.map +0 -1
- package/dist/src/exports/client.js.map +0 -1
- package/dist/src/exports/fields-components.js.map +0 -1
- package/dist/src/exports/fields.js.map +0 -1
- package/dist/src/exports/types.js.map +0 -1
- package/dist/src/fields/MetaDescription/MetaDescriptionComponent.js.map +0 -1
- package/dist/src/fields/MetaDescription/index.js.map +0 -1
- package/dist/src/fields/MetaImage/MetaImageComponent.js.map +0 -1
- package/dist/src/fields/MetaImage/index.js.map +0 -1
- package/dist/src/fields/MetaTitle/MetaTitleComponent.js.map +0 -1
- package/dist/src/fields/MetaTitle/index.js.map +0 -1
- package/dist/src/fields/Overview/OverviewComponent.js.map +0 -1
- package/dist/src/fields/Overview/index.js.map +0 -1
- package/dist/src/fields/Preview/PreviewComponent.js.map +0 -1
- package/dist/src/fields/Preview/index.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/openai/message.js.map +0 -1
- package/dist/src/translations/cs.js.map +0 -1
- package/dist/src/translations/de.js.map +0 -1
- package/dist/src/translations/en.js.map +0 -1
- package/dist/src/translations/es.js.map +0 -1
- package/dist/src/translations/fa.js.map +0 -1
- package/dist/src/translations/fr.js.map +0 -1
- package/dist/src/translations/index.js.map +0 -1
- package/dist/src/translations/it.js.map +0 -1
- package/dist/src/translations/nb.js.map +0 -1
- package/dist/src/translations/pl.js.map +0 -1
- package/dist/src/translations/ru.js.map +0 -1
- package/dist/src/translations/sv.js.map +0 -1
- package/dist/src/translations/tr.js.map +0 -1
- package/dist/src/translations/uk.js.map +0 -1
- package/dist/src/translations/vi.js.map +0 -1
- package/dist/src/types.js.map +0 -1
- package/dist/src/ui/LengthIndicator.js.map +0 -1
- package/dist/src/ui/Pill.js.map +0 -1
- /package/dist/{src/defaults.js → defaults.js} +0 -0
- /package/dist/{src/exports → exports}/client.js +0 -0
- /package/dist/{src/exports → exports}/fields-components.js +0 -0
- /package/dist/{src/exports → exports}/fields.js +0 -0
- /package/dist/{src/exports → exports}/types.js +0 -0
- /package/dist/{src/fields → fields}/MetaDescription/MetaDescriptionComponent.js +0 -0
- /package/dist/{src/fields → fields}/MetaDescription/index.js +0 -0
- /package/dist/{src/fields → fields}/MetaImage/MetaImageComponent.js +0 -0
- /package/dist/{src/fields → fields}/MetaImage/index.js +0 -0
- /package/dist/{src/fields → fields}/MetaTitle/MetaTitleComponent.js +0 -0
- /package/dist/{src/fields → fields}/MetaTitle/index.js +0 -0
- /package/dist/{src/fields → fields}/Overview/OverviewComponent.js +0 -0
- /package/dist/{src/fields → fields}/Overview/index.js +0 -0
- /package/dist/{src/fields → fields}/Preview/PreviewComponent.js +0 -0
- /package/dist/{src/fields → fields}/Preview/index.js +0 -0
- /package/dist/{src/index.js → index.js} +0 -0
- /package/dist/{src/openai → openai}/message.js +0 -0
- /package/dist/{src/translations → translations}/cs.js +0 -0
- /package/dist/{src/translations → translations}/de.js +0 -0
- /package/dist/{src/translations → translations}/en.js +0 -0
- /package/dist/{src/translations → translations}/es.js +0 -0
- /package/dist/{src/translations → translations}/fa.js +0 -0
- /package/dist/{src/translations → translations}/fr.js +0 -0
- /package/dist/{src/translations → translations}/index.js +0 -0
- /package/dist/{src/translations → translations}/it.js +0 -0
- /package/dist/{src/translations → translations}/nb.js +0 -0
- /package/dist/{src/translations → translations}/pl.js +0 -0
- /package/dist/{src/translations → translations}/ru.js +0 -0
- /package/dist/{src/translations → translations}/sv.js +0 -0
- /package/dist/{src/translations → translations}/tr.js +0 -0
- /package/dist/{src/translations → translations}/uk.js +0 -0
- /package/dist/{src/translations → translations}/vi.js +0 -0
- /package/dist/{src/types.js → types.js} +0 -0
- /package/dist/{src/ui → ui}/LengthIndicator.js +0 -0
- /package/dist/{src/ui → ui}/Pill.js +0 -0
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
{
|
|
2
|
-
"type": "object",
|
|
3
|
-
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
4
|
-
"additionalProperties": false,
|
|
5
|
-
"properties": {
|
|
6
|
-
"$schema": {
|
|
7
|
-
"type": "string"
|
|
8
|
-
},
|
|
9
|
-
"plugin-seo": {
|
|
10
|
-
"type": "object",
|
|
11
|
-
"additionalProperties": false,
|
|
12
|
-
"properties": {
|
|
13
|
-
"missing": {
|
|
14
|
-
"type": "string"
|
|
15
|
-
},
|
|
16
|
-
"almostThere": {
|
|
17
|
-
"type": "string"
|
|
18
|
-
},
|
|
19
|
-
"autoGenerate": {
|
|
20
|
-
"type": "string"
|
|
21
|
-
},
|
|
22
|
-
"generateAi": {
|
|
23
|
-
"type": "string"
|
|
24
|
-
},
|
|
25
|
-
"bestPractices": {
|
|
26
|
-
"type": "string"
|
|
27
|
-
},
|
|
28
|
-
"characterCount": {
|
|
29
|
-
"type": "string"
|
|
30
|
-
},
|
|
31
|
-
"charactersLeftOver": {
|
|
32
|
-
"type": "string"
|
|
33
|
-
},
|
|
34
|
-
"charactersToGo": {
|
|
35
|
-
"type": "string"
|
|
36
|
-
},
|
|
37
|
-
"charactersTooMany": {
|
|
38
|
-
"type": "string"
|
|
39
|
-
},
|
|
40
|
-
"checksPassing": {
|
|
41
|
-
"type": "string"
|
|
42
|
-
},
|
|
43
|
-
"good": {
|
|
44
|
-
"type": "string"
|
|
45
|
-
},
|
|
46
|
-
"imageAutoGenerationTip": {
|
|
47
|
-
"type": "string"
|
|
48
|
-
},
|
|
49
|
-
"lengthTipDescription": {
|
|
50
|
-
"type": "string"
|
|
51
|
-
},
|
|
52
|
-
"lengthTipTitle": {
|
|
53
|
-
"type": "string"
|
|
54
|
-
},
|
|
55
|
-
"noImage": {
|
|
56
|
-
"type": "string"
|
|
57
|
-
},
|
|
58
|
-
"preview": {
|
|
59
|
-
"type": "string"
|
|
60
|
-
},
|
|
61
|
-
"previewDescription": {
|
|
62
|
-
"type": "string"
|
|
63
|
-
},
|
|
64
|
-
"tooLong": {
|
|
65
|
-
"type": "string"
|
|
66
|
-
},
|
|
67
|
-
"tooShort": {
|
|
68
|
-
"type": "string"
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
"required": [
|
|
72
|
-
"autoGenerate",
|
|
73
|
-
"imageAutoGenerationTip",
|
|
74
|
-
"bestPractices",
|
|
75
|
-
"lengthTipTitle",
|
|
76
|
-
"lengthTipDescription",
|
|
77
|
-
"good",
|
|
78
|
-
"tooLong",
|
|
79
|
-
"tooShort",
|
|
80
|
-
"almostThere",
|
|
81
|
-
"characterCount",
|
|
82
|
-
"charactersToGo",
|
|
83
|
-
"charactersLeftOver",
|
|
84
|
-
"charactersTooMany",
|
|
85
|
-
"noImage",
|
|
86
|
-
"checksPassing",
|
|
87
|
-
"preview",
|
|
88
|
-
"previewDescription",
|
|
89
|
-
"missing"
|
|
90
|
-
]
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
"required": [
|
|
94
|
-
"plugin-seo"
|
|
95
|
-
]
|
|
96
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"$schema": "http://json-schema.org/draft-04/schema#",
|
|
4
|
+
"additionalProperties": false,
|
|
5
|
+
"properties": {
|
|
6
|
+
"$schema": {
|
|
7
|
+
"type": "string"
|
|
8
|
+
},
|
|
9
|
+
"plugin-seo": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"additionalProperties": false,
|
|
12
|
+
"properties": {
|
|
13
|
+
"missing": {
|
|
14
|
+
"type": "string"
|
|
15
|
+
},
|
|
16
|
+
"almostThere": {
|
|
17
|
+
"type": "string"
|
|
18
|
+
},
|
|
19
|
+
"autoGenerate": {
|
|
20
|
+
"type": "string"
|
|
21
|
+
},
|
|
22
|
+
"generateAi": {
|
|
23
|
+
"type": "string"
|
|
24
|
+
},
|
|
25
|
+
"bestPractices": {
|
|
26
|
+
"type": "string"
|
|
27
|
+
},
|
|
28
|
+
"characterCount": {
|
|
29
|
+
"type": "string"
|
|
30
|
+
},
|
|
31
|
+
"charactersLeftOver": {
|
|
32
|
+
"type": "string"
|
|
33
|
+
},
|
|
34
|
+
"charactersToGo": {
|
|
35
|
+
"type": "string"
|
|
36
|
+
},
|
|
37
|
+
"charactersTooMany": {
|
|
38
|
+
"type": "string"
|
|
39
|
+
},
|
|
40
|
+
"checksPassing": {
|
|
41
|
+
"type": "string"
|
|
42
|
+
},
|
|
43
|
+
"good": {
|
|
44
|
+
"type": "string"
|
|
45
|
+
},
|
|
46
|
+
"imageAutoGenerationTip": {
|
|
47
|
+
"type": "string"
|
|
48
|
+
},
|
|
49
|
+
"lengthTipDescription": {
|
|
50
|
+
"type": "string"
|
|
51
|
+
},
|
|
52
|
+
"lengthTipTitle": {
|
|
53
|
+
"type": "string"
|
|
54
|
+
},
|
|
55
|
+
"noImage": {
|
|
56
|
+
"type": "string"
|
|
57
|
+
},
|
|
58
|
+
"preview": {
|
|
59
|
+
"type": "string"
|
|
60
|
+
},
|
|
61
|
+
"previewDescription": {
|
|
62
|
+
"type": "string"
|
|
63
|
+
},
|
|
64
|
+
"tooLong": {
|
|
65
|
+
"type": "string"
|
|
66
|
+
},
|
|
67
|
+
"tooShort": {
|
|
68
|
+
"type": "string"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"required": [
|
|
72
|
+
"autoGenerate",
|
|
73
|
+
"imageAutoGenerationTip",
|
|
74
|
+
"bestPractices",
|
|
75
|
+
"lengthTipTitle",
|
|
76
|
+
"lengthTipDescription",
|
|
77
|
+
"good",
|
|
78
|
+
"tooLong",
|
|
79
|
+
"tooShort",
|
|
80
|
+
"almostThere",
|
|
81
|
+
"characterCount",
|
|
82
|
+
"charactersToGo",
|
|
83
|
+
"charactersLeftOver",
|
|
84
|
+
"charactersTooMany",
|
|
85
|
+
"noImage",
|
|
86
|
+
"checksPassing",
|
|
87
|
+
"preview",
|
|
88
|
+
"previewDescription",
|
|
89
|
+
"missing"
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"required": [
|
|
94
|
+
"plugin-seo"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/translations/uk.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const uk: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Ще трошки',\n autoGenerate: 'Згенерувати',\n bestPractices: 'найкращі практики',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} символів, ',\n charactersLeftOver: 'залишилось {{characters}} символів',\n charactersToGo: ' на {{characters}} символів коротше',\n charactersTooMany: 'на {{characters}} символів довше',\n checksPassing: '{{current}}/{{max}} перевірок пройдено',\n generateAi: 'Згенерувати ШІ',\n good: 'Чудово',\n imageAutoGenerationTip: 'Автоматична генерація використає зображення з головного блоку',\n lengthTipDescription:\n 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метаописи — перегляньте ',\n lengthTipTitle:\n 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метазаголовки — перегляньте ',\n missing: 'Відсутнє',\n noImage: 'Немає зображення',\n preview: 'Попередній перегляд',\n previewDescription:\n 'Реальне відображення може відрізнятися в залежності від вмісту та релевантності пошуку.',\n tooLong: 'Задовгий',\n tooShort: 'Закороткий',\n },\n}\n"],"names":["uk","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/translations/vi.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const vi: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Gần đạt',\n autoGenerate: 'Tự động tạo',\n bestPractices: 'các phương pháp hay nhất',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} kí tự, ',\n charactersLeftOver: 'còn lại {{characters}}',\n charactersToGo: 'Còn {{characters}} ký tự nữa',\n charactersTooMany: 'vượt quá {{characters}} ký tự',\n checksPassing: '{{current}}/{{max}} đã đạt',\n generateAi: 'Tạo AI',\n good: 'Tốt',\n imageAutoGenerationTip: 'Tính năng tự động tạo sẽ lấy ảnh đầu tiên được chọn.',\n lengthTipDescription:\n 'Độ dài nên từ {{minLength}}-{{maxLength}} kí tự. Để được hướng dẫn viết mô tả meta chất lượng, hãy xem ',\n lengthTipTitle:\n 'Độ dài nên từ {{minLength}}-{{maxLength}} kí tự. Để được hướng dẫn viết mô tả meta chất lượng, hãy xem ',\n missing: 'Không đạt',\n noImage: 'Chưa có ảnh',\n preview: 'Xem trước',\n previewDescription: 'Kết quả hiển thị có thể thay đổi tuỳ theo nội dung và công cụ tìm kiếm.',\n tooLong: 'Quá dài',\n tooShort: 'Quá ngắn',\n },\n}\n"],"names":["vi","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { DocumentInfoContext } from '@payloadcms/ui'\nimport type {\n CollectionConfig,\n CollectionSlug,\n Field,\n GlobalConfig,\n GlobalSlug,\n PayloadRequest,\n} from 'payload'\n\nexport type FieldsOverride = (args: { defaultFields: Field[] }) => Field[]\n\nexport type PartialDocumentInfoContext = Pick<\n DocumentInfoContext,\n | 'collectionSlug'\n | 'docPermissions'\n | 'globalSlug'\n | 'hasPublishPermission'\n | 'hasPublishedDoc'\n | 'hasSavePermission'\n | 'id'\n | 'initialData'\n | 'initialState'\n | 'preferencesKey'\n | 'title'\n | 'versionCount'\n>\n\nexport type GenerateTitle<T = any> = (\n args: {\n collectionConfig?: CollectionConfig\n doc: T\n globalConfig?: GlobalConfig\n locale?: string\n req: PayloadRequest\n } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type GenerateDescription<T = any> = (\n args: {\n collectionConfig?: CollectionConfig\n doc: T\n globalConfig?: GlobalConfig\n locale?: string\n req: PayloadRequest\n } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type GenerateImage<T = any> = (\n args: {\n collectionConfig?: CollectionConfig\n doc: T\n globalConfig?: GlobalConfig\n locale?: string\n req: PayloadRequest\n } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type GenerateURL<T = any> = (\n args: {\n collectionConfig?: CollectionConfig\n doc: T\n globalConfig?: GlobalConfig\n locale?: string\n req: PayloadRequest\n } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type SEOPluginConfig = {\n /**\n * Collections to include the SEO fields in\n */\n collections?: CollectionSlug[]\n /**\n * Override the default fields inserted by the SEO plugin via a function that receives the default fields and returns the new fields\n *\n * If you need more flexibility you can insert the fields manually as needed. @link https://payloadcms.com/docs/plugins/seo#direct-use-of-fields\n */\n fields?: FieldsOverride\n generateDescription?: GenerateDescription\n generateDescriptionAi?: GenerateDescription\n generateImage?: GenerateImage\n generateTitle?: GenerateTitle\n generateTitleAi?: GenerateTitle\n /**\n *\n */\n generateURL?: GenerateURL\n /**\n * Globals to include the SEO fields in\n */\n globals?: GlobalSlug[]\n interfaceName?: string\n /**\n * OpenAI API key for generating descriptions and titles\n * @link https://platform.openai.com/docs/guides/authentication\n */\n openaiApiKey?: string\n /**\n * Group fields into tabs, your content will be automatically put into a general tab and the SEO fields into an SEO tab\n *\n * If you need more flexibility you can insert the fields manually as needed. @link https://payloadcms.com/docs/plugins/seo#direct-use-of-fields\n */\n tabbedUI?: boolean\n\n /**\n * The slug of the collection used to handle image uploads\n */\n uploadsCollection?: CollectionSlug\n}\n\nexport type Meta = {\n description?: string\n image?: any // TODO: type this\n keywords?: string\n title?: string\n}\n"],"names":[],"mappings":"AA+GA,WAKC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/LengthIndicator.tsx"],"sourcesContent":["'use client'\n\nimport { useTranslation } from '@payloadcms/ui'\nimport React, { Fragment, useEffect, useState } from 'react'\n\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../translations/index.js'\nimport { Pill } from './Pill.js'\n\nexport const LengthIndicator: React.FC<{\n maxLength?: number\n minLength?: number\n text?: string\n}> = (props) => {\n const { maxLength = 0, minLength = 0, text } = props\n\n const [labelStyle, setLabelStyle] = useState({\n backgroundColor: '',\n color: '',\n })\n\n const [label, setLabel] = useState('')\n\n const [barWidth, setBarWidth] = useState<number>(0)\n\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n useEffect(() => {\n const textLength = text?.length || 0\n\n if (textLength === 0) {\n setLabel(t('plugin-seo:missing'))\n setLabelStyle({\n backgroundColor: 'red',\n color: 'white',\n })\n setBarWidth(0)\n } else {\n const progress = (textLength - minLength) / (maxLength - minLength)\n\n if (progress < 0) {\n const ratioUntilMin = textLength / minLength\n\n if (ratioUntilMin > 0.9) {\n setLabel(t('plugin-seo:almostThere'))\n setLabelStyle({\n backgroundColor: 'orange',\n color: 'white',\n })\n } else {\n setLabel(t('plugin-seo:tooShort'))\n setLabelStyle({\n backgroundColor: 'orangered',\n color: 'white',\n })\n }\n\n setBarWidth(ratioUntilMin)\n }\n\n if (progress >= 0 && progress <= 1) {\n setLabel(t('plugin-seo:good'))\n setLabelStyle({\n backgroundColor: 'green',\n color: 'white',\n })\n setBarWidth(progress)\n }\n\n if (progress > 1) {\n setLabel(t('plugin-seo:tooLong'))\n setLabelStyle({\n backgroundColor: 'red',\n color: 'white',\n })\n setBarWidth(1)\n }\n }\n }, [minLength, maxLength, text, t])\n\n const textLength = text?.length || 0\n\n const charsUntilMax = maxLength - textLength\n\n const charsUntilMin = minLength - textLength\n\n return (\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n width: '100%',\n }}\n >\n <Pill backgroundColor={labelStyle.backgroundColor} color={labelStyle.color} label={label} />\n <div\n style={{\n flexShrink: 0,\n lineHeight: 1,\n marginRight: '10px',\n whiteSpace: 'nowrap',\n }}\n >\n <small>\n {t('plugin-seo:characterCount', { current: text?.length || 0, maxLength, minLength })}\n {(textLength === 0 || charsUntilMin > 0) && (\n <Fragment>{t('plugin-seo:charactersToGo', { characters: charsUntilMin })}</Fragment>\n )}\n {charsUntilMin <= 0 && charsUntilMax >= 0 && (\n <Fragment>{t('plugin-seo:charactersLeftOver', { characters: charsUntilMax })}</Fragment>\n )}\n {charsUntilMax < 0 && (\n <Fragment>\n {t('plugin-seo:charactersTooMany', { characters: charsUntilMax * -1 })}\n </Fragment>\n )}\n </small>\n </div>\n <div\n style={{\n backgroundColor: '#F3F3F3',\n height: '2px',\n position: 'relative',\n width: '100%',\n }}\n >\n <div\n style={{\n backgroundColor: labelStyle.backgroundColor,\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: `${barWidth * 100}%`,\n }}\n />\n </div>\n </div>\n )\n}\n"],"names":["useTranslation","React","Fragment","useEffect","useState","Pill","LengthIndicator","props","maxLength","minLength","text","labelStyle","setLabelStyle","backgroundColor","color","label","setLabel","barWidth","setBarWidth","t","textLength","length","progress","ratioUntilMin","charsUntilMax","charsUntilMin","div","style","alignItems","display","width","flexShrink","lineHeight","marginRight","whiteSpace","small","current","characters","height","position","left","top"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,SAASC,QAAQ,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAG5D,SAASC,IAAI,QAAQ,YAAW;AAEhC,OAAO,MAAMC,kBAIR,CAACC;IACJ,MAAM,EAAEC,YAAY,CAAC,EAAEC,YAAY,CAAC,EAAEC,IAAI,EAAE,GAAGH;IAE/C,MAAM,CAACI,YAAYC,cAAc,GAAGR,SAAS;QAC3CS,iBAAiB;QACjBC,OAAO;IACT;IAEA,MAAM,CAACC,OAAOC,SAAS,GAAGZ,SAAS;IAEnC,MAAM,CAACa,UAAUC,YAAY,GAAGd,SAAiB;IAEjD,MAAM,EAAEe,CAAC,EAAE,GAAGnB;IAEdG,UAAU;QACR,MAAMiB,aAAaV,MAAMW,UAAU;QAEnC,IAAID,eAAe,GAAG;YACpBJ,SAASG,EAAE;YACXP,cAAc;gBACZC,iBAAiB;gBACjBC,OAAO;YACT;YACAI,YAAY;QACd,OAAO;YACL,MAAMI,WAAW,AAACF,CAAAA,aAAaX,SAAQ,IAAMD,CAAAA,YAAYC,SAAQ;YAEjE,IAAIa,WAAW,GAAG;gBAChB,MAAMC,gBAAgBH,aAAaX;gBAEnC,IAAIc,gBAAgB,KAAK;oBACvBP,SAASG,EAAE;oBACXP,cAAc;wBACZC,iBAAiB;wBACjBC,OAAO;oBACT;gBACF,OAAO;oBACLE,SAASG,EAAE;oBACXP,cAAc;wBACZC,iBAAiB;wBACjBC,OAAO;oBACT;gBACF;gBAEAI,YAAYK;YACd;YAEA,IAAID,YAAY,KAAKA,YAAY,GAAG;gBAClCN,SAASG,EAAE;gBACXP,cAAc;oBACZC,iBAAiB;oBACjBC,OAAO;gBACT;gBACAI,YAAYI;YACd;YAEA,IAAIA,WAAW,GAAG;gBAChBN,SAASG,EAAE;gBACXP,cAAc;oBACZC,iBAAiB;oBACjBC,OAAO;gBACT;gBACAI,YAAY;YACd;QACF;IACF,GAAG;QAACT;QAAWD;QAAWE;QAAMS;KAAE;IAElC,MAAMC,aAAaV,MAAMW,UAAU;IAEnC,MAAMG,gBAAgBhB,YAAYY;IAElC,MAAMK,gBAAgBhB,YAAYW;IAElC,qBACE,MAACM;QACCC,OAAO;YACLC,YAAY;YACZC,SAAS;YACTC,OAAO;QACT;;0BAEA,KAACzB;gBAAKQ,iBAAiBF,WAAWE,eAAe;gBAAEC,OAAOH,WAAWG,KAAK;gBAAEC,OAAOA;;0BACnF,KAACW;gBACCC,OAAO;oBACLI,YAAY;oBACZC,YAAY;oBACZC,aAAa;oBACbC,YAAY;gBACd;0BAEA,cAAA,MAACC;;wBACEhB,EAAE,6BAA6B;4BAAEiB,SAAS1B,MAAMW,UAAU;4BAAGb;4BAAWC;wBAAU;wBACjFW,CAAAA,eAAe,KAAKK,gBAAgB,CAAA,mBACpC,KAACvB;sCAAUiB,EAAE,6BAA6B;gCAAEkB,YAAYZ;4BAAc;;wBAEvEA,iBAAiB,KAAKD,iBAAiB,mBACtC,KAACtB;sCAAUiB,EAAE,iCAAiC;gCAAEkB,YAAYb;4BAAc;;wBAE3EA,gBAAgB,mBACf,KAACtB;sCACEiB,EAAE,gCAAgC;gCAAEkB,YAAYb,gBAAgB,CAAC;4BAAE;;;;;0BAK5E,KAACE;gBACCC,OAAO;oBACLd,iBAAiB;oBACjByB,QAAQ;oBACRC,UAAU;oBACVT,OAAO;gBACT;0BAEA,cAAA,KAACJ;oBACCC,OAAO;wBACLd,iBAAiBF,WAAWE,eAAe;wBAC3CyB,QAAQ;wBACRE,MAAM;wBACND,UAAU;wBACVE,KAAK;wBACLX,OAAO,GAAGb,WAAW,IAAI,CAAC,CAAC;oBAC7B;;;;;AAKV,EAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/Pill.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nexport const Pill: React.FC<{\n backgroundColor: string\n color: string\n label: string\n}> = (props) => {\n const { backgroundColor, color, label } = props\n\n return (\n <div\n style={{\n backgroundColor,\n borderRadius: '2px',\n color,\n flexShrink: 0,\n lineHeight: 1,\n marginRight: '10px',\n padding: '4px 6px',\n whiteSpace: 'nowrap',\n }}\n >\n <small>{label}</small>\n </div>\n )\n}\n"],"names":["React","Pill","props","backgroundColor","color","label","div","style","borderRadius","flexShrink","lineHeight","marginRight","padding","whiteSpace","small"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,OAAO,MAAMC,OAIR,CAACC;IACJ,MAAM,EAAEC,eAAe,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGH;IAE1C,qBACE,KAACI;QACCC,OAAO;YACLJ;YACAK,cAAc;YACdJ;YACAK,YAAY;YACZC,YAAY;YACZC,aAAa;YACbC,SAAS;YACTC,YAAY;QACd;kBAEA,cAAA,KAACC;sBAAOT;;;AAGd,EAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@justanarthur/payload-plugin-seo",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.8",
|
|
4
4
|
"private": false,
|
|
5
5
|
"bugs": "https://github.com/r1tsuu/payload-enchants/issues",
|
|
6
6
|
"repository": "https://github.com/r1tsuu/payload-enchants",
|
|
@@ -10,8 +10,28 @@
|
|
|
10
10
|
"exports": {
|
|
11
11
|
".": {
|
|
12
12
|
"import": "./dist/index.js",
|
|
13
|
-
"
|
|
14
|
-
"
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"require": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./types": {
|
|
17
|
+
"import": "./dist/exports/types.js",
|
|
18
|
+
"types": "./dist/exports/types.d.ts",
|
|
19
|
+
"require": "./dist/exports/types.js"
|
|
20
|
+
},
|
|
21
|
+
"./fields": {
|
|
22
|
+
"import": "./dist/exports/fields.js",
|
|
23
|
+
"types": "./dist/exports/fields.d.ts",
|
|
24
|
+
"require": "./dist/exports/fields.js"
|
|
25
|
+
},
|
|
26
|
+
"./fields-components": {
|
|
27
|
+
"import": "./dist/exports/fields-components.js",
|
|
28
|
+
"types": "./dist/exports/fields-components.d.ts",
|
|
29
|
+
"require": "./dist/exports/fields-components.js"
|
|
30
|
+
},
|
|
31
|
+
"./client": {
|
|
32
|
+
"import": "./dist/exports/client.js",
|
|
33
|
+
"types": "./dist/exports/client.d.ts",
|
|
34
|
+
"require": "./dist/exports/client.js"
|
|
15
35
|
}
|
|
16
36
|
},
|
|
17
37
|
"files": [
|
|
@@ -23,8 +43,8 @@
|
|
|
23
43
|
"devDependencies": {
|
|
24
44
|
"@payloadcms/translations": "3.47.0",
|
|
25
45
|
"@payloadcms/ui": "3.47.0",
|
|
26
|
-
"@swc/cli": "^0.
|
|
27
|
-
"@swc/core": "^1.
|
|
46
|
+
"@swc/cli": "^0.1.65",
|
|
47
|
+
"@swc/core": "^1.6.3",
|
|
28
48
|
"@types/react": "*",
|
|
29
49
|
"@types/react-dom": "*",
|
|
30
50
|
"copyfiles": "^2.4.1",
|
package/dist/src/defaults.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/defaults.ts"],"sourcesContent":["export const defaults = {\r\n description: {\r\n maxLength: 150,\r\n minLength: 100,\r\n },\r\n title: {\r\n maxLength: 60,\r\n minLength: 50,\r\n },\r\n}\r\n"],"names":["defaults","description","maxLength","minLength","title"],"mappings":"AAAA,OAAO,MAAMA,WAAW;IACtBC,aAAa;QACXC,WAAW;QACXC,WAAW;IACb;IACAC,OAAO;QACLF,WAAW;QACXC,WAAW;IACb;AACF,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/exports/client.ts"],"sourcesContent":["export { MetaDescriptionComponent } from '../fields/MetaDescription/MetaDescriptionComponent'\r\nexport { MetaImageComponent } from '../fields/MetaImage/MetaImageComponent'\r\nexport { MetaTitleComponent } from '../fields/MetaTitle/MetaTitleComponent'\r\nexport { OverviewComponent } from '../fields/Overview/OverviewComponent'\r\nexport { PreviewComponent } from '../fields/Preview/PreviewComponent'\r\n"],"names":["MetaDescriptionComponent","MetaImageComponent","MetaTitleComponent","OverviewComponent","PreviewComponent"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,qDAAoD;AAC7F,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,gBAAgB,QAAQ,qCAAoC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/exports/fields-components.ts"],"sourcesContent":["export { MetaDescriptionComponent } from '../fields/MetaDescription/MetaDescriptionComponent'\r\nexport { MetaImageComponent } from '../fields/MetaImage/MetaImageComponent'\r\nexport { MetaTitleComponent } from '../fields/MetaTitle/MetaTitleComponent'\r\nexport { OverviewComponent } from '../fields/Overview/OverviewComponent'\r\nexport { PreviewComponent } from '../fields/Preview/PreviewComponent'\r\n"],"names":["MetaDescriptionComponent","MetaImageComponent","MetaTitleComponent","OverviewComponent","PreviewComponent"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,qDAAoD;AAC7F,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,gBAAgB,QAAQ,qCAAoC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/exports/fields.ts"],"sourcesContent":["export { MetaDescriptionField } from '../fields/MetaDescription'\r\nexport { MetaImageField } from '../fields/MetaImage'\r\nexport { MetaTitleField } from '../fields/MetaTitle'\r\nexport { OverviewField } from '../fields/Overview'\r\nexport { PreviewField } from '../fields/Preview'\r\n"],"names":["MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,YAAY,QAAQ,oBAAmB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/exports/types.ts"],"sourcesContent":["export type {\r\n GenerateDescription,\r\n GenerateImage,\r\n GenerateTitle,\r\n GenerateURL,\r\n Meta,\r\n SEOPluginConfig,\r\n} from '../types'\r\n"],"names":[],"mappings":"AAAA,WAOiB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/MetaDescription/MetaDescriptionComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport type { FieldType, Options } from '@payloadcms/ui'\r\nimport {\r\n FieldLabel,\r\n TextareaInput,\r\n useConfig,\r\n useDocumentInfo,\r\n useField,\r\n useForm,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\r\nimport type { TextareaFieldClientProps } from 'payload'\r\nimport React, { useCallback } from 'react'\r\n\r\nimport { defaults } from '../../defaults'\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\nimport type { GenerateDescription } from '../../types'\r\nimport { LengthIndicator } from '../../ui/LengthIndicator'\r\n\r\nconst { maxLength: maxLengthDefault, minLength: minLengthDefault } = defaults.description\r\n\r\ntype MetaDescriptionProps = {\r\n readonly hasGenerateDescriptionAi: boolean\r\n readonly hasGenerateDescriptionFn: boolean\r\n} & TextareaFieldClientProps\r\n\r\nexport const MetaDescriptionComponent: React.FC<MetaDescriptionProps> = (props) => {\r\n const {\r\n field: {\r\n label,\r\n localized,\r\n maxLength: maxLengthFromProps,\r\n minLength: minLengthFromProps,\r\n required,\r\n },\r\n hasGenerateDescriptionAi,\r\n hasGenerateDescriptionFn,\r\n path,\r\n readOnly,\r\n } = props\r\n\r\n const {\r\n config: {\r\n routes: { api },\r\n serverURL,\r\n },\r\n } = useConfig()\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const locale = useLocale()\r\n\r\n const { getData } = useForm()\r\n\r\n const docInfo = useDocumentInfo()\r\n\r\n const maxLength = maxLengthFromProps || maxLengthDefault\r\n\r\n const minLength = minLengthFromProps || minLengthDefault\r\n\r\n const { customComponents, errorMessage, setValue, showError, value }: FieldType<string> =\r\n useField({\r\n path,\r\n } as Options)\r\n\r\n const { AfterInput, BeforeInput, Label } = customComponents || {}\r\n\r\n const regenerateDescription = useCallback(async () => {\r\n if (!hasGenerateDescriptionFn) {\r\n return\r\n }\r\n\r\n const endpoint = `${serverURL}${api}/plugin-seo/generate-description`\r\n\r\n const genDescriptionResponse = await fetch(endpoint, {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n } satisfies Omit<\r\n Parameters<GenerateDescription>[0],\r\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\r\n >),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: generatedDescription } = await genDescriptionResponse.json()\r\n\r\n setValue(generatedDescription || '')\r\n }, [\r\n hasGenerateDescriptionFn,\r\n serverURL,\r\n api,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n locale,\r\n setValue,\r\n ])\r\n\r\n const regenerateDescriptionAi = useCallback(async () => {\r\n if (!hasGenerateDescriptionAi) return\r\n\r\n const genDescriptionResponse = await fetch('/api/plugin-seo/generate-description-ai', {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n }),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: generatedDescription } = await genDescriptionResponse.json()\r\n\r\n setValue(generatedDescription || '')\r\n }, [\r\n setValue,\r\n hasGenerateDescriptionAi,\r\n locale,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n ])\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div\r\n style={{\r\n marginBottom: '5px',\r\n position: 'relative',\r\n }}\r\n >\r\n <div className=\"plugin-seo__field\">\r\n {Label ?? (\r\n <FieldLabel label={label} localized={localized} path={path} required={required} />\r\n )}\r\n {hasGenerateDescriptionFn && (\r\n <React.Fragment>\r\n — \r\n <button\r\n disabled={readOnly}\r\n onClick={() => {\r\n void regenerateDescription()\r\n }}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:autoGenerate')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n {hasGenerateDescriptionAi && (\r\n <React.Fragment>\r\n — \r\n <button\r\n disabled={readOnly}\r\n onClick={regenerateDescriptionAi}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:generateAi')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n color: '#9A9A9A',\r\n }}\r\n >\r\n {t('plugin-seo:lengthTipDescription', { maxLength, minLength })}\r\n <a\r\n href=\"https://developers.google.com/search/docs/advanced/appearance/snippet#meta-descriptions\"\r\n rel=\"noopener noreferrer\"\r\n target=\"_blank\"\r\n >\r\n {t('plugin-seo:bestPractices')}\r\n </a>\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n marginBottom: '10px',\r\n position: 'relative',\r\n }}\r\n >\r\n <TextareaInput\r\n AfterInput={AfterInput}\r\n BeforeInput={BeforeInput}\r\n Error={errorMessage}\r\n onChange={setValue}\r\n path={path}\r\n readOnly={readOnly}\r\n required={required}\r\n showError={showError}\r\n style={{\r\n marginBottom: 0,\r\n }}\r\n value={value}\r\n />\r\n </div>\r\n <div\r\n style={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n width: '100%',\r\n }}\r\n >\r\n <LengthIndicator maxLength={maxLength} minLength={minLength} text={value} />\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["FieldLabel","TextareaInput","useConfig","useDocumentInfo","useField","useForm","useLocale","useTranslation","reduceToSerializableFields","React","useCallback","defaults","LengthIndicator","maxLength","maxLengthDefault","minLength","minLengthDefault","description","MetaDescriptionComponent","props","field","label","localized","maxLengthFromProps","minLengthFromProps","required","hasGenerateDescriptionAi","hasGenerateDescriptionFn","path","readOnly","config","routes","api","serverURL","t","locale","getData","docInfo","customComponents","errorMessage","setValue","showError","value","AfterInput","BeforeInput","Label","regenerateDescription","endpoint","genDescriptionResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","title","credentials","headers","method","result","generatedDescription","json","regenerateDescriptionAi","div","style","marginBottom","position","className","Fragment","button","disabled","onClick","background","backgroundColor","border","color","cursor","padding","textDecoration","type","a","href","rel","target","Error","onChange","alignItems","display","width","text"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/MetaDescription/index.ts"],"sourcesContent":["// @ts-nocheck\r\nimport type { TextareaField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n /**\r\n * Tell the component if the generate AI function is available as configured in the plugin config\r\n */\r\n hasGenerateAi?: boolean\r\n /**\r\n * Tell the component if the generate function is available as configured in the plugin config\r\n */\r\n hasGenerateFn?: boolean\r\n overrides?: Omit<Partial<TextareaField>, 'admin'>\r\n}\r\n\r\ntype FieldFunction = ({\r\n hasGenerateAi,\r\n hasGenerateFn,\r\n overrides,\r\n}: FieldFunctionProps) => TextareaField\r\n\r\nexport const MetaDescriptionField: FieldFunction = ({\r\n hasGenerateAi = false,\r\n hasGenerateFn = false,\r\n overrides,\r\n}) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n hasGenerateDescriptionAi: hasGenerateAi,\r\n hasGenerateDescriptionFn: hasGenerateFn,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#MetaDescriptionComponent',\r\n },\r\n },\r\n },\r\n localized: true,\r\n name: 'description',\r\n type: 'textarea',\r\n ...((overrides as TextareaField) ?? {}),\r\n }\r\n}\r\n"],"names":["MetaDescriptionField","hasGenerateAi","hasGenerateFn","overrides","admin","components","Field","clientProps","hasGenerateDescriptionAi","hasGenerateDescriptionFn","path","localized","name","type"],"mappings":"AAAA,cAAc;AAqBd,OAAO,MAAMA,uBAAsC,CAAC,EAClDC,gBAAgB,KAAK,EACrBC,gBAAgB,KAAK,EACrBC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXC,0BAA0BP;wBAC1BQ,0BAA0BP;oBAC5B;oBACAQ,MAAM;gBACR;YACF;QACF;QACAC,WAAW;QACXC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAA+B,CAAC,CAAC;IACxC;AACF,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/MetaImage/MetaImageComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport type { FieldType, Options } from '@payloadcms/ui'\r\nimport {\r\n FieldLabel,\r\n RenderCustomComponent,\r\n UploadInput,\r\n useConfig,\r\n useDocumentInfo,\r\n useField,\r\n useForm,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\r\nimport type { UploadFieldClientProps } from 'payload'\r\nimport React, { useCallback } from 'react'\r\n\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\nimport type { GenerateImage } from '../../types'\r\nimport { Pill } from '../../ui/Pill'\r\n\r\ntype MetaImageProps = {\r\n readonly hasGenerateImageFn: boolean\r\n} & UploadFieldClientProps\r\n\r\nexport const MetaImageComponent: React.FC<MetaImageProps> = (props) => {\r\n const {\r\n field: { label, localized, relationTo, required },\r\n hasGenerateImageFn,\r\n path,\r\n readOnly,\r\n } = props || {}\r\n\r\n const {\r\n config: {\r\n collections,\r\n routes: { api },\r\n serverURL,\r\n },\r\n } = useConfig()\r\n\r\n const field: FieldType<string> = useField({ ...props, path } as Options)\r\n\r\n const { customComponents } = field\r\n\r\n const {\r\n // biome-ignore lint/suspicious/noShadowRestrictedNames: <explanation>\r\n Error,\r\n Label,\r\n } = customComponents || {}\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const locale = useLocale()\r\n\r\n const { getData } = useForm()\r\n\r\n const docInfo = useDocumentInfo()\r\n\r\n const { setValue, showError, value } = field\r\n\r\n const regenerateImage = useCallback(async () => {\r\n if (!hasGenerateImageFn) {\r\n return\r\n }\r\n\r\n const endpoint = `${serverURL}${api}/plugin-seo/generate-image`\r\n\r\n const genImageResponse = await fetch(endpoint, {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n } satisfies Omit<\r\n Parameters<GenerateImage>[0],\r\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\r\n >),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const generatedImage = await genImageResponse.text()\r\n\r\n setValue(generatedImage || '')\r\n }, [\r\n hasGenerateImageFn,\r\n serverURL,\r\n api,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n locale,\r\n setValue,\r\n ])\r\n\r\n const hasImage = Boolean(value)\r\n\r\n const collection = collections?.find((coll) => coll.slug === relationTo) || undefined\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div\r\n style={{\r\n marginBottom: '5px',\r\n position: 'relative',\r\n }}\r\n >\r\n <div className=\"plugin-seo__field\">\r\n <RenderCustomComponent\r\n CustomComponent={Label}\r\n Fallback={\r\n <FieldLabel label={label} localized={localized} path={path} required={required} />\r\n }\r\n />\r\n {hasGenerateImageFn && (\r\n <React.Fragment>\r\n — \r\n <button\r\n disabled={readOnly}\r\n onClick={() => {\r\n void regenerateImage()\r\n }}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:autoGenerate')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n </div>\r\n {hasGenerateImageFn && (\r\n <div\r\n style={{\r\n color: '#9A9A9A',\r\n }}\r\n >\r\n {t('plugin-seo:imageAutoGenerationTip')}\r\n </div>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n marginBottom: '10px',\r\n position: 'relative',\r\n }}\r\n >\r\n <UploadInput\r\n Error={Error}\r\n api={api}\r\n collection={collection}\r\n filterOptions={field.filterOptions}\r\n onChange={(incomingImage) => {\r\n if (incomingImage !== null) {\r\n if (typeof incomingImage === 'object') {\r\n const { id: incomingID } = incomingImage\r\n\r\n setValue(incomingID)\r\n } else {\r\n setValue(incomingImage)\r\n }\r\n } else {\r\n setValue(null)\r\n }\r\n }}\r\n path={path}\r\n readOnly={readOnly}\r\n relationTo={relationTo}\r\n required={required}\r\n serverURL={serverURL}\r\n showError={showError}\r\n style={{\r\n marginBottom: 0,\r\n }}\r\n value={value}\r\n />\r\n </div>\r\n <div\r\n style={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n width: '100%',\r\n }}\r\n >\r\n <Pill\r\n backgroundColor={hasImage ? 'green' : 'red'}\r\n color=\"white\"\r\n label={hasImage ? t('plugin-seo:good') : t('plugin-seo:noImage')}\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["FieldLabel","RenderCustomComponent","UploadInput","useConfig","useDocumentInfo","useField","useForm","useLocale","useTranslation","reduceToSerializableFields","React","useCallback","Pill","MetaImageComponent","props","field","label","localized","relationTo","required","hasGenerateImageFn","path","readOnly","config","collections","routes","api","serverURL","customComponents","Error","Label","t","locale","getData","docInfo","setValue","showError","value","regenerateImage","endpoint","genImageResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","title","credentials","headers","method","generatedImage","text","hasImage","Boolean","collection","find","coll","slug","div","style","marginBottom","position","className","CustomComponent","Fallback","Fragment","button","disabled","onClick","background","backgroundColor","border","color","cursor","padding","textDecoration","type","filterOptions","onChange","incomingImage","incomingID","alignItems","display","width"],"mappings":"AAAA;;AAGA,SACEA,UAAU,EACVC,qBAAqB,EACrBC,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,QAAQ,EACRC,OAAO,EACPC,SAAS,EACTC,cAAc,QACT,iBAAgB;AACvB,SAASC,0BAA0B,QAAQ,wBAAuB;AAElE,OAAOC,SAASC,WAAW,QAAQ,QAAO;AAI1C,SAASC,IAAI,QAAQ,gBAAe;AAMpC,OAAO,MAAMC,qBAA+C,CAACC;IAC3D,MAAM,EACJC,OAAO,EAAEC,KAAK,EAAEC,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAE,EACjDC,kBAAkB,EAClBC,IAAI,EACJC,QAAQ,EACT,GAAGR,SAAS,CAAC;IAEd,MAAM,EACJS,QAAQ,EACNC,WAAW,EACXC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACF,GAAGxB;IAEJ,MAAMY,QAA2BV,SAAS;QAAE,GAAGS,KAAK;QAAEO;IAAK;IAE3D,MAAM,EAAEO,gBAAgB,EAAE,GAAGb;IAE7B,MAAM,EACJ,sEAAsE;IACtEc,KAAK,EACLC,KAAK,EACN,GAAGF,oBAAoB,CAAC;IAEzB,MAAM,EAAEG,CAAC,EAAE,GAAGvB;IAEd,MAAMwB,SAASzB;IAEf,MAAM,EAAE0B,OAAO,EAAE,GAAG3B;IAEpB,MAAM4B,UAAU9B;IAEhB,MAAM,EAAE+B,QAAQ,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGtB;IAEvC,MAAMuB,kBAAkB3B,YAAY;QAClC,IAAI,CAACS,oBAAoB;YACvB;QACF;QAEA,MAAMmB,WAAW,GAAGZ,YAAYD,IAAI,0BAA0B,CAAC;QAE/D,MAAMc,mBAAmB,MAAMC,MAAMF,UAAU;YAC7CG,MAAMC,KAAKC,SAAS,CAAC;gBACnBC,gBAAgBX,QAAQW,cAAc;gBACtCC,KAAKb;gBACLc,gBAAgBb,QAAQa,cAAc;gBACtCC,YAAYd,QAAQc,UAAU;gBAC9BC,sBAAsBf,QAAQe,oBAAoB;gBAClDC,mBAAmBhB,QAAQgB,iBAAiB;gBAC5CC,IAAIjB,QAAQiB,EAAE;gBACdC,aAAalB,QAAQkB,WAAW;gBAChCC,cAAcnB,QAAQmB,YAAY,GAC9B5C,2BAA2ByB,QAAQmB,YAAY,IAC/CC;gBACJtB,QAAQ,OAAOA,WAAW,WAAWA,QAAQuB,OAAOvB;gBACpDwB,OAAOtB,QAAQsB,KAAK;YACtB;YAIAC,aAAa;YACbC,SAAS;gBACP,gBAAgB;YAClB;YACAC,QAAQ;QACV;QAEA,MAAMC,iBAAiB,MAAMpB,iBAAiBqB,IAAI;QAElD1B,SAASyB,kBAAkB;IAC7B,GAAG;QACDxC;QACAO;QACAD;QACAQ,QAAQiB,EAAE;QACVjB,QAAQW,cAAc;QACtBX,QAAQa,cAAc;QACtBb,QAAQc,UAAU;QAClBd,QAAQe,oBAAoB;QAC5Bf,QAAQgB,iBAAiB;QACzBhB,QAAQkB,WAAW;QACnBlB,QAAQmB,YAAY;QACpBnB,QAAQsB,KAAK;QACbvB;QACAD;QACAG;KACD;IAED,MAAM2B,WAAWC,QAAQ1B;IAEzB,MAAM2B,aAAaxC,aAAayC,KAAK,CAACC,OAASA,KAAKC,IAAI,KAAKjD,eAAeoC;IAE5E,qBACE,MAACc;QACCC,OAAO;YACLC,cAAc;QAChB;;0BAEA,MAACF;gBACCC,OAAO;oBACLC,cAAc;oBACdC,UAAU;gBACZ;;kCAEA,MAACH;wBAAII,WAAU;;0CACb,KAACvE;gCACCwE,iBAAiB3C;gCACjB4C,wBACE,KAAC1E;oCAAWgB,OAAOA;oCAAOC,WAAWA;oCAAWI,MAAMA;oCAAMF,UAAUA;;;4BAGzEC,oCACC,MAACV,MAAMiE,QAAQ;;oCAAC;kDAEd,KAACC;wCACCC,UAAUvD;wCACVwD,SAAS;4CACP,KAAKxC;wCACP;wCACA+B,OAAO;4CACLU,YAAY;4CACZC,iBAAiB;4CACjBC,QAAQ;4CACRC,OAAO;4CACPC,QAAQ;4CACRC,SAAS;4CACTC,gBAAgB;wCAClB;wCACAC,MAAK;kDAEJvD,EAAE;;;;;;oBAKVX,oCACC,KAACgD;wBACCC,OAAO;4BACLa,OAAO;wBACT;kCAECnD,EAAE;;;;0BAIT,KAACqC;gBACCC,OAAO;oBACLC,cAAc;oBACdC,UAAU;gBACZ;0BAEA,cAAA,KAACrE;oBACC2B,OAAOA;oBACPH,KAAKA;oBACLsC,YAAYA;oBACZuB,eAAexE,MAAMwE,aAAa;oBAClCC,UAAU,CAACC;wBACT,IAAIA,kBAAkB,MAAM;4BAC1B,IAAI,OAAOA,kBAAkB,UAAU;gCACrC,MAAM,EAAEtC,IAAIuC,UAAU,EAAE,GAAGD;gCAE3BtD,SAASuD;4BACX,OAAO;gCACLvD,SAASsD;4BACX;wBACF,OAAO;4BACLtD,SAAS;wBACX;oBACF;oBACAd,MAAMA;oBACNC,UAAUA;oBACVJ,YAAYA;oBACZC,UAAUA;oBACVQ,WAAWA;oBACXS,WAAWA;oBACXiC,OAAO;wBACLC,cAAc;oBAChB;oBACAjC,OAAOA;;;0BAGX,KAAC+B;gBACCC,OAAO;oBACLsB,YAAY;oBACZC,SAAS;oBACTC,OAAO;gBACT;0BAEA,cAAA,KAACjF;oBACCoE,iBAAiBlB,WAAW,UAAU;oBACtCoB,OAAM;oBACNlE,OAAO8C,WAAW/B,EAAE,qBAAqBA,EAAE;;;;;AAKrD,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/MetaImage/index.ts"],"sourcesContent":["// @ts-nocheck\r\nimport type { CollectionSlug, UploadField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n /**\r\n * Tell the component if the generate function is available as configured in the plugin config\r\n */\r\n hasGenerateFn?: boolean\r\n overrides?: Partial<UploadField>\r\n relationTo: string\r\n}\r\n\r\ntype FieldFunction = ({ hasGenerateFn, overrides }: FieldFunctionProps) => UploadField\r\n\r\nexport const MetaImageField: FieldFunction = ({ hasGenerateFn = false, overrides, relationTo }) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n hasGenerateImageFn: hasGenerateFn,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#MetaImageComponent',\r\n },\r\n },\r\n description: 'Maximum upload file size: 12MB. Recommended file size for images is <500KB.',\r\n },\r\n label: 'Meta Image',\r\n localized: true,\r\n name: 'image',\r\n relationTo: relationTo as CollectionSlug,\r\n type: 'upload',\r\n ...((overrides as unknown as UploadField) ?? {}),\r\n }\r\n}\r\n"],"names":["MetaImageField","hasGenerateFn","overrides","relationTo","admin","components","Field","clientProps","hasGenerateImageFn","path","description","label","localized","name","type"],"mappings":"AAAA,cAAc;AAcd,OAAO,MAAMA,iBAAgC,CAAC,EAAEC,gBAAgB,KAAK,EAAEC,SAAS,EAAEC,UAAU,EAAE;IAC5F,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXC,oBAAoBP;oBACtB;oBACAQ,MAAM;gBACR;YACF;YACAC,aAAa;QACf;QACAC,OAAO;QACPC,WAAW;QACXC,MAAM;QACNV,YAAYA;QACZW,MAAM;QACN,GAAI,AAACZ,aAAwC,CAAC,CAAC;IACjD;AACF,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/MetaTitle/MetaTitleComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport '../index.scss'\r\n\r\nimport type { FieldType, Options } from '@payloadcms/ui'\r\nimport {\r\n FieldLabel,\r\n TextInput,\r\n useConfig,\r\n useDocumentInfo,\r\n useField,\r\n useForm,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\r\nimport type { TextFieldClientProps } from 'payload'\r\nimport React, { useCallback } from 'react'\r\n\r\nimport { defaults } from '../../defaults'\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\nimport type { GenerateTitle } from '../../types'\r\nimport { LengthIndicator } from '../../ui/LengthIndicator'\r\n\r\nconst { maxLength: maxLengthDefault, minLength: minLengthDefault } = defaults.title\r\n\r\ntype MetaTitleProps = {\r\n readonly hasGenerateTitleAi: boolean\r\n readonly hasGenerateTitleFn: boolean\r\n} & TextFieldClientProps\r\n\r\nexport const MetaTitleComponent: React.FC<MetaTitleProps> = (props) => {\r\n const {\r\n field: { label, maxLength: maxLengthFromProps, minLength: minLengthFromProps, required },\r\n hasGenerateTitleAi,\r\n hasGenerateTitleFn,\r\n path,\r\n readOnly,\r\n } = props || {}\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const {\r\n config: {\r\n routes: { api },\r\n serverURL,\r\n },\r\n } = useConfig()\r\n\r\n const field: FieldType<string> = useField({ path } as Options)\r\n\r\n const { customComponents: { AfterInput, BeforeInput, Label } = {} } = field\r\n\r\n const locale = useLocale()\r\n\r\n const { getData } = useForm()\r\n\r\n const docInfo = useDocumentInfo()\r\n\r\n const minLength = minLengthFromProps || minLengthDefault\r\n\r\n const maxLength = maxLengthFromProps || maxLengthDefault\r\n\r\n const { errorMessage, setValue, showError, value } = field\r\n\r\n const regenerateTitle = useCallback(async () => {\r\n if (!hasGenerateTitleFn) {\r\n return\r\n }\r\n\r\n const endpoint = `${serverURL}${api}/plugin-seo/generate-title`\r\n\r\n const genTitleResponse = await fetch(endpoint, {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n } satisfies Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\r\n >),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: generatedTitle } = await genTitleResponse.json()\r\n\r\n setValue(generatedTitle || '')\r\n }, [\r\n hasGenerateTitleFn,\r\n serverURL,\r\n api,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n locale,\r\n setValue,\r\n ])\r\n\r\n const regenerateTitleAi = useCallback(async () => {\r\n if (!hasGenerateTitleAi) return\r\n\r\n const genTitleResponse = await fetch('/api/plugin-seo/generate-title-ai', {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n }),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: generatedTitle } = await genTitleResponse.json()\r\n\r\n setValue(generatedTitle || '')\r\n }, [\r\n setValue,\r\n hasGenerateTitleAi,\r\n locale,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n ])\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div\r\n style={{\r\n marginBottom: '5px',\r\n position: 'relative',\r\n }}\r\n >\r\n <div className=\"plugin-seo__field\">\r\n {Label ?? <FieldLabel label={label} path={path} required={required} />}\r\n {hasGenerateTitleFn && (\r\n <React.Fragment>\r\n — \r\n <button\r\n disabled={readOnly}\r\n onClick={() => {\r\n void regenerateTitle()\r\n }}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:autoGenerate')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n {hasGenerateTitleAi && (\r\n <React.Fragment>\r\n — \r\n <button\r\n onClick={regenerateTitleAi}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:generateAi')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n color: '#9A9A9A',\r\n }}\r\n >\r\n {t('plugin-seo:lengthTipTitle', { maxLength, minLength })}\r\n <a\r\n href=\"https://developers.google.com/search/docs/advanced/appearance/title-link#page-titles\"\r\n rel=\"noopener noreferrer\"\r\n target=\"_blank\"\r\n >\r\n {t('plugin-seo:bestPractices')}\r\n </a>\r\n .\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n marginBottom: '10px',\r\n position: 'relative',\r\n }}\r\n >\r\n <TextInput\r\n AfterInput={AfterInput}\r\n BeforeInput={BeforeInput}\r\n Error={errorMessage}\r\n onChange={setValue}\r\n path={path}\r\n readOnly={readOnly}\r\n required={required}\r\n showError={showError}\r\n style={{\r\n marginBottom: 0,\r\n }}\r\n value={value}\r\n />\r\n </div>\r\n <div\r\n style={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n width: '100%',\r\n }}\r\n >\r\n <LengthIndicator maxLength={maxLength} minLength={minLength} text={value} />\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["FieldLabel","TextInput","useConfig","useDocumentInfo","useField","useForm","useLocale","useTranslation","reduceToSerializableFields","React","useCallback","defaults","LengthIndicator","maxLength","maxLengthDefault","minLength","minLengthDefault","title","MetaTitleComponent","props","field","label","maxLengthFromProps","minLengthFromProps","required","hasGenerateTitleAi","hasGenerateTitleFn","path","readOnly","t","config","routes","api","serverURL","customComponents","AfterInput","BeforeInput","Label","locale","getData","docInfo","errorMessage","setValue","showError","value","regenerateTitle","endpoint","genTitleResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","credentials","headers","method","result","generatedTitle","json","regenerateTitleAi","div","style","marginBottom","position","className","Fragment","button","disabled","onClick","background","backgroundColor","border","color","cursor","padding","textDecoration","type","a","href","rel","target","Error","onChange","alignItems","display","width","text"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/MetaTitle/index.ts"],"sourcesContent":["// @ts-nocheck\r\nimport type { TextField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n /**\r\n * Tell the component if the generate AI function is available as configured in the plugin config\r\n */\r\n hasGenerateAi?: boolean\r\n /**\r\n * Tell the component if the generate function is available as configured in the plugin config\r\n */\r\n hasGenerateFn?: boolean\r\n overrides?: Partial<TextField>\r\n}\r\n\r\ntype FieldFunction = ({ hasGenerateAi, hasGenerateFn, overrides }: FieldFunctionProps) => TextField\r\n\r\nexport const MetaTitleField: FieldFunction = ({\r\n hasGenerateAi = false,\r\n hasGenerateFn = false,\r\n overrides,\r\n}) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n hasGenerateTitleAi: hasGenerateAi,\r\n hasGenerateTitleFn: hasGenerateFn,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#MetaTitleComponent',\r\n },\r\n },\r\n },\r\n localized: true,\r\n name: 'title',\r\n type: 'text',\r\n ...((overrides as unknown as TextField) ?? {}),\r\n }\r\n}\r\n"],"names":["MetaTitleField","hasGenerateAi","hasGenerateFn","overrides","admin","components","Field","clientProps","hasGenerateTitleAi","hasGenerateTitleFn","path","localized","name","type"],"mappings":"AAAA,cAAc;AAiBd,OAAO,MAAMA,iBAAgC,CAAC,EAC5CC,gBAAgB,KAAK,EACrBC,gBAAgB,KAAK,EACrBC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXC,oBAAoBP;wBACpBQ,oBAAoBP;oBACtB;oBACAQ,MAAM;gBACR;YACF;QACF;QACAC,WAAW;QACXC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAAsC,CAAC,CAAC;IAC/C;AACF,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/Overview/OverviewComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useAllFormFields, useForm, useTranslation } from '@payloadcms/ui'\r\nimport type { FormField, UIField } from 'payload'\r\nimport React, { useCallback, useEffect, useState } from 'react'\r\n\r\nimport { defaults } from '../../defaults'\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\n\r\nconst {\r\n description: { maxLength: maxDescDefault, minLength: minDescDefault },\r\n title: { maxLength: maxTitleDefault, minLength: minTitleDefault },\r\n} = defaults\r\n\r\ntype OverviewProps = {\r\n descriptionOverrides?: {\r\n maxLength?: number\r\n minLength?: number\r\n }\r\n descriptionPath?: string\r\n imagePath?: string\r\n titleOverrides?: {\r\n maxLength?: number\r\n minLength?: number\r\n }\r\n titlePath?: string\r\n} & UIField\r\n\r\nexport const OverviewComponent: React.FC<OverviewProps> = ({\r\n descriptionOverrides,\r\n descriptionPath: descriptionPathFromContext,\r\n imagePath: imagePathFromContext,\r\n titleOverrides,\r\n titlePath: titlePathFromContext,\r\n}) => {\r\n const { getFields } = useForm()\r\n\r\n const descriptionPath = descriptionPathFromContext || 'meta.description'\r\n\r\n const titlePath = titlePathFromContext || 'meta.title'\r\n\r\n const imagePath = imagePathFromContext || 'meta.image'\r\n\r\n const [\r\n {\r\n [descriptionPath]: { value: metaDesc } = {} as FormField,\r\n [imagePath]: { value: metaImage } = {} as FormField,\r\n [titlePath]: { value: metaTitle } = {} as FormField,\r\n },\r\n ] = useAllFormFields()\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const [titleIsValid, setTitleIsValid] = useState<boolean | undefined>()\r\n\r\n const [descIsValid, setDescIsValid] = useState<boolean | undefined>()\r\n\r\n const [imageIsValid, setImageIsValid] = useState<boolean | undefined>()\r\n\r\n const minDesc = descriptionOverrides?.minLength || minDescDefault\r\n\r\n const maxDesc = descriptionOverrides?.maxLength || maxDescDefault\r\n\r\n const minTitle = titleOverrides?.minLength || minTitleDefault\r\n\r\n const maxTitle = titleOverrides?.maxLength || maxTitleDefault\r\n\r\n const resetAll = useCallback(() => {\r\n const fields = getFields()\r\n\r\n const fieldsWithoutMeta = fields\r\n\r\n fieldsWithoutMeta['meta.title'].value = ''\r\n fieldsWithoutMeta['meta.description'].value = ''\r\n fieldsWithoutMeta['meta.image'].value = ''\r\n // dispatchFields(fieldsWithoutMeta);\r\n }, [getFields])\r\n\r\n useEffect(() => {\r\n if (typeof metaTitle === 'string') {\r\n setTitleIsValid(metaTitle.length >= minTitle && metaTitle.length <= maxTitle)\r\n }\r\n if (typeof metaDesc === 'string') {\r\n setDescIsValid(metaDesc.length >= minDesc && metaDesc.length <= maxDesc)\r\n }\r\n setImageIsValid(Boolean(metaImage))\r\n }, [metaTitle, metaDesc, metaImage, maxDesc, maxTitle, minDesc, minTitle])\r\n\r\n const testResults = [titleIsValid, descIsValid, imageIsValid]\r\n\r\n const numberOfPasses = testResults.filter(Boolean).length\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div>\r\n {t('plugin-seo:checksPassing', {\r\n current: numberOfPasses,\r\n max: testResults.length,\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["useAllFormFields","useForm","useTranslation","React","useCallback","useEffect","useState","defaults","description","maxLength","maxDescDefault","minLength","minDescDefault","title","maxTitleDefault","minTitleDefault","OverviewComponent","descriptionOverrides","descriptionPath","descriptionPathFromContext","imagePath","imagePathFromContext","titleOverrides","titlePath","titlePathFromContext","getFields","value","metaDesc","metaImage","metaTitle","t","titleIsValid","setTitleIsValid","descIsValid","setDescIsValid","imageIsValid","setImageIsValid","minDesc","maxDesc","minTitle","maxTitle","resetAll","fields","fieldsWithoutMeta","length","Boolean","testResults","numberOfPasses","filter","div","style","marginBottom","current","max"],"mappings":"AAAA;;AAEA,SAASA,gBAAgB,EAAEC,OAAO,EAAEC,cAAc,QAAQ,iBAAgB;AAE1E,OAAOC,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAE/D,SAASC,QAAQ,QAAQ,iBAAgB;AAGzC,MAAM,EACJC,aAAa,EAAEC,WAAWC,cAAc,EAAEC,WAAWC,cAAc,EAAE,EACrEC,OAAO,EAAEJ,WAAWK,eAAe,EAAEH,WAAWI,eAAe,EAAE,EAClE,GAAGR;AAgBJ,OAAO,MAAMS,oBAA6C,CAAC,EACzDC,oBAAoB,EACpBC,iBAAiBC,0BAA0B,EAC3CC,WAAWC,oBAAoB,EAC/BC,cAAc,EACdC,WAAWC,oBAAoB,EAChC;IACC,MAAM,EAAEC,SAAS,EAAE,GAAGxB;IAEtB,MAAMiB,kBAAkBC,8BAA8B;IAEtD,MAAMI,YAAYC,wBAAwB;IAE1C,MAAMJ,YAAYC,wBAAwB;IAE1C,MAAM,CACJ,EACE,CAACH,gBAAgB,EAAE,EAAEQ,OAAOC,QAAQ,EAAE,GAAG,CAAC,CAAc,EACxD,CAACP,UAAU,EAAE,EAAEM,OAAOE,SAAS,EAAE,GAAG,CAAC,CAAc,EACnD,CAACL,UAAU,EAAE,EAAEG,OAAOG,SAAS,EAAE,GAAG,CAAC,CAAc,EACpD,CACF,GAAG7B;IAEJ,MAAM,EAAE8B,CAAC,EAAE,GAAG5B;IAEd,MAAM,CAAC6B,cAAcC,gBAAgB,GAAG1B;IAExC,MAAM,CAAC2B,aAAaC,eAAe,GAAG5B;IAEtC,MAAM,CAAC6B,cAAcC,gBAAgB,GAAG9B;IAExC,MAAM+B,UAAUpB,sBAAsBN,aAAaC;IAEnD,MAAM0B,UAAUrB,sBAAsBR,aAAaC;IAEnD,MAAM6B,WAAWjB,gBAAgBX,aAAaI;IAE9C,MAAMyB,WAAWlB,gBAAgBb,aAAaK;IAE9C,MAAM2B,WAAWrC,YAAY;QAC3B,MAAMsC,SAASjB;QAEf,MAAMkB,oBAAoBD;QAE1BC,iBAAiB,CAAC,aAAa,CAACjB,KAAK,GAAG;QACxCiB,iBAAiB,CAAC,mBAAmB,CAACjB,KAAK,GAAG;QAC9CiB,iBAAiB,CAAC,aAAa,CAACjB,KAAK,GAAG;IACxC,qCAAqC;IACvC,GAAG;QAACD;KAAU;IAEdpB,UAAU;QACR,IAAI,OAAOwB,cAAc,UAAU;YACjCG,gBAAgBH,UAAUe,MAAM,IAAIL,YAAYV,UAAUe,MAAM,IAAIJ;QACtE;QACA,IAAI,OAAOb,aAAa,UAAU;YAChCO,eAAeP,SAASiB,MAAM,IAAIP,WAAWV,SAASiB,MAAM,IAAIN;QAClE;QACAF,gBAAgBS,QAAQjB;IAC1B,GAAG;QAACC;QAAWF;QAAUC;QAAWU;QAASE;QAAUH;QAASE;KAAS;IAEzE,MAAMO,cAAc;QAACf;QAAcE;QAAaE;KAAa;IAE7D,MAAMY,iBAAiBD,YAAYE,MAAM,CAACH,SAASD,MAAM;IAEzD,qBACE,KAACK;QACCC,OAAO;YACLC,cAAc;QAChB;kBAEA,cAAA,KAACF;sBACEnB,EAAE,4BAA4B;gBAC7BsB,SAASL;gBACTM,KAAKP,YAAYF,MAAM;YACzB;;;AAIR,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/Overview/index.tsx"],"sourcesContent":["// @ts-nocheck\r\nimport type { UIField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n descriptionOverrides?: {\r\n maxLength?: number\r\n minLength?: number\r\n }\r\n /**\r\n * Path to the description field to use for the preview\r\n *\r\n * @default 'meta.description'\r\n */\r\n descriptionPath?: string\r\n /**\r\n * Path to the image field to use for the preview\r\n *\r\n * @default 'meta.image'\r\n */\r\n imagePath?: string\r\n overrides?: Partial<UIField>\r\n titleOverrides?: {\r\n maxLength?: number\r\n minLength?: number\r\n }\r\n /**\r\n * Path to the title field to use for the preview\r\n *\r\n * @default 'meta.title'\r\n */\r\n titlePath?: string\r\n}\r\n\r\ntype FieldFunction = ({ overrides }: FieldFunctionProps) => UIField\r\n\r\nexport const OverviewField: FieldFunction = ({\r\n descriptionOverrides,\r\n descriptionPath,\r\n imagePath,\r\n overrides,\r\n titleOverrides,\r\n titlePath,\r\n}) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n descriptionOverrides,\r\n descriptionPath,\r\n imagePath,\r\n titleOverrides,\r\n titlePath,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#OverviewComponent',\r\n },\r\n },\r\n },\r\n label: 'Overview',\r\n name: 'overview',\r\n type: 'ui',\r\n ...((overrides as unknown as UIField) ?? {}),\r\n }\r\n}\r\n"],"names":["OverviewField","descriptionOverrides","descriptionPath","imagePath","overrides","titleOverrides","titlePath","admin","components","Field","clientProps","path","label","name","type"],"mappings":"AAAA,cAAc;AAmCd,OAAO,MAAMA,gBAA+B,CAAC,EAC3CC,oBAAoB,EACpBC,eAAe,EACfC,SAAS,EACTC,SAAS,EACTC,cAAc,EACdC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXT;wBACAC;wBACAC;wBACAE;wBACAC;oBACF;oBACAK,MAAM;gBACR;YACF;QACF;QACAC,OAAO;QACPC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAAoC,CAAC,CAAC;IAC7C;AACF,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/Preview/PreviewComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport {\r\n useAllFormFields,\r\n useConfig,\r\n useDocumentInfo,\r\n useForm,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\r\nimport type { FormField, UIField } from 'payload'\r\nimport { useEffect, useState } from 'react'\r\n\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\nimport type { GenerateURL } from '../../types'\r\n\r\ntype PreviewProps = {\r\n readonly descriptionPath?: string\r\n readonly hasGenerateURLFn: boolean\r\n readonly titlePath?: string\r\n} & UIField\r\n\r\nexport const PreviewComponent: React.FC<PreviewProps> = (props) => {\r\n const {\r\n descriptionPath: descriptionPathFromContext,\r\n hasGenerateURLFn,\r\n titlePath: titlePathFromContext,\r\n } = props\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const {\r\n config: {\r\n routes: { api },\r\n serverURL,\r\n },\r\n } = useConfig()\r\n\r\n const locale = useLocale()\r\n\r\n const [fields] = useAllFormFields()\r\n\r\n const { getData } = useForm()\r\n\r\n const docInfo = useDocumentInfo()\r\n\r\n const descriptionPath = descriptionPathFromContext || 'meta.description'\r\n\r\n const titlePath = titlePathFromContext || 'meta.title'\r\n\r\n const {\r\n [descriptionPath]: { value: metaDescription } = {} as FormField,\r\n [titlePath]: { value: metaTitle } = {} as FormField,\r\n } = fields\r\n\r\n const [href, setHref] = useState<string>()\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>\r\n useEffect(() => {\r\n const endpoint = `${serverURL}${api}/plugin-seo/generate-url`\r\n\r\n const getHref = async () => {\r\n const genURLResponse = await fetch(endpoint, {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n } satisfies Omit<\r\n Parameters<GenerateURL>[0],\r\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\r\n >),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: newHref } = await genURLResponse.json()\r\n\r\n setHref(newHref)\r\n }\r\n\r\n if (hasGenerateURLFn && !href) {\r\n void getHref()\r\n }\r\n }, [fields, href, locale, docInfo, hasGenerateURLFn, getData, serverURL, api])\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div>{t('plugin-seo:preview')}</div>\r\n <div\r\n style={{\r\n color: '#9A9A9A',\r\n marginBottom: '5px',\r\n }}\r\n >\r\n {t('plugin-seo:previewDescription')}\r\n </div>\r\n <div\r\n style={{\r\n background: 'var(--theme-elevation-50)',\r\n borderRadius: '5px',\r\n boxShadow: '0px 0px 10px rgba(0, 0, 0, 0.1)',\r\n maxWidth: '600px',\r\n padding: '20px',\r\n pointerEvents: 'none',\r\n width: '100%',\r\n }}\r\n >\r\n <div>\r\n <a\r\n href={href}\r\n style={{\r\n textDecoration: 'none',\r\n }}\r\n >\r\n {href || 'https://...'}\r\n </a>\r\n </div>\r\n <h4\r\n style={{\r\n margin: 0,\r\n }}\r\n >\r\n <a\r\n href=\"/\"\r\n style={{\r\n textDecoration: 'none',\r\n }}\r\n >\r\n {metaTitle as string}\r\n </a>\r\n </h4>\r\n <p\r\n style={{\r\n margin: 0,\r\n }}\r\n >\r\n {metaDescription as string}\r\n </p>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["useAllFormFields","useConfig","useDocumentInfo","useForm","useLocale","useTranslation","reduceToSerializableFields","useEffect","useState","PreviewComponent","props","descriptionPath","descriptionPathFromContext","hasGenerateURLFn","titlePath","titlePathFromContext","t","config","routes","api","serverURL","locale","fields","getData","docInfo","value","metaDescription","metaTitle","href","setHref","endpoint","getHref","genURLResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","title","credentials","headers","method","result","newHref","json","div","style","marginBottom","color","background","borderRadius","boxShadow","maxWidth","padding","pointerEvents","width","a","textDecoration","h4","margin","p"],"mappings":"AAAA;;AAEA,SACEA,gBAAgB,EAChBC,SAAS,EACTC,eAAe,EACfC,OAAO,EACPC,SAAS,EACTC,cAAc,QACT,iBAAgB;AACvB,SAASC,0BAA0B,QAAQ,wBAAuB;AAElE,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAW3C,OAAO,MAAMC,mBAA2C,CAACC;IACvD,MAAM,EACJC,iBAAiBC,0BAA0B,EAC3CC,gBAAgB,EAChBC,WAAWC,oBAAoB,EAChC,GAAGL;IAEJ,MAAM,EAAEM,CAAC,EAAE,GAAGX;IAEd,MAAM,EACJY,QAAQ,EACNC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACF,GAAGnB;IAEJ,MAAMoB,SAASjB;IAEf,MAAM,CAACkB,OAAO,GAAGtB;IAEjB,MAAM,EAAEuB,OAAO,EAAE,GAAGpB;IAEpB,MAAMqB,UAAUtB;IAEhB,MAAMS,kBAAkBC,8BAA8B;IAEtD,MAAME,YAAYC,wBAAwB;IAE1C,MAAM,EACJ,CAACJ,gBAAgB,EAAE,EAAEc,OAAOC,eAAe,EAAE,GAAG,CAAC,CAAc,EAC/D,CAACZ,UAAU,EAAE,EAAEW,OAAOE,SAAS,EAAE,GAAG,CAAC,CAAc,EACpD,GAAGL;IAEJ,MAAM,CAACM,MAAMC,QAAQ,GAAGrB;IAExB,yEAAyE;IACzED,UAAU;QACR,MAAMuB,WAAW,GAAGV,YAAYD,IAAI,wBAAwB,CAAC;QAE7D,MAAMY,UAAU;YACd,MAAMC,iBAAiB,MAAMC,MAAMH,UAAU;gBAC3CI,MAAMC,KAAKC,SAAS,CAAC;oBACnBC,gBAAgBb,QAAQa,cAAc;oBACtCC,KAAKf;oBACLgB,gBAAgBf,QAAQe,cAAc;oBACtCC,YAAYhB,QAAQgB,UAAU;oBAC9BC,sBAAsBjB,QAAQiB,oBAAoB;oBAClDC,mBAAmBlB,QAAQkB,iBAAiB;oBAC5CC,IAAInB,QAAQmB,EAAE;oBACdC,aAAapB,QAAQoB,WAAW;oBAChCC,cAAcrB,QAAQqB,YAAY,GAC9BvC,2BAA2BkB,QAAQqB,YAAY,IAC/CC;oBACJzB,QAAQ,OAAOA,WAAW,WAAWA,QAAQ0B,OAAO1B;oBACpD2B,OAAOxB,QAAQwB,KAAK;gBACtB;gBAIAC,aAAa;gBACbC,SAAS;oBACP,gBAAgB;gBAClB;gBACAC,QAAQ;YACV;YAEA,MAAM,EAAEC,QAAQC,OAAO,EAAE,GAAG,MAAMrB,eAAesB,IAAI;YAErDzB,QAAQwB;QACV;QAEA,IAAIxC,oBAAoB,CAACe,MAAM;YAC7B,KAAKG;QACP;IACF,GAAG;QAACT;QAAQM;QAAMP;QAAQG;QAASX;QAAkBU;QAASH;QAAWD;KAAI;IAE7E,qBACE,MAACoC;QACCC,OAAO;YACLC,cAAc;QAChB;;0BAEA,KAACF;0BAAKvC,EAAE;;0BACR,KAACuC;gBACCC,OAAO;oBACLE,OAAO;oBACPD,cAAc;gBAChB;0BAECzC,EAAE;;0BAEL,MAACuC;gBACCC,OAAO;oBACLG,YAAY;oBACZC,cAAc;oBACdC,WAAW;oBACXC,UAAU;oBACVC,SAAS;oBACTC,eAAe;oBACfC,OAAO;gBACT;;kCAEA,KAACV;kCACC,cAAA,KAACW;4BACCtC,MAAMA;4BACN4B,OAAO;gCACLW,gBAAgB;4BAClB;sCAECvC,QAAQ;;;kCAGb,KAACwC;wBACCZ,OAAO;4BACLa,QAAQ;wBACV;kCAEA,cAAA,KAACH;4BACCtC,MAAK;4BACL4B,OAAO;gCACLW,gBAAgB;4BAClB;sCAECxC;;;kCAGL,KAAC2C;wBACCd,OAAO;4BACLa,QAAQ;wBACV;kCAEC3C;;;;;;AAKX,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/Preview/index.tsx"],"sourcesContent":["// @ts-nocheck\r\nimport type { UIField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n /**\r\n * Path to the description field to use for the preview\r\n *\r\n * @default 'meta.description'\r\n */\r\n descriptionPath?: string\r\n /**\r\n * Tell the component if the generate function is available as configured in the plugin config\r\n */\r\n hasGenerateFn?: boolean\r\n overrides?: Partial<UIField>\r\n /**\r\n * Path to the title field to use for the preview\r\n *\r\n * @default 'meta.title'\r\n */\r\n titlePath?: string\r\n}\r\n\r\ntype FieldFunction = ({ hasGenerateFn, overrides }: FieldFunctionProps) => UIField\r\n\r\nexport const PreviewField: FieldFunction = ({\r\n descriptionPath,\r\n hasGenerateFn = false,\r\n overrides,\r\n titlePath,\r\n}) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n descriptionPath,\r\n hasGenerateURLFn: hasGenerateFn,\r\n titlePath,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#PreviewComponent',\r\n },\r\n },\r\n },\r\n label: 'Preview',\r\n name: 'preview',\r\n type: 'ui',\r\n ...((overrides as unknown as UIField) ?? {}),\r\n }\r\n}\r\n"],"names":["PreviewField","descriptionPath","hasGenerateFn","overrides","titlePath","admin","components","Field","clientProps","hasGenerateURLFn","path","label","name","type"],"mappings":"AAAA,cAAc;AAyBd,OAAO,MAAMA,eAA8B,CAAC,EAC1CC,eAAe,EACfC,gBAAgB,KAAK,EACrBC,SAAS,EACTC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXP;wBACAQ,kBAAkBP;wBAClBE;oBACF;oBACAM,MAAM;gBACR;YACF;QACF;QACAC,OAAO;QACPC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAAoC,CAAC,CAAC;IAC7C;AACF,EAAC"}
|
package/dist/src/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.tsx"],"sourcesContent":["import type { CollectionSlug, Config, Field, GlobalSlug, GroupField, TabsField } from 'payload'\r\nimport { deepMergeSimple } from 'payload/shared'\r\n\r\nimport { MetaDescriptionField } from './fields/MetaDescription'\r\nimport { MetaImageField } from './fields/MetaImage'\r\nimport { MetaTitleField } from './fields/MetaTitle'\r\nimport { OverviewField } from './fields/Overview'\r\nimport { PreviewField } from './fields/Preview'\r\nimport { openaiMessage } from './openai/message'\r\nimport { translations } from './translations'\r\nimport type {\r\n GenerateDescription,\r\n GenerateImage,\r\n GenerateTitle,\r\n GenerateURL,\r\n SEOPluginConfig,\r\n} from './types'\r\n\r\nexport const seoPlugin =\r\n (pluginConfig: SEOPluginConfig) =>\r\n (config: Config): Config => {\r\n const defaultFields: Field[] = [\r\n OverviewField({}),\r\n MetaTitleField({\r\n hasGenerateAi: typeof pluginConfig?.generateTitleAi === 'function',\r\n hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',\r\n }),\r\n MetaDescriptionField({\r\n hasGenerateAi: typeof pluginConfig?.generateDescriptionAi === 'function',\r\n hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',\r\n }),\r\n ...(pluginConfig?.uploadsCollection\r\n ? [\r\n MetaImageField({\r\n hasGenerateFn: typeof pluginConfig?.generateImage === 'function',\r\n relationTo: pluginConfig.uploadsCollection,\r\n }),\r\n ]\r\n : []),\r\n PreviewField({\r\n hasGenerateFn: typeof pluginConfig?.generateURL === 'function',\r\n }),\r\n ]\r\n\r\n const seoFields: GroupField[] = [\r\n {\r\n fields: [\r\n ...(pluginConfig?.fields && typeof pluginConfig.fields === 'function'\r\n ? pluginConfig.fields({ defaultFields })\r\n : defaultFields),\r\n ],\r\n interfaceName: pluginConfig.interfaceName,\r\n label: 'SEO',\r\n name: 'meta',\r\n type: 'group',\r\n },\r\n ]\r\n\r\n return {\r\n ...config,\r\n collections:\r\n config.collections?.map((collection) => {\r\n const { slug } = collection\r\n\r\n const isEnabled = pluginConfig?.collections?.includes(slug as CollectionSlug)\r\n\r\n if (isEnabled) {\r\n if (pluginConfig?.tabbedUI) {\r\n // prevent issues with auth enabled collections having an email field that shouldn't be moved to the SEO tab\r\n const emailField =\r\n (collection.auth ||\r\n !(\r\n typeof collection.auth === 'object' &&\r\n (collection.auth as any).disableLocalStrategy\r\n )) &&\r\n collection.fields?.find((field) => 'name' in field && field.name === 'email')\r\n\r\n const hasOnlyEmailField = collection.fields?.length === 1 && emailField\r\n\r\n const seoTabs: TabsField[] = hasOnlyEmailField\r\n ? [\r\n {\r\n tabs: [\r\n {\r\n fields: seoFields,\r\n label: 'SEO',\r\n },\r\n ],\r\n type: 'tabs',\r\n },\r\n ]\r\n : [\r\n {\r\n tabs: [\r\n // append a new tab onto the end of the tabs array, if there is one at the first index\r\n // if needed, create a new `Content` tab in the first index for this collection's base fields\r\n ...(collection?.fields?.[0]?.type === 'tabs' &&\r\n collection?.fields?.[0]?.tabs\r\n ? collection.fields[0].tabs\r\n : [\r\n {\r\n fields: [\r\n ...(emailField\r\n ? collection.fields.filter(\r\n (field) => 'name' in field && field.name !== 'email',\r\n )\r\n : collection.fields),\r\n ],\r\n label: collection?.labels?.singular || 'Content',\r\n },\r\n ]),\r\n {\r\n fields: seoFields,\r\n label: 'SEO',\r\n },\r\n ],\r\n type: 'tabs',\r\n },\r\n ]\r\n\r\n return {\r\n ...collection,\r\n fields: [\r\n ...(emailField ? [emailField] : []),\r\n ...seoTabs,\r\n ...(collection?.fields?.[0]?.type === 'tabs' ? collection.fields.slice(1) : []),\r\n ],\r\n }\r\n }\r\n\r\n return {\r\n ...collection,\r\n fields: [...(collection?.fields || []), ...seoFields],\r\n }\r\n }\r\n\r\n return collection\r\n }) || [],\r\n endpoints: [\r\n ...(config.endpoints ?? []),\r\n {\r\n handler: async (req) => {\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const result = pluginConfig.generateTitle\r\n ? await pluginConfig.generateTitle({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n } satisfies Parameters<GenerateTitle>[0])\r\n : ''\r\n\r\n return new Response(JSON.stringify({ result }), { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-title',\r\n },\r\n {\r\n handler: async (req) => {\r\n if (!pluginConfig.openaiApiKey)\r\n return new Response(JSON.stringify({ message: 'Something went wrong' }), {\r\n status: 500,\r\n })\r\n\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const content = pluginConfig.generateTitleAi\r\n ? await pluginConfig.generateTitleAi({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n })\r\n : ''\r\n\r\n console.log('[handler \"/plugin-seo/generate-title-ai\"]', { content })\r\n\r\n const aiResult = await openaiMessage({\r\n apiKey: pluginConfig.openaiApiKey,\r\n content,\r\n req,\r\n })\r\n\r\n console.log('[handler \"/plugin-seo/generate-title-ai\"]', { aiResult })\r\n\r\n return Response.json({ result: aiResult }, { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-title-ai',\r\n },\r\n {\r\n handler: async (req) => {\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const result = pluginConfig.generateDescription\r\n ? await pluginConfig.generateDescription({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n } satisfies Parameters<GenerateDescription>[0])\r\n : ''\r\n\r\n return new Response(JSON.stringify({ result }), { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-description',\r\n },\r\n {\r\n handler: async (req) => {\r\n if (!pluginConfig.openaiApiKey)\r\n return new Response(JSON.stringify({ message: 'Something went wrong' }), {\r\n status: 500,\r\n })\r\n\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n const content = pluginConfig.generateDescriptionAi\r\n ? await pluginConfig.generateDescriptionAi({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n })\r\n : ''\r\n\r\n const aiResult = await openaiMessage({\r\n apiKey: pluginConfig.openaiApiKey,\r\n content,\r\n req,\r\n })\r\n\r\n return Response.json({ result: aiResult }, { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-description-ai',\r\n },\r\n {\r\n handler: async (req) => {\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const result = pluginConfig.generateURL\r\n ? await pluginConfig.generateURL({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n } satisfies Parameters<GenerateURL>[0])\r\n : ''\r\n\r\n return new Response(JSON.stringify({ result }), { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-url',\r\n },\r\n {\r\n handler: async (req) => {\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const result = pluginConfig.generateImage\r\n ? await pluginConfig.generateImage({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : null,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : null,\r\n req,\r\n } as Parameters<GenerateImage>[0])\r\n : ''\r\n\r\n return new Response(result, { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-image',\r\n },\r\n ],\r\n globals:\r\n config.globals?.map((global) => {\r\n const { slug } = global\r\n\r\n const isEnabled = pluginConfig?.globals?.includes(slug as GlobalSlug)\r\n\r\n if (isEnabled) {\r\n if (pluginConfig?.tabbedUI) {\r\n const seoTabs: TabsField[] = [\r\n {\r\n tabs: [\r\n // append a new tab onto the end of the tabs array, if there is one at the first index\r\n // if needed, create a new `Content` tab in the first index for this global's base fields\r\n ...(global?.fields?.[0].type === 'tabs' && global?.fields?.[0].tabs\r\n ? global.fields[0].tabs\r\n : [\r\n {\r\n fields: [...(global?.fields || [])],\r\n label: global?.label || 'Content',\r\n },\r\n ]),\r\n {\r\n fields: seoFields,\r\n label: 'SEO',\r\n },\r\n ],\r\n type: 'tabs',\r\n },\r\n ]\r\n\r\n return {\r\n ...global,\r\n fields: [\r\n ...seoTabs,\r\n ...(global?.fields?.[0].type === 'tabs' ? global.fields.slice(1) : []),\r\n ],\r\n }\r\n }\r\n\r\n return {\r\n ...global,\r\n fields: [...(global?.fields || []), ...seoFields],\r\n }\r\n }\r\n\r\n return global\r\n }) || [],\r\n i18n: {\r\n ...config.i18n,\r\n translations: config.i18n?.translations\r\n ? deepMergeSimple(translations, config.i18n.translations)\r\n : translations,\r\n },\r\n }\r\n }\r\n"],"names":["deepMergeSimple","MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField","openaiMessage","translations","seoPlugin","pluginConfig","config","defaultFields","hasGenerateAi","generateTitleAi","hasGenerateFn","generateTitle","generateDescriptionAi","generateDescription","uploadsCollection","generateImage","relationTo","generateURL","seoFields","fields","interfaceName","label","name","type","collections","map","collection","slug","isEnabled","includes","tabbedUI","emailField","auth","disableLocalStrategy","find","field","hasOnlyEmailField","length","seoTabs","tabs","filter","labels","singular","slice","endpoints","handler","req","data","json","result","collectionConfig","collectionSlug","c","undefined","globalConfig","globalSlug","globals","g","Response","JSON","stringify","status","method","path","openaiApiKey","message","content","console","log","aiResult","apiKey","global","i18n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/openai/message.ts"],"sourcesContent":["import OpenAI from 'openai'\r\nimport type { PayloadRequest } from 'payload'\r\n\r\nlet openai: OpenAI\r\n\r\nconst isInited = false\r\n\r\nexport const openaiMessage = async ({\r\n apiKey,\r\n content,\r\n req,\r\n}: {\r\n apiKey: string\r\n content: string\r\n req: PayloadRequest\r\n}) => {\r\n try {\r\n if (!isInited) {\r\n const configuration = {\r\n apiKey,\r\n }\r\n\r\n openai = new OpenAI(configuration)\r\n }\r\n\r\n const {\r\n choices: [{ message }],\r\n } = await openai.chat.completions.create({\r\n messages: [\r\n {\r\n content,\r\n role: 'user',\r\n },\r\n ],\r\n model: 'gpt-3.5-turbo',\r\n })\r\n\r\n return message.content\r\n } catch (error) {\r\n if (error instanceof Error) req.payload.logger.error(error.message)\r\n\r\n return ''\r\n }\r\n}\r\n"],"names":["OpenAI","openai","isInited","openaiMessage","apiKey","content","req","configuration","choices","message","chat","completions","create","messages","role","model","error","Error","payload","logger"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAG3B,IAAIC;AAEJ,MAAMC,WAAW;AAEjB,OAAO,MAAMC,gBAAgB,OAAO,EAClCC,MAAM,EACNC,OAAO,EACPC,GAAG,EAKJ;IACC,IAAI;QACF,IAAI,CAACJ,UAAU;YACb,MAAMK,gBAAgB;gBACpBH;YACF;YAEAH,SAAS,IAAID,OAAOO;QACtB;QAEA,MAAM,EACJC,SAAS,CAAC,EAAEC,OAAO,EAAE,CAAC,EACvB,GAAG,MAAMR,OAAOS,IAAI,CAACC,WAAW,CAACC,MAAM,CAAC;YACvCC,UAAU;gBACR;oBACER;oBACAS,MAAM;gBACR;aACD;YACDC,OAAO;QACT;QAEA,OAAON,QAAQJ,OAAO;IACxB,EAAE,OAAOW,OAAO;QACd,IAAIA,iBAAiBC,OAAOX,IAAIY,OAAO,CAACC,MAAM,CAACH,KAAK,CAACA,MAAMP,OAAO;QAElE,OAAO;IACT;AACF,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/translations/cs.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const cs: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Skoro hotovo',\r\n autoGenerate: 'Generovat automaticky',\r\n bestPractices: 'osvědčené postupy',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} znaků, ',\r\n charactersLeftOver: '{{characters}} zbývá',\r\n charactersToGo: '{{characters}} zbývá',\r\n charactersTooMany: '{{characters}} navíc',\r\n checksPassing: '{{current}}/{{max}} kontrol úspěšně splněno',\r\n generateAi: 'Generovat AI',\r\n good: 'Dobré',\r\n imageAutoGenerationTip: 'Automatická generace načte vybraný hero obrázek.',\r\n lengthTipDescription:\r\n 'Toto by mělo mít mezi {{minLength}} a {{maxLength}} znaky. Pomoc při psaní kvalitních meta popisů navštivte ',\r\n lengthTipTitle:\r\n 'Toto by mělo mít mezi {{minLength}} a {{maxLength}} znaky. Pomoc při psaní kvalitních meta titulů navštivte ',\r\n missing: 'Chybí',\r\n noImage: 'Bez obrázku',\r\n preview: 'Náhled',\r\n previewDescription:\r\n 'Přesný výsledek se může lišit v závislosti na obsahu a relevanci vyhledávání.',\r\n tooLong: 'Příliš dlouhé',\r\n tooShort: 'Příliš krátké',\r\n },\r\n}\r\n"],"names":["cs","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/translations/de.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const de: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Fast da',\r\n autoGenerate: 'Automatisch generieren',\r\n bestPractices: 'Best Practices',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} Zeichen, ',\r\n charactersLeftOver: '{{characters}} verbleiben',\r\n charactersToGo: '{{characters}} übrig',\r\n charactersTooMany: '{{characters}} zu viel',\r\n checksPassing: '{{current}}/{{max}} Kontrollen erfolgreich',\r\n generateAi: 'AI generieren',\r\n good: 'Gut',\r\n imageAutoGenerationTip: 'Die automatische Generierung ruft das ausgewählte Hauptbild ab.',\r\n lengthTipDescription:\r\n 'Diese sollte zwischen {{minLength}} und {{maxLength}} Zeichen lang sein. Für Hilfe beim Schreiben von qualitativ hochwertigen Meta-Beschreibungen siehe ',\r\n lengthTipTitle:\r\n 'Dieser sollte zwischen {{minLength}} und {{maxLength}} Zeichen lang sein. Für Hilfe beim Schreiben von qualitativ hochwertigen Meta-Titeln siehe ',\r\n missing: 'Fehlt',\r\n noImage: 'Kein Bild',\r\n preview: 'Vorschau',\r\n previewDescription:\r\n 'Die genauen Ergebnislisten können je nach Inhalt und Suchrelevanz variieren.',\r\n tooLong: 'Zu lang',\r\n tooShort: 'Zu kurz',\r\n },\r\n}\r\n"],"names":["de","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/translations/en.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const en: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Almost there',\r\n autoGenerate: 'Auto-generate',\r\n bestPractices: 'best practices',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} chars, ',\r\n charactersLeftOver: '{{characters}} left over',\r\n charactersToGo: '{{characters}} to go',\r\n charactersTooMany: '{{characters}} too many',\r\n checksPassing: '{{current}}/{{max}} checks are passing',\r\n generateAi: 'AI-generate',\r\n good: 'Good',\r\n imageAutoGenerationTip: 'Auto-generation will retrieve the selected hero image.',\r\n lengthTipDescription:\r\n 'This should be between {{minLength}} and {{maxLength}} characters. For help in writing quality meta descriptions, see ',\r\n lengthTipKeywords: 'This should be between {{minLength}} and {{maxLength}} words',\r\n lengthTipTitle:\r\n 'This should be between {{minLength}} and {{maxLength}} characters. For help in writing quality meta titles, see ',\r\n missing: 'Missing',\r\n noImage: 'No image',\r\n preview: 'Preview',\r\n previewDescription: 'Exact result listings may vary based on content and search relevancy.',\r\n tooLong: 'Too long',\r\n tooShort: 'Too short',\r\n },\r\n}\r\n"],"names":["en","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipKeywords","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,mBAAmB;QACnBC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|