From 5eee49da9aad8ddefb240b4893a306bfa4cc93c4 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 15 Aug 2024 17:09:08 -0600 Subject: [PATCH] feat(plugin-seo): pass req through to generate functions (#7711) Closes https://github.com/payloadcms/payload/issues/7708 --- docs/plugins/seo.mdx | 8 ++--- .../MetaDescriptionComponent.tsx | 2 +- .../fields/MetaImage/MetaImageComponent.tsx | 2 +- .../fields/MetaTitle/MetaTitleComponent.tsx | 2 +- .../src/fields/Preview/PreviewComponent.tsx | 2 +- packages/plugin-seo/src/index.tsx | 31 ++++++++++++------- packages/plugin-seo/src/types.ts | 9 +++--- 7 files changed, 33 insertions(+), 23 deletions(-) diff --git a/docs/plugins/seo.mdx b/docs/plugins/seo.mdx index 7e90132ef..1a00a689a 100644 --- a/docs/plugins/seo.mdx +++ b/docs/plugins/seo.mdx @@ -119,7 +119,7 @@ A function that allows you to return any meta title, including from document's c { // ... seoPlugin({ - generateTitle: ({ ...docInfo, doc, locale }) => `Website.com — ${doc?.title}`, + generateTitle: ({ ...docInfo, doc, locale, req }) => `Website.com — ${doc?.title}`, }) } ``` @@ -133,7 +133,7 @@ A function that allows you to return any meta description, including from docume { // ... seoPlugin({ - generateDescription: ({ ...docInfo, doc, locale }) => doc?.excerpt, + generateDescription: ({ ...docInfo, doc, locale, req }) => doc?.excerpt, }) } ``` @@ -147,7 +147,7 @@ A function that allows you to return any meta image, including from document's c { // ... seoPlugin({ - generateImage: ({ ...docInfo, doc, locale }) => doc?.featuredImage, + generateImage: ({ ...docInfo, doc, locale, req }) => doc?.featuredImage, }) } ``` @@ -161,7 +161,7 @@ A function called by the search preview component to display the actual URL of y { // ... seoPlugin({ - generateURL: ({ ...docInfo, doc, locale }) => + generateURL: ({ ...docInfo, doc, locale, req }) => `https://yoursite.com/${collection?.slug}/${doc?.slug}`, }) } diff --git a/packages/plugin-seo/src/fields/MetaDescription/MetaDescriptionComponent.tsx b/packages/plugin-seo/src/fields/MetaDescription/MetaDescriptionComponent.tsx index 2fd281800..917d6bb61 100644 --- a/packages/plugin-seo/src/fields/MetaDescription/MetaDescriptionComponent.tsx +++ b/packages/plugin-seo/src/fields/MetaDescription/MetaDescriptionComponent.tsx @@ -61,7 +61,7 @@ export const MetaDescriptionComponent: React.FC = (props) ...docInfo, doc: { ...getData() }, locale: typeof locale === 'object' ? locale?.code : locale, - } satisfies Parameters[0]), + } satisfies Omit[0], 'req'>), credentials: 'include', headers: { 'Content-Type': 'application/json', diff --git a/packages/plugin-seo/src/fields/MetaImage/MetaImageComponent.tsx b/packages/plugin-seo/src/fields/MetaImage/MetaImageComponent.tsx index 46432cab9..ee78c3399 100644 --- a/packages/plugin-seo/src/fields/MetaImage/MetaImageComponent.tsx +++ b/packages/plugin-seo/src/fields/MetaImage/MetaImageComponent.tsx @@ -57,7 +57,7 @@ export const MetaImageComponent: React.FC = (props) => { ...docInfo, doc: { ...getData() }, locale: typeof locale === 'object' ? locale?.code : locale, - } satisfies Parameters[0]), + } satisfies Omit[0], 'req'>), credentials: 'include', headers: { 'Content-Type': 'application/json', diff --git a/packages/plugin-seo/src/fields/MetaTitle/MetaTitleComponent.tsx b/packages/plugin-seo/src/fields/MetaTitle/MetaTitleComponent.tsx index eddc95090..795baa59c 100644 --- a/packages/plugin-seo/src/fields/MetaTitle/MetaTitleComponent.tsx +++ b/packages/plugin-seo/src/fields/MetaTitle/MetaTitleComponent.tsx @@ -62,7 +62,7 @@ export const MetaTitleComponent: React.FC = (props) => { ...docInfo, doc: { ...getData() }, locale: typeof locale === 'object' ? locale?.code : locale, - } satisfies Parameters[0]), + } satisfies Omit[0], 'req'>), credentials: 'include', headers: { 'Content-Type': 'application/json', diff --git a/packages/plugin-seo/src/fields/Preview/PreviewComponent.tsx b/packages/plugin-seo/src/fields/Preview/PreviewComponent.tsx index 078b36905..b6d195757 100644 --- a/packages/plugin-seo/src/fields/Preview/PreviewComponent.tsx +++ b/packages/plugin-seo/src/fields/Preview/PreviewComponent.tsx @@ -49,7 +49,7 @@ export const PreviewComponent: React.FC = ({ ...docInfo, doc: { ...getData() }, locale: typeof locale === 'object' ? locale?.code : locale, - } satisfies Parameters[0]), + } satisfies Omit[0], 'req'>), credentials: 'include', headers: { 'Content-Type': 'application/json', diff --git a/packages/plugin-seo/src/index.tsx b/packages/plugin-seo/src/index.tsx index b2bf4d298..a957c9af6 100644 --- a/packages/plugin-seo/src/index.tsx +++ b/packages/plugin-seo/src/index.tsx @@ -134,11 +134,12 @@ export const seoPlugin = { handler: async (req) => { await addDataAndFileToRequest(req) - req.t + const result = pluginConfig.generateTitle - ? await pluginConfig.generateTitle( - req.data as unknown as Parameters[0], - ) + ? await pluginConfig.generateTitle({ + ...req.data, + req, + } as unknown as Parameters[0]) : '' return new Response(JSON.stringify({ result }), { status: 200 }) }, @@ -148,10 +149,12 @@ export const seoPlugin = { handler: async (req) => { await addDataAndFileToRequest(req) + const result = pluginConfig.generateDescription - ? await pluginConfig.generateDescription( - req.data as unknown as Parameters[0], - ) + ? await pluginConfig.generateDescription({ + ...req.data, + req, + } as unknown as Parameters[0]) : '' return new Response(JSON.stringify({ result }), { status: 200 }) }, @@ -161,8 +164,12 @@ export const seoPlugin = { handler: async (req) => { await addDataAndFileToRequest(req) + const result = pluginConfig.generateURL - ? await pluginConfig.generateURL(req.data as unknown as Parameters[0]) + ? await pluginConfig.generateURL({ + ...req.data, + req, + } as unknown as Parameters[0]) : '' return new Response(JSON.stringify({ result }), { status: 200 }) }, @@ -172,10 +179,12 @@ export const seoPlugin = { handler: async (req) => { await addDataAndFileToRequest(req) + const result = pluginConfig.generateImage - ? await pluginConfig.generateImage( - req.data as unknown as Parameters[0], - ) + ? await pluginConfig.generateImage({ + ...req.data, + req, + } as unknown as Parameters[0]) : '' return new Response(result, { status: 200 }) }, diff --git a/packages/plugin-seo/src/types.ts b/packages/plugin-seo/src/types.ts index 932e811dd..ed0078bea 100644 --- a/packages/plugin-seo/src/types.ts +++ b/packages/plugin-seo/src/types.ts @@ -1,23 +1,24 @@ import type { DocumentInfoContext } from '@payloadcms/ui' -import type { Field, TextField, TextareaField, UploadField } from 'payload' +import type { Field, PayloadRequest, TextField, TextareaField, UploadField } from 'payload' export type GenerateTitle = ( - args: { doc: T; locale?: string } & DocumentInfoContext, + args: { doc: T; locale?: string; req: PayloadRequest } & DocumentInfoContext, ) => Promise | string export type GenerateDescription = ( args: { doc: T locale?: string + req: PayloadRequest } & DocumentInfoContext, ) => Promise | string export type GenerateImage = ( - args: { doc: T; locale?: string } & DocumentInfoContext, + args: { doc: T; locale?: string; req: PayloadRequest } & DocumentInfoContext, ) => Promise | string export type GenerateURL = ( - args: { doc: T; locale?: string } & DocumentInfoContext, + args: { doc: T; locale?: string; req: PayloadRequest } & DocumentInfoContext, ) => Promise | string export type SEOPluginConfig = {