@trieb.work/payload-plugin-backup-mongodb 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +130 -62
  2. package/dist/backup-dashboard.css +18 -1
  3. package/dist/collections/BackupTasks.js +8 -1
  4. package/dist/collections/BackupTasks.js.map +1 -1
  5. package/dist/components/BackupDashboard/BackupSettingsModal.client.js +203 -115
  6. package/dist/components/BackupDashboard/BackupSettingsModal.client.js.map +1 -1
  7. package/dist/components/BackupDashboard/RestoreBackupDialog.client.js +1 -1
  8. package/dist/components/BackupDashboard/RestoreBackupDialog.client.js.map +1 -1
  9. package/dist/components/BackupDashboard/TaskActionButton.client.d.ts +1 -1
  10. package/dist/components/BackupDashboard/TaskActionButton.client.js +59 -26
  11. package/dist/components/BackupDashboard/TaskActionButton.client.js.map +1 -1
  12. package/dist/components/BackupDashboard/backupDashboardInlineCss.js +1 -1
  13. package/dist/components/BackupDashboard/backupDashboardInlineCss.js.map +1 -1
  14. package/dist/components/BackupDashboard/index.js +27 -3
  15. package/dist/components/BackupDashboard/index.js.map +1 -1
  16. package/dist/core/backup.d.ts +4 -3
  17. package/dist/core/backup.js +50 -43
  18. package/dist/core/backup.js.map +1 -1
  19. package/dist/core/backupArchiveRead.d.ts +15 -0
  20. package/dist/core/backupArchiveRead.js +30 -0
  21. package/dist/core/backupArchiveRead.js.map +1 -0
  22. package/dist/core/backupSettings.js +5 -0
  23. package/dist/core/backupSettings.js.map +1 -1
  24. package/dist/core/restore.d.ts +5 -2
  25. package/dist/core/restore.js +133 -89
  26. package/dist/core/restore.js.map +1 -1
  27. package/dist/core/restorePreview.d.ts +12 -3
  28. package/dist/core/restorePreview.js +17 -13
  29. package/dist/core/restorePreview.js.map +1 -1
  30. package/dist/core/restoreResult.d.ts +34 -0
  31. package/dist/core/restoreResult.js +45 -0
  32. package/dist/core/restoreResult.js.map +1 -0
  33. package/dist/core/storage/config.d.ts +31 -0
  34. package/dist/core/storage/config.js +60 -0
  35. package/dist/core/storage/config.js.map +1 -0
  36. package/dist/core/storage/index.d.ts +23 -0
  37. package/dist/core/storage/index.js +25 -0
  38. package/dist/core/storage/index.js.map +1 -0
  39. package/dist/core/storage/s3.d.ts +35 -0
  40. package/dist/core/storage/s3.js +200 -0
  41. package/dist/core/storage/s3.js.map +1 -0
  42. package/dist/core/storage/types.d.ts +60 -0
  43. package/dist/core/storage/types.js +6 -0
  44. package/dist/core/storage/types.js.map +1 -0
  45. package/dist/core/storage/vercelBlob.d.ts +25 -0
  46. package/dist/core/storage/vercelBlob.js +53 -0
  47. package/dist/core/storage/vercelBlob.js.map +1 -0
  48. package/dist/core/taskProgress.d.ts +10 -4
  49. package/dist/core/taskProgress.js +11 -2
  50. package/dist/core/taskProgress.js.map +1 -1
  51. package/dist/endpoints/index.js +0 -5
  52. package/dist/endpoints/index.js.map +1 -1
  53. package/dist/endpoints/paths/admin-backup-download.js +8 -7
  54. package/dist/endpoints/paths/admin-backup-download.js.map +1 -1
  55. package/dist/endpoints/paths/admin-delete.js +11 -5
  56. package/dist/endpoints/paths/admin-delete.js.map +1 -1
  57. package/dist/endpoints/paths/admin-manual.js +2 -1
  58. package/dist/endpoints/paths/admin-manual.js.map +1 -1
  59. package/dist/endpoints/paths/admin-preview.js +9 -2
  60. package/dist/endpoints/paths/admin-preview.js.map +1 -1
  61. package/dist/endpoints/paths/admin-restore.js +7 -4
  62. package/dist/endpoints/paths/admin-restore.js.map +1 -1
  63. package/dist/endpoints/paths/admin-settings.js +35 -2
  64. package/dist/endpoints/paths/admin-settings.js.map +1 -1
  65. package/dist/endpoints/paths/cron-list.js +2 -1
  66. package/dist/endpoints/paths/cron-list.js.map +1 -1
  67. package/dist/endpoints/paths/cron-restore.js +14 -4
  68. package/dist/endpoints/paths/cron-restore.js.map +1 -1
  69. package/dist/endpoints/paths/cron-run.js +2 -1
  70. package/dist/endpoints/paths/cron-run.js.map +1 -1
  71. package/dist/endpoints/shared.d.ts +0 -1
  72. package/dist/endpoints/shared.js +0 -6
  73. package/dist/endpoints/shared.js.map +1 -1
  74. package/dist/index.d.ts +5 -3
  75. package/dist/index.js +3 -2
  76. package/dist/index.js.map +1 -1
  77. package/dist/publicApiPaths.d.ts +0 -1
  78. package/dist/publicApiPaths.js +0 -1
  79. package/dist/publicApiPaths.js.map +1 -1
  80. package/dist/types.d.ts +0 -5
  81. package/dist/types.js.map +1 -1
  82. package/package.json +22 -4
  83. package/dist/endpoints/paths/admin-seed.d.ts +0 -3
  84. package/dist/endpoints/paths/admin-seed.js +0 -47
  85. package/dist/endpoints/paths/admin-seed.js.map +0 -1
@@ -86,6 +86,7 @@ export const BackupSettingsModal = ()=>{
86
86
  });
87
87
  const [pluginOverridesRetention, setPluginOverridesRetention] = useState(false);
88
88
  const [cronInfo, setCronInfo] = useState(undefined);
89
+ const [storage, setStorage] = useState(undefined);
89
90
  const [transferSummary, setTransferSummary] = useState(null);
90
91
  const [activeTransfer, setActiveTransfer] = useState(null);
91
92
  const [transferLive, setTransferLive] = useState(null);
@@ -173,6 +174,7 @@ export const BackupSettingsModal = ()=>{
173
174
  });
174
175
  setPluginOverridesRetention(settingsJson.pluginBackupsToKeepOverride === true);
175
176
  setCronInfo(settingsJson.cron ?? null);
177
+ setStorage(settingsJson.storage);
176
178
  setIncludeMediaBlobs(settingsJson.includeMediaForCron === true);
177
179
  const skip = Array.isArray(settingsJson.skipMongoCollections) ? settingsJson.skipMongoCollections : [];
178
180
  setSelected(selectedFromSkipMongoNames(previewJson, skip));
@@ -575,6 +577,88 @@ export const BackupSettingsModal = ()=>{
575
577
  /*#__PURE__*/ _jsxs("div", {
576
578
  className: "backup-confirm-dialog__body restore-preview",
577
579
  children: [
580
+ storage ? /*#__PURE__*/ _jsxs(_Fragment, {
581
+ children: [
582
+ /*#__PURE__*/ _jsx("p", {
583
+ className: "restore-preview__sticky-heading",
584
+ children: "Storage target"
585
+ }),
586
+ storage.kind === 's3' ? /*#__PURE__*/ _jsxs(_Fragment, {
587
+ children: [
588
+ /*#__PURE__*/ _jsxs("p", {
589
+ className: "restore-preview__intro",
590
+ children: [
591
+ "Backups use ",
592
+ /*#__PURE__*/ _jsx("strong", {
593
+ children: "AWS S3"
594
+ }),
595
+ " (or S3-compatible). Selected via the",
596
+ ' ',
597
+ /*#__PURE__*/ _jsx("code", {
598
+ children: "BACKUP_STORAGE"
599
+ }),
600
+ " environment variable."
601
+ ]
602
+ }),
603
+ storage.s3 ? /*#__PURE__*/ _jsxs("p", {
604
+ className: "restore-preview__intro",
605
+ children: [
606
+ "Bucket ",
607
+ /*#__PURE__*/ _jsx("code", {
608
+ children: storage.s3.bucket
609
+ }),
610
+ " · region",
611
+ ' ',
612
+ /*#__PURE__*/ _jsx("code", {
613
+ children: storage.s3.region
614
+ }),
615
+ storage.s3.endpoint ? /*#__PURE__*/ _jsxs(_Fragment, {
616
+ children: [
617
+ ' ',
618
+ "· endpoint ",
619
+ /*#__PURE__*/ _jsx("code", {
620
+ children: storage.s3.endpoint
621
+ })
622
+ ]
623
+ }) : null,
624
+ storage.s3.prefix ? /*#__PURE__*/ _jsxs(_Fragment, {
625
+ children: [
626
+ ' ',
627
+ "· prefix ",
628
+ /*#__PURE__*/ _jsx("code", {
629
+ children: storage.s3.prefix
630
+ })
631
+ ]
632
+ }) : null
633
+ ]
634
+ }) : /*#__PURE__*/ _jsxs("p", {
635
+ className: "restore-preview__intro",
636
+ children: [
637
+ "Set ",
638
+ /*#__PURE__*/ _jsx("code", {
639
+ children: "BACKUP_S3_BUCKET"
640
+ }),
641
+ " (and credentials) to finish configuring S3."
642
+ ]
643
+ })
644
+ ]
645
+ }) : /*#__PURE__*/ _jsxs("p", {
646
+ className: "restore-preview__intro",
647
+ children: [
648
+ "Backups use ",
649
+ /*#__PURE__*/ _jsx("strong", {
650
+ children: "Vercel Blob"
651
+ }),
652
+ " (default). Set",
653
+ ' ',
654
+ /*#__PURE__*/ _jsx("code", {
655
+ children: "BACKUP_STORAGE=s3"
656
+ }),
657
+ " in the environment to use AWS S3 instead."
658
+ ]
659
+ })
660
+ ]
661
+ }) : null,
578
662
  phase !== 'idle' ? /*#__PURE__*/ _jsxs(_Fragment, {
579
663
  children: [
580
664
  /*#__PURE__*/ _jsx("p", {
@@ -738,144 +822,148 @@ export const BackupSettingsModal = ()=>{
738
822
  })
739
823
  ]
740
824
  }),
741
- /*#__PURE__*/ _jsxs("p", {
742
- className: "restore-preview__sticky-heading",
825
+ storage?.kind === 's3' ? null : /*#__PURE__*/ _jsxs(_Fragment, {
743
826
  children: [
744
- "Dedicated backup storage",
745
- ' ',
746
- /*#__PURE__*/ _jsx("span", {
747
- className: "restore-preview__sticky-heading-hint",
748
- children: "(optional)"
749
- })
750
- ]
751
- }),
752
- /*#__PURE__*/ _jsxs("p", {
753
- className: "restore-preview__intro",
754
- children: [
755
- "Separate Vercel Blob token for ",
756
- /*#__PURE__*/ _jsx("code", {
757
- children: "backups/"
758
- }),
759
- ". Without one, archives share the default media store."
760
- ]
761
- }),
762
- /*#__PURE__*/ _jsxs("div", {
763
- className: "restore-preview__settings-fields",
764
- children: [
765
- /*#__PURE__*/ _jsx("label", {
766
- className: "restore-preview__settings-label",
767
- htmlFor: "backup-blob-token",
768
- children: "Backup Blob read/write token"
769
- }),
770
- /*#__PURE__*/ _jsxs("div", {
771
- className: "restore-preview__blob-token-row",
827
+ /*#__PURE__*/ _jsxs("p", {
828
+ className: "restore-preview__sticky-heading",
772
829
  children: [
773
- /*#__PURE__*/ _jsx("input", {
774
- "aria-label": "Backup Blob read/write token",
775
- autoComplete: "off",
776
- className: "restore-preview__settings-input restore-preview__settings-input--wide",
777
- id: "backup-blob-token",
778
- onChange: (e)=>onChangeBackupBlobToken(e.target.value),
779
- placeholder: "vercel_blob_rw_...",
780
- spellCheck: false,
781
- type: "text",
782
- value: backupBlobReadWriteToken
783
- }),
830
+ "Dedicated backup storage",
831
+ ' ',
784
832
  /*#__PURE__*/ _jsx("span", {
785
- className: "restore-preview__blob-token-pill-slot",
786
- children: tokenStatusPill
833
+ className: "restore-preview__sticky-heading-hint",
834
+ children: "(optional)"
787
835
  })
788
836
  ]
789
837
  }),
790
- tokenCheck.status === 'invalid' && tokenCheck.message ? /*#__PURE__*/ _jsx("p", {
791
- "aria-live": "polite",
792
- className: "restore-preview__blob-token-error",
793
- children: tokenCheck.message
794
- }) : null,
795
- savePhase === 'transferring' && transferLive && transferLive.total > 0 ? /*#__PURE__*/ _jsxs("div", {
796
- "aria-live": "polite",
797
- className: "restore-preview__transfer-panel",
838
+ /*#__PURE__*/ _jsxs("p", {
839
+ className: "restore-preview__intro",
798
840
  children: [
799
- /*#__PURE__*/ _jsx("div", {
800
- className: "restore-preview__transfer-bar-track",
801
- children: /*#__PURE__*/ _jsx("div", {
802
- className: "restore-preview__transfer-bar-fill",
803
- style: {
804
- width: `${Math.min(100, (transferLive.transferred + transferLive.failed) / transferLive.total * 100)}%`
805
- }
806
- })
841
+ "Separate Vercel Blob token for ",
842
+ /*#__PURE__*/ _jsx("code", {
843
+ children: "backups/"
807
844
  }),
808
- /*#__PURE__*/ _jsxs("p", {
809
- className: "restore-preview__transfer-meta",
810
- children: [
811
- "Copying backup files: ",
812
- transferLive.transferred + transferLive.failed,
813
- " /",
814
- ' ',
815
- transferLive.total,
816
- transferLive.failed > 0 ? ` (${transferLive.failed} failed)` : '',
817
- transferLive.pathname ? /*#__PURE__*/ _jsxs(_Fragment, {
818
- children: [
819
- /*#__PURE__*/ _jsx("br", {}),
820
- /*#__PURE__*/ _jsx("span", {
821
- className: "restore-preview__transfer-path",
822
- title: transferLive.pathname,
823
- children: transferLive.pathname.length > 56 ? `${transferLive.pathname.slice(0, 28)}…${transferLive.pathname.slice(-24)}` : transferLive.pathname
824
- })
825
- ]
826
- }) : null
827
- ]
828
- })
845
+ ". Without one, archives share the default media store."
829
846
  ]
830
- }) : null,
831
- willSaveNewRawToken ? /*#__PURE__*/ _jsxs(_Fragment, {
847
+ }),
848
+ /*#__PURE__*/ _jsxs("div", {
849
+ className: "restore-preview__settings-fields",
832
850
  children: [
851
+ /*#__PURE__*/ _jsx("label", {
852
+ className: "restore-preview__settings-label",
853
+ htmlFor: "backup-blob-token",
854
+ children: "Backup Blob read/write token"
855
+ }),
833
856
  /*#__PURE__*/ _jsxs("div", {
834
- className: "field-type checkbox backup-dashboard__collapsible-checkbox restore-preview__blob-transfer-row restore-preview__blob-transfer-row--with-help-tip",
857
+ className: "restore-preview__blob-token-row",
835
858
  children: [
836
859
  /*#__PURE__*/ _jsx("input", {
837
- "aria-label": "Copy existing backup files into this storage when saving",
838
- checked: transferBackupBlobs,
839
- className: "checkbox-input__input",
840
- id: transferOptId,
841
- onChange: (e)=>setTransferBackupBlobs(e.target.checked),
842
- type: "checkbox"
860
+ "aria-label": "Backup Blob read/write token",
861
+ autoComplete: "off",
862
+ className: "restore-preview__settings-input restore-preview__settings-input--wide",
863
+ id: "backup-blob-token",
864
+ onChange: (e)=>onChangeBackupBlobToken(e.target.value),
865
+ placeholder: "vercel_blob_rw_...",
866
+ spellCheck: false,
867
+ type: "text",
868
+ value: backupBlobReadWriteToken
843
869
  }),
844
- /*#__PURE__*/ _jsx("label", {
845
- className: "field-label",
846
- htmlFor: transferOptId,
847
- children: "Copy existing backup files into this storage when saving"
848
- }),
849
- /*#__PURE__*/ _jsx(SettingsHelpTip, {
850
- multiline: true,
851
- tip: TIP_TRANSFER_COPY
870
+ /*#__PURE__*/ _jsx("span", {
871
+ className: "restore-preview__blob-token-pill-slot",
872
+ children: tokenStatusPill
852
873
  })
853
874
  ]
854
875
  }),
855
- transferBackupBlobs ? /*#__PURE__*/ _jsxs("div", {
856
- className: "field-type checkbox backup-dashboard__collapsible-checkbox restore-preview__blob-transfer-row restore-preview__blob-transfer-row--with-help-tip",
876
+ tokenCheck.status === 'invalid' && tokenCheck.message ? /*#__PURE__*/ _jsx("p", {
877
+ "aria-live": "polite",
878
+ className: "restore-preview__blob-token-error",
879
+ children: tokenCheck.message
880
+ }) : null,
881
+ savePhase === 'transferring' && transferLive && transferLive.total > 0 ? /*#__PURE__*/ _jsxs("div", {
882
+ "aria-live": "polite",
883
+ className: "restore-preview__transfer-panel",
857
884
  children: [
858
- /*#__PURE__*/ _jsx("input", {
859
- "aria-label": "Delete from previous storage after successful copy",
860
- checked: deleteBackupBlobsFromSource,
861
- className: "checkbox-input__input",
862
- id: deleteSourceOptId,
863
- onChange: (e)=>setDeleteBackupBlobsFromSource(e.target.checked),
864
- type: "checkbox"
865
- }),
866
- /*#__PURE__*/ _jsx("label", {
867
- className: "field-label",
868
- htmlFor: deleteSourceOptId,
869
- children: "Delete from previous storage after successful copy"
885
+ /*#__PURE__*/ _jsx("div", {
886
+ className: "restore-preview__transfer-bar-track",
887
+ children: /*#__PURE__*/ _jsx("div", {
888
+ className: "restore-preview__transfer-bar-fill",
889
+ style: {
890
+ width: `${Math.min(100, (transferLive.transferred + transferLive.failed) / transferLive.total * 100)}%`
891
+ }
892
+ })
870
893
  }),
871
- /*#__PURE__*/ _jsx(SettingsHelpTip, {
872
- multiline: true,
873
- tip: TIP_TRANSFER_DELETE
894
+ /*#__PURE__*/ _jsxs("p", {
895
+ className: "restore-preview__transfer-meta",
896
+ children: [
897
+ "Copying backup files: ",
898
+ transferLive.transferred + transferLive.failed,
899
+ " /",
900
+ ' ',
901
+ transferLive.total,
902
+ transferLive.failed > 0 ? ` (${transferLive.failed} failed)` : '',
903
+ transferLive.pathname ? /*#__PURE__*/ _jsxs(_Fragment, {
904
+ children: [
905
+ /*#__PURE__*/ _jsx("br", {}),
906
+ /*#__PURE__*/ _jsx("span", {
907
+ className: "restore-preview__transfer-path",
908
+ title: transferLive.pathname,
909
+ children: transferLive.pathname.length > 56 ? `${transferLive.pathname.slice(0, 28)}…${transferLive.pathname.slice(-24)}` : transferLive.pathname
910
+ })
911
+ ]
912
+ }) : null
913
+ ]
874
914
  })
875
915
  ]
916
+ }) : null,
917
+ willSaveNewRawToken ? /*#__PURE__*/ _jsxs(_Fragment, {
918
+ children: [
919
+ /*#__PURE__*/ _jsxs("div", {
920
+ className: "field-type checkbox backup-dashboard__collapsible-checkbox restore-preview__blob-transfer-row restore-preview__blob-transfer-row--with-help-tip",
921
+ children: [
922
+ /*#__PURE__*/ _jsx("input", {
923
+ "aria-label": "Copy existing backup files into this storage when saving",
924
+ checked: transferBackupBlobs,
925
+ className: "checkbox-input__input",
926
+ id: transferOptId,
927
+ onChange: (e)=>setTransferBackupBlobs(e.target.checked),
928
+ type: "checkbox"
929
+ }),
930
+ /*#__PURE__*/ _jsx("label", {
931
+ className: "field-label",
932
+ htmlFor: transferOptId,
933
+ children: "Copy existing backup files into this storage when saving"
934
+ }),
935
+ /*#__PURE__*/ _jsx(SettingsHelpTip, {
936
+ multiline: true,
937
+ tip: TIP_TRANSFER_COPY
938
+ })
939
+ ]
940
+ }),
941
+ transferBackupBlobs ? /*#__PURE__*/ _jsxs("div", {
942
+ className: "field-type checkbox backup-dashboard__collapsible-checkbox restore-preview__blob-transfer-row restore-preview__blob-transfer-row--with-help-tip",
943
+ children: [
944
+ /*#__PURE__*/ _jsx("input", {
945
+ "aria-label": "Delete from previous storage after successful copy",
946
+ checked: deleteBackupBlobsFromSource,
947
+ className: "checkbox-input__input",
948
+ id: deleteSourceOptId,
949
+ onChange: (e)=>setDeleteBackupBlobsFromSource(e.target.checked),
950
+ type: "checkbox"
951
+ }),
952
+ /*#__PURE__*/ _jsx("label", {
953
+ className: "field-label",
954
+ htmlFor: deleteSourceOptId,
955
+ children: "Delete from previous storage after successful copy"
956
+ }),
957
+ /*#__PURE__*/ _jsx(SettingsHelpTip, {
958
+ multiline: true,
959
+ tip: TIP_TRANSFER_DELETE
960
+ })
961
+ ]
962
+ }) : null
963
+ ]
876
964
  }) : null
877
965
  ]
878
- }) : null
966
+ })
879
967
  ]
880
968
  }),
881
969
  /*#__PURE__*/ _jsx(CollectionBackupPreviewBody, {