@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,42 @@
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 server_exports = {};
38
+ __export(server_exports, {
39
+ default: () => import_plugin.default
40
+ });
41
+ module.exports = __toCommonJS(server_exports);
42
+ var import_plugin = __toESM(require("./plugin"));
@@ -0,0 +1,41 @@
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
+ /// <reference types="node" />
10
+ import { ResourcerContext } from '@nocobase/resourcer';
11
+ import Application from '@nocobase/server';
12
+ import { Readable } from 'stream';
13
+ export interface BackupSettings {
14
+ storageId?: string;
15
+ encryptionPassword: string;
16
+ enableFilesBackup: boolean;
17
+ keep?: number;
18
+ scheduled: boolean;
19
+ cron: string;
20
+ }
21
+ export interface BackupFile {
22
+ name: string;
23
+ fileSize?: string;
24
+ createdAt?: Date;
25
+ inProgress: boolean;
26
+ }
27
+ export interface BackupTaskResult {
28
+ message?: string;
29
+ inProgress: boolean;
30
+ }
31
+ export declare class BackupManager {
32
+ #private;
33
+ app: Application;
34
+ ctx: ResourcerContext | null;
35
+ constructor(app: Application, ctx: ResourcerContext | null, settings: BackupSettings);
36
+ createBackupName(): Promise<string>;
37
+ backup(fileBaseName: string, opts?: BackupSettings): Promise<string>;
38
+ destroy(fileName: string): Promise<void>;
39
+ list(): Promise<BackupFile[]>;
40
+ createReadStream(fileName: string): Promise<Readable>;
41
+ }
@@ -0,0 +1,448 @@
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 backup_exports = {};
38
+ __export(backup_exports, {
39
+ BackupManager: () => BackupManager
40
+ });
41
+ module.exports = __toCommonJS(backup_exports);
42
+ var import_plugin_file_manager = __toESM(require("@nocobase/plugin-file-manager"));
43
+ var import_archiver = __toESM(require("archiver"));
44
+ var crypto = __toESM(require("crypto"));
45
+ var import_dayjs = __toESM(require("dayjs"));
46
+ var fs = __toESM(require("fs"));
47
+ var import_promises = __toESM(require("fs/promises"));
48
+ var import_path = __toESM(require("path"));
49
+ var import_utils = require("@nocobase/utils");
50
+ var import_util = require("util");
51
+ var import_database = require("../adapters/database");
52
+ var import_utils2 = require("../utils");
53
+ class BackupManager {
54
+ app;
55
+ ctx;
56
+ // when triggered by cron job, ctx is null
57
+ #settings;
58
+ #dbAdapter;
59
+ #backupDir;
60
+ #tempDir;
61
+ #uploadDir;
62
+ #aesKeyPath;
63
+ constructor(app, ctx, settings) {
64
+ this.app = app;
65
+ this.ctx = ctx;
66
+ this.#settings = settings;
67
+ this.#dbAdapter = (0, import_database.getDBAdapter)(app.db.options);
68
+ this.#backupDir = (0, import_utils.storagePathJoin)("backups", app.name);
69
+ this.#tempDir = (0, import_utils.storagePathJoin)("tmp", "backups", app.name);
70
+ this.#uploadDir = (0, import_utils.storagePathJoin)("uploads");
71
+ this.#aesKeyPath = (0, import_utils.storagePathJoin)("apps", app.name, "aes_key.dat");
72
+ }
73
+ async createBackupName() {
74
+ await this.#dbAdapter.check("backup");
75
+ await import_promises.default.mkdir(this.#backupDir, { recursive: true });
76
+ await import_promises.default.mkdir(this.#tempDir, { recursive: true });
77
+ await import_promises.default.mkdir(this.#uploadDir, { recursive: true });
78
+ return this.#generateFileBaseName();
79
+ }
80
+ async backup(fileBaseName, opts = this.#settings) {
81
+ const contentPath = import_path.default.join(this.#tempDir, fileBaseName);
82
+ return this.#runBackupTask(opts, fileBaseName, contentPath);
83
+ }
84
+ async destroy(fileName) {
85
+ const filePath = this.#getValidatedFilePath(fileName);
86
+ await import_promises.default.unlink(filePath);
87
+ }
88
+ async list() {
89
+ const inProgressBackups = await this.#listProgressBackups();
90
+ const completedBackups = await this.#listCompletedBackups(inProgressBackups);
91
+ const cleanStaleLockFiles = async () => {
92
+ const statusCache = this.app.cacheManager.getCache(import_utils2.BACKUP_TASKS_CACHE_NAME);
93
+ for (const backup of inProgressBackups) {
94
+ if (!await statusCache.get(backup.name)) {
95
+ await this.#removeLockFile(import_path.default.basename(backup.name, `.${import_utils2.BACKUP_EXTENSION}`));
96
+ await statusCache.del(backup.name);
97
+ }
98
+ }
99
+ };
100
+ cleanStaleLockFiles().catch(() => {
101
+ });
102
+ return [...inProgressBackups, ...completedBackups];
103
+ }
104
+ async createReadStream(fileName) {
105
+ const filePath = this.#getValidatedFilePath(fileName);
106
+ return fs.createReadStream(filePath);
107
+ }
108
+ #getValidatedFilePath(fileName) {
109
+ const filePath = (0, import_utils2.resolvePathWithinBase)(this.#backupDir, fileName);
110
+ if (import_path.default.basename(fileName) !== fileName || !fileName.endsWith(`.${import_utils2.BACKUP_EXTENSION}`) || !filePath || !fs.existsSync(filePath)) {
111
+ throw new Error(this.#t("FILE_NOT_FOUND", fileName));
112
+ }
113
+ return filePath;
114
+ }
115
+ async #runBackupTask(opts, fileBaseName, contentPath) {
116
+ try {
117
+ await this.#createLockFile(fileBaseName);
118
+ await this.#createContentPath(contentPath);
119
+ await this.#dbAdapter.backup(contentPath, !this.app.pm.has("collection-fdw"));
120
+ await this.#metadataBackup(opts, contentPath);
121
+ const password = opts.encryptionPassword || void 0;
122
+ const filePath = await this.#compressFiles(contentPath, fileBaseName, password, opts);
123
+ await this.#uploadFiles(filePath, opts.storageId);
124
+ return filePath;
125
+ } catch (error) {
126
+ this.app.logger.error(`Error running backup task: ${error.message}`, { module: import_utils2.BACKUPS });
127
+ import_promises.default.unlink(import_path.default.join(this.#backupDir, `${fileBaseName}.${import_utils2.BACKUP_EXTENSION}`)).catch(() => {
128
+ });
129
+ throw new Error(this.#t("ERROR_TRIGGERING_BACKUP", this.#readableErrorMsg(error)));
130
+ } finally {
131
+ this.#removeContentPath(contentPath).catch(() => {
132
+ });
133
+ this.#removeLockFile(fileBaseName).catch(() => {
134
+ }).finally(() => {
135
+ if (opts.keep > 0) {
136
+ this.#dropOldBackups(opts.keep).catch(() => {
137
+ });
138
+ }
139
+ });
140
+ }
141
+ }
142
+ #readableErrorMsg(error) {
143
+ const message = error.message;
144
+ const { database } = this.#dbAdapter.dbOpts;
145
+ const msg = message.replace(new RegExp(`.*data\\s+${database}`), "");
146
+ if (msg.indexOf("pg_dump: error: aborting because of server version") !== -1) {
147
+ return this.#t("PG_DUMP_SERVER_VERSION_MISMATCH");
148
+ }
149
+ return msg;
150
+ }
151
+ async #metadataBackup(opts, dir) {
152
+ const { dialect, underscored, tablePrefix, schema } = this.#dbAdapter.dbOpts;
153
+ const installedPlugins = this.app.pm.getPlugins();
154
+ const plugins = [...installedPlugins.values()].filter((p) => p.enabled).map((installed) => {
155
+ return {
156
+ name: installed.options.name,
157
+ version: installed.options.version,
158
+ packageName: installed.options.packageName
159
+ };
160
+ });
161
+ const metadata = {
162
+ enableFilesBackup: opts.enableFilesBackup,
163
+ version: await this.app.version.get(),
164
+ database: {
165
+ dialect,
166
+ underscored,
167
+ tablePrefix,
168
+ schema,
169
+ version: await (0, import_utils2.getDBVersion)(this.app.db),
170
+ backupClientVersion: await this.#dbAdapter.clientVersion("backup")
171
+ },
172
+ plugins
173
+ };
174
+ const metadataFilePath = import_path.default.join(dir, "_metadata.json");
175
+ try {
176
+ await import_promises.default.writeFile(metadataFilePath, JSON.stringify(metadata, null, 2));
177
+ } catch (error) {
178
+ throw new Error(this.#t("ERROR_SAVING_MEATADATA", error.message));
179
+ }
180
+ }
181
+ async #compressFiles(dir, fileBaseName, password, opts) {
182
+ const archive = (0, import_archiver.default)("zip", {
183
+ zlib: { level: 9 }
184
+ });
185
+ const filePath = import_path.default.join(this.#backupDir, `${fileBaseName}.${import_utils2.BACKUP_EXTENSION}`);
186
+ const outputFileStream = fs.createWriteStream(filePath);
187
+ try {
188
+ const output = await this.#createEncryptedStream(outputFileStream, password);
189
+ const onClose = new Promise((resolve, reject) => {
190
+ output.on("close", () => {
191
+ this.app.logger.info(`Backup file created: ${filePath}`, { module: import_utils2.BACKUPS });
192
+ resolve();
193
+ });
194
+ output.on("end", () => {
195
+ this.app.logger.info(`File ${filePath} has been drained`, { module: import_utils2.BACKUPS });
196
+ });
197
+ output.on("error", reject);
198
+ archive.on("warning", (err) => {
199
+ if (err.code === "ENOENT") {
200
+ this.app.logger.warn(err.message, { module: import_utils2.BACKUPS });
201
+ } else {
202
+ reject(err);
203
+ }
204
+ });
205
+ archive.on("error", (err) => {
206
+ reject(err);
207
+ });
208
+ });
209
+ archive.pipe(output);
210
+ archive.directory(dir, false);
211
+ if (opts.enableFilesBackup) {
212
+ const fileCollections = [...this.app.db.collections.values()].filter((item) => {
213
+ return item.options.template === "file";
214
+ });
215
+ const filesPromises = fileCollections.map(async (collection) => {
216
+ try {
217
+ const files = await this.app.db.getRepository(collection.name).find({
218
+ filter: {
219
+ "storage.type": "local"
220
+ }
221
+ });
222
+ return {
223
+ collectionName: collection.name,
224
+ files
225
+ };
226
+ } catch (error) {
227
+ this.app.logger.warn(`Skip backing up files from collection "${collection.name}": ${error.message}`, {
228
+ module: import_utils2.BACKUPS
229
+ });
230
+ return {
231
+ collectionName: collection.name,
232
+ files: []
233
+ };
234
+ }
235
+ });
236
+ const filesList = await Promise.all(filesPromises);
237
+ for (const { collectionName, files } of filesList) {
238
+ for (const file of files) {
239
+ const backupFile = this.#getLocalFileForBackup(collectionName, file);
240
+ if (!backupFile) {
241
+ continue;
242
+ }
243
+ try {
244
+ archive.file(backupFile.filePath, { name: backupFile.archiveName });
245
+ } catch (error) {
246
+ this.#warnSkipFileBackup(collectionName, file, error.message);
247
+ }
248
+ }
249
+ }
250
+ }
251
+ if (fs.existsSync(this.#aesKeyPath)) {
252
+ archive.file(this.#aesKeyPath, { name: "aes_key.dat" });
253
+ }
254
+ await archive.finalize();
255
+ await onClose;
256
+ } catch (error) {
257
+ this.app.logger.error(`Error compressing files: ${error.message}`, { module: import_utils2.BACKUPS });
258
+ throw new Error(this.#t("ERROR_COMPRESSING_FILES", error.message));
259
+ } finally {
260
+ outputFileStream.close();
261
+ }
262
+ return filePath;
263
+ }
264
+ #getLocalFileForBackup(collectionName, file) {
265
+ const filename = file.filename;
266
+ if (typeof filename !== "string" || filename.length === 0) {
267
+ this.#warnSkipFileBackup(collectionName, file, "Invalid filename");
268
+ return null;
269
+ }
270
+ const filePath = file.path ?? "";
271
+ if (typeof filePath !== "string") {
272
+ this.#warnSkipFileBackup(collectionName, file, "Invalid path");
273
+ return null;
274
+ }
275
+ const resolvedPath = import_path.default.resolve(this.#uploadDir, filePath, filename);
276
+ const relativePath = import_path.default.relative(this.#uploadDir, resolvedPath);
277
+ if (!relativePath || this.#hasPathTraversal(relativePath, import_path.default.sep) || import_path.default.isAbsolute(relativePath)) {
278
+ this.#warnSkipFileBackup(collectionName, file, "Path traversal is not allowed");
279
+ return null;
280
+ }
281
+ const archiveName = import_path.default.posix.join("uploads", ...relativePath.split(import_path.default.sep));
282
+ if (archiveName.includes("\\")) {
283
+ this.#warnSkipFileBackup(collectionName, file, "Invalid path");
284
+ return null;
285
+ }
286
+ if (this.#hasPathTraversal(archiveName, import_path.default.posix.sep)) {
287
+ this.#warnSkipFileBackup(collectionName, file, "Path traversal is not allowed");
288
+ return null;
289
+ }
290
+ return {
291
+ filePath: resolvedPath,
292
+ archiveName
293
+ };
294
+ }
295
+ #hasPathTraversal(filePath, separator) {
296
+ return filePath === ".." || filePath.startsWith(`..${separator}`) || filePath.split(separator).includes("..");
297
+ }
298
+ #warnSkipFileBackup(collectionName, file, reason) {
299
+ const recordId = file.id == null ? "" : ` id=${file.id}`;
300
+ this.app.logger.warn(
301
+ `Skip backing up invalid local file record from collection "${collectionName}"${recordId}: ${reason}`,
302
+ {
303
+ module: import_utils2.BACKUPS
304
+ }
305
+ );
306
+ }
307
+ async #createEncryptedStream(output, password) {
308
+ if (password) {
309
+ const key = await (0, import_util.promisify)(crypto.scrypt)(password, import_utils2.FILE_ENCRYPTION_SALT, 32);
310
+ const iv = crypto.randomBytes(16);
311
+ const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
312
+ try {
313
+ const written = output.write(iv);
314
+ if (!written) {
315
+ await new Promise((resolve, reject) => {
316
+ output.once("drain", resolve);
317
+ output.once("error", reject);
318
+ });
319
+ }
320
+ } catch (err) {
321
+ this.app.logger.error(`Failed to write IV to the output stream: ${err.message}`, { module: import_utils2.BACKUPS });
322
+ throw new Error(this.#t("ERROR_DECRYPTING_FILES", err.message));
323
+ }
324
+ cipher.pipe(output);
325
+ return cipher;
326
+ }
327
+ return output;
328
+ }
329
+ async #uploadFiles(filePath, storageId) {
330
+ if (!storageId) {
331
+ return;
332
+ }
333
+ try {
334
+ const storage = await this.app.db.getRepository("storages").findOne({
335
+ filterByTk: storageId
336
+ });
337
+ if (!storage || storage.type === "local") {
338
+ this.app.logger.info(`Has not set cloud storage, skip backup file upload process`, { module: import_utils2.BACKUPS });
339
+ return;
340
+ }
341
+ const Plugin = this.app.pm.get(import_plugin_file_manager.default);
342
+ const data = await Plugin.uploadFile({
343
+ filePath,
344
+ storageName: storage.name
345
+ });
346
+ this.app.logger.info(`Backup file uploaded to: ${data.filename}`, { module: import_utils2.BACKUPS });
347
+ } catch (error) {
348
+ this.app.logger.error(`Error uploading files: ${error.message}`, { module: import_utils2.BACKUPS });
349
+ throw new Error(this.#t("ERROR_UPLOADING_FILES", error.message));
350
+ }
351
+ }
352
+ async #createContentPath(contentPath) {
353
+ try {
354
+ await import_promises.default.mkdir(contentPath, { recursive: true });
355
+ } catch (error) {
356
+ this.app.logger.error(`Error creating content path: ${error.message}`, { module: import_utils2.BACKUPS });
357
+ throw new Error(this.#t("ERROR_CREATING_PATH", error.message));
358
+ }
359
+ }
360
+ async #removeContentPath(contentPath) {
361
+ try {
362
+ await import_promises.default.rm(contentPath, { recursive: true });
363
+ } catch (error) {
364
+ this.app.logger.error(`Error removing content path: ${error.message}`, { module: import_utils2.BACKUPS });
365
+ throw new Error(this.#t("ERROR_REMOVING_FILES", error.message));
366
+ }
367
+ }
368
+ async #createLockFile(fileBaseName) {
369
+ const filePath = import_path.default.join(this.#tempDir, `${fileBaseName}.${import_utils2.BACKUP_EXTENSION}.lock`);
370
+ try {
371
+ await import_promises.default.mkdir(this.#tempDir, { recursive: true });
372
+ await import_promises.default.writeFile(filePath, "lock", "utf8");
373
+ } catch (error) {
374
+ this.app.logger.error(`Error creating lock file: ${error.message}`, { module: import_utils2.BACKUPS });
375
+ throw new Error(this.#t("ERROR_CREATING_LOCK_FILE", error.message));
376
+ }
377
+ }
378
+ async #removeLockFile(fileBaseName) {
379
+ const filePath = import_path.default.join(this.#tempDir, `${fileBaseName}.${import_utils2.BACKUP_EXTENSION}.lock`);
380
+ try {
381
+ await import_promises.default.unlink(filePath);
382
+ } catch (error) {
383
+ this.app.logger.error(`Error removing lock file: ${error.message}`, { module: import_utils2.BACKUPS });
384
+ throw new Error(this.#t("ERROR_REMOVING_FILES", error.message));
385
+ }
386
+ }
387
+ #generateFileBaseName() {
388
+ return `backup_${(0, import_dayjs.default)().format(`YYYYMMDD_HHmmss_${Math.floor(1e3 + Math.random() * 9e3)}`)}`;
389
+ }
390
+ async #listCompletedBackups(inProgressFiles = []) {
391
+ let files;
392
+ try {
393
+ files = await import_promises.default.readdir(this.#backupDir);
394
+ } catch (error) {
395
+ if (error.code === "ENOENT") {
396
+ return [];
397
+ }
398
+ this.app.logger.error(`Error listing backup files: ${error.message}`, { module: import_utils2.BACKUPS });
399
+ throw new Error(this.#t("ERROR_LISTING_BACKUPS", error.message));
400
+ }
401
+ const inProgressFileNames = inProgressFiles.map((file) => file.name);
402
+ const backupPromises = files.filter((file) => file.endsWith(`.${import_utils2.BACKUP_EXTENSION}`) && !inProgressFileNames.includes(file)).map(async (file) => {
403
+ const stats = await import_promises.default.stat(import_path.default.join(this.#backupDir, file));
404
+ return {
405
+ name: file,
406
+ fileSize: (0, import_utils2.humanFileSize)(stats.size),
407
+ createdAt: stats.ctime,
408
+ inProgress: false
409
+ };
410
+ });
411
+ const backups = await Promise.all(backupPromises);
412
+ return backups.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
413
+ }
414
+ async #listProgressBackups() {
415
+ try {
416
+ const files = await import_promises.default.readdir(this.#tempDir);
417
+ const backups = files.filter((file) => file.endsWith(`.${import_utils2.BACKUP_EXTENSION}.lock`)).map((file) => {
418
+ return {
419
+ name: file.replace(".lock", ""),
420
+ inProgress: true
421
+ };
422
+ });
423
+ return backups;
424
+ } catch (error) {
425
+ if (error.code === "ENOENT") {
426
+ return [];
427
+ } else {
428
+ this.app.logger.error(`Error listing lock files: ${error.message}`, { module: import_utils2.BACKUPS });
429
+ throw new Error(this.#t("ERROR_LISTING_BACKUPS", error.message));
430
+ }
431
+ }
432
+ }
433
+ async #dropOldBackups(keep) {
434
+ const inProgressBackups = await this.#listProgressBackups();
435
+ const backups = await this.#listCompletedBackups(inProgressBackups);
436
+ const files = backups.slice(keep);
437
+ await Promise.all(files.map((file) => this.destroy(file.name)));
438
+ }
439
+ #t(message, detail) {
440
+ var _a;
441
+ const t = ((_a = this.ctx) == null ? void 0 : _a.i18n.t) || this.app.i18n.t;
442
+ return t(message, { detail, ns: import_utils2.PLUGIN_BACKUPS_NAME, interpolation: { escapeValue: false } });
443
+ }
444
+ }
445
+ // Annotate the CommonJS export names for ESM import in node:
446
+ 0 && (module.exports = {
447
+ BackupManager
448
+ });
@@ -0,0 +1,24 @@
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
+ /// <reference types="multer" />
10
+ import { ResourcerContext } from '@nocobase/resourcer';
11
+ interface RestoreOptions {
12
+ forceSchemaRestore?: boolean;
13
+ }
14
+ export declare class RestoreManager {
15
+ #private;
16
+ ctx: ResourcerContext;
17
+ constructor(ctx: ResourcerContext, dbOptions?: any);
18
+ restoreFromBackup(backupFileName: string, taskId: string, password?: string, tolerentMode?: boolean, options?: RestoreOptions): Promise<void>;
19
+ restoreFromUpload(backupFile: Express.Multer.File, taskId: string, password?: string, tolerentMode?: boolean, options?: RestoreOptions): Promise<void>;
20
+ restoreCLI(filePath: string, password?: string, tolerentMode?: boolean, skipRevertOnError?: boolean, options?: RestoreOptions): Promise<void>;
21
+ private getStatusCache;
22
+ restore(filePath: string, taskId: string, password?: string, tolerentMode?: boolean, skipRevertOnError?: boolean, options?: RestoreOptions): Promise<void>;
23
+ }
24
+ export {};