{"_id":"@dudefactory/payload-plugin-seo-diagnostics","name":"@dudefactory/payload-plugin-seo-diagnostics","dist-tags":{"latest":"3.0.0"},"versions":{"3.0.0":{"name":"@dudefactory/payload-plugin-seo-diagnostics","version":"3.0.0","description":"Payload CMS plugin for SEO content auditing and diagnostics","license":"MIT","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./views":{"types":"./dist/views/index.d.ts","default":"./dist/views/index.js"},"./components":{"types":"./dist/components/index.d.ts","default":"./dist/components/index.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"tsc","dev":"tsc --watch","type-check":"tsc --noEmit","prepublishOnly":"pnpm build"},"peerDependencies":{"payload":"^3.0.0","react":"^19.0.0","react-dom":"^19.0.0","next":"^15.0.0 || ^16.0.0"},"devDependencies":{"@payloadcms/ui":"3.70.0","@types/node":"22.5.4","@types/react":"19.1.8","@types/react-dom":"19.1.6","next":"^15.0.0","payload":"3.70.0","react":"19.2.3","react-dom":"19.2.3","typescript":"5.7.3"},"packageManager":"pnpm@10.27.0","_id":"@dudefactory/payload-plugin-seo-diagnostics@3.0.0","gitHead":"52879ae1ce79204362029be3a4b157176db94c33","_nodeVersion":"22.11.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-lSAZc8LwFJxqjBJ5hhpr74Tk58nPnYwLC5QE8kyNGdw7us/tpgxxwqcdll8ez1B91bzXEoZf2OzSYZAFonrzQw==","shasum":"52026c45cf37a782f4086949913f23c1e1d5a9b6","tarball":"https://registry.npmjs.org/@dudefactory/payload-plugin-seo-diagnostics/-/payload-plugin-seo-diagnostics-3.0.0.tgz","fileCount":43,"unpackedSize":160834,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBt48i/ZmeNCWzl5EesYCRN2X4YhHeaU1E5JxJtxchzcAiEA9gdHAsYfdj0rszXusR5C37rYHmrqSP8yprhs8+E3E7M="}]},"_npmUser":{"name":"dudefactory","email":"prosto.duda@gmail.com"},"directories":{},"maintainers":[{"name":"dudefactory","email":"prosto.duda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/payload-plugin-seo-diagnostics_3.0.0_1768098705480_0.4370729462690308"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-11T02:31:45.355Z","3.0.0":"2026-01-11T02:31:45.621Z","modified":"2026-01-11T02:31:46.025Z"},"maintainers":[{"name":"dudefactory","email":"prosto.duda@gmail.com"}],"description":"Payload CMS plugin for SEO content auditing and diagnostics","license":"MIT","readme":"# @dudefactory/payload-plugin-seo-diagnostics\r\n\r\nA Payload CMS plugin that provides SEO content auditing and diagnostics across your collections.\r\n\r\n## Features\r\n\r\n- 🔍 **SEO Audit Dashboard** - Review SEO titles, descriptions, and images across all localized collections\r\n- 🌍 **Multi-locale Support** - Check content quality across English, Spanish, and custom locales\r\n- ✅ **Configurable Rules** - Set custom character limits and validation rules\r\n- 🎯 **Quick Navigation** - Click to edit documents directly from the diagnostics view\r\n- 📊 **Issue Summary** - See how many documents need SEO improvements at a glance\r\n\r\n## Installation\r\n\r\n```bash\r\npnpm add @dudefactory/payload-plugin-seo-diagnostics\r\n```\r\n\r\n## Usage\r\n\r\n### Basic Setup\r\n\r\n```typescript\r\n// payload.config.ts\r\nimport { seoDiagnosticsPlugin } from '@dudefactory/payload-plugin-seo-diagnostics';\r\n\r\nexport default buildConfig({\r\n  plugins: [seoDiagnosticsPlugin()],\r\n});\r\n```\r\n\r\n### Custom Configuration\r\n\r\n```typescript\r\nimport { seoDiagnosticsPlugin } from '@dudefactory/payload-plugin-seo-diagnostics';\r\n\r\nexport default buildConfig({\r\n  plugins: [\r\n    seoDiagnosticsPlugin({\r\n      // Audit these collections\r\n      collections: [\r\n        {\r\n          slug: 'pages',\r\n          label: 'Pages',\r\n          docLabelPaths: ['title', 'slug'],\r\n          metaPath: 'meta',\r\n        },\r\n        {\r\n          slug: 'posts',\r\n          label: 'Posts',\r\n          docLabelPaths: ['title', 'slug'],\r\n          metaPath: 'meta',\r\n        },\r\n      ],\r\n\r\n      // SEO title character limit\r\n      titleCharacterLimit: 60,\r\n\r\n      // SEO description character range\r\n      descriptionCharacterRange: {\r\n        min: 100,\r\n        max: 150,\r\n      },\r\n\r\n      // Custom locale validation rules\r\n      localeValidationRules: [\r\n        {\r\n          localeCode: 'en',\r\n          forbiddenCharacterPatterns: [\r\n            { name: 'Spanish', pattern: '[áéíóúÁÉÍÓÚñÑüÜ¡¿]' },\r\n          ],\r\n        },\r\n        {\r\n          localeCode: 'es',\r\n          forbiddenCharacterPatterns: [\r\n            { name: 'English slang', pattern: 'ing\\\\b' },\r\n          ],\r\n        },\r\n        {\r\n          localeCode: 'fr',\r\n          forbiddenCharacterPatterns: [\r\n            { name: 'Accented non-French', pattern: '[ñ]' },\r\n          ],\r\n        },\r\n      ],\r\n    }),\r\n  ],\r\n});\r\n```\r\n\r\n## Configuration Options\r\n\r\n### `collections`\r\n\r\nArray of collections to audit for SEO issues.\r\n\r\n- **Type:** `SeoDiagnosticsCollectionConfig[]`\r\n- **Default:** `['pages', 'posts', 'services']`\r\n\r\n#### `SeoDiagnosticsCollectionConfig`\r\n\r\n- `slug` (string) - Collection slug\r\n- `label` (string) - Collection display name\r\n- `docLabelPaths` (string[], optional) - Paths to use for document labels (e.g., `['title', 'slug']`)\r\n- `metaPath` (string, optional) - Path to SEO metadata (default: `'meta'`)\r\n\r\n### `titleCharacterLimit`\r\n\r\nMaximum allowed characters for SEO titles.\r\n\r\n- **Type:** `number`\r\n- **Default:** `60`\r\n\r\n### `descriptionCharacterRange`\r\n\r\nRecommended character range for SEO descriptions.\r\n\r\n- **Type:** `{ min: number; max: number }`\r\n- **Default:** `{ min: 100, max: 150 }`\r\n\r\n### `validateSpanishCharacters` (Deprecated)\r\n\r\nEnable Spanish character validation. **Deprecated** — use `localeValidationRules` instead.\r\n\r\n- **Type:** `boolean`\r\n- **Default:** `true`\r\n\r\n### `localeValidationRules`\r\n\r\nCustom character validation rules per locale. Allows you to validate any character patterns for any locale combination.\r\n\r\n- **Type:** `LocaleValidationRule[]`\r\n- **Default:** Uses Spanish validation for English locales (if `validateSpanishCharacters` is true)\r\n\r\n#### `LocaleValidationRule`\r\n\r\n```typescript\r\n{\r\n  // Locale code prefix to match (e.g., 'en' matches 'en-US', 'en-GB')\r\n  localeCode: string;\r\n\r\n  // Character patterns forbidden in this locale\r\n  forbiddenCharacterPatterns?: LocaleCharacterPattern[];\r\n}\r\n```\r\n\r\n#### `LocaleCharacterPattern`\r\n\r\n```typescript\r\n{\r\n  // Name of the character set\r\n  name: string;\r\n\r\n  // Regex pattern for forbidden characters\r\n  pattern: string; // e.g., '[áéíóúÁÉÍÓÚñÑüÜ¡¿]'\r\n}\r\n```\r\n\r\n#### Examples\r\n\r\n**Disable all character validation:**\r\n\r\n```typescript\r\nlocaleValidationRules: [];\r\n```\r\n\r\n**Check English for Spanish and French characters:**\r\n\r\n```typescript\r\nlocaleValidationRules: [\r\n  {\r\n    localeCode: 'en',\r\n    forbiddenCharacterPatterns: [\r\n      { name: 'Spanish', pattern: '[áéíóúÁÉÍÓÚñÑüÜ¡¿]' },\r\n      { name: 'French', pattern: '[àâäçèéêëîïôöùûüœæ]' },\r\n    ],\r\n  },\r\n];\r\n```\r\n\r\n**Check Spanish for non-Spanish characters:**\r\n\r\n```typescript\r\nlocaleValidationRules: [\r\n  {\r\n    localeCode: 'es',\r\n    forbiddenCharacterPatterns: [\r\n      { name: 'English slang endings', pattern: 'ing\\\\b' },\r\n      { name: 'German umlauts', pattern: '[äöüß]' },\r\n    ],\r\n  },\r\n];\r\n```\r\n\r\n## Accessing the View\r\n\r\nAfter installation, a **SEO Diagnostics** link appears in your Payload admin navigation. Click it to access the audit dashboard.\r\n\r\n**Path:** `/admin/seo-diagnostics`\r\n\r\n## Issue Detection\r\n\r\nThe plugin automatically flags:\r\n\r\n- ✋ Missing SEO title or description\r\n- 📏 SEO title exceeds character limit\r\n- 📝 SEO description too short or too long\r\n- 🌐 Mismatched locale characters (e.g., Spanish characters in English content)\r\n\r\n## Monorepo Usage\r\n\r\nIf using this in a monorepo with local plugins:\r\n\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"@dudefactory/payload-plugin-seo-diagnostics\": \"workspace:*\"\r\n  }\r\n}\r\n```\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","_rev":"1-0a0055e212a3fd96b4b2645a1c0adf1b"}