@payloadcms/plugin-seo 4.0.0-internal.38b7f1d → 4.0.0-internal.5d5a2b2
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/@types/assets.d.js +2 -0
- package/dist/@types/assets.d.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -8
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/@types/assets.d.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/index.js
CHANGED
|
@@ -37,6 +37,14 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
37
37
|
label: 'SEO'
|
|
38
38
|
}
|
|
39
39
|
];
|
|
40
|
+
const collectionConfigBySlug = new Map();
|
|
41
|
+
for (const c of config.collections ?? []){
|
|
42
|
+
collectionConfigBySlug.set(c.slug, c);
|
|
43
|
+
}
|
|
44
|
+
const globalConfigBySlug = new Map();
|
|
45
|
+
for (const g of config.globals ?? []){
|
|
46
|
+
globalConfigBySlug.set(g.slug, g);
|
|
47
|
+
}
|
|
40
48
|
return {
|
|
41
49
|
...config,
|
|
42
50
|
collections: config.collections?.map((collection)=>{
|
|
@@ -107,8 +115,8 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
107
115
|
const reqData = data ?? req.data;
|
|
108
116
|
const result = pluginConfig.generateTitle ? await pluginConfig.generateTitle({
|
|
109
117
|
...data,
|
|
110
|
-
collectionConfig:
|
|
111
|
-
globalConfig:
|
|
118
|
+
collectionConfig: reqData.collectionSlug ? collectionConfigBySlug.get(reqData.collectionSlug) : undefined,
|
|
119
|
+
globalConfig: reqData.globalSlug ? globalConfigBySlug.get(reqData.globalSlug) : undefined,
|
|
112
120
|
req
|
|
113
121
|
}) : '';
|
|
114
122
|
return new Response(JSON.stringify({
|
|
@@ -126,8 +134,8 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
126
134
|
const reqData = data ?? req.data;
|
|
127
135
|
const result = pluginConfig.generateDescription ? await pluginConfig.generateDescription({
|
|
128
136
|
...data,
|
|
129
|
-
collectionConfig:
|
|
130
|
-
globalConfig:
|
|
137
|
+
collectionConfig: reqData.collectionSlug ? collectionConfigBySlug.get(reqData.collectionSlug) : undefined,
|
|
138
|
+
globalConfig: reqData.globalSlug ? globalConfigBySlug.get(reqData.globalSlug) : undefined,
|
|
131
139
|
req
|
|
132
140
|
}) : '';
|
|
133
141
|
return new Response(JSON.stringify({
|
|
@@ -145,8 +153,8 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
145
153
|
const reqData = data ?? req.data;
|
|
146
154
|
const result = pluginConfig.generateURL ? await pluginConfig.generateURL({
|
|
147
155
|
...data,
|
|
148
|
-
collectionConfig:
|
|
149
|
-
globalConfig:
|
|
156
|
+
collectionConfig: reqData.collectionSlug ? collectionConfigBySlug.get(reqData.collectionSlug) : undefined,
|
|
157
|
+
globalConfig: reqData.globalSlug ? globalConfigBySlug.get(reqData.globalSlug) : undefined,
|
|
150
158
|
req
|
|
151
159
|
}) : '';
|
|
152
160
|
return new Response(JSON.stringify({
|
|
@@ -164,8 +172,8 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
164
172
|
const reqData = data ?? req.data;
|
|
165
173
|
const result = pluginConfig.generateImage ? await pluginConfig.generateImage({
|
|
166
174
|
...data,
|
|
167
|
-
collectionConfig:
|
|
168
|
-
globalConfig:
|
|
175
|
+
collectionConfig: reqData.collectionSlug ? collectionConfigBySlug.get(reqData.collectionSlug) : undefined,
|
|
176
|
+
globalConfig: reqData.globalSlug ? globalConfigBySlug.get(reqData.globalSlug) : undefined,
|
|
169
177
|
req
|
|
170
178
|
}) : '';
|
|
171
179
|
return new Response(JSON.stringify({
|
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 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: config.collections?.find(\n (c) => c.slug === reqData.collectionSlug,\n ),\n globalConfig: config.globals?.find((g) => g.slug === reqData.globalSlug),\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: config.collections?.find(\n (c) => c.slug === reqData.collectionSlug,\n ),\n globalConfig: config.globals?.find((g) => g.slug === reqData.globalSlug),\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: config.collections?.find(\n (c) => c.slug === reqData.collectionSlug,\n ),\n globalConfig: config.globals?.find((g) => g.slug === reqData.globalSlug),\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: config.collections?.find(\n (c) => c.slug === reqData.collectionSlug,\n ),\n globalConfig: config.globals?.find((g) => g.slug === reqData.globalSlug),\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","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","reqData","result","collectionConfig","c","collectionSlug","globalConfig","globals","g","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 { 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":"AAEA,SAASA,eAAe,QAAQ,iBAAgB;AAUhD,SAASC,oBAAoB,QAAQ,oCAAmC;AACxE,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,aAAa,QAAQ,6BAA4B;AAC1D,SAASC,YAAY,QAAQ,4BAA2B;AACxD,SAASC,YAAY,QAAQ,0BAAyB;AAEtD,OAAO,MAAMC,YACX,CAACC,eACD,CAACC;QACC,MAAMC,gBAAyB;YAC7BN,cAAc,CAAC;YACfD,eAAe;gBACbQ,eAAe,OAAOH,cAAcI,kBAAkB;YACxD;YACAX,qBAAqB;gBACnBU,eAAe,OAAOH,cAAcK,wBAAwB;YAC9D;eACIL,cAAcM,oBACd;gBACEZ,eAAe;oBACbS,eAAe,OAAOH,cAAcO,kBAAkB;oBACtDC,YAAYR,aAAaM,iBAAiB;gBAC5C;aACD,GACD,EAAE;YACNT,aAAa;gBACXM,eAAe,OAAOH,cAAcS,gBAAgB;YACtD;SACD;QAED,MAAMC,YAA0B;YAC9B;gBACEC,MAAM;gBACNC,MAAM;gBACNC,QAAQ;uBACFb,cAAca,UAAU,OAAOb,aAAaa,MAAM,KAAK,aACvDb,aAAaa,MAAM,CAAC;wBAAEX;oBAAc,KACpCA;iBACL;gBACDY,eAAed,aAAac,aAAa;gBACzCC,OAAO;YACT;SACD;QAED,MAAMC,yBAAyB,IAAIC;QACnC,KAAK,MAAMC,KAAKjB,OAAOkB,WAAW,IAAI,EAAE,CAAE;YACxCH,uBAAuBI,GAAG,CAACF,EAAEG,IAAI,EAAEH;QACrC;QACA,MAAMI,qBAAqB,IAAIL;QAC/B,KAAK,MAAMM,KAAKtB,OAAOuB,OAAO,IAAI,EAAE,CAAE;YACpCF,mBAAmBF,GAAG,CAACG,EAAEF,IAAI,EAAEE;QACjC;QAEA,OAAO;YACL,GAAGtB,MAAM;YACTkB,aACElB,OAAOkB,WAAW,EAAEM,IAAI,CAACC;gBACvB,MAAM,EAAEL,IAAI,EAAE,GAAGK;gBACjB,MAAMC,YAAY3B,cAAcmB,aAAaS,SAASP;gBAEtD,IAAIM,WAAW;oBACb,IAAI3B,cAAc6B,UAAU;wBAC1B,4GAA4G;wBAC5G,MAAMC,aACJJ,WAAWK,IAAI,IACf,CAAE,CAAA,OAAOL,WAAWK,IAAI,KAAK,YAAYL,WAAWK,IAAI,CAACC,oBAAoB,AAAD,KAC5EN,WAAWb,MAAM,EAAEoB,KAAK,CAACC,QAAU,UAAUA,SAASA,MAAMvB,IAAI,KAAK;wBACvE,MAAMwB,oBAAoBT,WAAWb,MAAM,EAAEuB,WAAW,KAAKN;wBAE7D,MAAMO,UAAuBF,oBACzB;4BACE;gCACEvB,MAAM;gCACN0B,MAAM;oCACJ;wCACEzB,QAAQH;wCACRK,OAAO;oCACT;iCACD;4BACH;yBACD,GACD;4BACE;gCACEH,MAAM;gCACN0B,MAAM;oCACJ,sFAAsF;oCACtF,6FAA6F;uCACzFZ,YAAYb,QAAQ,CAAC,EAAE,EAAED,SAAS,UACtCc,YAAYb,QAAQ,CAAC,EAAE,EAAEyB,OACrBZ,WAAWb,MAAM,CAAC,EAAE,CAACyB,IAAI,GACzB;wCACE;4CACEzB,QAAQ;mDACFiB,aACAJ,WAAWb,MAAM,CAAC0B,MAAM,CACtB,CAACL,QAAU,UAAUA,SAASA,MAAMvB,IAAI,KAAK,WAE/Ce,WAAWb,MAAM;6CACtB;4CACDE,OAAOW,YAAYc,QAAQC,YAAY;wCACzC;qCACD;oCACL;wCACE5B,QAAQH;wCACRK,OAAO;oCACT;iCACD;4BACH;yBACD;wBAEL,OAAO;4BACL,GAAGW,UAAU;4BACbb,QAAQ;mCACFiB,aAAa;oCAACA;iCAAW,GAAG,EAAE;mCAC/BO;mCACCX,YAAYb,QAAQ,CAAC,EAAE,EAAED,SAAS,SAASc,WAAWb,MAAM,CAAC6B,KAAK,CAAC,KAAK,EAAE;6BAC/E;wBACH;oBACF;oBAEA,OAAO;wBACL,GAAGhB,UAAU;wBACbb,QAAQ;+BAAKa,YAAYb,UAAU,EAAE;+BAAMH;yBAAU;oBACvD;gBACF;gBAEA,OAAOgB;YACT,MAAM,EAAE;YACViB,WAAW;mBACL1C,OAAO0C,SAAS,IAAI,EAAE;gBAC1B;oBACEC,SAAS,OAAOC;wBACd,MAAMC,OAGF,MAAMD,IAAIE,IAAI;wBAElB,MAAMC,UAAUF,QAAQD,IAAIC,IAAI;wBAEhC,MAAMG,SAASjD,aAAaI,aAAa,GACrC,MAAMJ,aAAaI,aAAa,CAAC;4BAC/B,GAAG0C,IAAI;4BACPI,kBAAkBF,QAAQG,cAAc,GACpCnC,uBAAuBoC,GAAG,CAACJ,QAAQG,cAAc,IACjDE;4BACJC,cAAcN,QAAQO,UAAU,GAC5BjC,mBAAmB8B,GAAG,CAACJ,QAAQO,UAAU,IACzCF;4BACJR;wBACF,KACA;wBACJ,OAAO,IAAIW,SAASC,KAAKC,SAAS,CAAC;4BAAET;wBAAO,IAAI;4BAAEU,QAAQ;wBAAI;oBAChE;oBACAC,QAAQ;oBACRC,MAAM;gBACR;gBACA;oBACEjB,SAAS,OAAOC;wBACd,MAAMC,OAGF,MAAMD,IAAIE,IAAI;wBAElB,MAAMC,UAAUF,QAAQD,IAAIC,IAAI;wBAEhC,MAAMG,SAASjD,aAAaK,mBAAmB,GAC3C,MAAML,aAAaK,mBAAmB,CAAC;4BACrC,GAAGyC,IAAI;4BACPI,kBAAkBF,QAAQG,cAAc,GACpCnC,uBAAuBoC,GAAG,CAACJ,QAAQG,cAAc,IACjDE;4BACJC,cAAcN,QAAQO,UAAU,GAC5BjC,mBAAmB8B,GAAG,CAACJ,QAAQO,UAAU,IACzCF;4BACJR;wBACF,KACA;wBACJ,OAAO,IAAIW,SAASC,KAAKC,SAAS,CAAC;4BAAET;wBAAO,IAAI;4BAAEU,QAAQ;wBAAI;oBAChE;oBACAC,QAAQ;oBACRC,MAAM;gBACR;gBACA;oBACEjB,SAAS,OAAOC;wBACd,MAAMC,OAGF,MAAMD,IAAIE,IAAI;wBAElB,MAAMC,UAAUF,QAAQD,IAAIC,IAAI;wBAEhC,MAAMG,SAASjD,aAAaS,WAAW,GACnC,MAAMT,aAAaS,WAAW,CAAC;4BAC7B,GAAGqC,IAAI;4BACPI,kBAAkBF,QAAQG,cAAc,GACpCnC,uBAAuBoC,GAAG,CAACJ,QAAQG,cAAc,IACjDE;4BACJC,cAAcN,QAAQO,UAAU,GAC5BjC,mBAAmB8B,GAAG,CAACJ,QAAQO,UAAU,IACzCF;4BACJR;wBACF,KACA;wBACJ,OAAO,IAAIW,SAASC,KAAKC,SAAS,CAAC;4BAAET;wBAAO,IAAI;4BAAEU,QAAQ;wBAAI;oBAChE;oBACAC,QAAQ;oBACRC,MAAM;gBACR;gBACA;oBACEjB,SAAS,OAAOC;wBACd,MAAMC,OAGF,MAAMD,IAAIE,IAAI;wBAElB,MAAMC,UAAUF,QAAQD,IAAIC,IAAI;wBAEhC,MAAMG,SAASjD,aAAaO,aAAa,GACrC,MAAMP,aAAaO,aAAa,CAAC;4BAC/B,GAAGuC,IAAI;4BACPI,kBAAkBF,QAAQG,cAAc,GACpCnC,uBAAuBoC,GAAG,CAACJ,QAAQG,cAAc,IACjDE;4BACJC,cAAcN,QAAQO,UAAU,GAC5BjC,mBAAmB8B,GAAG,CAACJ,QAAQO,UAAU,IACzCF;4BACJR;wBACF,KACA;wBACJ,OAAO,IAAIW,SAASC,KAAKC,SAAS,CAAC;4BAAET;wBAAO,IAAI;4BAAEU,QAAQ;wBAAI;oBAChE;oBACAC,QAAQ;oBACRC,MAAM;gBACR;aACD;YACDrC,SACEvB,OAAOuB,OAAO,EAAEC,IAAI,CAACqC;gBACnB,MAAM,EAAEzC,IAAI,EAAE,GAAGyC;gBACjB,MAAMnC,YAAY3B,cAAcwB,SAASI,SAASP;gBAElD,IAAIM,WAAW;oBACb,IAAI3B,cAAc6B,UAAU;wBAC1B,MAAMQ,UAAuB;4BAC3B;gCACEzB,MAAM;gCACN0B,MAAM;oCACJ,sFAAsF;oCACtF,yFAAyF;uCACrFwB,QAAQjD,QAAQ,CAAC,EAAE,EAAED,SAAS,UAAUkD,QAAQjD,QAAQ,CAAC,EAAE,CAACyB,OAC5DwB,OAAOjD,MAAM,CAAC,EAAE,CAACyB,IAAI,GACrB;wCACE;4CACEzB,QAAQ;mDAAKiD,QAAQjD,UAAU,EAAE;6CAAE;4CACnCE,OAAO+C,QAAQ/C,SAAS;wCAC1B;qCACD;oCACL;wCACEF,QAAQH;wCACRK,OAAO;oCACT;iCACD;4BACH;yBACD;wBAED,OAAO;4BACL,GAAG+C,MAAM;4BACTjD,QAAQ;mCACHwB;mCACCyB,QAAQjD,QAAQ,CAAC,EAAE,EAAED,SAAS,SAASkD,OAAOjD,MAAM,CAAC6B,KAAK,CAAC,KAAK,EAAE;6BACvE;wBACH;oBACF;oBAEA,OAAO;wBACL,GAAGoB,MAAM;wBACTjD,QAAQ;+BAAKiD,QAAQjD,UAAU,EAAE;+BAAMH;yBAAU;oBACnD;gBACF;gBAEA,OAAOoD;YACT,MAAM,EAAE;YACVC,MAAM;gBACJ,GAAG9D,OAAO8D,IAAI;gBACdjE,cAAcN,gBAAgBM,cAAcG,OAAO8D,IAAI,EAAEjE,gBAAgB,CAAC;YAC5E;QACF;IACF,EAAC"}
|
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.5d5a2b2",
|
|
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-internal.
|
|
62
|
-
"@payloadcms/ui": "4.0.0-internal.
|
|
61
|
+
"@payloadcms/translations": "4.0.0-internal.5d5a2b2",
|
|
62
|
+
"@payloadcms/ui": "4.0.0-internal.5d5a2b2"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"@types/react": "19.2.14",
|
|
66
66
|
"@types/react-dom": "19.2.3",
|
|
67
|
-
"@payloadcms/next": "4.0.0-internal.
|
|
68
|
-
"
|
|
69
|
-
"
|
|
67
|
+
"@payloadcms/next": "4.0.0-internal.5d5a2b2",
|
|
68
|
+
"payload": "4.0.0-internal.5d5a2b2",
|
|
69
|
+
"@payloadcms/eslint-config": "3.28.0"
|
|
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-internal.
|
|
74
|
+
"payload": "4.0.0-internal.5d5a2b2"
|
|
75
75
|
},
|
|
76
76
|
"publishConfig": {
|
|
77
77
|
"registry": "https://registry.npmjs.org/"
|