{"_id":"@consilioweb/payload-seo-analyzer","_rev":"35-52adf5c3440372823ac1ad875c4c21a2","name":"@consilioweb/payload-seo-analyzer","dist-tags":{"latest":"4.2.2"},"versions":{"1.7.1":{"name":"@consilioweb/payload-seo-analyzer","version":"1.7.1","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.7.1","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"18bdc9f13b8fcd2e4188be5402f1b1712d5a6124","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.7.1.tgz","fileCount":16,"integrity":"sha512-9MSgEPZ8ov+Bd04fr/vKeJjbANQvgmdpU0eQi3SCH43wAg1R1FyGkyzFoiFD278F0NEOh59YL9mrIdJyZPg1ow==","signatures":[{"sig":"MEYCIQDtquAfLsKeeipl05/LHiO4WifXLJNoxgSZHpsxdKL5pAIhALHbWTGIX9iAqetXbXKk6MAGgnsePC8z/omMfcLYp5c7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2588680},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"b544320610e3c50bbc9a2120792f735f400135c2","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.7.1_1776235995427_0.45563082541948785","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.8.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.8.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"410403a94f83f3473c4e6ba8ce69b256229ba121","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.8.0.tgz","fileCount":16,"integrity":"sha512-JDNVAma2WJ2c7i4+ux2AyARX2p9PGve4AzekiT0QLYrNnDZlaCF/SFO2M9miKvcKkk+ERA+berie1IDtaKfMIQ==","signatures":[{"sig":"MEYCIQDSpZ8rJthGgUwlbKT5OhcLwQ6UCvYZE5k8zKAGjTAMtAIhALTFHhS/9wyYfNjHzNyHBhruE5aHSlZ+DUGOzlNBjYen","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2796631},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"37377d4fcc095f2cf58fc30e526224130958000c","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.8.0_1782230413522_0.9253801183755959","host":"s3://npm-registry-packages-npm-production"}},"1.8.1":{"name":"@consilioweb/payload-seo-analyzer","version":"1.8.1","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.8.1","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"19dd227a384a882766f8ac6fc33087b3fe5e8f82","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.8.1.tgz","fileCount":16,"integrity":"sha512-rQYXDUuWHwytkVBf1c7/GTsbarmpgQ806MhDI5LIYB/pljea+Rps8ONx2CPfGrhm8GdtWO3PfDVgTOUoehFMHA==","signatures":[{"sig":"MEQCIGwaMWurfKuunRqU0BU7R3txzYqa8I33Nj8Wi0A2kgrjAiArf3jMltsZ2PUIpG8PK3BIkO+LtSsN2wmUPEk/vkQkMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2799679},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"d4d7cba0a59935a12325da8d98c650ed457820da","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.8.1_1782235860629_0.6400802650967845","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.9.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.9.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"324dbb430e2fe2ea851f1f2f15998f556b5833b6","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.9.0.tgz","fileCount":16,"integrity":"sha512-+JKk/YX0obgXJ2LI81AQ/R0p3qf1twv5fHJamiKY+Gm2Y7rTK8ODCODzTO5kaJwF4y95G/WUo/kqEGVS/ZCG/A==","signatures":[{"sig":"MEUCIQDxIP3e2pxyvIzdBTxw5Ok0n6Jq0OZCtbhqB3C2s2SN+wIgbUmivsL+k2sIyOcsfFLvoBWORvYS2lmiu6glb8bH4G0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2845278},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"f2be2ca7eed4faf25b080a79141332a9c5a7b807","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.9.0_1782240389037_0.9068480529065936","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.10.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.10.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"cb1fe6a5e3579799d5e1e9931ab46e8ee998717d","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.10.0.tgz","fileCount":16,"integrity":"sha512-97gySBEwvNq37anCUq2p4boP8/6OPW+CCJrIhk3xVDsJMTmElr01Yw8P+2R6AxOOP/q52HDncfjq+Q0G9D9OAA==","signatures":[{"sig":"MEYCIQDLgDyfRIU0pW7tBz4n3Gu5qFuC8VvTMN7DCLeHBugF/AIhAJsS46TFk+5hhvZ4WAutnJQV+FZ1+RwKoypLWiOiGnez","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2971554},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"90e657029619a489a05fd09849e5365553915695","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.10.0_1782242983047_0.981912132115633","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.11.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.11.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"ed4ea681448b396e1f0c2fdb2bc4aeec38a74997","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.11.0.tgz","fileCount":16,"integrity":"sha512-IfVemMlo9kagdydIUczhXnhpxms9tMrL+Hpb1SHOU8QcUv/gkMhK+LjFx8SgkarcvfkiNX9kHao2gafY1TlruQ==","signatures":[{"sig":"MEYCIQCW/Q21uR7kcveSf91ovQesDXMB+gk7Gmdc1zYhzoQnOgIhAKdlSQCyQrbfs5XTBgb9cIHLpDtyzi6CmPws9yoo2j27","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3024510},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"361464220dda3e06df6b07a959731c0e299caaae","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.11.0_1782244305317_0.29397901401861315","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.12.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.12.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"a8c2889acdc521829df9881f6a729f2bea598937","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.12.0.tgz","fileCount":16,"integrity":"sha512-5cUAF4YxbsSjbwa3hSbMF4e1PrGmWFFq94xtbx4DuNgWdsGXa1FeSXlOHwEaKguk7ggwbLAlNQcAx5YhImRoAg==","signatures":[{"sig":"MEQCIHuqZ0oA5isW2mArrSDTj0Aevn3KRQ1E0dfNrj+faXYXAiBJDnZ8FTNGmRJO9f9UcE1QoAzus02Z8UyxM5j8oa9xwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3056325},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"70e0b6c536201c81097644e0007dc30459baad93","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.12.0_1782279172054_0.27386883384443195","host":"s3://npm-registry-packages-npm-production"}},"1.13.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.13.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.13.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"99ad4e356131deab1c7980f5e978b673de98bebd","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.13.0.tgz","fileCount":16,"integrity":"sha512-1E7DgltuBOp25WbhCcSFAtzQrRuNvhvTIik8CV+hAtRtWjbzQs+6TqE+RTgRjCety59eteq4OIGJ8lC/4nzayQ==","signatures":[{"sig":"MEUCIB9n1e4EQ/B5OTA0ZBedtz0kxUwaotw7207BXNdjgpzwAiEAzwAOXTnUikEYW2cRzUjUF/OGlUXm/0lu6xdmZ1PoL4s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3086684},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"600a7eaf70316e096c87d05520519bfc508633eb","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.13.0_1782279592661_0.3067390333927207","host":"s3://npm-registry-packages-npm-production"}},"1.14.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.14.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.14.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"80dcd9ec8fcb9bc0d4bce38df6a31c76fe56dfb2","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.14.0.tgz","fileCount":16,"integrity":"sha512-ijhHukI3EMdXi58TQUWJYmsRVXZFmgt5eENr6H1i7DIem4L6TYfB+W1sYuhPgt3BvI7sSWmQ99x/LA2l6Z/7pg==","signatures":[{"sig":"MEYCIQCErkrd4ZKV/NOiEVSGaTqE20xjWytB29TIaxzdCUtPAAIhANwe4EUz2E5J5faCAauTfoOE/hENliSNwDUNJjKSsGkA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3090811},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"12c7e3c0f9395523bd9f4f2aeecbbaf637bf43e7","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.14.0_1782280284970_0.02936657790895536","host":"s3://npm-registry-packages-npm-production"}},"1.15.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.15.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.15.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"679fb6b4a5fd7f467bab8cac0a930321d904a62a","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.15.0.tgz","fileCount":16,"integrity":"sha512-2jlJp2w1ziOpnlojYGKsd+bp3O5ILyY2E9mZ8J5MpGmqQWmzRpNn/o2U2e8pjW0RO2NMWiq5sYj6T41DuzRo2w==","signatures":[{"sig":"MEUCIBlf6Yz+747mrWzR55wf4mGdr/6gXDpZCTvrIY4AeviYAiEAvAvSPMMAilUcvfIpGehaceYAcpkbkDnZL+UIAcPHrSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3104709},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"edc5398286e217040d37b7e22497626d1f808e6d","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.15.0_1782280565524_0.0811373098160022","host":"s3://npm-registry-packages-npm-production"}},"1.16.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.16.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.16.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"50804809958efbc127776c4d05e84d85a94413f1","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.16.0.tgz","fileCount":16,"integrity":"sha512-VOUN1fu5axQL0/wswD3ImLQKCTd3ARDuquSceZvBXem5uHvdBGXH6trNyYja5vm8RyKMIX3uPDsQ82iWuLit6Q==","signatures":[{"sig":"MEUCIQCqxKzzn9aYokj/J20gkE2P6ejrCdz7roAzQqeN7MFrhAIgJvcKUg+oXUkOdw4GzHj/AB8xa3/XNvOnh07I/AqeYoc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3114434},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"07a718a173899c1db8c6274f3f33180f1d7fcaab","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.16.0_1782281524708_0.7726113361030247","host":"s3://npm-registry-packages-npm-production"}},"1.17.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.17.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.17.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"3c90d4b93cce5dee70172a0553c82ce3755d7822","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.17.0.tgz","fileCount":16,"integrity":"sha512-yRGhT0b14xUsOSxhJRprnbCH8ntzBU0djzPiQteu8OxuLrAayMl/Sbsw7mQvpurhXBCf8fFFD/tzCsPgYk86OA==","signatures":[{"sig":"MEUCIGcPHpSAgUKHE1LNu5eI7vYtiV4RNswCtDwcvKi8Qs4ZAiEAn7ljtauDHmAJFldSYiNoY1noapHeatrnC3teKTq0Rsg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3115653},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"3ec81cb9b1eae75bf45524329c113133d9747436","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","typescript":"^5.5.0","@types/react":"^19.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.17.0_1782284105096_0.7823523592820782","host":"s3://npm-registry-packages-npm-production"}},"1.17.1":{"name":"@consilioweb/payload-seo-analyzer","version":"1.17.1","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.17.1","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"53de83a6f5e0654faae2a1ed3e47c06bb9832977","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.17.1.tgz","fileCount":16,"integrity":"sha512-zv8gjijykY0PlbK/yEYYoKUIdZrDgmOGMU0VqxXJtZnxYALx7YXYwIXQTQrOKBiRxL371QqYhzZgmrlKjQHydA==","signatures":[{"sig":"MEYCIQCKZyvYLP0QqGls7xNQJ6D6zuHpy5bIGxROX+twhCFt/AIhAIIkyN+Vd+FCtdoxroCyAOFg6PB1EYofJzjOdQ5uX2V+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3116248},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"ccc56d55f86f0572c2ade6352385900674043db2","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.17.1_1782285004820_0.9902820980209175","host":"s3://npm-registry-packages-npm-production"}},"1.17.2":{"name":"@consilioweb/payload-seo-analyzer","version":"1.17.2","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.17.2","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"acd3810a2c55850a89e5040dc0f38788a655a9ad","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.17.2.tgz","fileCount":16,"integrity":"sha512-J5d37ZKtKg+HnAOkBeF+cenQBauZWsF5RvgiPWnDXGEC4jaJGZ3FraC6nCtfV8ViyTEaBiEMGt6OIxzXqIDIdw==","signatures":[{"sig":"MEQCIEPLnkxHQOrht+NJPDrZt5tRYctwqYD/N/fBgePuWT02AiBxQhszg5RF51hAJQx5n5UecUefOQXUNgKkLwYFcXAHOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3117544},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"4304817bda8f85527acd9ec0a9838a34c0b132c9","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.17.2_1782285576836_0.01595017279108335","host":"s3://npm-registry-packages-npm-production"}},"1.17.3":{"name":"@consilioweb/payload-seo-analyzer","version":"1.17.3","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.17.3","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"1587b3f6a9525c8c159ec54e6c08e5289e065951","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.17.3.tgz","fileCount":16,"integrity":"sha512-opNsTfD2RI3rk8rNQr9pMNj5yPVVxIRzbYRuHr9TTmfuWyOnOaojBKywn75hjWtphKizDok0cHtCZ1ea/6qVLQ==","signatures":[{"sig":"MEUCIAnBoKDaeuvAFWh+tBZ4W/tPlFkfYc8xo3Ui8iarGugfAiEA59SfgS/V4/EaVcS5COQ2kMkpbH5ieWISILOBHArZy/8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3121124},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"5716527c627dd8da12d2b95823b0710ebcf2e4d8","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.17.3_1782287891236_0.9294891671150229","host":"s3://npm-registry-packages-npm-production"}},"1.18.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.18.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.18.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"30e7c7e61dd443246d37e8fefacec4eae6ce0769","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.18.0.tgz","fileCount":16,"integrity":"sha512-TM0PlG5eksHjjKhyStZ+4hlYkyOTxB6WgwXL5P6U3kXh6stlRYYQDSNs09WJYzIlIAogH6Pn8lPm9sEh5ITuug==","signatures":[{"sig":"MEUCIEUS6qkR+v3/5CQHNpC2LzHNeCYcZVQqtq8jKXdJ1OSjAiEA/qbcaxuPQael7HLl1t4BCRD28oW9HL5WPwtAavPChdw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3128866},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"5716527c627dd8da12d2b95823b0710ebcf2e4d8","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.18.0_1782295326218_0.37787653251523157","host":"s3://npm-registry-packages-npm-production"}},"1.18.1":{"name":"@consilioweb/payload-seo-analyzer","version":"1.18.1","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.18.1","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"67cc9f87e9962355eab05c52a5b4a5aa2aff8db2","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.18.1.tgz","fileCount":16,"integrity":"sha512-jAykVkSY43bya3TS74xmyRGEG8GsApSFcYdKXI6APS9jGFoYMCmOJ5nHzckagHMmRZJ0+rFDX8SU8hWi77k9KQ==","signatures":[{"sig":"MEYCIQC+Q6rENAqRHpdiSG1H6OAirPLQ6WMZfH0YZSdkDSfm/QIhAJGV0/8OdiMId0KRGYpou24dQBoa8Hf5zAxyVsZdOshr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3129396},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"5716527c627dd8da12d2b95823b0710ebcf2e4d8","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.18.1_1782303324614_0.5208148674916802","host":"s3://npm-registry-packages-npm-production"}},"1.18.2":{"name":"@consilioweb/payload-seo-analyzer","version":"1.18.2","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.18.2","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"1b81d7dddd50c7913d85869bc1ef3988412146f8","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.18.2.tgz","fileCount":16,"integrity":"sha512-sn4wzvFqgIZv0e8q7naPhcEcCg9dmNDLqWYdOmjkHsUNXPfAuT3X+5fQz4UE8wrts+PtkY22kakSh5SYcgjbgg==","signatures":[{"sig":"MEUCIQDoPq/rRrD+G4HsEXaCn4a6ddTyCtxW3vswty51TKYK/wIgA5XxTnt7RqLpCdm5sWAVDzJ4rzYICNy98FuqJgjJsUQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3131412},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"5716527c627dd8da12d2b95823b0710ebcf2e4d8","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.18.2_1782304779148_0.809329953335141","host":"s3://npm-registry-packages-npm-production"}},"1.19.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.19.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.19.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"99de881ca0ff3c772c9b20f55c502fc69bf4a68c","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.19.0.tgz","fileCount":16,"integrity":"sha512-QrAFrLrLDRnKJT7W63jMwiSIRqgbWwa6wtYO+Q+iLAwveDS8lGgHaenpj8bbDZF+LiFS5QMFLNepasJkQl1qHw==","signatures":[{"sig":"MEYCIQDSrAASBrJ9igQD9eBzc2jzcteC8kwpqW6/TnYdf7NopgIhAMhmAlZFcUc7mDo6NaGF2IQzpZ3bTEbxtwLu1jDH1eWZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3251488},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"d4e480cec18b98daa72582af634d73868f0f0acc","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.19.0_1782392720534_0.1574699565622586","host":"s3://npm-registry-packages-npm-production"}},"1.20.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.20.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.20.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"3948b45c64cf434bcfacdaa002b0cf90d8d5cf38","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.20.0.tgz","fileCount":16,"integrity":"sha512-ST/qVuAX1cSYEqQyhOMpjRHTyzdumAEa2sVTWmyTWi9OrJLSml5phpGZnv7Te6Re3fCGXvR6xQOAtJftWZ2hVw==","signatures":[{"sig":"MEYCIQDa4rMceTNSXKkuT81NqP8l9eI79Td25warlT/cz4+9sAIhANPll8PQsQRhpndelUkQLk9Pq8o7FkpXiHNm8lP1V6GC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3263753},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"806c0aea23ee84bd5d4aeb53c49df4911c37d288","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"pnpm build","test:e2e:ui:setup":"cd e2e/ui && npm install && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.20.0_1782402774534_0.6912122490906527","host":"s3://npm-registry-packages-npm-production"}},"1.21.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.21.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.21.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"93635c4c2cd3988ec35fc6f22c5a07e9764bb333","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.21.0.tgz","fileCount":16,"integrity":"sha512-rkYK9BZmuP5e4SSt6mqJ8z0fo78Q59pHK5Ttsy+fatfp9FQNYj5SyR+ttqgn+3WEfRpoMXIOe/NRv63FzU5iww==","signatures":[{"sig":"MEUCIQDIqLaa5z0n8JqjS4SqTRRho2rC3RhnhavUpJ4xY6fBDQIgf2greFZrXDPpqWVvHO314wMxJfot2oeZumZ3GwSb43w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3271892},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"650bf369e63172eab6a6d74fb1707ebd92642b3e","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"pnpm build","test:e2e:ui:setup":"cd e2e/ui && npm install && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.21.0_1782482258958_0.8808745300283187","host":"s3://npm-registry-packages-npm-production"}},"1.21.1":{"name":"@consilioweb/payload-seo-analyzer","version":"1.21.1","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.21.1","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"c2cef7850d9501321b55ac8990fe540aa5f3bd2f","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.21.1.tgz","fileCount":16,"integrity":"sha512-9m4YVlEZeFj1WV3aAdrxFU14mYNxEyKTBusQz1HRd5eu2UFJnAZUO9DeyQWfgxfOkEmoWT6ni0SBgNHUWwZQvQ==","signatures":[{"sig":"MEUCIB7Efdv1UaP9i2hY4pCd8aQw/SBVLOiq8KOmgvb1GLsfAiEApouEd2zLvMd4RaOViTNMkBiwiSD+QUBpltUXSnWoh6A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3271952},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"fcf0ced5edd9b6f825e6cf30d5f6be20044d7ff8","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"pnpm build","test:e2e:ui:setup":"cd e2e/ui && npm install && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.21.1_1782483231021_0.3895897470154315","host":"s3://npm-registry-packages-npm-production"}},"1.22.0":{"name":"@consilioweb/payload-seo-analyzer","version":"1.22.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@1.22.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"d5ddca362a410cace8b5b921b3fadc425b4a5c61","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-1.22.0.tgz","fileCount":16,"integrity":"sha512-zAq6L0D45l8GepwjTTvLWgYvNczeKLag3spjMhQBcyq++BziCHxI4EzBTn5uhs2kuYQ4PxquocHaB/abNPoRqA==","signatures":[{"sig":"MEUCIQCvlZetNDM7nV6YvsNcv4T+++Yge0kCXhpEoUjnvuY32QIgDlTya8QrC0AoxC4ARvWRnTlAV72WkoTvnpJahw/x0yQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3273120},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"e7f4a502901cc87bc139391e3ceb69bc203ece4d","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"pnpm build","test:e2e:ui:setup":"cd e2e/ui && npm install && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"11.18.0","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_1.22.0_1786219752030_0.30211560265997317","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@consilioweb/payload-seo-analyzer","version":"2.0.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@2.0.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"6ea6f101e8d81bb664419fe38d7fbeb561f25a1c","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-2.0.0.tgz","fileCount":16,"integrity":"sha512-2nTLy3bPAj/WJfGbr7dNlDRb7uhMNGhCQQE/mLHSxbWulglWow/34rFOst8TaXY/O3RpeXh/32ZwuJ0zf9r0pQ==","signatures":[{"sig":"MEYCIQDAPAgJhNIksf09EcaSrqB0XGCEX6MiCYVGghyWYDA02wIhAMz03COadQrY9WhXQARzXOkp1f22umssQs7uJCZj7hnk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-seo-analyzer@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3312660},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"637a1fb20c38638992166e2d9086c5214c7c105b","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"npm run typecheck && npm run test && npm run build","test:e2e:ui:setup":"cd e2e/ui && npm install && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.8","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"sideEffects":["./dist/client.js","./dist/client.cjs"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"next":"^16.2.0","tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","payload":"^3.77.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.77.0","@payloadcms/next":"^3.77.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"next":"^15.2.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_2.0.0_1788789179603_0.860332135668235","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@consilioweb/payload-seo-analyzer","version":"3.0.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@3.0.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"a77a04681418252283b9945268a990ea7e26eba7","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-3.0.0.tgz","fileCount":16,"integrity":"sha512-JnBmFQAKPGs7vXBXIqV96CNErM9uU+mDLgcnC/qVTOnGU6ci593YgKPdJyd1YLRXFUQJsHv3Ce9OHsuiBmA2nQ==","signatures":[{"sig":"MEUCIA3saCyjs3h6/YTdZINwaLnZcdp1hIa2eVieeVh3BpYuAiEA4aVQRlefdCck4Rhqlxu5TMiVKpQlwZNHwIT96s/cKnw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-seo-analyzer@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3334983},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"af2c999aaae684c6624b55234b75c5d4da92c6d1","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"npm run typecheck && npm run test && npm run build","test:e2e:ui:setup":"cd e2e/ui && npm install && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: nine admin views were guarded by a session alone, the permissions fallback promoted any non-string role to SEO admin, and the public extension sitemaps had neither cache nor working cap. Upgrade to 4.0.0 — see https://github.com/pOwn3d/payload-seo-analyzer/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.8","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"sideEffects":["./dist/client.js","./dist/client.cjs"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"next":"^16.2.0","tsup":"^8.0.0","jsdom":"^29.1.1","react":"^19.2.7","vitest":"^2.0.0","payload":"^3.77.0","react-dom":"^19.2.7","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.77.0","@payloadcms/next":"^3.77.0","@testing-library/react":"^16.3.2"},"peerDependencies":{"next":"^15.2.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_3.0.0_1788850962245_0.7723596135165676","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@consilioweb/payload-seo-analyzer","version":"4.0.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@4.0.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"92d7cb57b932738be154e46f70192c8578874c5c","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-4.0.0.tgz","fileCount":16,"integrity":"sha512-tGZro30H9lkBoimlOXyhC6RcSWONDsIICYU2BCzQ4pZrRTFpLtB03s6l7OQlVa1k8EyMuR9+nNkGyUYlL9NIYw==","signatures":[{"sig":"MEYCIQDvEx2VQXXyA4ypC7jnTtoRUXTmHYWcvjE4nq2PrcMSDgIhALpexNcnmyyzMCDgPKiI/XLYPs13T2yalMbBVw3YKpwN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-seo-analyzer@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3346013},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"0022ac9de3a50b3a045387926322264c91788765","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"npm run typecheck && npm run test && npm run build","test:e2e:ui:setup":"cd e2e/ui && npm install && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.8","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"sideEffects":["./dist/client.js","./dist/client.cjs"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"next":"^16.3.4","tsup":"^8.5.1","jsdom":"^29.1.1","react":"^19.2.8","vitest":"^3.2.7","payload":"^3.88.0","react-dom":"^19.2.8","typescript":"^5.9.3","@types/react":"^19.2.18","@payloadcms/ui":"^3.88.0","@payloadcms/next":"^3.88.0","@testing-library/react":"^16.3.3"},"peerDependencies":{"next":"^15.2.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":">=3.79.1 <4.0.0","@payloadcms/ui":">=3.79.1 <4.0.0","@payloadcms/next":">=3.79.1 <4.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_4.0.0_1788856073030_0.2810970323665507","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@consilioweb/payload-seo-analyzer","version":"4.1.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@4.1.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"5db10a1887db83ff182019df6f293d84b94a7596","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-4.1.0.tgz","fileCount":16,"integrity":"sha512-ySayZvPnoPNyW+bUDzsKcOIMtd6R+Pc0RCiOUPVVO2HH58cuSR/2aG1kEOOIpABco68fTSpSoJYWsXYqTksUFQ==","signatures":[{"sig":"MEYCIQDIfS9D8px97m2/KxXCNO6NzKGevS8FzQj8CwEAScaDwgIhAPtDscoxiJjpIN5Cr8sb/xZ7KW1imcxmw75R2YXdBR9+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-seo-analyzer@4.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3431956},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"a1e0c69f4a4ea3c99b69fe31146edb250f84fc65","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"npm run typecheck && npm run test && npm run build","test:e2e:ui:setup":"cd e2e/ui && npm install && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.8","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"sideEffects":["./dist/client.js","./dist/client.cjs"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"next":"^16.3.4","tsup":"^8.5.1","jsdom":"^29.1.1","react":"^19.2.8","vitest":"^3.2.7","payload":"^3.88.0","react-dom":"^19.2.8","typescript":"^5.9.3","@types/react":"^19.2.18","@payloadcms/ui":"^3.88.0","@payloadcms/next":"^3.88.0","@testing-library/react":"^16.3.3"},"peerDependencies":{"next":"^15.2.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":">=3.79.1 <4.0.0","@payloadcms/ui":">=3.79.1 <4.0.0","@payloadcms/next":">=3.79.1 <4.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_4.1.0_1788862604739_0.762691761390659","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"@consilioweb/payload-seo-analyzer","version":"4.2.0","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@4.2.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"c3dcd3f25ea5bbc8d37a2a4bb8c9aecb8dcce76d","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-4.2.0.tgz","fileCount":17,"integrity":"sha512-d1Gp1+gPXhGLwGacQP8GrRrSGiugHxcEO482PuRAlNQpcbhGF7Av76dfgxweC2I7y+VbGIFM6NeYtXA5xMRYwg==","signatures":[{"sig":"MEUCIQD49ZNqdkHJ9pfhvIXIwnMq2XQ6XqJOPa6TtaL7ssUKdgIgeS80RgWE3hk/wL/RyvXrMk/MvrF90v74X1LtFYFHa8k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDqMJ4YCwWiZGC4hkL/BEPaqksqNNCLXErdfu69iI2btQIhAKYdyMFXJUT2gN9PDyw2UHieCaL0vBaGtTW3M4Z+Mpv4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3447351},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"9ec6b6a2a769a81fed2480cc07acdd805ec8f0cb","scripts":{"test":"vitest run","build":"tsup && node scripts/verify-dist-imports.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"npm run typecheck && npm run test && npm run build","test:e2e:ui:setup":"cd e2e/ui && npm install && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"Use 4.2.1: with localeMapping set, the 4.2.0 editor sidebar could score a page differently from the dashboard.","repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"11.19.0","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"sideEffects":["./dist/client.js","./dist/client.cjs"],"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"next":"^16.3.4","tsup":"^8.5.1","jsdom":"^29.1.1","react":"^19.2.8","vitest":"^3.2.7","payload":"^3.88.0","react-dom":"^19.2.8","typescript":"^5.9.3","@types/react":"^19.2.18","@payloadcms/ui":"^3.88.0","@payloadcms/next":"^3.88.0","@testing-library/react":"^16.3.3"},"peerDependencies":{"next":"^15.2.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":">=3.79.1 <4.0.0","@payloadcms/ui":">=3.79.1 <4.0.0","@payloadcms/next":">=3.79.1 <4.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_4.2.0_1790147427087_0.6532799304491455","host":"s3://npm-registry-packages-npm-production"}},"4.2.1":{"name":"@consilioweb/payload-seo-analyzer","version":"4.2.1","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-seo-analyzer@4.2.1","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"dist":{"shasum":"ec634eaaad39545114f979e32af02d11a529fd62","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-4.2.1.tgz","fileCount":16,"integrity":"sha512-dkVPpcU1UKxflb2pMBjap7z6I/wqFCIpXEvSr6l2iAksvaSzUEMAxiUTioVMuvFheOw37ZG68kR4NPPVsNOSLg==","signatures":[{"sig":"MEUCIQDkW2Scuy1TVua/yefA+JDaEzJIsIvYxVqdTYfG5u5qcQIgJp2MrDqXz5gCKv7ZhLOfU3/DaEeDkIxtIaZxCHLQGHU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDhxK3OGT2JlWOwgi/AvVSwC/Knzv48wBhNlR8V2I+36AIgGIdFW3IzIA+s+BJWjB/34cSGhFQlu+ZCdVlJacpAzM4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-seo-analyzer@4.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3450102},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"43bf5fcfbc1fb61749375d462e48e61a3179c40c","scripts":{"test":"vitest run","build":"tsup && node scripts/verify-dist-imports.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"npm run typecheck && npm run test && npm run build","test:e2e:ui:setup":"cd e2e/ui && npm run pack:plugin && npx playwright install chromium"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.8","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"sideEffects":["./dist/client.js","./dist/client.cjs"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"next":"^16.3.4","tsup":"^8.5.1","jsdom":"^29.1.1","react":"^19.2.8","vitest":"^4.1.11","payload":"^3.90.1","react-dom":"^19.2.8","typescript":"^5.9.3","@types/react":"^19.2.18","@payloadcms/ui":"^3.90.1","@payloadcms/next":"^3.90.1","@testing-library/react":"^16.3.3"},"peerDependencies":{"next":"^15.2.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":">=3.79.1 <4.0.0","@payloadcms/ui":">=3.79.1 <4.0.0","@payloadcms/next":">=3.79.1 <4.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-seo-analyzer_4.2.1_1790151377833_0.47505838252541","host":"s3://npm-registry-packages-npm-production"}},"4.2.2":{"_id":"@consilioweb/payload-seo-analyzer@4.2.2","bin":{"seo-analyzer-uninstall":"scripts/uninstall.mjs"},"bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"dist":{"shasum":"a288b44de52ad1969f41650dcc5cebf641f92dc8","tarball":"https://registry.npmjs.org/@consilioweb/payload-seo-analyzer/-/payload-seo-analyzer-4.2.2.tgz","fileCount":16,"integrity":"sha512-xe/k9CY+IXKc9aQbGoXbYv0LqRjlW0YOE5Xo/9sbmK+RJiOqRX4L5tA+lKmaGXqr/b9PGSM8kEU6sNr36HjZzQ==","signatures":[{"sig":"MEUCID5/rb1foGs4c/ep0e50kHb7uKK4Ott9BYPndcu6a4+/AiEAg+hvXnPdbTBMnjDR1oRuoOGEtPKquHqUiQ8lJCMtydM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDaeBf+hLcXEsqUNYzjUXvI/mhCWYOxyv63A4CxACA+IwIgHgVW+mmpkFDWRF31pIQC4IGruO9lJeCOdfbUBb/RRCg="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-seo-analyzer@4.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3449991},"main":"./dist/index.cjs","name":"@consilioweb/payload-seo-analyzer","type":"module","types":"./dist/index.d.ts","author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"module":"./dist/index.js","engines":{"node":"^20.19.0 || >=22.12.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views.d.ts","default":"./dist/views.js"},"require":{"types":"./dist/views.d.cts","default":"./dist/views.cjs"}},"./client":{"import":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"require":{"types":"./dist/client.d.cts","default":"./dist/client.cjs"}}},"gitHead":"f4ff57136e18f16138a316ed744adf449651a309","license":"MIT","scripts":{"test":"vitest run","build":"tsup && node scripts/verify-dist-imports.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","test:e2e:ui":"cd e2e/ui && npm run test:e2e","prepublishOnly":"npm run typecheck && npm run test && npm run build","test:e2e:ui:setup":"cd e2e/ui && npm run pack:plugin && npx playwright install chromium"},"version":"4.2.2","_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"_npmVersion":"10.9.8","description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","directories":{},"maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"sideEffects":["./dist/client.js","./dist/client.cjs"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"next":"^16.3.4","tsup":"^8.5.1","jsdom":"^29.1.1","react":"^19.2.8","vitest":"^4.1.11","payload":"^3.90.1","react-dom":"^19.2.8","typescript":"^5.9.3","@types/react":"^19.2.18","@payloadcms/ui":"^3.90.1","@payloadcms/next":"^3.90.1","@testing-library/react":"^16.3.3"},"peerDependencies":{"next":"^15.2.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":">=3.79.1 <4.0.0","@payloadcms/ui":">=3.79.1 <4.0.0","@payloadcms/next":">=3.79.1 <4.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/payload-seo-analyzer_4.2.2_1790694288247_0.8473384927926686"}}},"time":{"created":"2026-04-15T06:53:15.325Z","modified":"2026-09-29T15:04:48.807Z","1.7.1":"2026-04-15T06:53:15.613Z","1.8.0":"2026-06-23T16:00:13.691Z","1.8.1":"2026-06-23T17:31:00.796Z","1.9.0":"2026-06-23T18:46:29.244Z","1.10.0":"2026-06-23T19:29:43.218Z","1.11.0":"2026-06-23T19:51:45.547Z","1.12.0":"2026-06-24T05:32:52.199Z","1.13.0":"2026-06-24T05:39:52.864Z","1.14.0":"2026-06-24T05:51:25.149Z","1.15.0":"2026-06-24T05:56:05.744Z","1.16.0":"2026-06-24T06:12:04.853Z","1.17.0":"2026-06-24T06:55:05.242Z","1.17.1":"2026-06-24T07:10:05.087Z","1.17.2":"2026-06-24T07:19:37.028Z","1.17.3":"2026-06-24T07:58:11.426Z","1.18.0":"2026-06-24T10:02:06.359Z","1.18.1":"2026-06-24T12:15:24.748Z","1.18.2":"2026-06-24T12:39:39.402Z","1.19.0":"2026-06-25T13:05:20.697Z","1.20.0":"2026-06-25T15:52:54.722Z","1.21.0":"2026-06-26T13:57:39.134Z","1.21.1":"2026-06-26T14:13:51.227Z","1.22.0":"2026-08-08T20:09:12.230Z","2.0.0":"2026-09-07T13:52:59.784Z","3.0.0":"2026-09-08T07:02:42.408Z","4.0.0":"2026-09-08T08:27:53.186Z","4.1.0":"2026-09-08T10:16:44.916Z","4.2.0":"2026-09-23T07:10:27.216Z","4.2.1":"2026-09-23T08:16:17.945Z","4.2.2":"2026-09-29T15:04:48.381Z"},"bugs":{"url":"https://github.com/pOwn3d/payload-seo-analyzer/issues"},"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","homepage":"https://github.com/pOwn3d/payload-seo-analyzer#readme","keywords":["seo","seo-analyzer","seo-plugin","seo-audit","on-page-seo","payload","payload-cms","payload-cms-plugin","payload-plugin","cms-seo","meta-tags","content-analysis","readability","readability-score","flesch","lexical","next.js","nextjs","i18n","french","english","structured-data","json-ld","sitemap","seo-dashboard","redirects","typescript"],"repository":{"url":"git+https://github.com/pOwn3d/payload-seo-analyzer.git","type":"git"},"description":"Payload CMS SEO plugin — 50+ checks, dashboard, Lexical JSON support, Flesch FR/EN readability, i18n","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"readme":"# @consilioweb/payload-seo-analyzer\n\n> An offline-first SEO toolkit for Payload CMS 3 + Next.js: on-page analysis in the editor sidebar, a nine-view admin dashboard, generated sitemaps and JSON-LD, plus opt-in Google Search Console and AI assists.\n\n[![npm](https://img.shields.io/npm/v/@consilioweb/payload-seo-analyzer.svg)](https://www.npmjs.com/package/@consilioweb/payload-seo-analyzer)\n[![license](https://img.shields.io/npm/l/@consilioweb/payload-seo-analyzer.svg)](LICENSE)\n[![payload](https://img.shields.io/badge/payload-3.x-000000.svg)](https://payloadcms.com)\n\n## About\n\nMost SEO plugins either stop at meta fields or send your content to a paid third-party API. This one runs\nthe whole analysis locally: 100+ deterministic checks across 20 rule groups, scored in the editor sidebar\nas you type, with no external call and no API key.\n\nIt is aimed at Payload 3 sites that ship their own front end in Next.js. Beyond the analyzer it generates\nwhat the front end actually needs — `robots.txt`, four sitemap flavours, canonical URLs, Open Graph\nmetadata and JSON-LD — and adds an admin dashboard for site-wide work: link graph, redirect manager,\ncannibalization, schema builder, keyword research. Google Search Console, AI assists, monitoring alerts\nand IndexNow are opt-in and use your own credentials.\n\n## Table of Contents\n\n- [Features](#features)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n- [API Endpoints](#api-endpoints)\n- [Admin Views](#admin-views)\n- [Collections](#collections)\n- [Package Exports](#package-exports)\n- [Requirements](#requirements)\n- [Uninstall](#uninstall)\n- [Database and updates](#database-and-updates)\n- [Migration to 4.0](#migration-to-40)\n- [Migration to 3.0](#migration-to-30)\n- [Migration to 2.0](#migration-to-20)\n- [Performance](#performance)\n- [Troubleshooting](#troubleshooting)\n- [Security](#security)\n- [Contributing](#contributing)\n- [Changelog](#changelog)\n- [Support](#support)\n- [License](#license)\n\n## Features\n\n- **100+ on-page checks, offline.** 110 static rule ids across 20 groups — title, meta description, URL,\n  headings, content, images, linking, social, schema, readability, quality, secondary keywords,\n  cornerstone, freshness, technical, accessibility, e-commerce, E-E-A-T, GEO and hreflang.\n- **Live score in the editor.** A sidebar field analyses the document (including Lexical rich text and\n  layout blocks) and returns a 0–100 score plus a separate AI-readiness indicator built from the GEO,\n  E-E-A-T and schema-coverage checks.\n- **Nine admin views.** Site-wide audit, sitemap audit, settings, redirect manager, cannibalization,\n  performance, keyword research, schema builder and link graph.\n- **Generated output, not just advice.** `robots.txt`, `sitemap.xml`, news/image/video sitemaps, an\n  opt-in `llms.txt`, plus `buildSeoMetadata` / `buildJsonLd` helpers for your Next.js front end.\n- **Bilingual analysis.** Locale-adapted readability (Kandel-Moles for French, Flesch for English),\n  FR/EN dashboard translations extensible to any locale, and the 39 `plugin-seo` meta-field languages\n  from Payload.\n- **Opt-in integrations.** Google Search Console via OAuth, Anthropic-powered assists (meta rewriting,\n  alt text, content briefs), a monitoring digest over webhook/email, and IndexNow.\n- **Built for small hosts.** Single-flight background audit with tunable throttling, paginated document\n  loading with a memory cap, LRU-bounded cache and a build-time audit cache you can generate in CI.\n\n## Installation\n\n```bash\nnpm install @consilioweb/payload-seo-analyzer\n# or\npnpm add @consilioweb/payload-seo-analyzer\n# or\nyarn add @consilioweb/payload-seo-analyzer\n```\n\n`payload@^3` is the only required peer. `next`, `react`, `@payloadcms/next` and `@payloadcms/ui` are\ndeclared optional peers — a Payload 3 admin panel already has all four, so a normal install pulls\nnothing extra, but package managers will warn if your versions fall out of the supported ranges (see\n[Requirements](#requirements)).\n\n## Quick Start\n\n```ts\n// payload.config.ts\nimport { buildConfig } from 'payload'\nimport { seoAnalyzerPlugin } from '@consilioweb/payload-seo-analyzer'\n\nexport default buildConfig({\n  // ...your db, collections, admin config\n  plugins: [\n    seoAnalyzerPlugin({\n      collections: ['pages', 'posts'],\n      siteUrl: 'https://example.com',\n    }),\n  ],\n})\n```\n\nThe plugin injects React components into the admin panel, so regenerate the import map, then start:\n\n```bash\npnpm payload generate:importmap\npnpm dev\n```\n\nOpen `/admin/seo` for the dashboard, or edit any page or post to see the score in the sidebar.\n\n### Frontend metadata and JSON-LD\n\nThe same URL rules the sitemap uses are exported as pure functions, safe to call from a Server Component\nor `generateMetadata`:\n\n```ts\nimport { buildSeoMetadata } from '@consilioweb/payload-seo-analyzer'\n\n// `doc` is a Payload document you already fetched\nconst metadata = buildSeoMetadata(doc, {\n  collection: 'posts',\n  siteUrl: 'https://example.com',\n})\n```\n\n```tsx\nimport { buildJsonLd, serializeJsonLd } from '@consilioweb/payload-seo-analyzer'\n\nconst { jsonLd } = buildJsonLd(doc, { collection: 'posts', siteUrl: 'https://example.com' })\n\n<script\n  type=\"application/ld+json\"\n  dangerouslySetInnerHTML={{ __html: serializeJsonLd(jsonLd) }}\n/>\n```\n\nUse `serializeJsonLd` rather than `JSON.stringify` — it escapes `<`, `>`, `&`, U+2028 and U+2029, which\n`JSON.stringify` does not (see [Security](#security)).\n\n## Configuration\n\n### Plugin options\n\nEvery field of `SeoPluginConfig`. All are optional.\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `collections` | `string[]` | `['pages', 'posts']` | Collections that get SEO fields and are analyzed. |\n| `globals` | `string[]` | `[]` | Globals that get SEO fields and are analyzed. |\n| `siteUrl` | `string` | `NEXT_PUBLIC_SERVER_URL` / `PAYLOAD_PUBLIC_SERVER_URL` | Base URL for canonicals, sitemaps, JSON-LD and GSC. |\n| `siteName` | `string` | — | Used by the \"brand duplicated in title\" check. |\n| `locale` | `'fr' \\| 'en'` | `'fr'` | Language of the analysis (readability, stop words, check messages), in the editor sidebar and on the dashboard alike. The plugin's own interface follows the Payload admin language instead. |\n| `localeMapping` | `Record<string, 'fr' \\| 'en'>` | — | Maps your Payload locale codes onto the analysis locale. |\n| `collectionRoutes` | `Record<string, string>` | `{ posts: 'posts' }` | Public route prefix per collection, used by every URL the plugin generates. Set `{ posts: '' }` if posts are served flat at `/<slug>`. |\n| `knownRoutes` | `string[]` | `[]` | Dynamic routes with no matching document slug, so they are not reported as broken links or orphans. |\n| `features` | `SeoFeatures` | see below | Per-feature on/off switches. |\n| `disabledRules` | `RuleGroup[]` | `[]` | Rule groups to skip entirely. |\n| `overrideWeights` | `Partial<Record<RuleGroup, number>>` | — | Force the weight of every check in a group. |\n| `thresholds` | `SeoThresholds` | constants | Numeric overrides (see below). |\n| `localSeoSlugs` | `string[]` | — | Extra slugs to treat as local-SEO pages. |\n| `endpointBasePath` | `string` | `'/seo-plugin'` | Path prefix for the REST endpoints, under `/api`. **Keep the default if you use the admin views or the editor sidebar:** apart from the meta fields' generate buttons, they still call `/api/seo-plugin`. |\n| `addDashboardView` | `boolean` | `true` | Set `false` to register no admin view at all. |\n| `addSitemapAuditView` | `boolean` | `true` | Set `false` to drop only `/admin/sitemap-audit`. |\n| `trackScoreHistory` | `boolean` | `true` | Adds `seo-score-history` plus the `afterChange` hook that feeds it. |\n| `redirectsCollection` | `string` | `'seo-redirects'` | Slug of the redirects collection; an existing collection with that slug is reused. |\n| `allowExternalRedirects` | `boolean` | `false` | Allow redirect destinations on another origin (absolute `http(s)` URLs). Off by default: an off-site 301 served from your own path carries your domain's authority. Redirects created before you upgraded stay editable — the gate only refuses a destination that *changes*. |\n| `uploadsCollection` | `string` | `'media'` | Upload collection used by `meta.image` and the AI alt-text endpoints. |\n| `autoCreateMetaFields` | `boolean` | `true` | Adds the `meta` group (title, description, image, preview) to target collections. |\n| `seoLogsSecret` | `string` | — | Shared secret for `POST /seo-logs`; when set, the caller sends `X-SEO-Secret` instead of a session. |\n| `auditCacheFile` | `string` | — | Path to a JSON audit produced by `buildAuditToFile()`, hydrated on a dashboard cache miss instead of rebuilding live. |\n| `generateTitle` | `(args) => string \\| Promise<string>` | — | Backs the \"auto-generate\" button on the meta title. |\n| `generateDescription` | `(args) => string \\| Promise<string>` | — | Same, for the meta description. |\n| `generateImage` | `(args) => string \\| number \\| Promise<…>` | — | Same, for the meta image (media id or URL). |\n| `generateURL` | `(args) => string \\| Promise<string>` | — | Builds the document's public URL for previews. |\n| `fields` | `({ defaultFields }) => Field[]` | — | Rewrites the contents of the `meta` group. |\n| `tabbedUI` | `boolean` | `false` | Wraps collection fields in \"Content\" / \"SEO\" tabs. |\n| `interfaceName` | `string` | — | TypeScript interface name generated for the `meta` group. |\n| `customTranslations` | `Record<string, Partial<DashboardTranslations>>` | — | Dashboard strings for locales beyond FR/EN; missing keys fall back to English. |\n| `retentionDays` | `Partial<Record<'seo-rank-history' \\| 'seo-score-history' \\| 'seo-performance' \\| 'seo-logs', number>>` | — | Days of history to keep, per time-series collection. Opt-in: without it nothing is ever deleted. See [Retention](#retention). |\n\n`thresholds` accepts `titleLengthMin`, `titleLengthMax`, `metaDescLengthMin`, `metaDescLengthMax`,\n`minWordsGeneric`, `minWordsPost`, `keywordDensityMin`, `keywordDensityMax`, `fleschScorePass` and\n`slugMaxLength`.\n\n```ts\nseoAnalyzerPlugin({\n  collections: ['posts'],\n  disabledRules: ['ecommerce'],\n  overrideWeights: { social: 1 },\n  thresholds: { titleLengthMax: 65, metaDescLengthMax: 165 },\n})\n```\n\n### Retention\n\nThe four time-series collections are append-only: `seo-rank-history` gains a row per tracked query\nper day, `seo-score-history` one per document per save, `seo-performance` one per imported Search\nConsole row, and `seo-logs` one per distinct 404 URL. Nothing trims them, so on a long-lived site\nthey grow without bound. That is a database-size problem, not a privacy one — the only\nvisitor-derived values are `referrer` and `userAgent` on `seo-logs`, and no IP address is stored\nanywhere.\n\n`retentionDays` is **opt-in**. Without it, behaviour is exactly what it has always been: nothing is\ndeleted.\n\n```ts\nseoAnalyzerPlugin({\n  retentionDays: {\n    'seo-rank-history': 365,\n    'seo-score-history': 180,\n    'seo-performance': 400,\n    'seo-logs': 90,\n  },\n})\n```\n\nNaming at least one collection:\n\n- schedules a purge 5 minutes after boot and every 24 hours, deleting rows older than the window;\n- registers `GET /api/seo-plugin/retention` (dry run — reports the cutoffs, deletes nothing) and\n  `POST /api/seo-plugin/retention` (run now), both **SEO-admin only**.\n\nDetails worth knowing:\n\n- Each collection is trimmed on **its own date field** — `snapshotDate`, `date` or `lastSeen`, never\n  `createdAt`, which three of the four do not have (`timestamps: false`). `seo-logs` is keyed on\n  `lastSeen` so a 404 first recorded long ago but still being hit today is kept.\n- A value that is not a finite number of at least `1` is **ignored, not clamped**: `0` would mean\n  \"delete everything\".\n- Collections are purged one after another, never in parallel — parallel writes are what produce\n  `SQLITE_BUSY`.\n- The windows come from your config only. The `POST` endpoint reads no body, so no caller can pass\n  its own retention.\n- `purgeRetention`, `describeRetention` and `resolveRetention` are exported from the package root if\n  you would rather run the trim from your own cron.\n\n### Feature flags\n\n`features` gates collections, endpoints and admin views together — turning one off loads less. The core\nanalyzer sidebar, the `validate` endpoint and the meta fields are always active.\n\n| Flag | Default | What it controls |\n|---|---|---|\n| `dashboard` | `true` | `/admin/seo`, `/audit`, `/indexation-audit` |\n| `sitemapAudit` | `true` | `/admin/sitemap-audit`, `/sitemap-audit`, `/sitemap-config` |\n| `settings` | `true` | `/admin/seo-config`, `/settings`, the `seo-settings` collection |\n| `redirects` | `true` | `/admin/redirects`, redirect CRUD, the `seo-redirects` collection |\n| `performance` | `true` | `/admin/performance`, `/performance`, `/core-web-vitals`, the `seo-performance` collection |\n| `linkGraph` | `true` | `/admin/link-graph`, `/link-graph` |\n| `keywords` | `true` | `/admin/keyword-research`, `/keyword-research` |\n| `cannibalization` | `true` | `/admin/cannibalization`, `/cannibalization` |\n| `schemaBuilder` | `true` | `/admin/schema-builder`, `/schema-generator` |\n| `scoreHistory` | `true` | `seo-score-history` collection, tracking hook, `/history` |\n| `seoLogs` | `true` | `seo-logs` collection and endpoints (404 tracking) |\n| `externalLinks` | `true` | `/external-links` |\n| `duplicateContent` | `true` | `/duplicate-content` |\n| `aiFeatures` | `true` | the seven `ai-*` / `alt-text-audit` endpoints |\n| `warmCache` | `true` | background cache warm-up on init and hourly — turn off on low-memory hosts |\n| `gscApi` | **`false`** | Google Search Console OAuth, rank tracking, CTR opportunities, content grade, `seo-gsc-auth` + `seo-rank-history` |\n| `alerts` | **`false`** | monitoring digest endpoints and scheduler |\n| `indexNow` | **`false`** | IndexNow key file and submit endpoint |\n| `analyzer` | `true` | always on; cannot be disabled |\n\n### Environment variables\n\n| Variable | Default | Description |\n|---|---|---|\n| `NEXT_PUBLIC_SERVER_URL` | — | Fallback base URL when `siteUrl` is not set (`PAYLOAD_PUBLIC_SERVER_URL` is tried next). |\n| `ANTHROPIC_API_KEY` | — | Enables the AI assists; without it they fall back to heuristics or return an error. |\n| `SEO_AI_MODEL` | `claude-sonnet-4-6` | Model used by `/ai-optimize`, `/ai-optimize-bulk`, `/ai-content-brief` and `/ai-alt-text`. `/ai-rewrite` is pinned to Haiku and `/ai-generate` is purely heuristic, so neither reads it. |\n| `SEO_MEDIA_ORIGIN` | — | Extra origin the AI alt-text endpoint may fetch images from, alongside `siteUrl`. |\n| `SEO_REQUIRE_ADMIN_ROLE` | — | `1` disables the fail-open in `isSeoAdmin`, requiring an explicit `admin` role. |\n| `SEO_ADMIN_USER_COLLECTIONS` | `config.admin.user` | Comma-separated collection slugs accepted as admin-panel users. Only needed if several collections may reach the panel. |\n| `SEO_AUDIT_MIN_REFRESH_MS` | `300000` | Minimum delay between two manual (`?nocache=1`) rebuilds of the site-wide audit. |\n| `SEO_STRICT_READ_ACCESS` | — | `1` makes single-document reads honour the caller's collection and field-level ACL. |\n| `SEO_FETCH_MAX_DOCS` | `5000` | Cap on documents loaded by site-wide helpers. |\n| `SEO_AUDIT_MAX_DOCS` | `1500` | Cap on documents included in one site-wide audit. |\n| `SEO_AUDIT_BATCH_SIZE` | `10` | Documents analysed per audit batch (capped at 100). |\n| `SEO_AUDIT_BATCH_DELAY_MS` | `100` | Pause between audit batches (capped at 5000). |\n| `SEO_AUDIT_DOC_DELAY_MS` | `10` | Pause after each document; `0` is fastest, raise it on rich content. |\n| `SEO_AUDIT_THROTTLE_RATIO` | `2` | Idle-to-work ratio applied while the audit builds. |\n| `SEO_AUDIT_DEPTH` | `0` | Payload `depth` used when loading documents for the audit. |\n| `SEO_AUDIT_FILE_CACHE` | — | `0` or `false` ignores `auditCacheFile` and forces a live build. |\n| `SEO_AUDIT_TRUST_FILE` | — | `1` serves `auditCacheFile` without the staleness check (for CI-prewarmed deployments). |\n| `SEO_SITEMAP_BATCH_SIZE` | `50` | Batch size for the news/image/video sitemaps (capped at 100). |\n| `SEO_SITEMAP_MAX_DOCS` | `5000` | Document cap for the news/image/video sitemaps. Counts every document **read**, filtered ones included. |\n| `SEO_LOGS_MAX_ROWS` | `5000` | Ceiling on the rows `POST /seo-logs` may create. Past it, known URLs keep incrementing but no new path is recorded. |\n| `SEO_LLMS_TXT` | — | `1` enables `/llms.txt`; it returns 404 otherwise. |\n| `SEO_INDEXNOW_KEY` | — | IndexNow key, served at `/indexnow-key.txt`. Required by the `indexNow` feature. |\n| `GSC_OAUTH_CLIENT_ID` / `GSC_OAUTH_CLIENT_SECRET` | — | Google Cloud OAuth client for the `gscApi` feature. |\n| `SEO_GSC_ENCRYPTION_KEY` | — | 32-byte key encrypting the stored GSC tokens (AES-256-GCM). Strongly recommended. |\n| `GOOGLE_PAGESPEED_API_KEY` / `PAGESPEED_API_KEY` | — | PageSpeed Insights key for Core Web Vitals; raises the quota. |\n| `SEO_ALERT_WEBHOOK_URL` / `SEO_ALERT_EMAIL` | — | Digest delivery for the `alerts` feature. |\n| `SEO_ALERT_SCORE_DROP` | `10` | Score drop, in points, that triggers an alert. |\n| `SEO_ALERT_POSITION_DROP` | `5` | SERP position drop that triggers an alert. |\n| `SEO_ALERT_WINDOW_HOURS` | `24` | Look-back window for the digest. |\n| `SEO_ALERT_INTERVAL_HOURS` | `24` | How often the scheduler runs (minimum 1). |\n\n## API Endpoints\n\nAll paths are relative to `/api/seo-plugin` (change the prefix with `endpointBasePath`, for API-only use — see [Plugin options](#plugin-options)). \"Authenticated\"\nmeans a logged-in **admin-panel** user — a session on another auth collection (front-office customers,\nmembers, subscribers) does **not** qualify, even though Payload populates `req.user` for it on every\nroute. The panel collection is `config.admin.user`; widen it with `SEO_ADMIN_USER_COLLECTIONS` if\nseveral collections may reach the panel. \"SEO admin\" adds a role check on top — a user with\n`role: 'admin'` or an `admin` entry in `roles` — including when the host models roles as a\nsingle-value select or as a relationship the plugin can read a name from. It falls back to any\nadmin-panel user only when the users collection declares **no** `role`/`roles` field at all; a field\nthat exists but holds an unreadable value (an unpopulated relationship id) denies rather than\npromotes, and the plugin logs why. Set `SEO_REQUIRE_ADMIN_ROLE=1` to remove the fallback entirely.\n\nThe plugin's **admin views** (`/admin/seo`, `/admin/redirects`, …) apply the same panel-session rule.\nRegistering a custom view takes its route out of Payload's own `canAccessAdmin` redirect, so the\nviews check it themselves and send a foreign session to `/admin/unauthorized`.\n\nThe plugin's own collections (`seo-settings`, `seo-redirects`, `seo-gsc-auth`, `seo-performance`,\n`seo-logs`, `seo-score-history`, `seo-rank-history`) enforce the same rule through their `access`\nconfig, since Payload exposes a REST API for every collection.\n\n### Always registered\n\n| Method | Path | Access | Purpose |\n|---|---|---|---|\n| `GET` `POST` | `/validate` | Authenticated | Full analysis of one document or global. |\n| `GET` | `/check-keyword` | Authenticated | Whether a focus keyword is already used elsewhere. |\n| `POST` | `/generate` | Authenticated | Runs your `generateTitle` / `generateDescription` / `generateImage` / `generateURL`. |\n| `POST` | `/suggest-links` | Authenticated | Internal-link suggestions; rate limited to 120/min, index cached 15 min. |\n| `GET` | `/breadcrumb` | Authenticated | Breadcrumb trail for a document. |\n| `GET` | `/health` | SEO admin | Module health and observability. |\n| `GET` | `/robots.txt` | Public | Generated `robots.txt`. |\n| `POST` | `/robots.txt` | SEO admin | Saves custom robots rules into `seo-settings`. |\n| `GET` | `/sitemap.xml` | Public | Main sitemap. |\n| `GET` | `/sitemap-news.xml` `/sitemap-images.xml` `/sitemap-video.xml` | Public | Specialised sitemaps. |\n| `GET` | `/llms.txt` | Public | AI-discoverability file; 404 unless `SEO_LLMS_TXT=1`. |\n\n### Feature-gated\n\n| Method | Path | Access | Feature |\n|---|---|---|---|\n| `GET` | `/audit` | Authenticated | `dashboard` |\n| `GET` | `/indexation-audit` | Authenticated | `dashboard` |\n| `GET` | `/history` | Authenticated | `scoreHistory` |\n| `GET` | `/sitemap-audit`, `/sitemap-config` | Authenticated | `sitemapAudit` |\n| `GET` `PATCH` | `/settings` | Authenticated (GET) / SEO admin (PATCH) | `settings` |\n| `GET` | `/redirects` | Authenticated | `redirects` |\n| `POST` `PATCH` `DELETE` | `/redirects` | SEO admin | `redirects` |\n| `POST` | `/create-redirect` | SEO admin | `redirects` |\n| `GET` | `/redirect-chains` | Authenticated | `redirects` |\n| `GET` | `/cannibalization` | Authenticated | `cannibalization` |\n| `POST` | `/external-links` | Authenticated | `externalLinks` |\n| `GET` | `/duplicate-content` | Authenticated | `duplicateContent` |\n| `GET` | `/link-graph` | Authenticated | `linkGraph` |\n| `GET` | `/keyword-research` | Authenticated | `keywords` |\n| `GET` | `/schema-generator` | Authenticated | `schemaBuilder` |\n| `GET` | `/performance` | Authenticated | `performance` |\n| `POST` | `/performance` | SEO admin | `performance` |\n| `GET` | `/core-web-vitals` | Authenticated | `performance` |\n| `POST` | `/ai-generate`, `/ai-rewrite`, `/ai-optimize`, `/ai-content-brief` | Authenticated | `aiFeatures` |\n| `GET` | `/alt-text-audit` | SEO admin | `aiFeatures` |\n| `POST` | `/ai-alt-text`, `/ai-optimize-bulk` | SEO admin | `aiFeatures` |\n| `GET` | `/seo-logs` | Authenticated | `seoLogs` |\n| `POST` | `/seo-logs` | `X-SEO-Secret` header, or SEO admin when no `seoLogsSecret` is set | `seoLogs` |\n| `DELETE` | `/seo-logs` | SEO admin | `seoLogs` |\n| `GET` | `/gsc/status` | Authenticated | `gscApi` |\n| `GET` | `/gsc/auth`, `/gsc/callback`, `/gsc/data` | SEO admin | `gscApi` |\n| `POST` | `/gsc/disconnect` | SEO admin | `gscApi` |\n| `POST` | `/rank-snapshot` | SEO admin | `gscApi` |\n| `GET` | `/rank-history`, `/ctr-opportunities`, `/content-grade` | SEO admin | `gscApi` |\n| `GET` | `/alerts-digest` | SEO admin | `alerts` |\n| `POST` | `/alerts-run` | SEO admin | `alerts` |\n| `GET` | `/indexnow-key.txt` | Public (search engines verify it) | `indexNow` |\n| `POST` | `/indexnow-submit` | SEO admin | `indexNow` |\n| `GET` | `/retention` | SEO admin | registered only when `retentionDays` is set |\n| `POST` | `/retention` | SEO admin | registered only when `retentionDays` is set |\n\nExpensive endpoints are rate limited to 10 requests per minute, keyed by user id and falling back to the\nclient IP; the polled ones (`/audit`, `/suggest-links`) get 120 per minute instead.\n\n## Admin Views\n\n| Path | View | Feature |\n|---|---|---|\n| `/admin/seo` | Site-wide dashboard and audit | `dashboard` |\n| `/admin/sitemap-audit` | Sitemap coverage, broken links, orphans | `sitemapAudit` |\n| `/admin/seo-config` | Settings, thresholds, robots, sitemap options | `settings` |\n| `/admin/redirects` | Redirect manager (CRUD, CSV import, chain detection) | `redirects` |\n| `/admin/cannibalization` | Pages competing on the same query | `cannibalization` |\n| `/admin/performance` | Search Console data and Core Web Vitals | `performance` |\n| `/admin/keyword-research` | Keyword research and coverage | `keywords` |\n| `/admin/schema-builder` | JSON-LD builder per document type | `schemaBuilder` |\n| `/admin/link-graph` | Internal link graph and crawl budget | `linkGraph` |\n\nA nav link to the dashboard is appended to `afterNavLinks`.\n\n## Collections\n\nCreated by the plugin, only when the matching feature is on.\n\n| Slug | Role | Read | Write | Feature |\n|---|---|---|---|---|\n| `seo-settings` | Thresholds, sitemap and robots configuration | Authenticated | SEO admin | `settings` |\n| `seo-redirects` | Redirect rules (slug configurable) | Authenticated | SEO admin | `redirects` |\n| `seo-score-history` | Score snapshots per document | Authenticated | Create: authenticated; update/delete: `role: 'admin'` | `scoreHistory` |\n| `seo-performance` | Imported Search Console rows | Authenticated | Authenticated | `performance` |\n| `seo-logs` | 404 tracking | Authenticated | SEO admin | `seoLogs` |\n| `seo-gsc-auth` | OAuth tokens, encrypted at rest and never readable through the API | Authenticated | SEO admin | `gscApi` |\n| `seo-rank-history` | Daily rank snapshots from GSC | Authenticated | `role: 'admin'` | `gscApi` |\n\nIf a collection with the `redirectsCollection` slug already exists in your config, the plugin uses yours\ninstead of creating its own.\n\n## Package Exports\n\n| Entry | Contents | Environment |\n|---|---|---|\n| `@consilioweb/payload-seo-analyzer` | `seoAnalyzerPlugin` (alias `seoPlugin`), `analyzeSeo`, the frontend helpers, field builders (`seoFields`, `metaFields`), endpoint handler factories, `buildAuditToFile`, the extraction helpers, the scoring constants and every type | Server / isomorphic |\n| `@consilioweb/payload-seo-analyzer/client` | The admin React components (`SeoAnalyzerField`, the nine views, meta field components, `SerpPreview`, `SeoNavLink`) | Client (`'use client'`) |\n| `@consilioweb/payload-seo-analyzer/views` | Server view wrappers that render each dashboard view inside Payload's `DefaultTemplate` | Server (RSC) |\n\nBoth ESM and CJS builds ship, with their own type declarations. `sideEffects` is limited to the client\nbundle, so the root and `views` entries tree-shake.\n\n### Frontend helpers\n\n| Function | Signature | Purpose |\n|---|---|---|\n| `buildSeoMetadata` | `(doc, options?) => SeoMetadata` | Title, description, canonical, robots, Open Graph and Twitter tags. Shape-compatible with Next.js `Metadata`. |\n| `buildJsonLd` | `(doc, options?) => { type, jsonLd }` | Schema.org object for the document, type auto-detected from the collection unless forced. |\n| `renderJsonLdScript` | `(doc, options?) => string` | The complete `<script type=\"application/ld+json\">` tag, already escaped. |\n| `serializeJsonLd` | `(jsonLd) => string` | XSS-safe JSON for `dangerouslySetInnerHTML`. |\n| `buildDocPath` / `buildDocUrl` | `(…, collection?, collectionRoutes?)` | The exact public path or URL the sitemap, canonical and JSON-LD use. |\n| `analyzeSeo` | `(input, config?) => SeoAnalysis` | Runs the whole engine outside Payload. |\n\n`buildSeoMetadata` and `buildJsonLd` both take `collection` and `collectionRoutes`; pass the same\n`collectionRoutes` you gave the plugin, or the URLs they produce will not match the sitemap.\n\nThe second argument of `analyzeSeo` is a `SeoConfig`, the analyzer's own config type. `siteUrl`,\n`siteName`, `locale`, `disabledRules`, `overrideWeights`, `thresholds`, `localSeoSlugs` and\n`collectionRoutes` behave exactly as in [Plugin options](#plugin-options) — the plugin forwards them\nfor you. Two fields exist only here, so they are reachable only by calling `analyzeSeo` directly:\n\n| Field | Type | Default | Purpose |\n|---|---|---|---|\n| `stopWordCompounds` | `Array<readonly [string, string]>` | built-in FR/EN list | Extra compound expressions whose stop words are tolerated in a slug; appended to the defaults. |\n| `maxRecursionDepth` | `number` | `50` | Depth limit when walking a Lexical tree to extract text. |\n\n## Requirements\n\n| Dependency | Range | Required |\n|---|---|---|\n| `payload` | `^3.0.0` | Yes |\n| `next` | `^15.2.0 \\|\\| ^16.0.0` | Optional peer (needed by the admin components) |\n| `react` | `^18.0.0 \\|\\| ^19.0.0` | Optional peer |\n| `@payloadcms/next` | `^3.0.0` | Optional peer |\n| `@payloadcms/ui` | `^3.0.0` | Optional peer |\n| Node.js | `^20.19.0 \\|\\| >=22.12.0` | Yes (`engines`) |\n\nNode 18 is not supported from 2.0.0 on. CI runs the suite on Node 20 and 22.\n\n## Uninstall\n\n```bash\nnpx seo-analyzer-uninstall\n```\n\nThe script runs three steps: it removes the package's imports and `seoAnalyzerPlugin(...)` calls from\nyour source files, runs the removal command for your package manager, then regenerates the import map.\nIt exits with code `1` and lists the failing commands if either of the last two did not complete.\n\n**It never touches your database**, and it prints what is left behind:\n\n- The seven plugin tables you may drop (`seo-gsc-auth`, `seo-settings`, `seo-redirects`,\n  `seo-score-history`, `seo-performance`, `seo-logs`, `seo-rank-history`). Drop **`seo-gsc-auth`\n  first**: it holds an encrypted Google OAuth refresh token and the connected account's email, and\n  removing the package does not revoke that grant — do that at\n  [myaccount.google.com/permissions](https://myaccount.google.com/permissions) too. `seo-logs` holds\n  visitor `referrer` and `userAgent` strings (no IP addresses).\n- The fields the plugin injected into **your** collections, which are *not* dropped and should not be\n  dropped blindly: `isCornerstone`, `focusKeyword`, the `focusKeywords` array table, and the `meta`\n  group. `meta.title` / `meta.description` are editorial content your editors wrote, and the group may\n  belong to `@payloadcms/plugin-seo` rather than to this plugin — see\n  [Database and updates](#database-and-updates). Removing any of them is a schema change:\n  `payload migrate:create`, then `payload migrate`.\n\n## Database and updates\n\n- This plugin adds collections and fields to your Payload config. It does not own the schema — your\n  app does.\n- **Payload does not let a plugin ship migrations.** `payload migrate` reads a single directory, and\n  it resolves it in the host app, never in a dependency (`payload/dist/database/migrations/readMigrationFiles.js`,\n  `findMigrationDir.js`). A migration file published inside an npm package is dead code.\n- **In development**, `push` syncs the schema for you — there is nothing to run.\n- **In production**, run `payload migrate:create` then `payload migrate`. Never `push`: it is skipped\n  as soon as `NODE_ENV=production`, and mixing it with migrations raises a data-loss warning\n  (`@payloadcms/drizzle/dist/migrate.js`).\n- Every release of this plugin states in its own migration section below whether it changes the\n  schema. None has since 1.19.0.\n\n### What this plugin writes into *your* tables\n\nThe [collections listed above](#collections) are the plugin's own tables. But the analyzer fields\n(`isCornerstone` checkbox, `focusKeyword` text, `focusKeywords` array, `src/fields.ts`) and the `meta`\ngroup (`meta.title` text, `meta.description` textarea, `meta.image` upload, `src/metaFields.ts`) are\ninjected into **every collection listed in the `collections` option**. Each slug you add to that list\ncreates real columns in one of your own tables — plus a real array table for `focusKeywords` — exactly\nas if you had declared the fields by hand.\n\nSo the migration you owe is triggered by *your* config, not by a version bump: after adding a slug to\n`collections`, run `payload migrate:create` + `payload migrate` in production.\n\nIf the collection already carries a `meta` group — from `@payloadcms/plugin-seo`, or your own field —\nthe plugin detects it, logs a warning and skips the group instead of adding a second one. Set\n`autoCreateMetaFields: false` to skip it unconditionally.\n\nThese two field definitions are byte-identical to their 1.19.0 versions, so no upgrade of this plugin\nhas ever owed you a migration by itself.\n\n## Migration to 4.0\n\n**No schema change.** 4.0.0 only changes access rules, validation and view guards. Do not generate a\nmigration for it.\n\nThe full account is in [CHANGELOG.md](CHANGELOG.md). What can change for you at runtime:\n\n1. **Sessions from an auth collection other than the admin panel's lose the nine admin views.** They\n   are redirected to `/admin/unauthorized`; anonymous visitors go to your real login route instead of\n   a hard-coded `/admin/login`. Only relevant if your config declares more than one `auth` collection.\n2. **Panel users promoted by the old RBAC fail-open lose their SEO-admin rights.** The fallback now\n   asks whether a role field is *present*, not whether it has a shape the plugin recognises. If your\n   users collection models `role` / `roles` as anything other than a plain string or an array of\n   strings, check who still writes to `seo-settings`, `seo-redirects` and `seo-gsc-auth`.\n3. **`POST /seo-logs` requires an SEO admin when no `seoLogsSecret` is configured**, and stops\n   creating rows past `SEO_LOGS_MAX_ROWS` (default 5000).\n4. **`peerDependencies` require Payload `>=3.79.1 <4.0.0`** for `payload`, `@payloadcms/next` and\n   `@payloadcms/ui`.\n\n## Migration to 3.0\n\n**No schema change.** 3.0.0 only changes access rules, validation and rate limiting. Do not generate a\nmigration for it.\n\nThe full account is in [CHANGELOG.md](CHANGELOG.md). The one item that leaves data behind:\n\n**External redirect destinations are refused unless you opt in** (`allowExternalRedirects`, default\n`false`). Rows stored *before* the upgrade stay editable — the gate only refuses a destination that\nactually **changes**, so an existing external redirect can still have its source path or its 301/302\ntype edited (`src/collections/SeoRedirects.ts`, `src/helpers/redirectSafety.ts`). Nothing is rewritten\nor deleted for you; the legacy value simply survives. To review what you are grandfathering, list the\nrows whose destination is absolute:\n\n```bash\n# adjust the table name to your redirectsCollection slug\nsqlite3 your.db \"SELECT id, \\\"from\\\", \\\"to\\\" FROM seo_redirects WHERE \\\"to\\\" LIKE 'http%';\"\n```\n\n```sql\n-- Postgres\nSELECT id, \"from\", \"to\" FROM seo_redirects WHERE \"to\" LIKE 'http%';\n```\n\nSet `allowExternalRedirects: true` if you genuinely rely on cross-origin redirects; otherwise fix the\nrows the query returns, since any edit that touches their destination will now be refused.\n\nOther 3.0.0 changes that alter behaviour without touching data: the site-wide aggregation endpoints no\nlonger publish drafts to any authenticated account, `seo-performance` / `seo-logs` /\n`seo-score-history` are no longer writable through the collection API by a plain panel user,\n`sitemap.xml` excludes `noindex` documents, and `?nocache=1` is ignored for a panel user without the\nadmin role.\n\n## Migration to 2.0\n\nThree breaking changes; the full account is in [CHANGELOG.md](CHANGELOG.md).\n\n1. **Generated URLs now carry the collection route prefix.** A `posts` document resolves to\n   `/posts/<slug>` instead of `/<slug>`, across `sitemap.xml`, the canonical, the Open Graph URL, the\n   JSON-LD `@id` / `url` and IndexNow. If your posts are served flat, restore the old URLs with\n   `seoAnalyzerPlugin({ collectionRoutes: { posts: '' } })`, and pass the same map to\n   `buildSeoMetadata` / `buildJsonLd` where you call them yourself. A document slugged `home` now\n   resolves to the site root rather than `/home`.\n2. **`seo-settings`, `seo-redirects` and `seo-gsc-auth` are writable by SEO admins only.** On a\n   role-less install nothing changes; on one with roles, a non-admin editor loses write access to those\n   three collections.\n3. **`POST /ai-alt-text` no longer accepts a `collection` in the body** — the target is always\n   `uploadsCollection`, and any other value gets a 403.\n\nAlso: Node 18 is dropped, and `next` became a declared (optional) peer dependency.\n\n## Performance\n\nCharacteristics, not benchmarks — the numbers depend on your content volume and host.\n\n| Concern | Approach |\n|---|---|\n| Site-wide audit | Built in the background, single-flight per locale, batched and throttled through the `SEO_AUDIT_*` variables. |\n| Very small hosts | Pre-compute the audit in CI with `buildAuditToFile()` and point `auditCacheFile` at the result. |\n| Document loading | Paginated, with a hard cap (`SEO_FETCH_MAX_DOCS`) and an optional field projection. |\n| Caching | LRU-bounded with locale-aware invalidation; Core Web Vitals are cached to protect the PageSpeed quota. |\n| Heavy endpoints | Rate limited by user id, with periodic event-loop yielding during long loops. |\n| External APIs | LLM and HTTP calls carry timeouts and retry with backoff. |\n\n## Troubleshooting\n\n**Admin components do not update.** Regenerate the import map: `pnpm payload generate:importmap`.\n\n**Generated URLs do not match my routes.** Declare the public prefix of each collection:\n\n```ts\nseoAnalyzerPlugin({ collectionRoutes: { posts: '', projects: 'work' } })\n```\n\nPass the same map to `buildSeoMetadata` and `buildJsonLd` in your front end.\n\n**`SQLITE_BUSY` during imports.** The plugin serializes its own writes, including the bulk redirect\nimport. Make sure your own seed and import scripts write sequentially too.\n\n**The audit is heavy on a small host.** Raise `SEO_AUDIT_BATCH_DELAY_MS` and `SEO_AUDIT_DOC_DELAY_MS`,\nlower `SEO_AUDIT_MAX_DOCS`, set `features: { warmCache: false }`, or move the build to CI with\n`buildAuditToFile()` and `auditCacheFile`.\n\n## Security\n\nSecrets are read from environment variables only, never from the database. GSC tokens are encrypted at\nrest with AES-256-GCM when `SEO_GSC_ENCRYPTION_KEY` is set, and the token fields carry\n`read: () => false` so they never leave through the API. The one GSC route open to any authenticated\npanel user is `GET /gsc/status`, which reports the connected account email, the property URL and the\nredirect URI — never a token. Redirect targets are validated against\nopen-redirect patterns, `robots.txt` rules are sanitized on write, and outbound fetches are guarded\nagainst SSRF with a private-IP denylist, DNS-rebinding resolution checks and manual per-hop redirect\nre-validation. JSON-LD is serialized through `serializeJsonLd`, which escapes the characters\n`JSON.stringify` leaves alone.\n\nIn production, set `SEO_GSC_ENCRYPTION_KEY`, set `SEO_REQUIRE_ADMIN_ROLE=1` if your users collection has\na role field, and keep a rate limit at your reverse proxy.\n\nReport vulnerabilities to `contact@consilioweb.fr` rather than in a public issue.\n\n## Contributing\n\n1. Fork the repository and branch from `main`.\n2. Run the checks before opening a pull request:\n\n```bash\npnpm typecheck && pnpm test && pnpm build\n```\n\nThe suite is 473 unit tests plus a Playwright harness for the admin views under `e2e/`\n(`pnpm test:e2e:ui:setup` once, then `pnpm test:e2e:ui`).\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md). Releases from 2.0.0 on are published with npm provenance attestation.\n\n## Support\n\nIf this plugin saves you time, consider buying me a coffee.\n\n<a href=\"https://buymeacoffee.com/pown3d\">\n  <img src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" width=\"217\" />\n</a>\n\n- [Documentation](https://github.com/pOwn3d/payload-seo-analyzer#readme)\n- [Issues](https://github.com/pOwn3d/payload-seo-analyzer/issues)\n- [Discussions](https://github.com/pOwn3d/payload-seo-analyzer/discussions)\n\n## License\n\nMIT — see [LICENSE](LICENSE). Built and maintained by [ConsilioWEB](https://consilioweb.fr/services/developpement-web/payload-cms).\n","readmeFilename":"README.md"}