@payloadcms/plugin-seo 4.0.0-canary.8 → 4.0.0-canary.9

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 CHANGED
@@ -1,4 +1,3 @@
1
- import type { Config } from 'payload';
2
1
  import type { SEOPluginConfig } from './types.js';
3
- export declare const seoPlugin: (pluginConfig: SEOPluginConfig) => (config: Config) => Config;
2
+ export declare const seoPlugin: (options: SEOPluginConfig) => import("payload").Plugin;
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,SAAS,CAAA;AAInE,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,YAAY,CAAA;AASnB,eAAO,MAAM,SAAS,GACnB,cAAc,eAAe,MAC7B,QAAQ,MAAM,KAAG,MAsRjB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,YAAY,CAAA;AASnB,eAAO,MAAM,SAAS,wDAyRpB,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { definePlugin } from 'payload';
1
2
  import { deepMergeSimple } from 'payload/shared';
2
3
  import { MetaDescriptionField } from './fields/MetaDescription/index.js';
3
4
  import { MetaImageField } from './fields/MetaImage/index.js';
@@ -5,7 +6,9 @@ import { MetaTitleField } from './fields/MetaTitle/index.js';
5
6
  import { OverviewField } from './fields/Overview/index.js';
6
7
  import { PreviewField } from './fields/Preview/index.js';
7
8
  import { translations } from './translations/index.js';
8
- export const seoPlugin = (pluginConfig)=>(config)=>{
9
+ export const seoPlugin = definePlugin({
10
+ slug: '@payloadcms/plugin-seo',
11
+ plugin: ({ config, options: pluginConfig })=>{
9
12
  const defaultFields = [
10
13
  OverviewField({}),
11
14
  MetaTitleField({
@@ -235,6 +238,7 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
235
238
  translations: deepMergeSimple(translations, config.i18n?.translations ?? {})
236
239
  }
237
240
  };
238
- };
241
+ }
242
+ });
239
243
 
240
244
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config, Field, GroupField, TabsField } from 'payload'\n\nimport { deepMergeSimple } from 'payload/shared'\n\nimport type {\n GenerateDescription,\n GenerateImage,\n GenerateTitle,\n GenerateURL,\n SEOPluginConfig,\n} from './types.js'\n\nimport { MetaDescriptionField } from './fields/MetaDescription/index.js'\nimport { MetaImageField } from './fields/MetaImage/index.js'\nimport { MetaTitleField } from './fields/MetaTitle/index.js'\nimport { OverviewField } from './fields/Overview/index.js'\nimport { PreviewField } from './fields/Preview/index.js'\nimport { translations } from './translations/index.js'\n\nexport const seoPlugin =\n (pluginConfig: SEOPluginConfig) =>\n (config: Config): Config => {\n const defaultFields: Field[] = [\n OverviewField({}),\n MetaTitleField({\n hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',\n }),\n MetaDescriptionField({\n hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',\n }),\n ...(pluginConfig?.uploadsCollection\n ? [\n MetaImageField({\n hasGenerateFn: typeof pluginConfig?.generateImage === 'function',\n relationTo: pluginConfig.uploadsCollection as string,\n }),\n ]\n : []),\n PreviewField({\n hasGenerateFn: typeof pluginConfig?.generateURL === 'function',\n }),\n ]\n\n const seoFields: GroupField[] = [\n {\n name: 'meta',\n type: 'group',\n fields: [\n ...(pluginConfig?.fields && typeof pluginConfig.fields === 'function'\n ? pluginConfig.fields({ defaultFields })\n : defaultFields),\n ],\n interfaceName: pluginConfig.interfaceName,\n label: 'SEO',\n },\n ]\n\n const collectionConfigBySlug = new Map<string, NonNullable<Config['collections']>[number]>()\n for (const c of config.collections ?? []) {\n collectionConfigBySlug.set(c.slug, c)\n }\n const globalConfigBySlug = new Map<string, NonNullable<Config['globals']>[number]>()\n for (const g of config.globals ?? []) {\n globalConfigBySlug.set(g.slug, g)\n }\n\n return {\n ...config,\n collections:\n config.collections?.map((collection) => {\n const { slug } = collection\n const isEnabled = pluginConfig?.collections?.includes(slug)\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 !(typeof collection.auth === 'object' && collection.auth.disableLocalStrategy) &&\n collection.fields?.find((field) => 'name' in field && field.name === 'email')\n const hasOnlyEmailField = collection.fields?.length === 1 && emailField\n\n const seoTabs: TabsField[] = hasOnlyEmailField\n ? [\n {\n type: 'tabs',\n tabs: [\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n },\n ]\n : [\n {\n type: 'tabs',\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 },\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 const reqData = data ?? req.data\n\n const result = pluginConfig.generateTitle\n ? await pluginConfig.generateTitle({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateTitle>[0])\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 const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateDescription>[0])\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 const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n\n const result = pluginConfig.generateURL\n ? await pluginConfig.generateURL({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateURL>[0])\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 const reqData = data ?? req.data\n\n const result = pluginConfig.generateImage\n ? await pluginConfig.generateImage({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateImage>[0])\n : ''\n return new Response(JSON.stringify({ 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 const isEnabled = pluginConfig?.globals?.includes(slug)\n\n if (isEnabled) {\n if (pluginConfig?.tabbedUI) {\n const seoTabs: TabsField[] = [\n {\n type: 'tabs',\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 },\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: deepMergeSimple(translations, config.i18n?.translations ?? {}),\n },\n }\n }\n"],"names":["deepMergeSimple","MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField","translations","seoPlugin","pluginConfig","config","defaultFields","hasGenerateFn","generateTitle","generateDescription","uploadsCollection","generateImage","relationTo","generateURL","seoFields","name","type","fields","interfaceName","label","collectionConfigBySlug","Map","c","collections","set","slug","globalConfigBySlug","g","globals","map","collection","isEnabled","includes","tabbedUI","emailField","auth","disableLocalStrategy","find","field","hasOnlyEmailField","length","seoTabs","tabs","filter","labels","singular","slice","endpoints","handler","req","data","json","reqData","result","collectionConfig","collectionSlug","get","undefined","globalConfig","globalSlug","Response","JSON","stringify","status","method","path","global","i18n"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config, Field, GroupField, TabsField } from 'payload'\n\nimport { definePlugin } from 'payload'\nimport { deepMergeSimple } from 'payload/shared'\n\nimport type {\n GenerateDescription,\n GenerateImage,\n GenerateTitle,\n GenerateURL,\n SEOPluginConfig,\n} from './types.js'\n\nimport { MetaDescriptionField } from './fields/MetaDescription/index.js'\nimport { MetaImageField } from './fields/MetaImage/index.js'\nimport { MetaTitleField } from './fields/MetaTitle/index.js'\nimport { OverviewField } from './fields/Overview/index.js'\nimport { PreviewField } from './fields/Preview/index.js'\nimport { translations } from './translations/index.js'\n\nexport const seoPlugin = definePlugin<SEOPluginConfig>({\n slug: '@payloadcms/plugin-seo',\n plugin: ({ config, options: pluginConfig }) => {\n const defaultFields: Field[] = [\n OverviewField({}),\n MetaTitleField({\n hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',\n }),\n MetaDescriptionField({\n hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',\n }),\n ...(pluginConfig?.uploadsCollection\n ? [\n MetaImageField({\n hasGenerateFn: typeof pluginConfig?.generateImage === 'function',\n relationTo: pluginConfig.uploadsCollection as string,\n }),\n ]\n : []),\n PreviewField({\n hasGenerateFn: typeof pluginConfig?.generateURL === 'function',\n }),\n ]\n\n const seoFields: GroupField[] = [\n {\n name: 'meta',\n type: 'group',\n fields: [\n ...(pluginConfig?.fields && typeof pluginConfig.fields === 'function'\n ? pluginConfig.fields({ defaultFields })\n : defaultFields),\n ],\n interfaceName: pluginConfig.interfaceName,\n label: 'SEO',\n },\n ]\n\n const collectionConfigBySlug = new Map<string, NonNullable<Config['collections']>[number]>()\n for (const c of config.collections ?? []) {\n collectionConfigBySlug.set(c.slug, c)\n }\n const globalConfigBySlug = new Map<string, NonNullable<Config['globals']>[number]>()\n for (const g of config.globals ?? []) {\n globalConfigBySlug.set(g.slug, g)\n }\n\n return {\n ...config,\n collections:\n config.collections?.map((collection) => {\n const { slug } = collection\n const isEnabled = pluginConfig?.collections?.includes(slug)\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 !(typeof collection.auth === 'object' && collection.auth.disableLocalStrategy) &&\n collection.fields?.find((field) => 'name' in field && field.name === 'email')\n const hasOnlyEmailField = collection.fields?.length === 1 && emailField\n\n const seoTabs: TabsField[] = hasOnlyEmailField\n ? [\n {\n type: 'tabs',\n tabs: [\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n },\n ]\n : [\n {\n type: 'tabs',\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 },\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 const reqData = data ?? req.data\n\n const result = pluginConfig.generateTitle\n ? await pluginConfig.generateTitle({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateTitle>[0])\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 const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateDescription>[0])\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 const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n\n const result = pluginConfig.generateURL\n ? await pluginConfig.generateURL({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateURL>[0])\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 const reqData = data ?? req.data\n\n const result = pluginConfig.generateImage\n ? await pluginConfig.generateImage({\n ...data,\n collectionConfig: reqData.collectionSlug\n ? collectionConfigBySlug.get(reqData.collectionSlug)\n : undefined,\n globalConfig: reqData.globalSlug\n ? globalConfigBySlug.get(reqData.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateImage>[0])\n : ''\n return new Response(JSON.stringify({ 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 const isEnabled = pluginConfig?.globals?.includes(slug)\n\n if (isEnabled) {\n if (pluginConfig?.tabbedUI) {\n const seoTabs: TabsField[] = [\n {\n type: 'tabs',\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 },\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: deepMergeSimple(translations, config.i18n?.translations ?? {}),\n },\n }\n },\n})\n"],"names":["definePlugin","deepMergeSimple","MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField","translations","seoPlugin","slug","plugin","config","options","pluginConfig","defaultFields","hasGenerateFn","generateTitle","generateDescription","uploadsCollection","generateImage","relationTo","generateURL","seoFields","name","type","fields","interfaceName","label","collectionConfigBySlug","Map","c","collections","set","globalConfigBySlug","g","globals","map","collection","isEnabled","includes","tabbedUI","emailField","auth","disableLocalStrategy","find","field","hasOnlyEmailField","length","seoTabs","tabs","filter","labels","singular","slice","endpoints","handler","req","data","json","reqData","result","collectionConfig","collectionSlug","get","undefined","globalConfig","globalSlug","Response","JSON","stringify","status","method","path","global","i18n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-seo",
3
- "version": "4.0.0-canary.8",
3
+ "version": "4.0.0-canary.9",
4
4
  "description": "SEO plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -58,20 +58,20 @@
58
58
  "dist"
59
59
  ],
60
60
  "dependencies": {
61
- "@payloadcms/translations": "4.0.0-canary.8",
62
- "@payloadcms/ui": "4.0.0-canary.8"
61
+ "@payloadcms/translations": "4.0.0-canary.9",
62
+ "@payloadcms/ui": "4.0.0-canary.9"
63
63
  },
64
64
  "devDependencies": {
65
65
  "@types/react": "19.2.14",
66
66
  "@types/react-dom": "19.2.3",
67
67
  "@payloadcms/eslint-config": "3.28.0",
68
- "@payloadcms/next": "4.0.0-canary.8",
69
- "payload": "4.0.0-canary.8"
68
+ "@payloadcms/next": "4.0.0-canary.9",
69
+ "payload": "4.0.0-canary.9"
70
70
  },
71
71
  "peerDependencies": {
72
72
  "react": "^19.0.1 || ^19.1.2 || ^19.2.1",
73
73
  "react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
74
- "payload": "4.0.0-canary.8"
74
+ "payload": "4.0.0-canary.9"
75
75
  },
76
76
  "publishConfig": {
77
77
  "registry": "https://registry.npmjs.org/"