@nocobase/plugin-backups 2.2.0-alpha.1 → 2.2.0-alpha.11
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.
- package/dist/client/components/RestoreFromBackup.d.ts +8 -0
- package/dist/client/components/RestoreFromLocal.d.ts +8 -0
- package/dist/client/index.js +1 -1
- package/dist/client-v2/{105.064f69093e98a2dd.js → 105.d20cb8a299876029.js} +1 -1
- package/dist/client-v2/567.72267b98c0ce9379.js +10 -0
- package/dist/client-v2/index.js +1 -1
- package/dist/externalVersion.js +12 -11
- package/dist/locale/de-DE.json +1 -1
- package/dist/locale/en-US.json +3 -2
- package/dist/locale/es-ES.json +1 -1
- package/dist/locale/fr-FR.json +1 -1
- package/dist/locale/hu-HU.json +1 -1
- package/dist/locale/id-ID.json +1 -1
- package/dist/locale/it-IT.json +1 -1
- package/dist/locale/ja-JP.json +1 -1
- package/dist/locale/ko-KR.json +1 -1
- package/dist/locale/nl-NL.json +1 -1
- package/dist/locale/pt-BR.json +1 -1
- package/dist/locale/ru-RU.json +1 -1
- package/dist/locale/tr-TR.json +1 -1
- package/dist/locale/uk-UA.json +1 -1
- package/dist/locale/vi-VN.json +1 -1
- package/dist/locale/zh-CN.json +3 -2
- package/dist/locale/zh-TW.json +1 -1
- package/dist/node_modules/archiver/package.json +1 -1
- package/dist/node_modules/cron-parser/package.json +1 -1
- package/dist/node_modules/fs-extra/package.json +1 -1
- package/dist/node_modules/semver/package.json +1 -1
- package/dist/node_modules/yauzl/package.json +1 -1
- package/dist/server/adapters/database.d.ts +7 -0
- package/dist/server/adapters/database.js +368 -56
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +7 -1
- package/dist/server/managers/backup.d.ts +10 -2
- package/dist/server/managers/backup.js +14 -3
- package/dist/server/managers/restore.d.ts +1 -0
- package/dist/server/managers/restore.js +27 -4
- package/dist/server/resourcers/backup-cli.d.ts +9 -9
- package/dist/server/resourcers/backups.d.ts +10 -10
- package/dist/server/utils.d.ts +1 -0
- package/dist/server/utils.js +29 -1
- package/package.json +2 -2
- package/dist/client-v2/567.d39a82a6aa6452a0.js +0 -10
|
@@ -50,7 +50,7 @@ var import_utils = require("@nocobase/utils");
|
|
|
50
50
|
var import_util = require("util");
|
|
51
51
|
var import_database = require("../adapters/database");
|
|
52
52
|
var import_utils2 = require("../utils");
|
|
53
|
-
const BACKUP_METADATA_VERSION =
|
|
53
|
+
const BACKUP_METADATA_VERSION = 2;
|
|
54
54
|
class BackupManager {
|
|
55
55
|
app;
|
|
56
56
|
ctx;
|
|
@@ -66,7 +66,7 @@ class BackupManager {
|
|
|
66
66
|
constructor(app, ctx, settings) {
|
|
67
67
|
this.app = app;
|
|
68
68
|
this.ctx = ctx;
|
|
69
|
-
this.#settings = settings;
|
|
69
|
+
this.#settings = this.#normalizeBackupSettings(settings);
|
|
70
70
|
this.#dbAdapter = (0, import_database.getDBAdapter)(app.db.options);
|
|
71
71
|
this.#backupTasksCacheName = import_utils2.BACKUP_TASKS_CACHE_NAME;
|
|
72
72
|
this.#backupPrefix = "backup_";
|
|
@@ -90,6 +90,12 @@ class BackupManager {
|
|
|
90
90
|
set backupTasksCacheName(backupTasksCacheName) {
|
|
91
91
|
this.#backupTasksCacheName = backupTasksCacheName;
|
|
92
92
|
}
|
|
93
|
+
#normalizeBackupSettings(settings) {
|
|
94
|
+
if (typeof settings.toJSON === "function") {
|
|
95
|
+
return settings.toJSON();
|
|
96
|
+
}
|
|
97
|
+
return { ...settings };
|
|
98
|
+
}
|
|
93
99
|
async createBackupName() {
|
|
94
100
|
await this.#dbAdapter.check("backup");
|
|
95
101
|
await import_promises.default.mkdir(this.#backupDir, { recursive: true });
|
|
@@ -99,7 +105,10 @@ class BackupManager {
|
|
|
99
105
|
}
|
|
100
106
|
async backup(fileBaseName, opts) {
|
|
101
107
|
const contentPath = import_path.default.join(this.#tempDir, fileBaseName);
|
|
102
|
-
|
|
108
|
+
const runtimeTables = [...this.app.db.collections.values()].filter((collection) => collection.dataCategory === "runtime").map((collection) => collection.getTableNameWithSchemaAsString());
|
|
109
|
+
const backupOptions = { ...this.#settings, ...opts ?? {} };
|
|
110
|
+
backupOptions.excludeTables = [.../* @__PURE__ */ new Set([...backupOptions.excludeTables ?? [], ...runtimeTables])];
|
|
111
|
+
return this.#runBackupTask(backupOptions, fileBaseName, contentPath);
|
|
103
112
|
}
|
|
104
113
|
async destroy(fileName) {
|
|
105
114
|
const filePath = this.#getValidatedFilePath(fileName);
|
|
@@ -187,6 +196,7 @@ class BackupManager {
|
|
|
187
196
|
};
|
|
188
197
|
});
|
|
189
198
|
const metadata = {
|
|
199
|
+
...opts.metadata ?? {},
|
|
190
200
|
metadataVersion: BACKUP_METADATA_VERSION,
|
|
191
201
|
enableFilesBackup: opts.enableFilesBackup,
|
|
192
202
|
version: await this.app.version.get(),
|
|
@@ -194,6 +204,7 @@ class BackupManager {
|
|
|
194
204
|
createdBy: opts.createdBy,
|
|
195
205
|
database: {
|
|
196
206
|
dialect,
|
|
207
|
+
toolchain: this.#dbAdapter.backupToolchain,
|
|
197
208
|
underscored,
|
|
198
209
|
tablePrefix,
|
|
199
210
|
schema,
|
|
@@ -142,7 +142,9 @@ class RestoreManager {
|
|
|
142
142
|
await this.#dbAdapter.restore({
|
|
143
143
|
filePath: import_path.default.join(extractedDir, dbFile),
|
|
144
144
|
schema: metadata.database.schema,
|
|
145
|
-
skipDropAllTables: (options == null ? void 0 : options.skipDropAllTables) === true
|
|
145
|
+
skipDropAllTables: (options == null ? void 0 : options.skipDropAllTables) === true,
|
|
146
|
+
restoreMode: options == null ? void 0 : options.restoreMode,
|
|
147
|
+
toolchain: this.#resolveRestoreToolchain(metadata)
|
|
146
148
|
});
|
|
147
149
|
this.ctx.logger.info("Database restored successfully", { module: import_utils2.BACKUPS });
|
|
148
150
|
await this.#restoreFilesAndCleanup(restoreUploads, extractedDir);
|
|
@@ -195,7 +197,7 @@ class RestoreManager {
|
|
|
195
197
|
await this.#restoreFilesAndCleanup(uploadsExist, extractedDir);
|
|
196
198
|
await this.ctx.app.runCommand("upgrade");
|
|
197
199
|
} else {
|
|
198
|
-
if (!tolerentMode && this.#dbAdapter.dbOpts.dialect
|
|
200
|
+
if (!tolerentMode && this.#isPostgresLikeDialect(this.#dbAdapter.dbOpts.dialect)) {
|
|
199
201
|
const backupClientVersion = Number((0, import_utils2.toMajorVersion)(metadata.database.backupClientVersion));
|
|
200
202
|
const dbServerVersion = Number((0, import_utils2.toMajorVersion)(dbVersion));
|
|
201
203
|
if (backupClientVersion > 16 && dbServerVersion <= 16) {
|
|
@@ -248,7 +250,7 @@ class RestoreManager {
|
|
|
248
250
|
if ((metadata.database.tablePrefix || "") !== (tablePrefix || "")) {
|
|
249
251
|
throw new Error(this.#t("Database table prefix mismatch"));
|
|
250
252
|
}
|
|
251
|
-
const forceSchemaRestore = (options == null ? void 0 : options.forceSchemaRestore) === true && dialect
|
|
253
|
+
const forceSchemaRestore = (options == null ? void 0 : options.forceSchemaRestore) === true && this.#isPostgresLikeDialect(dialect);
|
|
252
254
|
if (!forceSchemaRestore) {
|
|
253
255
|
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")) {
|
|
254
256
|
throw new Error(this.#t("Database schema mismatch"));
|
|
@@ -289,6 +291,25 @@ class RestoreManager {
|
|
|
289
291
|
}
|
|
290
292
|
return true;
|
|
291
293
|
}
|
|
294
|
+
#isPostgresLikeDialect(dialect) {
|
|
295
|
+
return dialect === "postgres" || dialect === "kingbase";
|
|
296
|
+
}
|
|
297
|
+
#resolveRestoreToolchain(metadata) {
|
|
298
|
+
if (metadata.database.dialect !== "kingbase") {
|
|
299
|
+
return void 0;
|
|
300
|
+
}
|
|
301
|
+
if (metadata.database.toolchain === "kingbase" || metadata.database.toolchain === "postgres") {
|
|
302
|
+
return metadata.database.toolchain;
|
|
303
|
+
}
|
|
304
|
+
const backupClientVersion = metadata.database.backupClientVersion || "";
|
|
305
|
+
if (/sys_dump/i.test(backupClientVersion)) {
|
|
306
|
+
return "kingbase";
|
|
307
|
+
}
|
|
308
|
+
if (/pg_dump|postgresql/i.test(backupClientVersion)) {
|
|
309
|
+
return "postgres";
|
|
310
|
+
}
|
|
311
|
+
return this.#dbAdapter.backupToolchain;
|
|
312
|
+
}
|
|
292
313
|
async #decompressFiles(filePath, password) {
|
|
293
314
|
const fileBaseName = import_path.default.basename(filePath, `.${import_utils2.BACKUP_EXTENSION}`);
|
|
294
315
|
const outputDir = import_path.default.join(this.#tempDir, fileBaseName);
|
|
@@ -372,7 +393,9 @@ class RestoreManager {
|
|
|
372
393
|
await this.#dbAdapter.restore({
|
|
373
394
|
filePath: import_path.default.join(extractedDir, dbFile),
|
|
374
395
|
schema: metadata.database.schema,
|
|
375
|
-
skipDropAllTables: (options == null ? void 0 : options.skipDropAllTables) === true
|
|
396
|
+
skipDropAllTables: (options == null ? void 0 : options.skipDropAllTables) === true,
|
|
397
|
+
restoreMode: options == null ? void 0 : options.restoreMode,
|
|
398
|
+
toolchain: this.#resolveRestoreToolchain(metadata)
|
|
376
399
|
});
|
|
377
400
|
this.ctx.logger.info("Database restored successfully", { module: import_utils2.BACKUPS });
|
|
378
401
|
if (restoreUploads) {
|
|
@@ -8,16 +8,16 @@
|
|
|
8
8
|
*/
|
|
9
9
|
declare const _default: {
|
|
10
10
|
name: string;
|
|
11
|
-
middleware: (ctx: import("@nocobase/resourcer").
|
|
11
|
+
middleware: (ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>) => Promise<any>;
|
|
12
12
|
actions: {
|
|
13
|
-
list(ctx: import("@nocobase/resourcer").
|
|
14
|
-
create(ctx: import("@nocobase/resourcer").
|
|
15
|
-
status(ctx: import("@nocobase/resourcer").
|
|
16
|
-
download(ctx: import("@nocobase/resourcer").
|
|
17
|
-
remove(ctx: import("@nocobase/resourcer").
|
|
18
|
-
restore(ctx: import("@nocobase/resourcer").
|
|
19
|
-
restoreUpload(ctx: import("@nocobase/resourcer").
|
|
20
|
-
restoreStatus(ctx: import("@nocobase/resourcer").
|
|
13
|
+
list(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
14
|
+
create(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
15
|
+
status(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
16
|
+
download(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
17
|
+
remove(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
18
|
+
restore(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
19
|
+
restoreUpload(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
20
|
+
restoreStatus(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
21
21
|
};
|
|
22
22
|
};
|
|
23
23
|
export default _default;
|
|
@@ -8,17 +8,17 @@
|
|
|
8
8
|
*/
|
|
9
9
|
declare const _default: {
|
|
10
10
|
name: string;
|
|
11
|
-
middleware: (ctx: import("@nocobase/resourcer").
|
|
11
|
+
middleware: (ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>) => Promise<any>;
|
|
12
12
|
actions: {
|
|
13
|
-
list(ctx: import("@nocobase/resourcer").
|
|
14
|
-
upload(ctx: import("@nocobase/resourcer").
|
|
15
|
-
create(ctx: import("@nocobase/resourcer").
|
|
16
|
-
taskStatus(ctx: import("@nocobase/resourcer").
|
|
17
|
-
download(ctx: import("@nocobase/resourcer").
|
|
18
|
-
destroy(ctx: import("@nocobase/resourcer").
|
|
19
|
-
restore(ctx: import("@nocobase/resourcer").
|
|
20
|
-
restoreStatus(ctx: import("@nocobase/resourcer").
|
|
21
|
-
appInfo(ctx: import("@nocobase/resourcer").
|
|
13
|
+
list(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
14
|
+
upload(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
15
|
+
create(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
16
|
+
taskStatus(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
17
|
+
download(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
18
|
+
destroy(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
19
|
+
restore(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
20
|
+
restoreStatus(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
21
|
+
appInfo(ctx: import("@nocobase/resourcer").ResourcerActionContext, next: () => Promise<any>): Promise<void>;
|
|
22
22
|
};
|
|
23
23
|
};
|
|
24
24
|
export default _default;
|
package/dist/server/utils.d.ts
CHANGED
|
@@ -33,6 +33,7 @@ export declare class Extractor extends Writable {
|
|
|
33
33
|
private extract;
|
|
34
34
|
promise(): Promise<void>;
|
|
35
35
|
}
|
|
36
|
+
export declare function compressDirectoryToBackupArchive(sourceDir: string, backupFilePath: string): Promise<void>;
|
|
36
37
|
export declare function humanFileSize(bytes: number, si?: boolean, dp?: number): string;
|
|
37
38
|
export declare function getDBVersion(db: Database): Promise<string>;
|
|
38
39
|
export declare function isQsTruly(value?: string | boolean): any;
|
package/dist/server/utils.js
CHANGED
|
@@ -48,6 +48,7 @@ __export(utils_exports, {
|
|
|
48
48
|
RESTORE_TASKS_CACHE_TTL: () => RESTORE_TASKS_CACHE_TTL,
|
|
49
49
|
SETTINGS: () => SETTINGS,
|
|
50
50
|
STORAGE_PATH: () => STORAGE_PATH,
|
|
51
|
+
compressDirectoryToBackupArchive: () => compressDirectoryToBackupArchive,
|
|
51
52
|
getDBVersion: () => getDBVersion,
|
|
52
53
|
humanFileSize: () => humanFileSize,
|
|
53
54
|
isQsTruly: () => isQsTruly,
|
|
@@ -56,6 +57,7 @@ __export(utils_exports, {
|
|
|
56
57
|
});
|
|
57
58
|
module.exports = __toCommonJS(utils_exports);
|
|
58
59
|
var import_stream = require("stream");
|
|
60
|
+
var import_archiver = __toESM(require("archiver"));
|
|
59
61
|
var import_yauzl = __toESM(require("yauzl"));
|
|
60
62
|
var import_fs_extra = __toESM(require("fs-extra"));
|
|
61
63
|
var import_path = __toESM(require("path"));
|
|
@@ -196,6 +198,30 @@ class Extractor extends import_stream.Writable {
|
|
|
196
198
|
});
|
|
197
199
|
}
|
|
198
200
|
}
|
|
201
|
+
async function compressDirectoryToBackupArchive(sourceDir, backupFilePath) {
|
|
202
|
+
const archive = (0, import_archiver.default)("zip", { zlib: { level: 9 } });
|
|
203
|
+
const output = import_fs_extra.default.createWriteStream(backupFilePath);
|
|
204
|
+
const outputClosed = new Promise((resolve, reject) => {
|
|
205
|
+
output.on("close", resolve);
|
|
206
|
+
output.on("error", reject);
|
|
207
|
+
archive.on("error", reject);
|
|
208
|
+
archive.on("warning", (error) => {
|
|
209
|
+
if (error.code === "ENOENT") {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
reject(error);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
try {
|
|
216
|
+
archive.pipe(output);
|
|
217
|
+
archive.directory(sourceDir, false);
|
|
218
|
+
await archive.finalize();
|
|
219
|
+
await outputClosed;
|
|
220
|
+
} catch (error) {
|
|
221
|
+
await import_fs_extra.default.remove(backupFilePath);
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
199
225
|
function humanFileSize(bytes, si = false, dp = 1) {
|
|
200
226
|
const thresh = si ? 1e3 : 1024;
|
|
201
227
|
const units = si ? ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] : ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
|
|
@@ -210,7 +236,8 @@ const dbVersionCommands = {
|
|
|
210
236
|
sqlite: "select sqlite_version() as version",
|
|
211
237
|
mysql: "select version() as version",
|
|
212
238
|
mariadb: "select version() as version",
|
|
213
|
-
postgres: "select version() as version"
|
|
239
|
+
postgres: "select version() as version",
|
|
240
|
+
kingbase: "select version() as version"
|
|
214
241
|
};
|
|
215
242
|
async function getDBVersion(db) {
|
|
216
243
|
var _a;
|
|
@@ -318,6 +345,7 @@ class EscapeQuoteTransform extends import_stream.Transform {
|
|
|
318
345
|
RESTORE_TASKS_CACHE_TTL,
|
|
319
346
|
SETTINGS,
|
|
320
347
|
STORAGE_PATH,
|
|
348
|
+
compressDirectoryToBackupArchive,
|
|
321
349
|
getDBVersion,
|
|
322
350
|
humanFileSize,
|
|
323
351
|
isQsTruly,
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"displayName.zh-CN": "备份管理器",
|
|
5
5
|
"description": "Provides backup and restore functionality, supports scheduled backups, and ensures data security and quick recovery.",
|
|
6
6
|
"description.zh-CN": "提供备份与还原功能,支持定时备份,确保数据安全与快速恢复。",
|
|
7
|
-
"version": "2.2.0-alpha.
|
|
7
|
+
"version": "2.2.0-alpha.11",
|
|
8
8
|
"license": "Apache-2.0",
|
|
9
9
|
"main": "dist/server/index.js",
|
|
10
10
|
"nocobase": {
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"keywords": [
|
|
51
51
|
"System management"
|
|
52
52
|
],
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "c9ff1f51e5c33bc6437b64eb779212be71b78f58"
|
|
54
54
|
}
|
|
@@ -1,10 +0,0 @@
|
|
|
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
|
-
(self.webpackChunk_nocobase_plugin_backups_client_v2=self.webpackChunk_nocobase_plugin_backups_client_v2||[]).push([["567"],{574:function(e,t,n){var r,a;void 0===(a="function"==typeof(r=function(){"use strict";function t(e,t,n){var r=new XMLHttpRequest;r.open("GET",e),r.responseType="blob",r.onload=function(){l(r.response,t,n)},r.onerror=function(){console.error("could not download file")},r.send()}function r(e){var t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch(e){}return 200<=t.status&&299>=t.status}function a(e){try{e.dispatchEvent(new MouseEvent("click"))}catch(n){var t=document.createEvent("MouseEvents");t.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),e.dispatchEvent(t)}}var o="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof n.g&&n.g.global===n.g?n.g:void 0,u=o.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),l=o.saveAs||("object"!=typeof window||window!==o?function(){}:"download"in HTMLAnchorElement.prototype&&!u?function(e,n,u){var l=o.URL||o.webkitURL,i=document.createElement("a");i.download=n=n||e.name||"download",i.rel="noopener","string"==typeof e?(i.href=e,i.origin===location.origin?a(i):r(i.href)?t(e,n,u):a(i,i.target="_blank")):(i.href=l.createObjectURL(e),setTimeout(function(){l.revokeObjectURL(i.href)},4e4),setTimeout(function(){a(i)},0))}:"msSaveOrOpenBlob"in navigator?function(e,n,o){if(n=n||e.name||"download","string"!=typeof e){var u;navigator.msSaveOrOpenBlob((void 0===(u=o)?u={autoBom:!1}:"object"!=typeof u&&(console.warn("Deprecated: Expected third argument to be a object"),u={autoBom:!u}),u.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob(["\uFEFF",e],{type:e.type}):e),n)}else if(r(e))t(e,n,o);else{var l=document.createElement("a");l.href=e,l.target="_blank",setTimeout(function(){a(l)})}}:function(e,n,r,a){if((a=a||open("","_blank"))&&(a.document.title=a.document.body.innerText="downloading..."),"string"==typeof e)return t(e,n,r);var l="application/octet-stream"===e.type,i=/constructor/i.test(o.HTMLElement)||o.safari,c=/CriOS\/[\d]+/.test(navigator.userAgent);if((c||l&&i||u)&&"u">typeof FileReader){var s=new FileReader;s.onloadend=function(){var e=s.result;e=c?e:e.replace(/^data:[^;]*;/,"data:attachment/file;"),a?a.location.href=e:location=e,a=null},s.readAsDataURL(e)}else{var f=o.URL||o.webkitURL,p=f.createObjectURL(e);a?a.location=p:location.href=p,a=null,setTimeout(function(){f.revokeObjectURL(p)},4e4)}});o.saveAs=l.saveAs=l,e.exports=l})?r.apply(t,[]):r)||(e.exports=a)},258:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return Y}});var r=n(694),a=n(625),o=n(59),u=n(155),l=n.n(u),i=n(485),c=n(185),s=n.n(c),f=n(574),p=n(401),d=(0,u.createContext)(null),b=function(){var e=(0,u.useContext)(d);if(!e)throw Error("BackupsContext provider is missing");return e},m=n(488);function v(e,t,n,r,a,o,u){try{var l=e[o](u),i=l.value}catch(e){n(e);return}l.done?t(i):Promise.resolve(i).then(r,a)}var h={database:{dialect:""}},y=function(){var e=(0,r.useFlowContext)(),t=(0,a.useMemoizedFn)(function(){var t;return(t=function(){var t,n;return function(e,t){var n,r,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(u,"next",{value:i(0)}),l(u,"throw",{value:i(1)}),l(u,"return",{value:i(2)}),"function"==typeof Symbol&&l(u,Symbol.iterator,{value:function(){return this}}),u;function i(l){return function(i){var c=[l,i];if(n)throw TypeError("Generator is already executing.");for(;u&&(u=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(a=2&c[0]?r.return:c[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,c[1])).done)return a;switch(r=0,a&&(c=[2&c[0],a.value]),c[0]){case 0:case 1:a=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!a||c[1]>a[0]&&c[1]<a[3])){o.label=c[1];break}if(6===c[0]&&o.label<a[1]){o.label=a[1],a=c;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(c);break}a[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=a=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(r){switch(r.label){case 0:return[4,e.api.request({url:"backups:appInfo"})];case 1:return[2,null!=(t=null==(n=r.sent().data)?void 0:n.data)?t:h]}})},function(){var e=this,n=arguments;return new Promise(function(r,a){var o=t.apply(e,n);function u(e){v(o,r,a,u,l,"next",e)}function l(e){v(o,r,a,u,l,"throw",e)}u(void 0)})})()}),n=(0,a.useRequest)(t,{cacheKey:"backupAppInfo",staleTime:-1}).data;return null!=n?n:h},w=function(){var e=(0,r.useFlowEngine)(),t=(0,i.useApp)();return{showCheckBackupMessage:(0,a.useMemoizedFn)(function(){var n=e.context[p.l];n?n.showCheckBackupMessage():("function"==typeof t.setMaintaining?t.setMaintaining(!0):t.maintaining=!0,t.error={command:{name:"APP Restoring"},message:"checking backup...",code:"APP_COMMANDING"})}),hideCheckBackupMessage:(0,a.useMemoizedFn)(function(){var n=e.context[p.l];n?n.hideCheckBackupMessage():"function"==typeof t.setMaintaining?t.setMaintaining(!1):t.maintaining=!1})}};function g(e,t,n,r,a,o,u){try{var l=e[o](u),i=l.value}catch(e){n(e);return}l.done?t(i):Promise.resolve(i).then(r,a)}function k(){var e=(0,r.useFlowContext)(),t=(0,i.useApp)(),n=l().useRef(null),a=o.App.useApp().notification,c=w().hideCheckBackupMessage;return(0,u.useEffect)(function(){var t=setInterval(function(){var t;return(t=function(){var t,r;return function(e,t){var n,r,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(u,"next",{value:i(0)}),l(u,"throw",{value:i(1)}),l(u,"return",{value:i(2)}),"function"==typeof Symbol&&l(u,Symbol.iterator,{value:function(){return this}}),u;function i(l){return function(i){var c=[l,i];if(n)throw TypeError("Generator is already executing.");for(;u&&(u=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(a=2&c[0]?r.return:c[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,c[1])).done)return a;switch(r=0,a&&(c=[2&c[0],a.value]),c[0]){case 0:case 1:a=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!a||c[1]>a[0]&&c[1]<a[3])){o.label=c[1];break}if(6===c[0]&&o.label<a[1]){o.label=a[1],a=c;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(c);break}a[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=a=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(o){switch(o.label){case 0:if(!n.current)return[2];o.label=1;case 1:return o.trys.push([1,3,,4]),[4,e.api.request({url:"".concat(p.C,":restoreStatus"),method:"get",params:{task:n.current}})];case 2:if(!(r=null==(t=o.sent().data)?void 0:t.data))return[2];return r.inProgress||(n.current=null),r.message&&(c(),a.error({message:r.message,role:"alert"})),[3,4];case 3:return console.error(o.sent()),[3,4];case 4:return[2]}})},function(){var e=this,n=arguments;return new Promise(function(r,a){var o=t.apply(e,n);function u(e){g(o,r,a,u,l,"next",e)}function l(e){g(o,r,a,u,l,"throw",e)}u(void 0)})})()},3e3);return function(){return clearInterval(t)}},[t.maintaining,e.api,c,a]),n}function E(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function C(e,t,n,r,a,o,u){try{var l=e[o](u),i=l.value}catch(e){n(e);return}l.done?t(i):Promise.resolve(i).then(r,a)}function S(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var o=[],u=!0,l=!1;try{for(a=a.call(e);!(u=(n=a.next()).done)&&(o.push(n.value),!t||o.length!==t);u=!0);}catch(e){l=!0,r=e}finally{try{u||null==a.return||a.return()}finally{if(l)throw r}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return E(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return E(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var x=function(e){var t=e.backup,n=(0,m.k)(),a=(0,r.useFlowContext)(),u=S(l().useState(!1),2),i=u[0],c=u[1],s=S(l().useState(""),2),f=s[0],p=s[1],d=S(l().useState(!1),2),b=d[0],v=d[1],h=S(l().useState(""),2),g=h[0],E=h[1],x=k(),A=w().showCheckBackupMessage,O=y().database,j=O.schema,I=O.dialect,P=function(){p(""),E("")},M=function(){c(!1),P()};return l().createElement(l().Fragment,null,l().createElement(o.Button,{type:"link",size:"small",onClick:function(){c(!0)}},n("Restore")),l().createElement(o.Modal,{title:n("Restore"),open:i,onCancel:M,footer:[l().createElement(o.Button,{key:"back",onClick:M},n("Cancel")),l().createElement(o.Button,{key:"submit",type:"primary",loading:b,onClick:function(){var e;return(e=function(){var e,n,r;return function(e,t){var n,r,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(u,"next",{value:i(0)}),l(u,"throw",{value:i(1)}),l(u,"return",{value:i(2)}),"function"==typeof Symbol&&l(u,Symbol.iterator,{value:function(){return this}}),u;function i(l){return function(i){var c=[l,i];if(n)throw TypeError("Generator is already executing.");for(;u&&(u=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(a=2&c[0]?r.return:c[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,c[1])).done)return a;switch(r=0,a&&(c=[2&c[0],a.value]),c[0]){case 0:case 1:a=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!a||c[1]>a[0]&&c[1]<a[3])){o.label=c[1];break}if(6===c[0]&&o.label<a[1]){o.label=a[1],a=c;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(c);break}a[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=a=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(o){switch(o.label){case 0:v(!0),o.label=1;case 1:return o.trys.push([1,3,,4]),[4,a.api.request({url:"backups:restore",method:"post",data:{name:t.name,password:f,dbSchema:g}})];case 2:return x.current=null!=(e=null==(r=o.sent().data)||null==(n=r.data)?void 0:n.task)?e:null,A(),[3,4];case 3:return console.error(o.sent()),[3,4];case 4:return v(!1),c(!1),P(),[2]}})},function(){var t=this,n=arguments;return new Promise(function(r,a){var o=e.apply(t,n);function u(e){C(o,r,a,u,l,"next",e)}function l(e){C(o,r,a,u,l,"throw",e)}u(void 0)})})()}},n("Submit"))]},l().createElement(o.Form,{layout:"vertical",autoComplete:"off"},"postgres"===I&&l().createElement(o.Form.Item,{label:l().createElement("strong",null,n("Confirm the application database schema")),help:n("Required if application database schema is different with the backup",{currentDbSchemaTips:j?"[".concat(j,"]"):""})},l().createElement(o.Input,{autoComplete:"new-password",value:g,onChange:function(e){return E(e.target.value)}})),l().createElement(o.Form.Item,{colon:!0,label:l().createElement("strong",null,n("Restore password"))},l().createElement(o.Input.Password,{value:f,autoComplete:"new-password",onChange:function(e){return p(e.target.value)}})))))};function A(e,t,n,r,a,o,u){try{var l=e[o](u),i=l.value}catch(e){n(e);return}l.done?t(i):Promise.resolve(i).then(r,a)}function O(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var o=e.apply(t,n);function u(e){A(o,r,a,u,l,"next",e)}function l(e){A(o,r,a,u,l,"throw",e)}u(void 0)})}}function j(e,t){var n,r,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(u,"next",{value:i(0)}),l(u,"throw",{value:i(1)}),l(u,"return",{value:i(2)}),"function"==typeof Symbol&&l(u,Symbol.iterator,{value:function(){return this}}),u;function i(l){return function(i){var c=[l,i];if(n)throw TypeError("Generator is already executing.");for(;u&&(u=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(a=2&c[0]?r.return:c[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,c[1])).done)return a;switch(r=0,a&&(c=[2&c[0],a.value]),c[0]){case 0:case 1:a=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!a||c[1]>a[0]&&c[1]<a[3])){o.label=c[1];break}if(6===c[0]&&o.label<a[1]){o.label=a[1],a=c;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(c);break}a[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=a=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var I=function(){var e,t=(0,m.k)(),n=(0,r.useFlowContext)(),c=(0,i.useCurrentAppInfo)(),d=o.theme.useToken().token,v=o.App.useApp(),h=v.modal,y=v.message,w=b(),g=w.data,k=w.loading,E=w.refreshAsync,C=(0,a.useRequest)(function(e){return O(function(){var t;return j(this,function(r){switch(r.label){case 0:return[4,n.api.request({url:"".concat(p.C,":destroy"),method:"post",params:{filterByTk:e}})];case 1:return[2,null==(t=r.sent().data)?void 0:t.data]}})})()},{manual:!0}).runAsync,S=(0,u.useCallback)(function(e){h.confirm({title:t("Delete record"),content:t("Are you sure you want to delete it?"),onOk:function(){return O(function(){return j(this,function(n){switch(n.label){case 0:return[4,C(e.name)];case 1:return n.sent(),[4,E()];case 2:return n.sent(),y.success(t("The deletion was successful.")),[2]}})})()}})},[C,y,h,E,t]),A=(0,u.useCallback)(function(e){return O(function(){var t,r,a,o,u;return j(this,function(l){switch(l.label){case 0:return a=null!=(t=null==c?void 0:c.name)?t:null==c||null==(r=c.data)?void 0:r.name,o={filterByTk:e.name},a&&(o.__appName=a),[4,n.api.request({url:"backups:download",method:"get",params:o,responseType:"blob"})];case 1:return u=new Blob([l.sent().data]),(0,f.saveAs)(u,e.name),[2]}})})()},[n.api,null==c||null==(e=c.data)?void 0:e.name,null==c?void 0:c.name]),I=function(e){return e.inProgress?{colSpan:0}:{}},P=(0,u.useMemo)(function(){return[{title:t("Backup list"),dataIndex:"name",width:400,onCell:function(e){return e.inProgress?{colSpan:4}:{}},render:function(e,n){return n.inProgress?l().createElement("span",{style:{color:d.colorText}},e,"(",t("Backing up"),"...)"):l().createElement("span",null,e)}},{title:t("File size"),dataIndex:"fileSize",onCell:I},{title:t("Created at"),dataIndex:"createdAt",onCell:I,render:function(e){return e?s()(e).format("YYYY-MM-DD HH:mm:ss"):null}},{title:t("Actions"),dataIndex:"actions",onCell:I,render:function(e,n){return l().createElement(o.Space,{split:l().createElement(o.Divider,{type:"vertical"})},l().createElement(x,{backup:n}),l().createElement("a",{onClick:function(){A(n)}},t("Download")),l().createElement("a",{onClick:function(){return S(n)}},t("Delete")))}}]},[S,A,t,d.colorText]);return l().createElement(i.Table,{rowKey:"name",dataSource:null==g?void 0:g.data,loading:k,columns:P})},P=n(375);function M(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function R(e,t,n,r,a,o,u){try{var l=e[o](u),i=l.value}catch(e){n(e);return}l.done?t(i):Promise.resolve(i).then(r,a)}function T(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var o=e.apply(t,n);function u(e){R(o,r,a,u,l,"next",e)}function l(e){R(o,r,a,u,l,"throw",e)}u(void 0)})}}function B(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var o=[],u=!0,l=!1;try{for(a=a.call(e);!(u=(n=a.next()).done)&&(o.push(n.value),!t||o.length!==t);u=!0);}catch(e){l=!0,r=e}finally{try{u||null==a.return||a.return()}finally{if(l)throw r}}return o}}(e,t)||q(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function F(e){return function(e){if(Array.isArray(e))return M(e)}(e)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||q(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function q(e,t){if(e){if("string"==typeof e)return M(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return M(e,t)}}function _(e,t){var n,r,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(u,"next",{value:i(0)}),l(u,"throw",{value:i(1)}),l(u,"return",{value:i(2)}),"function"==typeof Symbol&&l(u,Symbol.iterator,{value:function(){return this}}),u;function i(l){return function(i){var c=[l,i];if(n)throw TypeError("Generator is already executing.");for(;u&&(u=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(a=2&c[0]?r.return:c[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,c[1])).done)return a;switch(r=0,a&&(c=[2&c[0],a.value]),c[0]){case 0:case 1:a=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!a||c[1]>a[0]&&c[1]<a[3])){o.label=c[1];break}if(6===c[0]&&o.label<a[1]){o.label=a[1],a=c;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(c);break}a[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=a=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var D=function(){var e=B((0,u.useState)([]),2),t=e[0],n=e[1],i=(0,m.k)(),c=(0,r.useFlowContext)(),s=o.App.useApp(),f=s.message,d=s.notification,v=s.modal,h=b().refreshAsync,y=(0,a.useRequest)(function(){return T(function(){var e;return _(this,function(t){switch(t.label){case 0:return[4,c.api.request({url:"".concat(p.C,":create"),method:"post"})];case 1:return[2,null==(e=t.sent().data)?void 0:e.data]}})})()},{manual:!0,throttleWait:1e3}),w=y.runAsync,g=y.loading,k=(0,a.useRequest)(function(e){return T(function(){var t,n;return _(this,function(r){switch(r.label){case 0:return[4,c.api.request({url:"".concat(p.C,":taskStatus"),method:"get",params:{names:e}})];case 1:return[2,null!=(t=null==(n=r.sent().data)?void 0:n.data)?t:{}]}})})()},{manual:!0}).runAsync;(0,u.useEffect)(function(){if(0!==t.length){var e=setInterval(function(){return T(function(){var e,r,a,o,u,l,c,s,p,b,m,v;return _(this,function(y){switch(y.label){case 0:return[4,k(t)];case 1:e=y.sent(),r=[],a=[],o=!0,u=!1,l=void 0;try{for(c=Object.entries(e)[Symbol.iterator]();!(o=(s=c.next()).done);o=!0)b=(p=B(s.value,2))[0],(m=p[1]).inProgress||(m.message?(a.push(b),d.error({message:m.message,role:"alert"})):r.push(b))}catch(e){u=!0,l=e}finally{try{o||null==c.return||c.return()}finally{if(u)throw l}}if(v=F(r).concat(F(a)),!(r.length>0))return[3,3];return f.success(i("NEW_BACKUPS_CREATED",{names:r.join(", ")})),[4,h()];case 2:y.sent(),y.label=3;case 3:return v.length>0&&n(function(e){return e.filter(function(e){return!v.includes(e)})}),[2]}})})()},3e3);return function(){clearInterval(e)}}},[t,f,d,k,h,i]);var E=g?P.LoadingOutlined:P.PlusOutlined;return l().createElement(o.Button,{icon:l().createElement(E,null),disabled:g,type:"primary",onClick:function(){return T(function(){return _(this,function(e){return v.confirm({title:i("New backup"),content:i("Are you sure you want to create new backup?"),onOk:function(){return T(function(){return _(this,function(e){switch(e.label){case 0:return[4,T(function(){var e;return _(this,function(t){switch(t.label){case 0:return[4,w()];case 1:return(null==(e=t.sent())?void 0:e.name)&&n(function(t){return F(t).concat([e.name])}),f.success(i("New backup operation started")),[4,h()];case 2:return t.sent(),[2]}})})()];case 1:return e.sent(),[2]}})})()}}),[2]})})()}},i("New backup"))},L=function(){var e=(0,m.k)(),t=b(),n=t.refresh,r=t.loading,a=r?P.LoadingOutlined:P.ReloadOutlined;return l().createElement(o.Button,{onClick:n,icon:l().createElement(a,null),disabled:r},e("Refresh"))};function U(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function G(e,t,n,r,a,o,u){try{var l=e[o](u),i=l.value}catch(e){n(e);return}l.done?t(i):Promise.resolve(i).then(r,a)}function N(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var o=[],u=!0,l=!1;try{for(a=a.call(e);!(u=(n=a.next()).done)&&(o.push(n.value),!t||o.length!==t);u=!0);}catch(e){l=!0,r=e}finally{try{u||null==a.return||a.return()}finally{if(l)throw r}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return U(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return U(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var H=function(){var e=(0,m.k)(),t=(0,r.useFlowContext)(),n=o.App.useApp().notification,a=N((0,u.useState)(!1),2),i=a[0],c=a[1],s=N((0,u.useState)(!1),2),f=s[0],p=s[1],d=N((0,u.useState)(""),2),b=d[0],v=d[1],h=N((0,u.useState)(""),2),g=h[0],E=h[1],C=N((0,u.useState)(null),2),S=C[0],x=C[1],A=N((0,u.useState)([]),2),O=A[0],j=A[1],I=k(),M=w().showCheckBackupMessage,R=y().database,T=R.schema,B=R.dialect,F=function(){v(""),x(null),j([]),E("")},q=function(){c(!1),F()};return l().createElement(l().Fragment,null,l().createElement(o.Button,{icon:l().createElement(P.UploadOutlined,null),onClick:function(){c(!0)}},e("Restore backup from local")),l().createElement(o.Modal,{title:e("Restore backup from local"),open:i,onCancel:q,footer:[l().createElement(o.Button,{key:"back",onClick:q},e("Cancel")),l().createElement(o.Button,{key:"submit",type:"primary",loading:f,onClick:function(){var r;return(r=function(){var r,a,o,u;return function(e,t){var n,r,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(u,"next",{value:i(0)}),l(u,"throw",{value:i(1)}),l(u,"return",{value:i(2)}),"function"==typeof Symbol&&l(u,Symbol.iterator,{value:function(){return this}}),u;function i(l){return function(i){var c=[l,i];if(n)throw TypeError("Generator is already executing.");for(;u&&(u=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(a=2&c[0]?r.return:c[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,c[1])).done)return a;switch(r=0,a&&(c=[2&c[0],a.value]),c[0]){case 0:case 1:a=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!a||c[1]>a[0]&&c[1]<a[3])){o.label=c[1];break}if(6===c[0]&&o.label<a[1]){o.label=a[1],a=c;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(c);break}a[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=a=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(l){switch(l.label){case 0:if(!S)return n.error({message:e("Please select a backup file")}),[2];p(!0),(r=new FormData).append("file",S),r.append("password",b),r.append("dbSchema",g),l.label=1;case 1:return l.trys.push([1,3,,4]),[4,t.api.request({url:"backups:upload",method:"post",data:r})];case 2:return I.current=null!=(a=null==(u=l.sent().data)||null==(o=u.data)?void 0:o.task)?a:null,M(),[3,4];case 3:return console.error(l.sent()),[3,4];case 4:return p(!1),c(!1),F(),[2]}})},function(){var e=this,t=arguments;return new Promise(function(n,a){var o=r.apply(e,t);function u(e){G(o,n,a,u,l,"next",e)}function l(e){G(o,n,a,u,l,"throw",e)}u(void 0)})})()}},e("Submit"))]},l().createElement(o.Form,{layout:"vertical",autoComplete:"off"},l().createElement(o.Form.Item,null,l().createElement(o.Upload.Dragger,{onRemove:function(){j([]),x(null)},fileList:O,multiple:!1,maxCount:1,beforeUpload:function(e){return x(e),j([e]),!1}},l().createElement("p",{className:"ant-upload-drag-icon"},l().createElement(P.InboxOutlined,null)),l().createElement("p",{className:"ant-upload-text"},e("Click or drag file to this area to upload")))),"postgres"===B&&l().createElement(o.Form.Item,{label:l().createElement("strong",null,e("Confirm the application database schema")),help:e("Required if application database schema is different with the backup",{currentDbSchemaTips:T?"[".concat(T,"]"):""})},l().createElement(o.Input,{autoComplete:"new-password",value:g,onChange:function(e){return E(e.target.value)}})),l().createElement(o.Form.Item,{colon:!0,label:l().createElement("strong",null,e("Restore password"))},l().createElement(o.Input.Password,{autoComplete:"new-password",value:b,onChange:function(e){return v(e.target.value)}})))))};function z(e,t,n,r,a,o,u){try{var l=e[o](u),i=l.value}catch(e){n(e);return}l.done?t(i):Promise.resolve(i).then(r,a)}var K={data:[]},Y=function(){var e=(0,r.useFlowContext)(),t=(0,a.useRequest)(function(){var t;return(t=function(){var t;return function(e,t){var n,r,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(u,"next",{value:i(0)}),l(u,"throw",{value:i(1)}),l(u,"return",{value:i(2)}),"function"==typeof Symbol&&l(u,Symbol.iterator,{value:function(){return this}}),u;function i(l){return function(i){var c=[l,i];if(n)throw TypeError("Generator is already executing.");for(;u&&(u=0,c[0]&&(o=0)),o;)try{if(n=1,r&&(a=2&c[0]?r.return:c[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,c[1])).done)return a;switch(r=0,a&&(c=[2&c[0],a.value]),c[0]){case 0:case 1:a=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!a||c[1]>a[0]&&c[1]<a[3])){o.label=c[1];break}if(6===c[0]&&o.label<a[1]){o.label=a[1],a=c;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(c);break}a[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],r=0}finally{n=a=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(n){switch(n.label){case 0:return[4,e.api.request({url:"".concat(p.C,":list"),method:"get"})];case 1:return[2,null!=(t=n.sent().data)?t:K]}})},function(){var e=this,n=arguments;return new Promise(function(r,a){var o=t.apply(e,n);function u(e){z(o,r,a,u,l,"next",e)}function l(e){z(o,r,a,u,l,"throw",e)}u(void 0)})})()});return l().createElement(d.Provider,{value:t},l().createElement(o.Card,{bordered:!1},l().createElement(o.Space,{style:{float:"right",marginBottom:16}},l().createElement(L,null),l().createElement(H,null),l().createElement(D,null)),l().createElement(I,null)))}},488:function(e,t,n){"use strict";n.d(t,{k:function(){return o}});var r=n(694),a=n(401);function o(){var e=(0,r.useFlowEngine)();return function(t,n){return e.context.t(t,function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({ns:[a.C,"client"]},n))}}}}]);
|