@justanarthur/payload-plugin-seo 1.3.8 → 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/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -44
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,MAAM,EAA4C,MAAM,SAAS,CAAA;AAU/F,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,SAAS,GACnB,cAAc,eAAe,MAC7B,QAAQ,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,MAAM,EAA4C,MAAM,SAAS,CAAA;AAU/F,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,SAAS,GACnB,cAAc,eAAe,MAC7B,QAAQ,MAAM,KAAG,MAsYjB,CAAA"}
|
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'\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 const seoTabs: TabsField[] = hasOnlyEmailField\n ? [\n {\n tabs: [\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n type: 'tabs',\n },\n ]\n : [\n {\n tabs: [\n // append a new tab onto the end of the tabs array, if there is one at the first index\n // if needed, create a new `Content` tab in the first index for this collection's base fields\n ...(collection?.fields?.[0]?.type === 'tabs' &&\n collection?.fields?.[0]?.tabs\n ? collection.fields[0].tabs\n : [\n {\n fields: [\n ...(emailField\n ? collection.fields.filter(\n (field) => 'name' in field && field.name !== 'email',\n )\n : collection.fields),\n ],\n label: collection?.labels?.singular || 'Content',\n },\n ]),\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n type: 'tabs',\n },\n ]\n\n return {\n ...collection,\n fields: [\n ...(emailField ? [emailField] : []),\n ...seoTabs,\n ...(collection?.fields?.[0]?.type === 'tabs' ? collection.fields.slice(1) : []),\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 const seoTabs: TabsField[] = [\n {\n tabs: [\n // append a new tab onto the end of the tabs array, if there is one at the first index\n // if needed, create a new `Content` tab in the first index for this global's base fields\n ...(global?.fields?.[0].type === 'tabs' && global?.fields?.[0].tabs\n ? global.fields[0].tabs\n : [\n {\n fields: [...(global?.fields || [])],\n label: global?.label || 'Content',\n },\n ]),\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n type: 'tabs',\n },\n ]\n\n return {\n ...global,\n fields: [\n ...seoTabs,\n ...(global?.fields?.[0].type === 'tabs' ? global.fields.slice(1) : []),\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","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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"}
|