@payloadcms/plugin-seo 4.0.0-internal.77191e5 → 4.0.0-internal.7d5c665
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 +34 -2
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,YAAY,CAAA;AASnB,eAAO,MAAM,SAAS,wDAmZpB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { canAccessAdmin, definePlugin, executeAccess, Forbidden, UnauthorizedError } from 'payload';
|
|
1
|
+
import { canAccessAdmin, definePlugin, executeAccess, Forbidden, traverseFields, UnauthorizedError } from 'payload';
|
|
2
2
|
import { deepMergeSimple } from 'payload/shared';
|
|
3
3
|
import { MetaDescriptionField } from './fields/MetaDescription/index.js';
|
|
4
4
|
import { MetaImageField } from './fields/MetaImage/index.js';
|
|
@@ -41,8 +41,15 @@ export const seoPlugin = definePlugin({
|
|
|
41
41
|
}
|
|
42
42
|
];
|
|
43
43
|
const collectionConfigBySlug = new Map();
|
|
44
|
+
const collectionGenerationTargetSlugs = new Set(pluginConfig.collections ?? []);
|
|
44
45
|
for (const c of config.collections ?? []){
|
|
45
46
|
collectionConfigBySlug.set(c.slug, c);
|
|
47
|
+
if (hasSEOGenerationField({
|
|
48
|
+
config,
|
|
49
|
+
fields: c.fields
|
|
50
|
+
})) {
|
|
51
|
+
collectionGenerationTargetSlugs.add(c.slug);
|
|
52
|
+
}
|
|
46
53
|
}
|
|
47
54
|
const globalConfigBySlug = new Map();
|
|
48
55
|
for (const g of config.globals ?? []){
|
|
@@ -52,7 +59,7 @@ export const seoPlugin = definePlugin({
|
|
|
52
59
|
if (!data || typeof data !== 'object') {
|
|
53
60
|
throw new Forbidden(req.t);
|
|
54
61
|
}
|
|
55
|
-
const collectionConfig = data.collectionSlug &&
|
|
62
|
+
const collectionConfig = data.collectionSlug && collectionGenerationTargetSlugs.has(data.collectionSlug) ? collectionConfigBySlug.get(data.collectionSlug) : undefined;
|
|
56
63
|
const globalConfig = data.globalSlug && pluginConfig.globals?.includes(data.globalSlug) ? globalConfigBySlug.get(data.globalSlug) : undefined;
|
|
57
64
|
if (collectionConfig && !data.globalSlug) {
|
|
58
65
|
const dataDocumentID = data.doc && typeof data.doc === 'object' && 'id' in data.doc ? data.doc.id : undefined;
|
|
@@ -355,6 +362,31 @@ export const seoPlugin = definePlugin({
|
|
|
355
362
|
};
|
|
356
363
|
}
|
|
357
364
|
});
|
|
365
|
+
const hasSEOGenerationField = ({ config, fields })=>{
|
|
366
|
+
let hasGenerationField = false;
|
|
367
|
+
traverseFields({
|
|
368
|
+
callback: ({ field })=>{
|
|
369
|
+
if (!('admin' in field)) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const fieldComponent = field.admin?.components?.Field;
|
|
373
|
+
const generationProp = fieldComponent && typeof fieldComponent === 'object' ? seoGenerationComponentProps[fieldComponent.path] : undefined;
|
|
374
|
+
if (generationProp && fieldComponent.clientProps?.[generationProp] === true) {
|
|
375
|
+
hasGenerationField = true;
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
config,
|
|
380
|
+
fields
|
|
381
|
+
});
|
|
382
|
+
return hasGenerationField;
|
|
383
|
+
};
|
|
384
|
+
const seoGenerationComponentProps = {
|
|
385
|
+
'@payloadcms/plugin-seo/client#MetaDescriptionComponent': 'hasGenerateDescriptionFn',
|
|
386
|
+
'@payloadcms/plugin-seo/client#MetaImageComponent': 'hasGenerateImageFn',
|
|
387
|
+
'@payloadcms/plugin-seo/client#MetaTitleComponent': 'hasGenerateTitleFn',
|
|
388
|
+
'@payloadcms/plugin-seo/client#PreviewComponent': 'hasGenerateURLFn'
|
|
389
|
+
};
|
|
358
390
|
const authorizeGenerate = async ({ req })=>{
|
|
359
391
|
if (!req.user) {
|
|
360
392
|
throw new UnauthorizedError(req.t);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config, Field, GroupField, PayloadRequest, TabsField } from 'payload'\n\nimport { canAccessAdmin, definePlugin, executeAccess, Forbidden, UnauthorizedError } 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 const authorizeGenerateTarget = async ({\n data,\n req,\n }: {\n data:\n | null\n | Omit<Parameters<GenerateTitle>[0], 'collectionConfig' | 'globalConfig' | 'req'>\n | undefined\n req: PayloadRequest\n }) => {\n if (!data || typeof data !== 'object') {\n throw new Forbidden(req.t)\n }\n\n const collectionConfig =\n data.collectionSlug && pluginConfig.collections?.includes(data.collectionSlug)\n ? collectionConfigBySlug.get(data.collectionSlug)\n : undefined\n const globalConfig =\n data.globalSlug && pluginConfig.globals?.includes(data.globalSlug)\n ? globalConfigBySlug.get(data.globalSlug)\n : undefined\n\n if (collectionConfig && !data.globalSlug) {\n const dataDocumentID =\n data.doc && typeof data.doc === 'object' && 'id' in data.doc ? data.doc.id : undefined\n const documentIDs = [data.id, dataDocumentID].filter(\n (id) => id !== null && id !== undefined,\n )\n\n if (documentIDs.some((id) => typeof id !== 'string' && typeof id !== 'number')) {\n throw new Forbidden(req.t)\n }\n\n if (documentIDs.length === 2 && String(documentIDs[0]) !== String(documentIDs[1])) {\n throw new Forbidden(req.t)\n }\n\n const documentID = documentIDs[0] as number | string | undefined\n\n if (documentID !== undefined) {\n const accessibleDoc = await req.payload.findByID({\n id: documentID,\n collection: collectionConfig.slug,\n depth: 0,\n disableErrors: true,\n draft: true,\n overrideAccess: false,\n req,\n trash: true,\n user: req.user,\n })\n\n if (!accessibleDoc) {\n const { totalDocs } = await req.payload.count({\n collection: collectionConfig.slug,\n disableErrors: true,\n overrideAccess: true,\n req,\n trash: true,\n where: {\n id: {\n equals: documentID,\n },\n },\n })\n\n if (totalDocs > 0) {\n throw new Forbidden(req.t)\n }\n\n if (collectionConfig.access?.create) {\n await executeAccess(\n { slug: collectionConfig.slug, data: data.doc, req },\n collectionConfig.access.create,\n )\n }\n }\n } else if (collectionConfig.access?.create) {\n await executeAccess(\n { slug: collectionConfig.slug, data: data.doc, req },\n collectionConfig.access.create,\n )\n }\n\n return { collectionConfig, globalConfig: undefined }\n }\n\n if (globalConfig && !data.collectionSlug) {\n const doc = await req.payload.findGlobal({\n slug: globalConfig.slug,\n depth: 0,\n disableErrors: true,\n draft: true,\n overrideAccess: false,\n req,\n user: req.user,\n })\n\n if (!doc) {\n throw new Forbidden(req.t)\n }\n\n return { collectionConfig: undefined, globalConfig }\n }\n\n throw new Forbidden(req.t)\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 await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateTitle\n ? await pluginConfig.generateTitle({\n ...data,\n collectionConfig,\n globalConfig,\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 await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription({\n ...data,\n collectionConfig,\n globalConfig,\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 await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateURL\n ? await pluginConfig.generateURL({\n ...data,\n collectionConfig,\n globalConfig,\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 await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateImage\n ? await pluginConfig.generateImage({\n ...data,\n collectionConfig,\n globalConfig,\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\nconst authorizeGenerate = async ({ req }: { req: PayloadRequest }): Promise<void> => {\n if (!req.user) {\n throw new UnauthorizedError(req.t)\n }\n\n await canAccessAdmin({ req })\n}\n"],"names":["canAccessAdmin","definePlugin","executeAccess","Forbidden","UnauthorizedError","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","authorizeGenerateTarget","data","req","t","collectionConfig","collectionSlug","includes","get","undefined","globalConfig","globalSlug","dataDocumentID","doc","id","documentIDs","filter","some","length","String","documentID","accessibleDoc","payload","findByID","collection","depth","disableErrors","draft","overrideAccess","trash","user","totalDocs","count","where","equals","access","create","findGlobal","map","isEnabled","tabbedUI","emailField","auth","disableLocalStrategy","find","field","hasOnlyEmailField","seoTabs","tabs","labels","singular","slice","endpoints","handler","authorizeGenerate","json","reqData","result","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, PayloadRequest, TabsField } from 'payload'\n\nimport {\n canAccessAdmin,\n definePlugin,\n executeAccess,\n Forbidden,\n traverseFields,\n UnauthorizedError,\n} 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 const collectionGenerationTargetSlugs = new Set(pluginConfig.collections ?? [])\n for (const c of config.collections ?? []) {\n collectionConfigBySlug.set(c.slug, c)\n\n if (hasSEOGenerationField({ config, fields: c.fields })) {\n collectionGenerationTargetSlugs.add(c.slug)\n }\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 const authorizeGenerateTarget = async ({\n data,\n req,\n }: {\n data:\n | null\n | Omit<Parameters<GenerateTitle>[0], 'collectionConfig' | 'globalConfig' | 'req'>\n | undefined\n req: PayloadRequest\n }) => {\n if (!data || typeof data !== 'object') {\n throw new Forbidden(req.t)\n }\n\n const collectionConfig =\n data.collectionSlug && collectionGenerationTargetSlugs.has(data.collectionSlug)\n ? collectionConfigBySlug.get(data.collectionSlug)\n : undefined\n const globalConfig =\n data.globalSlug && pluginConfig.globals?.includes(data.globalSlug)\n ? globalConfigBySlug.get(data.globalSlug)\n : undefined\n\n if (collectionConfig && !data.globalSlug) {\n const dataDocumentID =\n data.doc && typeof data.doc === 'object' && 'id' in data.doc ? data.doc.id : undefined\n const documentIDs = [data.id, dataDocumentID].filter(\n (id) => id !== null && id !== undefined,\n )\n\n if (documentIDs.some((id) => typeof id !== 'string' && typeof id !== 'number')) {\n throw new Forbidden(req.t)\n }\n\n if (documentIDs.length === 2 && String(documentIDs[0]) !== String(documentIDs[1])) {\n throw new Forbidden(req.t)\n }\n\n const documentID = documentIDs[0] as number | string | undefined\n\n if (documentID !== undefined) {\n const accessibleDoc = await req.payload.findByID({\n id: documentID,\n collection: collectionConfig.slug,\n depth: 0,\n disableErrors: true,\n draft: true,\n overrideAccess: false,\n req,\n trash: true,\n user: req.user,\n })\n\n if (!accessibleDoc) {\n const { totalDocs } = await req.payload.count({\n collection: collectionConfig.slug,\n disableErrors: true,\n overrideAccess: true,\n req,\n trash: true,\n where: {\n id: {\n equals: documentID,\n },\n },\n })\n\n if (totalDocs > 0) {\n throw new Forbidden(req.t)\n }\n\n if (collectionConfig.access?.create) {\n await executeAccess(\n { slug: collectionConfig.slug, data: data.doc, req },\n collectionConfig.access.create,\n )\n }\n }\n } else if (collectionConfig.access?.create) {\n await executeAccess(\n { slug: collectionConfig.slug, data: data.doc, req },\n collectionConfig.access.create,\n )\n }\n\n return { collectionConfig, globalConfig: undefined }\n }\n\n if (globalConfig && !data.collectionSlug) {\n const doc = await req.payload.findGlobal({\n slug: globalConfig.slug,\n depth: 0,\n disableErrors: true,\n draft: true,\n overrideAccess: false,\n req,\n user: req.user,\n })\n\n if (!doc) {\n throw new Forbidden(req.t)\n }\n\n return { collectionConfig: undefined, globalConfig }\n }\n\n throw new Forbidden(req.t)\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 await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateTitle\n ? await pluginConfig.generateTitle({\n ...data,\n collectionConfig,\n globalConfig,\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 await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription({\n ...data,\n collectionConfig,\n globalConfig,\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 await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateURL\n ? await pluginConfig.generateURL({\n ...data,\n collectionConfig,\n globalConfig,\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 await authorizeGenerate({ req })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n const reqData = data ?? req.data\n const { collectionConfig, globalConfig } = await authorizeGenerateTarget({\n data: reqData,\n req,\n })\n\n const result = pluginConfig.generateImage\n ? await pluginConfig.generateImage({\n ...data,\n collectionConfig,\n globalConfig,\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\nconst hasSEOGenerationField = ({\n config,\n fields,\n}: {\n config: Config\n fields: Field[]\n}): boolean => {\n let hasGenerationField = false\n\n traverseFields({\n callback: ({ field }) => {\n if (!('admin' in field)) {\n return\n }\n\n const fieldComponent = field.admin?.components?.Field\n const generationProp =\n fieldComponent && typeof fieldComponent === 'object'\n ? seoGenerationComponentProps[\n fieldComponent.path as keyof typeof seoGenerationComponentProps\n ]\n : undefined\n\n if (\n generationProp &&\n (fieldComponent as { clientProps?: Record<string, unknown> }).clientProps?.[\n generationProp\n ] === true\n ) {\n hasGenerationField = true\n\n return true\n }\n },\n config,\n fields,\n })\n\n return hasGenerationField\n}\n\nconst seoGenerationComponentProps = {\n '@payloadcms/plugin-seo/client#MetaDescriptionComponent': 'hasGenerateDescriptionFn',\n '@payloadcms/plugin-seo/client#MetaImageComponent': 'hasGenerateImageFn',\n '@payloadcms/plugin-seo/client#MetaTitleComponent': 'hasGenerateTitleFn',\n '@payloadcms/plugin-seo/client#PreviewComponent': 'hasGenerateURLFn',\n} as const\n\nconst authorizeGenerate = async ({ req }: { req: PayloadRequest }): Promise<void> => {\n if (!req.user) {\n throw new UnauthorizedError(req.t)\n }\n\n await canAccessAdmin({ req })\n}\n"],"names":["canAccessAdmin","definePlugin","executeAccess","Forbidden","traverseFields","UnauthorizedError","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","collectionGenerationTargetSlugs","Set","collections","c","set","hasSEOGenerationField","add","globalConfigBySlug","g","globals","authorizeGenerateTarget","data","req","t","collectionConfig","collectionSlug","has","get","undefined","globalConfig","globalSlug","includes","dataDocumentID","doc","id","documentIDs","filter","some","length","String","documentID","accessibleDoc","payload","findByID","collection","depth","disableErrors","draft","overrideAccess","trash","user","totalDocs","count","where","equals","access","create","findGlobal","map","isEnabled","tabbedUI","emailField","auth","disableLocalStrategy","find","field","hasOnlyEmailField","seoTabs","tabs","labels","singular","slice","endpoints","handler","authorizeGenerate","json","reqData","result","Response","JSON","stringify","status","method","path","global","i18n","hasGenerationField","callback","fieldComponent","admin","components","Field","generationProp","seoGenerationComponentProps","clientProps"],"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-internal.
|
|
3
|
+
"version": "4.0.0-internal.7d5c665",
|
|
4
4
|
"description": "SEO plugin for Payload",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"payload",
|
|
@@ -57,20 +57,20 @@
|
|
|
57
57
|
"dist"
|
|
58
58
|
],
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@payloadcms/translations": "4.0.0-internal.
|
|
61
|
-
"@payloadcms/ui": "4.0.0-internal.
|
|
60
|
+
"@payloadcms/translations": "4.0.0-internal.7d5c665",
|
|
61
|
+
"@payloadcms/ui": "4.0.0-internal.7d5c665"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
|
-
"@types/react": "19.
|
|
65
|
-
"@types/react-dom": "19.
|
|
64
|
+
"@types/react": "19.3.0",
|
|
65
|
+
"@types/react-dom": "19.3.0",
|
|
66
66
|
"@payloadcms/eslint-config": "3.28.0",
|
|
67
|
-
"@payloadcms/next": "4.0.0-internal.
|
|
68
|
-
"payload": "4.0.0-internal.
|
|
67
|
+
"@payloadcms/next": "4.0.0-internal.7d5c665",
|
|
68
|
+
"payload": "4.0.0-internal.7d5c665"
|
|
69
69
|
},
|
|
70
70
|
"peerDependencies": {
|
|
71
71
|
"react": "^19.0.1 || ^19.1.2 || ^19.2.1",
|
|
72
72
|
"react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
|
|
73
|
-
"payload": "4.0.0-internal.
|
|
73
|
+
"payload": "4.0.0-internal.7d5c665"
|
|
74
74
|
},
|
|
75
75
|
"publishConfig": {
|
|
76
76
|
"registry": "https://registry.npmjs.org/"
|