@nocobase/plugin-backups 2.0.56

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 (380) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +99 -0
  3. package/client.d.ts +2 -0
  4. package/client.js +1 -0
  5. package/dist/client/components/BackupSettings.d.ts +2 -0
  6. package/dist/client/components/BackupsManagement.d.ts +2 -0
  7. package/dist/client/components/BackupsTable.d.ts +16 -0
  8. package/dist/client/components/NewBackup.d.ts +10 -0
  9. package/dist/client/components/RefreshBackups.d.ts +10 -0
  10. package/dist/client/components/RestoreFromBackup.d.ts +5 -0
  11. package/dist/client/components/RestoreFromLocal.d.ts +2 -0
  12. package/dist/client/constants.d.ts +1 -0
  13. package/dist/client/contexts.d.ts +17 -0
  14. package/dist/client/hooks/useBackupAppInfo.d.ts +8 -0
  15. package/dist/client/hooks/useCheckBackupMessage.d.ts +4 -0
  16. package/dist/client/hooks/useRestoreTask.d.ts +2 -0
  17. package/dist/client/index.d.ts +7 -0
  18. package/dist/client/index.js +10 -0
  19. package/dist/client/locale.d.ts +10 -0
  20. package/dist/externalVersion.js +32 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.js +48 -0
  23. package/dist/locale/de-DE.json +52 -0
  24. package/dist/locale/en-US.json +52 -0
  25. package/dist/locale/es-ES.json +52 -0
  26. package/dist/locale/fr-FR.json +52 -0
  27. package/dist/locale/hu-HU.json +52 -0
  28. package/dist/locale/id-ID.json +52 -0
  29. package/dist/locale/it-IT.json +52 -0
  30. package/dist/locale/ja-JP.json +52 -0
  31. package/dist/locale/ko-KR.json +52 -0
  32. package/dist/locale/nl-NL.json +52 -0
  33. package/dist/locale/pt-BR.json +52 -0
  34. package/dist/locale/ru-RU.json +52 -0
  35. package/dist/locale/tr-TR.json +52 -0
  36. package/dist/locale/uk-UA.json +52 -0
  37. package/dist/locale/vi-VN.json +52 -0
  38. package/dist/locale/zh-CN.json +52 -0
  39. package/dist/locale/zh-TW.json +52 -0
  40. package/dist/node_modules/archiver/LICENSE +22 -0
  41. package/dist/node_modules/archiver/index.js +68 -0
  42. package/dist/node_modules/archiver/lib/core.js +974 -0
  43. package/dist/node_modules/archiver/lib/error.js +40 -0
  44. package/dist/node_modules/archiver/lib/plugins/json.js +110 -0
  45. package/dist/node_modules/archiver/lib/plugins/tar.js +167 -0
  46. package/dist/node_modules/archiver/lib/plugins/zip.js +120 -0
  47. package/dist/node_modules/archiver/node_modules/async/all.js +119 -0
  48. package/dist/node_modules/archiver/node_modules/async/allLimit.js +46 -0
  49. package/dist/node_modules/archiver/node_modules/async/allSeries.js +45 -0
  50. package/dist/node_modules/archiver/node_modules/async/any.js +122 -0
  51. package/dist/node_modules/archiver/node_modules/async/anyLimit.js +47 -0
  52. package/dist/node_modules/archiver/node_modules/async/anySeries.js +46 -0
  53. package/dist/node_modules/archiver/node_modules/async/apply.js +11 -0
  54. package/dist/node_modules/archiver/node_modules/async/applyEach.js +57 -0
  55. package/dist/node_modules/archiver/node_modules/async/applyEachSeries.js +37 -0
  56. package/dist/node_modules/archiver/node_modules/async/asyncify.js +118 -0
  57. package/dist/node_modules/archiver/node_modules/async/auto.js +333 -0
  58. package/dist/node_modules/archiver/node_modules/async/autoInject.js +182 -0
  59. package/dist/node_modules/archiver/node_modules/async/bower.json +17 -0
  60. package/dist/node_modules/archiver/node_modules/async/cargo.js +63 -0
  61. package/dist/node_modules/archiver/node_modules/async/cargoQueue.js +71 -0
  62. package/dist/node_modules/archiver/node_modules/async/compose.js +55 -0
  63. package/dist/node_modules/archiver/node_modules/async/concat.js +115 -0
  64. package/dist/node_modules/archiver/node_modules/async/concatLimit.js +60 -0
  65. package/dist/node_modules/archiver/node_modules/async/concatSeries.js +41 -0
  66. package/dist/node_modules/archiver/node_modules/async/constant.js +14 -0
  67. package/dist/node_modules/archiver/node_modules/async/detect.js +96 -0
  68. package/dist/node_modules/archiver/node_modules/async/detectLimit.js +48 -0
  69. package/dist/node_modules/archiver/node_modules/async/detectSeries.js +47 -0
  70. package/dist/node_modules/archiver/node_modules/async/dir.js +43 -0
  71. package/dist/node_modules/archiver/node_modules/async/dist/async.js +6062 -0
  72. package/dist/node_modules/archiver/node_modules/async/dist/async.min.js +1 -0
  73. package/dist/node_modules/archiver/node_modules/async/doDuring.js +68 -0
  74. package/dist/node_modules/archiver/node_modules/async/doUntil.js +46 -0
  75. package/dist/node_modules/archiver/node_modules/async/doWhilst.js +68 -0
  76. package/dist/node_modules/archiver/node_modules/async/during.js +78 -0
  77. package/dist/node_modules/archiver/node_modules/async/each.js +129 -0
  78. package/dist/node_modules/archiver/node_modules/async/eachLimit.js +50 -0
  79. package/dist/node_modules/archiver/node_modules/async/eachOf.js +185 -0
  80. package/dist/node_modules/archiver/node_modules/async/eachOfLimit.js +47 -0
  81. package/dist/node_modules/archiver/node_modules/async/eachOfSeries.js +39 -0
  82. package/dist/node_modules/archiver/node_modules/async/eachSeries.js +44 -0
  83. package/dist/node_modules/archiver/node_modules/async/ensureAsync.js +67 -0
  84. package/dist/node_modules/archiver/node_modules/async/every.js +119 -0
  85. package/dist/node_modules/archiver/node_modules/async/everyLimit.js +46 -0
  86. package/dist/node_modules/archiver/node_modules/async/everySeries.js +45 -0
  87. package/dist/node_modules/archiver/node_modules/async/filter.js +93 -0
  88. package/dist/node_modules/archiver/node_modules/async/filterLimit.js +45 -0
  89. package/dist/node_modules/archiver/node_modules/async/filterSeries.js +43 -0
  90. package/dist/node_modules/archiver/node_modules/async/find.js +96 -0
  91. package/dist/node_modules/archiver/node_modules/async/findLimit.js +48 -0
  92. package/dist/node_modules/archiver/node_modules/async/findSeries.js +47 -0
  93. package/dist/node_modules/archiver/node_modules/async/flatMap.js +115 -0
  94. package/dist/node_modules/archiver/node_modules/async/flatMapLimit.js +60 -0
  95. package/dist/node_modules/archiver/node_modules/async/flatMapSeries.js +41 -0
  96. package/dist/node_modules/archiver/node_modules/async/foldl.js +153 -0
  97. package/dist/node_modules/archiver/node_modules/async/foldr.js +41 -0
  98. package/dist/node_modules/archiver/node_modules/async/forEach.js +129 -0
  99. package/dist/node_modules/archiver/node_modules/async/forEachLimit.js +50 -0
  100. package/dist/node_modules/archiver/node_modules/async/forEachOf.js +185 -0
  101. package/dist/node_modules/archiver/node_modules/async/forEachOfLimit.js +47 -0
  102. package/dist/node_modules/archiver/node_modules/async/forEachOfSeries.js +39 -0
  103. package/dist/node_modules/archiver/node_modules/async/forEachSeries.js +44 -0
  104. package/dist/node_modules/archiver/node_modules/async/forever.js +68 -0
  105. package/dist/node_modules/archiver/node_modules/async/groupBy.js +108 -0
  106. package/dist/node_modules/archiver/node_modules/async/groupByLimit.js +71 -0
  107. package/dist/node_modules/archiver/node_modules/async/groupBySeries.js +36 -0
  108. package/dist/node_modules/archiver/node_modules/async/index.js +588 -0
  109. package/dist/node_modules/archiver/node_modules/async/inject.js +153 -0
  110. package/dist/node_modules/archiver/node_modules/async/internal/DoublyLinkedList.js +92 -0
  111. package/dist/node_modules/archiver/node_modules/async/internal/Heap.js +120 -0
  112. package/dist/node_modules/archiver/node_modules/async/internal/applyEach.js +29 -0
  113. package/dist/node_modules/archiver/node_modules/async/internal/asyncEachOfLimit.js +75 -0
  114. package/dist/node_modules/archiver/node_modules/async/internal/awaitify.js +28 -0
  115. package/dist/node_modules/archiver/node_modules/async/internal/breakLoop.js +10 -0
  116. package/dist/node_modules/archiver/node_modules/async/internal/consoleFunc.js +31 -0
  117. package/dist/node_modules/archiver/node_modules/async/internal/createTester.js +40 -0
  118. package/dist/node_modules/archiver/node_modules/async/internal/eachOfLimit.js +90 -0
  119. package/dist/node_modules/archiver/node_modules/async/internal/filter.js +55 -0
  120. package/dist/node_modules/archiver/node_modules/async/internal/getIterator.js +11 -0
  121. package/dist/node_modules/archiver/node_modules/async/internal/initialParams.js +14 -0
  122. package/dist/node_modules/archiver/node_modules/async/internal/isArrayLike.js +10 -0
  123. package/dist/node_modules/archiver/node_modules/async/internal/iterator.js +57 -0
  124. package/dist/node_modules/archiver/node_modules/async/internal/map.js +30 -0
  125. package/dist/node_modules/archiver/node_modules/async/internal/once.js +17 -0
  126. package/dist/node_modules/archiver/node_modules/async/internal/onlyOnce.js +15 -0
  127. package/dist/node_modules/archiver/node_modules/async/internal/parallel.js +34 -0
  128. package/dist/node_modules/archiver/node_modules/async/internal/promiseCallback.js +23 -0
  129. package/dist/node_modules/archiver/node_modules/async/internal/queue.js +294 -0
  130. package/dist/node_modules/archiver/node_modules/async/internal/range.js +14 -0
  131. package/dist/node_modules/archiver/node_modules/async/internal/reject.js +26 -0
  132. package/dist/node_modules/archiver/node_modules/async/internal/setImmediate.js +34 -0
  133. package/dist/node_modules/archiver/node_modules/async/internal/withoutIndex.js +10 -0
  134. package/dist/node_modules/archiver/node_modules/async/internal/wrapAsync.js +34 -0
  135. package/dist/node_modules/archiver/node_modules/async/log.js +41 -0
  136. package/dist/node_modules/archiver/node_modules/async/map.js +142 -0
  137. package/dist/node_modules/archiver/node_modules/async/mapLimit.js +45 -0
  138. package/dist/node_modules/archiver/node_modules/async/mapSeries.js +44 -0
  139. package/dist/node_modules/archiver/node_modules/async/mapValues.js +152 -0
  140. package/dist/node_modules/archiver/node_modules/async/mapValuesLimit.js +61 -0
  141. package/dist/node_modules/archiver/node_modules/async/mapValuesSeries.js +37 -0
  142. package/dist/node_modules/archiver/node_modules/async/memoize.js +91 -0
  143. package/dist/node_modules/archiver/node_modules/async/nextTick.js +52 -0
  144. package/dist/node_modules/archiver/node_modules/async/package.json +75 -0
  145. package/dist/node_modules/archiver/node_modules/async/parallel.js +180 -0
  146. package/dist/node_modules/archiver/node_modules/async/parallelLimit.js +41 -0
  147. package/dist/node_modules/archiver/node_modules/async/priorityQueue.js +60 -0
  148. package/dist/node_modules/archiver/node_modules/async/queue.js +24 -0
  149. package/dist/node_modules/archiver/node_modules/async/race.js +67 -0
  150. package/dist/node_modules/archiver/node_modules/async/reduce.js +153 -0
  151. package/dist/node_modules/archiver/node_modules/async/reduceRight.js +41 -0
  152. package/dist/node_modules/archiver/node_modules/async/reflect.js +78 -0
  153. package/dist/node_modules/archiver/node_modules/async/reflectAll.js +93 -0
  154. package/dist/node_modules/archiver/node_modules/async/reject.js +87 -0
  155. package/dist/node_modules/archiver/node_modules/async/rejectLimit.js +45 -0
  156. package/dist/node_modules/archiver/node_modules/async/rejectSeries.js +43 -0
  157. package/dist/node_modules/archiver/node_modules/async/retry.js +159 -0
  158. package/dist/node_modules/archiver/node_modules/async/retryable.js +77 -0
  159. package/dist/node_modules/archiver/node_modules/async/select.js +93 -0
  160. package/dist/node_modules/archiver/node_modules/async/selectLimit.js +45 -0
  161. package/dist/node_modules/archiver/node_modules/async/selectSeries.js +43 -0
  162. package/dist/node_modules/archiver/node_modules/async/seq.js +79 -0
  163. package/dist/node_modules/archiver/node_modules/async/series.js +186 -0
  164. package/dist/node_modules/archiver/node_modules/async/setImmediate.js +45 -0
  165. package/dist/node_modules/archiver/node_modules/async/some.js +122 -0
  166. package/dist/node_modules/archiver/node_modules/async/someLimit.js +47 -0
  167. package/dist/node_modules/archiver/node_modules/async/someSeries.js +46 -0
  168. package/dist/node_modules/archiver/node_modules/async/sortBy.js +190 -0
  169. package/dist/node_modules/archiver/node_modules/async/timeout.js +89 -0
  170. package/dist/node_modules/archiver/node_modules/async/times.js +50 -0
  171. package/dist/node_modules/archiver/node_modules/async/timesLimit.js +43 -0
  172. package/dist/node_modules/archiver/node_modules/async/timesSeries.js +32 -0
  173. package/dist/node_modules/archiver/node_modules/async/transform.js +173 -0
  174. package/dist/node_modules/archiver/node_modules/async/tryEach.js +78 -0
  175. package/dist/node_modules/archiver/node_modules/async/unmemoize.js +25 -0
  176. package/dist/node_modules/archiver/node_modules/async/until.js +61 -0
  177. package/dist/node_modules/archiver/node_modules/async/waterfall.js +105 -0
  178. package/dist/node_modules/archiver/node_modules/async/whilst.js +78 -0
  179. package/dist/node_modules/archiver/node_modules/async/wrapSync.js +118 -0
  180. package/dist/node_modules/archiver/node_modules/readable-stream/errors-browser.js +127 -0
  181. package/dist/node_modules/archiver/node_modules/readable-stream/errors.js +116 -0
  182. package/dist/node_modules/archiver/node_modules/readable-stream/experimentalWarning.js +17 -0
  183. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_duplex.js +126 -0
  184. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_passthrough.js +37 -0
  185. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_readable.js +1027 -0
  186. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_transform.js +190 -0
  187. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_writable.js +641 -0
  188. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/async_iterator.js +180 -0
  189. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/buffer_list.js +183 -0
  190. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/destroy.js +96 -0
  191. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +86 -0
  192. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -0
  193. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/from.js +52 -0
  194. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/pipeline.js +86 -0
  195. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/state.js +22 -0
  196. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  197. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  198. package/dist/node_modules/archiver/node_modules/readable-stream/package.json +68 -0
  199. package/dist/node_modules/archiver/node_modules/readable-stream/readable-browser.js +9 -0
  200. package/dist/node_modules/archiver/node_modules/readable-stream/readable.js +16 -0
  201. package/dist/node_modules/archiver/node_modules/tar-stream/extract.js +257 -0
  202. package/dist/node_modules/archiver/node_modules/tar-stream/headers.js +295 -0
  203. package/dist/node_modules/archiver/node_modules/tar-stream/index.js +2 -0
  204. package/dist/node_modules/archiver/node_modules/tar-stream/pack.js +255 -0
  205. package/dist/node_modules/archiver/node_modules/tar-stream/package.json +58 -0
  206. package/dist/node_modules/archiver/node_modules/tar-stream/sandbox.js +11 -0
  207. package/dist/node_modules/archiver/package.json +1 -0
  208. package/dist/node_modules/cron-parser/.eslintrc.json +15 -0
  209. package/dist/node_modules/cron-parser/.travis.yml +7 -0
  210. package/dist/node_modules/cron-parser/LICENSE +21 -0
  211. package/dist/node_modules/cron-parser/component.json +11 -0
  212. package/dist/node_modules/cron-parser/index.d.ts +1 -0
  213. package/dist/node_modules/cron-parser/lib/date.js +252 -0
  214. package/dist/node_modules/cron-parser/lib/expression.js +983 -0
  215. package/dist/node_modules/cron-parser/lib/field_compactor.js +70 -0
  216. package/dist/node_modules/cron-parser/lib/field_stringify.js +38 -0
  217. package/dist/node_modules/cron-parser/lib/parser.js +1 -0
  218. package/dist/node_modules/cron-parser/node_modules/luxon/build/amd/luxon.js +8489 -0
  219. package/dist/node_modules/cron-parser/node_modules/luxon/build/cjs-browser/luxon.js +8487 -0
  220. package/dist/node_modules/cron-parser/node_modules/luxon/build/global/luxon.js +8490 -0
  221. package/dist/node_modules/cron-parser/node_modules/luxon/build/global/luxon.min.js +1 -0
  222. package/dist/node_modules/cron-parser/node_modules/luxon/build/node/luxon.js +7522 -0
  223. package/dist/node_modules/cron-parser/node_modules/luxon/package.json +96 -0
  224. package/dist/node_modules/cron-parser/node_modules/luxon/src/datetime.js +2169 -0
  225. package/dist/node_modules/cron-parser/node_modules/luxon/src/duration.js +880 -0
  226. package/dist/node_modules/cron-parser/node_modules/luxon/src/errors.js +61 -0
  227. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/conversions.js +157 -0
  228. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/diff.js +80 -0
  229. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/digits.js +76 -0
  230. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/english.js +233 -0
  231. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/formats.js +191 -0
  232. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/formatter.js +386 -0
  233. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/invalid.js +14 -0
  234. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/locale.js +482 -0
  235. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/regexParser.js +335 -0
  236. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/tokenParser.js +424 -0
  237. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/util.js +292 -0
  238. package/dist/node_modules/cron-parser/node_modules/luxon/src/impl/zoneUtil.js +36 -0
  239. package/dist/node_modules/cron-parser/node_modules/luxon/src/info.js +193 -0
  240. package/dist/node_modules/cron-parser/node_modules/luxon/src/interval.js +602 -0
  241. package/dist/node_modules/cron-parser/node_modules/luxon/src/luxon.js +26 -0
  242. package/dist/node_modules/cron-parser/node_modules/luxon/src/luxonFilled.js +13 -0
  243. package/dist/node_modules/cron-parser/node_modules/luxon/src/settings.js +137 -0
  244. package/dist/node_modules/cron-parser/node_modules/luxon/src/zone.js +88 -0
  245. package/dist/node_modules/cron-parser/node_modules/luxon/src/zones/IANAZone.js +191 -0
  246. package/dist/node_modules/cron-parser/node_modules/luxon/src/zones/fixedOffsetZone.js +94 -0
  247. package/dist/node_modules/cron-parser/node_modules/luxon/src/zones/invalidZone.js +53 -0
  248. package/dist/node_modules/cron-parser/node_modules/luxon/src/zones/localZone.js +63 -0
  249. package/dist/node_modules/cron-parser/package.json +1 -0
  250. package/dist/node_modules/cron-parser/test/31_of_month.js +17 -0
  251. package/dist/node_modules/cron-parser/test/bug.js +29 -0
  252. package/dist/node_modules/cron-parser/test/crondate.js +16 -0
  253. package/dist/node_modules/cron-parser/test/crontab.example +7 -0
  254. package/dist/node_modules/cron-parser/test/empty_around_comma.js +22 -0
  255. package/dist/node_modules/cron-parser/test/expression.js +1489 -0
  256. package/dist/node_modules/cron-parser/test/field_compactor.js +250 -0
  257. package/dist/node_modules/cron-parser/test/field_stringify.js +84 -0
  258. package/dist/node_modules/cron-parser/test/fields.js +32 -0
  259. package/dist/node_modules/cron-parser/test/increment_on_first_iteration.js +22 -0
  260. package/dist/node_modules/cron-parser/test/index-ts3.test-d.ts +133 -0
  261. package/dist/node_modules/cron-parser/test/index.test-d.ts +138 -0
  262. package/dist/node_modules/cron-parser/test/leap_year.js +17 -0
  263. package/dist/node_modules/cron-parser/test/parser.js +46 -0
  264. package/dist/node_modules/cron-parser/test/parser_crondate_formats.js +145 -0
  265. package/dist/node_modules/cron-parser/test/parser_day_of_month.js +169 -0
  266. package/dist/node_modules/cron-parser/test/prev_date.js +32 -0
  267. package/dist/node_modules/cron-parser/test/stringify.js +402 -0
  268. package/dist/node_modules/cron-parser/test/timezone.js +422 -0
  269. package/dist/node_modules/cron-parser/types/common.d.ts +131 -0
  270. package/dist/node_modules/cron-parser/types/index.d.ts +45 -0
  271. package/dist/node_modules/cron-parser/types/ts3/index.d.ts +28 -0
  272. package/dist/node_modules/fs-extra/LICENSE +15 -0
  273. package/dist/node_modules/fs-extra/lib/copy/copy.js +232 -0
  274. package/dist/node_modules/fs-extra/lib/copy/index.js +6 -0
  275. package/dist/node_modules/fs-extra/lib/copy-sync/copy-sync.js +166 -0
  276. package/dist/node_modules/fs-extra/lib/copy-sync/index.js +5 -0
  277. package/dist/node_modules/fs-extra/lib/empty/index.js +48 -0
  278. package/dist/node_modules/fs-extra/lib/ensure/file.js +69 -0
  279. package/dist/node_modules/fs-extra/lib/ensure/index.js +23 -0
  280. package/dist/node_modules/fs-extra/lib/ensure/link.js +61 -0
  281. package/dist/node_modules/fs-extra/lib/ensure/symlink-paths.js +99 -0
  282. package/dist/node_modules/fs-extra/lib/ensure/symlink-type.js +31 -0
  283. package/dist/node_modules/fs-extra/lib/ensure/symlink.js +63 -0
  284. package/dist/node_modules/fs-extra/lib/fs/index.js +130 -0
  285. package/dist/node_modules/fs-extra/lib/index.js +1 -0
  286. package/dist/node_modules/fs-extra/lib/json/index.js +16 -0
  287. package/dist/node_modules/fs-extra/lib/json/jsonfile.js +11 -0
  288. package/dist/node_modules/fs-extra/lib/json/output-json-sync.js +12 -0
  289. package/dist/node_modules/fs-extra/lib/json/output-json.js +12 -0
  290. package/dist/node_modules/fs-extra/lib/mkdirs/index.js +14 -0
  291. package/dist/node_modules/fs-extra/lib/mkdirs/make-dir.js +141 -0
  292. package/dist/node_modules/fs-extra/lib/move/index.js +6 -0
  293. package/dist/node_modules/fs-extra/lib/move/move.js +65 -0
  294. package/dist/node_modules/fs-extra/lib/move-sync/index.js +5 -0
  295. package/dist/node_modules/fs-extra/lib/move-sync/move-sync.js +47 -0
  296. package/dist/node_modules/fs-extra/lib/output/index.js +40 -0
  297. package/dist/node_modules/fs-extra/lib/path-exists/index.js +12 -0
  298. package/dist/node_modules/fs-extra/lib/remove/index.js +9 -0
  299. package/dist/node_modules/fs-extra/lib/remove/rimraf.js +302 -0
  300. package/dist/node_modules/fs-extra/lib/util/stat.js +139 -0
  301. package/dist/node_modules/fs-extra/lib/util/utimes.js +26 -0
  302. package/dist/node_modules/fs-extra/package.json +1 -0
  303. package/dist/node_modules/semver/LICENSE +15 -0
  304. package/dist/node_modules/semver/bin/semver.js +197 -0
  305. package/dist/node_modules/semver/classes/comparator.js +141 -0
  306. package/dist/node_modules/semver/classes/index.js +5 -0
  307. package/dist/node_modules/semver/classes/range.js +539 -0
  308. package/dist/node_modules/semver/classes/semver.js +302 -0
  309. package/dist/node_modules/semver/functions/clean.js +6 -0
  310. package/dist/node_modules/semver/functions/cmp.js +52 -0
  311. package/dist/node_modules/semver/functions/coerce.js +60 -0
  312. package/dist/node_modules/semver/functions/compare-build.js +7 -0
  313. package/dist/node_modules/semver/functions/compare-loose.js +3 -0
  314. package/dist/node_modules/semver/functions/compare.js +5 -0
  315. package/dist/node_modules/semver/functions/diff.js +65 -0
  316. package/dist/node_modules/semver/functions/eq.js +3 -0
  317. package/dist/node_modules/semver/functions/gt.js +3 -0
  318. package/dist/node_modules/semver/functions/gte.js +3 -0
  319. package/dist/node_modules/semver/functions/inc.js +19 -0
  320. package/dist/node_modules/semver/functions/lt.js +3 -0
  321. package/dist/node_modules/semver/functions/lte.js +3 -0
  322. package/dist/node_modules/semver/functions/major.js +3 -0
  323. package/dist/node_modules/semver/functions/minor.js +3 -0
  324. package/dist/node_modules/semver/functions/neq.js +3 -0
  325. package/dist/node_modules/semver/functions/parse.js +16 -0
  326. package/dist/node_modules/semver/functions/patch.js +3 -0
  327. package/dist/node_modules/semver/functions/prerelease.js +6 -0
  328. package/dist/node_modules/semver/functions/rcompare.js +3 -0
  329. package/dist/node_modules/semver/functions/rsort.js +3 -0
  330. package/dist/node_modules/semver/functions/satisfies.js +10 -0
  331. package/dist/node_modules/semver/functions/sort.js +3 -0
  332. package/dist/node_modules/semver/functions/valid.js +6 -0
  333. package/dist/node_modules/semver/index.js +1 -0
  334. package/dist/node_modules/semver/internal/constants.js +35 -0
  335. package/dist/node_modules/semver/internal/debug.js +9 -0
  336. package/dist/node_modules/semver/internal/identifiers.js +23 -0
  337. package/dist/node_modules/semver/internal/parse-options.js +15 -0
  338. package/dist/node_modules/semver/internal/re.js +217 -0
  339. package/dist/node_modules/semver/package.json +1 -0
  340. package/dist/node_modules/semver/preload.js +2 -0
  341. package/dist/node_modules/semver/range.bnf +16 -0
  342. package/dist/node_modules/semver/ranges/gtr.js +4 -0
  343. package/dist/node_modules/semver/ranges/intersects.js +7 -0
  344. package/dist/node_modules/semver/ranges/ltr.js +4 -0
  345. package/dist/node_modules/semver/ranges/max-satisfying.js +25 -0
  346. package/dist/node_modules/semver/ranges/min-satisfying.js +24 -0
  347. package/dist/node_modules/semver/ranges/min-version.js +61 -0
  348. package/dist/node_modules/semver/ranges/outside.js +80 -0
  349. package/dist/node_modules/semver/ranges/simplify.js +47 -0
  350. package/dist/node_modules/semver/ranges/subset.js +247 -0
  351. package/dist/node_modules/semver/ranges/to-comparators.js +8 -0
  352. package/dist/node_modules/semver/ranges/valid.js +11 -0
  353. package/dist/node_modules/yauzl/LICENSE +21 -0
  354. package/dist/node_modules/yauzl/fd-slicer.js +314 -0
  355. package/dist/node_modules/yauzl/index.js +1 -0
  356. package/dist/node_modules/yauzl/package.json +1 -0
  357. package/dist/server/adapters/database.d.ts +9 -0
  358. package/dist/server/adapters/database.js +486 -0
  359. package/dist/server/collections/backup-settings.d.ts +2 -0
  360. package/dist/server/collections/backup-settings.js +67 -0
  361. package/dist/server/index.d.ts +1 -0
  362. package/dist/server/index.js +42 -0
  363. package/dist/server/managers/backup.d.ts +41 -0
  364. package/dist/server/managers/backup.js +448 -0
  365. package/dist/server/managers/restore.d.ts +24 -0
  366. package/dist/server/managers/restore.js +434 -0
  367. package/dist/server/plugin.d.ts +26 -0
  368. package/dist/server/plugin.js +251 -0
  369. package/dist/server/resourcers/backup-cli.d.ts +23 -0
  370. package/dist/server/resourcers/backup-cli.js +237 -0
  371. package/dist/server/resourcers/backups.d.ts +24 -0
  372. package/dist/server/resourcers/backups.js +192 -0
  373. package/dist/server/types.d.ts +12 -0
  374. package/dist/server/types.js +24 -0
  375. package/dist/server/utils.d.ts +48 -0
  376. package/dist/server/utils.js +323 -0
  377. package/dist/swagger/index.json +313 -0
  378. package/package.json +51 -0
  379. package/server.d.ts +2 -0
  380. package/server.js +1 -0
@@ -0,0 +1,434 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __create = Object.create;
11
+ var __defProp = Object.defineProperty;
12
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13
+ var __getOwnPropNames = Object.getOwnPropertyNames;
14
+ var __getProtoOf = Object.getPrototypeOf;
15
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
16
+ var __export = (target, all) => {
17
+ for (var name in all)
18
+ __defProp(target, name, { get: all[name], enumerable: true });
19
+ };
20
+ var __copyProps = (to, from, except, desc) => {
21
+ if (from && typeof from === "object" || typeof from === "function") {
22
+ for (let key of __getOwnPropNames(from))
23
+ if (!__hasOwnProp.call(to, key) && key !== except)
24
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
25
+ }
26
+ return to;
27
+ };
28
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
29
+ // If the importer is in node compatibility mode or this is not an ESM
30
+ // file that has been converted to a CommonJS file using a Babel-
31
+ // compatible transform (i.e. "__esModule" has not been set), then set
32
+ // "default" to the CommonJS "module.exports" for node compatibility.
33
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
34
+ mod
35
+ ));
36
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
+ var restore_exports = {};
38
+ __export(restore_exports, {
39
+ RestoreManager: () => RestoreManager
40
+ });
41
+ module.exports = __toCommonJS(restore_exports);
42
+ var crypto = __toESM(require("crypto"));
43
+ var import_fs_extra = __toESM(require("fs-extra"));
44
+ var import_promises = __toESM(require("fs/promises"));
45
+ var import_path = __toESM(require("path"));
46
+ var import_utils = require("@nocobase/utils");
47
+ var import_semver = __toESM(require("semver"));
48
+ var import_util = require("util");
49
+ var import_database = require("../adapters/database");
50
+ var import_utils2 = require("../utils");
51
+ const RESTORE_STEPS = {
52
+ BEGIN: "restoring begin",
53
+ DATABASE: "restoring database",
54
+ UPLOADS: "restoring uploaded files",
55
+ END: "restoring end"
56
+ };
57
+ class RestoreManager {
58
+ ctx;
59
+ #dbAdapter;
60
+ #backupDir;
61
+ #tempDir;
62
+ #uploadDir;
63
+ #aesKeyPath;
64
+ constructor(ctx, dbOptions) {
65
+ this.ctx = ctx;
66
+ this.#dbAdapter = (0, import_database.getDBAdapter)(dbOptions || ctx.app.db.options);
67
+ this.#backupDir = (0, import_utils.storagePathJoin)("backups", ctx.app.name);
68
+ this.#tempDir = (0, import_utils.storagePathJoin)("tmp", "backups", ctx.app.name);
69
+ this.#uploadDir = (0, import_utils.storagePathJoin)("uploads");
70
+ this.#aesKeyPath = (0, import_utils.storagePathJoin)("apps", ctx.app.name, "aes_key.dat");
71
+ }
72
+ async restoreFromBackup(backupFileName, taskId, password, tolerentMode, options) {
73
+ const backupFilePath = this.#getValidatedBackupFilePath(backupFileName);
74
+ await this.restore(backupFilePath, taskId, password, tolerentMode, void 0, options);
75
+ }
76
+ async restoreFromUpload(backupFile, taskId, password, tolerentMode, options) {
77
+ const backupFilePath = backupFile.path;
78
+ await this.restore(backupFilePath, taskId, password, tolerentMode, void 0, options);
79
+ }
80
+ async restoreCLI(filePath, password, tolerentMode, skipRevertOnError, options) {
81
+ await this.#dbAdapter.check("restore");
82
+ const extractedDir = await this.#decompressFiles(filePath, password);
83
+ const backupFiles = await import_promises.default.readdir(extractedDir);
84
+ const dbFile = backupFiles.find((file) => file === "data");
85
+ const metadataFile = backupFiles.find((file) => file === "_metadata.json");
86
+ const uploadsExist = backupFiles.includes("uploads");
87
+ if (!dbFile || !metadataFile) {
88
+ this.ctx.logger.error("Not a valid backup file", { module: import_utils2.BACKUPS });
89
+ throw new Error(this.#t("Not a valid backup file"));
90
+ }
91
+ const metadata = await this.#parseMetadataFile(import_path.default.join(extractedDir, metadataFile), tolerentMode, options);
92
+ try {
93
+ await this.#restoreDataCLI(extractedDir, dbFile, uploadsExist, metadata);
94
+ } catch (error) {
95
+ const dbVersion = await (0, import_utils2.getDBVersion)(this.ctx.app.db);
96
+ const restoreClientVersion = await this.#dbAdapter.clientVersion("restore");
97
+ this.ctx.logger.error(
98
+ `Error restoring backup: "${error.message}".
99
+ Database Version: backup[${metadata.database.version}], current[${dbVersion}],
100
+ Client Version: backup[${metadata.database.backupClientVersion}], restore[${restoreClientVersion}]
101
+ `,
102
+ { module: import_utils2.BACKUPS }
103
+ );
104
+ if (tolerentMode && error.message.includes("ignored")) {
105
+ this.ctx.logger.warn("Tolerent mode enabled, ignoring the error and continue the upgrade.", {
106
+ module: import_utils2.BACKUPS
107
+ });
108
+ await this.#restoreFilesAndCleanup(uploadsExist, extractedDir);
109
+ await this.ctx.app.upgrade();
110
+ } else if (!skipRevertOnError) {
111
+ await this.#revertDbRestore();
112
+ }
113
+ }
114
+ }
115
+ #getValidatedBackupFilePath(backupFileName) {
116
+ const filePath = (0, import_utils2.resolvePathWithinBase)(this.#backupDir, backupFileName);
117
+ if (import_path.default.basename(backupFileName) !== backupFileName || !backupFileName.endsWith(`.${import_utils2.BACKUP_EXTENSION}`) || !filePath || !import_fs_extra.default.existsSync(filePath)) {
118
+ throw new Error(this.#t("FILE_NOT_FOUND", backupFileName));
119
+ }
120
+ return filePath;
121
+ }
122
+ async #restoreDataCLI(extractedDir, dbFile, restoreUploads, metadata) {
123
+ const tmpBackupDir = import_path.default.join(this.#tempDir, "before-restore");
124
+ try {
125
+ await import_fs_extra.default.mkdir(tmpBackupDir, { recursive: true });
126
+ await this.ctx.app.emitAsync("beforeStop");
127
+ await this.ctx.app.emitAsync("afterStop");
128
+ await this.#dbAdapter.restore(import_path.default.join(extractedDir, dbFile), metadata.database.schema);
129
+ this.ctx.logger.info("Database restored successfully", { module: import_utils2.BACKUPS });
130
+ await this.#restoreFilesAndCleanup(restoreUploads, extractedDir);
131
+ } catch (error) {
132
+ this.ctx.logger.error(`Error restoring backup: ${error.message}. Trying to revert the backup process`, {
133
+ module: import_utils2.BACKUPS
134
+ });
135
+ throw error;
136
+ }
137
+ }
138
+ async getStatusCache() {
139
+ try {
140
+ return this.ctx.app.cacheManager.getCache(import_utils2.RESTORE_TASKS_CACHE_NAME);
141
+ } catch (e) {
142
+ return await this.ctx.app.cacheManager.createCache({
143
+ name: import_utils2.RESTORE_TASKS_CACHE_NAME,
144
+ store: "memory",
145
+ ttl: import_utils2.RESTORE_TASKS_CACHE_TTL,
146
+ max: 10
147
+ });
148
+ }
149
+ }
150
+ async restore(filePath, taskId, password, tolerentMode, skipRevertOnError, options) {
151
+ await this.#dbAdapter.check("restore");
152
+ const extractedDir = await this.#decompressFiles(filePath, password);
153
+ const backupFiles = await import_promises.default.readdir(extractedDir);
154
+ const dbFile = backupFiles.find((file) => file === "data");
155
+ const metadataFile = backupFiles.find((file) => file === "_metadata.json");
156
+ const uploadsExist = backupFiles.includes("uploads");
157
+ if (!dbFile || !metadataFile) {
158
+ this.ctx.logger.error("Not a valid backup file", { module: import_utils2.BACKUPS });
159
+ throw new Error(this.#t("Not a valid backup file"));
160
+ }
161
+ const metadata = await this.#parseMetadataFile(import_path.default.join(extractedDir, metadataFile), tolerentMode, options);
162
+ this.#restoreData(extractedDir, dbFile, uploadsExist, taskId, metadata).catch(async (error) => {
163
+ try {
164
+ const dbVersion = await (0, import_utils2.getDBVersion)(this.ctx.app.db);
165
+ const restoreClientVersion = await this.#dbAdapter.clientVersion("restore");
166
+ this.ctx.logger.error(
167
+ `Error restoring backup: "${error.message}".
168
+ Database Version: backup[${metadata.database.version}], current[${dbVersion}],
169
+ Client Version: backup[${metadata.database.backupClientVersion}], restore[${restoreClientVersion}]
170
+ `,
171
+ { module: import_utils2.BACKUPS }
172
+ );
173
+ if (tolerentMode && error.message.includes("ignored")) {
174
+ this.ctx.logger.warn("Tolerent mode enabled, ignoring the error and continue the upgrade.", {
175
+ module: import_utils2.BACKUPS
176
+ });
177
+ await this.#restoreFilesAndCleanup(uploadsExist, extractedDir);
178
+ await this.ctx.app.runCommand("upgrade");
179
+ } else {
180
+ if (!tolerentMode && this.#dbAdapter.dbOpts.dialect === "postgres") {
181
+ const backupClientVersion = Number((0, import_utils2.toMajorVersion)(metadata.database.backupClientVersion));
182
+ const dbServerVersion = Number((0, import_utils2.toMajorVersion)(dbVersion));
183
+ if (backupClientVersion > 16 && dbServerVersion <= 16) {
184
+ const statusCache = await this.getStatusCache();
185
+ await statusCache.set(taskId, {
186
+ message: this.#t("ERROR_PG_DUMP_LT_17")
187
+ });
188
+ }
189
+ }
190
+ if (!skipRevertOnError) {
191
+ await this.#revertDbRestore();
192
+ }
193
+ await this.ctx.app.runCommand("upgrade");
194
+ }
195
+ } catch (err) {
196
+ this.ctx.logger.error(`Error handling restore failure: ${err.message}`, { module: import_utils2.BACKUPS });
197
+ }
198
+ });
199
+ }
200
+ async #parseMetadataFile(filePath, tolerentMode, options) {
201
+ let metadata;
202
+ try {
203
+ const metadataContent = await import_promises.default.readFile(filePath, "utf-8");
204
+ metadata = JSON.parse(metadataContent);
205
+ } catch (error) {
206
+ this.ctx.logger.error(`Error parsing metadata file: ${error.message}`, { module: import_utils2.BACKUPS });
207
+ throw new Error(this.#t("ERROR_PARSING_BACKUP_FILE", error.message));
208
+ }
209
+ await this.#assertMetadata(metadata, tolerentMode, options);
210
+ return metadata;
211
+ }
212
+ async #assertMetadata(metadata, tolerentMode, options) {
213
+ var _a, _b, _c, _d, _e, _f;
214
+ const { version: backupVersion } = metadata;
215
+ const packageVersion = this.ctx.app.getPackageVersion();
216
+ const extractVersion = (version) => {
217
+ const match = version.match(/^(\d+\.\d+\.\d+)/);
218
+ return match ? match[0] : version;
219
+ };
220
+ if (import_semver.default.gt(extractVersion(backupVersion), extractVersion(packageVersion))) {
221
+ throw new Error(this.#t("BACKUP_VERSION_MISMATCH", { backupVersion, currentVersion: packageVersion }));
222
+ }
223
+ const { dialect, underscored, tablePrefix, schema } = this.#dbAdapter.dbOpts;
224
+ if (metadata.database.dialect !== dialect) {
225
+ throw new Error(this.#t("Database dialect mismatch"));
226
+ }
227
+ if ((metadata.database.underscored || false) != (underscored || false)) {
228
+ throw new Error(this.#t("Database underscored mismatch"));
229
+ }
230
+ if ((metadata.database.tablePrefix || "") !== (tablePrefix || "")) {
231
+ throw new Error(this.#t("Database table prefix mismatch"));
232
+ }
233
+ const forceSchemaRestore = (options == null ? void 0 : options.forceSchemaRestore) === true && dialect === "postgres";
234
+ if (!forceSchemaRestore) {
235
+ if (((_b = (_a = this.ctx.request) == null ? void 0 : _a.body) == null ? void 0 : _b.dbSchema) && ((_d = (_c = this.ctx.request) == null ? void 0 : _c.body) == null ? void 0 : _d.dbSchema) !== (schema || "public")) {
236
+ throw new Error(this.#t("Database schema mismatch"));
237
+ }
238
+ if (!((_f = (_e = this.ctx.request) == null ? void 0 : _e.body) == null ? void 0 : _f.dbSchema) && (schema || "") !== (metadata.database.schema || "")) {
239
+ throw new Error(this.#t("Database schema mismatch"));
240
+ }
241
+ }
242
+ const dbVersionInBackup = (0, import_utils2.toMajorVersion)(metadata.database.version);
243
+ if (!tolerentMode && dbVersionInBackup) {
244
+ const dbVersionRaw = await (0, import_utils2.getDBVersion)(this.ctx.app.db);
245
+ const dbVersion = (0, import_utils2.toMajorVersion)(dbVersionRaw);
246
+ if (dbVersionInBackup > dbVersion) {
247
+ throw new Error(
248
+ this.#t(
249
+ "Database version is lower than the backup, if you really want to restore, please enable the tolerent mode."
250
+ )
251
+ );
252
+ }
253
+ }
254
+ const pluginsInBackup = metadata.plugins;
255
+ const missingPlugins = pluginsInBackup.filter((plugin) => {
256
+ try {
257
+ require.resolve(plugin.packageName);
258
+ return false;
259
+ } catch (error) {
260
+ return true;
261
+ }
262
+ });
263
+ if (missingPlugins.length) {
264
+ const missingPluginsMsg = this.#t(
265
+ "WARN_RESTORING_BACKUP_MISSING_PLUGINS",
266
+ missingPlugins.map((plugin) => plugin.name).join(", ")
267
+ );
268
+ this.ctx.logger.warn(missingPluginsMsg, {
269
+ module: import_utils2.BACKUPS
270
+ });
271
+ }
272
+ return true;
273
+ }
274
+ async #decompressFiles(filePath, password) {
275
+ const fileBaseName = import_path.default.basename(filePath, `.${import_utils2.BACKUP_EXTENSION}`);
276
+ const outputDir = import_path.default.join(this.#tempDir, fileBaseName);
277
+ const inputFileStream = import_fs_extra.default.createReadStream(filePath);
278
+ let inputStream = null;
279
+ try {
280
+ await import_promises.default.mkdir(outputDir, { recursive: true });
281
+ inputStream = await this.#createDecryptedStream(inputFileStream, password);
282
+ const extractor = new import_utils2.Extractor({ path: outputDir });
283
+ const pipeline = (0, import_util.promisify)(require("stream").pipeline);
284
+ await pipeline(inputStream, extractor);
285
+ this.ctx.logger.info(`Backup file extracted to: ${outputDir}`, { module: import_utils2.BACKUPS });
286
+ } catch (error) {
287
+ this.ctx.logger.error(`Error decrypting file: ${error.message}. Please confirm your password.`, {
288
+ module: import_utils2.BACKUPS
289
+ });
290
+ throw new Error(this.#t("ERROR_DECRYPTING_PLS_CHECK_PASSWORD", error.message));
291
+ } finally {
292
+ if (!inputFileStream.closed) {
293
+ inputFileStream.close();
294
+ }
295
+ if (inputStream && inputStream !== inputFileStream && !inputStream.destroyed) {
296
+ inputStream.destroy();
297
+ }
298
+ }
299
+ return outputDir;
300
+ }
301
+ async #createDecryptedStream(input, password) {
302
+ if (!password) {
303
+ return input;
304
+ }
305
+ try {
306
+ const iv = await new Promise((resolve, reject) => {
307
+ let ivBuffer = Buffer.alloc(0);
308
+ const onReadable = () => {
309
+ let chunk;
310
+ while (null !== (chunk = input.read(16 - ivBuffer.length))) {
311
+ ivBuffer = Buffer.concat([ivBuffer, chunk]);
312
+ if (ivBuffer.length === 16) {
313
+ input.removeListener("readable", onReadable);
314
+ resolve(ivBuffer);
315
+ return;
316
+ }
317
+ }
318
+ };
319
+ input.once("error", (err) => {
320
+ input.removeListener("readable", onReadable);
321
+ reject(err);
322
+ });
323
+ input.once("end", () => {
324
+ input.removeListener("readable", onReadable);
325
+ if (ivBuffer.length < 16) {
326
+ reject(
327
+ new Error("Failed to read complete 16-byte IV from stream. File may be too short or not encrypted.")
328
+ );
329
+ }
330
+ });
331
+ input.on("readable", onReadable);
332
+ });
333
+ const key = await (0, import_util.promisify)(crypto.scrypt)(password, import_utils2.FILE_ENCRYPTION_SALT, 32);
334
+ const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
335
+ decipher.on("error", (err) => {
336
+ this.ctx.logger.error(`Decryption error: ${err.message}.`, { module: import_utils2.BACKUPS });
337
+ });
338
+ return input.pipe(decipher);
339
+ } catch (error) {
340
+ this.ctx.logger.error(`Error setting up decryption stream: ${error.message}`, { module: import_utils2.BACKUPS });
341
+ throw error;
342
+ }
343
+ }
344
+ async #restoreData(extractedDir, dbFile, restoreUploads, taskId, metadata) {
345
+ this.#notify(RESTORE_STEPS.BEGIN);
346
+ this.#notify(RESTORE_STEPS.DATABASE);
347
+ const statusCache = await this.getStatusCache();
348
+ const tmpBackupDir = import_path.default.join(this.#tempDir, "before-restore");
349
+ try {
350
+ await import_promises.default.mkdir(tmpBackupDir, { recursive: true });
351
+ await this.#dbAdapter.backup(tmpBackupDir);
352
+ await this.ctx.app.emitAsync("beforeStop");
353
+ await this.ctx.app.emitAsync("afterStop");
354
+ await this.#dbAdapter.restore(import_path.default.join(extractedDir, dbFile), metadata.database.schema);
355
+ this.ctx.logger.info("Database restored successfully", { module: import_utils2.BACKUPS });
356
+ if (restoreUploads) {
357
+ this.#notify(RESTORE_STEPS.UPLOADS);
358
+ }
359
+ await this.#restoreFilesAndCleanup(restoreUploads, extractedDir);
360
+ } catch (error) {
361
+ await statusCache.set(taskId, {
362
+ inProgress: false,
363
+ message: error.message
364
+ });
365
+ this.ctx.logger.error(`Error restoring backup: ${error.message}. Trying to revert the backup process`, {
366
+ module: import_utils2.BACKUPS
367
+ });
368
+ throw error;
369
+ } finally {
370
+ this.#notify(RESTORE_STEPS.END);
371
+ }
372
+ await statusCache.set(taskId, {
373
+ inProgress: false
374
+ });
375
+ await this.ctx.app.runCommand("upgrade");
376
+ }
377
+ async #restoreFilesAndCleanup(restoreUploads, extractedDir) {
378
+ if (restoreUploads) {
379
+ const uploadsDir = import_path.default.join(extractedDir, "uploads");
380
+ await import_promises.default.mkdir(this.#uploadDir, { recursive: true });
381
+ await import_fs_extra.default.copy(uploadsDir, this.#uploadDir, { overwrite: true });
382
+ }
383
+ const aesKeyPath = import_path.default.join(extractedDir, "aes_key.dat");
384
+ if (await import_fs_extra.default.pathExists(aesKeyPath)) {
385
+ await import_fs_extra.default.copy(aesKeyPath, this.#aesKeyPath, { overwrite: true });
386
+ }
387
+ import_fs_extra.default.rm(extractedDir, { recursive: true }).catch((e) => {
388
+ this.ctx.logger.error(`Error cleaning up the temp directory: ${e.message}`, { module: import_utils2.BACKUPS });
389
+ });
390
+ }
391
+ async #revertDbRestore() {
392
+ this.ctx.logger.info("Reverting the database restore process", { module: import_utils2.BACKUPS });
393
+ const dbFile = import_path.default.join(this.#tempDir, "before-restore", "data");
394
+ if (await import_fs_extra.default.pathExists(dbFile)) {
395
+ try {
396
+ await this.#dbAdapter.restore(dbFile, this.#dbAdapter.dbOpts.schema);
397
+ } catch (error) {
398
+ this.ctx.logger.error("Error reverting the database restore process", { module: import_utils2.BACKUPS });
399
+ }
400
+ } else {
401
+ this.ctx.logger.error("Database backup file for revert restore process not found", { module: import_utils2.BACKUPS });
402
+ }
403
+ }
404
+ async #notify(step) {
405
+ const app = await this.ctx.app;
406
+ if (step === RESTORE_STEPS.BEGIN) {
407
+ app.emit("maintaining", { status: "command_begin" });
408
+ return;
409
+ }
410
+ if (step === RESTORE_STEPS.END) {
411
+ app.emit("maintaining", { status: "command_end" });
412
+ return;
413
+ }
414
+ app.emit("maintainingMessageChanged", {
415
+ message: `${step}...`,
416
+ maintainingStatus: {
417
+ command: {
418
+ name: "APP restoring"
419
+ },
420
+ status: "command_running"
421
+ }
422
+ });
423
+ }
424
+ #t(message, detail) {
425
+ if (typeof detail === "object") {
426
+ return this.ctx.i18n.t(message, { ...detail, ns: import_utils2.PLUGIN_BACKUPS_NAME, interpolation: { escapeValue: false } });
427
+ }
428
+ return this.ctx.i18n.t(message, { detail, ns: import_utils2.PLUGIN_BACKUPS_NAME, interpolation: { escapeValue: false } });
429
+ }
430
+ }
431
+ // Annotate the CommonJS export names for ESM import in node:
432
+ 0 && (module.exports = {
433
+ RestoreManager
434
+ });
@@ -0,0 +1,26 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import { InstallOptions, Plugin } from '@nocobase/server';
10
+ export declare class PluginBackupsServer extends Plugin {
11
+ #private;
12
+ afterAdd(): Promise<void>;
13
+ beforeLoad(): Promise<void>;
14
+ load(): Promise<void>;
15
+ install(options?: InstallOptions): Promise<void>;
16
+ private runAutoBackupTask;
17
+ afterEnable(): Promise<void>;
18
+ afterDisable(): Promise<void>;
19
+ remove(): Promise<void>;
20
+ backup(): Promise<string>;
21
+ restore(backupFilePath: string, options?: {
22
+ skipRevertOnError?: boolean;
23
+ }): Promise<void>;
24
+ static staticImport(): Promise<void>;
25
+ }
26
+ export default PluginBackupsServer;