@justanarthur/payload-plugin-seo 1.3.6 → 1.3.7

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.
Files changed (39) hide show
  1. package/README.md +16 -16
  2. package/dist/fields/index.scss +7 -7
  3. package/dist/src/defaults.js.map +1 -1
  4. package/dist/src/exports/client.js.map +1 -1
  5. package/dist/src/exports/fields-components.js.map +1 -1
  6. package/dist/src/exports/fields.js.map +1 -1
  7. package/dist/src/exports/types.js.map +1 -1
  8. package/dist/src/fields/MetaDescription/MetaDescriptionComponent.js.map +1 -1
  9. package/dist/src/fields/MetaDescription/index.js.map +1 -1
  10. package/dist/src/fields/MetaImage/MetaImageComponent.js.map +1 -1
  11. package/dist/src/fields/MetaImage/index.js.map +1 -1
  12. package/dist/src/fields/MetaTitle/MetaTitleComponent.js.map +1 -1
  13. package/dist/src/fields/MetaTitle/index.js.map +1 -1
  14. package/dist/src/fields/Overview/OverviewComponent.js.map +1 -1
  15. package/dist/src/fields/Overview/index.js.map +1 -1
  16. package/dist/src/fields/Preview/PreviewComponent.js.map +1 -1
  17. package/dist/src/fields/Preview/index.js.map +1 -1
  18. package/dist/src/index.js.map +1 -1
  19. package/dist/src/openai/message.js.map +1 -1
  20. package/dist/src/translations/cs.js.map +1 -1
  21. package/dist/src/translations/de.js.map +1 -1
  22. package/dist/src/translations/en.js.map +1 -1
  23. package/dist/src/translations/es.js.map +1 -1
  24. package/dist/src/translations/fa.js.map +1 -1
  25. package/dist/src/translations/fr.js.map +1 -1
  26. package/dist/src/translations/index.js.map +1 -1
  27. package/dist/src/translations/it.js.map +1 -1
  28. package/dist/src/translations/nb.js.map +1 -1
  29. package/dist/src/translations/pl.js.map +1 -1
  30. package/dist/src/translations/ru.js.map +1 -1
  31. package/dist/src/translations/sv.js.map +1 -1
  32. package/dist/src/translations/tr.js.map +1 -1
  33. package/dist/src/translations/uk.js.map +1 -1
  34. package/dist/src/translations/vi.js.map +1 -1
  35. package/dist/src/types.js.map +1 -1
  36. package/dist/src/ui/LengthIndicator.js.map +1 -1
  37. package/dist/src/ui/Pill.js.map +1 -1
  38. package/dist/translations/translation-schema.json +96 -96
  39. package/package.json +1 -1
package/README.md CHANGED
@@ -1,16 +1,16 @@
1
- # Alternative version of official @payloadcms/plugin-seo package with AI generating improvements
2
-
3
- [Official docs](https://payloadcms.com/docs/plugins/seo)
4
-
5
- ## List of the added options:
6
-
7
- `openaiApiKey`
8
- API key for OpenAI
9
-
10
- `generateTitleAi`:
11
- Should return prompt, example: `"Generate meta SEO title for <type of site> site in language=${data.locale}"`
12
-
13
- `generateDescriptionAi`:
14
- Should return prompt, example: "`Generate meta SEO description for <type of site> site in language=${data.locale}`"
15
-
16
- The args are the same as `generateTitle` and `generateDescription`
1
+ # Alternative version of official @payloadcms/plugin-seo package with AI generating improvements
2
+
3
+ [Official docs](https://payloadcms.com/docs/plugins/seo)
4
+
5
+ ## List of the added options:
6
+
7
+ `openaiApiKey`
8
+ API key for OpenAI
9
+
10
+ `generateTitleAi`:
11
+ Should return prompt, example: `"Generate meta SEO title for <type of site> site in language=${data.locale}"`
12
+
13
+ `generateDescriptionAi`:
14
+ Should return prompt, example: "`Generate meta SEO description for <type of site> site in language=${data.locale}`"
15
+
16
+ The args are the same as `generateTitle` and `generateDescription`
@@ -1,7 +1,7 @@
1
- @layer payload-default {
2
- .plugin-seo__field {
3
- .field-label {
4
- display: inline !important;
5
- }
6
- }
7
- }
1
+ @layer payload-default {
2
+ .plugin-seo__field {
3
+ .field-label {
4
+ display: inline !important;
5
+ }
6
+ }
7
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/defaults.ts"],"sourcesContent":["export const defaults = {\n description: {\n maxLength: 150,\n minLength: 100,\n },\n title: {\n maxLength: 60,\n minLength: 50,\n },\n}\n"],"names":["defaults","description","maxLength","minLength","title"],"mappings":"AAAA,OAAO,MAAMA,WAAW;IACtBC,aAAa;QACXC,WAAW;QACXC,WAAW;IACb;IACAC,OAAO;QACLF,WAAW;QACXC,WAAW;IACb;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/defaults.ts"],"sourcesContent":["export const defaults = {\r\n description: {\r\n maxLength: 150,\r\n minLength: 100,\r\n },\r\n title: {\r\n maxLength: 60,\r\n minLength: 50,\r\n },\r\n}\r\n"],"names":["defaults","description","maxLength","minLength","title"],"mappings":"AAAA,OAAO,MAAMA,WAAW;IACtBC,aAAa;QACXC,WAAW;QACXC,WAAW;IACb;IACAC,OAAO;QACLF,WAAW;QACXC,WAAW;IACb;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/exports/client.ts"],"sourcesContent":["export { MetaDescriptionComponent } from '../fields/MetaDescription/MetaDescriptionComponent'\nexport { MetaImageComponent } from '../fields/MetaImage/MetaImageComponent'\nexport { MetaTitleComponent } from '../fields/MetaTitle/MetaTitleComponent'\nexport { OverviewComponent } from '../fields/Overview/OverviewComponent'\nexport { PreviewComponent } from '../fields/Preview/PreviewComponent'\n"],"names":["MetaDescriptionComponent","MetaImageComponent","MetaTitleComponent","OverviewComponent","PreviewComponent"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,qDAAoD;AAC7F,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,gBAAgB,QAAQ,qCAAoC"}
1
+ {"version":3,"sources":["../../../src/exports/client.ts"],"sourcesContent":["export { MetaDescriptionComponent } from '../fields/MetaDescription/MetaDescriptionComponent'\r\nexport { MetaImageComponent } from '../fields/MetaImage/MetaImageComponent'\r\nexport { MetaTitleComponent } from '../fields/MetaTitle/MetaTitleComponent'\r\nexport { OverviewComponent } from '../fields/Overview/OverviewComponent'\r\nexport { PreviewComponent } from '../fields/Preview/PreviewComponent'\r\n"],"names":["MetaDescriptionComponent","MetaImageComponent","MetaTitleComponent","OverviewComponent","PreviewComponent"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,qDAAoD;AAC7F,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,gBAAgB,QAAQ,qCAAoC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/exports/fields-components.ts"],"sourcesContent":["export { MetaDescriptionComponent } from '../fields/MetaDescription/MetaDescriptionComponent'\nexport { MetaImageComponent } from '../fields/MetaImage/MetaImageComponent'\nexport { MetaTitleComponent } from '../fields/MetaTitle/MetaTitleComponent'\nexport { OverviewComponent } from '../fields/Overview/OverviewComponent'\nexport { PreviewComponent } from '../fields/Preview/PreviewComponent'\n"],"names":["MetaDescriptionComponent","MetaImageComponent","MetaTitleComponent","OverviewComponent","PreviewComponent"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,qDAAoD;AAC7F,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,gBAAgB,QAAQ,qCAAoC"}
1
+ {"version":3,"sources":["../../../src/exports/fields-components.ts"],"sourcesContent":["export { MetaDescriptionComponent } from '../fields/MetaDescription/MetaDescriptionComponent'\r\nexport { MetaImageComponent } from '../fields/MetaImage/MetaImageComponent'\r\nexport { MetaTitleComponent } from '../fields/MetaTitle/MetaTitleComponent'\r\nexport { OverviewComponent } from '../fields/Overview/OverviewComponent'\r\nexport { PreviewComponent } from '../fields/Preview/PreviewComponent'\r\n"],"names":["MetaDescriptionComponent","MetaImageComponent","MetaTitleComponent","OverviewComponent","PreviewComponent"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,qDAAoD;AAC7F,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,gBAAgB,QAAQ,qCAAoC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/exports/fields.ts"],"sourcesContent":["export { MetaDescriptionField } from '../fields/MetaDescription'\nexport { MetaImageField } from '../fields/MetaImage'\nexport { MetaTitleField } from '../fields/MetaTitle'\nexport { OverviewField } from '../fields/Overview'\nexport { PreviewField } from '../fields/Preview'\n"],"names":["MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,YAAY,QAAQ,oBAAmB"}
1
+ {"version":3,"sources":["../../../src/exports/fields.ts"],"sourcesContent":["export { MetaDescriptionField } from '../fields/MetaDescription'\r\nexport { MetaImageField } from '../fields/MetaImage'\r\nexport { MetaTitleField } from '../fields/MetaTitle'\r\nexport { OverviewField } from '../fields/Overview'\r\nexport { PreviewField } from '../fields/Preview'\r\n"],"names":["MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,YAAY,QAAQ,oBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/exports/types.ts"],"sourcesContent":["export type {\n GenerateDescription,\n GenerateImage,\n GenerateTitle,\n GenerateURL,\n Meta,\n SEOPluginConfig,\n} from '../types'\n"],"names":[],"mappings":"AAAA,WAOiB"}
1
+ {"version":3,"sources":["../../../src/exports/types.ts"],"sourcesContent":["export type {\r\n GenerateDescription,\r\n GenerateImage,\r\n GenerateTitle,\r\n GenerateURL,\r\n Meta,\r\n SEOPluginConfig,\r\n} from '../types'\r\n"],"names":[],"mappings":"AAAA,WAOiB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/MetaDescription/MetaDescriptionComponent.tsx"],"sourcesContent":["'use client'\n\nimport type { FieldType, Options } from '@payloadcms/ui'\nimport {\n FieldLabel,\n TextareaInput,\n useConfig,\n useDocumentInfo,\n useField,\n useForm,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\nimport type { TextareaFieldClientProps } from 'payload'\nimport React, { useCallback } from 'react'\n\nimport { defaults } from '../../defaults'\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\nimport type { GenerateDescription } from '../../types'\nimport { LengthIndicator } from '../../ui/LengthIndicator'\n\nconst { maxLength: maxLengthDefault, minLength: minLengthDefault } = defaults.description\n\ntype MetaDescriptionProps = {\n readonly hasGenerateDescriptionAi: boolean\n readonly hasGenerateDescriptionFn: boolean\n} & TextareaFieldClientProps\n\nexport const MetaDescriptionComponent: React.FC<MetaDescriptionProps> = (props) => {\n const {\n field: {\n label,\n localized,\n maxLength: maxLengthFromProps,\n minLength: minLengthFromProps,\n required,\n },\n hasGenerateDescriptionAi,\n hasGenerateDescriptionFn,\n path,\n readOnly,\n } = props\n\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n const locale = useLocale()\n\n const { getData } = useForm()\n\n const docInfo = useDocumentInfo()\n\n const maxLength = maxLengthFromProps || maxLengthDefault\n\n const minLength = minLengthFromProps || minLengthDefault\n\n const { customComponents, errorMessage, setValue, showError, value }: FieldType<string> =\n useField({\n path,\n } as Options)\n\n const { AfterInput, BeforeInput, Label } = customComponents || {}\n\n const regenerateDescription = useCallback(async () => {\n if (!hasGenerateDescriptionFn) {\n return\n }\n\n const endpoint = `${serverURL}${api}/plugin-seo/generate-description`\n\n const genDescriptionResponse = await fetch(endpoint, {\n body: JSON.stringify({\n collectionSlug: docInfo.collectionSlug,\n doc: getData(),\n docPermissions: docInfo.docPermissions,\n globalSlug: docInfo.globalSlug,\n hasPublishPermission: docInfo.hasPublishPermission,\n hasSavePermission: docInfo.hasSavePermission,\n id: docInfo.id,\n initialData: docInfo.initialData,\n initialState: docInfo.initialState\n ? reduceToSerializableFields(docInfo.initialState)\n : undefined,\n locale: typeof locale === 'object' ? locale?.code : locale,\n title: docInfo.title,\n } satisfies Omit<\n Parameters<GenerateDescription>[0],\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\n >),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n const { result: generatedDescription } = await genDescriptionResponse.json()\n\n setValue(generatedDescription || '')\n }, [\n hasGenerateDescriptionFn,\n serverURL,\n api,\n docInfo.id,\n docInfo.collectionSlug,\n docInfo.docPermissions,\n docInfo.globalSlug,\n docInfo.hasPublishPermission,\n docInfo.hasSavePermission,\n docInfo.initialData,\n docInfo.initialState,\n docInfo.title,\n getData,\n locale,\n setValue,\n ])\n\n const regenerateDescriptionAi = useCallback(async () => {\n if (!hasGenerateDescriptionAi) return\n\n const genDescriptionResponse = await fetch('/api/plugin-seo/generate-description-ai', {\n body: JSON.stringify({\n collectionSlug: docInfo.collectionSlug,\n doc: getData(),\n docPermissions: docInfo.docPermissions,\n globalSlug: docInfo.globalSlug,\n hasPublishPermission: docInfo.hasPublishPermission,\n hasSavePermission: docInfo.hasSavePermission,\n id: docInfo.id,\n initialData: docInfo.initialData,\n initialState: docInfo.initialState\n ? reduceToSerializableFields(docInfo.initialState)\n : undefined,\n locale: typeof locale === 'object' ? locale?.code : locale,\n title: docInfo.title,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n const { result: generatedDescription } = await genDescriptionResponse.json()\n\n setValue(generatedDescription || '')\n }, [\n setValue,\n hasGenerateDescriptionAi,\n locale,\n docInfo.id,\n docInfo.collectionSlug,\n docInfo.docPermissions,\n docInfo.globalSlug,\n docInfo.hasPublishPermission,\n docInfo.hasSavePermission,\n docInfo.initialData,\n docInfo.initialState,\n docInfo.title,\n getData,\n ])\n\n return (\n <div\n style={{\n marginBottom: '20px',\n }}\n >\n <div\n style={{\n marginBottom: '5px',\n position: 'relative',\n }}\n >\n <div className=\"plugin-seo__field\">\n {Label ?? (\n <FieldLabel label={label} localized={localized} path={path} required={required} />\n )}\n {hasGenerateDescriptionFn && (\n <React.Fragment>\n &nbsp; &mdash; &nbsp;\n <button\n disabled={readOnly}\n onClick={() => {\n void regenerateDescription()\n }}\n style={{\n background: 'none',\n backgroundColor: 'transparent',\n border: 'none',\n color: 'currentcolor',\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n type=\"button\"\n >\n {t('plugin-seo:autoGenerate')}\n </button>\n </React.Fragment>\n )}\n {hasGenerateDescriptionAi && (\n <React.Fragment>\n &nbsp; &mdash; &nbsp;\n <button\n disabled={readOnly}\n onClick={regenerateDescriptionAi}\n style={{\n background: 'none',\n backgroundColor: 'transparent',\n border: 'none',\n color: 'currentcolor',\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n type=\"button\"\n >\n {t('plugin-seo:generateAi')}\n </button>\n </React.Fragment>\n )}\n </div>\n <div\n style={{\n color: '#9A9A9A',\n }}\n >\n {t('plugin-seo:lengthTipDescription', { maxLength, minLength })}\n <a\n href=\"https://developers.google.com/search/docs/advanced/appearance/snippet#meta-descriptions\"\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {t('plugin-seo:bestPractices')}\n </a>\n </div>\n </div>\n <div\n style={{\n marginBottom: '10px',\n position: 'relative',\n }}\n >\n <TextareaInput\n AfterInput={AfterInput}\n BeforeInput={BeforeInput}\n Error={errorMessage}\n onChange={setValue}\n path={path}\n readOnly={readOnly}\n required={required}\n showError={showError}\n style={{\n marginBottom: 0,\n }}\n value={value}\n />\n </div>\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n width: '100%',\n }}\n >\n <LengthIndicator maxLength={maxLength} minLength={minLength} text={value} />\n </div>\n </div>\n )\n}\n"],"names":["FieldLabel","TextareaInput","useConfig","useDocumentInfo","useField","useForm","useLocale","useTranslation","reduceToSerializableFields","React","useCallback","defaults","LengthIndicator","maxLength","maxLengthDefault","minLength","minLengthDefault","description","MetaDescriptionComponent","props","field","label","localized","maxLengthFromProps","minLengthFromProps","required","hasGenerateDescriptionAi","hasGenerateDescriptionFn","path","readOnly","config","routes","api","serverURL","t","locale","getData","docInfo","customComponents","errorMessage","setValue","showError","value","AfterInput","BeforeInput","Label","regenerateDescription","endpoint","genDescriptionResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","title","credentials","headers","method","result","generatedDescription","json","regenerateDescriptionAi","div","style","marginBottom","position","className","Fragment","button","disabled","onClick","background","backgroundColor","border","color","cursor","padding","textDecoration","type","a","href","rel","target","Error","onChange","alignItems","display","width","text"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/fields/MetaDescription/MetaDescriptionComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport type { FieldType, Options } from '@payloadcms/ui'\r\nimport {\r\n FieldLabel,\r\n TextareaInput,\r\n useConfig,\r\n useDocumentInfo,\r\n useField,\r\n useForm,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\r\nimport type { TextareaFieldClientProps } from 'payload'\r\nimport React, { useCallback } from 'react'\r\n\r\nimport { defaults } from '../../defaults'\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\nimport type { GenerateDescription } from '../../types'\r\nimport { LengthIndicator } from '../../ui/LengthIndicator'\r\n\r\nconst { maxLength: maxLengthDefault, minLength: minLengthDefault } = defaults.description\r\n\r\ntype MetaDescriptionProps = {\r\n readonly hasGenerateDescriptionAi: boolean\r\n readonly hasGenerateDescriptionFn: boolean\r\n} & TextareaFieldClientProps\r\n\r\nexport const MetaDescriptionComponent: React.FC<MetaDescriptionProps> = (props) => {\r\n const {\r\n field: {\r\n label,\r\n localized,\r\n maxLength: maxLengthFromProps,\r\n minLength: minLengthFromProps,\r\n required,\r\n },\r\n hasGenerateDescriptionAi,\r\n hasGenerateDescriptionFn,\r\n path,\r\n readOnly,\r\n } = props\r\n\r\n const {\r\n config: {\r\n routes: { api },\r\n serverURL,\r\n },\r\n } = useConfig()\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const locale = useLocale()\r\n\r\n const { getData } = useForm()\r\n\r\n const docInfo = useDocumentInfo()\r\n\r\n const maxLength = maxLengthFromProps || maxLengthDefault\r\n\r\n const minLength = minLengthFromProps || minLengthDefault\r\n\r\n const { customComponents, errorMessage, setValue, showError, value }: FieldType<string> =\r\n useField({\r\n path,\r\n } as Options)\r\n\r\n const { AfterInput, BeforeInput, Label } = customComponents || {}\r\n\r\n const regenerateDescription = useCallback(async () => {\r\n if (!hasGenerateDescriptionFn) {\r\n return\r\n }\r\n\r\n const endpoint = `${serverURL}${api}/plugin-seo/generate-description`\r\n\r\n const genDescriptionResponse = await fetch(endpoint, {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n } satisfies Omit<\r\n Parameters<GenerateDescription>[0],\r\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\r\n >),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: generatedDescription } = await genDescriptionResponse.json()\r\n\r\n setValue(generatedDescription || '')\r\n }, [\r\n hasGenerateDescriptionFn,\r\n serverURL,\r\n api,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n locale,\r\n setValue,\r\n ])\r\n\r\n const regenerateDescriptionAi = useCallback(async () => {\r\n if (!hasGenerateDescriptionAi) return\r\n\r\n const genDescriptionResponse = await fetch('/api/plugin-seo/generate-description-ai', {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n }),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: generatedDescription } = await genDescriptionResponse.json()\r\n\r\n setValue(generatedDescription || '')\r\n }, [\r\n setValue,\r\n hasGenerateDescriptionAi,\r\n locale,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n ])\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div\r\n style={{\r\n marginBottom: '5px',\r\n position: 'relative',\r\n }}\r\n >\r\n <div className=\"plugin-seo__field\">\r\n {Label ?? (\r\n <FieldLabel label={label} localized={localized} path={path} required={required} />\r\n )}\r\n {hasGenerateDescriptionFn && (\r\n <React.Fragment>\r\n &nbsp; &mdash; &nbsp;\r\n <button\r\n disabled={readOnly}\r\n onClick={() => {\r\n void regenerateDescription()\r\n }}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:autoGenerate')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n {hasGenerateDescriptionAi && (\r\n <React.Fragment>\r\n &nbsp; &mdash; &nbsp;\r\n <button\r\n disabled={readOnly}\r\n onClick={regenerateDescriptionAi}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:generateAi')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n color: '#9A9A9A',\r\n }}\r\n >\r\n {t('plugin-seo:lengthTipDescription', { maxLength, minLength })}\r\n <a\r\n href=\"https://developers.google.com/search/docs/advanced/appearance/snippet#meta-descriptions\"\r\n rel=\"noopener noreferrer\"\r\n target=\"_blank\"\r\n >\r\n {t('plugin-seo:bestPractices')}\r\n </a>\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n marginBottom: '10px',\r\n position: 'relative',\r\n }}\r\n >\r\n <TextareaInput\r\n AfterInput={AfterInput}\r\n BeforeInput={BeforeInput}\r\n Error={errorMessage}\r\n onChange={setValue}\r\n path={path}\r\n readOnly={readOnly}\r\n required={required}\r\n showError={showError}\r\n style={{\r\n marginBottom: 0,\r\n }}\r\n value={value}\r\n />\r\n </div>\r\n <div\r\n style={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n width: '100%',\r\n }}\r\n >\r\n <LengthIndicator maxLength={maxLength} minLength={minLength} text={value} />\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["FieldLabel","TextareaInput","useConfig","useDocumentInfo","useField","useForm","useLocale","useTranslation","reduceToSerializableFields","React","useCallback","defaults","LengthIndicator","maxLength","maxLengthDefault","minLength","minLengthDefault","description","MetaDescriptionComponent","props","field","label","localized","maxLengthFromProps","minLengthFromProps","required","hasGenerateDescriptionAi","hasGenerateDescriptionFn","path","readOnly","config","routes","api","serverURL","t","locale","getData","docInfo","customComponents","errorMessage","setValue","showError","value","AfterInput","BeforeInput","Label","regenerateDescription","endpoint","genDescriptionResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","title","credentials","headers","method","result","generatedDescription","json","regenerateDescriptionAi","div","style","marginBottom","position","className","Fragment","button","disabled","onClick","background","backgroundColor","border","color","cursor","padding","textDecoration","type","a","href","rel","target","Error","onChange","alignItems","display","width","text"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/MetaDescription/index.ts"],"sourcesContent":["// @ts-nocheck\nimport type { TextareaField } from 'payload'\n\ntype FieldFunctionProps = {\n /**\n * Tell the component if the generate AI function is available as configured in the plugin config\n */\n hasGenerateAi?: boolean\n /**\n * Tell the component if the generate function is available as configured in the plugin config\n */\n hasGenerateFn?: boolean\n overrides?: Omit<Partial<TextareaField>, 'admin'>\n}\n\ntype FieldFunction = ({\n hasGenerateAi,\n hasGenerateFn,\n overrides,\n}: FieldFunctionProps) => TextareaField\n\nexport const MetaDescriptionField: FieldFunction = ({\n hasGenerateAi = false,\n hasGenerateFn = false,\n overrides,\n}) => {\n return {\n admin: {\n components: {\n Field: {\n clientProps: {\n hasGenerateDescriptionAi: hasGenerateAi,\n hasGenerateDescriptionFn: hasGenerateFn,\n },\n path: '@justanarthur/payload-plugin-seo/fields-components#MetaDescriptionComponent',\n },\n },\n },\n localized: true,\n name: 'description',\n type: 'textarea',\n ...((overrides as TextareaField) ?? {}),\n }\n}\n"],"names":["MetaDescriptionField","hasGenerateAi","hasGenerateFn","overrides","admin","components","Field","clientProps","hasGenerateDescriptionAi","hasGenerateDescriptionFn","path","localized","name","type"],"mappings":"AAAA,cAAc;AAqBd,OAAO,MAAMA,uBAAsC,CAAC,EAClDC,gBAAgB,KAAK,EACrBC,gBAAgB,KAAK,EACrBC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXC,0BAA0BP;wBAC1BQ,0BAA0BP;oBAC5B;oBACAQ,MAAM;gBACR;YACF;QACF;QACAC,WAAW;QACXC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAA+B,CAAC,CAAC;IACxC;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/fields/MetaDescription/index.ts"],"sourcesContent":["// @ts-nocheck\r\nimport type { TextareaField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n /**\r\n * Tell the component if the generate AI function is available as configured in the plugin config\r\n */\r\n hasGenerateAi?: boolean\r\n /**\r\n * Tell the component if the generate function is available as configured in the plugin config\r\n */\r\n hasGenerateFn?: boolean\r\n overrides?: Omit<Partial<TextareaField>, 'admin'>\r\n}\r\n\r\ntype FieldFunction = ({\r\n hasGenerateAi,\r\n hasGenerateFn,\r\n overrides,\r\n}: FieldFunctionProps) => TextareaField\r\n\r\nexport const MetaDescriptionField: FieldFunction = ({\r\n hasGenerateAi = false,\r\n hasGenerateFn = false,\r\n overrides,\r\n}) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n hasGenerateDescriptionAi: hasGenerateAi,\r\n hasGenerateDescriptionFn: hasGenerateFn,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#MetaDescriptionComponent',\r\n },\r\n },\r\n },\r\n localized: true,\r\n name: 'description',\r\n type: 'textarea',\r\n ...((overrides as TextareaField) ?? {}),\r\n }\r\n}\r\n"],"names":["MetaDescriptionField","hasGenerateAi","hasGenerateFn","overrides","admin","components","Field","clientProps","hasGenerateDescriptionAi","hasGenerateDescriptionFn","path","localized","name","type"],"mappings":"AAAA,cAAc;AAqBd,OAAO,MAAMA,uBAAsC,CAAC,EAClDC,gBAAgB,KAAK,EACrBC,gBAAgB,KAAK,EACrBC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXC,0BAA0BP;wBAC1BQ,0BAA0BP;oBAC5B;oBACAQ,MAAM;gBACR;YACF;QACF;QACAC,WAAW;QACXC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAA+B,CAAC,CAAC;IACxC;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/MetaImage/MetaImageComponent.tsx"],"sourcesContent":["'use client'\n\nimport type { FieldType, Options } from '@payloadcms/ui'\nimport {\n FieldLabel,\n RenderCustomComponent,\n UploadInput,\n useConfig,\n useDocumentInfo,\n useField,\n useForm,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\nimport type { UploadFieldClientProps } from 'payload'\nimport React, { useCallback } from 'react'\n\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\nimport type { GenerateImage } from '../../types'\nimport { Pill } from '../../ui/Pill'\n\ntype MetaImageProps = {\n readonly hasGenerateImageFn: boolean\n} & UploadFieldClientProps\n\nexport const MetaImageComponent: React.FC<MetaImageProps> = (props) => {\n const {\n field: { label, localized, relationTo, required },\n hasGenerateImageFn,\n path,\n readOnly,\n } = props || {}\n\n const {\n config: {\n collections,\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const field: FieldType<string> = useField({ ...props, path } as Options)\n\n const { customComponents } = field\n\n const {\n // biome-ignore lint/suspicious/noShadowRestrictedNames: <explanation>\n Error,\n Label,\n } = customComponents || {}\n\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n const locale = useLocale()\n\n const { getData } = useForm()\n\n const docInfo = useDocumentInfo()\n\n const { setValue, showError, value } = field\n\n const regenerateImage = useCallback(async () => {\n if (!hasGenerateImageFn) {\n return\n }\n\n const endpoint = `${serverURL}${api}/plugin-seo/generate-image`\n\n const genImageResponse = await fetch(endpoint, {\n body: JSON.stringify({\n collectionSlug: docInfo.collectionSlug,\n doc: getData(),\n docPermissions: docInfo.docPermissions,\n globalSlug: docInfo.globalSlug,\n hasPublishPermission: docInfo.hasPublishPermission,\n hasSavePermission: docInfo.hasSavePermission,\n id: docInfo.id,\n initialData: docInfo.initialData,\n initialState: docInfo.initialState\n ? reduceToSerializableFields(docInfo.initialState)\n : undefined,\n locale: typeof locale === 'object' ? locale?.code : locale,\n title: docInfo.title,\n } satisfies Omit<\n Parameters<GenerateImage>[0],\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\n >),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n const generatedImage = await genImageResponse.text()\n\n setValue(generatedImage || '')\n }, [\n hasGenerateImageFn,\n serverURL,\n api,\n docInfo.id,\n docInfo.collectionSlug,\n docInfo.docPermissions,\n docInfo.globalSlug,\n docInfo.hasPublishPermission,\n docInfo.hasSavePermission,\n docInfo.initialData,\n docInfo.initialState,\n docInfo.title,\n getData,\n locale,\n setValue,\n ])\n\n const hasImage = Boolean(value)\n\n const collection = collections?.find((coll) => coll.slug === relationTo) || undefined\n\n return (\n <div\n style={{\n marginBottom: '20px',\n }}\n >\n <div\n style={{\n marginBottom: '5px',\n position: 'relative',\n }}\n >\n <div className=\"plugin-seo__field\">\n <RenderCustomComponent\n CustomComponent={Label}\n Fallback={\n <FieldLabel label={label} localized={localized} path={path} required={required} />\n }\n />\n {hasGenerateImageFn && (\n <React.Fragment>\n &nbsp; &mdash; &nbsp;\n <button\n disabled={readOnly}\n onClick={() => {\n void regenerateImage()\n }}\n style={{\n background: 'none',\n backgroundColor: 'transparent',\n border: 'none',\n color: 'currentcolor',\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n type=\"button\"\n >\n {t('plugin-seo:autoGenerate')}\n </button>\n </React.Fragment>\n )}\n </div>\n {hasGenerateImageFn && (\n <div\n style={{\n color: '#9A9A9A',\n }}\n >\n {t('plugin-seo:imageAutoGenerationTip')}\n </div>\n )}\n </div>\n <div\n style={{\n marginBottom: '10px',\n position: 'relative',\n }}\n >\n <UploadInput\n Error={Error}\n api={api}\n collection={collection}\n filterOptions={field.filterOptions}\n onChange={(incomingImage) => {\n if (incomingImage !== null) {\n if (typeof incomingImage === 'object') {\n const { id: incomingID } = incomingImage\n\n setValue(incomingID)\n } else {\n setValue(incomingImage)\n }\n } else {\n setValue(null)\n }\n }}\n path={path}\n readOnly={readOnly}\n relationTo={relationTo}\n required={required}\n serverURL={serverURL}\n showError={showError}\n style={{\n marginBottom: 0,\n }}\n value={value}\n />\n </div>\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n width: '100%',\n }}\n >\n <Pill\n backgroundColor={hasImage ? 'green' : 'red'}\n color=\"white\"\n label={hasImage ? t('plugin-seo:good') : t('plugin-seo:noImage')}\n />\n </div>\n </div>\n )\n}\n"],"names":["FieldLabel","RenderCustomComponent","UploadInput","useConfig","useDocumentInfo","useField","useForm","useLocale","useTranslation","reduceToSerializableFields","React","useCallback","Pill","MetaImageComponent","props","field","label","localized","relationTo","required","hasGenerateImageFn","path","readOnly","config","collections","routes","api","serverURL","customComponents","Error","Label","t","locale","getData","docInfo","setValue","showError","value","regenerateImage","endpoint","genImageResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","title","credentials","headers","method","generatedImage","text","hasImage","Boolean","collection","find","coll","slug","div","style","marginBottom","position","className","CustomComponent","Fallback","Fragment","button","disabled","onClick","background","backgroundColor","border","color","cursor","padding","textDecoration","type","filterOptions","onChange","incomingImage","incomingID","alignItems","display","width"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/fields/MetaImage/MetaImageComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport type { FieldType, Options } from '@payloadcms/ui'\r\nimport {\r\n FieldLabel,\r\n RenderCustomComponent,\r\n UploadInput,\r\n useConfig,\r\n useDocumentInfo,\r\n useField,\r\n useForm,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\r\nimport type { UploadFieldClientProps } from 'payload'\r\nimport React, { useCallback } from 'react'\r\n\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\nimport type { GenerateImage } from '../../types'\r\nimport { Pill } from '../../ui/Pill'\r\n\r\ntype MetaImageProps = {\r\n readonly hasGenerateImageFn: boolean\r\n} & UploadFieldClientProps\r\n\r\nexport const MetaImageComponent: React.FC<MetaImageProps> = (props) => {\r\n const {\r\n field: { label, localized, relationTo, required },\r\n hasGenerateImageFn,\r\n path,\r\n readOnly,\r\n } = props || {}\r\n\r\n const {\r\n config: {\r\n collections,\r\n routes: { api },\r\n serverURL,\r\n },\r\n } = useConfig()\r\n\r\n const field: FieldType<string> = useField({ ...props, path } as Options)\r\n\r\n const { customComponents } = field\r\n\r\n const {\r\n // biome-ignore lint/suspicious/noShadowRestrictedNames: <explanation>\r\n Error,\r\n Label,\r\n } = customComponents || {}\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const locale = useLocale()\r\n\r\n const { getData } = useForm()\r\n\r\n const docInfo = useDocumentInfo()\r\n\r\n const { setValue, showError, value } = field\r\n\r\n const regenerateImage = useCallback(async () => {\r\n if (!hasGenerateImageFn) {\r\n return\r\n }\r\n\r\n const endpoint = `${serverURL}${api}/plugin-seo/generate-image`\r\n\r\n const genImageResponse = await fetch(endpoint, {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n } satisfies Omit<\r\n Parameters<GenerateImage>[0],\r\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\r\n >),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const generatedImage = await genImageResponse.text()\r\n\r\n setValue(generatedImage || '')\r\n }, [\r\n hasGenerateImageFn,\r\n serverURL,\r\n api,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n locale,\r\n setValue,\r\n ])\r\n\r\n const hasImage = Boolean(value)\r\n\r\n const collection = collections?.find((coll) => coll.slug === relationTo) || undefined\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div\r\n style={{\r\n marginBottom: '5px',\r\n position: 'relative',\r\n }}\r\n >\r\n <div className=\"plugin-seo__field\">\r\n <RenderCustomComponent\r\n CustomComponent={Label}\r\n Fallback={\r\n <FieldLabel label={label} localized={localized} path={path} required={required} />\r\n }\r\n />\r\n {hasGenerateImageFn && (\r\n <React.Fragment>\r\n &nbsp; &mdash; &nbsp;\r\n <button\r\n disabled={readOnly}\r\n onClick={() => {\r\n void regenerateImage()\r\n }}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:autoGenerate')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n </div>\r\n {hasGenerateImageFn && (\r\n <div\r\n style={{\r\n color: '#9A9A9A',\r\n }}\r\n >\r\n {t('plugin-seo:imageAutoGenerationTip')}\r\n </div>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n marginBottom: '10px',\r\n position: 'relative',\r\n }}\r\n >\r\n <UploadInput\r\n Error={Error}\r\n api={api}\r\n collection={collection}\r\n filterOptions={field.filterOptions}\r\n onChange={(incomingImage) => {\r\n if (incomingImage !== null) {\r\n if (typeof incomingImage === 'object') {\r\n const { id: incomingID } = incomingImage\r\n\r\n setValue(incomingID)\r\n } else {\r\n setValue(incomingImage)\r\n }\r\n } else {\r\n setValue(null)\r\n }\r\n }}\r\n path={path}\r\n readOnly={readOnly}\r\n relationTo={relationTo}\r\n required={required}\r\n serverURL={serverURL}\r\n showError={showError}\r\n style={{\r\n marginBottom: 0,\r\n }}\r\n value={value}\r\n />\r\n </div>\r\n <div\r\n style={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n width: '100%',\r\n }}\r\n >\r\n <Pill\r\n backgroundColor={hasImage ? 'green' : 'red'}\r\n color=\"white\"\r\n label={hasImage ? t('plugin-seo:good') : t('plugin-seo:noImage')}\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["FieldLabel","RenderCustomComponent","UploadInput","useConfig","useDocumentInfo","useField","useForm","useLocale","useTranslation","reduceToSerializableFields","React","useCallback","Pill","MetaImageComponent","props","field","label","localized","relationTo","required","hasGenerateImageFn","path","readOnly","config","collections","routes","api","serverURL","customComponents","Error","Label","t","locale","getData","docInfo","setValue","showError","value","regenerateImage","endpoint","genImageResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","title","credentials","headers","method","generatedImage","text","hasImage","Boolean","collection","find","coll","slug","div","style","marginBottom","position","className","CustomComponent","Fallback","Fragment","button","disabled","onClick","background","backgroundColor","border","color","cursor","padding","textDecoration","type","filterOptions","onChange","incomingImage","incomingID","alignItems","display","width"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/MetaImage/index.ts"],"sourcesContent":["// @ts-nocheck\nimport type { CollectionSlug, UploadField } from 'payload'\n\ntype FieldFunctionProps = {\n /**\n * Tell the component if the generate function is available as configured in the plugin config\n */\n hasGenerateFn?: boolean\n overrides?: Partial<UploadField>\n relationTo: string\n}\n\ntype FieldFunction = ({ hasGenerateFn, overrides }: FieldFunctionProps) => UploadField\n\nexport const MetaImageField: FieldFunction = ({ hasGenerateFn = false, overrides, relationTo }) => {\n return {\n admin: {\n components: {\n Field: {\n clientProps: {\n hasGenerateImageFn: hasGenerateFn,\n },\n path: '@justanarthur/payload-plugin-seo/fields-components#MetaImageComponent',\n },\n },\n description: 'Maximum upload file size: 12MB. Recommended file size for images is <500KB.',\n },\n label: 'Meta Image',\n localized: true,\n name: 'image',\n relationTo: relationTo as CollectionSlug,\n type: 'upload',\n ...((overrides as unknown as UploadField) ?? {}),\n }\n}\n"],"names":["MetaImageField","hasGenerateFn","overrides","relationTo","admin","components","Field","clientProps","hasGenerateImageFn","path","description","label","localized","name","type"],"mappings":"AAAA,cAAc;AAcd,OAAO,MAAMA,iBAAgC,CAAC,EAAEC,gBAAgB,KAAK,EAAEC,SAAS,EAAEC,UAAU,EAAE;IAC5F,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXC,oBAAoBP;oBACtB;oBACAQ,MAAM;gBACR;YACF;YACAC,aAAa;QACf;QACAC,OAAO;QACPC,WAAW;QACXC,MAAM;QACNV,YAAYA;QACZW,MAAM;QACN,GAAI,AAACZ,aAAwC,CAAC,CAAC;IACjD;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/fields/MetaImage/index.ts"],"sourcesContent":["// @ts-nocheck\r\nimport type { CollectionSlug, UploadField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n /**\r\n * Tell the component if the generate function is available as configured in the plugin config\r\n */\r\n hasGenerateFn?: boolean\r\n overrides?: Partial<UploadField>\r\n relationTo: string\r\n}\r\n\r\ntype FieldFunction = ({ hasGenerateFn, overrides }: FieldFunctionProps) => UploadField\r\n\r\nexport const MetaImageField: FieldFunction = ({ hasGenerateFn = false, overrides, relationTo }) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n hasGenerateImageFn: hasGenerateFn,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#MetaImageComponent',\r\n },\r\n },\r\n description: 'Maximum upload file size: 12MB. Recommended file size for images is <500KB.',\r\n },\r\n label: 'Meta Image',\r\n localized: true,\r\n name: 'image',\r\n relationTo: relationTo as CollectionSlug,\r\n type: 'upload',\r\n ...((overrides as unknown as UploadField) ?? {}),\r\n }\r\n}\r\n"],"names":["MetaImageField","hasGenerateFn","overrides","relationTo","admin","components","Field","clientProps","hasGenerateImageFn","path","description","label","localized","name","type"],"mappings":"AAAA,cAAc;AAcd,OAAO,MAAMA,iBAAgC,CAAC,EAAEC,gBAAgB,KAAK,EAAEC,SAAS,EAAEC,UAAU,EAAE;IAC5F,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXC,oBAAoBP;oBACtB;oBACAQ,MAAM;gBACR;YACF;YACAC,aAAa;QACf;QACAC,OAAO;QACPC,WAAW;QACXC,MAAM;QACNV,YAAYA;QACZW,MAAM;QACN,GAAI,AAACZ,aAAwC,CAAC,CAAC;IACjD;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/MetaTitle/MetaTitleComponent.tsx"],"sourcesContent":["'use client'\n\nimport '../index.scss'\n\nimport type { FieldType, Options } from '@payloadcms/ui'\nimport {\n FieldLabel,\n TextInput,\n useConfig,\n useDocumentInfo,\n useField,\n useForm,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\nimport type { TextFieldClientProps } from 'payload'\nimport React, { useCallback } from 'react'\n\nimport { defaults } from '../../defaults'\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\nimport type { GenerateTitle } from '../../types'\nimport { LengthIndicator } from '../../ui/LengthIndicator'\n\nconst { maxLength: maxLengthDefault, minLength: minLengthDefault } = defaults.title\n\ntype MetaTitleProps = {\n readonly hasGenerateTitleAi: boolean\n readonly hasGenerateTitleFn: boolean\n} & TextFieldClientProps\n\nexport const MetaTitleComponent: React.FC<MetaTitleProps> = (props) => {\n const {\n field: { label, maxLength: maxLengthFromProps, minLength: minLengthFromProps, required },\n hasGenerateTitleAi,\n hasGenerateTitleFn,\n path,\n readOnly,\n } = props || {}\n\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const field: FieldType<string> = useField({ path } as Options)\n\n const { customComponents: { AfterInput, BeforeInput, Label } = {} } = field\n\n const locale = useLocale()\n\n const { getData } = useForm()\n\n const docInfo = useDocumentInfo()\n\n const minLength = minLengthFromProps || minLengthDefault\n\n const maxLength = maxLengthFromProps || maxLengthDefault\n\n const { errorMessage, setValue, showError, value } = field\n\n const regenerateTitle = useCallback(async () => {\n if (!hasGenerateTitleFn) {\n return\n }\n\n const endpoint = `${serverURL}${api}/plugin-seo/generate-title`\n\n const genTitleResponse = await fetch(endpoint, {\n body: JSON.stringify({\n collectionSlug: docInfo.collectionSlug,\n doc: getData(),\n docPermissions: docInfo.docPermissions,\n globalSlug: docInfo.globalSlug,\n hasPublishPermission: docInfo.hasPublishPermission,\n hasSavePermission: docInfo.hasSavePermission,\n id: docInfo.id,\n initialData: docInfo.initialData,\n initialState: docInfo.initialState\n ? reduceToSerializableFields(docInfo.initialState)\n : undefined,\n locale: typeof locale === 'object' ? locale?.code : locale,\n title: docInfo.title,\n } satisfies Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\n >),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n const { result: generatedTitle } = await genTitleResponse.json()\n\n setValue(generatedTitle || '')\n }, [\n hasGenerateTitleFn,\n serverURL,\n api,\n docInfo.id,\n docInfo.collectionSlug,\n docInfo.docPermissions,\n docInfo.globalSlug,\n docInfo.hasPublishPermission,\n docInfo.hasSavePermission,\n docInfo.initialData,\n docInfo.initialState,\n docInfo.title,\n getData,\n locale,\n setValue,\n ])\n\n const regenerateTitleAi = useCallback(async () => {\n if (!hasGenerateTitleAi) return\n\n const genTitleResponse = await fetch('/api/plugin-seo/generate-title-ai', {\n body: JSON.stringify({\n collectionSlug: docInfo.collectionSlug,\n doc: getData(),\n docPermissions: docInfo.docPermissions,\n globalSlug: docInfo.globalSlug,\n hasPublishPermission: docInfo.hasPublishPermission,\n hasSavePermission: docInfo.hasSavePermission,\n id: docInfo.id,\n initialData: docInfo.initialData,\n initialState: docInfo.initialState\n ? reduceToSerializableFields(docInfo.initialState)\n : undefined,\n locale: typeof locale === 'object' ? locale?.code : locale,\n title: docInfo.title,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n const { result: generatedTitle } = await genTitleResponse.json()\n\n setValue(generatedTitle || '')\n }, [\n setValue,\n hasGenerateTitleAi,\n locale,\n docInfo.id,\n docInfo.collectionSlug,\n docInfo.docPermissions,\n docInfo.globalSlug,\n docInfo.hasPublishPermission,\n docInfo.hasSavePermission,\n docInfo.initialData,\n docInfo.initialState,\n docInfo.title,\n getData,\n ])\n\n return (\n <div\n style={{\n marginBottom: '20px',\n }}\n >\n <div\n style={{\n marginBottom: '5px',\n position: 'relative',\n }}\n >\n <div className=\"plugin-seo__field\">\n {Label ?? <FieldLabel label={label} path={path} required={required} />}\n {hasGenerateTitleFn && (\n <React.Fragment>\n &nbsp; &mdash; &nbsp;\n <button\n disabled={readOnly}\n onClick={() => {\n void regenerateTitle()\n }}\n style={{\n background: 'none',\n backgroundColor: 'transparent',\n border: 'none',\n color: 'currentcolor',\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n type=\"button\"\n >\n {t('plugin-seo:autoGenerate')}\n </button>\n </React.Fragment>\n )}\n {hasGenerateTitleAi && (\n <React.Fragment>\n &nbsp; &mdash; &nbsp;\n <button\n onClick={regenerateTitleAi}\n style={{\n background: 'none',\n backgroundColor: 'transparent',\n border: 'none',\n color: 'currentcolor',\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n type=\"button\"\n >\n {t('plugin-seo:generateAi')}\n </button>\n </React.Fragment>\n )}\n </div>\n <div\n style={{\n color: '#9A9A9A',\n }}\n >\n {t('plugin-seo:lengthTipTitle', { maxLength, minLength })}\n <a\n href=\"https://developers.google.com/search/docs/advanced/appearance/title-link#page-titles\"\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {t('plugin-seo:bestPractices')}\n </a>\n .\n </div>\n </div>\n <div\n style={{\n marginBottom: '10px',\n position: 'relative',\n }}\n >\n <TextInput\n AfterInput={AfterInput}\n BeforeInput={BeforeInput}\n Error={errorMessage}\n onChange={setValue}\n path={path}\n readOnly={readOnly}\n required={required}\n showError={showError}\n style={{\n marginBottom: 0,\n }}\n value={value}\n />\n </div>\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n width: '100%',\n }}\n >\n <LengthIndicator maxLength={maxLength} minLength={minLength} text={value} />\n </div>\n </div>\n )\n}\n"],"names":["FieldLabel","TextInput","useConfig","useDocumentInfo","useField","useForm","useLocale","useTranslation","reduceToSerializableFields","React","useCallback","defaults","LengthIndicator","maxLength","maxLengthDefault","minLength","minLengthDefault","title","MetaTitleComponent","props","field","label","maxLengthFromProps","minLengthFromProps","required","hasGenerateTitleAi","hasGenerateTitleFn","path","readOnly","t","config","routes","api","serverURL","customComponents","AfterInput","BeforeInput","Label","locale","getData","docInfo","errorMessage","setValue","showError","value","regenerateTitle","endpoint","genTitleResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","credentials","headers","method","result","generatedTitle","json","regenerateTitleAi","div","style","marginBottom","position","className","Fragment","button","disabled","onClick","background","backgroundColor","border","color","cursor","padding","textDecoration","type","a","href","rel","target","Error","onChange","alignItems","display","width","text"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/fields/MetaTitle/MetaTitleComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport '../index.scss'\r\n\r\nimport type { FieldType, Options } from '@payloadcms/ui'\r\nimport {\r\n FieldLabel,\r\n TextInput,\r\n useConfig,\r\n useDocumentInfo,\r\n useField,\r\n useForm,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\r\nimport type { TextFieldClientProps } from 'payload'\r\nimport React, { useCallback } from 'react'\r\n\r\nimport { defaults } from '../../defaults'\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\nimport type { GenerateTitle } from '../../types'\r\nimport { LengthIndicator } from '../../ui/LengthIndicator'\r\n\r\nconst { maxLength: maxLengthDefault, minLength: minLengthDefault } = defaults.title\r\n\r\ntype MetaTitleProps = {\r\n readonly hasGenerateTitleAi: boolean\r\n readonly hasGenerateTitleFn: boolean\r\n} & TextFieldClientProps\r\n\r\nexport const MetaTitleComponent: React.FC<MetaTitleProps> = (props) => {\r\n const {\r\n field: { label, maxLength: maxLengthFromProps, minLength: minLengthFromProps, required },\r\n hasGenerateTitleAi,\r\n hasGenerateTitleFn,\r\n path,\r\n readOnly,\r\n } = props || {}\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const {\r\n config: {\r\n routes: { api },\r\n serverURL,\r\n },\r\n } = useConfig()\r\n\r\n const field: FieldType<string> = useField({ path } as Options)\r\n\r\n const { customComponents: { AfterInput, BeforeInput, Label } = {} } = field\r\n\r\n const locale = useLocale()\r\n\r\n const { getData } = useForm()\r\n\r\n const docInfo = useDocumentInfo()\r\n\r\n const minLength = minLengthFromProps || minLengthDefault\r\n\r\n const maxLength = maxLengthFromProps || maxLengthDefault\r\n\r\n const { errorMessage, setValue, showError, value } = field\r\n\r\n const regenerateTitle = useCallback(async () => {\r\n if (!hasGenerateTitleFn) {\r\n return\r\n }\r\n\r\n const endpoint = `${serverURL}${api}/plugin-seo/generate-title`\r\n\r\n const genTitleResponse = await fetch(endpoint, {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n } satisfies Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\r\n >),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: generatedTitle } = await genTitleResponse.json()\r\n\r\n setValue(generatedTitle || '')\r\n }, [\r\n hasGenerateTitleFn,\r\n serverURL,\r\n api,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n locale,\r\n setValue,\r\n ])\r\n\r\n const regenerateTitleAi = useCallback(async () => {\r\n if (!hasGenerateTitleAi) return\r\n\r\n const genTitleResponse = await fetch('/api/plugin-seo/generate-title-ai', {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n }),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: generatedTitle } = await genTitleResponse.json()\r\n\r\n setValue(generatedTitle || '')\r\n }, [\r\n setValue,\r\n hasGenerateTitleAi,\r\n locale,\r\n docInfo.id,\r\n docInfo.collectionSlug,\r\n docInfo.docPermissions,\r\n docInfo.globalSlug,\r\n docInfo.hasPublishPermission,\r\n docInfo.hasSavePermission,\r\n docInfo.initialData,\r\n docInfo.initialState,\r\n docInfo.title,\r\n getData,\r\n ])\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div\r\n style={{\r\n marginBottom: '5px',\r\n position: 'relative',\r\n }}\r\n >\r\n <div className=\"plugin-seo__field\">\r\n {Label ?? <FieldLabel label={label} path={path} required={required} />}\r\n {hasGenerateTitleFn && (\r\n <React.Fragment>\r\n &nbsp; &mdash; &nbsp;\r\n <button\r\n disabled={readOnly}\r\n onClick={() => {\r\n void regenerateTitle()\r\n }}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:autoGenerate')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n {hasGenerateTitleAi && (\r\n <React.Fragment>\r\n &nbsp; &mdash; &nbsp;\r\n <button\r\n onClick={regenerateTitleAi}\r\n style={{\r\n background: 'none',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n color: 'currentcolor',\r\n cursor: 'pointer',\r\n padding: 0,\r\n textDecoration: 'underline',\r\n }}\r\n type=\"button\"\r\n >\r\n {t('plugin-seo:generateAi')}\r\n </button>\r\n </React.Fragment>\r\n )}\r\n </div>\r\n <div\r\n style={{\r\n color: '#9A9A9A',\r\n }}\r\n >\r\n {t('plugin-seo:lengthTipTitle', { maxLength, minLength })}\r\n <a\r\n href=\"https://developers.google.com/search/docs/advanced/appearance/title-link#page-titles\"\r\n rel=\"noopener noreferrer\"\r\n target=\"_blank\"\r\n >\r\n {t('plugin-seo:bestPractices')}\r\n </a>\r\n .\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n marginBottom: '10px',\r\n position: 'relative',\r\n }}\r\n >\r\n <TextInput\r\n AfterInput={AfterInput}\r\n BeforeInput={BeforeInput}\r\n Error={errorMessage}\r\n onChange={setValue}\r\n path={path}\r\n readOnly={readOnly}\r\n required={required}\r\n showError={showError}\r\n style={{\r\n marginBottom: 0,\r\n }}\r\n value={value}\r\n />\r\n </div>\r\n <div\r\n style={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n width: '100%',\r\n }}\r\n >\r\n <LengthIndicator maxLength={maxLength} minLength={minLength} text={value} />\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["FieldLabel","TextInput","useConfig","useDocumentInfo","useField","useForm","useLocale","useTranslation","reduceToSerializableFields","React","useCallback","defaults","LengthIndicator","maxLength","maxLengthDefault","minLength","minLengthDefault","title","MetaTitleComponent","props","field","label","maxLengthFromProps","minLengthFromProps","required","hasGenerateTitleAi","hasGenerateTitleFn","path","readOnly","t","config","routes","api","serverURL","customComponents","AfterInput","BeforeInput","Label","locale","getData","docInfo","errorMessage","setValue","showError","value","regenerateTitle","endpoint","genTitleResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","credentials","headers","method","result","generatedTitle","json","regenerateTitleAi","div","style","marginBottom","position","className","Fragment","button","disabled","onClick","background","backgroundColor","border","color","cursor","padding","textDecoration","type","a","href","rel","target","Error","onChange","alignItems","display","width","text"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/MetaTitle/index.ts"],"sourcesContent":["// @ts-nocheck\nimport type { TextField } from 'payload'\n\ntype FieldFunctionProps = {\n /**\n * Tell the component if the generate AI function is available as configured in the plugin config\n */\n hasGenerateAi?: boolean\n /**\n * Tell the component if the generate function is available as configured in the plugin config\n */\n hasGenerateFn?: boolean\n overrides?: Partial<TextField>\n}\n\ntype FieldFunction = ({ hasGenerateAi, hasGenerateFn, overrides }: FieldFunctionProps) => TextField\n\nexport const MetaTitleField: FieldFunction = ({\n hasGenerateAi = false,\n hasGenerateFn = false,\n overrides,\n}) => {\n return {\n admin: {\n components: {\n Field: {\n clientProps: {\n hasGenerateTitleAi: hasGenerateAi,\n hasGenerateTitleFn: hasGenerateFn,\n },\n path: '@justanarthur/payload-plugin-seo/fields-components#MetaTitleComponent',\n },\n },\n },\n localized: true,\n name: 'title',\n type: 'text',\n ...((overrides as unknown as TextField) ?? {}),\n }\n}\n"],"names":["MetaTitleField","hasGenerateAi","hasGenerateFn","overrides","admin","components","Field","clientProps","hasGenerateTitleAi","hasGenerateTitleFn","path","localized","name","type"],"mappings":"AAAA,cAAc;AAiBd,OAAO,MAAMA,iBAAgC,CAAC,EAC5CC,gBAAgB,KAAK,EACrBC,gBAAgB,KAAK,EACrBC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXC,oBAAoBP;wBACpBQ,oBAAoBP;oBACtB;oBACAQ,MAAM;gBACR;YACF;QACF;QACAC,WAAW;QACXC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAAsC,CAAC,CAAC;IAC/C;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/fields/MetaTitle/index.ts"],"sourcesContent":["// @ts-nocheck\r\nimport type { TextField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n /**\r\n * Tell the component if the generate AI function is available as configured in the plugin config\r\n */\r\n hasGenerateAi?: boolean\r\n /**\r\n * Tell the component if the generate function is available as configured in the plugin config\r\n */\r\n hasGenerateFn?: boolean\r\n overrides?: Partial<TextField>\r\n}\r\n\r\ntype FieldFunction = ({ hasGenerateAi, hasGenerateFn, overrides }: FieldFunctionProps) => TextField\r\n\r\nexport const MetaTitleField: FieldFunction = ({\r\n hasGenerateAi = false,\r\n hasGenerateFn = false,\r\n overrides,\r\n}) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n hasGenerateTitleAi: hasGenerateAi,\r\n hasGenerateTitleFn: hasGenerateFn,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#MetaTitleComponent',\r\n },\r\n },\r\n },\r\n localized: true,\r\n name: 'title',\r\n type: 'text',\r\n ...((overrides as unknown as TextField) ?? {}),\r\n }\r\n}\r\n"],"names":["MetaTitleField","hasGenerateAi","hasGenerateFn","overrides","admin","components","Field","clientProps","hasGenerateTitleAi","hasGenerateTitleFn","path","localized","name","type"],"mappings":"AAAA,cAAc;AAiBd,OAAO,MAAMA,iBAAgC,CAAC,EAC5CC,gBAAgB,KAAK,EACrBC,gBAAgB,KAAK,EACrBC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXC,oBAAoBP;wBACpBQ,oBAAoBP;oBACtB;oBACAQ,MAAM;gBACR;YACF;QACF;QACAC,WAAW;QACXC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAAsC,CAAC,CAAC;IAC/C;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/Overview/OverviewComponent.tsx"],"sourcesContent":["'use client'\n\nimport { useAllFormFields, useForm, useTranslation } from '@payloadcms/ui'\nimport type { FormField, UIField } from 'payload'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { defaults } from '../../defaults'\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\n\nconst {\n description: { maxLength: maxDescDefault, minLength: minDescDefault },\n title: { maxLength: maxTitleDefault, minLength: minTitleDefault },\n} = defaults\n\ntype OverviewProps = {\n descriptionOverrides?: {\n maxLength?: number\n minLength?: number\n }\n descriptionPath?: string\n imagePath?: string\n titleOverrides?: {\n maxLength?: number\n minLength?: number\n }\n titlePath?: string\n} & UIField\n\nexport const OverviewComponent: React.FC<OverviewProps> = ({\n descriptionOverrides,\n descriptionPath: descriptionPathFromContext,\n imagePath: imagePathFromContext,\n titleOverrides,\n titlePath: titlePathFromContext,\n}) => {\n const { getFields } = useForm()\n\n const descriptionPath = descriptionPathFromContext || 'meta.description'\n\n const titlePath = titlePathFromContext || 'meta.title'\n\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\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n const [titleIsValid, setTitleIsValid] = useState<boolean | undefined>()\n\n const [descIsValid, setDescIsValid] = useState<boolean | undefined>()\n\n const [imageIsValid, setImageIsValid] = useState<boolean | undefined>()\n\n const minDesc = descriptionOverrides?.minLength || minDescDefault\n\n const maxDesc = descriptionOverrides?.maxLength || maxDescDefault\n\n const minTitle = titleOverrides?.minLength || minTitleDefault\n\n const maxTitle = titleOverrides?.maxLength || maxTitleDefault\n\n const resetAll = useCallback(() => {\n const fields = getFields()\n\n const fieldsWithoutMeta = fields\n\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 }\n if (typeof metaDesc === 'string') {\n setDescIsValid(metaDesc.length >= minDesc && metaDesc.length <= maxDesc)\n }\n setImageIsValid(Boolean(metaImage))\n }, [metaTitle, metaDesc, metaImage, maxDesc, maxTitle, minDesc, minTitle])\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', {\n current: numberOfPasses,\n max: testResults.length,\n })}\n </div>\n </div>\n )\n}\n"],"names":["useAllFormFields","useForm","useTranslation","React","useCallback","useEffect","useState","defaults","description","maxLength","maxDescDefault","minLength","minDescDefault","title","maxTitleDefault","minTitleDefault","OverviewComponent","descriptionOverrides","descriptionPath","descriptionPathFromContext","imagePath","imagePathFromContext","titleOverrides","titlePath","titlePathFromContext","getFields","value","metaDesc","metaImage","metaTitle","t","titleIsValid","setTitleIsValid","descIsValid","setDescIsValid","imageIsValid","setImageIsValid","minDesc","maxDesc","minTitle","maxTitle","resetAll","fields","fieldsWithoutMeta","length","Boolean","testResults","numberOfPasses","filter","div","style","marginBottom","current","max"],"mappings":"AAAA;;AAEA,SAASA,gBAAgB,EAAEC,OAAO,EAAEC,cAAc,QAAQ,iBAAgB;AAE1E,OAAOC,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAE/D,SAASC,QAAQ,QAAQ,iBAAgB;AAGzC,MAAM,EACJC,aAAa,EAAEC,WAAWC,cAAc,EAAEC,WAAWC,cAAc,EAAE,EACrEC,OAAO,EAAEJ,WAAWK,eAAe,EAAEH,WAAWI,eAAe,EAAE,EAClE,GAAGR;AAgBJ,OAAO,MAAMS,oBAA6C,CAAC,EACzDC,oBAAoB,EACpBC,iBAAiBC,0BAA0B,EAC3CC,WAAWC,oBAAoB,EAC/BC,cAAc,EACdC,WAAWC,oBAAoB,EAChC;IACC,MAAM,EAAEC,SAAS,EAAE,GAAGxB;IAEtB,MAAMiB,kBAAkBC,8BAA8B;IAEtD,MAAMI,YAAYC,wBAAwB;IAE1C,MAAMJ,YAAYC,wBAAwB;IAE1C,MAAM,CACJ,EACE,CAACH,gBAAgB,EAAE,EAAEQ,OAAOC,QAAQ,EAAE,GAAG,CAAC,CAAc,EACxD,CAACP,UAAU,EAAE,EAAEM,OAAOE,SAAS,EAAE,GAAG,CAAC,CAAc,EACnD,CAACL,UAAU,EAAE,EAAEG,OAAOG,SAAS,EAAE,GAAG,CAAC,CAAc,EACpD,CACF,GAAG7B;IAEJ,MAAM,EAAE8B,CAAC,EAAE,GAAG5B;IAEd,MAAM,CAAC6B,cAAcC,gBAAgB,GAAG1B;IAExC,MAAM,CAAC2B,aAAaC,eAAe,GAAG5B;IAEtC,MAAM,CAAC6B,cAAcC,gBAAgB,GAAG9B;IAExC,MAAM+B,UAAUpB,sBAAsBN,aAAaC;IAEnD,MAAM0B,UAAUrB,sBAAsBR,aAAaC;IAEnD,MAAM6B,WAAWjB,gBAAgBX,aAAaI;IAE9C,MAAMyB,WAAWlB,gBAAgBb,aAAaK;IAE9C,MAAM2B,WAAWrC,YAAY;QAC3B,MAAMsC,SAASjB;QAEf,MAAMkB,oBAAoBD;QAE1BC,iBAAiB,CAAC,aAAa,CAACjB,KAAK,GAAG;QACxCiB,iBAAiB,CAAC,mBAAmB,CAACjB,KAAK,GAAG;QAC9CiB,iBAAiB,CAAC,aAAa,CAACjB,KAAK,GAAG;IACxC,qCAAqC;IACvC,GAAG;QAACD;KAAU;IAEdpB,UAAU;QACR,IAAI,OAAOwB,cAAc,UAAU;YACjCG,gBAAgBH,UAAUe,MAAM,IAAIL,YAAYV,UAAUe,MAAM,IAAIJ;QACtE;QACA,IAAI,OAAOb,aAAa,UAAU;YAChCO,eAAeP,SAASiB,MAAM,IAAIP,WAAWV,SAASiB,MAAM,IAAIN;QAClE;QACAF,gBAAgBS,QAAQjB;IAC1B,GAAG;QAACC;QAAWF;QAAUC;QAAWU;QAASE;QAAUH;QAASE;KAAS;IAEzE,MAAMO,cAAc;QAACf;QAAcE;QAAaE;KAAa;IAE7D,MAAMY,iBAAiBD,YAAYE,MAAM,CAACH,SAASD,MAAM;IAEzD,qBACE,KAACK;QACCC,OAAO;YACLC,cAAc;QAChB;kBAEA,cAAA,KAACF;sBACEnB,EAAE,4BAA4B;gBAC7BsB,SAASL;gBACTM,KAAKP,YAAYF,MAAM;YACzB;;;AAIR,EAAC"}
1
+ {"version":3,"sources":["../../../../src/fields/Overview/OverviewComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useAllFormFields, useForm, useTranslation } from '@payloadcms/ui'\r\nimport type { FormField, UIField } from 'payload'\r\nimport React, { useCallback, useEffect, useState } from 'react'\r\n\r\nimport { defaults } from '../../defaults'\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\n\r\nconst {\r\n description: { maxLength: maxDescDefault, minLength: minDescDefault },\r\n title: { maxLength: maxTitleDefault, minLength: minTitleDefault },\r\n} = defaults\r\n\r\ntype OverviewProps = {\r\n descriptionOverrides?: {\r\n maxLength?: number\r\n minLength?: number\r\n }\r\n descriptionPath?: string\r\n imagePath?: string\r\n titleOverrides?: {\r\n maxLength?: number\r\n minLength?: number\r\n }\r\n titlePath?: string\r\n} & UIField\r\n\r\nexport const OverviewComponent: React.FC<OverviewProps> = ({\r\n descriptionOverrides,\r\n descriptionPath: descriptionPathFromContext,\r\n imagePath: imagePathFromContext,\r\n titleOverrides,\r\n titlePath: titlePathFromContext,\r\n}) => {\r\n const { getFields } = useForm()\r\n\r\n const descriptionPath = descriptionPathFromContext || 'meta.description'\r\n\r\n const titlePath = titlePathFromContext || 'meta.title'\r\n\r\n const imagePath = imagePathFromContext || 'meta.image'\r\n\r\n const [\r\n {\r\n [descriptionPath]: { value: metaDesc } = {} as FormField,\r\n [imagePath]: { value: metaImage } = {} as FormField,\r\n [titlePath]: { value: metaTitle } = {} as FormField,\r\n },\r\n ] = useAllFormFields()\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const [titleIsValid, setTitleIsValid] = useState<boolean | undefined>()\r\n\r\n const [descIsValid, setDescIsValid] = useState<boolean | undefined>()\r\n\r\n const [imageIsValid, setImageIsValid] = useState<boolean | undefined>()\r\n\r\n const minDesc = descriptionOverrides?.minLength || minDescDefault\r\n\r\n const maxDesc = descriptionOverrides?.maxLength || maxDescDefault\r\n\r\n const minTitle = titleOverrides?.minLength || minTitleDefault\r\n\r\n const maxTitle = titleOverrides?.maxLength || maxTitleDefault\r\n\r\n const resetAll = useCallback(() => {\r\n const fields = getFields()\r\n\r\n const fieldsWithoutMeta = fields\r\n\r\n fieldsWithoutMeta['meta.title'].value = ''\r\n fieldsWithoutMeta['meta.description'].value = ''\r\n fieldsWithoutMeta['meta.image'].value = ''\r\n // dispatchFields(fieldsWithoutMeta);\r\n }, [getFields])\r\n\r\n useEffect(() => {\r\n if (typeof metaTitle === 'string') {\r\n setTitleIsValid(metaTitle.length >= minTitle && metaTitle.length <= maxTitle)\r\n }\r\n if (typeof metaDesc === 'string') {\r\n setDescIsValid(metaDesc.length >= minDesc && metaDesc.length <= maxDesc)\r\n }\r\n setImageIsValid(Boolean(metaImage))\r\n }, [metaTitle, metaDesc, metaImage, maxDesc, maxTitle, minDesc, minTitle])\r\n\r\n const testResults = [titleIsValid, descIsValid, imageIsValid]\r\n\r\n const numberOfPasses = testResults.filter(Boolean).length\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div>\r\n {t('plugin-seo:checksPassing', {\r\n current: numberOfPasses,\r\n max: testResults.length,\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["useAllFormFields","useForm","useTranslation","React","useCallback","useEffect","useState","defaults","description","maxLength","maxDescDefault","minLength","minDescDefault","title","maxTitleDefault","minTitleDefault","OverviewComponent","descriptionOverrides","descriptionPath","descriptionPathFromContext","imagePath","imagePathFromContext","titleOverrides","titlePath","titlePathFromContext","getFields","value","metaDesc","metaImage","metaTitle","t","titleIsValid","setTitleIsValid","descIsValid","setDescIsValid","imageIsValid","setImageIsValid","minDesc","maxDesc","minTitle","maxTitle","resetAll","fields","fieldsWithoutMeta","length","Boolean","testResults","numberOfPasses","filter","div","style","marginBottom","current","max"],"mappings":"AAAA;;AAEA,SAASA,gBAAgB,EAAEC,OAAO,EAAEC,cAAc,QAAQ,iBAAgB;AAE1E,OAAOC,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAE/D,SAASC,QAAQ,QAAQ,iBAAgB;AAGzC,MAAM,EACJC,aAAa,EAAEC,WAAWC,cAAc,EAAEC,WAAWC,cAAc,EAAE,EACrEC,OAAO,EAAEJ,WAAWK,eAAe,EAAEH,WAAWI,eAAe,EAAE,EAClE,GAAGR;AAgBJ,OAAO,MAAMS,oBAA6C,CAAC,EACzDC,oBAAoB,EACpBC,iBAAiBC,0BAA0B,EAC3CC,WAAWC,oBAAoB,EAC/BC,cAAc,EACdC,WAAWC,oBAAoB,EAChC;IACC,MAAM,EAAEC,SAAS,EAAE,GAAGxB;IAEtB,MAAMiB,kBAAkBC,8BAA8B;IAEtD,MAAMI,YAAYC,wBAAwB;IAE1C,MAAMJ,YAAYC,wBAAwB;IAE1C,MAAM,CACJ,EACE,CAACH,gBAAgB,EAAE,EAAEQ,OAAOC,QAAQ,EAAE,GAAG,CAAC,CAAc,EACxD,CAACP,UAAU,EAAE,EAAEM,OAAOE,SAAS,EAAE,GAAG,CAAC,CAAc,EACnD,CAACL,UAAU,EAAE,EAAEG,OAAOG,SAAS,EAAE,GAAG,CAAC,CAAc,EACpD,CACF,GAAG7B;IAEJ,MAAM,EAAE8B,CAAC,EAAE,GAAG5B;IAEd,MAAM,CAAC6B,cAAcC,gBAAgB,GAAG1B;IAExC,MAAM,CAAC2B,aAAaC,eAAe,GAAG5B;IAEtC,MAAM,CAAC6B,cAAcC,gBAAgB,GAAG9B;IAExC,MAAM+B,UAAUpB,sBAAsBN,aAAaC;IAEnD,MAAM0B,UAAUrB,sBAAsBR,aAAaC;IAEnD,MAAM6B,WAAWjB,gBAAgBX,aAAaI;IAE9C,MAAMyB,WAAWlB,gBAAgBb,aAAaK;IAE9C,MAAM2B,WAAWrC,YAAY;QAC3B,MAAMsC,SAASjB;QAEf,MAAMkB,oBAAoBD;QAE1BC,iBAAiB,CAAC,aAAa,CAACjB,KAAK,GAAG;QACxCiB,iBAAiB,CAAC,mBAAmB,CAACjB,KAAK,GAAG;QAC9CiB,iBAAiB,CAAC,aAAa,CAACjB,KAAK,GAAG;IACxC,qCAAqC;IACvC,GAAG;QAACD;KAAU;IAEdpB,UAAU;QACR,IAAI,OAAOwB,cAAc,UAAU;YACjCG,gBAAgBH,UAAUe,MAAM,IAAIL,YAAYV,UAAUe,MAAM,IAAIJ;QACtE;QACA,IAAI,OAAOb,aAAa,UAAU;YAChCO,eAAeP,SAASiB,MAAM,IAAIP,WAAWV,SAASiB,MAAM,IAAIN;QAClE;QACAF,gBAAgBS,QAAQjB;IAC1B,GAAG;QAACC;QAAWF;QAAUC;QAAWU;QAASE;QAAUH;QAASE;KAAS;IAEzE,MAAMO,cAAc;QAACf;QAAcE;QAAaE;KAAa;IAE7D,MAAMY,iBAAiBD,YAAYE,MAAM,CAACH,SAASD,MAAM;IAEzD,qBACE,KAACK;QACCC,OAAO;YACLC,cAAc;QAChB;kBAEA,cAAA,KAACF;sBACEnB,EAAE,4BAA4B;gBAC7BsB,SAASL;gBACTM,KAAKP,YAAYF,MAAM;YACzB;;;AAIR,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/Overview/index.tsx"],"sourcesContent":["// @ts-nocheck\nimport type { UIField } from 'payload'\n\ntype FieldFunctionProps = {\n descriptionOverrides?: {\n maxLength?: number\n minLength?: number\n }\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 titleOverrides?: {\n maxLength?: number\n minLength?: number\n }\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 descriptionOverrides,\n descriptionPath,\n imagePath,\n overrides,\n titleOverrides,\n titlePath,\n}) => {\n return {\n admin: {\n components: {\n Field: {\n clientProps: {\n descriptionOverrides,\n descriptionPath,\n imagePath,\n titleOverrides,\n titlePath,\n },\n path: '@justanarthur/payload-plugin-seo/fields-components#OverviewComponent',\n },\n },\n },\n label: 'Overview',\n name: 'overview',\n type: 'ui',\n ...((overrides as unknown as UIField) ?? {}),\n }\n}\n"],"names":["OverviewField","descriptionOverrides","descriptionPath","imagePath","overrides","titleOverrides","titlePath","admin","components","Field","clientProps","path","label","name","type"],"mappings":"AAAA,cAAc;AAmCd,OAAO,MAAMA,gBAA+B,CAAC,EAC3CC,oBAAoB,EACpBC,eAAe,EACfC,SAAS,EACTC,SAAS,EACTC,cAAc,EACdC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXT;wBACAC;wBACAC;wBACAE;wBACAC;oBACF;oBACAK,MAAM;gBACR;YACF;QACF;QACAC,OAAO;QACPC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAAoC,CAAC,CAAC;IAC7C;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/fields/Overview/index.tsx"],"sourcesContent":["// @ts-nocheck\r\nimport type { UIField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n descriptionOverrides?: {\r\n maxLength?: number\r\n minLength?: number\r\n }\r\n /**\r\n * Path to the description field to use for the preview\r\n *\r\n * @default 'meta.description'\r\n */\r\n descriptionPath?: string\r\n /**\r\n * Path to the image field to use for the preview\r\n *\r\n * @default 'meta.image'\r\n */\r\n imagePath?: string\r\n overrides?: Partial<UIField>\r\n titleOverrides?: {\r\n maxLength?: number\r\n minLength?: number\r\n }\r\n /**\r\n * Path to the title field to use for the preview\r\n *\r\n * @default 'meta.title'\r\n */\r\n titlePath?: string\r\n}\r\n\r\ntype FieldFunction = ({ overrides }: FieldFunctionProps) => UIField\r\n\r\nexport const OverviewField: FieldFunction = ({\r\n descriptionOverrides,\r\n descriptionPath,\r\n imagePath,\r\n overrides,\r\n titleOverrides,\r\n titlePath,\r\n}) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n descriptionOverrides,\r\n descriptionPath,\r\n imagePath,\r\n titleOverrides,\r\n titlePath,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#OverviewComponent',\r\n },\r\n },\r\n },\r\n label: 'Overview',\r\n name: 'overview',\r\n type: 'ui',\r\n ...((overrides as unknown as UIField) ?? {}),\r\n }\r\n}\r\n"],"names":["OverviewField","descriptionOverrides","descriptionPath","imagePath","overrides","titleOverrides","titlePath","admin","components","Field","clientProps","path","label","name","type"],"mappings":"AAAA,cAAc;AAmCd,OAAO,MAAMA,gBAA+B,CAAC,EAC3CC,oBAAoB,EACpBC,eAAe,EACfC,SAAS,EACTC,SAAS,EACTC,cAAc,EACdC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXT;wBACAC;wBACAC;wBACAE;wBACAC;oBACF;oBACAK,MAAM;gBACR;YACF;QACF;QACAC,OAAO;QACPC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAAoC,CAAC,CAAC;IAC7C;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/Preview/PreviewComponent.tsx"],"sourcesContent":["'use client'\n\nimport {\n useAllFormFields,\n useConfig,\n useDocumentInfo,\n useForm,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\nimport type { FormField, UIField } from 'payload'\nimport { useEffect, useState } from 'react'\n\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\nimport type { GenerateURL } from '../../types'\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 {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n\n const locale = useLocale()\n\n const [fields] = useAllFormFields()\n\n const { getData } = useForm()\n\n const docInfo = useDocumentInfo()\n\n const descriptionPath = descriptionPathFromContext || 'meta.description'\n\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 // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>\n useEffect(() => {\n const endpoint = `${serverURL}${api}/plugin-seo/generate-url`\n\n const getHref = async () => {\n const genURLResponse = await fetch(endpoint, {\n body: JSON.stringify({\n collectionSlug: docInfo.collectionSlug,\n doc: getData(),\n docPermissions: docInfo.docPermissions,\n globalSlug: docInfo.globalSlug,\n hasPublishPermission: docInfo.hasPublishPermission,\n hasSavePermission: docInfo.hasSavePermission,\n id: docInfo.id,\n initialData: docInfo.initialData,\n initialState: docInfo.initialState\n ? reduceToSerializableFields(docInfo.initialState)\n : undefined,\n locale: typeof locale === 'object' ? locale?.code : locale,\n title: docInfo.title,\n } satisfies Omit<\n Parameters<GenerateURL>[0],\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\n >),\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, serverURL, api])\n\n return (\n <div\n style={{\n marginBottom: '20px',\n }}\n >\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","useConfig","useDocumentInfo","useForm","useLocale","useTranslation","reduceToSerializableFields","useEffect","useState","PreviewComponent","props","descriptionPath","descriptionPathFromContext","hasGenerateURLFn","titlePath","titlePathFromContext","t","config","routes","api","serverURL","locale","fields","getData","docInfo","value","metaDescription","metaTitle","href","setHref","endpoint","getHref","genURLResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","title","credentials","headers","method","result","newHref","json","div","style","marginBottom","color","background","borderRadius","boxShadow","maxWidth","padding","pointerEvents","width","a","textDecoration","h4","margin","p"],"mappings":"AAAA;;AAEA,SACEA,gBAAgB,EAChBC,SAAS,EACTC,eAAe,EACfC,OAAO,EACPC,SAAS,EACTC,cAAc,QACT,iBAAgB;AACvB,SAASC,0BAA0B,QAAQ,wBAAuB;AAElE,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAW3C,OAAO,MAAMC,mBAA2C,CAACC;IACvD,MAAM,EACJC,iBAAiBC,0BAA0B,EAC3CC,gBAAgB,EAChBC,WAAWC,oBAAoB,EAChC,GAAGL;IAEJ,MAAM,EAAEM,CAAC,EAAE,GAAGX;IAEd,MAAM,EACJY,QAAQ,EACNC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACF,GAAGnB;IAEJ,MAAMoB,SAASjB;IAEf,MAAM,CAACkB,OAAO,GAAGtB;IAEjB,MAAM,EAAEuB,OAAO,EAAE,GAAGpB;IAEpB,MAAMqB,UAAUtB;IAEhB,MAAMS,kBAAkBC,8BAA8B;IAEtD,MAAME,YAAYC,wBAAwB;IAE1C,MAAM,EACJ,CAACJ,gBAAgB,EAAE,EAAEc,OAAOC,eAAe,EAAE,GAAG,CAAC,CAAc,EAC/D,CAACZ,UAAU,EAAE,EAAEW,OAAOE,SAAS,EAAE,GAAG,CAAC,CAAc,EACpD,GAAGL;IAEJ,MAAM,CAACM,MAAMC,QAAQ,GAAGrB;IAExB,yEAAyE;IACzED,UAAU;QACR,MAAMuB,WAAW,GAAGV,YAAYD,IAAI,wBAAwB,CAAC;QAE7D,MAAMY,UAAU;YACd,MAAMC,iBAAiB,MAAMC,MAAMH,UAAU;gBAC3CI,MAAMC,KAAKC,SAAS,CAAC;oBACnBC,gBAAgBb,QAAQa,cAAc;oBACtCC,KAAKf;oBACLgB,gBAAgBf,QAAQe,cAAc;oBACtCC,YAAYhB,QAAQgB,UAAU;oBAC9BC,sBAAsBjB,QAAQiB,oBAAoB;oBAClDC,mBAAmBlB,QAAQkB,iBAAiB;oBAC5CC,IAAInB,QAAQmB,EAAE;oBACdC,aAAapB,QAAQoB,WAAW;oBAChCC,cAAcrB,QAAQqB,YAAY,GAC9BvC,2BAA2BkB,QAAQqB,YAAY,IAC/CC;oBACJzB,QAAQ,OAAOA,WAAW,WAAWA,QAAQ0B,OAAO1B;oBACpD2B,OAAOxB,QAAQwB,KAAK;gBACtB;gBAIAC,aAAa;gBACbC,SAAS;oBACP,gBAAgB;gBAClB;gBACAC,QAAQ;YACV;YAEA,MAAM,EAAEC,QAAQC,OAAO,EAAE,GAAG,MAAMrB,eAAesB,IAAI;YAErDzB,QAAQwB;QACV;QAEA,IAAIxC,oBAAoB,CAACe,MAAM;YAC7B,KAAKG;QACP;IACF,GAAG;QAACT;QAAQM;QAAMP;QAAQG;QAASX;QAAkBU;QAASH;QAAWD;KAAI;IAE7E,qBACE,MAACoC;QACCC,OAAO;YACLC,cAAc;QAChB;;0BAEA,KAACF;0BAAKvC,EAAE;;0BACR,KAACuC;gBACCC,OAAO;oBACLE,OAAO;oBACPD,cAAc;gBAChB;0BAECzC,EAAE;;0BAEL,MAACuC;gBACCC,OAAO;oBACLG,YAAY;oBACZC,cAAc;oBACdC,WAAW;oBACXC,UAAU;oBACVC,SAAS;oBACTC,eAAe;oBACfC,OAAO;gBACT;;kCAEA,KAACV;kCACC,cAAA,KAACW;4BACCtC,MAAMA;4BACN4B,OAAO;gCACLW,gBAAgB;4BAClB;sCAECvC,QAAQ;;;kCAGb,KAACwC;wBACCZ,OAAO;4BACLa,QAAQ;wBACV;kCAEA,cAAA,KAACH;4BACCtC,MAAK;4BACL4B,OAAO;gCACLW,gBAAgB;4BAClB;sCAECxC;;;kCAGL,KAAC2C;wBACCd,OAAO;4BACLa,QAAQ;wBACV;kCAEC3C;;;;;;AAKX,EAAC"}
1
+ {"version":3,"sources":["../../../../src/fields/Preview/PreviewComponent.tsx"],"sourcesContent":["'use client'\r\n\r\nimport {\r\n useAllFormFields,\r\n useConfig,\r\n useDocumentInfo,\r\n useForm,\r\n useLocale,\r\n useTranslation,\r\n} from '@payloadcms/ui'\r\nimport { reduceToSerializableFields } from '@payloadcms/ui/shared'\r\nimport type { FormField, UIField } from 'payload'\r\nimport { useEffect, useState } from 'react'\r\n\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../../translations'\r\nimport type { GenerateURL } from '../../types'\r\n\r\ntype PreviewProps = {\r\n readonly descriptionPath?: string\r\n readonly hasGenerateURLFn: boolean\r\n readonly titlePath?: string\r\n} & UIField\r\n\r\nexport const PreviewComponent: React.FC<PreviewProps> = (props) => {\r\n const {\r\n descriptionPath: descriptionPathFromContext,\r\n hasGenerateURLFn,\r\n titlePath: titlePathFromContext,\r\n } = props\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n const {\r\n config: {\r\n routes: { api },\r\n serverURL,\r\n },\r\n } = useConfig()\r\n\r\n const locale = useLocale()\r\n\r\n const [fields] = useAllFormFields()\r\n\r\n const { getData } = useForm()\r\n\r\n const docInfo = useDocumentInfo()\r\n\r\n const descriptionPath = descriptionPathFromContext || 'meta.description'\r\n\r\n const titlePath = titlePathFromContext || 'meta.title'\r\n\r\n const {\r\n [descriptionPath]: { value: metaDescription } = {} as FormField,\r\n [titlePath]: { value: metaTitle } = {} as FormField,\r\n } = fields\r\n\r\n const [href, setHref] = useState<string>()\r\n\r\n // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>\r\n useEffect(() => {\r\n const endpoint = `${serverURL}${api}/plugin-seo/generate-url`\r\n\r\n const getHref = async () => {\r\n const genURLResponse = await fetch(endpoint, {\r\n body: JSON.stringify({\r\n collectionSlug: docInfo.collectionSlug,\r\n doc: getData(),\r\n docPermissions: docInfo.docPermissions,\r\n globalSlug: docInfo.globalSlug,\r\n hasPublishPermission: docInfo.hasPublishPermission,\r\n hasSavePermission: docInfo.hasSavePermission,\r\n id: docInfo.id,\r\n initialData: docInfo.initialData,\r\n initialState: docInfo.initialState\r\n ? reduceToSerializableFields(docInfo.initialState)\r\n : undefined,\r\n locale: typeof locale === 'object' ? locale?.code : locale,\r\n title: docInfo.title,\r\n } satisfies Omit<\r\n Parameters<GenerateURL>[0],\r\n 'collectionConfig' | 'globalConfig' | 'hasPublishedDoc' | 'req' | 'versionCount'\r\n >),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n })\r\n\r\n const { result: newHref } = await genURLResponse.json()\r\n\r\n setHref(newHref)\r\n }\r\n\r\n if (hasGenerateURLFn && !href) {\r\n void getHref()\r\n }\r\n }, [fields, href, locale, docInfo, hasGenerateURLFn, getData, serverURL, api])\r\n\r\n return (\r\n <div\r\n style={{\r\n marginBottom: '20px',\r\n }}\r\n >\r\n <div>{t('plugin-seo:preview')}</div>\r\n <div\r\n style={{\r\n color: '#9A9A9A',\r\n marginBottom: '5px',\r\n }}\r\n >\r\n {t('plugin-seo:previewDescription')}\r\n </div>\r\n <div\r\n style={{\r\n background: 'var(--theme-elevation-50)',\r\n borderRadius: '5px',\r\n boxShadow: '0px 0px 10px rgba(0, 0, 0, 0.1)',\r\n maxWidth: '600px',\r\n padding: '20px',\r\n pointerEvents: 'none',\r\n width: '100%',\r\n }}\r\n >\r\n <div>\r\n <a\r\n href={href}\r\n style={{\r\n textDecoration: 'none',\r\n }}\r\n >\r\n {href || 'https://...'}\r\n </a>\r\n </div>\r\n <h4\r\n style={{\r\n margin: 0,\r\n }}\r\n >\r\n <a\r\n href=\"/\"\r\n style={{\r\n textDecoration: 'none',\r\n }}\r\n >\r\n {metaTitle as string}\r\n </a>\r\n </h4>\r\n <p\r\n style={{\r\n margin: 0,\r\n }}\r\n >\r\n {metaDescription as string}\r\n </p>\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["useAllFormFields","useConfig","useDocumentInfo","useForm","useLocale","useTranslation","reduceToSerializableFields","useEffect","useState","PreviewComponent","props","descriptionPath","descriptionPathFromContext","hasGenerateURLFn","titlePath","titlePathFromContext","t","config","routes","api","serverURL","locale","fields","getData","docInfo","value","metaDescription","metaTitle","href","setHref","endpoint","getHref","genURLResponse","fetch","body","JSON","stringify","collectionSlug","doc","docPermissions","globalSlug","hasPublishPermission","hasSavePermission","id","initialData","initialState","undefined","code","title","credentials","headers","method","result","newHref","json","div","style","marginBottom","color","background","borderRadius","boxShadow","maxWidth","padding","pointerEvents","width","a","textDecoration","h4","margin","p"],"mappings":"AAAA;;AAEA,SACEA,gBAAgB,EAChBC,SAAS,EACTC,eAAe,EACfC,OAAO,EACPC,SAAS,EACTC,cAAc,QACT,iBAAgB;AACvB,SAASC,0BAA0B,QAAQ,wBAAuB;AAElE,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAW3C,OAAO,MAAMC,mBAA2C,CAACC;IACvD,MAAM,EACJC,iBAAiBC,0BAA0B,EAC3CC,gBAAgB,EAChBC,WAAWC,oBAAoB,EAChC,GAAGL;IAEJ,MAAM,EAAEM,CAAC,EAAE,GAAGX;IAEd,MAAM,EACJY,QAAQ,EACNC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACF,GAAGnB;IAEJ,MAAMoB,SAASjB;IAEf,MAAM,CAACkB,OAAO,GAAGtB;IAEjB,MAAM,EAAEuB,OAAO,EAAE,GAAGpB;IAEpB,MAAMqB,UAAUtB;IAEhB,MAAMS,kBAAkBC,8BAA8B;IAEtD,MAAME,YAAYC,wBAAwB;IAE1C,MAAM,EACJ,CAACJ,gBAAgB,EAAE,EAAEc,OAAOC,eAAe,EAAE,GAAG,CAAC,CAAc,EAC/D,CAACZ,UAAU,EAAE,EAAEW,OAAOE,SAAS,EAAE,GAAG,CAAC,CAAc,EACpD,GAAGL;IAEJ,MAAM,CAACM,MAAMC,QAAQ,GAAGrB;IAExB,yEAAyE;IACzED,UAAU;QACR,MAAMuB,WAAW,GAAGV,YAAYD,IAAI,wBAAwB,CAAC;QAE7D,MAAMY,UAAU;YACd,MAAMC,iBAAiB,MAAMC,MAAMH,UAAU;gBAC3CI,MAAMC,KAAKC,SAAS,CAAC;oBACnBC,gBAAgBb,QAAQa,cAAc;oBACtCC,KAAKf;oBACLgB,gBAAgBf,QAAQe,cAAc;oBACtCC,YAAYhB,QAAQgB,UAAU;oBAC9BC,sBAAsBjB,QAAQiB,oBAAoB;oBAClDC,mBAAmBlB,QAAQkB,iBAAiB;oBAC5CC,IAAInB,QAAQmB,EAAE;oBACdC,aAAapB,QAAQoB,WAAW;oBAChCC,cAAcrB,QAAQqB,YAAY,GAC9BvC,2BAA2BkB,QAAQqB,YAAY,IAC/CC;oBACJzB,QAAQ,OAAOA,WAAW,WAAWA,QAAQ0B,OAAO1B;oBACpD2B,OAAOxB,QAAQwB,KAAK;gBACtB;gBAIAC,aAAa;gBACbC,SAAS;oBACP,gBAAgB;gBAClB;gBACAC,QAAQ;YACV;YAEA,MAAM,EAAEC,QAAQC,OAAO,EAAE,GAAG,MAAMrB,eAAesB,IAAI;YAErDzB,QAAQwB;QACV;QAEA,IAAIxC,oBAAoB,CAACe,MAAM;YAC7B,KAAKG;QACP;IACF,GAAG;QAACT;QAAQM;QAAMP;QAAQG;QAASX;QAAkBU;QAASH;QAAWD;KAAI;IAE7E,qBACE,MAACoC;QACCC,OAAO;YACLC,cAAc;QAChB;;0BAEA,KAACF;0BAAKvC,EAAE;;0BACR,KAACuC;gBACCC,OAAO;oBACLE,OAAO;oBACPD,cAAc;gBAChB;0BAECzC,EAAE;;0BAEL,MAACuC;gBACCC,OAAO;oBACLG,YAAY;oBACZC,cAAc;oBACdC,WAAW;oBACXC,UAAU;oBACVC,SAAS;oBACTC,eAAe;oBACfC,OAAO;gBACT;;kCAEA,KAACV;kCACC,cAAA,KAACW;4BACCtC,MAAMA;4BACN4B,OAAO;gCACLW,gBAAgB;4BAClB;sCAECvC,QAAQ;;;kCAGb,KAACwC;wBACCZ,OAAO;4BACLa,QAAQ;wBACV;kCAEA,cAAA,KAACH;4BACCtC,MAAK;4BACL4B,OAAO;gCACLW,gBAAgB;4BAClB;sCAECxC;;;kCAGL,KAAC2C;wBACCd,OAAO;4BACLa,QAAQ;wBACV;kCAEC3C;;;;;;AAKX,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/Preview/index.tsx"],"sourcesContent":["// @ts-nocheck\nimport type { UIField } from 'payload'\n\ntype 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 admin: {\n components: {\n Field: {\n clientProps: {\n descriptionPath,\n hasGenerateURLFn: hasGenerateFn,\n titlePath,\n },\n path: '@justanarthur/payload-plugin-seo/fields-components#PreviewComponent',\n },\n },\n },\n label: 'Preview',\n name: 'preview',\n type: 'ui',\n ...((overrides as unknown as UIField) ?? {}),\n }\n}\n"],"names":["PreviewField","descriptionPath","hasGenerateFn","overrides","titlePath","admin","components","Field","clientProps","hasGenerateURLFn","path","label","name","type"],"mappings":"AAAA,cAAc;AAyBd,OAAO,MAAMA,eAA8B,CAAC,EAC1CC,eAAe,EACfC,gBAAgB,KAAK,EACrBC,SAAS,EACTC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXP;wBACAQ,kBAAkBP;wBAClBE;oBACF;oBACAM,MAAM;gBACR;YACF;QACF;QACAC,OAAO;QACPC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAAoC,CAAC,CAAC;IAC7C;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/fields/Preview/index.tsx"],"sourcesContent":["// @ts-nocheck\r\nimport type { UIField } from 'payload'\r\n\r\ntype FieldFunctionProps = {\r\n /**\r\n * Path to the description field to use for the preview\r\n *\r\n * @default 'meta.description'\r\n */\r\n descriptionPath?: string\r\n /**\r\n * Tell the component if the generate function is available as configured in the plugin config\r\n */\r\n hasGenerateFn?: boolean\r\n overrides?: Partial<UIField>\r\n /**\r\n * Path to the title field to use for the preview\r\n *\r\n * @default 'meta.title'\r\n */\r\n titlePath?: string\r\n}\r\n\r\ntype FieldFunction = ({ hasGenerateFn, overrides }: FieldFunctionProps) => UIField\r\n\r\nexport const PreviewField: FieldFunction = ({\r\n descriptionPath,\r\n hasGenerateFn = false,\r\n overrides,\r\n titlePath,\r\n}) => {\r\n return {\r\n admin: {\r\n components: {\r\n Field: {\r\n clientProps: {\r\n descriptionPath,\r\n hasGenerateURLFn: hasGenerateFn,\r\n titlePath,\r\n },\r\n path: '@justanarthur/payload-plugin-seo/fields-components#PreviewComponent',\r\n },\r\n },\r\n },\r\n label: 'Preview',\r\n name: 'preview',\r\n type: 'ui',\r\n ...((overrides as unknown as UIField) ?? {}),\r\n }\r\n}\r\n"],"names":["PreviewField","descriptionPath","hasGenerateFn","overrides","titlePath","admin","components","Field","clientProps","hasGenerateURLFn","path","label","name","type"],"mappings":"AAAA,cAAc;AAyBd,OAAO,MAAMA,eAA8B,CAAC,EAC1CC,eAAe,EACfC,gBAAgB,KAAK,EACrBC,SAAS,EACTC,SAAS,EACV;IACC,OAAO;QACLC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXP;wBACAQ,kBAAkBP;wBAClBE;oBACF;oBACAM,MAAM;gBACR;YACF;QACF;QACAC,OAAO;QACPC,MAAM;QACNC,MAAM;QACN,GAAI,AAACV,aAAoC,CAAC,CAAC;IAC7C;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.tsx"],"sourcesContent":["import type { CollectionSlug, Config, Field, GlobalSlug, GroupField, TabsField } from 'payload'\nimport { deepMergeSimple } from 'payload/shared'\n\nimport { MetaDescriptionField } from './fields/MetaDescription'\nimport { MetaImageField } from './fields/MetaImage'\nimport { MetaTitleField } from './fields/MetaTitle'\nimport { OverviewField } from './fields/Overview'\nimport { PreviewField } from './fields/Preview'\nimport { openaiMessage } from './openai/message'\nimport { translations } from './translations'\nimport type {\n GenerateDescription,\n GenerateImage,\n GenerateTitle,\n GenerateURL,\n SEOPluginConfig,\n} from './types'\n\nexport const seoPlugin =\n (pluginConfig: SEOPluginConfig) =>\n (config: Config): Config => {\n const defaultFields: Field[] = [\n OverviewField({}),\n MetaTitleField({\n hasGenerateAi: typeof pluginConfig?.generateTitleAi === 'function',\n hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',\n }),\n MetaDescriptionField({\n hasGenerateAi: typeof pluginConfig?.generateDescriptionAi === 'function',\n hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',\n }),\n ...(pluginConfig?.uploadsCollection\n ? [\n MetaImageField({\n hasGenerateFn: typeof pluginConfig?.generateImage === 'function',\n relationTo: pluginConfig.uploadsCollection,\n }),\n ]\n : []),\n PreviewField({\n hasGenerateFn: typeof pluginConfig?.generateURL === 'function',\n }),\n ]\n\n const seoFields: GroupField[] = [\n {\n fields: [\n ...(pluginConfig?.fields && typeof pluginConfig.fields === 'function'\n ? pluginConfig.fields({ defaultFields })\n : defaultFields),\n ],\n interfaceName: pluginConfig.interfaceName,\n label: 'SEO',\n name: 'meta',\n type: 'group',\n },\n ]\n\n return {\n ...config,\n collections:\n config.collections?.map((collection) => {\n const { slug } = collection\n\n const isEnabled = pluginConfig?.collections?.includes(slug as CollectionSlug)\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 !(\n typeof collection.auth === 'object' &&\n (collection.auth as any).disableLocalStrategy\n )) &&\n collection.fields?.find((field) => 'name' in field && field.name === 'email')\n\n const hasOnlyEmailField = collection.fields?.length === 1 && emailField\n\n const seoTabs: TabsField[] = hasOnlyEmailField\n ? [\n {\n tabs: [\n {\n fields: seoFields,\n label: 'SEO',\n },\n ],\n type: 'tabs',\n },\n ]\n : [\n {\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 type: 'tabs',\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 if (data) {\n req.data = data\n }\n\n const result = pluginConfig.generateTitle\n ? await pluginConfig.generateTitle({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateTitle>[0])\n : ''\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 if (!pluginConfig.openaiApiKey)\n return new Response(JSON.stringify({ message: 'Something went wrong' }), {\n status: 500,\n })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n\n const content = pluginConfig.generateTitleAi\n ? await pluginConfig.generateTitleAi({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n })\n : ''\n\n console.log('[handler \"/plugin-seo/generate-title-ai\"]', { content })\n\n const aiResult = await openaiMessage({\n apiKey: pluginConfig.openaiApiKey,\n content,\n req,\n })\n\n console.log('[handler \"/plugin-seo/generate-title-ai\"]', { aiResult })\n\n return Response.json({ result: aiResult }, { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-title-ai',\n },\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n\n const result = pluginConfig.generateDescription\n ? await pluginConfig.generateDescription({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateDescription>[0])\n : ''\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 if (!pluginConfig.openaiApiKey)\n return new Response(JSON.stringify({ message: 'Something went wrong' }), {\n status: 500,\n })\n\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n const content = pluginConfig.generateDescriptionAi\n ? await pluginConfig.generateDescriptionAi({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n })\n : ''\n\n const aiResult = await openaiMessage({\n apiKey: pluginConfig.openaiApiKey,\n content,\n req,\n })\n\n return Response.json({ result: aiResult }, { status: 200 })\n },\n method: 'post',\n path: '/plugin-seo/generate-description-ai',\n },\n {\n handler: async (req) => {\n const data: Omit<\n Parameters<GenerateTitle>[0],\n 'collectionConfig' | 'globalConfig' | 'req'\n > = await req.json?.()\n\n if (data) {\n req.data = data\n }\n\n const result = pluginConfig.generateURL\n ? await pluginConfig.generateURL({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : undefined,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : undefined,\n req,\n } satisfies Parameters<GenerateURL>[0])\n : ''\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 if (data) {\n req.data = data\n }\n\n const result = pluginConfig.generateImage\n ? await pluginConfig.generateImage({\n ...data,\n collectionConfig: req.data?.collectionSlug\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\n : null,\n globalConfig: req.data?.globalSlug\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\n : null,\n req,\n } as Parameters<GenerateImage>[0])\n : ''\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\n const isEnabled = pluginConfig?.globals?.includes(slug as GlobalSlug)\n\n if (isEnabled) {\n if (pluginConfig?.tabbedUI) {\n const seoTabs: TabsField[] = [\n {\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 type: 'tabs',\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: config.i18n?.translations\n ? deepMergeSimple(translations, config.i18n.translations)\n : translations,\n },\n }\n }\n"],"names":["deepMergeSimple","MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField","openaiMessage","translations","seoPlugin","pluginConfig","config","defaultFields","hasGenerateAi","generateTitleAi","hasGenerateFn","generateTitle","generateDescriptionAi","generateDescription","uploadsCollection","generateImage","relationTo","generateURL","seoFields","fields","interfaceName","label","name","type","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","result","collectionConfig","collectionSlug","c","undefined","globalConfig","globalSlug","globals","g","Response","JSON","stringify","status","method","path","openaiApiKey","message","content","console","log","aiResult","apiKey","global","i18n"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/index.tsx"],"sourcesContent":["import type { CollectionSlug, Config, Field, GlobalSlug, GroupField, TabsField } from 'payload'\r\nimport { deepMergeSimple } from 'payload/shared'\r\n\r\nimport { MetaDescriptionField } from './fields/MetaDescription'\r\nimport { MetaImageField } from './fields/MetaImage'\r\nimport { MetaTitleField } from './fields/MetaTitle'\r\nimport { OverviewField } from './fields/Overview'\r\nimport { PreviewField } from './fields/Preview'\r\nimport { openaiMessage } from './openai/message'\r\nimport { translations } from './translations'\r\nimport type {\r\n GenerateDescription,\r\n GenerateImage,\r\n GenerateTitle,\r\n GenerateURL,\r\n SEOPluginConfig,\r\n} from './types'\r\n\r\nexport const seoPlugin =\r\n (pluginConfig: SEOPluginConfig) =>\r\n (config: Config): Config => {\r\n const defaultFields: Field[] = [\r\n OverviewField({}),\r\n MetaTitleField({\r\n hasGenerateAi: typeof pluginConfig?.generateTitleAi === 'function',\r\n hasGenerateFn: typeof pluginConfig?.generateTitle === 'function',\r\n }),\r\n MetaDescriptionField({\r\n hasGenerateAi: typeof pluginConfig?.generateDescriptionAi === 'function',\r\n hasGenerateFn: typeof pluginConfig?.generateDescription === 'function',\r\n }),\r\n ...(pluginConfig?.uploadsCollection\r\n ? [\r\n MetaImageField({\r\n hasGenerateFn: typeof pluginConfig?.generateImage === 'function',\r\n relationTo: pluginConfig.uploadsCollection,\r\n }),\r\n ]\r\n : []),\r\n PreviewField({\r\n hasGenerateFn: typeof pluginConfig?.generateURL === 'function',\r\n }),\r\n ]\r\n\r\n const seoFields: GroupField[] = [\r\n {\r\n fields: [\r\n ...(pluginConfig?.fields && typeof pluginConfig.fields === 'function'\r\n ? pluginConfig.fields({ defaultFields })\r\n : defaultFields),\r\n ],\r\n interfaceName: pluginConfig.interfaceName,\r\n label: 'SEO',\r\n name: 'meta',\r\n type: 'group',\r\n },\r\n ]\r\n\r\n return {\r\n ...config,\r\n collections:\r\n config.collections?.map((collection) => {\r\n const { slug } = collection\r\n\r\n const isEnabled = pluginConfig?.collections?.includes(slug as CollectionSlug)\r\n\r\n if (isEnabled) {\r\n if (pluginConfig?.tabbedUI) {\r\n // prevent issues with auth enabled collections having an email field that shouldn't be moved to the SEO tab\r\n const emailField =\r\n (collection.auth ||\r\n !(\r\n typeof collection.auth === 'object' &&\r\n (collection.auth as any).disableLocalStrategy\r\n )) &&\r\n collection.fields?.find((field) => 'name' in field && field.name === 'email')\r\n\r\n const hasOnlyEmailField = collection.fields?.length === 1 && emailField\r\n\r\n const seoTabs: TabsField[] = hasOnlyEmailField\r\n ? [\r\n {\r\n tabs: [\r\n {\r\n fields: seoFields,\r\n label: 'SEO',\r\n },\r\n ],\r\n type: 'tabs',\r\n },\r\n ]\r\n : [\r\n {\r\n tabs: [\r\n // append a new tab onto the end of the tabs array, if there is one at the first index\r\n // if needed, create a new `Content` tab in the first index for this collection's base fields\r\n ...(collection?.fields?.[0]?.type === 'tabs' &&\r\n collection?.fields?.[0]?.tabs\r\n ? collection.fields[0].tabs\r\n : [\r\n {\r\n fields: [\r\n ...(emailField\r\n ? collection.fields.filter(\r\n (field) => 'name' in field && field.name !== 'email',\r\n )\r\n : collection.fields),\r\n ],\r\n label: collection?.labels?.singular || 'Content',\r\n },\r\n ]),\r\n {\r\n fields: seoFields,\r\n label: 'SEO',\r\n },\r\n ],\r\n type: 'tabs',\r\n },\r\n ]\r\n\r\n return {\r\n ...collection,\r\n fields: [\r\n ...(emailField ? [emailField] : []),\r\n ...seoTabs,\r\n ...(collection?.fields?.[0]?.type === 'tabs' ? collection.fields.slice(1) : []),\r\n ],\r\n }\r\n }\r\n\r\n return {\r\n ...collection,\r\n fields: [...(collection?.fields || []), ...seoFields],\r\n }\r\n }\r\n\r\n return collection\r\n }) || [],\r\n endpoints: [\r\n ...(config.endpoints ?? []),\r\n {\r\n handler: async (req) => {\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const result = pluginConfig.generateTitle\r\n ? await pluginConfig.generateTitle({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n } satisfies Parameters<GenerateTitle>[0])\r\n : ''\r\n\r\n return new Response(JSON.stringify({ result }), { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-title',\r\n },\r\n {\r\n handler: async (req) => {\r\n if (!pluginConfig.openaiApiKey)\r\n return new Response(JSON.stringify({ message: 'Something went wrong' }), {\r\n status: 500,\r\n })\r\n\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const content = pluginConfig.generateTitleAi\r\n ? await pluginConfig.generateTitleAi({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n })\r\n : ''\r\n\r\n console.log('[handler \"/plugin-seo/generate-title-ai\"]', { content })\r\n\r\n const aiResult = await openaiMessage({\r\n apiKey: pluginConfig.openaiApiKey,\r\n content,\r\n req,\r\n })\r\n\r\n console.log('[handler \"/plugin-seo/generate-title-ai\"]', { aiResult })\r\n\r\n return Response.json({ result: aiResult }, { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-title-ai',\r\n },\r\n {\r\n handler: async (req) => {\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const result = pluginConfig.generateDescription\r\n ? await pluginConfig.generateDescription({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n } satisfies Parameters<GenerateDescription>[0])\r\n : ''\r\n\r\n return new Response(JSON.stringify({ result }), { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-description',\r\n },\r\n {\r\n handler: async (req) => {\r\n if (!pluginConfig.openaiApiKey)\r\n return new Response(JSON.stringify({ message: 'Something went wrong' }), {\r\n status: 500,\r\n })\r\n\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n const content = pluginConfig.generateDescriptionAi\r\n ? await pluginConfig.generateDescriptionAi({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n })\r\n : ''\r\n\r\n const aiResult = await openaiMessage({\r\n apiKey: pluginConfig.openaiApiKey,\r\n content,\r\n req,\r\n })\r\n\r\n return Response.json({ result: aiResult }, { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-description-ai',\r\n },\r\n {\r\n handler: async (req) => {\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const result = pluginConfig.generateURL\r\n ? await pluginConfig.generateURL({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : undefined,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : undefined,\r\n req,\r\n } satisfies Parameters<GenerateURL>[0])\r\n : ''\r\n\r\n return new Response(JSON.stringify({ result }), { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-url',\r\n },\r\n {\r\n handler: async (req) => {\r\n const data: Omit<\r\n Parameters<GenerateTitle>[0],\r\n 'collectionConfig' | 'globalConfig' | 'req'\r\n > = await req.json?.()\r\n\r\n if (data) {\r\n req.data = data\r\n }\r\n\r\n const result = pluginConfig.generateImage\r\n ? await pluginConfig.generateImage({\r\n ...data,\r\n collectionConfig: req.data?.collectionSlug\r\n ? config.collections?.find((c) => c.slug === req.data?.collectionSlug)\r\n : null,\r\n globalConfig: req.data?.globalSlug\r\n ? config.globals?.find((g) => g.slug === req.data?.globalSlug)\r\n : null,\r\n req,\r\n } as Parameters<GenerateImage>[0])\r\n : ''\r\n\r\n return new Response(result, { status: 200 })\r\n },\r\n method: 'post',\r\n path: '/plugin-seo/generate-image',\r\n },\r\n ],\r\n globals:\r\n config.globals?.map((global) => {\r\n const { slug } = global\r\n\r\n const isEnabled = pluginConfig?.globals?.includes(slug as GlobalSlug)\r\n\r\n if (isEnabled) {\r\n if (pluginConfig?.tabbedUI) {\r\n const seoTabs: TabsField[] = [\r\n {\r\n tabs: [\r\n // append a new tab onto the end of the tabs array, if there is one at the first index\r\n // if needed, create a new `Content` tab in the first index for this global's base fields\r\n ...(global?.fields?.[0].type === 'tabs' && global?.fields?.[0].tabs\r\n ? global.fields[0].tabs\r\n : [\r\n {\r\n fields: [...(global?.fields || [])],\r\n label: global?.label || 'Content',\r\n },\r\n ]),\r\n {\r\n fields: seoFields,\r\n label: 'SEO',\r\n },\r\n ],\r\n type: 'tabs',\r\n },\r\n ]\r\n\r\n return {\r\n ...global,\r\n fields: [\r\n ...seoTabs,\r\n ...(global?.fields?.[0].type === 'tabs' ? global.fields.slice(1) : []),\r\n ],\r\n }\r\n }\r\n\r\n return {\r\n ...global,\r\n fields: [...(global?.fields || []), ...seoFields],\r\n }\r\n }\r\n\r\n return global\r\n }) || [],\r\n i18n: {\r\n ...config.i18n,\r\n translations: config.i18n?.translations\r\n ? deepMergeSimple(translations, config.i18n.translations)\r\n : translations,\r\n },\r\n }\r\n }\r\n"],"names":["deepMergeSimple","MetaDescriptionField","MetaImageField","MetaTitleField","OverviewField","PreviewField","openaiMessage","translations","seoPlugin","pluginConfig","config","defaultFields","hasGenerateAi","generateTitleAi","hasGenerateFn","generateTitle","generateDescriptionAi","generateDescription","uploadsCollection","generateImage","relationTo","generateURL","seoFields","fields","interfaceName","label","name","type","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","result","collectionConfig","collectionSlug","c","undefined","globalConfig","globalSlug","globals","g","Response","JSON","stringify","status","method","path","openaiApiKey","message","content","console","log","aiResult","apiKey","global","i18n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/openai/message.ts"],"sourcesContent":["import OpenAI from 'openai'\nimport type { PayloadRequest } from 'payload'\n\nlet openai: OpenAI\n\nconst isInited = false\n\nexport const openaiMessage = async ({\n apiKey,\n content,\n req,\n}: {\n apiKey: string\n content: string\n req: PayloadRequest\n}) => {\n try {\n if (!isInited) {\n const configuration = {\n apiKey,\n }\n\n openai = new OpenAI(configuration)\n }\n\n const {\n choices: [{ message }],\n } = await openai.chat.completions.create({\n messages: [\n {\n content,\n role: 'user',\n },\n ],\n model: 'gpt-3.5-turbo',\n })\n\n return message.content\n } catch (error) {\n if (error instanceof Error) req.payload.logger.error(error.message)\n\n return ''\n }\n}\n"],"names":["OpenAI","openai","isInited","openaiMessage","apiKey","content","req","configuration","choices","message","chat","completions","create","messages","role","model","error","Error","payload","logger"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAG3B,IAAIC;AAEJ,MAAMC,WAAW;AAEjB,OAAO,MAAMC,gBAAgB,OAAO,EAClCC,MAAM,EACNC,OAAO,EACPC,GAAG,EAKJ;IACC,IAAI;QACF,IAAI,CAACJ,UAAU;YACb,MAAMK,gBAAgB;gBACpBH;YACF;YAEAH,SAAS,IAAID,OAAOO;QACtB;QAEA,MAAM,EACJC,SAAS,CAAC,EAAEC,OAAO,EAAE,CAAC,EACvB,GAAG,MAAMR,OAAOS,IAAI,CAACC,WAAW,CAACC,MAAM,CAAC;YACvCC,UAAU;gBACR;oBACER;oBACAS,MAAM;gBACR;aACD;YACDC,OAAO;QACT;QAEA,OAAON,QAAQJ,OAAO;IACxB,EAAE,OAAOW,OAAO;QACd,IAAIA,iBAAiBC,OAAOX,IAAIY,OAAO,CAACC,MAAM,CAACH,KAAK,CAACA,MAAMP,OAAO;QAElE,OAAO;IACT;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/openai/message.ts"],"sourcesContent":["import OpenAI from 'openai'\r\nimport type { PayloadRequest } from 'payload'\r\n\r\nlet openai: OpenAI\r\n\r\nconst isInited = false\r\n\r\nexport const openaiMessage = async ({\r\n apiKey,\r\n content,\r\n req,\r\n}: {\r\n apiKey: string\r\n content: string\r\n req: PayloadRequest\r\n}) => {\r\n try {\r\n if (!isInited) {\r\n const configuration = {\r\n apiKey,\r\n }\r\n\r\n openai = new OpenAI(configuration)\r\n }\r\n\r\n const {\r\n choices: [{ message }],\r\n } = await openai.chat.completions.create({\r\n messages: [\r\n {\r\n content,\r\n role: 'user',\r\n },\r\n ],\r\n model: 'gpt-3.5-turbo',\r\n })\r\n\r\n return message.content\r\n } catch (error) {\r\n if (error instanceof Error) req.payload.logger.error(error.message)\r\n\r\n return ''\r\n }\r\n}\r\n"],"names":["OpenAI","openai","isInited","openaiMessage","apiKey","content","req","configuration","choices","message","chat","completions","create","messages","role","model","error","Error","payload","logger"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAG3B,IAAIC;AAEJ,MAAMC,WAAW;AAEjB,OAAO,MAAMC,gBAAgB,OAAO,EAClCC,MAAM,EACNC,OAAO,EACPC,GAAG,EAKJ;IACC,IAAI;QACF,IAAI,CAACJ,UAAU;YACb,MAAMK,gBAAgB;gBACpBH;YACF;YAEAH,SAAS,IAAID,OAAOO;QACtB;QAEA,MAAM,EACJC,SAAS,CAAC,EAAEC,OAAO,EAAE,CAAC,EACvB,GAAG,MAAMR,OAAOS,IAAI,CAACC,WAAW,CAACC,MAAM,CAAC;YACvCC,UAAU;gBACR;oBACER;oBACAS,MAAM;gBACR;aACD;YACDC,OAAO;QACT;QAEA,OAAON,QAAQJ,OAAO;IACxB,EAAE,OAAOW,OAAO;QACd,IAAIA,iBAAiBC,OAAOX,IAAIY,OAAO,CAACC,MAAM,CAACH,KAAK,CAACA,MAAMP,OAAO;QAElE,OAAO;IACT;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/cs.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const cs: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Skoro hotovo',\n autoGenerate: 'Generovat automaticky',\n bestPractices: 'osvědčené postupy',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} znaků, ',\n charactersLeftOver: '{{characters}} zbývá',\n charactersToGo: '{{characters}} zbývá',\n charactersTooMany: '{{characters}} navíc',\n checksPassing: '{{current}}/{{max}} kontrol úspěšně splněno',\n generateAi: 'Generovat AI',\n good: 'Dobré',\n imageAutoGenerationTip: 'Automatická generace načte vybraný hero obrázek.',\n lengthTipDescription:\n 'Toto by mělo mít mezi {{minLength}} a {{maxLength}} znaky. Pomoc při psaní kvalitních meta popisů navštivte ',\n lengthTipTitle:\n 'Toto by mělo mít mezi {{minLength}} a {{maxLength}} znaky. Pomoc při psaní kvalitních meta titulů navštivte ',\n missing: 'Chybí',\n noImage: 'Bez obrázku',\n preview: 'Náhled',\n previewDescription:\n 'Přesný výsledek se může lišit v závislosti na obsahu a relevanci vyhledávání.',\n tooLong: 'Příliš dlouhé',\n tooShort: 'Příliš krátké',\n },\n}\n"],"names":["cs","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/cs.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const cs: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Skoro hotovo',\r\n autoGenerate: 'Generovat automaticky',\r\n bestPractices: 'osvědčené postupy',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} znaků, ',\r\n charactersLeftOver: '{{characters}} zbývá',\r\n charactersToGo: '{{characters}} zbývá',\r\n charactersTooMany: '{{characters}} navíc',\r\n checksPassing: '{{current}}/{{max}} kontrol úspěšně splněno',\r\n generateAi: 'Generovat AI',\r\n good: 'Dobré',\r\n imageAutoGenerationTip: 'Automatická generace načte vybraný hero obrázek.',\r\n lengthTipDescription:\r\n 'Toto by mělo mít mezi {{minLength}} a {{maxLength}} znaky. Pomoc při psaní kvalitních meta popisů navštivte ',\r\n lengthTipTitle:\r\n 'Toto by mělo mít mezi {{minLength}} a {{maxLength}} znaky. Pomoc při psaní kvalitních meta titulů navštivte ',\r\n missing: 'Chybí',\r\n noImage: 'Bez obrázku',\r\n preview: 'Náhled',\r\n previewDescription:\r\n 'Přesný výsledek se může lišit v závislosti na obsahu a relevanci vyhledávání.',\r\n tooLong: 'Příliš dlouhé',\r\n tooShort: 'Příliš krátké',\r\n },\r\n}\r\n"],"names":["cs","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/de.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const de: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Fast da',\n autoGenerate: 'Automatisch generieren',\n bestPractices: 'Best Practices',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} Zeichen, ',\n charactersLeftOver: '{{characters}} verbleiben',\n charactersToGo: '{{characters}} übrig',\n charactersTooMany: '{{characters}} zu viel',\n checksPassing: '{{current}}/{{max}} Kontrollen erfolgreich',\n generateAi: 'AI generieren',\n good: 'Gut',\n imageAutoGenerationTip: 'Die automatische Generierung ruft das ausgewählte Hauptbild ab.',\n lengthTipDescription:\n 'Diese sollte zwischen {{minLength}} und {{maxLength}} Zeichen lang sein. Für Hilfe beim Schreiben von qualitativ hochwertigen Meta-Beschreibungen siehe ',\n lengthTipTitle:\n 'Dieser sollte zwischen {{minLength}} und {{maxLength}} Zeichen lang sein. Für Hilfe beim Schreiben von qualitativ hochwertigen Meta-Titeln siehe ',\n missing: 'Fehlt',\n noImage: 'Kein Bild',\n preview: 'Vorschau',\n previewDescription:\n 'Die genauen Ergebnislisten können je nach Inhalt und Suchrelevanz variieren.',\n tooLong: 'Zu lang',\n tooShort: 'Zu kurz',\n },\n}\n"],"names":["de","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/de.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const de: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Fast da',\r\n autoGenerate: 'Automatisch generieren',\r\n bestPractices: 'Best Practices',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} Zeichen, ',\r\n charactersLeftOver: '{{characters}} verbleiben',\r\n charactersToGo: '{{characters}} übrig',\r\n charactersTooMany: '{{characters}} zu viel',\r\n checksPassing: '{{current}}/{{max}} Kontrollen erfolgreich',\r\n generateAi: 'AI generieren',\r\n good: 'Gut',\r\n imageAutoGenerationTip: 'Die automatische Generierung ruft das ausgewählte Hauptbild ab.',\r\n lengthTipDescription:\r\n 'Diese sollte zwischen {{minLength}} und {{maxLength}} Zeichen lang sein. Für Hilfe beim Schreiben von qualitativ hochwertigen Meta-Beschreibungen siehe ',\r\n lengthTipTitle:\r\n 'Dieser sollte zwischen {{minLength}} und {{maxLength}} Zeichen lang sein. Für Hilfe beim Schreiben von qualitativ hochwertigen Meta-Titeln siehe ',\r\n missing: 'Fehlt',\r\n noImage: 'Kein Bild',\r\n preview: 'Vorschau',\r\n previewDescription:\r\n 'Die genauen Ergebnislisten können je nach Inhalt und Suchrelevanz variieren.',\r\n tooLong: 'Zu lang',\r\n tooShort: 'Zu kurz',\r\n },\r\n}\r\n"],"names":["de","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/en.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const en: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Almost there',\n autoGenerate: 'Auto-generate',\n bestPractices: 'best practices',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} chars, ',\n charactersLeftOver: '{{characters}} left over',\n charactersToGo: '{{characters}} to go',\n charactersTooMany: '{{characters}} too many',\n checksPassing: '{{current}}/{{max}} checks are passing',\n generateAi: 'AI-generate',\n good: 'Good',\n imageAutoGenerationTip: 'Auto-generation will retrieve the selected hero image.',\n lengthTipDescription:\n 'This should be between {{minLength}} and {{maxLength}} characters. For help in writing quality meta descriptions, see ',\n lengthTipKeywords: 'This should be between {{minLength}} and {{maxLength}} words',\n lengthTipTitle:\n 'This should be between {{minLength}} and {{maxLength}} characters. For help in writing quality meta titles, see ',\n missing: 'Missing',\n noImage: 'No image',\n preview: 'Preview',\n previewDescription: 'Exact result listings may vary based on content and search relevancy.',\n tooLong: 'Too long',\n tooShort: 'Too short',\n },\n}\n"],"names":["en","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipKeywords","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,mBAAmB;QACnBC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/en.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const en: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Almost there',\r\n autoGenerate: 'Auto-generate',\r\n bestPractices: 'best practices',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} chars, ',\r\n charactersLeftOver: '{{characters}} left over',\r\n charactersToGo: '{{characters}} to go',\r\n charactersTooMany: '{{characters}} too many',\r\n checksPassing: '{{current}}/{{max}} checks are passing',\r\n generateAi: 'AI-generate',\r\n good: 'Good',\r\n imageAutoGenerationTip: 'Auto-generation will retrieve the selected hero image.',\r\n lengthTipDescription:\r\n 'This should be between {{minLength}} and {{maxLength}} characters. For help in writing quality meta descriptions, see ',\r\n lengthTipKeywords: 'This should be between {{minLength}} and {{maxLength}} words',\r\n lengthTipTitle:\r\n 'This should be between {{minLength}} and {{maxLength}} characters. For help in writing quality meta titles, see ',\r\n missing: 'Missing',\r\n noImage: 'No image',\r\n preview: 'Preview',\r\n previewDescription: 'Exact result listings may vary based on content and search relevancy.',\r\n tooLong: 'Too long',\r\n tooShort: 'Too short',\r\n },\r\n}\r\n"],"names":["en","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipKeywords","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,mBAAmB;QACnBC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/es.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const es: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Ya casi está',\n autoGenerate: 'Autogénerar',\n bestPractices: 'mejores prácticas',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} letras, ',\n charactersLeftOver: '{{characters}} letras sobrantes',\n charactersToGo: '{{characters}} letras sobrantes',\n charactersTooMany: '{{characters}} letras demasiados',\n checksPassing: '{{current}}/{{max}} las comprobaciones están pasando',\n generateAi: 'Generar IA',\n good: 'Bien',\n imageAutoGenerationTip: 'La autogeneración recuperará la imagen de héroe seleccionada.',\n lengthTipDescription:\n 'Esto debe estar entre {{minLength}} y {{maxLength}} caracteres. Para obtener ayuda sobre cómo escribir meta descripciones de calidad, consulte ',\n lengthTipTitle:\n 'Debe tener entre {{minLength}} y {{maxLength}} caracteres. Para obtener ayuda sobre cómo escribir metatítulos de calidad, consulte ',\n missing: 'Falta',\n noImage: 'Sin imagen',\n preview: 'Vista previa',\n previewDescription:\n 'Las listas de resultados pueden variar segun la relevancia de buesqueda y el contenido.',\n tooLong: 'Demasiado largo',\n tooShort: 'Demasiado corto',\n },\n}\n"],"names":["es","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/es.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const es: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Ya casi está',\r\n autoGenerate: 'Autogénerar',\r\n bestPractices: 'mejores prácticas',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} letras, ',\r\n charactersLeftOver: '{{characters}} letras sobrantes',\r\n charactersToGo: '{{characters}} letras sobrantes',\r\n charactersTooMany: '{{characters}} letras demasiados',\r\n checksPassing: '{{current}}/{{max}} las comprobaciones están pasando',\r\n generateAi: 'Generar IA',\r\n good: 'Bien',\r\n imageAutoGenerationTip: 'La autogeneración recuperará la imagen de héroe seleccionada.',\r\n lengthTipDescription:\r\n 'Esto debe estar entre {{minLength}} y {{maxLength}} caracteres. Para obtener ayuda sobre cómo escribir meta descripciones de calidad, consulte ',\r\n lengthTipTitle:\r\n 'Debe tener entre {{minLength}} y {{maxLength}} caracteres. Para obtener ayuda sobre cómo escribir metatítulos de calidad, consulte ',\r\n missing: 'Falta',\r\n noImage: 'Sin imagen',\r\n preview: 'Vista previa',\r\n previewDescription:\r\n 'Las listas de resultados pueden variar segun la relevancia de buesqueda y el contenido.',\r\n tooLong: 'Demasiado largo',\r\n tooShort: 'Demasiado corto',\r\n },\r\n}\r\n"],"names":["es","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/fa.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const fa: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'چیزیی باقی نمونده',\n autoGenerate: 'تولید خودکار',\n bestPractices: 'آموزش بیشتر',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} کلمه، ',\n charactersLeftOver: '{{characters}} باقی مانده',\n charactersToGo: '{{characters}} باقی مانده',\n charactersTooMany: '{{characters}} بیش از حد',\n checksPassing: '{{current}}/{{max}} بررسی‌ها با موفقیت انجام شده است',\n generateAi: 'تولید AI',\n good: 'خوب',\n imageAutoGenerationTip:\n 'این قابلیت، تصویر فعلی بارگذاری شده در مجموعه محتوای شما را بازیابی می‌کند',\n lengthTipDescription:\n 'این باید بین {{minLength}} و {{maxLength}} کلمه باشد. برای کمک در نوشتن توضیحات متا با کیفیت، مراجعه کنید به ',\n lengthTipTitle:\n 'این باید بین {{minLength}} و {{maxLength}} کلمه باشد. برای کمک در نوشتن عناوین متا با کیفیت، مراجعه کنید به ',\n missing: 'ناقص',\n noImage: 'بدون تصویر',\n preview: 'پیش‌نمایش',\n previewDescription: 'فهرست نتایج ممکن است بر اساس محتوا و متناسب با کلمه کلیدی جستجو شده باشند',\n tooLong: 'خیلی طولانی',\n tooShort: 'خیلی کوتاه',\n },\n}\n"],"names":["fa","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBACE;QACFC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/fa.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const fa: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'چیزیی باقی نمونده',\r\n autoGenerate: 'تولید خودکار',\r\n bestPractices: 'آموزش بیشتر',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} کلمه، ',\r\n charactersLeftOver: '{{characters}} باقی مانده',\r\n charactersToGo: '{{characters}} باقی مانده',\r\n charactersTooMany: '{{characters}} بیش از حد',\r\n checksPassing: '{{current}}/{{max}} بررسی‌ها با موفقیت انجام شده است',\r\n generateAi: 'تولید AI',\r\n good: 'خوب',\r\n imageAutoGenerationTip:\r\n 'این قابلیت، تصویر فعلی بارگذاری شده در مجموعه محتوای شما را بازیابی می‌کند',\r\n lengthTipDescription:\r\n 'این باید بین {{minLength}} و {{maxLength}} کلمه باشد. برای کمک در نوشتن توضیحات متا با کیفیت، مراجعه کنید به ',\r\n lengthTipTitle:\r\n 'این باید بین {{minLength}} و {{maxLength}} کلمه باشد. برای کمک در نوشتن عناوین متا با کیفیت، مراجعه کنید به ',\r\n missing: 'ناقص',\r\n noImage: 'بدون تصویر',\r\n preview: 'پیش‌نمایش',\r\n previewDescription: 'فهرست نتایج ممکن است بر اساس محتوا و متناسب با کلمه کلیدی جستجو شده باشند',\r\n tooLong: 'خیلی طولانی',\r\n tooShort: 'خیلی کوتاه',\r\n },\r\n}\r\n"],"names":["fa","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBACE;QACFC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/fr.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const fr: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'On y est presque',\n autoGenerate: 'Auto-générer',\n bestPractices: 'bonnes pratiques',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} caractères, ',\n charactersLeftOver: '{{characters}} restants',\n charactersToGo: '{{characters}} à ajouter',\n charactersTooMany: '{{characters}} en trop',\n checksPassing: '{{current}}/{{max}} vérifications réussies',\n generateAi: 'Générer IA',\n good: 'Bien',\n imageAutoGenerationTip: \"L'auto-génération récupérera l'image principale sélectionnée.\",\n lengthTipDescription:\n \"Ceci devrait contenir entre {{minLength}} et {{maxLength}} caractères. Pour obtenir de l'aide pour rédiger des descriptions meta de qualité, consultez les \",\n lengthTipTitle:\n \"Ceci devrait contenir entre {{minLength}} et {{maxLength}} caractères. Pour obtenir de l'aide pour rédiger des titres meta de qualité, consultez les \",\n missing: 'Manquant',\n noImage: \"Pas d'image\",\n preview: 'Aperçu',\n previewDescription:\n 'Les résultats exacts peuvent varier en fonction du contenu et de la pertinence de la recherche.',\n tooLong: 'Trop long',\n tooShort: 'Trop court',\n },\n}\n"],"names":["fr","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/fr.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const fr: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'On y est presque',\r\n autoGenerate: 'Auto-générer',\r\n bestPractices: 'bonnes pratiques',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} caractères, ',\r\n charactersLeftOver: '{{characters}} restants',\r\n charactersToGo: '{{characters}} à ajouter',\r\n charactersTooMany: '{{characters}} en trop',\r\n checksPassing: '{{current}}/{{max}} vérifications réussies',\r\n generateAi: 'Générer IA',\r\n good: 'Bien',\r\n imageAutoGenerationTip: \"L'auto-génération récupérera l'image principale sélectionnée.\",\r\n lengthTipDescription:\r\n \"Ceci devrait contenir entre {{minLength}} et {{maxLength}} caractères. Pour obtenir de l'aide pour rédiger des descriptions meta de qualité, consultez les \",\r\n lengthTipTitle:\r\n \"Ceci devrait contenir entre {{minLength}} et {{maxLength}} caractères. Pour obtenir de l'aide pour rédiger des titres meta de qualité, consultez les \",\r\n missing: 'Manquant',\r\n noImage: \"Pas d'image\",\r\n preview: 'Aperçu',\r\n previewDescription:\r\n 'Les résultats exacts peuvent varier en fonction du contenu et de la pertinence de la recherche.',\r\n tooLong: 'Trop long',\r\n tooShort: 'Trop court',\r\n },\r\n}\r\n"],"names":["fr","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/index.ts"],"sourcesContent":["import type { GenericTranslationsObject, NestedKeysStripped } from '@payloadcms/translations'\n\nimport { cs } from './cs'\nimport { de } from './de'\nimport { en } from './en'\nimport { es } from './es'\nimport { fa } from './fa'\nimport { fr } from './fr'\nimport { it } from './it'\nimport { nb } from './nb'\nimport { pl } from './pl'\nimport { ru } from './ru'\nimport { sv } from './sv'\nimport { tr } from './tr'\nimport { uk } from './uk'\n\nexport const translations = {\n cs,\n de,\n en,\n es,\n fa,\n fr,\n it,\n nb,\n pl,\n ru,\n sv,\n tr,\n uk,\n}\n\nexport type PluginSEOTranslations = GenericTranslationsObject\n\nexport type PluginSEOTranslationKeys = NestedKeysStripped<PluginSEOTranslations>\n"],"names":["cs","de","en","es","fa","fr","it","nb","pl","ru","sv","tr","uk","translations"],"mappings":"AAEA,SAASA,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AAEzB,OAAO,MAAMC,eAAe;IAC1Bb;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/index.ts"],"sourcesContent":["import type { GenericTranslationsObject, NestedKeysStripped } from '@payloadcms/translations'\r\n\r\nimport { cs } from './cs'\r\nimport { de } from './de'\r\nimport { en } from './en'\r\nimport { es } from './es'\r\nimport { fa } from './fa'\r\nimport { fr } from './fr'\r\nimport { it } from './it'\r\nimport { nb } from './nb'\r\nimport { pl } from './pl'\r\nimport { ru } from './ru'\r\nimport { sv } from './sv'\r\nimport { tr } from './tr'\r\nimport { uk } from './uk'\r\n\r\nexport const translations = {\r\n cs,\r\n de,\r\n en,\r\n es,\r\n fa,\r\n fr,\r\n it,\r\n nb,\r\n pl,\r\n ru,\r\n sv,\r\n tr,\r\n uk,\r\n}\r\n\r\nexport type PluginSEOTranslations = GenericTranslationsObject\r\n\r\nexport type PluginSEOTranslationKeys = NestedKeysStripped<PluginSEOTranslations>\r\n"],"names":["cs","de","en","es","fa","fr","it","nb","pl","ru","sv","tr","uk","translations"],"mappings":"AAEA,SAASA,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AACzB,SAASC,EAAE,QAAQ,OAAM;AAEzB,OAAO,MAAMC,eAAe;IAC1Bb;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/it.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const it: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Ci siamo quasi',\n autoGenerate: 'Generazione automatica',\n bestPractices: 'migliori pratiche',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} caratteri, ',\n charactersLeftOver: '{{characters}} rimasti',\n charactersToGo: '{{characters}} mancanti',\n charactersTooMany: '{{characters}} in più',\n checksPassing: '{{current}}/{{max}} controlli superati',\n generateAi: 'Genera AI',\n good: 'Bene',\n imageAutoGenerationTip:\n \"La generazione automatica recupererà l'immagine selezionata per l'hero\",\n lengthTipDescription:\n 'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta descrizioni di qualità, vedere ',\n lengthTipTitle:\n 'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta titoli di qualità, vedere ',\n missing: 'Mancante',\n noImage: 'Nessuna Immagine',\n preview: 'Anteprima',\n previewDescription:\n 'I risultati esatti possono variare in base al contenuto e alla pertinenza della ricerca.',\n tooLong: 'Troppo lungo',\n tooShort: 'Troppo corto',\n },\n}\n"],"names":["it","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBACE;QACFC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/it.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const it: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Ci siamo quasi',\r\n autoGenerate: 'Generazione automatica',\r\n bestPractices: 'migliori pratiche',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} caratteri, ',\r\n charactersLeftOver: '{{characters}} rimasti',\r\n charactersToGo: '{{characters}} mancanti',\r\n charactersTooMany: '{{characters}} in più',\r\n checksPassing: '{{current}}/{{max}} controlli superati',\r\n generateAi: 'Genera AI',\r\n good: 'Bene',\r\n imageAutoGenerationTip:\r\n \"La generazione automatica recupererà l'immagine selezionata per l'hero\",\r\n lengthTipDescription:\r\n 'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta descrizioni di qualità, vedere ',\r\n lengthTipTitle:\r\n 'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta titoli di qualità, vedere ',\r\n missing: 'Mancante',\r\n noImage: 'Nessuna Immagine',\r\n preview: 'Anteprima',\r\n previewDescription:\r\n 'I risultati esatti possono variare in base al contenuto e alla pertinenza della ricerca.',\r\n tooLong: 'Troppo lungo',\r\n tooShort: 'Troppo corto',\r\n },\r\n}\r\n"],"names":["it","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBACE;QACFC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/nb.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const nb: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Nesten der',\n autoGenerate: 'Auto-generer',\n bestPractices: 'beste praksis',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} tegn, ',\n charactersLeftOver: '{{characters}} til overs',\n charactersToGo: '{{characters}} igjen',\n charactersTooMany: '{{characters}} for mange',\n checksPassing: '{{current}}/{{max}} sjekker bestått',\n generateAi: 'Generer AI',\n good: 'Bra',\n imageAutoGenerationTip: 'Auto-generering vil hente det valgte hero-bildet.',\n lengthTipDescription:\n 'Dette bør være mellom {{minLength}} og {{maxLength}} tegn. For hjelp til å skrive beskrivelser av god kvalitet, se ',\n lengthTipTitle:\n 'Dette bør være mellom {{minLength}} og {{maxLength}} tegn. For hjelp til å skrive metatitler av god kvalitet, se ',\n missing: 'Mangler',\n noImage: 'Bilde mangler',\n preview: 'Forhåndsvisning',\n previewDescription:\n 'Eksakte resultatoppføringer kan variere basert på innhold og søke relevans.',\n tooLong: 'For lang',\n tooShort: 'For kort',\n },\n}\n"],"names":["nb","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/nb.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const nb: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Nesten der',\r\n autoGenerate: 'Auto-generer',\r\n bestPractices: 'beste praksis',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} tegn, ',\r\n charactersLeftOver: '{{characters}} til overs',\r\n charactersToGo: '{{characters}} igjen',\r\n charactersTooMany: '{{characters}} for mange',\r\n checksPassing: '{{current}}/{{max}} sjekker bestått',\r\n generateAi: 'Generer AI',\r\n good: 'Bra',\r\n imageAutoGenerationTip: 'Auto-generering vil hente det valgte hero-bildet.',\r\n lengthTipDescription:\r\n 'Dette bør være mellom {{minLength}} og {{maxLength}} tegn. For hjelp til å skrive beskrivelser av god kvalitet, se ',\r\n lengthTipTitle:\r\n 'Dette bør være mellom {{minLength}} og {{maxLength}} tegn. For hjelp til å skrive metatitler av god kvalitet, se ',\r\n missing: 'Mangler',\r\n noImage: 'Bilde mangler',\r\n preview: 'Forhåndsvisning',\r\n previewDescription:\r\n 'Eksakte resultatoppføringer kan variere basert på innhold og søke relevans.',\r\n tooLong: 'For lang',\r\n tooShort: 'For kort',\r\n },\r\n}\r\n"],"names":["nb","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/pl.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const pl: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Prawie gotowe',\n autoGenerate: 'Wygeneruj automatycznie',\n bestPractices: 'najlepsze praktyki',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} znaków, ',\n charactersLeftOver: 'zostało {{characters}} znaków',\n charactersToGo: 'pozostało {{characters}} znaków',\n charactersTooMany: '{{characters}} znaków za dużo',\n checksPassing: '{{current}}/{{max}} testów zakończonych pomyślnie',\n generateAi: 'Generuj AI',\n good: 'Dobrze',\n imageAutoGenerationTip: 'Automatyczne generowanie pobierze wybrany główny obraz.',\n lengthTipDescription:\n 'Długość powinna wynosić od {{minLength}} do {{maxLength}} znaków. Po porady dotyczące pisania wysokiej jakości meta opisów zobacz ',\n lengthTipTitle:\n 'Długość powinna wynosić od {{minLength}} do {{maxLength}} znaków. Po porady dotyczące pisania wysokiej jakości meta tytułów zobacz ',\n missing: 'Brakuje',\n noImage: 'Brak obrazu',\n preview: 'Podgląd',\n previewDescription:\n 'Dokładne wyniki listowania mogą się różnić w zależności od treści i zgodności z kryteriami wyszukiwania.',\n tooLong: 'Zbyt długie',\n tooShort: 'Zbyt krótkie',\n },\n}\n"],"names":["pl","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/pl.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const pl: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Prawie gotowe',\r\n autoGenerate: 'Wygeneruj automatycznie',\r\n bestPractices: 'najlepsze praktyki',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} znaków, ',\r\n charactersLeftOver: 'zostało {{characters}} znaków',\r\n charactersToGo: 'pozostało {{characters}} znaków',\r\n charactersTooMany: '{{characters}} znaków za dużo',\r\n checksPassing: '{{current}}/{{max}} testów zakończonych pomyślnie',\r\n generateAi: 'Generuj AI',\r\n good: 'Dobrze',\r\n imageAutoGenerationTip: 'Automatyczne generowanie pobierze wybrany główny obraz.',\r\n lengthTipDescription:\r\n 'Długość powinna wynosić od {{minLength}} do {{maxLength}} znaków. Po porady dotyczące pisania wysokiej jakości meta opisów zobacz ',\r\n lengthTipTitle:\r\n 'Długość powinna wynosić od {{minLength}} do {{maxLength}} znaków. Po porady dotyczące pisania wysokiej jakości meta tytułów zobacz ',\r\n missing: 'Brakuje',\r\n noImage: 'Brak obrazu',\r\n preview: 'Podgląd',\r\n previewDescription:\r\n 'Dokładne wyniki listowania mogą się różnić w zależności od treści i zgodności z kryteriami wyszukiwania.',\r\n tooLong: 'Zbyt długie',\r\n tooShort: 'Zbyt krótkie',\r\n },\r\n}\r\n"],"names":["pl","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/ru.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const ru: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Почти готово',\n autoGenerate: 'Сгенерировать автоматически',\n bestPractices: 'лучшие практики',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} символов, ',\n charactersLeftOver: 'осталось {{characters}} символов',\n charactersToGo: 'на {{characters}} символов меньше',\n charactersTooMany: 'на {{characters}} символов больше',\n checksPassing: '{{current}}/{{max}} проверок пройдено',\n generateAi: 'Сгенерировать ИИ',\n good: 'Хорошо',\n imageAutoGenerationTip: 'Автогенерация использует выбранное главное изображение.',\n lengthTipDescription:\n 'Должно быть от {{minLength}} до {{maxLength}} символов. Для помощи в написании качественных метаописаний см.',\n lengthTipTitle:\n 'Должно быть от {{minLength}} до {{maxLength}} символов. Для помощи в написании качественных метазаголовков см.',\n missing: 'Отсутствует',\n noImage: 'Нет изображения',\n preview: 'Предварительный просмотр',\n previewDescription:\n 'Фактические результаты могут отличаться в зависимости от контента и релевантности поиска.',\n tooLong: 'Слишком длинно',\n tooShort: 'Слишком коротко',\n },\n}\n"],"names":["ru","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/ru.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const ru: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Почти готово',\r\n autoGenerate: 'Сгенерировать автоматически',\r\n bestPractices: 'лучшие практики',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} символов, ',\r\n charactersLeftOver: 'осталось {{characters}} символов',\r\n charactersToGo: 'на {{characters}} символов меньше',\r\n charactersTooMany: 'на {{characters}} символов больше',\r\n checksPassing: '{{current}}/{{max}} проверок пройдено',\r\n generateAi: 'Сгенерировать ИИ',\r\n good: 'Хорошо',\r\n imageAutoGenerationTip: 'Автогенерация использует выбранное главное изображение.',\r\n lengthTipDescription:\r\n 'Должно быть от {{minLength}} до {{maxLength}} символов. Для помощи в написании качественных метаописаний см.',\r\n lengthTipTitle:\r\n 'Должно быть от {{minLength}} до {{maxLength}} символов. Для помощи в написании качественных метазаголовков см.',\r\n missing: 'Отсутствует',\r\n noImage: 'Нет изображения',\r\n preview: 'Предварительный просмотр',\r\n previewDescription:\r\n 'Фактические результаты могут отличаться в зависимости от контента и релевантности поиска.',\r\n tooLong: 'Слишком длинно',\r\n tooShort: 'Слишком коротко',\r\n },\r\n}\r\n"],"names":["ru","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/sv.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const sv: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Nästan klar',\n autoGenerate: 'Skapa automatiskt',\n bestPractices: 'bästa praxis',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} tecken, ',\n charactersLeftOver: '{{characters}} tecken blir över',\n charactersToGo: '{{characters}} tecken kvar',\n charactersTooMany: '{{characters}} tecken för mycket',\n checksPassing: '{{current}}/{{max}} kontroller är godkända',\n generateAi: 'Skapa AI',\n good: 'Bra',\n imageAutoGenerationTip: 'Den automatiska processen kommer att välja en hero-bild.',\n lengthTipDescription:\n 'Bör vara mellan {{minLength}} och {{maxLength}} tecken. För hjälp med att skriva bra metabeskrivningar, se ',\n lengthTipTitle:\n 'Bör vara mellan {{minLength}} och {{maxLength}} tecken. För hjälp med att skriva bra metatitlar, se ',\n missing: 'Saknas',\n noImage: 'Ingen bild',\n preview: 'Förhandsgranska',\n previewDescription:\n 'Exakta resultatlistningar kan variera baserat på innehåll och sökrelevans.',\n tooLong: 'För lång',\n tooShort: 'För kort',\n },\n}\n"],"names":["sv","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/sv.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const sv: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Nästan klar',\r\n autoGenerate: 'Skapa automatiskt',\r\n bestPractices: 'bästa praxis',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} tecken, ',\r\n charactersLeftOver: '{{characters}} tecken blir över',\r\n charactersToGo: '{{characters}} tecken kvar',\r\n charactersTooMany: '{{characters}} tecken för mycket',\r\n checksPassing: '{{current}}/{{max}} kontroller är godkända',\r\n generateAi: 'Skapa AI',\r\n good: 'Bra',\r\n imageAutoGenerationTip: 'Den automatiska processen kommer att välja en hero-bild.',\r\n lengthTipDescription:\r\n 'Bör vara mellan {{minLength}} och {{maxLength}} tecken. För hjälp med att skriva bra metabeskrivningar, se ',\r\n lengthTipTitle:\r\n 'Bör vara mellan {{minLength}} och {{maxLength}} tecken. För hjälp med att skriva bra metatitlar, se ',\r\n missing: 'Saknas',\r\n noImage: 'Ingen bild',\r\n preview: 'Förhandsgranska',\r\n previewDescription:\r\n 'Exakta resultatlistningar kan variera baserat på innehåll och sökrelevans.',\r\n tooLong: 'För lång',\r\n tooShort: 'För kort',\r\n },\r\n}\r\n"],"names":["sv","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/tr.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const tr: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Neredeyse tamam',\n autoGenerate: 'Otomatik oluştur',\n bestPractices: 'en iyi uygulamalar',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} karakter, ',\n charactersLeftOver: '{{characters}} karakter kaldı',\n charactersToGo: '{{characters}} karakter kaldı',\n charactersTooMany: '{{characters}} karakter fazla',\n checksPassing: '{{current}}/{{max}} kontrol başarılı',\n generateAi: 'AI oluştur',\n good: 'İyi',\n imageAutoGenerationTip: 'Otomatik oluşturma, seçilen ana görseli alacaktır.',\n lengthTipDescription:\n '{{minLength}} ile {{maxLength}} karakter arasında olmalıdır. Kaliteli meta açıklamaları yazmak için yardım almak için bkz. ',\n lengthTipTitle:\n '{{minLength}} ile {{maxLength}} karakter arasında olmalıdır. Kaliteli meta başlıkları yazmak için yardım almak için bkz. ',\n missing: 'Eksik',\n noImage: 'Görsel yok',\n preview: 'Önizleme',\n previewDescription: 'Kesin sonuç listeleri içeriğe ve arama alâkasına göre değişebilir.',\n tooLong: 'Çok uzun',\n tooShort: 'Çok kısa',\n },\n}\n"],"names":["tr","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/tr.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const tr: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Neredeyse tamam',\r\n autoGenerate: 'Otomatik oluştur',\r\n bestPractices: 'en iyi uygulamalar',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} karakter, ',\r\n charactersLeftOver: '{{characters}} karakter kaldı',\r\n charactersToGo: '{{characters}} karakter kaldı',\r\n charactersTooMany: '{{characters}} karakter fazla',\r\n checksPassing: '{{current}}/{{max}} kontrol başarılı',\r\n generateAi: 'AI oluştur',\r\n good: 'İyi',\r\n imageAutoGenerationTip: 'Otomatik oluşturma, seçilen ana görseli alacaktır.',\r\n lengthTipDescription:\r\n '{{minLength}} ile {{maxLength}} karakter arasında olmalıdır. Kaliteli meta açıklamaları yazmak için yardım almak için bkz. ',\r\n lengthTipTitle:\r\n '{{minLength}} ile {{maxLength}} karakter arasında olmalıdır. Kaliteli meta başlıkları yazmak için yardım almak için bkz. ',\r\n missing: 'Eksik',\r\n noImage: 'Görsel yok',\r\n preview: 'Önizleme',\r\n previewDescription: 'Kesin sonuç listeleri içeriğe ve arama alâkasına göre değişebilir.',\r\n tooLong: 'Çok uzun',\r\n tooShort: 'Çok kısa',\r\n },\r\n}\r\n"],"names":["tr","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/uk.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const uk: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Ще трошки',\n autoGenerate: 'Згенерувати',\n bestPractices: 'найкращі практики',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} символів, ',\n charactersLeftOver: 'залишилось {{characters}} символів',\n charactersToGo: ' на {{characters}} символів коротше',\n charactersTooMany: 'на {{characters}} символів довше',\n checksPassing: '{{current}}/{{max}} перевірок пройдено',\n generateAi: 'Згенерувати ШІ',\n good: 'Чудово',\n imageAutoGenerationTip: 'Автоматична генерація використає зображення з головного блоку',\n lengthTipDescription:\n 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метаописи — перегляньте ',\n lengthTipTitle:\n 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метазаголовки — перегляньте ',\n missing: 'Відсутнє',\n noImage: 'Немає зображення',\n preview: 'Попередній перегляд',\n previewDescription:\n 'Реальне відображення може відрізнятися в залежності від вмісту та релевантності пошуку.',\n tooLong: 'Задовгий',\n tooShort: 'Закороткий',\n },\n}\n"],"names":["uk","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/uk.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const uk: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Ще трошки',\r\n autoGenerate: 'Згенерувати',\r\n bestPractices: 'найкращі практики',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} символів, ',\r\n charactersLeftOver: 'залишилось {{characters}} символів',\r\n charactersToGo: ' на {{characters}} символів коротше',\r\n charactersTooMany: 'на {{characters}} символів довше',\r\n checksPassing: '{{current}}/{{max}} перевірок пройдено',\r\n generateAi: 'Згенерувати ШІ',\r\n good: 'Чудово',\r\n imageAutoGenerationTip: 'Автоматична генерація використає зображення з головного блоку',\r\n lengthTipDescription:\r\n 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метаописи — перегляньте ',\r\n lengthTipTitle:\r\n 'Має бути від {{minLength}} до {{maxLength}} символів. Щоб дізнатися, як писати якісні метазаголовки — перегляньте ',\r\n missing: 'Відсутнє',\r\n noImage: 'Немає зображення',\r\n preview: 'Попередній перегляд',\r\n previewDescription:\r\n 'Реальне відображення може відрізнятися в залежності від вмісту та релевантності пошуку.',\r\n tooLong: 'Задовгий',\r\n tooShort: 'Закороткий',\r\n },\r\n}\r\n"],"names":["uk","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBACE;QACFC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/translations/vi.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\n\nexport const vi: GenericTranslationsObject = {\n $schema: './translation-schema.json',\n 'plugin-seo': {\n almostThere: 'Gần đạt',\n autoGenerate: 'Tự động tạo',\n bestPractices: 'các phương pháp hay nhất',\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} kí tự, ',\n charactersLeftOver: 'còn lại {{characters}}',\n charactersToGo: 'Còn {{characters}} ký tự nữa',\n charactersTooMany: 'vượt quá {{characters}} ký tự',\n checksPassing: '{{current}}/{{max}} đã đạt',\n generateAi: 'Tạo AI',\n good: 'Tốt',\n imageAutoGenerationTip: 'Tính năng tự động tạo sẽ lấy ảnh đầu tiên được chọn.',\n lengthTipDescription:\n 'Độ dài nên từ {{minLength}}-{{maxLength}} kí tự. Để được hướng dẫn viết mô tả meta chất lượng, hãy xem ',\n lengthTipTitle:\n 'Độ dài nên từ {{minLength}}-{{maxLength}} kí tự. Để được hướng dẫn viết mô tả meta chất lượng, hãy xem ',\n missing: 'Không đạt',\n noImage: 'Chưa có ảnh',\n preview: 'Xem trước',\n previewDescription: 'Kết quả hiển thị có thể thay đổi tuỳ theo nội dung và công cụ tìm kiếm.',\n tooLong: 'Quá dài',\n tooShort: 'Quá ngắn',\n },\n}\n"],"names":["vi","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/translations/vi.ts"],"sourcesContent":["import type { GenericTranslationsObject } from '@payloadcms/translations'\r\n\r\nexport const vi: GenericTranslationsObject = {\r\n $schema: './translation-schema.json',\r\n 'plugin-seo': {\r\n almostThere: 'Gần đạt',\r\n autoGenerate: 'Tự động tạo',\r\n bestPractices: 'các phương pháp hay nhất',\r\n characterCount: '{{current}}/{{minLength}}-{{maxLength}} kí tự, ',\r\n charactersLeftOver: 'còn lại {{characters}}',\r\n charactersToGo: 'Còn {{characters}} ký tự nữa',\r\n charactersTooMany: 'vượt quá {{characters}} ký tự',\r\n checksPassing: '{{current}}/{{max}} đã đạt',\r\n generateAi: 'Tạo AI',\r\n good: 'Tốt',\r\n imageAutoGenerationTip: 'Tính năng tự động tạo sẽ lấy ảnh đầu tiên được chọn.',\r\n lengthTipDescription:\r\n 'Độ dài nên từ {{minLength}}-{{maxLength}} kí tự. Để được hướng dẫn viết mô tả meta chất lượng, hãy xem ',\r\n lengthTipTitle:\r\n 'Độ dài nên từ {{minLength}}-{{maxLength}} kí tự. Để được hướng dẫn viết mô tả meta chất lượng, hãy xem ',\r\n missing: 'Không đạt',\r\n noImage: 'Chưa có ảnh',\r\n preview: 'Xem trước',\r\n previewDescription: 'Kết quả hiển thị có thể thay đổi tuỳ theo nội dung và công cụ tìm kiếm.',\r\n tooLong: 'Quá dài',\r\n tooShort: 'Quá ngắn',\r\n },\r\n}\r\n"],"names":["vi","$schema","almostThere","autoGenerate","bestPractices","characterCount","charactersLeftOver","charactersToGo","charactersTooMany","checksPassing","generateAi","good","imageAutoGenerationTip","lengthTipDescription","lengthTipTitle","missing","noImage","preview","previewDescription","tooLong","tooShort"],"mappings":"AAEA,OAAO,MAAMA,KAAgC;IAC3CC,SAAS;IACT,cAAc;QACZC,aAAa;QACbC,cAAc;QACdC,eAAe;QACfC,gBAAgB;QAChBC,oBAAoB;QACpBC,gBAAgB;QAChBC,mBAAmB;QACnBC,eAAe;QACfC,YAAY;QACZC,MAAM;QACNC,wBAAwB;QACxBC,sBACE;QACFC,gBACE;QACFC,SAAS;QACTC,SAAS;QACTC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTC,UAAU;IACZ;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types.ts"],"sourcesContent":["import type { DocumentInfoContext } from '@payloadcms/ui'\nimport type {\n CollectionConfig,\n CollectionSlug,\n Field,\n GlobalConfig,\n GlobalSlug,\n PayloadRequest,\n} from 'payload'\n\nexport type FieldsOverride = (args: { defaultFields: Field[] }) => Field[]\n\nexport type PartialDocumentInfoContext = Pick<\n DocumentInfoContext,\n | 'collectionSlug'\n | 'docPermissions'\n | 'globalSlug'\n | 'hasPublishPermission'\n | 'hasPublishedDoc'\n | 'hasSavePermission'\n | 'id'\n | 'initialData'\n | 'initialState'\n | 'preferencesKey'\n | 'title'\n | 'versionCount'\n>\n\nexport type GenerateTitle<T = any> = (\n args: {\n collectionConfig?: CollectionConfig\n doc: T\n globalConfig?: GlobalConfig\n locale?: string\n req: PayloadRequest\n } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type GenerateDescription<T = any> = (\n args: {\n collectionConfig?: CollectionConfig\n doc: T\n globalConfig?: GlobalConfig\n locale?: string\n req: PayloadRequest\n } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type GenerateImage<T = any> = (\n args: {\n collectionConfig?: CollectionConfig\n doc: T\n globalConfig?: GlobalConfig\n locale?: string\n req: PayloadRequest\n } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type GenerateURL<T = any> = (\n args: {\n collectionConfig?: CollectionConfig\n doc: T\n globalConfig?: GlobalConfig\n locale?: string\n req: PayloadRequest\n } & PartialDocumentInfoContext,\n) => Promise<string> | string\n\nexport type SEOPluginConfig = {\n /**\n * Collections to include the SEO fields in\n */\n collections?: CollectionSlug[]\n /**\n * Override the default fields inserted by the SEO plugin via a function that receives the default fields and returns the new fields\n *\n * If you need more flexibility you can insert the fields manually as needed. @link https://payloadcms.com/docs/plugins/seo#direct-use-of-fields\n */\n fields?: FieldsOverride\n generateDescription?: GenerateDescription\n generateDescriptionAi?: GenerateDescription\n generateImage?: GenerateImage\n generateTitle?: GenerateTitle\n generateTitleAi?: GenerateTitle\n /**\n *\n */\n generateURL?: GenerateURL\n /**\n * Globals to include the SEO fields in\n */\n globals?: GlobalSlug[]\n interfaceName?: string\n /**\n * OpenAI API key for generating descriptions and titles\n * @link https://platform.openai.com/docs/guides/authentication\n */\n openaiApiKey?: string\n /**\n * Group fields into tabs, your content will be automatically put into a general tab and the SEO fields into an SEO tab\n *\n * If you need more flexibility you can insert the fields manually as needed. @link https://payloadcms.com/docs/plugins/seo#direct-use-of-fields\n */\n tabbedUI?: boolean\n\n /**\n * The slug of the collection used to handle image uploads\n */\n uploadsCollection?: CollectionSlug\n}\n\nexport type Meta = {\n description?: string\n image?: any // TODO: type this\n keywords?: string\n title?: string\n}\n"],"names":[],"mappings":"AA+GA,WAKC"}
1
+ {"version":3,"sources":["../../src/types.ts"],"sourcesContent":["import type { DocumentInfoContext } from '@payloadcms/ui'\r\nimport type {\r\n CollectionConfig,\r\n CollectionSlug,\r\n Field,\r\n GlobalConfig,\r\n GlobalSlug,\r\n PayloadRequest,\r\n} from 'payload'\r\n\r\nexport type FieldsOverride = (args: { defaultFields: Field[] }) => Field[]\r\n\r\nexport type PartialDocumentInfoContext = Pick<\r\n DocumentInfoContext,\r\n | 'collectionSlug'\r\n | 'docPermissions'\r\n | 'globalSlug'\r\n | 'hasPublishPermission'\r\n | 'hasPublishedDoc'\r\n | 'hasSavePermission'\r\n | 'id'\r\n | 'initialData'\r\n | 'initialState'\r\n | 'preferencesKey'\r\n | 'title'\r\n | 'versionCount'\r\n>\r\n\r\nexport type GenerateTitle<T = any> = (\r\n args: {\r\n collectionConfig?: CollectionConfig\r\n doc: T\r\n globalConfig?: GlobalConfig\r\n locale?: string\r\n req: PayloadRequest\r\n } & PartialDocumentInfoContext,\r\n) => Promise<string> | string\r\n\r\nexport type GenerateDescription<T = any> = (\r\n args: {\r\n collectionConfig?: CollectionConfig\r\n doc: T\r\n globalConfig?: GlobalConfig\r\n locale?: string\r\n req: PayloadRequest\r\n } & PartialDocumentInfoContext,\r\n) => Promise<string> | string\r\n\r\nexport type GenerateImage<T = any> = (\r\n args: {\r\n collectionConfig?: CollectionConfig\r\n doc: T\r\n globalConfig?: GlobalConfig\r\n locale?: string\r\n req: PayloadRequest\r\n } & PartialDocumentInfoContext,\r\n) => Promise<string> | string\r\n\r\nexport type GenerateURL<T = any> = (\r\n args: {\r\n collectionConfig?: CollectionConfig\r\n doc: T\r\n globalConfig?: GlobalConfig\r\n locale?: string\r\n req: PayloadRequest\r\n } & PartialDocumentInfoContext,\r\n) => Promise<string> | string\r\n\r\nexport type SEOPluginConfig = {\r\n /**\r\n * Collections to include the SEO fields in\r\n */\r\n collections?: CollectionSlug[]\r\n /**\r\n * Override the default fields inserted by the SEO plugin via a function that receives the default fields and returns the new fields\r\n *\r\n * If you need more flexibility you can insert the fields manually as needed. @link https://payloadcms.com/docs/plugins/seo#direct-use-of-fields\r\n */\r\n fields?: FieldsOverride\r\n generateDescription?: GenerateDescription\r\n generateDescriptionAi?: GenerateDescription\r\n generateImage?: GenerateImage\r\n generateTitle?: GenerateTitle\r\n generateTitleAi?: GenerateTitle\r\n /**\r\n *\r\n */\r\n generateURL?: GenerateURL\r\n /**\r\n * Globals to include the SEO fields in\r\n */\r\n globals?: GlobalSlug[]\r\n interfaceName?: string\r\n /**\r\n * OpenAI API key for generating descriptions and titles\r\n * @link https://platform.openai.com/docs/guides/authentication\r\n */\r\n openaiApiKey?: string\r\n /**\r\n * Group fields into tabs, your content will be automatically put into a general tab and the SEO fields into an SEO tab\r\n *\r\n * If you need more flexibility you can insert the fields manually as needed. @link https://payloadcms.com/docs/plugins/seo#direct-use-of-fields\r\n */\r\n tabbedUI?: boolean\r\n\r\n /**\r\n * The slug of the collection used to handle image uploads\r\n */\r\n uploadsCollection?: CollectionSlug\r\n}\r\n\r\nexport type Meta = {\r\n description?: string\r\n image?: any // TODO: type this\r\n keywords?: string\r\n title?: string\r\n}\r\n"],"names":[],"mappings":"AA+GA,WAKC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/LengthIndicator.tsx"],"sourcesContent":["'use client'\n\nimport { useTranslation } from '@payloadcms/ui'\nimport React, { Fragment, useEffect, useState } from 'react'\n\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../translations/index.js'\nimport { Pill } from './Pill.js'\n\nexport const LengthIndicator: React.FC<{\n maxLength?: number\n minLength?: number\n text?: string\n}> = (props) => {\n const { maxLength = 0, minLength = 0, text } = props\n\n const [labelStyle, setLabelStyle] = useState({\n backgroundColor: '',\n color: '',\n })\n\n const [label, setLabel] = useState('')\n\n const [barWidth, setBarWidth] = useState<number>(0)\n\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\n\n useEffect(() => {\n const textLength = text?.length || 0\n\n if (textLength === 0) {\n setLabel(t('plugin-seo:missing'))\n setLabelStyle({\n backgroundColor: 'red',\n color: 'white',\n })\n setBarWidth(0)\n } else {\n const progress = (textLength - minLength) / (maxLength - minLength)\n\n if (progress < 0) {\n const ratioUntilMin = textLength / minLength\n\n if (ratioUntilMin > 0.9) {\n setLabel(t('plugin-seo:almostThere'))\n setLabelStyle({\n backgroundColor: 'orange',\n color: 'white',\n })\n } else {\n setLabel(t('plugin-seo:tooShort'))\n setLabelStyle({\n backgroundColor: 'orangered',\n color: 'white',\n })\n }\n\n setBarWidth(ratioUntilMin)\n }\n\n if (progress >= 0 && progress <= 1) {\n setLabel(t('plugin-seo:good'))\n setLabelStyle({\n backgroundColor: 'green',\n color: 'white',\n })\n setBarWidth(progress)\n }\n\n if (progress > 1) {\n setLabel(t('plugin-seo:tooLong'))\n setLabelStyle({\n backgroundColor: 'red',\n color: 'white',\n })\n setBarWidth(1)\n }\n }\n }, [minLength, maxLength, text, t])\n\n const textLength = text?.length || 0\n\n const charsUntilMax = maxLength - textLength\n\n const charsUntilMin = minLength - textLength\n\n return (\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n width: '100%',\n }}\n >\n <Pill backgroundColor={labelStyle.backgroundColor} color={labelStyle.color} label={label} />\n <div\n style={{\n flexShrink: 0,\n lineHeight: 1,\n marginRight: '10px',\n whiteSpace: 'nowrap',\n }}\n >\n <small>\n {t('plugin-seo:characterCount', { current: text?.length || 0, maxLength, minLength })}\n {(textLength === 0 || charsUntilMin > 0) && (\n <Fragment>{t('plugin-seo:charactersToGo', { characters: charsUntilMin })}</Fragment>\n )}\n {charsUntilMin <= 0 && charsUntilMax >= 0 && (\n <Fragment>{t('plugin-seo:charactersLeftOver', { characters: charsUntilMax })}</Fragment>\n )}\n {charsUntilMax < 0 && (\n <Fragment>\n {t('plugin-seo:charactersTooMany', { characters: charsUntilMax * -1 })}\n </Fragment>\n )}\n </small>\n </div>\n <div\n style={{\n backgroundColor: '#F3F3F3',\n height: '2px',\n position: 'relative',\n width: '100%',\n }}\n >\n <div\n style={{\n backgroundColor: labelStyle.backgroundColor,\n height: '100%',\n left: 0,\n position: 'absolute',\n top: 0,\n width: `${barWidth * 100}%`,\n }}\n />\n </div>\n </div>\n )\n}\n"],"names":["useTranslation","React","Fragment","useEffect","useState","Pill","LengthIndicator","props","maxLength","minLength","text","labelStyle","setLabelStyle","backgroundColor","color","label","setLabel","barWidth","setBarWidth","t","textLength","length","progress","ratioUntilMin","charsUntilMax","charsUntilMin","div","style","alignItems","display","width","flexShrink","lineHeight","marginRight","whiteSpace","small","current","characters","height","position","left","top"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,SAASC,QAAQ,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAG5D,SAASC,IAAI,QAAQ,YAAW;AAEhC,OAAO,MAAMC,kBAIR,CAACC;IACJ,MAAM,EAAEC,YAAY,CAAC,EAAEC,YAAY,CAAC,EAAEC,IAAI,EAAE,GAAGH;IAE/C,MAAM,CAACI,YAAYC,cAAc,GAAGR,SAAS;QAC3CS,iBAAiB;QACjBC,OAAO;IACT;IAEA,MAAM,CAACC,OAAOC,SAAS,GAAGZ,SAAS;IAEnC,MAAM,CAACa,UAAUC,YAAY,GAAGd,SAAiB;IAEjD,MAAM,EAAEe,CAAC,EAAE,GAAGnB;IAEdG,UAAU;QACR,MAAMiB,aAAaV,MAAMW,UAAU;QAEnC,IAAID,eAAe,GAAG;YACpBJ,SAASG,EAAE;YACXP,cAAc;gBACZC,iBAAiB;gBACjBC,OAAO;YACT;YACAI,YAAY;QACd,OAAO;YACL,MAAMI,WAAW,AAACF,CAAAA,aAAaX,SAAQ,IAAMD,CAAAA,YAAYC,SAAQ;YAEjE,IAAIa,WAAW,GAAG;gBAChB,MAAMC,gBAAgBH,aAAaX;gBAEnC,IAAIc,gBAAgB,KAAK;oBACvBP,SAASG,EAAE;oBACXP,cAAc;wBACZC,iBAAiB;wBACjBC,OAAO;oBACT;gBACF,OAAO;oBACLE,SAASG,EAAE;oBACXP,cAAc;wBACZC,iBAAiB;wBACjBC,OAAO;oBACT;gBACF;gBAEAI,YAAYK;YACd;YAEA,IAAID,YAAY,KAAKA,YAAY,GAAG;gBAClCN,SAASG,EAAE;gBACXP,cAAc;oBACZC,iBAAiB;oBACjBC,OAAO;gBACT;gBACAI,YAAYI;YACd;YAEA,IAAIA,WAAW,GAAG;gBAChBN,SAASG,EAAE;gBACXP,cAAc;oBACZC,iBAAiB;oBACjBC,OAAO;gBACT;gBACAI,YAAY;YACd;QACF;IACF,GAAG;QAACT;QAAWD;QAAWE;QAAMS;KAAE;IAElC,MAAMC,aAAaV,MAAMW,UAAU;IAEnC,MAAMG,gBAAgBhB,YAAYY;IAElC,MAAMK,gBAAgBhB,YAAYW;IAElC,qBACE,MAACM;QACCC,OAAO;YACLC,YAAY;YACZC,SAAS;YACTC,OAAO;QACT;;0BAEA,KAACzB;gBAAKQ,iBAAiBF,WAAWE,eAAe;gBAAEC,OAAOH,WAAWG,KAAK;gBAAEC,OAAOA;;0BACnF,KAACW;gBACCC,OAAO;oBACLI,YAAY;oBACZC,YAAY;oBACZC,aAAa;oBACbC,YAAY;gBACd;0BAEA,cAAA,MAACC;;wBACEhB,EAAE,6BAA6B;4BAAEiB,SAAS1B,MAAMW,UAAU;4BAAGb;4BAAWC;wBAAU;wBACjFW,CAAAA,eAAe,KAAKK,gBAAgB,CAAA,mBACpC,KAACvB;sCAAUiB,EAAE,6BAA6B;gCAAEkB,YAAYZ;4BAAc;;wBAEvEA,iBAAiB,KAAKD,iBAAiB,mBACtC,KAACtB;sCAAUiB,EAAE,iCAAiC;gCAAEkB,YAAYb;4BAAc;;wBAE3EA,gBAAgB,mBACf,KAACtB;sCACEiB,EAAE,gCAAgC;gCAAEkB,YAAYb,gBAAgB,CAAC;4BAAE;;;;;0BAK5E,KAACE;gBACCC,OAAO;oBACLd,iBAAiB;oBACjByB,QAAQ;oBACRC,UAAU;oBACVT,OAAO;gBACT;0BAEA,cAAA,KAACJ;oBACCC,OAAO;wBACLd,iBAAiBF,WAAWE,eAAe;wBAC3CyB,QAAQ;wBACRE,MAAM;wBACND,UAAU;wBACVE,KAAK;wBACLX,OAAO,GAAGb,WAAW,IAAI,CAAC,CAAC;oBAC7B;;;;;AAKV,EAAC"}
1
+ {"version":3,"sources":["../../../src/ui/LengthIndicator.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useTranslation } from '@payloadcms/ui'\r\nimport React, { Fragment, useEffect, useState } from 'react'\r\n\r\nimport type { PluginSEOTranslationKeys, PluginSEOTranslations } from '../translations/index.js'\r\nimport { Pill } from './Pill.js'\r\n\r\nexport const LengthIndicator: React.FC<{\r\n maxLength?: number\r\n minLength?: number\r\n text?: string\r\n}> = (props) => {\r\n const { maxLength = 0, minLength = 0, text } = props\r\n\r\n const [labelStyle, setLabelStyle] = useState({\r\n backgroundColor: '',\r\n color: '',\r\n })\r\n\r\n const [label, setLabel] = useState('')\r\n\r\n const [barWidth, setBarWidth] = useState<number>(0)\r\n\r\n const { t } = useTranslation<PluginSEOTranslations, PluginSEOTranslationKeys>()\r\n\r\n useEffect(() => {\r\n const textLength = text?.length || 0\r\n\r\n if (textLength === 0) {\r\n setLabel(t('plugin-seo:missing'))\r\n setLabelStyle({\r\n backgroundColor: 'red',\r\n color: 'white',\r\n })\r\n setBarWidth(0)\r\n } else {\r\n const progress = (textLength - minLength) / (maxLength - minLength)\r\n\r\n if (progress < 0) {\r\n const ratioUntilMin = textLength / minLength\r\n\r\n if (ratioUntilMin > 0.9) {\r\n setLabel(t('plugin-seo:almostThere'))\r\n setLabelStyle({\r\n backgroundColor: 'orange',\r\n color: 'white',\r\n })\r\n } else {\r\n setLabel(t('plugin-seo:tooShort'))\r\n setLabelStyle({\r\n backgroundColor: 'orangered',\r\n color: 'white',\r\n })\r\n }\r\n\r\n setBarWidth(ratioUntilMin)\r\n }\r\n\r\n if (progress >= 0 && progress <= 1) {\r\n setLabel(t('plugin-seo:good'))\r\n setLabelStyle({\r\n backgroundColor: 'green',\r\n color: 'white',\r\n })\r\n setBarWidth(progress)\r\n }\r\n\r\n if (progress > 1) {\r\n setLabel(t('plugin-seo:tooLong'))\r\n setLabelStyle({\r\n backgroundColor: 'red',\r\n color: 'white',\r\n })\r\n setBarWidth(1)\r\n }\r\n }\r\n }, [minLength, maxLength, text, t])\r\n\r\n const textLength = text?.length || 0\r\n\r\n const charsUntilMax = maxLength - textLength\r\n\r\n const charsUntilMin = minLength - textLength\r\n\r\n return (\r\n <div\r\n style={{\r\n alignItems: 'center',\r\n display: 'flex',\r\n width: '100%',\r\n }}\r\n >\r\n <Pill backgroundColor={labelStyle.backgroundColor} color={labelStyle.color} label={label} />\r\n <div\r\n style={{\r\n flexShrink: 0,\r\n lineHeight: 1,\r\n marginRight: '10px',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n <small>\r\n {t('plugin-seo:characterCount', { current: text?.length || 0, maxLength, minLength })}\r\n {(textLength === 0 || charsUntilMin > 0) && (\r\n <Fragment>{t('plugin-seo:charactersToGo', { characters: charsUntilMin })}</Fragment>\r\n )}\r\n {charsUntilMin <= 0 && charsUntilMax >= 0 && (\r\n <Fragment>{t('plugin-seo:charactersLeftOver', { characters: charsUntilMax })}</Fragment>\r\n )}\r\n {charsUntilMax < 0 && (\r\n <Fragment>\r\n {t('plugin-seo:charactersTooMany', { characters: charsUntilMax * -1 })}\r\n </Fragment>\r\n )}\r\n </small>\r\n </div>\r\n <div\r\n style={{\r\n backgroundColor: '#F3F3F3',\r\n height: '2px',\r\n position: 'relative',\r\n width: '100%',\r\n }}\r\n >\r\n <div\r\n style={{\r\n backgroundColor: labelStyle.backgroundColor,\r\n height: '100%',\r\n left: 0,\r\n position: 'absolute',\r\n top: 0,\r\n width: `${barWidth * 100}%`,\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n"],"names":["useTranslation","React","Fragment","useEffect","useState","Pill","LengthIndicator","props","maxLength","minLength","text","labelStyle","setLabelStyle","backgroundColor","color","label","setLabel","barWidth","setBarWidth","t","textLength","length","progress","ratioUntilMin","charsUntilMax","charsUntilMin","div","style","alignItems","display","width","flexShrink","lineHeight","marginRight","whiteSpace","small","current","characters","height","position","left","top"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,SAASC,QAAQ,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAG5D,SAASC,IAAI,QAAQ,YAAW;AAEhC,OAAO,MAAMC,kBAIR,CAACC;IACJ,MAAM,EAAEC,YAAY,CAAC,EAAEC,YAAY,CAAC,EAAEC,IAAI,EAAE,GAAGH;IAE/C,MAAM,CAACI,YAAYC,cAAc,GAAGR,SAAS;QAC3CS,iBAAiB;QACjBC,OAAO;IACT;IAEA,MAAM,CAACC,OAAOC,SAAS,GAAGZ,SAAS;IAEnC,MAAM,CAACa,UAAUC,YAAY,GAAGd,SAAiB;IAEjD,MAAM,EAAEe,CAAC,EAAE,GAAGnB;IAEdG,UAAU;QACR,MAAMiB,aAAaV,MAAMW,UAAU;QAEnC,IAAID,eAAe,GAAG;YACpBJ,SAASG,EAAE;YACXP,cAAc;gBACZC,iBAAiB;gBACjBC,OAAO;YACT;YACAI,YAAY;QACd,OAAO;YACL,MAAMI,WAAW,AAACF,CAAAA,aAAaX,SAAQ,IAAMD,CAAAA,YAAYC,SAAQ;YAEjE,IAAIa,WAAW,GAAG;gBAChB,MAAMC,gBAAgBH,aAAaX;gBAEnC,IAAIc,gBAAgB,KAAK;oBACvBP,SAASG,EAAE;oBACXP,cAAc;wBACZC,iBAAiB;wBACjBC,OAAO;oBACT;gBACF,OAAO;oBACLE,SAASG,EAAE;oBACXP,cAAc;wBACZC,iBAAiB;wBACjBC,OAAO;oBACT;gBACF;gBAEAI,YAAYK;YACd;YAEA,IAAID,YAAY,KAAKA,YAAY,GAAG;gBAClCN,SAASG,EAAE;gBACXP,cAAc;oBACZC,iBAAiB;oBACjBC,OAAO;gBACT;gBACAI,YAAYI;YACd;YAEA,IAAIA,WAAW,GAAG;gBAChBN,SAASG,EAAE;gBACXP,cAAc;oBACZC,iBAAiB;oBACjBC,OAAO;gBACT;gBACAI,YAAY;YACd;QACF;IACF,GAAG;QAACT;QAAWD;QAAWE;QAAMS;KAAE;IAElC,MAAMC,aAAaV,MAAMW,UAAU;IAEnC,MAAMG,gBAAgBhB,YAAYY;IAElC,MAAMK,gBAAgBhB,YAAYW;IAElC,qBACE,MAACM;QACCC,OAAO;YACLC,YAAY;YACZC,SAAS;YACTC,OAAO;QACT;;0BAEA,KAACzB;gBAAKQ,iBAAiBF,WAAWE,eAAe;gBAAEC,OAAOH,WAAWG,KAAK;gBAAEC,OAAOA;;0BACnF,KAACW;gBACCC,OAAO;oBACLI,YAAY;oBACZC,YAAY;oBACZC,aAAa;oBACbC,YAAY;gBACd;0BAEA,cAAA,MAACC;;wBACEhB,EAAE,6BAA6B;4BAAEiB,SAAS1B,MAAMW,UAAU;4BAAGb;4BAAWC;wBAAU;wBACjFW,CAAAA,eAAe,KAAKK,gBAAgB,CAAA,mBACpC,KAACvB;sCAAUiB,EAAE,6BAA6B;gCAAEkB,YAAYZ;4BAAc;;wBAEvEA,iBAAiB,KAAKD,iBAAiB,mBACtC,KAACtB;sCAAUiB,EAAE,iCAAiC;gCAAEkB,YAAYb;4BAAc;;wBAE3EA,gBAAgB,mBACf,KAACtB;sCACEiB,EAAE,gCAAgC;gCAAEkB,YAAYb,gBAAgB,CAAC;4BAAE;;;;;0BAK5E,KAACE;gBACCC,OAAO;oBACLd,iBAAiB;oBACjByB,QAAQ;oBACRC,UAAU;oBACVT,OAAO;gBACT;0BAEA,cAAA,KAACJ;oBACCC,OAAO;wBACLd,iBAAiBF,WAAWE,eAAe;wBAC3CyB,QAAQ;wBACRE,MAAM;wBACND,UAAU;wBACVE,KAAK;wBACLX,OAAO,GAAGb,WAAW,IAAI,CAAC,CAAC;oBAC7B;;;;;AAKV,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/Pill.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nexport const Pill: React.FC<{\n backgroundColor: string\n color: string\n label: string\n}> = (props) => {\n const { backgroundColor, color, label } = props\n\n return (\n <div\n style={{\n backgroundColor,\n borderRadius: '2px',\n color,\n flexShrink: 0,\n lineHeight: 1,\n marginRight: '10px',\n padding: '4px 6px',\n whiteSpace: 'nowrap',\n }}\n >\n <small>{label}</small>\n </div>\n )\n}\n"],"names":["React","Pill","props","backgroundColor","color","label","div","style","borderRadius","flexShrink","lineHeight","marginRight","padding","whiteSpace","small"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,OAAO,MAAMC,OAIR,CAACC;IACJ,MAAM,EAAEC,eAAe,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGH;IAE1C,qBACE,KAACI;QACCC,OAAO;YACLJ;YACAK,cAAc;YACdJ;YACAK,YAAY;YACZC,YAAY;YACZC,aAAa;YACbC,SAAS;YACTC,YAAY;QACd;kBAEA,cAAA,KAACC;sBAAOT;;;AAGd,EAAC"}
1
+ {"version":3,"sources":["../../../src/ui/Pill.tsx"],"sourcesContent":["'use client'\r\n\r\nimport React from 'react'\r\n\r\nexport const Pill: React.FC<{\r\n backgroundColor: string\r\n color: string\r\n label: string\r\n}> = (props) => {\r\n const { backgroundColor, color, label } = props\r\n\r\n return (\r\n <div\r\n style={{\r\n backgroundColor,\r\n borderRadius: '2px',\r\n color,\r\n flexShrink: 0,\r\n lineHeight: 1,\r\n marginRight: '10px',\r\n padding: '4px 6px',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n <small>{label}</small>\r\n </div>\r\n )\r\n}\r\n"],"names":["React","Pill","props","backgroundColor","color","label","div","style","borderRadius","flexShrink","lineHeight","marginRight","padding","whiteSpace","small"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,OAAO,MAAMC,OAIR,CAACC;IACJ,MAAM,EAAEC,eAAe,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGH;IAE1C,qBACE,KAACI;QACCC,OAAO;YACLJ;YACAK,cAAc;YACdJ;YACAK,YAAY;YACZC,YAAY;YACZC,aAAa;YACbC,SAAS;YACTC,YAAY;QACd;kBAEA,cAAA,KAACC;sBAAOT;;;AAGd,EAAC"}
@@ -1,96 +1,96 @@
1
- {
2
- "type": "object",
3
- "$schema": "http://json-schema.org/draft-04/schema#",
4
- "additionalProperties": false,
5
- "properties": {
6
- "$schema": {
7
- "type": "string"
8
- },
9
- "plugin-seo": {
10
- "type": "object",
11
- "additionalProperties": false,
12
- "properties": {
13
- "missing": {
14
- "type": "string"
15
- },
16
- "almostThere": {
17
- "type": "string"
18
- },
19
- "autoGenerate": {
20
- "type": "string"
21
- },
22
- "generateAi": {
23
- "type": "string"
24
- },
25
- "bestPractices": {
26
- "type": "string"
27
- },
28
- "characterCount": {
29
- "type": "string"
30
- },
31
- "charactersLeftOver": {
32
- "type": "string"
33
- },
34
- "charactersToGo": {
35
- "type": "string"
36
- },
37
- "charactersTooMany": {
38
- "type": "string"
39
- },
40
- "checksPassing": {
41
- "type": "string"
42
- },
43
- "good": {
44
- "type": "string"
45
- },
46
- "imageAutoGenerationTip": {
47
- "type": "string"
48
- },
49
- "lengthTipDescription": {
50
- "type": "string"
51
- },
52
- "lengthTipTitle": {
53
- "type": "string"
54
- },
55
- "noImage": {
56
- "type": "string"
57
- },
58
- "preview": {
59
- "type": "string"
60
- },
61
- "previewDescription": {
62
- "type": "string"
63
- },
64
- "tooLong": {
65
- "type": "string"
66
- },
67
- "tooShort": {
68
- "type": "string"
69
- }
70
- },
71
- "required": [
72
- "autoGenerate",
73
- "imageAutoGenerationTip",
74
- "bestPractices",
75
- "lengthTipTitle",
76
- "lengthTipDescription",
77
- "good",
78
- "tooLong",
79
- "tooShort",
80
- "almostThere",
81
- "characterCount",
82
- "charactersToGo",
83
- "charactersLeftOver",
84
- "charactersTooMany",
85
- "noImage",
86
- "checksPassing",
87
- "preview",
88
- "previewDescription",
89
- "missing"
90
- ]
91
- }
92
- },
93
- "required": [
94
- "plugin-seo"
95
- ]
96
- }
1
+ {
2
+ "type": "object",
3
+ "$schema": "http://json-schema.org/draft-04/schema#",
4
+ "additionalProperties": false,
5
+ "properties": {
6
+ "$schema": {
7
+ "type": "string"
8
+ },
9
+ "plugin-seo": {
10
+ "type": "object",
11
+ "additionalProperties": false,
12
+ "properties": {
13
+ "missing": {
14
+ "type": "string"
15
+ },
16
+ "almostThere": {
17
+ "type": "string"
18
+ },
19
+ "autoGenerate": {
20
+ "type": "string"
21
+ },
22
+ "generateAi": {
23
+ "type": "string"
24
+ },
25
+ "bestPractices": {
26
+ "type": "string"
27
+ },
28
+ "characterCount": {
29
+ "type": "string"
30
+ },
31
+ "charactersLeftOver": {
32
+ "type": "string"
33
+ },
34
+ "charactersToGo": {
35
+ "type": "string"
36
+ },
37
+ "charactersTooMany": {
38
+ "type": "string"
39
+ },
40
+ "checksPassing": {
41
+ "type": "string"
42
+ },
43
+ "good": {
44
+ "type": "string"
45
+ },
46
+ "imageAutoGenerationTip": {
47
+ "type": "string"
48
+ },
49
+ "lengthTipDescription": {
50
+ "type": "string"
51
+ },
52
+ "lengthTipTitle": {
53
+ "type": "string"
54
+ },
55
+ "noImage": {
56
+ "type": "string"
57
+ },
58
+ "preview": {
59
+ "type": "string"
60
+ },
61
+ "previewDescription": {
62
+ "type": "string"
63
+ },
64
+ "tooLong": {
65
+ "type": "string"
66
+ },
67
+ "tooShort": {
68
+ "type": "string"
69
+ }
70
+ },
71
+ "required": [
72
+ "autoGenerate",
73
+ "imageAutoGenerationTip",
74
+ "bestPractices",
75
+ "lengthTipTitle",
76
+ "lengthTipDescription",
77
+ "good",
78
+ "tooLong",
79
+ "tooShort",
80
+ "almostThere",
81
+ "characterCount",
82
+ "charactersToGo",
83
+ "charactersLeftOver",
84
+ "charactersTooMany",
85
+ "noImage",
86
+ "checksPassing",
87
+ "preview",
88
+ "previewDescription",
89
+ "missing"
90
+ ]
91
+ }
92
+ },
93
+ "required": [
94
+ "plugin-seo"
95
+ ]
96
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@justanarthur/payload-plugin-seo",
3
- "version": "1.3.6",
3
+ "version": "1.3.7",
4
4
  "private": false,
5
5
  "bugs": "https://github.com/r1tsuu/payload-enchants/issues",
6
6
  "repository": "https://github.com/r1tsuu/payload-enchants",