{"_id":"@consilioweb/payload-maintenance","_rev":"21-ec46461a0d8a7760ddcea5121042fc89","name":"@consilioweb/payload-maintenance","dist-tags":{"latest":"0.9.1"},"versions":{"0.1.0":{"name":"@consilioweb/payload-maintenance","version":"0.1.0","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-maintenance@0.1.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"3388c22ab92bd227a8420d82081303964bbb4af3","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.1.0.tgz","fileCount":19,"integrity":"sha512-OLJwHo75xYRTRzUhW4eCe6mc+jjn5XqzID5flLyfMLPM+4NluOgu5Jg9XMbStOqSoWyWOErof47ugBehnqDK8A==","signatures":[{"sig":"MEUCIQDL/bIPsrZzOVDV8qvvXtIkOI9BVokkvGYEUA+drfwosgIgXaECWsEEeYi0RbH0dnf1sdf5OZcs15iWjczs6c0+lUQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":268396},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"gitHead":"033a44577396fb6a8b1b9683c0e8bfe619ee0b96","scripts":{"build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.1.0_1772888559156_0.5757701325151905","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@consilioweb/payload-maintenance","version":"0.2.0","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-maintenance@0.2.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"40f14a59411f48746cd84b657e29a83ae41f7395","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.2.0.tgz","fileCount":19,"integrity":"sha512-xJJGYZVjJGMok0qQwijv1orf/dyK0JrH7pWpley7Ps9hbHJF+mRdjaNEFckCHzhaeVeAiAwglqmzKUr8TF/qOQ==","signatures":[{"sig":"MEUCIQDoWKUlLqh80pcgEmxdaECq1IHkDQjCpqJ0bgT8yO8c9gIgDcgngwJLCNwjFKO2fZLB09lgjIqOELcZkvmxKx3m+hA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":432260},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"gitHead":"8064538d447011cde1184479d4246457ef861b3a","scripts":{"build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.2.0_1773300967427_0.4199292025994368","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@consilioweb/payload-maintenance","version":"0.3.0","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-maintenance@0.3.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"510738de364e2e3a97e92d6a846e247c4790f032","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.3.0.tgz","fileCount":19,"integrity":"sha512-+r0xw2RDiRLAXAhBeu5XTYofDgVbUbfNowBLq/sJjabPghbvN6h817Kb9B2qfvuIRoVi7VkNfD6/+EMdHnDbgg==","signatures":[{"sig":"MEUCIQDqPHLEGhQVHb1DPGH3bh9Zx+wjR0nKWfN6DHyK5t2eFAIgEnNq7+ZZg2btYI8sMjfcedfLE6uKBqJD42vnzdOzHWQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":449640},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"gitHead":"2a7cf58803b171ea1f445bc06e8df73e76d1e780","scripts":{"build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.3.0_1773306531037_0.10419456383580372","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@consilioweb/payload-maintenance","version":"0.3.1","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-maintenance@0.3.1","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"16cdf48947bad9370c8f1c13eefe0007eb36bbd5","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.3.1.tgz","fileCount":19,"integrity":"sha512-nDucWvLeBGTZWUpWkj7f+ZgdjucZ80TjuGhwCZCPVCDpb9oBvF7fAmMXsYiltXqOjouo5Xyhxb4OvZ73xYGNhg==","signatures":[{"sig":"MEUCIQDtimcVwRgoBbgvZxX+jJPEfrp/higMVeinHuPG/Kd77wIgSCMG9m85fb5luWhDJtui/gW0fKWORl9f2lUL0AHp7dc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":449577},"main":"./dist/index.cjs","type":"module","_from":"file:consilioweb-payload-maintenance-0.3.1.tgz","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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"_resolved":"/private/var/folders/fm/pn_mwb9d4492s8sgbgsclxfw0000gn/T/9d829476abc73ff2a11b3be9b57f0211/consilioweb-payload-maintenance-0.3.1.tgz","_integrity":"sha512-nDucWvLeBGTZWUpWkj7f+ZgdjucZ80TjuGhwCZCPVCDpb9oBvF7fAmMXsYiltXqOjouo5Xyhxb4OvZ73xYGNhg==","deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.3.1_1773325212597_0.29240162067357356","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@consilioweb/payload-maintenance","version":"0.4.0","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-maintenance@0.4.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"fbeeefc88c6363d2302747725e2d9fbe87318d3c","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.4.0.tgz","fileCount":19,"integrity":"sha512-AbCw/uywfVk87G336zjJBJJ9dtmMKao1TI3aiMzpAR4j4lP5coc5W+qdTwCFlzN61oGPMT5vHFjTjCUThqoGbg==","signatures":[{"sig":"MEUCICI3QwfjCu++NEt0THQvRspty8lro30U+o9c69SsK3yWAiEAh/oazlmI+M3Jw815KpyZIzsfCSAmi8pLsIoQ7FhtNLc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":449727},"main":"./dist/index.cjs","type":"module","_from":"file:consilioweb-payload-maintenance-0.4.0.tgz","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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"_resolved":"/private/var/folders/fm/pn_mwb9d4492s8sgbgsclxfw0000gn/T/3fb5e92d611e96bd99e349027b1ab189/consilioweb-payload-maintenance-0.4.0.tgz","_integrity":"sha512-AbCw/uywfVk87G336zjJBJJ9dtmMKao1TI3aiMzpAR4j4lP5coc5W+qdTwCFlzN61oGPMT5vHFjTjCUThqoGbg==","deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.4.0_1773333932754_0.9350282267376757","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@consilioweb/payload-maintenance","version":"0.5.0","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-maintenance@0.5.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"874815a5d8888ca42844fdf5256ed69f42928625","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.5.0.tgz","fileCount":19,"integrity":"sha512-JXAhT1Bs1tg0BxiyUaPEU4DKXP4+qnjBxkP+1vyXkBpIm71rEZesvyttWVNZ7qMvfqbtLDe7sg5yu+GgDjH4/w==","signatures":[{"sig":"MEUCIQC//U4hNzD7v7TIt/zEKc/RoeCYywucQ3C6axLv5vLhrwIgUSNqCHpnYJa1y4qq15xfRs1gt2/vVv2ytMzEexjH4to=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":467334},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"gitHead":"c47154a4db3703b0e2a3a648aab3c0461d8ab3c8","scripts":{"build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.5.0_1775654286876_0.1247676752524216","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@consilioweb/payload-maintenance","version":"0.5.1","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-maintenance@0.5.1","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"c29c0d0c5e7e8a599f21240c540713247847134d","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.5.1.tgz","fileCount":19,"integrity":"sha512-YA3P28PDo8XvgNDNR5iOJi8MGUNMthiTiYF4aXPdm/pMSrmXRSTuJiQtgrN76MZHO8tMVViV5BIGTgcqHA8dSA==","signatures":[{"sig":"MEQCIEHafT7kDQDqV0dqNvFUeMWR8uznBAX1PZgI1Ilk7+HTAiA5D74012bwQMLIMFSs/0yiq5zSGkhLYbkJzZAQ5fYZ5A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":467675},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"gitHead":"6685fc17d9241547fe82b3ab1ed345a84f90df23","scripts":{"build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.5.1_1775655466505_0.5267352421769009","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@consilioweb/payload-maintenance","version":"0.5.2","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":{"url":"https://consilioweb.fr","name":"ConsilioWEB","email":"contact@consilioweb.fr"},"license":"MIT","_id":"@consilioweb/payload-maintenance@0.5.2","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"c7d042be6de6521c93e70f6598e191b6bc0f1de5","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.5.2.tgz","fileCount":19,"integrity":"sha512-se4gFsbpNjIdVqhgKVA2bumneXkyXdtiSZ4Zwdq9/IN2LYiwQt74f4VNgoLHpXR7SKHWkDMzftfNs724Z6LyVA==","signatures":[{"sig":"MEQCIF+CGMnElnrURxr1AOI39LdvgCGj2jgI5YFSgEtogeTcAiB8uF+sz3lvvIfiEJ6qayWbpDQlFq6EJQXcRS8gmzxFQg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":467702},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"gitHead":"5c20cd0409775646ca93c2c1b278b339f5181a89","scripts":{"build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"_npmVersion":"10.9.4","description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.5.2_1782200019763_0.9651630939258373","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@consilioweb/payload-maintenance","version":"0.6.0","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":"ConsilioWEB <contact@consilioweb.fr> (https://consilioweb.fr)","license":"MIT","_id":"@consilioweb/payload-maintenance@0.6.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"fe513ab905cd41f4911dba5ada2987e52c3ff9c4","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.6.0.tgz","fileCount":19,"integrity":"sha512-brrHO0oxRR/qGrCW8R5Bli00NbEIMlHxo3cJfKun4pBOR7L3Fg6TFvZ86q5FHvL+uw/IS0c+vbtsOmgpEPYsUg==","signatures":[{"sig":"MEUCIQD6ThUlgV6KSmdHA//UCrPrFGbHKeXJ6gNMW4lLuAY4YQIgOpocrv/+Y6nW/WfRAzucr2dCvOLS4WP6RY7+4OmRe0s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-maintenance@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":498732},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","vitest":"^4.1.11","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.6.0_1788789285015_0.7727028088053833","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@consilioweb/payload-maintenance","version":"0.7.0","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":"ConsilioWEB <contact@consilioweb.fr> (https://consilioweb.fr)","license":"MIT","_id":"@consilioweb/payload-maintenance@0.7.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"edc7c8f0739b128424214d91411fdde3f81af4e2","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.7.0.tgz","fileCount":19,"integrity":"sha512-dWi/3NmD+KWMW5c5AOL08XYq1rgNuNXx4hW+5yM+tj054+jZxk0ty86Jpex+QhzV74ciKb5g0ap8hycgOGWqOw==","signatures":[{"sig":"MEUCIQDVWwsn6MwmeelwL+ezwhkmtG3BTnGXkdOC6rOQCMg/zAIgF0utq+EkgZkIrVYrsPfVxY6xioUF9Qp642fPiZeFpZ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-maintenance@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":548019},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"deprecated":"SECURITY: the /admin/maintenance view was guarded by a session alone, so an account on any auth collection entered the admin panel and received the host's full client config. Upgrade to 0.8.0 — see https://github.com/pOwn3d/payload-maintenance/blob/main/CHANGELOG.md","repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"next":"^15.0.0","tsup":"^8.0.0","vitest":"^4.1.11","payload":"^3.79.0","typescript":"^5.5.0","@types/react":"^19.0.0","@payloadcms/ui":"^3.79.0","@payloadcms/translations":"^3.79.0"},"peerDependencies":{"next":"^14.0.0 || ^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@payloadcms/translations":"^3.0.0"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.7.0_1788850728793_0.8069577412919919","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@consilioweb/payload-maintenance","version":"0.8.0","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":"ConsilioWEB <contact@consilioweb.fr> (https://consilioweb.fr)","license":"MIT","_id":"@consilioweb/payload-maintenance@0.8.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"ce06e801fb8d42de81679ce58288e2ec0a939170","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.8.0.tgz","fileCount":19,"integrity":"sha512-ldBDDN7FoHVlPqMbRJJoyz7nz+oZpxI09DQoKAYul27nl4eLj/+xi90g3+ZfrdG3XvCVV+k5MVOt1PGUxeWYUg==","signatures":[{"sig":"MEUCIQDbZV0Y7XhXPltk7PfqA6d16WJuX+6UgJxUtJMjoFI9MAIgZlRxRAknRbxy2XJOLK/GRJlvmmZ9i108RdWd0iC7GwA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-maintenance@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":553215},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"next":"^15.5.25","tsup":"^8.5.1","vitest":"^4.1.11","payload":"^3.88.0","typescript":"^5.9.3","@types/react":"^19.2.18","@payloadcms/ui":"^3.88.0","@payloadcms/translations":"^3.88.0"},"peerDependencies":{"next":"^15.0.0 || ^16.0.0","react":"^19.0.0","payload":"^3.79.1","react-dom":"^19.0.0","@payloadcms/ui":"^3.79.1","@payloadcms/next":"^3.79.1","@payloadcms/translations":"^3.79.1"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.8.0_1788855985107_0.1515992938986046","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@consilioweb/payload-maintenance","version":"0.9.0","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"author":"ConsilioWEB <contact@consilioweb.fr> (https://consilioweb.fr)","license":"MIT","_id":"@consilioweb/payload-maintenance@0.9.0","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"bin":{"maintenance-uninstall":"./scripts/uninstall.mjs"},"dist":{"shasum":"6a0d5caa5083297958c56b061e0732e0a61fed83","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.9.0.tgz","fileCount":22,"integrity":"sha512-bbNR/ukTmw3dFGCabsanCaSAG60yon17ZSsFD100nrGu0ura8ogbPahfKqB1w6xXGr42D8BXvewLKNPc+xqzZA==","signatures":[{"sig":"MEUCIQCFSb6d/q2IKBCVwy7eoyT1hNNCD7tIGrZQ6XD+b581ygIgNnEtxzi1Xf0QSdjHW+DbIKcxkEoGxWdwil5psus+zs0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-maintenance@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":630590},"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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"next":"^15.5.25","tsup":"^8.5.1","vitest":"^4.1.11","payload":"^3.88.0","typescript":"^5.9.3","@types/react":"^19.2.18","@payloadcms/ui":"^3.88.0","@payloadcms/translations":"^3.88.0"},"peerDependencies":{"next":"^15.0.0 || ^16.0.0","react":"^19.0.0","payload":"^3.79.1","react-dom":"^19.0.0","@payloadcms/ui":"^3.79.1","@payloadcms/next":"^3.79.1","@payloadcms/translations":"^3.79.1"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-maintenance_0.9.0_1788862540860_0.04619142980827706","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"_id":"@consilioweb/payload-maintenance@0.9.1","bin":{"maintenance-uninstall":"./scripts/uninstall.mjs"},"bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"dist":{"shasum":"73b7ace782debbc585f967f564b160306db0b532","tarball":"https://registry.npmjs.org/@consilioweb/payload-maintenance/-/payload-maintenance-0.9.1.tgz","fileCount":23,"integrity":"sha512-JFV1nogSYAZlPcxSosfeiVpuMD7xIqm4mBw0oxoks5iYDpG3QabDO3irI54xIpOQkdThjTg2ZIwemV+mBV10wg==","signatures":[{"sig":"MEUCIQD7SkevuZiS4D3OkyE1nMeXlnkvZ+WCVSyggmKjS1PjCwIgJKLsPAZSe3DCf8kxjGvkwTHR7cu8SxTvdwcbAsDGaak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAGBiwW3MYh8tlJ4RlM5Bp7XUo6KJm5jarr1T/uIWLQoAiEA2eZAV4cU6U07KZsc5wo4Wx4W7Q9hASQqc8lO0lDbuxo="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@consilioweb%2fpayload-maintenance@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":634140},"main":"./dist/index.cjs","name":"@consilioweb/payload-maintenance","type":"module","types":"./dist/index.d.ts","author":"ConsilioWEB <contact@consilioweb.fr> (https://consilioweb.fr)","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"}},"./middleware":{"import":{"types":"./dist/middleware.d.ts","default":"./dist/middleware.js"},"require":{"types":"./dist/middleware.d.cts","default":"./dist/middleware.cjs"}}},"license":"MIT","scripts":{"test":"vitest run","build":"tsup && node scripts/verify-dist-imports.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"version":"0.9.1","_npmUser":{"name":"pown3d","email":"contact@consilioweb.fr"},"homepage":"https://github.com/pOwn3d/payload-maintenance#readme","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"description":"Payload CMS plugin — customizable maintenance mode page with i18n support","directories":{},"maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"next":"^15.5.25","tsup":"^8.5.1","vitest":"^4.1.11","payload":"^3.88.0","typescript":"^5.9.3","@types/react":"^19.2.18","@payloadcms/ui":"^3.88.0","@payloadcms/translations":"^3.88.0"},"peerDependencies":{"next":"^15.0.0 || ^16.0.0","react":"^19.0.0","payload":"^3.79.1","react-dom":"^19.0.0","@payloadcms/ui":"^3.79.1","@payloadcms/next":"^3.79.1","@payloadcms/translations":"^3.79.1"},"peerDependenciesMeta":{"next":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@payloadcms/translations":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/payload-maintenance_0.9.1_1790694154656_0.09676324600808095"}}},"time":{"created":"2026-03-07T13:02:39.055Z","modified":"2026-09-29T15:02:35.394Z","0.1.0":"2026-03-07T13:02:39.319Z","0.2.0":"2026-03-12T07:36:07.602Z","0.3.0":"2026-03-12T09:08:51.245Z","0.3.1":"2026-03-12T14:20:12.761Z","0.4.0":"2026-03-12T16:45:32.924Z","0.5.0":"2026-04-08T13:18:07.020Z","0.5.1":"2026-04-08T13:37:46.725Z","0.5.2":"2026-06-23T07:33:39.916Z","0.6.0":"2026-09-07T13:54:45.185Z","0.7.0":"2026-09-08T06:58:48.931Z","0.8.0":"2026-09-08T08:26:25.285Z","0.9.0":"2026-09-08T10:15:41.018Z","0.9.1":"2026-09-29T15:02:34.765Z"},"bugs":{"url":"https://github.com/pOwn3d/payload-maintenance/issues"},"author":"ConsilioWEB <contact@consilioweb.fr> (https://consilioweb.fr)","license":"MIT","homepage":"https://github.com/pOwn3d/payload-maintenance#readme","keywords":["payload","payload-cms","payload-plugin","maintenance","maintenance-mode","coming-soon","under-construction","i18n","multilingual","nextjs","react","typescript"],"repository":{"url":"git+https://github.com/pOwn3d/payload-maintenance.git","type":"git"},"description":"Payload CMS plugin — customizable maintenance mode page with i18n support","maintainers":[{"name":"pown3d","email":"contact@consilioweb.fr"}],"readme":"# @consilioweb/payload-maintenance\n\n> Maintenance mode for Payload CMS 3 + Next.js: a configurable public page, an admin toggle, scheduling, audit history and webhooks.\n\n[![npm](https://img.shields.io/npm/v/@consilioweb/payload-maintenance.svg)](https://www.npmjs.com/package/@consilioweb/payload-maintenance)\n[![license](https://img.shields.io/npm/l/@consilioweb/payload-maintenance.svg)](LICENSE)\n[![Payload](https://img.shields.io/badge/Payload-3.x-0F172A.svg)](https://payloadcms.com)\n\n## About\n\nTaking a Payload site offline usually means hand-rolling a Next.js middleware, a static page and a way to turn it back on. This plugin ships all three: a maintenance global in the admin panel, a standalone HTML page served by the plugin itself (no route to create), and a middleware helper that returns HTTP 503 with `Retry-After` so crawlers do not de-index the site.\n\nAround that core it adds what an incident actually needs: an audit trail of who took the site down and for how long, Slack/Discord webhooks with retry, a GDPR-compliant newsletter form with unsubscribe, page-view analytics, and scheduled windows.\n\nSince 0.6.0 the plugin is admin-only and fails closed: the configuration global is no longer world-readable, the admin endpoints reject users from non-admin auth collections, and a database outage keeps the site in maintenance instead of silently reopening it.\n\n## Table of Contents\n\n- [Features](#features)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Plugin Options](#plugin-options)\n- [Middleware Options](#middleware-options)\n- [Templates](#templates)\n- [Presets](#presets)\n- [API Endpoints](#api-endpoints)\n- [Collections](#collections)\n- [Bypass Maintenance](#bypass-maintenance)\n- [Package Exports](#package-exports)\n- [Upgrading](#upgrading)\n- [Personal data and retention](#personal-data-and-retention)\n- [Database and updates](#database-and-updates)\n- [Uninstall](#uninstall)\n- [Requirements](#requirements)\n- [Support](#support)\n- [License](#license)\n\n## Features\n\n- **Self-contained maintenance page** — served as standalone HTML by `GET /api/maintenance/page`. No `/maintenance` route to create in your app.\n- **12 page templates** — from `minimal` to canvas-based `particles`, plus a `custom` HTML template with `{{variables}}`.\n- **12 one-click presets** — template + colors + fonts + messages, applied from the admin dashboard.\n- **Multi-language page** — per-language title, description and CTA configured in the admin, with browser-language auto-detection and a switcher. The page chrome (countdown labels, contact and newsletter strings) ships in 10 languages: `fr`, `en`, `de`, `es`, `it`, `pt`, `nl`, `ja`, `ar`, `zh`.\n- **Scheduled maintenance** — start/end dates with auto-enable and auto-disable, driven by `POST /api/maintenance/schedule-check` (wire it to a cron) and re-checked by the middleware.\n- **Audit history** — every activation and deactivation is logged with who triggered it and how long the site was down, plus every webhook that exhausted its retries.\n- **Webhooks** — Slack, Discord or custom JSON, fired on every toggle, with exponential backoff (3 attempts: 1s, 2s, 4s) and a log collection.\n- **Newsletter with GDPR consent** — signup form on the page, `consent: true` required, `consentAt` / `consentSource` stored, unique unsubscribe token, duplicate prevention, admin CSV export.\n- **Page-view analytics, anonymised by default** — path, referer, user agent and a truncated IP (/24 or /48) recorded while maintenance is on, with top-paths and top-referers aggregation. `analyticsIpMode` opts into the full address or into no address at all.\n- **Retention purge** — analytics dropped after 13 months by default, on demand through `DELETE /api/maintenance/analytics/purge` and daily through a Payload Jobs task when your app runs the job system. No `setInterval`, so nothing duplicates behind several instances.\n- **Uninstaller** — `npx maintenance-uninstall` deletes the plugin's documents through the Payload Local API (all three adapters, custom slugs honoured) instead of leaving visitor IPs behind with no UI to erase them.\n- **SEO** — HTTP 503 (configurable), `Retry-After` computed from the estimated end date, `X-Robots-Tag: noindex` and `<meta name=\"robots\" content=\"noindex,nofollow\">`.\n- **Admin dashboard** at `/admin/maintenance` — toggle, live preview, subscriber count with CSV export, history timeline, preset gallery. Plus a toggle widget on the main dashboard and a sidebar nav link.\n- **Design customization** — Google Fonts by name, Lottie animation by URL, dark/light/auto mode, custom CSS and HTML, logo, favicon, background image, background video, split image, social links (8 platforms), contact email.\n\n### Security\n\n- **Admin-only authorization** — the maintenance global and the seven admin endpoints require a user of the Payload admin collection (`config.admin.user`), not merely `req.user`. Override with `adminCollectionSlug`, or plug your own RBAC with `adminAccess`.\n- **The `/admin/maintenance` view is gated too** — Payload deliberately skips its own `canAccessAdmin` redirect for *custom* admin views and delegates the decision to the view, so `/admin/maintenance` enforces it itself: it requires both Payload's `canAccessAdmin` and the same `isMaintenanceAdmin` gate as the endpoints, and redirects to `/admin/unauthorized` otherwise. Without it, a member of any other auth collection of your app (a `customers` account created by public sign-up) reached the admin panel through this route.\n- **Field-level guards** — `webhooks[].url`, `bypassSecret`, `allowedIPs` and `notifyEmail` carry their own `access.read`, so they stay hidden even if a host re-opens the global.\n- **Rate limiting per IP** on the public endpoints: status 60/min, newsletter 5/min, track 30/min, unsubscribe 10/min.\n- **Fail-closed status** — `GET /status` answers `503` instead of a fabricated `{ enabled: false }` when the global cannot be read, and the middleware keeps the last known state when `/status` fails.\n- **Auth cookie validation** — the middleware validates the Payload token against `/api/<usersCollectionSlug>/me` (positive and negative answers cached 15s; transient failures are not cached).\n- **Input validation** — email regex on signup, IANA timezone, schedule cross-field (end after start), custom CSS rejecting `script`/`iframe`, preset ID whitelist, UUID check on unsubscribe.\n- **CSV export hardening** — every cell quoted, and formula-injection prefixes (`=`, `+`, `-`, `@`, tab, CR) neutralised.\n- **`trustProxy` / `trustedProxyHops`** — control whether `x-forwarded-for` / `x-real-ip` is trusted, and which entry of the chain is the real client. The plugin option now reaches every rate-limited endpoint (`/status`, `/newsletter`, `/track`, `/unsubscribe`); the middleware has its own pair, which governs the `allowedIPs` check.\n- **SSRF guard on webhooks** — a webhook URL that resolves to a loopback, RFC1918, CGNAT or link-local address (including its IPv4-mapped IPv6 form, `::ffff:10.0.0.1`) is refused before the request leaves, redirects are never followed, and `allowedWebhookHosts` narrows the destinations further. The target is **re-resolved before every retry**, and **webhook URLs must be `https://`**: the guard resolves the name itself and `fetch` then resolves it again, so a record with a 0s TTL can swap in an internal address between the two. Over TLS the certificate is the pin — an internal service cannot present one valid for the configured hostname — which plaintext `http://` does not offer. `allowedWebhookHosts` remains the only control that does not depend on that reasoning: set it (`['hooks.slack.com', 'discord.com']`) whenever you can.\n- **Signed bypass cookie** — the cookie carries `<expiry>.<HMAC-SHA256>` instead of the string `true`, is only accepted when a `bypassSecret` is configured, and both it and `?bypass=` are compared in constant time.\n- **Throttles keyed by caller, never globally** — wrong `?bypass=` values and unknown auth cookies are counted per resolved client IP (10/min and 30/min). There is deliberately no global bucket and no shared `unknown` bucket: one would let any anonymous visitor exhaust it and lock the operator out of their own bypass. A caller whose IP cannot be resolved is therefore not throttled on these two paths — configure `trustProxy` / `trustedProxyHops`, and use a high-entropy `bypassSecret`.\n- **Auth cache split in two zones** — validated sessions and rejected tokens are capped separately (500 each), so a flood of unknown cookies cannot evict the entries of signed-in admins.\n- **Sandboxed custom HTML** — `customHTML` / `customCSS` are rendered inside an `iframe sandbox=\"\"` (opaque origin, scripting disabled), so a stored payload cannot execute on the site's origin.\n- **Admin-only collections** — the four plugin collections (`subscribers`, `history`, `analytics`, `webhook-logs`) answer `read` / `create` / `update` / `delete` only for the admin collection (or your `adminAccess`), never for any authenticated user of another auth collection.\n- **Segment-boundary path matching** — `excludedPaths: ['/admin']` no longer leaves `/administration-des-ventes` online.\n- **Isolated admin components** — the sidebar nav link (rendered on *every* admin page) and the dashboard toggle each sit behind their own error boundary with a silent fallback, so an exception in a maintenance widget cannot take down the whole Payload panel. The `/admin/maintenance` view has one too, with a visible fallback and a retry that actually remounts the subtree.\n\n## Installation\n\n```bash\npnpm add @consilioweb/payload-maintenance\n```\n\nOr with npm / yarn:\n\n```bash\nnpm install @consilioweb/payload-maintenance\nyarn add @consilioweb/payload-maintenance\n```\n\n### Peer Dependencies\n\n| Package | Version | Required |\n|---------|---------|----------|\n| `payload` | `^3.79.1` | **Yes** |\n| `@payloadcms/next` | `^3.79.1` | Optional (admin view) |\n| `@payloadcms/ui` | `^3.79.1` | Optional (admin UI) |\n| `@payloadcms/translations` | `^3.79.1` | Optional (i18n) |\n| `next` | `^15.0.0 \\|\\| ^16.0.0` | Optional (middleware, admin view) |\n| `react` | `^19.0.0` | Optional (client components) |\n| `react-dom` | `^19.0.0` | Optional (client components) |\n\n> [!IMPORTANT]\n> **The Payload floor is `3.79.1`, not `3.0.0`.** Payload below `3.79.1` is vulnerable to a\n> pre-authentication account takeover ([GHSA-hp5w-3hxx-vmwf](https://github.com/payloadcms/payload/security/advisories/GHSA-hp5w-3hxx-vmwf))\n> and to an SQL injection. Nothing in this plugin needs an API newer than Payload 3.0 —\n> the floor is a security floor, and the `@payloadcms/*` packages ship in lockstep with\n> `payload`, so they carry the same one. Payload `>= 3.79.1` in turn requires Next.js 15+\n> and React 19, which the ranges above now state instead of pretending to support\n> Next 14 / React 18.\n\n> [!IMPORTANT]\n> **Next.js 16 + Turbopack — known issue.** With Next.js 16 and Turbopack (the default bundler) you may hit a `createContext is not a function` error during `next build`. This is a Payload CMS issue ([#15429](https://github.com/payloadcms/payload/issues/15429), [#14330](https://github.com/payloadcms/payload/discussions/14330)), not specific to this plugin.\n>\n> Workaround — add this to your admin page (`src/app/(payload)/admin/[[...segments]]/page.tsx`):\n> ```ts\n> export const dynamic = 'force-dynamic'\n> ```\n>\n> And list the plugin in `transpilePackages` in `next.config.ts`:\n> ```ts\n> transpilePackages: ['@consilioweb/payload-maintenance'],\n> ```\n>\n> Next.js 15 works without any workaround.\n\n## Quick Start\n\n### 1. Add the plugin\n\n```ts\n// payload.config.ts\nimport { buildConfig } from 'payload'\nimport { maintenancePlugin } from '@consilioweb/payload-maintenance'\n\nexport default buildConfig({\n  plugins: [\n    maintenancePlugin({\n      languages: [\n        { label: 'Francais', value: 'fr' },\n        { label: 'English', value: 'en' },\n      ],\n    }),\n  ],\n  // ...rest of your config\n})\n```\n\n### 2. Add the middleware\n\n```ts\n// src/middleware.ts\nimport { NextResponse, type NextRequest } from 'next/server'\nimport { createMaintenanceMiddleware } from '@consilioweb/payload-maintenance/middleware'\n\nconst maintenanceMiddleware = createMaintenanceMiddleware()\n\nexport async function middleware(request: NextRequest) {\n  const maintenanceResponse = await maintenanceMiddleware(request)\n  if (maintenanceResponse) return maintenanceResponse\n  return NextResponse.next()\n}\n\nexport const config = {\n  matcher: ['/((?!_next/static|_next/image|favicon.ico|.*\\\\.(?:svg|png|jpg|jpeg|gif|webp|ico)$).*)'],\n}\n```\n\n### 3. Regenerate the importmap\n\n```bash\npnpm generate:importmap\n```\n\nThe plugin then adds:\n\n- a **Maintenance** global (`maintenance`)\n- up to **4 collections** — subscribers, history and analytics follow their `enable*` flags, webhook logs is always added\n- **13 API endpoints**, including the standalone HTML page\n- an admin **dashboard view** at `/admin/maintenance`\n- a **toggle widget** on the main admin dashboard and a **sidebar nav link**\n\n> The maintenance page is self-contained: the plugin serves it via `GET /api/maintenance/page`. You do not need to create a `/maintenance` route in your Next.js app.\n\n## Plugin Options\n\nEverything passed to `maintenancePlugin()`. The deprecated options below still compile and log a warning at boot: they are middleware concerns and the plugin never reads them. They are **not removed in this release** — dropping them would break the build of every consumer that passes one. Planned removal: **v1.0.0, not before 2027-03-08**.\n\nEach was re-examined rather than assumed dead. Four cannot be wired at all without either publishing a secret (`bypassSecret`) or adding an endpoint the middleware would have to call before it decides anything (`allowedIPs`, `bypassCookieName`, `usersCollectionSlug`); one was never implemented and honouring it now would be a new feature, not a fix (`maintenancePageComponent`). `authBypass` was the exception, and it is wired — see its row below.\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `globalSlug` | `string` | `'maintenance'` | Slug of the configuration global |\n| `endpointBasePath` | `string` | `'/maintenance'` | Prefix for every API endpoint |\n| `languages` | `{ label: string; value: string }[]` | `[{ Francais, fr }, { English, en }]` | Languages offered for the maintenance page messages |\n| `excludedPaths` | `string[]` | `['/admin', '/api']` | Paths reported as always accessible by `GET /status`. The Next.js middleware has its own `excludedPaths` and does not read this one — keep both in sync |\n| `addDashboardView` | `boolean` | `true` | Register the admin view at `/admin/maintenance` |\n| `showDashboardToggle` | `boolean` | `true` | Show the toggle widget on the main admin dashboard |\n| `mediaCollectionSlug` | `string` | `'media'` | Collection used for logo, favicon, background and split image uploads |\n| `enableSubscribers` | `boolean` | `true` | Add the newsletter subscribers collection and its endpoints |\n| `subscribersSlug` | `string` | `'maintenance-subscribers'` | Slug of the subscribers collection |\n| `enableHistory` | `boolean` | `true` | Add the history / audit collection |\n| `historySlug` | `string` | `'maintenance-history'` | Slug of the history collection |\n| `enableAnalytics` | `boolean` | `true` | Add the analytics collection and its endpoints |\n| `analyticsSlug` | `string` | `'maintenance-analytics'` | Slug of the analytics collection |\n| `analyticsIpMode` | `'anonymized' \\| 'full' \\| 'none'` | `'anonymized'` | How the visitor's IP is **stored**. `anonymized` truncates IPv4 to /24 and IPv6 to /48; `full` keeps the whole address (you then need your own lawful basis); `none` writes no `ip` field at all. Rate limiting always uses the full address, which never leaves the process |\n| `analyticsRetentionDays` | `number` | `395` | Days of analytics kept by the purge — 13 months, the CNIL ceiling for audience measurement. A value below `1` disables the purge instead of deleting everything |\n| `subscribersRetentionDays` | `number` | `undefined` | Days of subscribers kept by the purge. Off by default: a subscriber row is also the proof of their consent |\n| `webhookLogsSlug` | `string` | `'maintenance-webhook-logs'` | Slug of the webhook logs collection (always added) |\n| `enableScheduling` | `boolean` | `true` | Add scheduled maintenance and the `schedule-check` endpoint |\n| `adminCollectionSlug` | `string` | Payload's admin collection (`config.admin.user`) | Collection whose users may administer maintenance mode: toggle, stats, export, analytics, presets, and read/update the global |\n| `adminAccess` | `({ req }) => boolean \\| Promise<boolean>` | `undefined` | Custom authorization check for the admin endpoints, the global and the `/admin/maintenance` view. Overrides `adminCollectionSlug` — plug your own RBAC here. Note: the admin **view** additionally requires Payload's own `canAccessAdmin`, so granting maintenance to a collection outside `config.admin.user` opens the endpoints, not that page (Payload refuses that account everywhere else in `/admin` anyway) |\n| `trustProxy` | `boolean` | `true` | Trust `x-forwarded-for` / `x-real-ip` when resolving the client IP. Now forwarded to **every** rate-limited endpoint (`/status`, `/newsletter`, `/track`, `/unsubscribe`). Set `false` when not behind a trusted reverse proxy |\n| `trustedProxyHops` | `number` | `1` | How many reverse proxies append to `x-forwarded-for`. The client IP is read as `parts[length - trustedProxyHops]`, because a conforming proxy **appends** the peer address — the first element of the header is whatever the caller sent. Use `2` for CDN + load balancer |\n| `allowedWebhookHosts` | `string[]` | `undefined` | Allow-list of hostnames the webhook sender may contact (sub-domains match). **Recommended** — it is the only SSRF control that does not depend on DNS timing. Private, loopback, link-local and plaintext `http://` targets are refused regardless of this option |\n| ~~`allowedIPs`~~ | `string[]` | `[]` | **Deprecated — no effect.** The IP check runs in the Next.js middleware: pass it to `createMaintenanceMiddleware({ allowedIPs })` |\n| ~~`bypassSecret`~~ | `string` | `undefined` | **Deprecated — no effect.** Pass it to `createMaintenanceMiddleware({ bypassSecret })` |\n| ~~`bypassCookieName`~~ | `string` | `'maintenance-bypass'` | **Deprecated — no effect.** The cookie is set and read by the middleware: `createMaintenanceMiddleware({ bypassCookieName })` |\n| `authBypass` | `boolean` | `true` | Seeds the **default value** of the `authBypass` checkbox on the global, which `/status` publishes and the middleware honours. Was a no-op before; it is now the only one of these middleware-shaped options that could be wired without exposing a secret. `defaultValue` applies to a global that has never been saved, so an existing install keeps its stored value — change it in the admin, or override it for everyone with `createMaintenanceMiddleware({ authBypass: false })` |\n| ~~`usersCollectionSlug`~~ | `string` | `undefined` | **Deprecated — no effect.** It only ever configured the middleware auth bypass: `createMaintenanceMiddleware({ usersCollectionSlug })`. It does **not** drive the admin authorization gate — `adminCollectionSlug` does |\n| ~~`maintenancePageComponent`~~ | `string` | `undefined` | **Deprecated — never implemented.** The page is served by `GET /api/maintenance/page`; override it with the middleware option `maintenancePagePath` |\n\n## Middleware Options\n\nEverything passed to `createMaintenanceMiddleware()`.\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `apiUrl` | `string` | Request origin | Base URL of the Payload API |\n| `excludedPaths` | `string[]` | `['/admin', '/api']` | Never-blocked paths, matched on segment boundaries |\n| `cacheDuration` | `number` | `10` | Status cache, in seconds |\n| `statusEndpoint` | `string` | `'/api/maintenance/status'` | Status endpoint to poll |\n| `maintenancePagePath` | `string` | `'/api/maintenance/page'` | Standalone HTML page endpoint to serve |\n| `return503` | `boolean` | `true` | Answer HTTP 503 instead of 200 |\n| `authBypass` | `boolean` | `true` | Let logged-in admin users through |\n| `authCookieName` | `string` | `'payload-token'` | Payload auth cookie name |\n| `usersCollectionSlug` | `string` | `'users'` | Collection queried to validate the auth cookie — must be the Payload admin collection |\n| `bypassCookieName` | `string` | `'maintenance-bypass'` | Bypass cookie name |\n| `bypassSecret` | `string` | `undefined` | Enables `?bypass=SECRET`, which sets a 24h **signed** cookie (HMAC-SHA256 over the expiry). Without it, no bypass cookie is ever honoured. Compared in constant time; failed attempts are throttled. Server-side only, never exposed by the API |\n| `allowedIPs` | `string[]` | `[]` | IPs that bypass maintenance. Only meaningful behind a proxy that rewrites `x-forwarded-for` — see `trustedProxyHops`. Server-side only, never exposed by the API |\n| `trustProxy` | `boolean` | `true` | Trust `x-forwarded-for` / `x-real-ip` when resolving the client IP for the `allowedIPs` check. Distinct from the plugin option of the same name |\n| `trustedProxyHops` | `number` | `1` | Number of reverse proxies appending to `x-forwarded-for`. The trusted value is the entry the closest proxy added, not the first element of the header |\n| `bypassCookieMaxAge` | `number` | `86400` | Lifetime of the bypass cookie, in seconds. The cookie carries a signed, expiring proof — never a boolean |\n\n## Templates\n\nChosen from the `template` select on the maintenance global. All 12 are rendered by the standalone page endpoint, which is what visitors see.\n\n| Template | Description |\n|----------|-------------|\n| `minimal` | Clean icon + message layout (default) |\n| `countdown` | SVG circular ring countdown |\n| `coming-soon` | Flip card countdown with separators |\n| `glassmorphism` | Frosted glass card with floating orbs |\n| `gradient` | Multi-color animated gradient background |\n| `split-screen` | Content left, image right (responsive) |\n| `video-background` | MP4 video with overlay |\n| `aurora` | Northern lights: animated gradient layers, floating particles, SVG waves |\n| `neon` | Cyberpunk: pulsing neon glow, grid background, scanline, corner brackets |\n| `mesh` | Animated blobs with `mix-blend-mode` and noise texture |\n| `particles` | Canvas particle system with mouse interaction |\n| `custom` | Full custom HTML with `{{variables}}` |\n\n> The exported React `MaintenancePage` component implements the first seven plus `custom`; `aurora`, `neon`, `mesh` and `particles` fall back to its default layout there. Use the served page (`/api/maintenance/page`, which the middleware fetches) for the full set.\n\n## Presets\n\nTemplate + colors + font + messages, applied in one click from the admin dashboard. Listed by `GET /api/maintenance/presets`, applied by `POST /api/maintenance/presets/apply`.\n\n| Preset | Template | Style |\n|--------|----------|-------|\n| `corporate-blue` | countdown | Professional dark blue (Inter) |\n| `startup-launch` | gradient | Purple/pink dynamic (Space Grotesk) |\n| `minimal-elegant` | minimal | Clean dark (DM Sans) |\n| `glass-premium` | glassmorphism | Luxurious purple (Outfit) |\n| `coming-soon-creative` | coming-soon | Teal creative (Sora) |\n| `light-clean` | minimal | Light mode (Plus Jakarta Sans) |\n| `warm-gradient` | gradient | Warm orange tones (Poppins) |\n| `tech-dark` | countdown | Cyan tech (JetBrains Mono) |\n| `aurora-borealis` | aurora | Teal/violet northern lights (Space Grotesk) |\n| `cyberpunk-neon` | neon | Magenta/cyan cyberpunk (Orbitron) |\n| `mesh-modern` | mesh | Indigo/rose modern blobs (Geist) |\n| `particles-cosmic` | particles | Deep space constellation (Inter) |\n\n## API Endpoints\n\nPaths are relative to `endpointBasePath` (default `/maintenance`) under Payload's `/api`. **Admin** means a user of the admin collection — see `adminCollectionSlug` and `adminAccess`; anything else answers `401`.\n\n| Method | Path | Access | Description |\n|--------|------|--------|-------------|\n| `GET` | `/api/maintenance/status` | Public | Public status subset. Answers `503` with `Retry-After: 10` if the global cannot be read |\n| `POST` | `/api/maintenance/toggle` | Admin | Turn maintenance on or off |\n| `POST` | `/api/maintenance/newsletter` | Public | Newsletter signup — requires `{ email, consent: true }` |\n| `GET` | `/api/maintenance/stats` | Admin | Subscriber count and recent history |\n| `GET` | `/api/maintenance/subscribers/export` | Admin | CSV export (only when `enableSubscribers`) |\n| `GET` | `/api/maintenance/unsubscribe` | Public | Unsubscribe by token (only when `enableSubscribers`) |\n| `POST` | `/api/maintenance/track` | Public | Record a page view (only when `enableAnalytics`) |\n| `GET` | `/api/maintenance/analytics` | Admin | Analytics data (only when `enableAnalytics`) |\n| `DELETE` | `/api/maintenance/analytics/purge` | Admin | Run the retention purge now. Always registered, including when analytics are off, because `subscribersRetentionDays` may still be set |\n| `POST` | `/api/maintenance/schedule-check` | Admin | Apply the scheduled window (only when `enableScheduling`) |\n| `GET` | `/api/maintenance/config` | Public | Slugs and base path, used by the admin nav link and dashboard |\n| `GET` | `/api/maintenance/page` | Public | Standalone HTML maintenance page |\n| `GET` | `/api/maintenance/presets` | Public | List the available presets |\n| `POST` | `/api/maintenance/presets/apply` | Admin | Apply a preset to the global |\n\n## Collections\n\n**Admin** below means the same gate as the endpoints: a user of the admin collection (`adminCollectionSlug`, defaulting to `config.admin.user`), or your `adminAccess`. It is *not* \"any authenticated user\" — a member of another auth collection of your app (a `customers` account) is refused, which is what closed the hole where a customer could read the subscriber emails and IPs over `/api/<slug>`.\n\n| Slug | Role | Read | Create | Update | Delete |\n|------|------|------|--------|--------|--------|\n| `maintenance-subscribers` | Newsletter signups | Admin | Admin | Admin | Admin |\n| `maintenance-history` | Audit trail of every toggle | Admin | Admin | Never | Admin |\n| `maintenance-analytics` | Page views during maintenance | Admin | Admin | Never | Admin |\n| `maintenance-webhook-logs` | Webhook delivery attempts | Admin | Admin | Never | Admin |\n\nSubscribers, history and analytics are only added when their `enable*` option is left on; webhook logs is always added. The plugin's own writes go through the Local API and are not subject to these rules — a public signup must call `POST /api/maintenance/newsletter`, which enforces the rate limit, the consent check and email validation.\n\n### `maintenance-subscribers`\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `email` | email (unique) | Subscriber email |\n| `language` | text | Browser language, normalised to `xx` / `xx-XX` or `unknown` |\n| `subscribedAt` | date | Registration date |\n| `ip` | text | IP address |\n| `userAgent` | text | Browser user agent |\n| `consentAt` | date | GDPR consent timestamp |\n| `consentSource` | text | Consent origin (`maintenance-page`) |\n| `unsubscribeToken` | text (unique) | Token for the unsubscribe link |\n\n### `maintenance-history`\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `action` | select | `activated` / `deactivated` / `webhook-failed`. The schema also accepts `scheduled-start`, `scheduled-end` and `config-updated`, which nothing writes today — a scheduled window flips `enabled`, so it is logged as `activated` / `deactivated` |\n| `triggeredBy` | text | User email, or `system` |\n| `timestamp` | date | When it happened |\n| `duration` | text | How long maintenance lasted (on deactivation) |\n| `details` | json | Template and message count |\n\n## Bypass Maintenance\n\n| Method | How |\n|--------|-----|\n| **Bypass cookie** | Visit `?bypass=YOUR_SECRET`, which sets a 24h signed cookie. Requires `createMaintenanceMiddleware({ bypassSecret })` — the admin field alone is **not** read by the middleware. Without a configured secret, no bypass cookie is accepted |\n| **IP whitelist** | Requires `createMaintenanceMiddleware({ allowedIPs })` — the admin field alone is **not** read by the middleware |\n| **Auth bypass** | Logged-in users of the collection given by the middleware's `usersCollectionSlug` see the real site. Enabled by the `authBypass` checkbox on the global and the middleware's `authBypass` option |\n| **Route exclusion** | List routes (`/pricing`, `/legal/*`) in the global's \"Excluded routes\" field |\n| **Path exclusion** | The middleware's `excludedPaths` (default `/admin`, `/api`), matched on segment boundaries |\n\n## Package Exports\n\n| Sub-path | Exposes | Environment |\n|----------|---------|-------------|\n| `.` | Plugin, global, collection factories, endpoint handlers, presets, access helper, types | Server |\n| `./client` | `MaintenancePage`, `MaintenanceToggle`, `MaintenanceViewClient`, `MaintenanceNavLink` | Client (`'use client'`) |\n| `./views` | `MaintenanceView` — the admin view server component | Server (RSC) |\n| `./middleware` | `createMaintenanceMiddleware`, `MaintenanceMiddlewareConfig` | Next.js middleware (edge) |\n\n```ts\n// Server\nimport {\n  maintenancePlugin,\n  createMaintenanceGlobal,\n  createSubscribersCollection,\n  createHistoryCollection,\n  createAnalyticsCollection,\n  createWebhookLogsCollection,\n  createStatusHandler,\n  createToggleHandler,\n  createNewsletterHandler,\n  createSubscribersExportHandler,\n  createStatsHandler,\n  createScheduleCheckHandler,\n  createTrackViewHandler,\n  createAnalyticsHandler,\n  createUnsubscribeHandler,\n  createPresetsListHandler,\n  createApplyPresetHandler,\n  createMaintenancePageHandler,\n  isMaintenanceAdmin,\n  rateLimit,\n  rateLimitResponse,\n  getNowInTimezone, // deprecated — display formatting only\n  presets,\n  getPreset,\n  presetToPayloadData,\n} from '@consilioweb/payload-maintenance'\n\nimport type {\n  MaintenancePluginConfig,\n  MaintenanceMessage,\n  MaintenanceStatus,\n  MaintenanceTemplate,\n  MaintenanceType,\n  ScheduleConfig,\n  SocialLink,\n  WebhookConfig,\n  MaintenancePreset,\n  AdminAccessCheck,\n  AdminAccessOptions,\n} from '@consilioweb/payload-maintenance'\n\n// Client — React components\nimport {\n  MaintenancePage,\n  MaintenanceToggle,\n  MaintenanceViewClient,\n  MaintenanceNavLink,\n} from '@consilioweb/payload-maintenance/client'\n\n// Views — admin server component\nimport { MaintenanceView } from '@consilioweb/payload-maintenance/views'\n\n// Middleware — Next.js helper\nimport { createMaintenanceMiddleware } from '@consilioweb/payload-maintenance/middleware'\nimport type { MaintenanceMiddlewareConfig } from '@consilioweb/payload-maintenance/middleware'\n```\n\n`isMaintenanceAdmin(req, { adminCollectionSlug, adminAccess })` is exported so you can gate endpoints of your own with the same rule the plugin uses.\n\n`getNowInTimezone` is deprecated since 0.6.0 and kept only because it is part of the published API surface. It reparses a wall-clock string as server-local time, so never compare its result against a Payload date field — schedule comparisons use plain UTC instants. Safe for display formatting only.\n\n## Upgrading\n\n### 0.8.x -> 0.9.0\n\n**No schema change. No migration to generate.** The diff against 0.8.0 touches `access`, `hooks`, `validate`, `admin.description` and `defaultValue` — none of which is a column.\n\nWhat changes for you:\n\n- **Visitor IPs in `maintenance-analytics` are now truncated before they are written** (IPv4 to /24, IPv6 to /48). Rows already stored keep their full address: the change applies to new writes only. Set `analyticsIpMode: 'full'` to restore the previous behaviour, and read the \"Personal data and retention\" section below before you do. Rate limiting is unaffected — it always used, and still uses, the full address in memory.\n- **Analytics are purged after 395 days** by `DELETE /api/maintenance/analytics/purge`, and automatically by a Payload Jobs task **only if your config already has a `jobs` key**. Nothing runs on its own otherwise. On a long-lived install this first run may delete a lot: check the count with the endpoint before wiring a schedule, or raise `analyticsRetentionDays`.\n- **`authBypass` stopped being a no-op.** It now seeds the default value of the checkbox on the global. An install whose global has already been saved is unaffected; a fresh install with `authBypass: false` now starts with the checkbox off.\n- **A `maintenance-uninstall` binary ships with the package.** See \"Uninstall\".\n- The newsletter email field gained an `aria-label` and got its focus indicator back on both renderers.\n\n### 0.6.x -> 0.7.0 -> 0.8.0\n\n**No schema change. No migration to generate.** Verified on the diff of `src/collections` and `src/globals` between v0.6.0 and 0.8.0: only `access`, `hooks` and `admin.description` moved.\n\nTwo changes need an action from you.\n\n**1. Webhooks must be `https://`.** An existing `http://` webhook **stops firing**. It is not rejected in the admin panel — the field validation still accepts `http://` on purpose, so that saving the global does not become impossible for an install that already has one — but `fireWebhook` refuses it at send time and records the refusal in `maintenance-webhook-logs` with `status: failed`, `statusCode: 0` and `Refused before sending: ...`.\n\nThe consequence is worth stating plainly: **you will see nothing in the admin, only deliveries that stop.** Check it now:\n\n```\n# Any refused delivery, most recent first\nGET /api/maintenance-webhook-logs?where[status][equals]=failed&sort=-timestamp\n```\n\nThen edit each `http://` URL on the maintenance global to `https://`. While you are there, set `allowedWebhookHosts: ['hooks.slack.com', 'discord.com']` — it is the only SSRF control here that does not depend on DNS timing.\n\n**2. Admin-only authorization.** The global and the six admin endpoints now require a user of the Payload admin collection, not merely `req.user`. If your app has other auth-enabled collections and someone relied on that, point `adminCollectionSlug` at the right collection or plug `adminAccess`.\n\n## Personal data and retention\n\nThe plugin stores personal data in two of its four collections. This section is written to be copied into your record of processing activities; **you** are the controller, the plugin is the tool.\n\n| Collection | Personal data | Written by | Possible lawful basis | Default retention |\n|------------|---------------|-----------|----------------------|-------------------|\n| `maintenance-analytics` | IP (truncated by default), user agent, referer, path | Every visitor of the maintenance page, automatically | Legitimate interest, **only** while the IP is truncated and the retention is bounded (CNIL audience-measurement exemption). With `analyticsIpMode: 'full'`, consent is the realistic basis | **395 days** (13 months) |\n| `maintenance-subscribers` | Email, IP, user agent, `consentAt`, `consentSource` | The visitor, by submitting the newsletter form with `consent: true` | Consent. The IP and user agent are the *proof* of that consent, which is why they are kept | **None by default** — set `subscribersRetentionDays` |\n| `maintenance-history` | The email of the admin who toggled maintenance | The plugin, on each toggle | Legitimate interest (audit trail) | None |\n| `maintenance-webhook-logs` | Delivery URL, status, up to 2000 bytes of the response | The plugin, on each webhook | Legitimate interest (operations) | None |\n\nThree things to know before you ship:\n\n**`enableAnalytics` is ON by default.** Installing the plugin is enough to start collecting. Turn it off with `enableAnalytics: false` if you do not want it; there is no consent banner on the maintenance page, and adding one would not help — a visitor with no alternative screen cannot give a free consent anyway. Truncation is what makes the collection defensible, not a banner.\n\n**The IP is anonymised by default.** `203.0.113.42` is stored as `203.0.113.0`, `2001:db8:85a3:8d3::1` as `2001:db8:85a3::`. `analyticsIpMode: 'full'` turns that off, and it is a real decision, not a tuning knob: a full IP is personal data that identifies a household, the visitor cannot opt out, and you take on the lawful basis, the information duty and the access/erasure requests that come with it. Choose it for abuse investigation, and shorten `analyticsRetentionDays` when you do.\n\n**Nothing purges itself unless you wire it.** `DELETE /api/maintenance/analytics/purge` runs the sweep on demand. If your Payload config has a `jobs` key, the plugin also registers a `maintenance-retention-purge` task scheduled daily at 03:00 — but Payload only runs scheduled tasks when the host has autorun or a cron calling `/api/payload-jobs/run` configured. Check that yours does; otherwise the endpoint is your only mechanism.\n\n```ts\n// Retention tuned for a short maintenance window\nmaintenancePlugin({\n  analyticsIpMode: 'anonymized', // the default\n  analyticsRetentionDays: 90,\n  subscribersRetentionDays: 365, // once the site is back, the list is spent\n})\n```\n\n**Scope.** One Payload instance = one installation. The settings live in a single global; these plugins are not compatible with `@payloadcms/plugin-multi-tenant`, and on a multi-tenant install the maintenance toggle takes **every** tenant offline.\n\n## Database and updates\n\n- This plugin **adds collections and a global to your Payload config**; it does not own your schema. Your app does.\n- Payload does not let a plugin ship migrations: `payload migrate` reads exactly one directory, the host app's (`payload.db.migrationDir`, resolved against your `cwd`). A migration file inside an npm package is never discovered.\n- **In development**, `push` syncs the schema for you — nothing to do after installing.\n- **In production**, run `payload migrate:create` then `payload migrate`. Never `push`: it is skipped as soon as `NODE_ENV=production`, and mixing it with migrations triggers Payload's data-loss warning.\n- Every release of this plugin states in its **Upgrading** section whether it changes the schema. To date, none has since 0.6.0.\n\n## Uninstall\n\n```bash\nnpx maintenance-uninstall            # delete the plugin's documents, remove the package\nnpx maintenance-uninstall --dry-run  # count what would be deleted, change nothing\nnpx maintenance-uninstall --keep-data\nnpx maintenance-uninstall --slugs my-subscribers,my-analytics\n```\n\n**Read this before removing the plugin by hand.** Deleting the dependency and the `maintenancePlugin()` call leaves `maintenance-analytics` in your database — IP addresses, user agents and referers, with no retention — and at the same time removes the only interface able to read or erase them. That is the one thing this script exists to prevent.\n\nWhat it does:\n\n1. Reports every source file referencing the package. It does **not** rewrite them: `maintenancePlugin()` sits inside your `plugins` array with your own options around it, and a regex edit there is how a `payload.config.ts` gets silently corrupted. Remove the call yourself.\n2. Deletes the documents of the four collections through the **Payload Local API** (`payload run`), so it works on SQLite, PostgreSQL and MongoDB and honours your custom slugs. A destructive step only runs when the plugin is actually detected here — a source reference or the dependency in `package.json` — or with `--force-data`.\n3. Removes the package and regenerates the import map.\n\nWhat it deliberately does **not** do: drop tables. Payload owns the schema, and a plugin dropping tables from under it is how a database drifts from the migration ledger. The script prints the statements for your adapter; run one, then `payload migrate:create` so your migrations match the new config.\n\n```sql\n-- SQLite / PostgreSQL, default slugs\nDROP TABLE IF EXISTS maintenance_subscribers;\nDROP TABLE IF EXISTS maintenance_history;\nDROP TABLE IF EXISTS maintenance_analytics;\nDROP TABLE IF EXISTS maintenance_webhook_logs;\nDROP TABLE IF EXISTS maintenance;   -- the global\n```\n\n```js\n// MongoDB\ndb.maintenance_subscribers.drop(); db.maintenance_history.drop();\ndb.maintenance_analytics.drop(); db.maintenance_webhook_logs.drop(); db.maintenance.drop();\n```\n\nThe `<slug>_id` columns Payload adds to `payload_locked_documents_rels` for each collection stay behind. Payload ignores them, and SQLite cannot drop a column anyway.\n\n## Requirements\n\n| Requirement | Version |\n|-------------|---------|\n| Node.js | `>=18` |\n| Payload CMS | `^3.79.1` (security floor — see [Peer Dependencies](#peer-dependencies)) |\n| Next.js | `^15.0.0 \\|\\| ^16.0.0` |\n| React / React DOM | `^19.0.0` |\n| Database | any Payload-supported adapter (SQLite, PostgreSQL, MongoDB) |\n\n## Support\n\n- Issues and feature requests: [github.com/pOwn3d/payload-maintenance/issues](https://github.com/pOwn3d/payload-maintenance/issues)\n- Changelog: [CHANGELOG.md](CHANGELOG.md)\n- If this plugin saves you time: [buy me a coffee](https://buymeacoffee.com/pown3d)\n\nMade by [ConsilioWEB](https://consilioweb.fr/services/developpement-web/payload-cms).\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":""}