{"_id":"@trieb.work/payload-plugin-backup-mongodb","_rev":"7-29afceedc8f1045b601453908a4b863a","name":"@trieb.work/payload-plugin-backup-mongodb","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.1":{"name":"@trieb.work/payload-plugin-backup-mongodb","version":"0.1.1","license":"MIT","_id":"@trieb.work/payload-plugin-backup-mongodb@0.1.1","maintainers":[{"name":"jannikz","email":"jannik@trieb.work"},{"name":"tilman_trieb.work","email":"tilman@trieb.work"}],"homepage":"https://github.com/trieb-work/payload-plugin-backup-mongodb#readme","bugs":{"url":"https://github.com/trieb-work/payload-plugin-backup-mongodb/issues"},"dist":{"shasum":"6b5a4e48a8b8dc229e94d321c004efe549da2c46","tarball":"https://registry.npmjs.org/@trieb.work/payload-plugin-backup-mongodb/-/payload-plugin-backup-mongodb-0.1.1.tgz","fileCount":165,"integrity":"sha512-vLalBpGCx8j1Eo7LWMF/iPF0n6unBOnl2xXpl0Jhe7RrDwDKjgESt4o70pWkU6+q8fQD4SlOBAagFZOSsTLSpA==","signatures":[{"sig":"MEYCIQDhWFFY3VtRTYrJZTLj2fqr4EHptzxXmsAOekq0SxzJtwIhAJmXBC4RuQnXILODWrQQx8jo5ZI697yERomF8J/oQ7J1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":799573},"main":"./dist/index.js","type":"module","_from":"file:trieb.work-payload-plugin-backup-mongodb-0.1.1.tgz","types":"./dist/index.d.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./styles.css":"./dist/backup-dashboard.css"},"scripts":{"dev":"node ./scripts/dev.mjs","lint":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\"","test":"pnpm test:int && pnpm test:e2e","build":"pnpm copyfiles && pnpm build:css && pnpm build:embed-css && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","predev":"pnpm build:css && pnpm build:embed-css","release":"pnpm run build && changeset publish","dev:next":"next dev dev --webpack","lint:fix":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" --fix","test:e2e":"cross-env NODE_OPTIONS=--no-deprecation playwright test","test:int":"vitest run","build:css":"sass src/components/BackupDashboard/index.scss dist/backup-dashboard.css --no-source-map --pkg-importer=node --quiet-deps --silence-deprecation=import","build:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next build dev --webpack","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","changeset":"changeset","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","dev:turbo":"node ./scripts/dev.mjs --turbo","start:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next start dev -p 3000","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.build.json","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","test:int:cov":"vitest run --coverage","dev:watch-css":"node ./scripts/watch-backup-css.mjs","generate:types":"pnpm dev:generate-types","test:int:watch":"vitest","build:embed-css":"node ./scripts/embed-backup-css.mjs","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","playwright:install":"playwright install chromium","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"tilman_trieb.work","email":"tilman@trieb.work"},"registry":"https://registry.npmjs.org/","_resolved":"/private/var/folders/7d/f7728pr56k34t87h7d4fpkyh0000gn/T/e910c6997719626c3d22c7607a13d3ee/trieb.work-payload-plugin-backup-mongodb-0.1.1.tgz","_integrity":"sha512-vLalBpGCx8j1Eo7LWMF/iPF0n6unBOnl2xXpl0Jhe7RrDwDKjgESt4o70pWkU6+q8fQD4SlOBAagFZOSsTLSpA==","repository":{"url":"git+https://github.com/trieb-work/payload-plugin-backup-mongodb.git","type":"git"},"_npmVersion":"11.5.1","description":"Payload CMS plugin for MongoDB backup and recovery via Vercel Blob Storage","directories":{},"lint-staged":{"*.{ts,tsx}":["eslint --fix --no-warn-ignored","prettier --write"],"package.json":["sort-package-json"],"*.{js,mjs,cjs,jsx,json,md,css,scss,yml,yaml}":["prettier --write --ignore-unknown"]},"_nodeVersion":"24.6.0","dependencies":{"bson":"^6.10.0","cronstrue":"^3.14.0","tar-stream":"^3.1.7","@vercel/blob":"^2.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.3","open":"^10.1.0","sass":"^1.85.0","husky":"^9.1.7","react":"19.2.4","sharp":"0.34.2","dotenv":"^16.4.7","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","vitest":"4.1.5","graphql":"^16.8.1","payload":"3.82.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.4","typescript":"5.7.3","@types/node":"22.19.9","lint-staged":"^16.4.0","@types/react":"19.2.14","@payloadcms/ui":"3.82.1","@changesets/cli":"^2.29.8","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.82.1","@playwright/test":"1.58.2","@types/react-dom":"19.2.3","@types/tar-stream":"^3.1.4","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","eslint-config-next":"16.2.3","@vitest/coverage-v8":"^4.1.5","vite-tsconfig-paths":"6.0.5","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.82.1","@payloadcms/translations":"3.82.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/richtext-lexical":"3.82.1"},"peerDependencies":{"next":"^15.0.0","react":"^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/db-mongodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-backup-mongodb_0.1.1_1777035107358_0.6436697290234392","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@trieb.work/payload-plugin-backup-mongodb","version":"0.1.2","license":"MIT","_id":"@trieb.work/payload-plugin-backup-mongodb@0.1.2","maintainers":[{"name":"jannikz","email":"jannik@trieb.work"},{"name":"tilman_trieb.work","email":"tilman@trieb.work"}],"homepage":"https://github.com/trieb-work/payload-plugin-backup-mongodb#readme","bugs":{"url":"https://github.com/trieb-work/payload-plugin-backup-mongodb/issues"},"dist":{"shasum":"02c92dcdd68b3788b144434db5c41be4db3a72d8","tarball":"https://registry.npmjs.org/@trieb.work/payload-plugin-backup-mongodb/-/payload-plugin-backup-mongodb-0.1.2.tgz","fileCount":165,"integrity":"sha512-P/VljwydGvhBU5BtbXizasZN2nLQ9dzdXFocjWtxB5zY3XE/Qd0sWMAA348p3Da+tbj/QNnGbuGfa4mYzEAY+A==","signatures":[{"sig":"MEUCICxfyGrLyNonnvlN3s8F4KXpd66in7edGBa1euTk8k82AiEA3kwBHIWDFK5FyEi7mz5VLtEwy5CC0I4eAPTC+2J6Gx4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@trieb.work%2fpayload-plugin-backup-mongodb@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":799573},"main":"./dist/index.js","type":"module","_from":"file:trieb.work-payload-plugin-backup-mongodb-0.1.2.tgz","types":"./dist/index.d.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./styles.css":"./dist/backup-dashboard.css"},"scripts":{"dev":"node ./scripts/dev.mjs","lint":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\"","test":"pnpm test:int && pnpm test:e2e","build":"pnpm copyfiles && pnpm build:css && pnpm build:embed-css && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","predev":"pnpm build:css && pnpm build:embed-css","release":"pnpm run build && changeset publish","dev:next":"next dev dev --webpack","lint:fix":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" --fix","test:e2e":"cross-env NODE_OPTIONS=--no-deprecation playwright test","test:int":"vitest run","build:css":"sass src/components/BackupDashboard/index.scss dist/backup-dashboard.css --no-source-map --pkg-importer=node --quiet-deps --silence-deprecation=import","build:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next build dev --webpack","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","changeset":"changeset","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","dev:turbo":"node ./scripts/dev.mjs --turbo","start:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next start dev -p 3000","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.build.json","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","test:int:cov":"vitest run --coverage","dev:watch-css":"node ./scripts/watch-backup-css.mjs","generate:types":"pnpm dev:generate-types","test:int:watch":"vitest","build:embed-css":"node ./scripts/embed-backup-css.mjs","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","playwright:install":"playwright install chromium","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"tilman_trieb.work","email":"tilman@trieb.work"},"registry":"https://registry.npmjs.org/","_resolved":"/tmp/96e889c7495fb9eacf43b619dd3fc41a/trieb.work-payload-plugin-backup-mongodb-0.1.2.tgz","_integrity":"sha512-P/VljwydGvhBU5BtbXizasZN2nLQ9dzdXFocjWtxB5zY3XE/Qd0sWMAA348p3Da+tbj/QNnGbuGfa4mYzEAY+A==","repository":{"url":"git+https://github.com/trieb-work/payload-plugin-backup-mongodb.git","type":"git"},"_npmVersion":"11.11.0","description":"Payload CMS plugin for MongoDB backup and recovery via Vercel Blob Storage","directories":{},"lint-staged":{"*.{ts,tsx}":["eslint --fix --no-warn-ignored","prettier --write"],"package.json":["sort-package-json"],"*.{js,mjs,cjs,jsx,json,md,css,scss,yml,yaml}":["prettier --write --ignore-unknown"]},"_nodeVersion":"24.14.1","dependencies":{"bson":"^6.10.0","cronstrue":"^3.14.0","tar-stream":"^3.1.7","@vercel/blob":"^2.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.3","open":"^10.1.0","sass":"^1.85.0","husky":"^9.1.7","react":"19.2.4","sharp":"0.34.2","dotenv":"^16.4.7","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","vitest":"4.1.5","graphql":"^16.8.1","payload":"3.82.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.4","typescript":"5.7.3","@types/node":"22.19.9","lint-staged":"^16.4.0","@types/react":"19.2.14","@payloadcms/ui":"3.82.1","@changesets/cli":"^2.29.8","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.82.1","@playwright/test":"1.58.2","@types/react-dom":"19.2.3","@types/tar-stream":"^3.1.4","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","eslint-config-next":"16.2.3","@vitest/coverage-v8":"^4.1.5","vite-tsconfig-paths":"6.0.5","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.82.1","@payloadcms/translations":"3.82.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/richtext-lexical":"3.82.1"},"peerDependencies":{"next":"^15.0.0","react":"^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/db-mongodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-backup-mongodb_0.1.2_1777036012207_0.17350425742266373","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@trieb.work/payload-plugin-backup-mongodb","version":"0.1.3","license":"MIT","_id":"@trieb.work/payload-plugin-backup-mongodb@0.1.3","maintainers":[{"name":"jannikz","email":"jannik@trieb.work"},{"name":"tilman_trieb.work","email":"tilman@trieb.work"}],"homepage":"https://github.com/trieb-work/payload-plugin-backup-mongodb#readme","bugs":{"url":"https://github.com/trieb-work/payload-plugin-backup-mongodb/issues"},"dist":{"shasum":"d6a16a329c1fc450ebebed94287255638874b3bd","tarball":"https://registry.npmjs.org/@trieb.work/payload-plugin-backup-mongodb/-/payload-plugin-backup-mongodb-0.1.3.tgz","fileCount":165,"integrity":"sha512-AjCH1QPsJQuCeUnEIfgFCWvzE5i9tQehkSfcg9orUhdiqqw2I1O2+zTZEfUru5eyfG9rrpv+6IpIekfOV/6CNQ==","signatures":[{"sig":"MEUCIQC4l+WaA0rMgcFhN3R0elCsNm8eqP1VrMvWMZBjrA0hVAIgfbddmEYooGm2gH68Vg/r5DRAKxzPlSUSZV39x30/cVQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@trieb.work%2fpayload-plugin-backup-mongodb@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":801996},"main":"./dist/index.js","type":"module","_from":"file:trieb.work-payload-plugin-backup-mongodb-0.1.3.tgz","types":"./dist/index.d.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./styles.css":"./dist/backup-dashboard.css"},"scripts":{"dev":"node ./scripts/dev.mjs","lint":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\"","test":"pnpm test:int && pnpm test:e2e","build":"pnpm copyfiles && pnpm build:css && pnpm build:embed-css && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","predev":"pnpm build:css && pnpm build:embed-css","release":"pnpm run build && changeset publish","dev:next":"next dev dev --webpack","lint:fix":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" --fix","test:e2e":"cross-env NODE_OPTIONS=--no-deprecation playwright test","test:int":"vitest run","build:css":"sass src/components/BackupDashboard/index.scss dist/backup-dashboard.css --no-source-map --pkg-importer=node --quiet-deps --silence-deprecation=import","build:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next build dev --webpack","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","changeset":"changeset","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","dev:turbo":"node ./scripts/dev.mjs --turbo","start:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next start dev -p 3000","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.build.json","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","test:int:cov":"vitest run --coverage","dev:watch-css":"node ./scripts/watch-backup-css.mjs","generate:types":"pnpm dev:generate-types","test:int:watch":"vitest","build:embed-css":"node ./scripts/embed-backup-css.mjs","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","playwright:install":"playwright install chromium","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"tilman_trieb.work","email":"tilman@trieb.work"},"registry":"https://registry.npmjs.org/","_resolved":"/tmp/1d3a84e8086a9821fb94f35ec6b53c96/trieb.work-payload-plugin-backup-mongodb-0.1.3.tgz","_integrity":"sha512-AjCH1QPsJQuCeUnEIfgFCWvzE5i9tQehkSfcg9orUhdiqqw2I1O2+zTZEfUru5eyfG9rrpv+6IpIekfOV/6CNQ==","repository":{"url":"git+https://github.com/trieb-work/payload-plugin-backup-mongodb.git","type":"git"},"_npmVersion":"11.11.0","description":"Payload CMS plugin for MongoDB backup and recovery via Vercel Blob Storage","directories":{},"lint-staged":{"*.{ts,tsx}":["eslint --fix --no-warn-ignored","prettier --write"],"package.json":["sort-package-json"],"*.{js,mjs,cjs,jsx,json,md,css,scss,yml,yaml}":["prettier --write --ignore-unknown"]},"_nodeVersion":"24.14.1","dependencies":{"bson":"^6.10.0","cronstrue":"^3.14.0","tar-stream":"^3.1.7","@vercel/blob":"^2.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.3","open":"^10.1.0","sass":"^1.85.0","husky":"^9.1.7","react":"19.2.4","sharp":"0.34.2","dotenv":"^16.4.7","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","vitest":"4.1.5","graphql":"^16.8.1","payload":"3.82.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.4","typescript":"5.7.3","@types/node":"22.19.9","lint-staged":"^16.4.0","@types/react":"19.2.14","@payloadcms/ui":"3.82.1","@changesets/cli":"^2.29.8","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.82.1","@playwright/test":"1.58.2","@types/react-dom":"19.2.3","@types/tar-stream":"^3.1.4","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","eslint-config-next":"16.2.3","@vitest/coverage-v8":"^4.1.5","vite-tsconfig-paths":"6.0.5","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.82.1","@payloadcms/translations":"3.82.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/richtext-lexical":"3.82.1"},"peerDependencies":{"next":"^15.0.0","react":"^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/db-mongodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-backup-mongodb_0.1.3_1777039476942_0.01849411960895586","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@trieb.work/payload-plugin-backup-mongodb","version":"0.1.4","license":"MIT","_id":"@trieb.work/payload-plugin-backup-mongodb@0.1.4","maintainers":[{"name":"jannikz","email":"jannik@trieb.work"},{"name":"tilman_trieb.work","email":"tilman@trieb.work"}],"homepage":"https://trwk.de/case-studies/payload-plugin-mongodb-backup-restore","bugs":{"url":"https://github.com/trieb-work/payload-plugin-backup-mongodb/issues"},"dist":{"shasum":"1140e84d490789abbec25032953f8ac79eff6d38","tarball":"https://registry.npmjs.org/@trieb.work/payload-plugin-backup-mongodb/-/payload-plugin-backup-mongodb-0.1.4.tgz","fileCount":165,"integrity":"sha512-0+FhULySIc5GBl//S0T7lFlb9xKpTiIWUuaaS5OjChgfU4zAY3fd4NWBdYb58vyt5EKs9aH12WA4a9Z1zKmzgA==","signatures":[{"sig":"MEQCIBeANBcKBpP0m9PxFYmZXkbu+yHsdkWrT3NkZbCiOyrVAiA2UQpgp6YNc7Mb4BtfsFuldki/exYEouDoGHV8cNyPjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@trieb.work%2fpayload-plugin-backup-mongodb@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":802454},"main":"./dist/index.js","type":"module","_from":"file:trieb.work-payload-plugin-backup-mongodb-0.1.4.tgz","types":"./dist/index.d.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./styles.css":"./dist/backup-dashboard.css"},"scripts":{"dev":"node ./scripts/dev.mjs","lint":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\"","test":"pnpm test:int && pnpm test:e2e","build":"pnpm copyfiles && pnpm build:css && pnpm build:embed-css && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","predev":"pnpm build:css && pnpm build:embed-css","release":"pnpm run build && changeset publish","dev:next":"next dev dev --webpack","lint:fix":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" --fix","test:e2e":"cross-env NODE_OPTIONS=--no-deprecation playwright test","test:int":"vitest run","build:css":"sass src/components/BackupDashboard/index.scss dist/backup-dashboard.css --no-source-map --pkg-importer=node --quiet-deps --silence-deprecation=import","build:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next build dev --webpack","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","changeset":"changeset","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","dev:turbo":"node ./scripts/dev.mjs --turbo","start:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next start dev -p 3000","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.build.json","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","test:int:cov":"vitest run --coverage","dev:watch-css":"node ./scripts/watch-backup-css.mjs","generate:types":"pnpm dev:generate-types","test:int:watch":"vitest","build:embed-css":"node ./scripts/embed-backup-css.mjs","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","playwright:install":"playwright install chromium","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"tilman_trieb.work","email":"tilman@trieb.work"},"registry":"https://registry.npmjs.org/","_resolved":"/tmp/91b4d801b7d446886aa5ed173c3de12a/trieb.work-payload-plugin-backup-mongodb-0.1.4.tgz","_integrity":"sha512-0+FhULySIc5GBl//S0T7lFlb9xKpTiIWUuaaS5OjChgfU4zAY3fd4NWBdYb58vyt5EKs9aH12WA4a9Z1zKmzgA==","repository":{"url":"git+https://github.com/trieb-work/payload-plugin-backup-mongodb.git","type":"git"},"_npmVersion":"11.11.0","description":"Payload CMS plugin for MongoDB backup and recovery via Vercel Blob Storage","directories":{},"lint-staged":{"*.{ts,tsx}":["eslint --fix --no-warn-ignored","prettier --write"],"package.json":["sort-package-json"],"*.{js,mjs,cjs,jsx,json,md,css,scss,yml,yaml}":["prettier --write --ignore-unknown"]},"_nodeVersion":"24.14.1","dependencies":{"bson":"^6.10.0","cronstrue":"^3.14.0","tar-stream":"^3.1.7","@vercel/blob":"^2.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.3","open":"^10.1.0","sass":"^1.85.0","husky":"^9.1.7","react":"19.2.4","sharp":"0.34.2","dotenv":"^16.4.7","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","vitest":"4.1.5","graphql":"^16.8.1","payload":"3.82.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.4","typescript":"5.7.3","@types/node":"22.19.9","lint-staged":"^16.4.0","@types/react":"19.2.14","@payloadcms/ui":"3.82.1","@changesets/cli":"^2.29.8","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.82.1","@playwright/test":"1.58.2","@types/react-dom":"19.2.3","@types/tar-stream":"^3.1.4","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","eslint-config-next":"16.2.3","@vitest/coverage-v8":"^4.1.5","vite-tsconfig-paths":"6.0.5","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.82.1","@payloadcms/translations":"3.82.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/richtext-lexical":"3.82.1"},"peerDependencies":{"next":"^15.0.0","react":"^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/db-mongodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-backup-mongodb_0.1.4_1777468358580_0.7778310339783254","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@trieb.work/payload-plugin-backup-mongodb","version":"0.1.5","keywords":["payload","payloadcms","payload-cms","payload-plugin","payloadcms-plugin","payload-backup","payload-restore","mongodb","mongoose","backup","restore","recovery","database-backup","cms-backup","vercel","vercel-blob","cron","scheduled-backups","admin-dashboard","nextjs","react","typescript","payblocks"],"license":"MIT","_id":"@trieb.work/payload-plugin-backup-mongodb@0.1.5","maintainers":[{"name":"jannikz","email":"jannik@trieb.work"},{"name":"tilman_trieb.work","email":"tilman@trieb.work"}],"homepage":"https://trwk.de/case-studies/payload-plugin-mongodb-backup-restore","bugs":{"url":"https://github.com/trieb-work/payload-plugin-backup-mongodb/issues"},"dist":{"shasum":"0c3495c2de22d520ebb10ae1759ff2d4bbb3aca0","tarball":"https://registry.npmjs.org/@trieb.work/payload-plugin-backup-mongodb/-/payload-plugin-backup-mongodb-0.1.5.tgz","fileCount":165,"integrity":"sha512-njk7TbWjKU4jzhbByHusO5O9usuM5y+8ONQ39XIz44Nx0ENb/RPoDm8gnEp+sQA5AyCXVRlad3vFiSV4Zq+6Hg==","signatures":[{"sig":"MEYCIQDWO0Mi7QRnsvtPcBvSvU4wEL1VE+JtHY5C2PXW88hp7gIhAJYbvQsQ72PnmrWYXtI4HztVJCwFZ5yaiawI7l3Um0S3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@trieb.work%2fpayload-plugin-backup-mongodb@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":802890},"main":"./dist/index.js","type":"module","_from":"file:trieb.work-payload-plugin-backup-mongodb-0.1.5.tgz","types":"./dist/index.d.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./styles.css":"./dist/backup-dashboard.css"},"scripts":{"dev":"node ./scripts/dev.mjs","lint":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\"","test":"pnpm test:int && pnpm test:e2e","build":"pnpm copyfiles && pnpm build:css && pnpm build:embed-css && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","predev":"pnpm build:css && pnpm build:embed-css","release":"pnpm run build && changeset publish","dev:next":"next dev dev --webpack","lint:fix":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" --fix","test:e2e":"cross-env NODE_OPTIONS=--no-deprecation playwright test","test:int":"vitest run","build:css":"sass src/components/BackupDashboard/index.scss dist/backup-dashboard.css --no-source-map --pkg-importer=node --quiet-deps --silence-deprecation=import","build:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next build dev --webpack","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","changeset":"changeset","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","dev:turbo":"node ./scripts/dev.mjs --turbo","start:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next start dev -p 3000","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.build.json","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","test:int:cov":"vitest run --coverage","dev:watch-css":"node ./scripts/watch-backup-css.mjs","generate:types":"pnpm dev:generate-types","test:int:watch":"vitest","build:embed-css":"node ./scripts/embed-backup-css.mjs","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","playwright:install":"playwright install chromium","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"tilman_trieb.work","email":"tilman@trieb.work"},"registry":"https://registry.npmjs.org/","_resolved":"/tmp/c8e09226cbd8a5d99698d43321838631/trieb.work-payload-plugin-backup-mongodb-0.1.5.tgz","_integrity":"sha512-njk7TbWjKU4jzhbByHusO5O9usuM5y+8ONQ39XIz44Nx0ENb/RPoDm8gnEp+sQA5AyCXVRlad3vFiSV4Zq+6Hg==","repository":{"url":"git+https://github.com/trieb-work/payload-plugin-backup-mongodb.git","type":"git"},"_npmVersion":"11.11.0","description":"Payload CMS plugin for MongoDB backup and recovery via Vercel Blob Storage","directories":{},"lint-staged":{"*.{ts,tsx}":["eslint --fix --no-warn-ignored","prettier --write"],"package.json":["sort-package-json"],"*.{js,mjs,cjs,jsx,json,md,css,scss,yml,yaml}":["prettier --write --ignore-unknown"]},"_nodeVersion":"24.14.1","dependencies":{"bson":"^6.10.0","cronstrue":"^3.14.0","tar-stream":"^3.1.7","@vercel/blob":"^2.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.3","open":"^10.1.0","sass":"^1.85.0","husky":"^9.1.7","react":"19.2.4","sharp":"0.34.2","dotenv":"^16.4.7","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","vitest":"4.1.5","graphql":"^16.8.1","payload":"3.82.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.4","typescript":"5.7.3","@types/node":"22.19.9","lint-staged":"^16.4.0","@types/react":"19.2.14","@payloadcms/ui":"3.82.1","@changesets/cli":"^2.29.8","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.82.1","@playwright/test":"1.58.2","@types/react-dom":"19.2.3","@types/tar-stream":"^3.1.4","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","eslint-config-next":"16.2.3","@vitest/coverage-v8":"^4.1.5","vite-tsconfig-paths":"6.0.5","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.82.1","@payloadcms/translations":"3.82.1","@payloadcms/eslint-config":"3.28.0","@payloadcms/richtext-lexical":"3.82.1"},"peerDependencies":{"next":"^15.0.0","react":"^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/db-mongodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-backup-mongodb_0.1.5_1777469351558_0.9934786990020013","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@trieb.work/payload-plugin-backup-mongodb","version":"0.1.7","keywords":["payload","payloadcms","payload-cms","payload-plugin","payloadcms-plugin","payload-backup","payload-restore","mongodb","mongoose","backup","restore","recovery","database-backup","cms-backup","vercel","vercel-blob","cron","scheduled-backups","admin-dashboard","nextjs","react","typescript","payblocks"],"license":"MIT","_id":"@trieb.work/payload-plugin-backup-mongodb@0.1.7","maintainers":[{"name":"jannikz","email":"jannik@trieb.work"},{"name":"tilman_trieb.work","email":"tilman@trieb.work"}],"homepage":"https://trwk.de/case-studies/payload-plugin-mongodb-backup-restore","bugs":{"url":"https://github.com/trieb-work/payload-plugin-backup-mongodb/issues"},"dist":{"shasum":"9c2ad4d542160897c0beb49efa954025d49594d9","tarball":"https://registry.npmjs.org/@trieb.work/payload-plugin-backup-mongodb/-/payload-plugin-backup-mongodb-0.1.7.tgz","fileCount":165,"integrity":"sha512-ZQTosad6LTZVB0vYLtIJeioYHGsYrjyW+W52FYITI02hh0mGwabuTbQNFjg6oUOAy5U3Swn6nuUQ/DtKMWP8Pw==","signatures":[{"sig":"MEUCIGpkFjCR4PNxb5+QYbcFD/a6hRqcgrfKTyhmMw/pfuCQAiEAo2rlQiEGRfTzQjxXfZZvBtn43dBpMe2Od1S2B2bAI+0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@trieb.work%2fpayload-plugin-backup-mongodb@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":803080},"main":"./dist/index.js","type":"module","_from":"file:trieb.work-payload-plugin-backup-mongodb-0.1.7.tgz","types":"./dist/index.d.ts","engines":{"node":"^18.20.2 || >=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./styles.css":"./dist/backup-dashboard.css"},"scripts":{"dev":"node ./scripts/dev.mjs","lint":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\"","test":"pnpm test:int && pnpm test:e2e","build":"pnpm copyfiles && pnpm build:css && pnpm build:embed-css && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","format":"prettier --write . --cache --log-level warn","predev":"pnpm build:css && pnpm build:embed-css","release":"pnpm run build && changeset publish","dev:next":"next dev dev --webpack","lint:fix":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" --fix","test:e2e":"cross-env NODE_OPTIONS=--no-deprecation playwright test","test:int":"vitest run","build:css":"sass src/components/BackupDashboard/index.scss dist/backup-dashboard.css --no-source-map --pkg-importer=node --quiet-deps --silence-deprecation=import","build:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next build dev --webpack","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","changeset":"changeset","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","dev:turbo":"node ./scripts/dev.mjs --turbo","start:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next start dev -p 3000","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.build.json","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","format:check":"prettier --check . --cache --log-level warn","test:int:cov":"vitest run --coverage","dev:watch-css":"node ./scripts/watch-backup-css.mjs","generate:types":"pnpm dev:generate-types","test:int:watch":"vitest","build:embed-css":"node ./scripts/embed-backup-css.mjs","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","playwright:install":"playwright install chromium","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4bb3ad-c50a-4dd3-b199-0eb6e56a8457"}},"registry":"https://registry.npmjs.org/","_resolved":"/tmp/6a1856f30b145feabf8550f92af4a3e9/trieb.work-payload-plugin-backup-mongodb-0.1.7.tgz","_integrity":"sha512-ZQTosad6LTZVB0vYLtIJeioYHGsYrjyW+W52FYITI02hh0mGwabuTbQNFjg6oUOAy5U3Swn6nuUQ/DtKMWP8Pw==","repository":{"url":"git+https://github.com/trieb-work/payload-plugin-backup-mongodb.git","type":"git"},"_npmVersion":"11.11.0","description":"Payload CMS plugin for MongoDB backup and recovery via Vercel Blob Storage","directories":{},"lint-staged":{"*.{ts,tsx}":["eslint --fix --no-warn-ignored","prettier --write"],"package.json":["sort-package-json"],"*.{js,mjs,cjs,jsx,json,md,css,scss,yml,yaml}":["prettier --write --ignore-unknown"]},"_nodeVersion":"24.14.1","dependencies":{"bson":"^6.10.0","cronstrue":"^3.14.0","tar-stream":"^3.1.7","@vercel/blob":"^2.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.3","open":"^10.1.0","sass":"^1.85.0","husky":"^9.1.7","react":"19.2.4","sharp":"0.34.2","dotenv":"^16.4.7","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","vitest":"4.1.5","graphql":"^16.8.1","payload":"3.82.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.4","typescript":"5.7.3","@types/node":"22.19.9","lint-staged":"^16.4.0","@types/react":"19.2.14","@payloadcms/ui":"3.82.1","@changesets/cli":"^2.29.8","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.82.1","@playwright/test":"1.58.2","@types/react-dom":"19.2.3","@types/tar-stream":"^3.1.4","sort-package-json":"^2.10.0","@swc-node/register":"1.10.9","eslint-config-next":"16.2.3","@vitest/coverage-v8":"^4.1.5","vite-tsconfig-paths":"6.0.5","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.82.1","@payloadcms/translations":"3.82.1","@payloadcms/eslint-config":"3.28.0","prettier-plugin-packagejson":"3.0.2","@payloadcms/richtext-lexical":"3.82.1"},"peerDependencies":{"next":"^15.0.0","react":"^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/db-mongodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/payload-plugin-backup-mongodb_0.1.7_1777898429203_0.5143072246563278","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"_id":"@trieb.work/payload-plugin-backup-mongodb@0.2.0","bugs":{"url":"https://github.com/trieb-work/payload-plugin-backup-mongodb/issues"},"dist":{"shasum":"f5cfea8e917b4ea2b3a710ae0ce3ab52f8ef2caa","tarball":"https://registry.npmjs.org/@trieb.work/payload-plugin-backup-mongodb/-/payload-plugin-backup-mongodb-0.2.0.tgz","fileCount":183,"integrity":"sha512-nKgNV5VQP4watOxNR2Z+RKQXLNGp+iVXDdImnAgsO5r5rJW7g4IIJwuE3plHuZbkFcbr44BvZZrMFnrp5G53Sg==","signatures":[{"sig":"MEYCIQCXe6gawrea5iKyL8FT/nHbG3kr+/OBOPZhyOezthomTQIhAIAExlWDKxma3rN45VzY8SgbKsSXgpep9elTszDuy7Ad","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHZJ+XRyDh3yUx32Lyph9v9G4wqOFvAjq4uvbKe7LvspAiAfrLSHCbJTt8syh3KUeJWbAweDbdKaRjgM/EyYVAjZ1w=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@trieb.work%2fpayload-plugin-backup-mongodb@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":896596},"main":"./dist/index.js","name":"@trieb.work/payload-plugin-backup-mongodb","type":"module","_from":"file:trieb.work-payload-plugin-backup-mongodb-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.9.0","pnpm":"^9 || ^10"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./rsc":{"types":"./dist/exports/rsc.d.ts","import":"./dist/exports/rsc.js","default":"./dist/exports/rsc.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./styles.css":"./dist/backup-dashboard.css"},"license":"MIT","scripts":{"dev":"node ./scripts/dev.mjs","lint":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\"","test":"pnpm test:int && pnpm test:e2e","build":"pnpm copyfiles && pnpm build:css && pnpm build:embed-css && pnpm build:types && pnpm build:swc","clean":"rimraf {dist,*.tsbuildinfo}","format":"prettier --write . --cache --log-level warn","predev":"pnpm build:css && pnpm build:embed-css","release":"pnpm run build && changeset publish","dev:next":"next dev dev --webpack","lint:fix":"eslint \"src/**/*.{ts,tsx}\" \"dev/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" --fix","test:e2e":"cross-env NODE_OPTIONS=--no-deprecation playwright test","test:int":"vitest run","build:css":"sass src/components/BackupDashboard/index.scss dist/backup-dashboard.css --no-source-map --pkg-importer=node --quiet-deps --silence-deprecation=import","build:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next build dev --webpack","build:swc":"swc ./src -d ./dist --config-file .swcrc --strip-leading-paths","changeset":"changeset","copyfiles":"copyfiles -u 1 \"src/**/*.{html,css,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/","dev:turbo":"node ./scripts/dev.mjs --turbo","start:dev":"cross-env NODE_OPTIONS=--no-deprecation PAYLOAD_CONFIG_PATH=./dev/payload.config.ts next start dev -p 3000","typecheck":"tsc --noEmit","build:types":"tsc -p tsconfig.build.json","dev:payload":"cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload","format:check":"prettier --check . --cache --log-level warn","test:int:cov":"vitest run --coverage","dev:watch-css":"node ./scripts/watch-backup-css.mjs","generate:types":"pnpm dev:generate-types","test:int:minio":"vitest run tests/integration/s3MinioLive.test.ts","test:int:watch":"vitest","build:embed-css":"node ./scripts/embed-backup-css.mjs","dev:generate-types":"pnpm dev:payload generate:types","generate:importmap":"pnpm dev:generate-importmap","playwright:install":"playwright install chromium","dev:generate-importmap":"pnpm dev:payload generate:importmap"},"version":"0.2.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2b4bb3ad-c50a-4dd3-b199-0eb6e56a8457"}},"homepage":"https://trwk.de/case-studies/payload-plugin-mongodb-backup-restore","keywords":["payload","payloadcms","payload-cms","payload-plugin","payloadcms-plugin","payload-backup","payload-restore","mongodb","mongoose","backup","restore","recovery","database-backup","cms-backup","vercel","vercel-blob","cron","scheduled-backups","admin-dashboard","nextjs","react","typescript","payblocks"],"registry":"https://registry.npmjs.org/","_resolved":"/tmp/43706b8d22475791cc96a73272e3b2b0/trieb.work-payload-plugin-backup-mongodb-0.2.0.tgz","_integrity":"sha512-nKgNV5VQP4watOxNR2Z+RKQXLNGp+iVXDdImnAgsO5r5rJW7g4IIJwuE3plHuZbkFcbr44BvZZrMFnrp5G53Sg==","repository":{"url":"git+https://github.com/trieb-work/payload-plugin-backup-mongodb.git","type":"git"},"_npmVersion":"11.19.0","description":"Payload CMS plugin for MongoDB backup and recovery via Vercel Blob or AWS S3 (S3-compatible: R2, MinIO)","directories":{},"lint-staged":{"*.{ts,tsx}":["eslint --fix --no-warn-ignored","prettier --write"],"package.json":["sort-package-json"],"*.{js,mjs,cjs,jsx,json,md,css,scss,yml,yaml}":["prettier --write --ignore-unknown"]},"maintainers":[{"name":"jannikz","email":"jannik@trieb.work"},{"name":"tilman_trieb.work","email":"tilman@trieb.work"}],"_nodeVersion":"24.20.0","dependencies":{"bson":"^6.10.0","cronstrue":"^3.14.0","tar-stream":"^3.1.7","@vercel/blob":"^2.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"16.2.3","open":"^10.1.0","sass":"^1.85.0","husky":"^9.1.7","react":"19.2.4","sharp":"0.34.2","dotenv":"^16.4.7","eslint":"^9.23.0","qs-esm":"8.0.1","rimraf":"3.0.2","vitest":"4.1.5","graphql":"^16.8.1","payload":"3.82.1","@swc/cli":"0.6.0","prettier":"^3.4.2","copyfiles":"2.4.1","cross-env":"^7.0.3","react-dom":"19.2.4","typescript":"5.7.3","@types/node":"22.19.9","lint-staged":"^16.4.0","@types/react":"19.2.14","@payloadcms/ui":"3.82.1","@changesets/cli":"^2.29.8","@eslint/eslintrc":"^3.2.0","@payloadcms/next":"3.82.1","@playwright/test":"1.61.0","@types/react-dom":"19.2.3","@types/tar-stream":"^3.1.4","sort-package-json":"^2.10.0","@aws-sdk/client-s3":"^3.700.0","@swc-node/register":"1.10.9","eslint-config-next":"16.2.3","@vitest/coverage-v8":"^4.1.5","vite-tsconfig-paths":"6.0.5","@aws-sdk/lib-storage":"^3.700.0","mongodb-memory-server":"10.1.4","@payloadcms/db-mongodb":"3.82.1","@payloadcms/translations":"3.82.1","@payloadcms/eslint-config":"3.28.0","prettier-plugin-packagejson":"3.0.2","@payloadcms/richtext-lexical":"3.82.1","@aws-sdk/s3-request-presigner":"^3.700.0"},"peerDependencies":{"next":"^15.0.0","react":"^19.0.0","payload":"^3.0.0","@payloadcms/ui":"^3.0.0","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/lib-storage":"^3.0.0","@payloadcms/db-mongodb":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0"},"peerDependenciesMeta":{"@aws-sdk/client-s3":{"optional":true},"@aws-sdk/lib-storage":{"optional":true},"@aws-sdk/s3-request-presigner":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/payload-plugin-backup-mongodb_0.2.0_1789477123185_0.6476175365460366"}}},"time":{"created":"2026-04-24T12:51:47.206Z","modified":"2026-09-15T12:58:43.596Z","0.1.1":"2026-04-24T12:51:47.555Z","0.1.2":"2026-04-24T13:06:52.389Z","0.1.3":"2026-04-24T14:04:37.091Z","0.1.4":"2026-04-29T13:12:38.823Z","0.1.5":"2026-04-29T13:29:11.803Z","0.1.7":"2026-05-04T12:40:29.449Z","0.2.0":"2026-09-15T12:58:43.270Z"},"bugs":{"url":"https://github.com/trieb-work/payload-plugin-backup-mongodb/issues"},"license":"MIT","homepage":"https://trwk.de/case-studies/payload-plugin-mongodb-backup-restore","keywords":["payload","payloadcms","payload-cms","payload-plugin","payloadcms-plugin","payload-backup","payload-restore","mongodb","mongoose","backup","restore","recovery","database-backup","cms-backup","vercel","vercel-blob","cron","scheduled-backups","admin-dashboard","nextjs","react","typescript","payblocks"],"repository":{"url":"git+https://github.com/trieb-work/payload-plugin-backup-mongodb.git","type":"git"},"description":"Payload CMS plugin for MongoDB backup and recovery via Vercel Blob or AWS S3 (S3-compatible: R2, MinIO)","maintainers":[{"name":"jannikz","email":"jannik@trieb.work"},{"name":"tilman_trieb.work","email":"tilman@trieb.work"}],"readme":"> Experimental. Originated in the\n> [Payblocks](https://www.shadcnblocks.com/payload-cms) template, now maintained\n> as a standalone package. Running in production at 20+ projects from TRWK\n> agency. Feedback and PRs welcome.\n\n# @trieb.work/payload-plugin-backup-mongodb\n\n[![npm](https://img.shields.io/npm/v/@trieb.work/payload-plugin-backup-mongodb)](https://www.npmjs.com/package/@trieb.work/payload-plugin-backup-mongodb)\n\nA **Payload CMS v3** plugin for **MongoDB only** — not Postgres, SQLite, or\nother database adapters. It handles Mongo + media backup, restore, and scheduled\nretention with zero meta-database and a built-in admin UI. Backups live in\n**Vercel Blob Storage** (default) or **AWS S3 / S3-compatible stores** (R2,\nMinIO, etc.), so a fresh install can list and restore any prior backup without\nbootstrapping a database first.\n\n![Backup dashboard embedded in the Payload admin panel](./docs/screenshots/dashboard.png)\n\nA first-class **Backups** section lives right below the Payload dashboard:\nbrowse every archive sorted by creation time, see at a glance which host and\ndatabase it belongs to, whether media is bundled and how big it is, then\ndownload, restore or delete any backup with one click. Read more on how it\noriginated at\n[TRWK> Case Study](https://trwk.de/case-studies/payload-plugin-mongodb-backup-restore).\n\n---\n\n## Highlights\n\n- **No meta database.** Every backup is self-describing in its blob name\n  (`type---db---host---{collectionCount}-{timestampMs}.{ext}`). A brand new\n  project can list and restore any backup straight from blob storage.\n- **Scheduled (cron) and on-demand backups.** Wire\n  `/api/backup-mongodb/cron/run` to Vercel Cron or any HTTP scheduler. Retention\n  is configurable (N most recent cron backups are kept; older ones are pruned\n  automatically).\n- **Full database coverage.** Dumps **every** MongoDB collection via the Payload\n  mongoose adapter — including hidden system collections like `users`,\n  `payload-preferences`, `payload-migrations`. Individual collections can be\n  excluded per backup from the UI or via API.\n- **Optional media bundling.** Cron or manual backups can include Payload\n  `media` blobs in a `.tar.gz` archive alongside the MongoDB dump.\n- **Restore with filters.** Restore any backup with an optional collection\n  blacklist and `mergeData` upsert mode. Partial restores keep the running admin\n  session / tasks collection intact.\n- **Native admin dashboard.** Adds a `BackupDashboard` widget to the Payload\n  admin (`afterDashboard`): list / sort / filter / search backups, trigger\n  manual backups or restores, configure retention and storage, and live-poll\n  long-running tasks.\n- **Payload REST, not Next.js route files.** All endpoints are registered as\n  Payload custom endpoints and served by the default `/api/[...slug]` handler —\n  you do not add `app/.../route.ts` files for this plugin.\n- **Pluggable blob storage.** Uses `BLOB_READ_WRITE_TOKEN` by default (the same\n  store you often use with `@payloadcms/storage-vercel-blob`), or point backups\n  at a dedicated Vercel Blob store in the admin. Alternatively set\n  `BACKUP_STORAGE=s3` and use AWS S3, Cloudflare R2, MinIO, etc. Both **public**\n  and **private** access stores are supported; a validation step detects which\n  modes the store accepts.\n- **Resumable long-running tasks.** Manual backups and restores are tracked in a\n  hidden `backup-tasks` collection (TTL, 30 min). The UI polls progress with a\n  short-lived `pollSecret` so long jobs stay observable even across reloads.\n- **Tested.** Vitest covers archive, backup, restore, task progress, blob I/O,\n  endpoint auth, cron parsing, and blob-name helpers.\n\n---\n\n## Requirements\n\n- **Node.js 20.9+** (Node 18 is no longer supported).\n- Payload **v3+** (same major as your other `@payloadcms/*` packages).\n- MongoDB with Payload’s mongoose adapter (`@payloadcms/db-mongodb`).\n- MongoDB server (any version supported by that adapter).\n- A backup target:\n  - **Vercel Blob:** `BLOB_READ_WRITE_TOKEN` (the default target). Vercel\n    hosting is **not** required — any Node runtime that can reach Vercel Blob\n    works.\n  - **S3:** `BACKUP_STORAGE=s3` plus `BACKUP_S3_BUCKET` (and optionally\n    credentials). Requires Node 20+ for the optional AWS SDK peer packages. See\n    [Choosing a backup target](#choosing-a-backup-target-vercel-blob-or-s3).\n- Next.js **15+** and React **19+** (the usual Payload 3 + App Router stack).\n\n### Environment variables\n\n| Variable                       | Required        | Purpose                                                                                                                                                                                                                                                                                                                |\n| ------------------------------ | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `MONGODB_URI`                  | yes             | MongoDB connection string (used by Payload and to label backups with the DB name).                                                                                                                                                                                                                                     |\n| `BACKUP_STORAGE`               | optional        | Backup target: `vercel-blob` (default) or `s3`. See [Choosing a backup target](#choosing-a-backup-target-vercel-blob-or-s3).                                                                                                                                                                                           |\n| `BLOB_READ_WRITE_TOKEN`        | for Vercel Blob | Default Vercel Blob store for backups and media. Required when `BACKUP_STORAGE=vercel-blob` (the default). Can be overridden in admin settings.                                                                                                                                                                        |\n| `CRON_SECRET`                  | for cron        | Bearer token for every `/api/backup-mongodb/cron/*` call. Vercel Cron can supply this.                                                                                                                                                                                                                                 |\n| `NEXT_PUBLIC_SERVER_URL`       | optional        | Used to label backups with the current host. Falls back to `VERCEL_URL` when set.                                                                                                                                                                                                                                      |\n| `BACKUPS_TO_KEEP`              | optional        | Default retention for cron backups if the settings document has not been edited. Default `10`.                                                                                                                                                                                                                         |\n| `PAYLOAD_BACKUP_ALLOWED_ROLES` | optional        | Comma-separated role slugs that may see the **Backups** dashboard (case-insensitive). Use `*` to allow any authenticated user. When unset, the plugin falls back to requiring a `role` with slug `admin`, or allows everyone when the users collection has no `roles` field. Overridden by the `access` plugin option. |\n\n---\n\n## Choosing a backup target (Vercel Blob or S3)\n\nBackups can be stored in **Vercel Blob** (default) or **AWS S3**. The S3 target\nalso works with any S3-compatible store — **Cloudflare R2**, **MinIO**, etc. —\nbecause they share the same API; only the configuration differs, never the\nplugin code.\n\nSelect the target with `BACKUP_STORAGE`. When unset it stays `vercel-blob`, so\nexisting deployments are unaffected.\n\n### Using S3\n\nS3 is enabled when `BACKUP_STORAGE=s3`. Install the AWS SDK (declared as\noptional peer dependencies, so Vercel-only installs don't pull it in):\n\n```bash\npnpm add @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n```\n\n| Variable                      | Required | Purpose                                                                                                               |\n| ----------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------- |\n| `BACKUP_STORAGE`              | yes      | Set to `s3`.                                                                                                          |\n| `BACKUP_S3_BUCKET`            | yes      | Target bucket name.                                                                                                   |\n| `BACKUP_S3_REGION`            | optional | Region. Falls back to `AWS_REGION`, then `us-east-1`.                                                                 |\n| `BACKUP_S3_ENDPOINT`          | optional | Custom endpoint for S3-compatible stores (R2, MinIO). Omit for AWS S3.                                                |\n| `BACKUP_S3_FORCE_PATH_STYLE`  | optional | Path-style addressing. Defaults to `true` when an endpoint is set (needed for MinIO and some R2 setups).              |\n| `BACKUP_S3_PREFIX`            | optional | Key namespace prepended to every object (for sharing a bucket). Backups still list/restore by their `backups/…` name. |\n| `BACKUP_S3_ACCESS_KEY_ID`     | optional | Access key. Falls back to `AWS_ACCESS_KEY_ID`. Omit to use the AWS default credential chain (IAM roles, etc.).        |\n| `BACKUP_S3_SECRET_ACCESS_KEY` | optional | Secret key. Falls back to `AWS_SECRET_ACCESS_KEY`.                                                                    |\n| `BACKUP_S3_SESSION_TOKEN`     | optional | Session token for temporary credentials. Falls back to `AWS_SESSION_TOKEN`.                                           |\n\nCredentials are optional: when omitted, the AWS SDK's default provider chain is\nused (environment, shared config, or instance/role credentials — recommended on\nAWS).\n\n**AWS S3**\n\n```bash\nBACKUP_STORAGE=s3\nBACKUP_S3_BUCKET=my-payload-backups\nBACKUP_S3_REGION=eu-central-1\n# Credentials via IAM role (recommended) or:\n# BACKUP_S3_ACCESS_KEY_ID=...\n# BACKUP_S3_SECRET_ACCESS_KEY=...\n```\n\n**Cloudflare R2**\n\n```bash\nBACKUP_STORAGE=s3\nBACKUP_S3_BUCKET=my-payload-backups\nBACKUP_S3_REGION=auto\nBACKUP_S3_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com\nBACKUP_S3_FORCE_PATH_STYLE=true\nBACKUP_S3_ACCESS_KEY_ID=<r2-access-key-id>\nBACKUP_S3_SECRET_ACCESS_KEY=<r2-secret-access-key>\n```\n\nBackups are stored under the same `backups/…` keys (see\n[Blob naming](#blob-naming)), so listing and restore work identically across\ntargets. Downloads stream through the plugin's authenticated endpoint, so the\nbucket does **not** need to be public.\n\n> **Note on media:** the \"include media\" option bundles files from your Payload\n> **Vercel Blob upload store** (`BLOB_READ_WRITE_TOKEN`). The configurable\n> target above governs where backup **archives** live only; media is always read\n> from and restored to the upload store, even when `BACKUP_STORAGE=s3`.\n\n---\n\n## Installation and getting started\n\nUse this flow when **adding the plugin to an existing Payload 3 + Next.js app**\nthat already has MongoDB and a blob/S3 store configured.\n\n### 1. Add the package\n\n```bash\npnpm add @trieb.work/payload-plugin-backup-mongodb\n# npm install @trieb.work/payload-plugin-backup-mongodb\n# yarn add @trieb.work/payload-plugin-backup-mongodb\n```\n\nPeer dependencies: **`@payloadcms/db-mongodb`**, **`payload`**,\n**`@payloadcms/ui`**, **`next`**, and **`react`**. (all expected in a Payload\n3 + MongoDB + Next.js app).\n\n### 2. Register the plugin\n\n```ts\n// payload.config.ts\nimport { buildConfig } from 'payload'\nimport { backupMongodbPlugin } from '@trieb.work/payload-plugin-backup-mongodb'\n\nexport default buildConfig({\n  // your db adapter, collections, etc.\n  plugins: [\n    backupMongodbPlugin({\n      // all options optional — see \"Plugin options\"\n    }),\n  ],\n})\n```\n\nThe plugin will register the backup collections, mount the dashboard, and add\n`/api/backup-mongodb/*` endpoints. Import paths resolve to a **published or\nlinked** `dist/` build; after local changes to the package, run `pnpm build` in\nthe plugin repo (or reinstall) so `dist/` is up to date.\n\n### 3. Regenerate types and the import map\n\nSo Payload picks up the new admin components and collections:\n\n```bash\npnpm payload generate:types\npnpm payload generate:importmap\n```\n\n### 4. (Optional) Schedule cron backups\n\n**Vercel:** add a cron in `vercel.json`. Path must match your API; default is\nunder `/api/…`:\n\n```json\n{\n  \"crons\": [\n    {\n      \"path\": \"/api/backup-mongodb/cron/run\",\n      \"schedule\": \"0 3 * * *\"\n    }\n  ]\n}\n```\n\nVercel Cron sends header `Authorization: Bearer $CRON_SECRET`. **Other hosts**\n(k8s, GitHub Actions, etc.): `GET` the same URL on your schedule with that same\nauthorization header.\n\n### Checklist\n\n- [ ] Package installed\n- [ ] `backupMongodbPlugin` in `plugins` array\n- [ ] `generate:types` and `generate:importmap` run\n- [ ] `MONGODB_URI` and `BLOB_READ_WRITE_TOKEN` set in the environment\n- [ ] (Optional) `CRON_SECRET` and cron job (vercel.json) if you want scheduled\n      backups\n\nStart your dev server, open `/admin`, sign in as an admin, and you should see\n**Backups** below the dashboard.\n\n---\n\n## Admin UI\n\nAfter the first login as an admin user, a **Backups** section appears below the\ndefault Payload dashboard. Day-to-day tasks — create, download, restore, delete,\nschedule — all happen in the UI below.\n\n**Who can see it?** The visibility rules, in precedence order:\n\n1. If the plugin is registered with an `access` function, it wins (see\n   [Plugin options](#plugin-options)).\n2. Otherwise, if `PAYLOAD_BACKUP_ALLOWED_ROLES` is set, it is used as a\n   comma-separated allow-list of role slugs (case-insensitive). Use `*` for \"any\n   authenticated user\". Example:\n   `PAYLOAD_BACKUP_ALLOWED_ROLES=admin,superadmin`.\n3. Otherwise, the historical default applies: users with a `role` whose slug is\n   `admin` see the dashboard; projects that don't use a `roles` field at all get\n   the dashboard for any authenticated user.\n\n### Scheduled (cron) vs on-demand (manual) backups\n\n- **Scheduled / cron** backups follow shared settings: retention, media toggle,\n  and collections to skip. Older cron archives are pruned when the keep-count is\n  exceeded. They appear in the list as **CRON BACKUP** (or similar).\n- **Manual / on-demand** backups are configured **per run** — per-collection\n  toggles, optional media in a `.tar.gz` archive. Manual backups are not\n  auto-pruned; use them as checkpoints before migrations.\n\n![Manual backup dialog with per-collection selection and optional media bundling](./docs/screenshots/manual-backup.png)\n\n### Selective restore with per-collection preview\n\n**Restore** opens a preview of the archive before any write. You can restore\neverything, cherry-pick collections, or skip media from `.tar.gz` when you only\nneed database rows. Restoring from a different host or database is supported;\nfilters help when cloning production into staging.\n\n![Restore dialog previewing document counts per collection](./docs/screenshots/restore.png)\n\n### Scheduled backup settings\n\nRetention, storage token, and cron collection skip list live in one modal:\n\n![Scheduled backup settings: cron schedule, retention, blob token, collection skip list](./docs/screenshots/settings.png)\n\n- **Schedule:** when `vercel.json` is present, the plugin can show a\n  human-readable cron description (via\n  [cronstrue](https://github.com/bradymholt/cronstrue)).\n- **Retention:** how many **cron** archives to keep; manual backups are not\n  pruned by this.\n- **Dedicated backup storage (optional):** a separate Vercel Blob read/write\n  token (when `BACKUP_STORAGE=vercel-blob`) so backups can live in a different\n  store than media. The UI can validate the token and optionally copy existing\n  `backups/*` objects to the new store. For S3, configure the target bucket via\n  environment variables.\n- **Collection selection for cron:** defaults to all collections, with\n  per-collection opt-out.\n\n---\n\n## Plugin options\n\n```ts\ntype BackupPluginOptions = {\n  /**\n   * Set to `false` to disable the plugin (no collections, endpoints, or admin UI).\n   * Omit or leave unset to keep the plugin active.\n   */\n  enabled?: boolean\n\n  /** Default cron retention when no value is stored in settings. Falls back to `BACKUPS_TO_KEEP` or `10`. */\n  backupsToKeep?: number\n\n  /**\n   * Custom access check for admin routes and the dashboard. Overrides the\n   * `PAYLOAD_BACKUP_ALLOWED_ROLES` env var when provided.\n   *\n   * Default (env-based): see the `PAYLOAD_BACKUP_ALLOWED_ROLES` entry in the\n   * environment variables table. When neither is configured, the check falls back\n   * to a role with slug `admin`, or allows any authenticated user in projects\n   * without a `roles` field.\n   */\n  access?: (user: Record<string, unknown> | null) => boolean\n}\n```\n\n---\n\n## HTTP API (Payload REST)\n\nAll routes are served by Payload’s `/api/[...slug]` handler under\n**`/api/backup-mongodb/…`**. The `backup-mongodb` prefix avoids clashing with a\ncollection slug. The admin UI uses the same URLs; use the exported\n`backupPluginPublicApiPaths` helper in client code.\n\n### Cron / external (Bearer `CRON_SECRET`)\n\n```http\nGET  /api/backup-mongodb/cron/run        # enqueue a cron backup\nGET  /api/backup-mongodb/cron/list     # list backups\nPOST /api/backup-mongodb/cron/restore  # body: { \"url\": \"https://…\" }\nAuthorization: Bearer <CRON_SECRET>\n```\n\n### Admin (session cookie, or `pollSecret` for `/task/:id` where applicable)\n\n| Method         | Path                                            |\n| -------------- | ----------------------------------------------- |\n| `POST`         | `/api/backup-mongodb/admin/manual`              |\n| `POST`         | `/api/backup-mongodb/admin/restore`             |\n| `POST`         | `/api/backup-mongodb/admin/backup-preview`      |\n| `POST`         | `/api/backup-mongodb/admin/restore-preview`     |\n| `POST`         | `/api/backup-mongodb/admin/delete`              |\n| `GET`          | `/api/backup-mongodb/admin/backup-download`     |\n| `GET`          | `/api/backup-mongodb/admin/task/:id`            |\n| `GET` / `POST` | `/api/backup-mongodb/admin/settings`            |\n| `POST`         | `/api/backup-mongodb/admin/validate-blob-token` |\n\n---\n\n## Programmatic API\n\nFor scripts, hooks, and tests:\n\n```ts\nimport {\n  createBackup,\n  listBackups,\n  restoreBackup,\n} from '@trieb.work/payload-plugin-backup-mongodb'\n\n// Example: manual backup from a one-off script\nawait createBackup(payload, { cron: false, includeMedia: true })\n\n// Example: restore from a URL, skipping `users`\nawait restoreBackup(payload, downloadUrl, ['users'], false)\n\n// Example: list backup archives (token from backup-settings + env, same as create/restore)\nconst blobs = await listBackups(payload)\n```\n\n---\n\n## Blob storage model\n\n### Blob naming\n\n```\n\nbackups/{type}---{dbName}---{hostname}---{collectionCount}-{timestampMs}.{json|tar.gz}\n\n```\n\n- `type`: `cron` or `manual` (and legacy-style labels where applicable).\n- `dbName` / `hostname`: derived from your MongoDB URL and public server URL;\n  URL-encoded in the name.\n- `collectionCount` + `timestampMs`: sort key for listing; legacy blob names are\n  still supported.\n\n### Public vs private stores\n\nA validation step probes the bucket and records whether the store behaves as\npublic or private. New uploads use the right access mode. Restore and preview\nflows handle both.\n\n### Overriding the backup store\n\nTo keep backups in a **different** Vercel Blob project than media (when\n`BACKUP_STORAGE=vercel-blob`), open **Backup settings** in the admin, paste a\ndedicated `BLOB_READ_WRITE_TOKEN`, validate, and optionally migrate existing\n`backups/*` objects to the new store before switching. For S3, the target is\ncontrolled entirely by environment variables.\n\n### Removed demo seed API (intentional)\n\nEarlier releases exposed an optional demo seed route (`seedDemoDumpUrl`,\n`/backup-mongodb/admin/seed`, and the `restoreSeedMedia` export). That was\nremoved on purpose: a backup plugin should not ship a public “seed my database”\nAPI. Use your own migration/seed tooling instead.\n\n---\n\n## Running the tests\n\n```bash\npnpm test:int\n```\n\n### E2E (Playwright)\n\nEnd-to-end tests live in `tests/e2e/` and target the `dev/` Next + Payload app.\n**Locally**, start Mongo (or rely on the in-memory replica set when\n`DATABASE_URL` / `MONGODB_URI` are unset), then either run `pnpm dev` and\n`pnpm test:e2e` in another shell (Playwright reuses the server when not in\n`CI`), or run only `pnpm test:e2e` so Playwright starts `pnpm dev` for you.\n\n**CI** (`.github/workflows/e2e.yml`, same pattern as the reference `e2e.yml` in\nexecutive-search: MongoDB 7 service, `pnpm run build` then `pnpm run build:dev`,\nthen Playwright against `next start`). Optional secret\n**`BLOB_READ_WRITE_TOKEN`** for fuller blob behaviour.\n\n### Optional: deploy `dev/` to Vercel\n\n`.github/workflows/deploy-dev-vercel.yml` runs when `dev/` (or related paths)\nchange on `main`, or via **workflow_dispatch**, **only if** `VERCEL_TOKEN`,\n`VERCEL_ORG_ID`, and `VERCEL_PROJECT_ID` are set. Configure the Vercel project\n**Root Directory** to `dev` (`dev/vercel.json` wires install/build from the repo\nroot).\n\nThe repo includes a `dev/` Payload + Next app (MongoDB Memory Server when no URI\nis set): `pnpm dev` → `http://localhost:3000/admin` (login in\n`dev/helpers/credentials.ts`). In unit tests, external services like\n`@vercel/blob` and `bson` are often mocked with `vi.mock()`.\n\n---\n\n## Publishing (npm)\n\nVersioning uses [Changesets](https://github.com/changesets/changesets): add a\nfile with `pnpm changeset`, open a PR to `main`, and merge. The **Release**\nworkflow opens a “version packages” PR or runs `pnpm run release` (`build` +\n`changeset publish`) when the set of changesets is ready. PRs need a new\n`.changeset/*.md` unless you add the **`no-changeset`** label (e.g. docs-only).\n\n---\n\n## Roadmap / ideas\n\n- Multipart / very large backup uploads (Vercel Blob supports large objects; may\n  need to switch past single-part limits). _(S3 uploads already use multipart.)_\n- Additional storage adapters (filesystem, etc.). _(AWS S3 and S3-compatible\n  stores such as R2/MinIO are supported — see\n  [Choosing a backup target](#choosing-a-backup-target-vercel-blob-or-s3).)_\n- Scheduler-agnostic display when not using Vercel (`vercel.json` is currently\n  used for the schedule summary where available).\n- Streaming restore for very large databases.\n- Configurable `backups/` prefix or bucket layout.\n- add support for tenant plugin and partial backups per tenant\n\n---\n\n## License\n\nMIT\n\n---\n\nBuilt and maintained by [TRWK>](https://trwk.de), formerly\n[trieb.work](https://trieb.work).\n","readmeFilename":"README.md"}