@justanarthur/payload-plugin-seo 1.3.9 → 1.3.10
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 -1
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/fields-components.js.map +1 -1
- package/dist/exports/fields.js.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/fields/MetaDescription/MetaDescriptionComponent.js.map +1 -1
- package/dist/fields/MetaDescription/index.js.map +1 -1
- package/dist/fields/MetaImage/MetaImageComponent.js.map +1 -1
- package/dist/fields/MetaImage/index.js.map +1 -1
- package/dist/fields/MetaTitle/MetaTitleComponent.js.map +1 -1
- package/dist/fields/MetaTitle/index.js.map +1 -1
- package/dist/fields/Overview/OverviewComponent.js.map +1 -1
- package/dist/fields/Overview/index.js.map +1 -1
- package/dist/fields/Preview/PreviewComponent.d.ts.map +1 -1
- package/dist/fields/Preview/PreviewComponent.js +1 -13
- package/dist/fields/Preview/PreviewComponent.js.map +1 -1
- package/dist/fields/Preview/index.js.map +1 -1
- package/dist/fields/index.scss +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -44
- package/dist/index.js.map +1 -1
- package/dist/openai/message.js.map +1 -1
- package/dist/translations/cs.js.map +1 -1
- package/dist/translations/de.js.map +1 -1
- package/dist/translations/en.js.map +1 -1
- package/dist/translations/es.js.map +1 -1
- package/dist/translations/fa.js.map +1 -1
- package/dist/translations/fr.js.map +1 -1
- package/dist/translations/index.js.map +1 -1
- package/dist/translations/it.js.map +1 -1
- package/dist/translations/nb.js.map +1 -1
- package/dist/translations/pl.js.map +1 -1
- package/dist/translations/ru.js.map +1 -1
- package/dist/translations/sv.js.map +1 -1
- package/dist/translations/tr.js.map +1 -1
- package/dist/translations/translation-schema.json +96 -96
- package/dist/translations/uk.js.map +1 -1
- package/dist/translations/vi.js.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ui/LengthIndicator.js.map +1 -1
- package/dist/ui/Pill.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -50,45 +50,70 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
50
50
|
// prevent issues with auth enabled collections having an email field that shouldn't be moved to the SEO tab
|
|
51
51
|
const emailField = (collection.auth || !(typeof collection.auth === 'object' && collection.auth.disableLocalStrategy)) && collection.fields?.find((field)=>'name' in field && field.name === 'email');
|
|
52
52
|
const hasOnlyEmailField = collection.fields?.length === 1 && emailField;
|
|
53
|
-
|
|
54
|
-
{
|
|
55
|
-
|
|
53
|
+
if (hasOnlyEmailField) {
|
|
54
|
+
return {
|
|
55
|
+
...collection,
|
|
56
|
+
fields: [
|
|
57
|
+
...emailField ? [
|
|
58
|
+
emailField
|
|
59
|
+
] : [],
|
|
56
60
|
{
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
tabs: [
|
|
62
|
+
{
|
|
63
|
+
fields: seoFields,
|
|
64
|
+
label: 'SEO'
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
type: 'tabs'
|
|
59
68
|
}
|
|
60
|
-
]
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
69
|
+
]
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Find an existing tabs field anywhere in the fields array
|
|
73
|
+
const existingTabsIndex = collection.fields?.findIndex((field)=>field.type === 'tabs');
|
|
74
|
+
const existingTabsField = existingTabsIndex !== -1 ? collection.fields[existingTabsIndex] : null;
|
|
75
|
+
if (existingTabsField && existingTabsField.type === 'tabs') {
|
|
76
|
+
// Inject SEO tab into the existing tabs field
|
|
77
|
+
const updatedTabsField = {
|
|
78
|
+
...existingTabsField,
|
|
65
79
|
tabs: [
|
|
66
|
-
|
|
67
|
-
// if needed, create a new `Content` tab in the first index for this collection's base fields
|
|
68
|
-
...collection?.fields?.[0]?.type === 'tabs' && collection?.fields?.[0]?.tabs ? collection.fields[0].tabs : [
|
|
69
|
-
{
|
|
70
|
-
fields: [
|
|
71
|
-
...emailField ? collection.fields.filter((field)=>'name' in field && field.name !== 'email') : collection.fields
|
|
72
|
-
],
|
|
73
|
-
label: collection?.labels?.singular || 'Content'
|
|
74
|
-
}
|
|
75
|
-
],
|
|
80
|
+
...existingTabsField.tabs,
|
|
76
81
|
{
|
|
77
82
|
fields: seoFields,
|
|
78
83
|
label: 'SEO'
|
|
79
84
|
}
|
|
80
|
-
]
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
85
|
+
]
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
...collection,
|
|
89
|
+
fields: [
|
|
90
|
+
...collection.fields.slice(0, existingTabsIndex),
|
|
91
|
+
updatedTabsField,
|
|
92
|
+
...collection.fields.slice(existingTabsIndex + 1)
|
|
93
|
+
]
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// No existing tabs field — wrap all fields in a Content tab and add SEO tab
|
|
97
|
+
const nonEmailFields = emailField ? collection.fields.filter((field)=>'name' in field && field.name !== 'email') : collection.fields;
|
|
84
98
|
return {
|
|
85
99
|
...collection,
|
|
86
100
|
fields: [
|
|
87
101
|
...emailField ? [
|
|
88
102
|
emailField
|
|
89
103
|
] : [],
|
|
90
|
-
|
|
91
|
-
|
|
104
|
+
{
|
|
105
|
+
tabs: [
|
|
106
|
+
{
|
|
107
|
+
fields: nonEmailFields,
|
|
108
|
+
label: collection?.labels?.singular || 'Content'
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
fields: seoFields,
|
|
112
|
+
label: 'SEO'
|
|
113
|
+
}
|
|
114
|
+
],
|
|
115
|
+
type: 'tabs'
|
|
116
|
+
}
|
|
92
117
|
]
|
|
93
118
|
};
|
|
94
119
|
}
|
|
@@ -260,32 +285,49 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
260
285
|
const isEnabled = pluginConfig?.globals?.includes(slug);
|
|
261
286
|
if (isEnabled) {
|
|
262
287
|
if (pluginConfig?.tabbedUI) {
|
|
263
|
-
|
|
264
|
-
|
|
288
|
+
// Find an existing tabs field anywhere in the globals fields array
|
|
289
|
+
const existingTabsIndex = global.fields?.findIndex((field)=>field.type === 'tabs');
|
|
290
|
+
const existingTabsField = existingTabsIndex !== -1 ? global.fields[existingTabsIndex] : null;
|
|
291
|
+
if (existingTabsField && existingTabsField.type === 'tabs') {
|
|
292
|
+
// Inject SEO tab into the existing tabs field
|
|
293
|
+
const updatedTabsField = {
|
|
294
|
+
...existingTabsField,
|
|
265
295
|
tabs: [
|
|
266
|
-
|
|
267
|
-
// if needed, create a new `Content` tab in the first index for this global's base fields
|
|
268
|
-
...global?.fields?.[0].type === 'tabs' && global?.fields?.[0].tabs ? global.fields[0].tabs : [
|
|
269
|
-
{
|
|
270
|
-
fields: [
|
|
271
|
-
...global?.fields || []
|
|
272
|
-
],
|
|
273
|
-
label: global?.label || 'Content'
|
|
274
|
-
}
|
|
275
|
-
],
|
|
296
|
+
...existingTabsField.tabs,
|
|
276
297
|
{
|
|
277
298
|
fields: seoFields,
|
|
278
299
|
label: 'SEO'
|
|
279
300
|
}
|
|
280
|
-
]
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
301
|
+
]
|
|
302
|
+
};
|
|
303
|
+
return {
|
|
304
|
+
...global,
|
|
305
|
+
fields: [
|
|
306
|
+
...global.fields.slice(0, existingTabsIndex),
|
|
307
|
+
updatedTabsField,
|
|
308
|
+
...global.fields.slice(existingTabsIndex + 1)
|
|
309
|
+
]
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
// No existing tabs field — wrap all fields in a Content tab and add SEO tab
|
|
284
313
|
return {
|
|
285
314
|
...global,
|
|
286
315
|
fields: [
|
|
287
|
-
|
|
288
|
-
|
|
316
|
+
{
|
|
317
|
+
tabs: [
|
|
318
|
+
{
|
|
319
|
+
fields: [
|
|
320
|
+
...global?.fields || []
|
|
321
|
+
],
|
|
322
|
+
label: global?.label || 'Content'
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
fields: seoFields,
|
|
326
|
+
label: 'SEO'
|
|
327
|
+
}
|
|
328
|
+
],
|
|
329
|
+
type: 'tabs'
|
|
330
|
+
}
|
|
289
331
|
]
|
|
290
332
|
};
|
|
291
333
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"sources":["../src/index.tsx"],"sourcesContent":["import type { CollectionSlug, Config, Field, GlobalSlug, GroupField, TabsField } from 'payload'\nimport { deepMergeSimple } from 'payload/shared'\n\nimport { MetaDescriptionField } from './fields/MetaDescription'\nimport { MetaImageField } from './fields/MetaImage'\nimport { MetaTitleField } from './fields/MetaTitle'\nimport { OverviewField } from './fields/Overview'\nimport { PreviewField } from './fields/Preview'\nimport { openaiMessage } from './openai/message'\nimport { translations } from './translations'\nimport type {\n GenerateDescription,\n GenerateImage,\n GenerateTitle,\n GenerateURL,\n SEOPluginConfig,\n} from './types'\n\nexport const seoPlugin =\n (pluginConfig: SEOPluginConfig) =>\n (config: Config): Config => {\n const defaultFields: Field[] = [\n OverviewField({}),\n MetaTitleField({\n hasGenerateAi: typeof pluginConfig?.generateTitleAi === 'function',\n hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',\n }),\n MetaDescriptionField({\n hasGenerateAi: typeof pluginConfig?.generateDescriptionAi === 'function',\n hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',\n }),\n ...(pluginConfig?.uploadsCollection\n ? [\n MetaImageField({\n hasGenerateFn: typeof pluginConfig?.generateImage === 'function',\n relationTo: pluginConfig.uploadsCollection,\n }),\n ]\n : []),\n PreviewField({\n hasGenerateFn: typeof pluginConfig?.generateURL === 'function',\n }),\n ]\n\n const seoFields: GroupField[] = [\n {\n fields: [\n ...(pluginConfig?.fields && typeof pluginConfig.fields === 'function'\n ? pluginConfig.fields({ defaultFields })\n : defaultFields),\n ],\n interfaceName: pluginConfig.interfaceName,\n label: 'SEO',\n name: 'meta',\n type: 'group',\n },\n ]\n\n return {\n ...config,\n collections:\n config.collections?.map((collection) => {\n const { slug } = collection\n\n const isEnabled = pluginConfig?.collections?.includes(slug as CollectionSlug)\n\n if (isEnabled) {\n if (pluginConfig?.tabbedUI) {\n // prevent issues with auth enabled collections having an email field that shouldn't be moved to the SEO tab\n const emailField =\n (collection.auth ||\n !(\n typeof collection.auth === 'object' &&\n (collection.auth as any).disableLocalStrategy\n )) &&\n collection.fields?.find((field) => 'name' in field && field.name === 'email')\n\n const hasOnlyEmailField = collection.fields?.length === 1 && emailField\n\n if (hasOnlyEmailField) {\n return {\n ...collection,\n fields: [\n ...(emailField ? [emailField] : []),\n {\n tabs: [{ fields: seoFields, label: 'SEO' }],\n type: 'tabs',\n } as TabsField,\n ],\n }\n }\n\n // Find an existing tabs field anywhere in the fields array\n const existingTabsIndex = collection.fields?.findIndex(\n (field) => field.type === 'tabs',\n )\n const existingTabsField =\n existingTabsIndex !== -1 ? collection.fields[existingTabsIndex] : null\n\n if (existingTabsField && existingTabsField.type === 'tabs') {\n // Inject SEO tab into the existing tabs field\n const updatedTabsField: TabsField = {\n ...existingTabsField,\n tabs: [...existingTabsField.tabs, { fields: seoFields, label: 'SEO' }],\n }\n return {\n ...collection,\n fields: [\n ...collection.fields.slice(0, existingTabsIndex),\n updatedTabsField,\n ...collection.fields.slice(existingTabsIndex + 1),\n ],\n }\n }\n\n // No existing tabs field — wrap all fields in a Content tab and add SEO tab\n const nonEmailFields = emailField\n ? collection.fields.filter((field) => 'name' in field && field.name !== 'email')\n : collection.fields\n\n return {\n ...collection,\n fields: [\n ...(emailField ? [emailField] : []),\n {\n tabs: [\n {\n fields: nonEmailFields,\n label: collection?.labels?.singular || 'Content',\n },\n { fields: seoFields, label: 'SEO' },\n ],\n type: 'tabs',\n } as TabsField,\n ],\n }\n }\n\n return {\n ...collection,\n fields: [...(collection?.fields || []), ...seoFields],\n }\n }\n\n return collection\n }) || [],\n endpoints: [\n ...(config.endpoints ?? []),\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n\n const result = pluginConfig.generateTitle\n ? await pluginConfig.generateTitle({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateTitle>[0])\n : ''\n\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-title',\n },\n {\n handler: async (req) => {\n if (!pluginConfig.openaiApiKey)\n return new Response(JSON.stringify({ message: 'Something went wrong' }), {\n status: 500,\n })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n\n const content = pluginConfig.generateTitleAi\n ? await pluginConfig.generateTitleAi({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n })\n : ''\n\n console.log('[handler \"/plugin-seo/generate-title-ai\"]', { content })\n\n const aiResult = await openaiMessage({\n apiKey: pluginConfig.openaiApiKey,\n content,\n req,\n })\n\n console.log('[handler \"/plugin-seo/generate-title-ai\"]', { aiResult })\n\n return Response.json({ result: aiResult }, { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-title-ai',\n },\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateDescription>[0])\n : ''\n\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-description',\n },\n {\n handler: async (req) => {\n if (!pluginConfig.openaiApiKey)\n return new Response(JSON.stringify({ message: 'Something went wrong' }), {\n status: 500,\n })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n const content = pluginConfig.generateDescriptionAi\n ? await pluginConfig.generateDescriptionAi({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n })\n : ''\n\n const aiResult = await openaiMessage({\n apiKey: pluginConfig.openaiApiKey,\n content,\n req,\n })\n\n return Response.json({ result: aiResult }, { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-description-ai',\n },\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n\n const result = pluginConfig.generateURL\n ? await pluginConfig.generateURL({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateURL>[0])\n : ''\n\n return new Response(JSON.stringify({ result }), { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-url',\n },\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n\n const result = pluginConfig.generateImage\n ? await pluginConfig.generateImage({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : null,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : null,\n req,\n } as Parameters<GenerateImage>[0])\n : ''\n\n return new Response(result, { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-image',\n },\n ],\n globals:\n config.globals?.map((global) => {\n const { slug } = global\n\n const isEnabled = pluginConfig?.globals?.includes(slug as GlobalSlug)\n\n if (isEnabled) {\n if (pluginConfig?.tabbedUI) {\n // Find an existing tabs field anywhere in the globals fields array\n const existingTabsIndex = global.fields?.findIndex((field) => field.type === 'tabs')\n const existingTabsField =\n existingTabsIndex !== -1 ? global.fields[existingTabsIndex] : null\n\n if (existingTabsField && existingTabsField.type === 'tabs') {\n // Inject SEO tab into the existing tabs field\n const updatedTabsField: TabsField = {\n ...existingTabsField,\n tabs: [...existingTabsField.tabs, { fields: seoFields, label: 'SEO' }],\n }\n return {\n ...global,\n fields: [\n ...global.fields.slice(0, existingTabsIndex),\n updatedTabsField,\n ...global.fields.slice(existingTabsIndex + 1),\n ],\n }\n }\n\n // No existing tabs field — wrap all fields in a Content tab and add SEO tab\n return {\n ...global,\n fields: [\n {\n tabs: [\n {\n fields: [...(global?.fields || [])],\n label: global?.label || 'Content',\n },\n { fields: seoFields, label: 'SEO' },\n ],\n type: 'tabs',\n } as TabsField,\n ],\n }\n }\n\n return {\n ...global,\n fields: [...(global?.fields || []), ...seoFields],\n }\n }\n\n return global\n }) || [],\n i18n: {\n ...config.i18n,\n translations: config.i18n?.translations\n ? deepMergeSimple(translations, config.i18n.translations)\n : translations,\n },\n }\n }\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","tabs","existingTabsIndex","findIndex","existingTabsField","updatedTabsField","slice","nonEmailFields","filter","labels","singular","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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/openai/message.ts"],"sourcesContent":["import OpenAI from 'openai'\
|
|
1
|
+
{"version":3,"sources":["../../src/openai/message.ts"],"sourcesContent":["import OpenAI from 'openai'\nimport type { PayloadRequest } from 'payload'\n\nlet openai: OpenAI\n\nconst isInited = false\n\nexport const openaiMessage = async ({\n apiKey,\n content,\n req,\n}: {\n apiKey: string\n content: string\n req: PayloadRequest\n}) => {\n try {\n if (!isInited) {\n const configuration = {\n apiKey,\n }\n\n openai = new OpenAI(configuration)\n }\n\n const {\n choices: [{ message }],\n } = await openai.chat.completions.create({\n messages: [\n {\n content,\n role: 'user',\n },\n ],\n model: 'gpt-3.5-turbo',\n })\n\n return message.content\n } catch (error) {\n if (error instanceof Error) req.payload.logger.error(error.message)\n\n return ''\n }\n}\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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/cs.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/cs.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const cs: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Skoro hotovo',\n autoGenerate: 'Generovat automaticky',\n bestPractices: 'osvědčené postupy',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} znaků, ',\n charactersLeftOver: '{{characters}} zbývá',\n charactersToGo: '{{characters}} zbývá',\n charactersTooMany: '{{characters}} navíc',\n checksPassing: '{{current}}/{{max}} kontrol úspěšně splněno',\n generateAi: 'Generovat AI',\n good: 'Dobré',\n imageAutoGenerationTip: 'Automatická generace načte vybraný hero obrázek.',\n lengthTipDescription:\n 'Toto by mělo mít mezi {{minLength}} a {{maxLength}} znaky. Pomoc při psaní kvalitních meta popisů navštivte ',\n lengthTipTitle:\n 'Toto by mělo mít mezi {{minLength}} a {{maxLength}} znaky. Pomoc při psaní kvalitních meta titulů navštivte ',\n missing: 'Chybí',\n noImage: 'Bez obrázku',\n preview: 'Náhled',\n previewDescription:\n 'Přesný výsledek se může lišit v závislosti na obsahu a relevanci vyhledávání.',\n tooLong: 'Příliš dlouhé',\n tooShort: 'Příliš krátké',\n },\n}\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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/de.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/de.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const de: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Fast da',\n autoGenerate: 'Automatisch generieren',\n bestPractices: 'Best Practices',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} Zeichen, ',\n charactersLeftOver: '{{characters}} verbleiben',\n charactersToGo: '{{characters}} übrig',\n charactersTooMany: '{{characters}} zu viel',\n checksPassing: '{{current}}/{{max}} Kontrollen erfolgreich',\n generateAi: 'AI generieren',\n good: 'Gut',\n imageAutoGenerationTip: 'Die automatische Generierung ruft das ausgewählte Hauptbild ab.',\n lengthTipDescription:\n 'Diese sollte zwischen {{minLength}} und {{maxLength}} Zeichen lang sein. Für Hilfe beim Schreiben von qualitativ hochwertigen Meta-Beschreibungen siehe ',\n lengthTipTitle:\n 'Dieser sollte zwischen {{minLength}} und {{maxLength}} Zeichen lang sein. Für Hilfe beim Schreiben von qualitativ hochwertigen Meta-Titeln siehe ',\n missing: 'Fehlt',\n noImage: 'Kein Bild',\n preview: 'Vorschau',\n previewDescription:\n 'Die genauen Ergebnislisten können je nach Inhalt und Suchrelevanz variieren.',\n tooLong: 'Zu lang',\n tooShort: 'Zu kurz',\n },\n}\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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/en.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/en.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const en: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Almost there',\n autoGenerate: 'Auto-generate',\n bestPractices: 'best practices',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} chars, ',\n charactersLeftOver: '{{characters}} left over',\n charactersToGo: '{{characters}} to go',\n charactersTooMany: '{{characters}} too many',\n checksPassing: '{{current}}/{{max}} checks are passing',\n generateAi: 'AI-generate',\n good: 'Good',\n imageAutoGenerationTip: 'Auto-generation will retrieve the selected hero image.',\n lengthTipDescription:\n 'This should be between {{minLength}} and {{maxLength}} characters. For help in writing quality meta descriptions, see ',\n lengthTipKeywords: 'This should be between {{minLength}} and {{maxLength}} words',\n lengthTipTitle:\n 'This should be between {{minLength}} and {{maxLength}} characters. For help in writing quality meta titles, see ',\n missing: 'Missing',\n noImage: 'No image',\n preview: 'Preview',\n previewDescription: 'Exact result listings may vary based on content and search relevancy.',\n tooLong: 'Too long',\n tooShort: 'Too short',\n },\n}\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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/es.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/es.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const es: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Ya casi está',\n autoGenerate: 'Autogénerar',\n bestPractices: 'mejores prácticas',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} letras, ',\n charactersLeftOver: '{{characters}} letras sobrantes',\n charactersToGo: '{{characters}} letras sobrantes',\n charactersTooMany: '{{characters}} letras demasiados',\n checksPassing: '{{current}}/{{max}} las comprobaciones están pasando',\n generateAi: 'Generar IA',\n good: 'Bien',\n imageAutoGenerationTip: 'La autogeneración recuperará la imagen de héroe seleccionada.',\n lengthTipDescription:\n 'Esto debe estar entre {{minLength}} y {{maxLength}} caracteres. Para obtener ayuda sobre cómo escribir meta descripciones de calidad, consulte ',\n lengthTipTitle:\n 'Debe tener entre {{minLength}} y {{maxLength}} caracteres. Para obtener ayuda sobre cómo escribir metatítulos de calidad, consulte ',\n missing: 'Falta',\n noImage: 'Sin imagen',\n preview: 'Vista previa',\n previewDescription:\n 'Las listas de resultados pueden variar segun la relevancia de buesqueda y el contenido.',\n tooLong: 'Demasiado largo',\n tooShort: 'Demasiado corto',\n },\n}\n"],"names":["es","$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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/fa.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/fa.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const fa: 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: 'تولید AI',\n good: 'خوب',\n imageAutoGenerationTip:\n 'این قابلیت، تصویر فعلی بارگذاری شده در مجموعه محتوای شما را بازیابی میکند',\n lengthTipDescription:\n 'این باید بین {{minLength}} و {{maxLength}} کلمه باشد. برای کمک در نوشتن توضیحات متا با کیفیت، مراجعه کنید به ',\n lengthTipTitle:\n 'این باید بین {{minLength}} و {{maxLength}} کلمه باشد. برای کمک در نوشتن عناوین متا با کیفیت، مراجعه کنید به ',\n missing: 'ناقص',\n noImage: 'بدون تصویر',\n preview: 'پیشنمایش',\n previewDescription: 'فهرست نتایج ممکن است بر اساس محتوا و متناسب با کلمه کلیدی جستجو شده باشند',\n tooLong: 'خیلی طولانی',\n tooShort: 'خیلی کوتاه',\n },\n}\n"],"names":["fa","$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,wBACE;QACFC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/fr.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/fr.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const fr: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'On y est presque',\n autoGenerate: 'Auto-générer',\n bestPractices: 'bonnes pratiques',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} caractères, ',\n charactersLeftOver: '{{characters}} restants',\n charactersToGo: '{{characters}} à ajouter',\n charactersTooMany: '{{characters}} en trop',\n checksPassing: '{{current}}/{{max}} vérifications réussies',\n generateAi: 'Générer IA',\n good: 'Bien',\n imageAutoGenerationTip: \"L'auto-génération récupérera l'image principale sélectionnée.\",\n lengthTipDescription:\n \"Ceci devrait contenir entre {{minLength}} et {{maxLength}} caractères. Pour obtenir de l'aide pour rédiger des descriptions meta de qualité, consultez les \",\n lengthTipTitle:\n \"Ceci devrait contenir entre {{minLength}} et {{maxLength}} caractères. Pour obtenir de l'aide pour rédiger des titres meta de qualité, consultez les \",\n missing: 'Manquant',\n noImage: \"Pas d'image\",\n preview: 'Aperçu',\n previewDescription:\n 'Les résultats exacts peuvent varier en fonction du contenu et de la pertinence de la recherche.',\n tooLong: 'Trop long',\n tooShort: 'Trop court',\n },\n}\n"],"names":["fr","$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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/index.ts"],"sourcesContent":["import type { GenericTranslationsObject, NestedKeysStripped } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/index.ts"],"sourcesContent":["import type { GenericTranslationsObject, NestedKeysStripped } from '@payloadcms/translations'\n\nimport { cs } from './cs'\nimport { de } from './de'\nimport { en } from './en'\nimport { es } from './es'\nimport { fa } from './fa'\nimport { fr } from './fr'\nimport { it } from './it'\nimport { nb } from './nb'\nimport { pl } from './pl'\nimport { ru } from './ru'\nimport { sv } from './sv'\nimport { tr } from './tr'\nimport { uk } from './uk'\n\nexport const translations = {\n cs,\n de,\n en,\n es,\n fa,\n fr,\n it,\n nb,\n pl,\n ru,\n sv,\n tr,\n uk,\n}\n\nexport type PluginSEOTranslations = GenericTranslationsObject\n\nexport type PluginSEOTranslationKeys = NestedKeysStripped<PluginSEOTranslations>\n"],"names":["cs","de","en","es","fa","fr","it","nb","pl","ru","sv","tr","uk","translations"],"mappings":"AAEA,SAASA,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AAEzB,OAAO,MAAMC,eAAe;IAC1Bb;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/it.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/it.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const it: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Ci siamo quasi',\n autoGenerate: 'Generazione automatica',\n bestPractices: 'migliori pratiche',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} caratteri, ',\n charactersLeftOver: '{{characters}} rimasti',\n charactersToGo: '{{characters}} mancanti',\n charactersTooMany: '{{characters}} in più',\n checksPassing: '{{current}}/{{max}} controlli superati',\n generateAi: 'Genera AI',\n good: 'Bene',\n imageAutoGenerationTip:\n \"La generazione automatica recupererà l'immagine selezionata per l'hero\",\n lengthTipDescription:\n 'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta descrizioni di qualità, vedere ',\n lengthTipTitle:\n 'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta titoli di qualità, vedere ',\n missing: 'Mancante',\n noImage: 'Nessuna Immagine',\n preview: 'Anteprima',\n previewDescription:\n 'I risultati esatti possono variare in base al contenuto e alla pertinenza della ricerca.',\n tooLong: 'Troppo lungo',\n tooShort: 'Troppo corto',\n },\n}\n"],"names":["it","$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,wBACE;QACFC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/nb.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/nb.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const nb: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Nesten der',\n autoGenerate: 'Auto-generer',\n bestPractices: 'beste praksis',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} tegn, ',\n charactersLeftOver: '{{characters}} til overs',\n charactersToGo: '{{characters}} igjen',\n charactersTooMany: '{{characters}} for mange',\n checksPassing: '{{current}}/{{max}} sjekker bestått',\n generateAi: 'Generer AI',\n good: 'Bra',\n imageAutoGenerationTip: 'Auto-generering vil hente det valgte hero-bildet.',\n lengthTipDescription:\n 'Dette bør være mellom {{minLength}} og {{maxLength}} tegn. For hjelp til å skrive beskrivelser av god kvalitet, se ',\n lengthTipTitle:\n 'Dette bør være mellom {{minLength}} og {{maxLength}} tegn. For hjelp til å skrive metatitler av god kvalitet, se ',\n missing: 'Mangler',\n noImage: 'Bilde mangler',\n preview: 'Forhåndsvisning',\n previewDescription:\n 'Eksakte resultatoppføringer kan variere basert på innhold og søke relevans.',\n tooLong: 'For lang',\n tooShort: 'For kort',\n },\n}\n"],"names":["nb","$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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/pl.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/pl.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const pl: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Prawie gotowe',\n autoGenerate: 'Wygeneruj automatycznie',\n bestPractices: 'najlepsze praktyki',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} znaków, ',\n charactersLeftOver: 'zostało {{characters}} znaków',\n charactersToGo: 'pozostało {{characters}} znaków',\n charactersTooMany: '{{characters}} znaków za dużo',\n checksPassing: '{{current}}/{{max}} testów zakończonych pomyślnie',\n generateAi: 'Generuj AI',\n good: 'Dobrze',\n imageAutoGenerationTip: 'Automatyczne generowanie pobierze wybrany główny obraz.',\n lengthTipDescription:\n 'Długość powinna wynosić od {{minLength}} do {{maxLength}} znaków. Po porady dotyczące pisania wysokiej jakości meta opisów zobacz ',\n lengthTipTitle:\n 'Długość powinna wynosić od {{minLength}} do {{maxLength}} znaków. Po porady dotyczące pisania wysokiej jakości meta tytułów zobacz ',\n missing: 'Brakuje',\n noImage: 'Brak obrazu',\n preview: 'Podgląd',\n previewDescription:\n 'Dokładne wyniki listowania mogą się różnić w zależności od treści i zgodności z kryteriami wyszukiwania.',\n tooLong: 'Zbyt długie',\n tooShort: 'Zbyt krótkie',\n },\n}\n"],"names":["pl","$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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/ru.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/ru.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const ru: 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":["ru","$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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/sv.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/sv.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const sv: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Nästan klar',\n autoGenerate: 'Skapa automatiskt',\n bestPractices: 'bästa praxis',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} tecken, ',\n charactersLeftOver: '{{characters}} tecken blir över',\n charactersToGo: '{{characters}} tecken kvar',\n charactersTooMany: '{{characters}} tecken för mycket',\n checksPassing: '{{current}}/{{max}} kontroller är godkända',\n generateAi: 'Skapa AI',\n good: 'Bra',\n imageAutoGenerationTip: 'Den automatiska processen kommer att välja en hero-bild.',\n lengthTipDescription:\n 'Bör vara mellan {{minLength}} och {{maxLength}} tecken. För hjälp med att skriva bra metabeskrivningar, se ',\n lengthTipTitle:\n 'Bör vara mellan {{minLength}} och {{maxLength}} tecken. För hjälp med att skriva bra metatitlar, se ',\n missing: 'Saknas',\n noImage: 'Ingen bild',\n preview: 'Förhandsgranska',\n previewDescription:\n 'Exakta resultatlistningar kan variera baserat på innehåll och sökrelevans.',\n tooLong: 'För lång',\n tooShort: 'För kort',\n },\n}\n"],"names":["sv","$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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/translations/tr.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\
|
|
1
|
+
{"version":3,"sources":["../../src/translations/tr.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const tr: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Neredeyse tamam',\n autoGenerate: 'Otomatik oluştur',\n bestPractices: 'en iyi uygulamalar',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} karakter, ',\n charactersLeftOver: '{{characters}} karakter kaldı',\n charactersToGo: '{{characters}} karakter kaldı',\n charactersTooMany: '{{characters}} karakter fazla',\n checksPassing: '{{current}}/{{max}} kontrol başarılı',\n generateAi: 'AI oluştur',\n good: 'İyi',\n imageAutoGenerationTip: 'Otomatik oluşturma, seçilen ana görseli alacaktır.',\n lengthTipDescription:\n '{{minLength}} ile {{maxLength}} karakter arasında olmalıdır. Kaliteli meta açıklamaları yazmak için yardım almak için bkz. ',\n lengthTipTitle:\n '{{minLength}} ile {{maxLength}} karakter arasında olmalıdır. Kaliteli meta başlıkları yazmak için yardım almak için bkz. ',\n missing: 'Eksik',\n noImage: 'Görsel yok',\n preview: 'Önizleme',\n previewDescription: 'Kesin sonuç listeleri içeriğe ve arama alâkasına göre değişebilir.',\n tooLong: 'Çok uzun',\n tooShort: 'Çok kısa',\n },\n}\n"],"names":["tr","$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"}
|