@payloadcms/plugin-seo 3.0.0-canary.f83d96a → 3.0.0-canary.ff8c8fd
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/exports/client.d.ts +6 -0
- package/dist/exports/client.d.ts.map +1 -0
- package/dist/exports/client.js +7 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/fields.d.ts +6 -0
- package/dist/exports/fields.d.ts.map +1 -0
- package/dist/exports/fields.js +7 -0
- package/dist/exports/fields.js.map +1 -0
- package/dist/fields/MetaDescription/MetaDescriptionComponent.d.ts +8 -0
- package/dist/fields/MetaDescription/MetaDescriptionComponent.d.ts.map +1 -0
- package/dist/fields/{MetaDescription.js → MetaDescription/MetaDescriptionComponent.js} +27 -14
- package/dist/fields/MetaDescription/MetaDescriptionComponent.js.map +1 -0
- package/dist/fields/MetaDescription/index.d.ts +12 -0
- package/dist/fields/MetaDescription/index.d.ts.map +1 -0
- package/dist/fields/MetaDescription/index.js +20 -0
- package/dist/fields/MetaDescription/index.js.map +1 -0
- package/dist/fields/MetaImage/MetaImageComponent.d.ts +8 -0
- package/dist/fields/MetaImage/MetaImageComponent.d.ts.map +1 -0
- package/dist/fields/{MetaImage.js → MetaImage/MetaImageComponent.js} +32 -16
- package/dist/fields/MetaImage/MetaImageComponent.js.map +1 -0
- package/dist/fields/MetaImage/index.d.ts +13 -0
- package/dist/fields/MetaImage/index.d.ts.map +1 -0
- package/dist/fields/MetaImage/index.js +23 -0
- package/dist/fields/MetaImage/index.js.map +1 -0
- package/dist/fields/MetaTitle/MetaTitleComponent.d.ts +9 -0
- package/dist/fields/MetaTitle/MetaTitleComponent.d.ts.map +1 -0
- package/dist/fields/{MetaTitle.js → MetaTitle/MetaTitleComponent.js} +28 -15
- package/dist/fields/MetaTitle/MetaTitleComponent.js.map +1 -0
- package/dist/fields/MetaTitle/index.d.ts +12 -0
- package/dist/fields/MetaTitle/index.d.ts.map +1 -0
- package/dist/fields/MetaTitle/index.js +20 -0
- package/dist/fields/MetaTitle/index.js.map +1 -0
- package/dist/fields/Overview/OverviewComponent.d.ts +10 -0
- package/dist/fields/Overview/OverviewComponent.d.ts.map +1 -0
- package/dist/{ui/Overview.js → fields/Overview/OverviewComponent.js} +7 -4
- package/dist/fields/Overview/OverviewComponent.js.map +1 -0
- package/dist/fields/Overview/index.d.ts +26 -0
- package/dist/fields/Overview/index.d.ts.map +1 -0
- package/dist/fields/Overview/index.js +22 -0
- package/dist/fields/Overview/index.js.map +1 -0
- package/dist/fields/Preview/PreviewComponent.d.ts +10 -0
- package/dist/fields/Preview/PreviewComponent.d.ts.map +1 -0
- package/dist/{ui/Preview.js → fields/Preview/PreviewComponent.js} +15 -8
- package/dist/fields/Preview/PreviewComponent.js.map +1 -0
- package/dist/fields/Preview/index.d.ts +24 -0
- package/dist/fields/Preview/index.d.ts.map +1 -0
- package/dist/fields/Preview/index.js +22 -0
- package/dist/fields/Preview/index.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -111
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +14 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +25 -15
- package/dist/fields/MetaDescription.d.ts +0 -9
- package/dist/fields/MetaDescription.d.ts.map +0 -1
- package/dist/fields/MetaDescription.js.map +0 -1
- package/dist/fields/MetaImage.d.ts +0 -8
- package/dist/fields/MetaImage.d.ts.map +0 -1
- package/dist/fields/MetaImage.js.map +0 -1
- package/dist/fields/MetaTitle.d.ts +0 -9
- package/dist/fields/MetaTitle.d.ts.map +0 -1
- package/dist/fields/MetaTitle.js.map +0 -1
- package/dist/ui/Overview.d.ts +0 -3
- package/dist/ui/Overview.d.ts.map +0 -1
- package/dist/ui/Overview.js.map +0 -1
- package/dist/ui/Preview.d.ts +0 -8
- package/dist/ui/Preview.d.ts.map +0 -1
- package/dist/ui/Preview.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/fields/Overview/OverviewComponent.tsx"],"sourcesContent":["'use client'\n\nimport type { FormField, UIField } from 'payload'\n\nimport { useAllFormFields, useForm, useTranslation } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations/index.js'\n\nimport { defaults } from '../../defaults.js'\n\nconst {\n description: { maxLength: maxDesc, minLength: minDesc },\n title: { maxLength: maxTitle, minLength: minTitle },\n} = defaults\n\ntype OverviewProps = {\n descriptionPath?: string\n imagePath?: string\n titlePath?: string\n} & UIField\n\nexport const OverviewComponent: React.FC<OverviewProps> = ({\n descriptionPath: descriptionPathFromContext,\n imagePath: imagePathFromContext,\n titlePath: titlePathFromContext,\n}) => {\n const {\n // dispatchFields,\n getFields,\n } = useForm()\n\n const descriptionPath = descriptionPathFromContext || 'meta.description'\n const titlePath = titlePathFromContext || 'meta.title'\n const imagePath = imagePathFromContext || 'meta.image'\n\n const [\n {\n [descriptionPath]: { value: metaDesc } = {} as FormField,\n [imagePath]: { value: metaImage } = {} as FormField,\n [titlePath]: { value: metaTitle } = {} as FormField,\n },\n ] = useAllFormFields()\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n const [titleIsValid, setTitleIsValid] = useState<boolean | undefined>()\n const [descIsValid, setDescIsValid] = useState<boolean | undefined>()\n const [imageIsValid, setImageIsValid] = useState<boolean | undefined>()\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const resetAll = useCallback(() => {\n const fields = getFields()\n const fieldsWithoutMeta = fields\n fieldsWithoutMeta['meta.title'].value = ''\n fieldsWithoutMeta['meta.description'].value = ''\n fieldsWithoutMeta['meta.image'].value = ''\n // dispatchFields(fieldsWithoutMeta);\n }, [getFields])\n\n useEffect(() => {\n if (typeof metaTitle === 'string')\n setTitleIsValid(metaTitle.length >= minTitle && metaTitle.length <= maxTitle)\n if (typeof metaDesc === 'string')\n setDescIsValid(metaDesc.length >= minDesc && metaDesc.length <= maxDesc)\n setImageIsValid(Boolean(metaImage))\n }, [metaTitle, metaDesc, metaImage])\n\n const testResults = [titleIsValid, descIsValid, imageIsValid]\n\n const numberOfPasses = testResults.filter(Boolean).length\n\n return (\n <div\n style={{\n marginBottom: '20px',\n }}\n >\n <div>\n {t('plugin-seo:checksPassing', { current: numberOfPasses, max: testResults.length })}\n </div>\n </div>\n )\n}\n"],"names":["useAllFormFields","useForm","useTranslation","React","useCallback","useEffect","useState","defaults","description","maxLength","maxDesc","minLength","minDesc","title","maxTitle","minTitle","OverviewComponent","descriptionPath","descriptionPathFromContext","imagePath","imagePathFromContext","titlePath","titlePathFromContext","getFields","value","metaDesc","metaImage","metaTitle","t","titleIsValid","setTitleIsValid","descIsValid","setDescIsValid","imageIsValid","setImageIsValid","resetAll","fields","fieldsWithoutMeta","length","Boolean","testResults","numberOfPasses","filter","div","style","marginBottom","current","max"],"mappings":"AAAA;;AAIA,SAASA,gBAAgB,EAAEC,OAAO,EAAEC,cAAc,QAAQ,iBAAgB;AAC1E,OAAOC,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAI/D,SAASC,QAAQ,QAAQ,oBAAmB;AAE5C,MAAM,EACJC,aAAa,EAAEC,WAAWC,OAAO,EAAEC,WAAWC,OAAO,EAAE,EACvDC,OAAO,EAAEJ,WAAWK,QAAQ,EAAEH,WAAWI,QAAQ,EAAE,EACpD,GAAGR;AAQJ,OAAO,MAAMS,oBAA6C,CAAC,EACzDC,iBAAiBC,0BAA0B,EAC3CC,WAAWC,oBAAoB,EAC/BC,WAAWC,oBAAoB,EAChC;IACC,MAAM,EACJ,mBAAmB;IACnBC,SAAS,EACV,GAAGtB;IAEJ,MAAMgB,kBAAkBC,8BAA8B;IACtD,MAAMG,YAAYC,wBAAwB;IAC1C,MAAMH,YAAYC,wBAAwB;IAE1C,MAAM,CACJ,EACE,CAACH,gBAAgB,EAAE,EAAEO,OAAOC,QAAQ,EAAE,GAAG,CAAC,CAAc,EACxD,CAACN,UAAU,EAAE,EAAEK,OAAOE,SAAS,EAAE,GAAG,CAAC,CAAc,EACnD,CAACL,UAAU,EAAE,EAAEG,OAAOG,SAAS,EAAE,GAAG,CAAC,CAAc,EACpD,CACF,GAAG3B;IACJ,MAAM,EAAE4B,CAAC,EAAE,GAAG1B;IAEd,MAAM,CAAC2B,cAAcC,gBAAgB,GAAGxB;IACxC,MAAM,CAACyB,aAAaC,eAAe,GAAG1B;IACtC,MAAM,CAAC2B,cAAcC,gBAAgB,GAAG5B;IAExC,6DAA6D;IAC7D,MAAM6B,WAAW/B,YAAY;QAC3B,MAAMgC,SAASb;QACf,MAAMc,oBAAoBD;QAC1BC,iBAAiB,CAAC,aAAa,CAACb,KAAK,GAAG;QACxCa,iBAAiB,CAAC,mBAAmB,CAACb,KAAK,GAAG;QAC9Ca,iBAAiB,CAAC,aAAa,CAACb,KAAK,GAAG;IACxC,qCAAqC;IACvC,GAAG;QAACD;KAAU;IAEdlB,UAAU;QACR,IAAI,OAAOsB,cAAc,UACvBG,gBAAgBH,UAAUW,MAAM,IAAIvB,YAAYY,UAAUW,MAAM,IAAIxB;QACtE,IAAI,OAAOW,aAAa,UACtBO,eAAeP,SAASa,MAAM,IAAI1B,WAAWa,SAASa,MAAM,IAAI5B;QAClEwB,gBAAgBK,QAAQb;IAC1B,GAAG;QAACC;QAAWF;QAAUC;KAAU;IAEnC,MAAMc,cAAc;QAACX;QAAcE;QAAaE;KAAa;IAE7D,MAAMQ,iBAAiBD,YAAYE,MAAM,CAACH,SAASD,MAAM;IAEzD,qBACE,KAACK;QACCC,OAAO;YACLC,cAAc;QAChB;kBAEA,cAAA,KAACF;sBACEf,EAAE,4BAA4B;gBAAEkB,SAASL;gBAAgBM,KAAKP,YAAYF,MAAM;YAAC;;;AAI1F,EAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { UIField } from 'payload';
|
|
2
|
+
interface FieldFunctionProps {
|
|
3
|
+
/**
|
|
4
|
+
* Path to the description field to use for the preview
|
|
5
|
+
*
|
|
6
|
+
* @default 'meta.description'
|
|
7
|
+
*/
|
|
8
|
+
descriptionPath?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Path to the image field to use for the preview
|
|
11
|
+
*
|
|
12
|
+
* @default 'meta.image'
|
|
13
|
+
*/
|
|
14
|
+
imagePath?: string;
|
|
15
|
+
overrides?: Partial<UIField>;
|
|
16
|
+
/**
|
|
17
|
+
* Path to the title field to use for the preview
|
|
18
|
+
*
|
|
19
|
+
* @default 'meta.title'
|
|
20
|
+
*/
|
|
21
|
+
titlePath?: string;
|
|
22
|
+
}
|
|
23
|
+
type FieldFunction = ({ overrides }: FieldFunctionProps) => UIField;
|
|
24
|
+
export declare const OverviewField: FieldFunction;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Overview/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,UAAU,kBAAkB;IAC1B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,KAAK,aAAa,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAA;AAEnE,eAAO,MAAM,aAAa,EAAE,aAwB3B,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const OverviewField = ({ descriptionPath, imagePath, overrides, titlePath })=>{
|
|
2
|
+
return {
|
|
3
|
+
name: 'overview',
|
|
4
|
+
type: 'ui',
|
|
5
|
+
admin: {
|
|
6
|
+
components: {
|
|
7
|
+
Field: {
|
|
8
|
+
clientProps: {
|
|
9
|
+
descriptionPath,
|
|
10
|
+
imagePath,
|
|
11
|
+
titlePath
|
|
12
|
+
},
|
|
13
|
+
path: '@payloadcms/plugin-seo/client#OverviewComponent'
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
label: 'Overview',
|
|
18
|
+
...overrides ?? {}
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/fields/Overview/index.tsx"],"sourcesContent":["import type { UIField } from 'payload'\n\ninterface FieldFunctionProps {\n /**\n * Path to the description field to use for the preview\n *\n * @default 'meta.description'\n */\n descriptionPath?: string\n /**\n * Path to the image field to use for the preview\n *\n * @default 'meta.image'\n */\n imagePath?: string\n overrides?: Partial<UIField>\n /**\n * Path to the title field to use for the preview\n *\n * @default 'meta.title'\n */\n titlePath?: string\n}\n\ntype FieldFunction = ({ overrides }: FieldFunctionProps) => UIField\n\nexport const OverviewField: FieldFunction = ({\n descriptionPath,\n imagePath,\n overrides,\n titlePath,\n}) => {\n return {\n name: 'overview',\n type: 'ui',\n admin: {\n components: {\n Field: {\n clientProps: {\n descriptionPath,\n imagePath,\n titlePath,\n },\n path: '@payloadcms/plugin-seo/client#OverviewComponent',\n },\n },\n },\n label: 'Overview',\n ...((overrides as unknown as UIField) ?? {}),\n }\n}\n"],"names":["OverviewField","descriptionPath","imagePath","overrides","titlePath","name","type","admin","components","Field","clientProps","path","label"],"mappings":"AA0BA,OAAO,MAAMA,gBAA+B,CAAC,EAC3CC,eAAe,EACfC,SAAS,EACTC,SAAS,EACTC,SAAS,EACV;IACC,OAAO;QACLC,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXT;wBACAC;wBACAE;oBACF;oBACAO,MAAM;gBACR;YACF;QACF;QACAC,OAAO;QACP,GAAI,AAACT,aAAoC,CAAC,CAAC;IAC7C;AACF,EAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { UIField } from 'payload';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
type PreviewProps = {
|
|
4
|
+
readonly descriptionPath?: string;
|
|
5
|
+
readonly hasGenerateURLFn: boolean;
|
|
6
|
+
readonly titlePath?: string;
|
|
7
|
+
} & UIField;
|
|
8
|
+
export declare const PreviewComponent: React.FC<PreviewProps>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=PreviewComponent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewComponent.d.ts","sourceRoot":"","sources":["../../../src/fields/Preview/PreviewComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,OAAO,EAAE,MAAM,SAAS,CAAA;AASjD,OAAO,KAA8B,MAAM,OAAO,CAAA;AAKlD,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B,GAAG,OAAO,CAAA;AAEX,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CA+GnD,CAAA"}
|
|
@@ -2,23 +2,30 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useAllFormFields, useDocumentInfo, useForm, useLocale, useTranslation } from '@payloadcms/ui';
|
|
4
4
|
import React, { useEffect, useState } from 'react';
|
|
5
|
-
export const
|
|
5
|
+
export const PreviewComponent = (props)=>{
|
|
6
|
+
const { descriptionPath: descriptionPathFromContext, hasGenerateURLFn, titlePath: titlePathFromContext } = props;
|
|
6
7
|
const { t } = useTranslation();
|
|
7
8
|
const locale = useLocale();
|
|
8
9
|
const [fields] = useAllFormFields();
|
|
9
10
|
const { getData } = useForm();
|
|
10
11
|
const docInfo = useDocumentInfo();
|
|
11
|
-
const
|
|
12
|
+
const descriptionPath = descriptionPathFromContext || 'meta.description';
|
|
13
|
+
const titlePath = titlePathFromContext || 'meta.title';
|
|
14
|
+
const { [descriptionPath]: { value: metaDescription } = {}, [titlePath]: { value: metaTitle } = {} } = fields;
|
|
12
15
|
const [href, setHref] = useState();
|
|
13
16
|
useEffect(()=>{
|
|
14
17
|
const getHref = async ()=>{
|
|
15
18
|
const genURLResponse = await fetch('/api/plugin-seo/generate-url', {
|
|
16
19
|
body: JSON.stringify({
|
|
17
|
-
|
|
18
|
-
doc:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
id: docInfo.id,
|
|
21
|
+
doc: getData(),
|
|
22
|
+
docPermissions: docInfo.docPermissions,
|
|
23
|
+
hasPublishPermission: docInfo.hasPublishPermission,
|
|
24
|
+
hasSavePermission: docInfo.hasSavePermission,
|
|
25
|
+
initialData: docInfo.initialData,
|
|
26
|
+
initialState: docInfo.initialState,
|
|
27
|
+
locale: typeof locale === 'object' ? locale?.code : locale,
|
|
28
|
+
title: docInfo.title
|
|
22
29
|
}),
|
|
23
30
|
credentials: 'include',
|
|
24
31
|
headers: {
|
|
@@ -96,4 +103,4 @@ export const Preview = ({ hasGenerateURLFn })=>{
|
|
|
96
103
|
});
|
|
97
104
|
};
|
|
98
105
|
|
|
99
|
-
//# sourceMappingURL=
|
|
106
|
+
//# sourceMappingURL=PreviewComponent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/fields/Preview/PreviewComponent.tsx"],"sourcesContent":["'use client'\n\nimport type { FormField, UIField } from 'payload'\n\nimport {\n useAllFormFields,\n useDocumentInfo,\n useForm,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport React, { useEffect, useState } from 'react'\n\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations/index.js'\nimport type { GenerateURL } from '../../types.js'\n\ntype PreviewProps = {\n readonly descriptionPath?: string\n readonly hasGenerateURLFn: boolean\n readonly titlePath?: string\n} & UIField\n\nexport const PreviewComponent: React.FC<PreviewProps> = (props) => {\n const {\n descriptionPath: descriptionPathFromContext,\n hasGenerateURLFn,\n titlePath: titlePathFromContext,\n } = props\n\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n const locale = useLocale()\n const [fields] = useAllFormFields()\n const { getData } = useForm()\n const docInfo = useDocumentInfo()\n\n const descriptionPath = descriptionPathFromContext || 'meta.description'\n const titlePath = titlePathFromContext || 'meta.title'\n\n const {\n [descriptionPath]: { value: metaDescription } = {} as FormField,\n [titlePath]: { value: metaTitle } = {} as FormField,\n } = fields\n\n const [href, setHref] = useState<string>()\n\n useEffect(() => {\n const getHref = async () => {\n const genURLResponse = await fetch('/api/plugin-seo/generate-url', {\n body: JSON.stringify({\n id: docInfo.id,\n doc: getData(),\n docPermissions: docInfo.docPermissions,\n hasPublishPermission: docInfo.hasPublishPermission,\n hasSavePermission: docInfo.hasSavePermission,\n initialData: docInfo.initialData,\n initialState: docInfo.initialState,\n locale: typeof locale === 'object' ? locale?.code : locale,\n title: docInfo.title,\n } satisfies Omit<Parameters<GenerateURL>[0], 'req'>),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n const { result: newHref } = await genURLResponse.json()\n\n setHref(newHref)\n }\n\n if (hasGenerateURLFn && !href) {\n void getHref()\n }\n }, [fields, href, locale, docInfo, hasGenerateURLFn, getData])\n\n return (\n <div>\n <div>{t('plugin-seo:preview')}</div>\n <div\n style={{\n color: '#9A9A9A',\n marginBottom: '5px',\n }}\n >\n {t('plugin-seo:previewDescription')}\n </div>\n <div\n style={{\n background: 'var(--theme-elevation-50)',\n borderRadius: '5px',\n boxShadow: '0px 0px 10px rgba(0, 0, 0, 0.1)',\n maxWidth: '600px',\n padding: '20px',\n pointerEvents: 'none',\n width: '100%',\n }}\n >\n <div>\n <a\n href={href}\n style={{\n textDecoration: 'none',\n }}\n >\n {href || 'https://...'}\n </a>\n </div>\n <h4\n style={{\n margin: 0,\n }}\n >\n <a\n href=\"/\"\n style={{\n textDecoration: 'none',\n }}\n >\n {metaTitle as string}\n </a>\n </h4>\n <p\n style={{\n margin: 0,\n }}\n >\n {metaDescription as string}\n </p>\n </div>\n </div>\n )\n}\n"],"names":["useAllFormFields","useDocumentInfo","useForm","useLocale","useTranslation","React","useEffect","useState","PreviewComponent","props","descriptionPath","descriptionPathFromContext","hasGenerateURLFn","titlePath","titlePathFromContext","t","locale","fields","getData","docInfo","value","metaDescription","metaTitle","href","setHref","getHref","genURLResponse","fetch","body","JSON","stringify","id","doc","docPermissions","hasPublishPermission","hasSavePermission","initialData","initialState","code","title","credentials","headers","method","result","newHref","json","div","style","color","marginBottom","background","borderRadius","boxShadow","maxWidth","padding","pointerEvents","width","a","textDecoration","h4","margin","p"],"mappings":"AAAA;;AAIA,SACEA,gBAAgB,EAChBC,eAAe,EACfC,OAAO,EACPC,SAAS,EACTC,cAAc,QACT,iBAAgB;AACvB,OAAOC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAWlD,OAAO,MAAMC,mBAA2C,CAACC;IACvD,MAAM,EACJC,iBAAiBC,0BAA0B,EAC3CC,gBAAgB,EAChBC,WAAWC,oBAAoB,EAChC,GAAGL;IAEJ,MAAM,EAAEM,CAAC,EAAE,GAAGX;IAEd,MAAMY,SAASb;IACf,MAAM,CAACc,OAAO,GAAGjB;IACjB,MAAM,EAAEkB,OAAO,EAAE,GAAGhB;IACpB,MAAMiB,UAAUlB;IAEhB,MAAMS,kBAAkBC,8BAA8B;IACtD,MAAME,YAAYC,wBAAwB;IAE1C,MAAM,EACJ,CAACJ,gBAAgB,EAAE,EAAEU,OAAOC,eAAe,EAAE,GAAG,CAAC,CAAc,EAC/D,CAACR,UAAU,EAAE,EAAEO,OAAOE,SAAS,EAAE,GAAG,CAAC,CAAc,EACpD,GAAGL;IAEJ,MAAM,CAACM,MAAMC,QAAQ,GAAGjB;IAExBD,UAAU;QACR,MAAMmB,UAAU;YACd,MAAMC,iBAAiB,MAAMC,MAAM,gCAAgC;gBACjEC,MAAMC,KAAKC,SAAS,CAAC;oBACnBC,IAAIZ,QAAQY,EAAE;oBACdC,KAAKd;oBACLe,gBAAgBd,QAAQc,cAAc;oBACtCC,sBAAsBf,QAAQe,oBAAoB;oBAClDC,mBAAmBhB,QAAQgB,iBAAiB;oBAC5CC,aAAajB,QAAQiB,WAAW;oBAChCC,cAAclB,QAAQkB,YAAY;oBAClCrB,QAAQ,OAAOA,WAAW,WAAWA,QAAQsB,OAAOtB;oBACpDuB,OAAOpB,QAAQoB,KAAK;gBACtB;gBACAC,aAAa;gBACbC,SAAS;oBACP,gBAAgB;gBAClB;gBACAC,QAAQ;YACV;YAEA,MAAM,EAAEC,QAAQC,OAAO,EAAE,GAAG,MAAMlB,eAAemB,IAAI;YAErDrB,QAAQoB;QACV;QAEA,IAAIhC,oBAAoB,CAACW,MAAM;YAC7B,KAAKE;QACP;IACF,GAAG;QAACR;QAAQM;QAAMP;QAAQG;QAASP;QAAkBM;KAAQ;IAE7D,qBACE,MAAC4B;;0BACC,KAACA;0BAAK/B,EAAE;;0BACR,KAAC+B;gBACCC,OAAO;oBACLC,OAAO;oBACPC,cAAc;gBAChB;0BAEClC,EAAE;;0BAEL,MAAC+B;gBACCC,OAAO;oBACLG,YAAY;oBACZC,cAAc;oBACdC,WAAW;oBACXC,UAAU;oBACVC,SAAS;oBACTC,eAAe;oBACfC,OAAO;gBACT;;kCAEA,KAACV;kCACC,cAAA,KAACW;4BACClC,MAAMA;4BACNwB,OAAO;gCACLW,gBAAgB;4BAClB;sCAECnC,QAAQ;;;kCAGb,KAACoC;wBACCZ,OAAO;4BACLa,QAAQ;wBACV;kCAEA,cAAA,KAACH;4BACClC,MAAK;4BACLwB,OAAO;gCACLW,gBAAgB;4BAClB;sCAECpC;;;kCAGL,KAACuC;wBACCd,OAAO;4BACLa,QAAQ;wBACV;kCAECvC;;;;;;AAKX,EAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { UIField } from 'payload';
|
|
2
|
+
interface FieldFunctionProps {
|
|
3
|
+
/**
|
|
4
|
+
* Path to the description field to use for the preview
|
|
5
|
+
*
|
|
6
|
+
* @default 'meta.description'
|
|
7
|
+
*/
|
|
8
|
+
descriptionPath?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Tell the component if the generate function is available as configured in the plugin config
|
|
11
|
+
*/
|
|
12
|
+
hasGenerateFn?: boolean;
|
|
13
|
+
overrides?: Partial<UIField>;
|
|
14
|
+
/**
|
|
15
|
+
* Path to the title field to use for the preview
|
|
16
|
+
*
|
|
17
|
+
* @default 'meta.title'
|
|
18
|
+
*/
|
|
19
|
+
titlePath?: string;
|
|
20
|
+
}
|
|
21
|
+
type FieldFunction = ({ hasGenerateFn, overrides }: FieldFunctionProps) => UIField;
|
|
22
|
+
export declare const PreviewField: FieldFunction;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Preview/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,UAAU,kBAAkB;IAC1B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,KAAK,aAAa,GAAG,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAA;AAElF,eAAO,MAAM,YAAY,EAAE,aAwB1B,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const PreviewField = ({ descriptionPath, hasGenerateFn = false, overrides, titlePath })=>{
|
|
2
|
+
return {
|
|
3
|
+
name: 'preview',
|
|
4
|
+
type: 'ui',
|
|
5
|
+
admin: {
|
|
6
|
+
components: {
|
|
7
|
+
Field: {
|
|
8
|
+
clientProps: {
|
|
9
|
+
descriptionPath,
|
|
10
|
+
hasGenerateURLFn: hasGenerateFn,
|
|
11
|
+
titlePath
|
|
12
|
+
},
|
|
13
|
+
path: '@payloadcms/plugin-seo/client#PreviewComponent'
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
label: 'Preview',
|
|
18
|
+
...overrides ?? {}
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/fields/Preview/index.tsx"],"sourcesContent":["import type { UIField } from 'payload'\n\ninterface FieldFunctionProps {\n /**\n * Path to the description field to use for the preview\n *\n * @default 'meta.description'\n */\n descriptionPath?: string\n /**\n * Tell the component if the generate function is available as configured in the plugin config\n */\n hasGenerateFn?: boolean\n overrides?: Partial<UIField>\n /**\n * Path to the title field to use for the preview\n *\n * @default 'meta.title'\n */\n titlePath?: string\n}\n\ntype FieldFunction = ({ hasGenerateFn, overrides }: FieldFunctionProps) => UIField\n\nexport const PreviewField: FieldFunction = ({\n descriptionPath,\n hasGenerateFn = false,\n overrides,\n titlePath,\n}) => {\n return {\n name: 'preview',\n type: 'ui',\n admin: {\n components: {\n Field: {\n clientProps: {\n descriptionPath,\n hasGenerateURLFn: hasGenerateFn,\n titlePath,\n },\n path: '@payloadcms/plugin-seo/client#PreviewComponent',\n },\n },\n },\n label: 'Preview',\n ...((overrides as unknown as UIField) ?? {}),\n }\n}\n"],"names":["PreviewField","descriptionPath","hasGenerateFn","overrides","titlePath","name","type","admin","components","Field","clientProps","hasGenerateURLFn","path","label"],"mappings":"AAwBA,OAAO,MAAMA,eAA8B,CAAC,EAC1CC,eAAe,EACfC,gBAAgB,KAAK,EACrBC,SAAS,EACTC,SAAS,EACV;IACC,OAAO;QACLC,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXT;wBACAU,kBAAkBT;wBAClBE;oBACF;oBACAQ,MAAM;gBACR;YACF;QACF;QACAC,OAAO;QACP,GAAI,AAACV,aAAoC,CAAC,CAAC;IAC7C;AACF,EAAC"}
|
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,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAoC,MAAM,SAAS,CAAA;AAKvE,OAAO,KAAK,EAKV,eAAe,EAChB,MAAM,YAAY,CAAA;AASnB,eAAO,MAAM,SAAS,iBACL,eAAe,cACrB,MAAM,KAAG,MA+NjB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,102 +1,37 @@
|
|
|
1
1
|
import { addDataAndFileToRequest } from '@payloadcms/next/utilities';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { deepMergeSimple } from 'payload/shared';
|
|
3
|
+
import { MetaDescriptionField } from './fields/MetaDescription/index.js';
|
|
4
|
+
import { MetaImageField } from './fields/MetaImage/index.js';
|
|
5
|
+
import { MetaTitleField } from './fields/MetaTitle/index.js';
|
|
6
|
+
import { OverviewField } from './fields/Overview/index.js';
|
|
7
|
+
import { PreviewField } from './fields/Preview/index.js';
|
|
7
8
|
import { translations } from './translations/index.js';
|
|
8
|
-
import { Overview } from './ui/Overview.js';
|
|
9
|
-
import { Preview } from './ui/Preview.js';
|
|
10
9
|
export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
11
10
|
const seoFields = [
|
|
12
11
|
{
|
|
13
12
|
name: 'meta',
|
|
14
13
|
type: 'group',
|
|
15
14
|
fields: [
|
|
16
|
-
{
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
name: 'title',
|
|
28
|
-
type: 'text',
|
|
29
|
-
admin: {
|
|
30
|
-
components: {
|
|
31
|
-
Field: withMergedProps({
|
|
32
|
-
Component: MetaTitle,
|
|
33
|
-
sanitizeServerOnlyProps: true,
|
|
34
|
-
toMergeIntoProps: {
|
|
35
|
-
hasGenerateTitleFn: typeof pluginConfig?.generateTitle === 'function'
|
|
36
|
-
}
|
|
37
|
-
})
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
localized: true,
|
|
41
|
-
...pluginConfig?.fieldOverrides?.title ?? {}
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
name: 'description',
|
|
45
|
-
type: 'textarea',
|
|
46
|
-
admin: {
|
|
47
|
-
components: {
|
|
48
|
-
Field: withMergedProps({
|
|
49
|
-
Component: MetaDescription,
|
|
50
|
-
sanitizeServerOnlyProps: true,
|
|
51
|
-
toMergeIntoProps: {
|
|
52
|
-
hasGenerateDescriptionFn: typeof pluginConfig?.generateDescription === 'function'
|
|
53
|
-
}
|
|
54
|
-
})
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
localized: true,
|
|
58
|
-
...pluginConfig?.fieldOverrides?.description ?? {}
|
|
59
|
-
},
|
|
15
|
+
OverviewField({}),
|
|
16
|
+
MetaTitleField({
|
|
17
|
+
hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',
|
|
18
|
+
overrides: pluginConfig?.fieldOverrides?.title
|
|
19
|
+
}),
|
|
20
|
+
MetaDescriptionField({
|
|
21
|
+
hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',
|
|
22
|
+
overrides: pluginConfig?.fieldOverrides?.description
|
|
23
|
+
}),
|
|
60
24
|
...pluginConfig?.uploadsCollection ? [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
components: {
|
|
67
|
-
Field: withMergedProps({
|
|
68
|
-
Component: MetaImage,
|
|
69
|
-
sanitizeServerOnlyProps: true,
|
|
70
|
-
toMergeIntoProps: {
|
|
71
|
-
hasGenerateImageFn: typeof pluginConfig?.generateImage === 'function'
|
|
72
|
-
}
|
|
73
|
-
})
|
|
74
|
-
},
|
|
75
|
-
description: 'Maximum upload file size: 12MB. Recommended file size for images is <500KB.'
|
|
76
|
-
},
|
|
77
|
-
label: 'Meta Image',
|
|
78
|
-
localized: true,
|
|
79
|
-
relationTo: pluginConfig?.uploadsCollection,
|
|
80
|
-
...pluginConfig?.fieldOverrides?.image ?? {}
|
|
81
|
-
}
|
|
25
|
+
MetaImageField({
|
|
26
|
+
hasGenerateFn: typeof pluginConfig?.generateImage === 'function',
|
|
27
|
+
overrides: pluginConfig?.fieldOverrides?.image,
|
|
28
|
+
relationTo: pluginConfig.uploadsCollection
|
|
29
|
+
})
|
|
82
30
|
] : [],
|
|
83
31
|
...pluginConfig?.fields || [],
|
|
84
|
-
{
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
admin: {
|
|
88
|
-
components: {
|
|
89
|
-
Field: withMergedProps({
|
|
90
|
-
Component: Preview,
|
|
91
|
-
sanitizeServerOnlyProps: true,
|
|
92
|
-
toMergeIntoProps: {
|
|
93
|
-
hasGenerateURLFn: typeof pluginConfig?.generateURL === 'function'
|
|
94
|
-
}
|
|
95
|
-
})
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
label: 'Preview'
|
|
99
|
-
}
|
|
32
|
+
PreviewField({
|
|
33
|
+
hasGenerateFn: typeof pluginConfig?.generateURL === 'function'
|
|
34
|
+
})
|
|
100
35
|
],
|
|
101
36
|
interfaceName: pluginConfig.interfaceName,
|
|
102
37
|
label: 'SEO'
|
|
@@ -168,11 +103,11 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
168
103
|
...config.endpoints ?? [],
|
|
169
104
|
{
|
|
170
105
|
handler: async (req)=>{
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
106
|
+
await addDataAndFileToRequest(req);
|
|
107
|
+
const result = pluginConfig.generateTitle ? await pluginConfig.generateTitle({
|
|
108
|
+
...req.data,
|
|
109
|
+
req
|
|
110
|
+
}) : '';
|
|
176
111
|
return new Response(JSON.stringify({
|
|
177
112
|
result
|
|
178
113
|
}), {
|
|
@@ -184,11 +119,11 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
184
119
|
},
|
|
185
120
|
{
|
|
186
121
|
handler: async (req)=>{
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
122
|
+
await addDataAndFileToRequest(req);
|
|
123
|
+
const result = pluginConfig.generateDescription ? await pluginConfig.generateDescription({
|
|
124
|
+
...req.data,
|
|
125
|
+
req
|
|
126
|
+
}) : '';
|
|
192
127
|
return new Response(JSON.stringify({
|
|
193
128
|
result
|
|
194
129
|
}), {
|
|
@@ -200,11 +135,11 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
200
135
|
},
|
|
201
136
|
{
|
|
202
137
|
handler: async (req)=>{
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
138
|
+
await addDataAndFileToRequest(req);
|
|
139
|
+
const result = pluginConfig.generateURL ? await pluginConfig.generateURL({
|
|
140
|
+
...req.data,
|
|
141
|
+
req
|
|
142
|
+
}) : '';
|
|
208
143
|
return new Response(JSON.stringify({
|
|
209
144
|
result
|
|
210
145
|
}), {
|
|
@@ -216,11 +151,11 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
216
151
|
},
|
|
217
152
|
{
|
|
218
153
|
handler: async (req)=>{
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
154
|
+
await addDataAndFileToRequest(req);
|
|
155
|
+
const result = pluginConfig.generateImage ? await pluginConfig.generateImage({
|
|
156
|
+
...req.data,
|
|
157
|
+
req
|
|
158
|
+
}) : '';
|
|
224
159
|
return new Response(result, {
|
|
225
160
|
status: 200
|
|
226
161
|
});
|
|
@@ -275,9 +210,7 @@ export const seoPlugin = (pluginConfig)=>(config)=>{
|
|
|
275
210
|
}) || [],
|
|
276
211
|
i18n: {
|
|
277
212
|
...config.i18n,
|
|
278
|
-
translations:
|
|
279
|
-
...deepMerge(translations, config.i18n?.translations)
|
|
280
|
-
}
|
|
213
|
+
translations: deepMergeSimple(translations, config.i18n?.translations)
|
|
281
214
|
}
|
|
282
215
|
};
|
|
283
216
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx"],"sourcesContent":["import type { Config, Field, GroupField, TabsField, TextField } from 'payload'\n\nimport { addDataAndFileToRequest } from '@payloadcms/next/utilities'\nimport { withMergedProps } from '@payloadcms/ui/shared'\nimport { deepMerge } from 'payload/shared'\n\nimport type {\n GenerateDescription,\n GenerateImage,\n GenerateTitle,\n GenerateURL,\n SEOPluginConfig,\n} from './types.js'\n\nimport { MetaDescription } from './fields/MetaDescription.js'\nimport { MetaImage } from './fields/MetaImage.js'\nimport { MetaTitle } from './fields/MetaTitle.js'\nimport { translations } from './translations/index.js'\nimport { Overview } from './ui/Overview.js'\nimport { Preview } from './ui/Preview.js'\n\nexport const seoPlugin =\n (pluginConfig: SEOPluginConfig) =>\n (config: Config): Config => {\n const seoFields: GroupField[] = [\n {\n name: 'meta',\n type: 'group',\n fields: [\n {\n name: 'overview',\n type: 'ui',\n admin: {\n components: {\n Field: Overview,\n },\n },\n label: 'Overview',\n },\n {\n name: 'title',\n type: 'text',\n admin: {\n components: {\n Field: withMergedProps({\n Component: MetaTitle,\n sanitizeServerOnlyProps: true,\n toMergeIntoProps: {\n hasGenerateTitleFn: typeof pluginConfig?.generateTitle === 'function',\n },\n }),\n },\n },\n localized: true,\n ...((pluginConfig?.fieldOverrides?.title as unknown as TextField) ?? {}),\n },\n {\n name: 'description',\n type: 'textarea',\n admin: {\n components: {\n Field: withMergedProps({\n Component: MetaDescription,\n sanitizeServerOnlyProps: true,\n toMergeIntoProps: {\n hasGenerateDescriptionFn:\n typeof pluginConfig?.generateDescription === 'function',\n },\n }),\n },\n },\n localized: true,\n ...(pluginConfig?.fieldOverrides?.description ?? {}),\n },\n ...(pluginConfig?.uploadsCollection\n ? [\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n {\n name: 'image',\n type: 'upload',\n admin: {\n components: {\n Field: withMergedProps({\n Component: MetaImage,\n sanitizeServerOnlyProps: true,\n toMergeIntoProps: {\n hasGenerateImageFn: typeof pluginConfig?.generateImage === 'function',\n },\n }),\n },\n description:\n 'Maximum upload file size: 12MB. Recommended file size for images is <500KB.',\n },\n label: 'Meta Image',\n localized: true,\n relationTo: pluginConfig?.uploadsCollection,\n ...(pluginConfig?.fieldOverrides?.image ?? {}),\n } as Field,\n ]\n : []),\n ...(pluginConfig?.fields || []),\n {\n name: 'preview',\n type: 'ui',\n admin: {\n components: {\n Field: withMergedProps({\n Component: Preview,\n sanitizeServerOnlyProps: true,\n toMergeIntoProps: {\n hasGenerateURLFn: typeof pluginConfig?.generateURL === 'function',\n },\n }),\n },\n },\n label: 'Preview',\n },\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 reqWithData = await addDataAndFileToRequest({ request: req })\n const args: Parameters<GenerateTitle>[0] =\n reqWithData.data as unknown as Parameters<GenerateTitle>[0]\n const result = pluginConfig.generateTitle ? await pluginConfig.generateTitle(args) : ''\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 reqWithData = await addDataAndFileToRequest({ request: req })\n const args: Parameters<GenerateDescription>[0] =\n reqWithData.data as unknown as Parameters<GenerateDescription>[0]\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription(args)\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 reqWithData = await addDataAndFileToRequest({ request: req })\n const args: Parameters<GenerateURL>[0] =\n reqWithData.data as unknown as Parameters<GenerateURL>[0]\n const result = pluginConfig.generateURL ? await pluginConfig.generateURL(args) : ''\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 reqWithData = await addDataAndFileToRequest({ request: req })\n const args: Parameters<GenerateImage>[0] =\n reqWithData.data as unknown as Parameters<GenerateImage>[0]\n const result = pluginConfig.generateImage ? await pluginConfig.generateImage(args) : ''\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 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: {\n ...deepMerge(translations, config.i18n?.translations),\n },\n },\n }\n }\n"],"names":["addDataAndFileToRequest","withMergedProps","deepMerge","MetaDescription","MetaImage","MetaTitle","translations","Overview","Preview","seoPlugin","pluginConfig","config","seoFields","name","type","fields","admin","components","Field","label","Component","sanitizeServerOnlyProps","toMergeIntoProps","hasGenerateTitleFn","generateTitle","localized","fieldOverrides","title","hasGenerateDescriptionFn","generateDescription","description","uploadsCollection","hasGenerateImageFn","generateImage","relationTo","image","hasGenerateURLFn","generateURL","interfaceName","collections","map","collection","slug","isEnabled","includes","tabbedUI","emailField","auth","disableLocalStrategy","find","field","hasOnlyEmailField","length","seoTabs","tabs","filter","labels","singular","slice","endpoints","handler","req","reqWithData","request","args","data","result","Response","JSON","stringify","status","method","path","globals","global","i18n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx"],"sourcesContent":["import type { Config, GroupField, TabsField, TextField } from 'payload'\n\nimport { addDataAndFileToRequest } from '@payloadcms/next/utilities'\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 seoFields: GroupField[] = [\n {\n name: 'meta',\n type: 'group',\n fields: [\n OverviewField({}),\n MetaTitleField({\n hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',\n overrides: pluginConfig?.fieldOverrides?.title as unknown as TextField,\n }),\n MetaDescriptionField({\n hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',\n overrides: pluginConfig?.fieldOverrides?.description,\n }),\n ...(pluginConfig?.uploadsCollection\n ? [\n MetaImageField({\n hasGenerateFn: typeof pluginConfig?.generateImage === 'function',\n overrides: pluginConfig?.fieldOverrides?.image,\n relationTo: pluginConfig.uploadsCollection,\n }),\n ]\n : []),\n ...(pluginConfig?.fields || []),\n PreviewField({\n hasGenerateFn: typeof pluginConfig?.generateURL === 'function',\n }),\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 await addDataAndFileToRequest(req)\n\n const result = pluginConfig.generateTitle\n ? await pluginConfig.generateTitle({\n ...req.data,\n req,\n } as unknown as 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 addDataAndFileToRequest(req)\n\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription({\n ...req.data,\n req,\n } as unknown as 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 addDataAndFileToRequest(req)\n\n const result = pluginConfig.generateURL\n ? await pluginConfig.generateURL({\n ...req.data,\n req,\n } as unknown as 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 addDataAndFileToRequest(req)\n\n const result = pluginConfig.generateImage\n ? await pluginConfig.generateImage({\n ...req.data,\n req,\n } as unknown as Parameters<GenerateImage>[0])\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 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":["addDataAndFileToRequest","deepMergeSimple","MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField","translations","seoPlugin","pluginConfig","config","seoFields","name","type","fields","hasGenerateFn","generateTitle","overrides","fieldOverrides","title","generateDescription","description","uploadsCollection","generateImage","image","relationTo","generateURL","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","result","data","Response","JSON","stringify","status","method","path","globals","global","i18n"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
import type { DocumentInfoContext } from '@payloadcms/ui';
|
|
2
|
-
import type { Field, TextField, TextareaField, UploadField } from 'payload';
|
|
3
|
-
export type
|
|
2
|
+
import type { Field, PayloadRequest, TextField, TextareaField, UploadField } from 'payload';
|
|
3
|
+
export type PartialDocumentInfoContext = Pick<DocumentInfoContext, 'docPermissions' | 'hasPublishPermission' | 'hasSavePermission' | 'id' | 'initialData' | 'initialState' | 'preferencesKey' | 'publishedDoc' | 'slug' | 'title' | 'versionsCount'>;
|
|
4
|
+
export type GenerateTitle<T = any> = (args: {
|
|
4
5
|
doc: T;
|
|
5
6
|
locale?: string;
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
req: PayloadRequest;
|
|
8
|
+
} & PartialDocumentInfoContext) => Promise<string> | string;
|
|
9
|
+
export type GenerateDescription<T = any> = (args: {
|
|
8
10
|
doc: T;
|
|
9
11
|
locale?: string;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
req: PayloadRequest;
|
|
13
|
+
} & PartialDocumentInfoContext) => Promise<string> | string;
|
|
14
|
+
export type GenerateImage<T = any> = (args: {
|
|
12
15
|
doc: T;
|
|
13
16
|
locale?: string;
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
req: PayloadRequest;
|
|
18
|
+
} & PartialDocumentInfoContext) => Promise<string> | string;
|
|
19
|
+
export type GenerateURL<T = any> = (args: {
|
|
16
20
|
doc: T;
|
|
17
21
|
locale?: string;
|
|
18
|
-
|
|
22
|
+
req: PayloadRequest;
|
|
23
|
+
} & PartialDocumentInfoContext) => Promise<string> | string;
|
|
19
24
|
export type SEOPluginConfig = {
|
|
20
25
|
collections?: string[];
|
|
21
26
|
fieldOverrides?: {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE3F,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,mBAAmB,EACjB,gBAAgB,GAChB,sBAAsB,GACtB,mBAAmB,GACnB,IAAI,GACJ,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,cAAc,GACd,MAAM,GACN,OAAO,GACP,eAAe,CAClB,CAAA;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAAI,CACnC,IAAI,EAAE;IAAE,GAAG,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,GAAG,0BAA0B,KAChF,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;AAE7B,MAAM,MAAM,mBAAmB,CAAC,CAAC,GAAG,GAAG,IAAI,CACzC,IAAI,EAAE;IACJ,GAAG,EAAE,CAAC,CAAA;IACN,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,0BAA0B,KAC3B,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;AAE7B,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAAI,CACnC,IAAI,EAAE;IAAE,GAAG,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,GAAG,0BAA0B,KAChF,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;AAE7B,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,GAAG,IAAI,CACjC,IAAI,EAAE;IAAE,GAAG,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,GAAG,0BAA0B,KAChF,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;AAE7B,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,cAAc,CAAC,EAAE;QACf,WAAW,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;QACpC,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;QAC5B,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;KAC3B,CAAA;IACD,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;IAChB,mBAAmB,CAAC,EAAE,mBAAmB,CAAA;IACzC,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,IAAI,GAAG;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { DocumentInfoContext } from '@payloadcms/ui'\nimport type { Field, TextField, TextareaField, UploadField } from 'payload'\n\nexport type GenerateTitle<T = any> = (\n args:
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { DocumentInfoContext } from '@payloadcms/ui'\nimport type { Field, PayloadRequest, TextField, TextareaField, UploadField } from 'payload'\n\nexport type PartialDocumentInfoContext = Pick<\n DocumentInfoContext,\n | 'docPermissions'\n | 'hasPublishPermission'\n | 'hasSavePermission'\n | 'id'\n | 'initialData'\n | 'initialState'\n | 'preferencesKey'\n | 'publishedDoc'\n | 'slug'\n | 'title'\n | 'versionsCount'\n>\n\nexport type GenerateTitle<T = any> = (\n args: { doc: T; locale?: string; req: PayloadRequest } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type GenerateDescription<T = any> = (\n args: {\n doc: T\n locale?: string\n req: PayloadRequest\n } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type GenerateImage<T = any> = (\n args: { doc: T; locale?: string; req: PayloadRequest } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type GenerateURL<T = any> = (\n args: { doc: T; locale?: string; req: PayloadRequest } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type SEOPluginConfig = {\n collections?: string[]\n fieldOverrides?: {\n description?: Partial<TextareaField>\n image?: Partial<UploadField>\n title?: Partial<TextField>\n }\n fields?: Field[]\n generateDescription?: GenerateDescription\n generateImage?: GenerateImage\n generateTitle?: GenerateTitle\n generateURL?: GenerateURL\n globals?: string[]\n interfaceName?: string\n tabbedUI?: boolean\n uploadsCollection?: string\n}\n\nexport type Meta = {\n description?: string\n image?: any // TODO: type this\n keywords?: string\n title?: string\n}\n"],"names":[],"mappings":"AAwDA,WAKC"}
|