@datatruck/cli 0.27.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Action/BackupAction.d.ts +75 -34
- package/Action/BackupAction.js +302 -246
- package/Action/CleanCacheAction.d.ts +8 -4
- package/Action/CleanCacheAction.js +8 -5
- package/Action/ConfigAction.d.ts +12 -5
- package/Action/ConfigAction.js +14 -18
- package/Action/CopyAction.d.ts +51 -0
- package/Action/CopyAction.js +165 -0
- package/Action/InitAction.d.ts +3 -3
- package/Action/InitAction.js +9 -9
- package/Action/PruneAction.d.ts +10 -16
- package/Action/PruneAction.js +37 -34
- package/Action/RestoreAction.d.ts +49 -24
- package/Action/RestoreAction.js +164 -195
- package/Action/SnapshotsAction.d.ts +8 -8
- package/Action/SnapshotsAction.js +9 -9
- package/CHANGELOG.md +513 -0
- package/Command/BackupCommand.d.ts +7 -4
- package/Command/BackupCommand.js +14 -26
- package/Command/CleanCacheCommand.d.ts +4 -4
- package/Command/CleanCacheCommand.js +26 -5
- package/Command/CommandAbstract.d.ts +10 -7
- package/Command/CommandAbstract.js +4 -1
- package/Command/ConfigCommand.d.ts +6 -9
- package/Command/ConfigCommand.js +13 -8
- package/Command/CopyCommand.d.ts +16 -0
- package/Command/CopyCommand.js +66 -0
- package/Command/InitCommand.d.ts +4 -4
- package/Command/InitCommand.js +13 -17
- package/Command/PruneCommand.d.ts +4 -10
- package/Command/PruneCommand.js +13 -12
- package/Command/RestoreCommand.d.ts +1 -1
- package/Command/RestoreCommand.js +13 -21
- package/Command/SnapshotsCommand.d.ts +4 -4
- package/Command/SnapshotsCommand.js +16 -15
- package/Command/StartServerCommand.d.ts +3 -3
- package/Config/Config.d.ts +11 -0
- package/Config/Config.js +18 -0
- package/Config/PrunePolicyConfig.d.ts +2 -2
- package/Factory/CommandFactory.d.ts +27 -34
- package/Factory/CommandFactory.js +27 -54
- package/Factory/RepositoryFactory.d.ts +1 -1
- package/Factory/RepositoryFactory.js +3 -3
- package/Factory/TaskFactory.d.ts +1 -1
- package/Factory/TaskFactory.js +3 -3
- package/Repository/DatatruckRepository.d.ts +10 -8
- package/Repository/DatatruckRepository.js +47 -25
- package/Repository/GitRepository.d.ts +9 -8
- package/Repository/GitRepository.js +22 -25
- package/Repository/RepositoryAbstract.d.ts +39 -37
- package/Repository/RepositoryAbstract.js +4 -5
- package/Repository/ResticRepository.d.ts +9 -8
- package/Repository/ResticRepository.js +30 -28
- package/Task/GitTask.d.ts +6 -7
- package/Task/GitTask.js +24 -30
- package/Task/MariadbTask.d.ts +4 -5
- package/Task/MariadbTask.js +26 -32
- package/Task/MssqlTask.d.ts +5 -3
- package/Task/MssqlTask.js +11 -12
- package/Task/MysqlDumpTask.d.ts +10 -3
- package/Task/MysqlDumpTask.js +102 -32
- package/Task/ScriptTask.d.ts +23 -18
- package/Task/ScriptTask.js +34 -24
- package/Task/SqlDumpTaskAbstract.d.ts +8 -3
- package/Task/SqlDumpTaskAbstract.js +32 -20
- package/Task/TaskAbstract.d.ts +24 -25
- package/Task/TaskAbstract.js +6 -10
- package/cli.js +13 -5
- package/config.schema.json +89 -1
- package/package.json +4 -5
- package/utils/DataFormat.d.ts +23 -12
- package/utils/DataFormat.js +36 -14
- package/utils/cli.d.ts +3 -9
- package/utils/cli.js +19 -55
- package/utils/crypto.d.ts +1 -0
- package/utils/crypto.js +15 -0
- package/utils/datatruck/client.d.ts +2 -0
- package/utils/datatruck/client.js +3 -0
- package/utils/datatruck/config.d.ts +2 -0
- package/utils/datatruck/config.js +18 -3
- package/utils/datatruck/paths.d.ts +5 -9
- package/utils/datatruck/paths.js +2 -2
- package/utils/datatruck/snapshot.d.ts +5 -2
- package/utils/datatruck/snapshot.js +12 -22
- package/utils/date.d.ts +21 -4
- package/utils/date.js +46 -24
- package/utils/fs.d.ts +16 -11
- package/utils/fs.js +81 -48
- package/utils/list.d.ts +64 -0
- package/utils/list.js +145 -0
- package/utils/mysql.d.ts +2 -0
- package/utils/mysql.js +21 -2
- package/utils/process.d.ts +1 -0
- package/utils/process.js +24 -31
- package/utils/progress.d.ts +33 -0
- package/utils/progress.js +113 -0
- package/utils/steps.d.ts +11 -0
- package/utils/steps.js +22 -10
- package/utils/stream.d.ts +7 -0
- package/utils/stream.js +10 -0
- package/utils/string.d.ts +0 -1
- package/utils/string.js +1 -13
- package/utils/tar.d.ts +10 -3
- package/utils/tar.js +73 -45
- package/utils/temp.d.ts +26 -0
- package/utils/temp.js +133 -0
- package/utils/virtual-fs.d.ts +6 -2
- package/utils/virtual-fs.js +6 -0
- package/Action/BackupSessionsAction.d.ts +0 -13
- package/Action/BackupSessionsAction.js +0 -18
- package/Action/RestoreSessionsAction.d.ts +0 -13
- package/Action/RestoreSessionsAction.js +0 -18
- package/Command/BackupSessionsCommand.d.ts +0 -12
- package/Command/BackupSessionsCommand.js +0 -92
- package/Command/RestoreSessionsCommand.d.ts +0 -12
- package/Command/RestoreSessionsCommand.js +0 -91
- package/Decorator/EntityDecorator.d.ts +0 -11
- package/Decorator/EntityDecorator.js +0 -17
- package/Entity/BackupSessionEntity.d.ts +0 -6
- package/Entity/BackupSessionEntity.js +0 -25
- package/Entity/BackupSessionRepositoryEntity.d.ts +0 -6
- package/Entity/BackupSessionRepositoryEntity.js +0 -25
- package/Entity/BackupSessionTaskEntity.d.ts +0 -5
- package/Entity/BackupSessionTaskEntity.js +0 -24
- package/Entity/CrudEntityAbstract.d.ts +0 -5
- package/Entity/CrudEntityAbstract.js +0 -9
- package/Entity/RestoreSessionEntity.d.ts +0 -5
- package/Entity/RestoreSessionEntity.js +0 -24
- package/Entity/RestoreSessionRepositoryEntity.d.ts +0 -6
- package/Entity/RestoreSessionRepositoryEntity.js +0 -25
- package/Entity/RestoreSessionTaskEntity.d.ts +0 -5
- package/Entity/RestoreSessionTaskEntity.js +0 -24
- package/Entity/StateEntityAbstract.d.ts +0 -9
- package/Entity/StateEntityAbstract.js +0 -12
- package/Factory/EntityFactory.d.ts +0 -6
- package/Factory/EntityFactory.js +0 -40
- package/SessionDriver/ConsoleSessionDriver.d.ts +0 -42
- package/SessionDriver/ConsoleSessionDriver.js +0 -208
- package/SessionDriver/SessionDriverAbstract.d.ts +0 -77
- package/SessionDriver/SessionDriverAbstract.js +0 -28
- package/SessionDriver/SqliteSessionDriver.d.ts +0 -20
- package/SessionDriver/SqliteSessionDriver.js +0 -173
- package/SessionManager/BackupSessionManager.d.ts +0 -45
- package/SessionManager/BackupSessionManager.js +0 -218
- package/SessionManager/RestoreSessionManager.d.ts +0 -47
- package/SessionManager/RestoreSessionManager.js +0 -218
- package/SessionManager/SessionManagerAbstract.d.ts +0 -18
- package/SessionManager/SessionManagerAbstract.js +0 -36
- package/migrations/001-initial.sql +0 -98
- package/utils/entity.d.ts +0 -4
- package/utils/entity.js +0 -10
package/utils/DataFormat.js
CHANGED
|
@@ -3,21 +3,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.DataFormat = void 0;
|
|
6
|
+
exports.DataFormat = exports.dataFormats = void 0;
|
|
7
7
|
const AppError_1 = require("../Error/AppError");
|
|
8
|
-
const
|
|
8
|
+
const stream_1 = require("./stream");
|
|
9
|
+
const tty_table_1 = __importDefault(require("tty-table"));
|
|
9
10
|
const util_1 = require("util");
|
|
11
|
+
exports.dataFormats = [
|
|
12
|
+
"json",
|
|
13
|
+
"list",
|
|
14
|
+
"pjson",
|
|
15
|
+
"table",
|
|
16
|
+
"yaml",
|
|
17
|
+
"custom",
|
|
18
|
+
"tpl",
|
|
19
|
+
];
|
|
10
20
|
const customPrefix = "custom=";
|
|
11
21
|
const tplPrefix = "tpl=";
|
|
12
22
|
class DataFormat {
|
|
13
23
|
options;
|
|
24
|
+
streams;
|
|
14
25
|
constructor(options) {
|
|
15
26
|
this.options = options;
|
|
27
|
+
this.streams = (0, stream_1.createStreams)(options.streams);
|
|
28
|
+
}
|
|
29
|
+
getJson() {
|
|
30
|
+
return this.options.json;
|
|
16
31
|
}
|
|
17
32
|
formatToJson() {
|
|
18
|
-
return JSON.stringify(this.
|
|
19
|
-
? this.options.items.map(this.options.json)
|
|
20
|
-
: this.options.items);
|
|
33
|
+
return JSON.stringify(this.getJson());
|
|
21
34
|
}
|
|
22
35
|
formatToPrettyJson() {
|
|
23
36
|
return (0, util_1.formatWithOptions)({
|
|
@@ -27,23 +40,32 @@ class DataFormat {
|
|
|
27
40
|
maxStringLength: Infinity,
|
|
28
41
|
breakLength: Infinity,
|
|
29
42
|
compact: false,
|
|
30
|
-
}, this.
|
|
43
|
+
}, this.getJson());
|
|
31
44
|
}
|
|
32
45
|
formatToYaml() {
|
|
33
|
-
return require("yaml").stringify(this.
|
|
46
|
+
return require("yaml").stringify(this.getJson());
|
|
34
47
|
}
|
|
35
48
|
formatToTable() {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
if (!this.options.table)
|
|
50
|
+
throw new Error(`Unsupported format: table`);
|
|
51
|
+
const table = (0, tty_table_1.default)(this.options.table.headers, this.options.table.rows(), {});
|
|
52
|
+
return table.render();
|
|
53
|
+
}
|
|
54
|
+
formatToList() {
|
|
55
|
+
if (!this.options.list)
|
|
56
|
+
throw new Error(`Unsupported format: list`);
|
|
57
|
+
return this.options.list().join("\n");
|
|
58
|
+
}
|
|
59
|
+
log(format, options) {
|
|
60
|
+
this.streams.stdout.write(`${this.format(format, options)}\n`);
|
|
42
61
|
}
|
|
43
62
|
format(format, options) {
|
|
44
63
|
if (format === "table") {
|
|
45
64
|
return this.formatToTable();
|
|
46
65
|
}
|
|
66
|
+
else if (format === "list") {
|
|
67
|
+
return this.formatToList();
|
|
68
|
+
}
|
|
47
69
|
else if (format === "json") {
|
|
48
70
|
return this.formatToJson();
|
|
49
71
|
}
|
|
@@ -55,7 +77,7 @@ class DataFormat {
|
|
|
55
77
|
}
|
|
56
78
|
else if (format.startsWith(customPrefix)) {
|
|
57
79
|
const code = format.slice(customPrefix.length);
|
|
58
|
-
return runCustomCode(this.
|
|
80
|
+
return runCustomCode(this.getJson(), code);
|
|
59
81
|
}
|
|
60
82
|
else if (format.startsWith(tplPrefix)) {
|
|
61
83
|
const name = format.slice(tplPrefix.length);
|
package/utils/cli.d.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
export declare function clearLastLine(): void;
|
|
3
|
-
export declare const spinnerChars: string[];
|
|
4
2
|
export declare const showCursorCommand = "\u001B[?25h";
|
|
5
|
-
export declare const clearCommand = "\r\u001B[K";
|
|
6
|
-
export declare const hideCursorCommand = "\u001B[?25l";
|
|
7
|
-
export declare function renderSpinner(counter: number): string;
|
|
8
3
|
export declare function renderProgressBar(progress: number, size?: number, subprogress?: number): string;
|
|
9
|
-
export declare function logVars(data: Record<string, any>): void;
|
|
10
4
|
export declare function logExec(command: string, argv?: string[], env?: NodeJS.ProcessEnv, logToStderr?: boolean): void;
|
|
11
|
-
export declare function
|
|
12
|
-
export declare function
|
|
5
|
+
export declare function renderResult(error: Error | null | string | boolean | undefined, color?: boolean): string;
|
|
6
|
+
export declare function renderError(error: Error | null | string | undefined, verbose?: number): string;
|
|
7
|
+
export declare function renderObject(object: Record<string, any>): string;
|
|
13
8
|
export type OptionsType<T1, T2 extends {
|
|
14
9
|
[K in keyof T1]: unknown;
|
|
15
10
|
}> = {
|
|
@@ -24,5 +19,4 @@ export type OptionsType<T1, T2 extends {
|
|
|
24
19
|
export declare function parseOptions<T1, T2 extends {
|
|
25
20
|
[K in keyof T1]: unknown;
|
|
26
21
|
}>(object: T1, options: OptionsType<T1, T2>): T2;
|
|
27
|
-
export declare function truncate(text: string, limit: number): [string, boolean];
|
|
28
22
|
export declare function confirm(message: string): Promise<unknown>;
|
package/utils/cli.js
CHANGED
|
@@ -3,23 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.confirm = exports.
|
|
6
|
+
exports.confirm = exports.parseOptions = exports.renderObject = exports.renderError = exports.renderResult = exports.logExec = exports.renderProgressBar = exports.showCursorCommand = void 0;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
8
|
const chalk_2 = require("chalk");
|
|
9
9
|
const readline_1 = require("readline");
|
|
10
|
-
function clearLastLine() {
|
|
11
|
-
process.stdout.moveCursor(0, -1);
|
|
12
|
-
process.stdout.clearLine(1);
|
|
13
|
-
}
|
|
14
|
-
exports.clearLastLine = clearLastLine;
|
|
15
|
-
exports.spinnerChars = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
16
10
|
exports.showCursorCommand = "\u001B[?25h";
|
|
17
|
-
exports.clearCommand = "\r\x1b[K";
|
|
18
|
-
exports.hideCursorCommand = "\x1B[?25l";
|
|
19
|
-
function renderSpinner(counter) {
|
|
20
|
-
return exports.spinnerChars[counter % (exports.spinnerChars.length - 1)];
|
|
21
|
-
}
|
|
22
|
-
exports.renderSpinner = renderSpinner;
|
|
23
11
|
function renderProgressBar(progress, size = 10, subprogress) {
|
|
24
12
|
if (progress > 100)
|
|
25
13
|
throw new Error(`Invalid progress value: ${progress}`);
|
|
@@ -45,18 +33,6 @@ function renderProgressBar(progress, size = 10, subprogress) {
|
|
|
45
33
|
return (0, chalk_2.cyan)(result);
|
|
46
34
|
}
|
|
47
35
|
exports.renderProgressBar = renderProgressBar;
|
|
48
|
-
function logVars(data) {
|
|
49
|
-
let first = true;
|
|
50
|
-
for (const key in data) {
|
|
51
|
-
if (first) {
|
|
52
|
-
console.info();
|
|
53
|
-
first = false;
|
|
54
|
-
}
|
|
55
|
-
const value = data[key];
|
|
56
|
-
console.info(`${chalk_1.default.cyan(key)}${chalk_1.default.grey(":")} ${chalk_1.default.white(value ?? "")}`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
exports.logVars = logVars;
|
|
60
36
|
function logExec(command, argv = [], env, logToStderr) {
|
|
61
37
|
const envText = env
|
|
62
38
|
? Object.keys(env)
|
|
@@ -72,11 +48,17 @@ function logExec(command, argv = [], env, logToStderr) {
|
|
|
72
48
|
: console.info(text);
|
|
73
49
|
}
|
|
74
50
|
exports.logExec = logExec;
|
|
75
|
-
function
|
|
76
|
-
return error
|
|
51
|
+
function renderResult(error, color = true) {
|
|
52
|
+
return error
|
|
53
|
+
? color
|
|
54
|
+
? chalk_1.default.red("Χ")
|
|
55
|
+
: "Χ"
|
|
56
|
+
: color
|
|
57
|
+
? chalk_1.default.green("✓")
|
|
58
|
+
: "✓";
|
|
77
59
|
}
|
|
78
|
-
exports.
|
|
79
|
-
function
|
|
60
|
+
exports.renderResult = renderResult;
|
|
61
|
+
function renderError(error, verbose) {
|
|
80
62
|
let message = null;
|
|
81
63
|
if (typeof error === "string") {
|
|
82
64
|
message = error;
|
|
@@ -92,7 +74,14 @@ function errorColumn(error, verbose) {
|
|
|
92
74
|
}
|
|
93
75
|
return chalk_1.default.red(message.trim());
|
|
94
76
|
}
|
|
95
|
-
exports.
|
|
77
|
+
exports.renderError = renderError;
|
|
78
|
+
function renderObject(object) {
|
|
79
|
+
const values = [];
|
|
80
|
+
for (const key in object)
|
|
81
|
+
values.push(`${key}: ${(0, chalk_2.grey)(object[key])}`);
|
|
82
|
+
return values.join(` `);
|
|
83
|
+
}
|
|
84
|
+
exports.renderObject = renderObject;
|
|
96
85
|
function parseOptions(object, options) {
|
|
97
86
|
const result = {};
|
|
98
87
|
for (const key in options) {
|
|
@@ -107,31 +96,6 @@ function parseOptions(object, options) {
|
|
|
107
96
|
return result;
|
|
108
97
|
}
|
|
109
98
|
exports.parseOptions = parseOptions;
|
|
110
|
-
function truncate(text, limit) {
|
|
111
|
-
let inColor = false;
|
|
112
|
-
let visibleLength = 0;
|
|
113
|
-
if (limit >= text.length)
|
|
114
|
-
return [text, false];
|
|
115
|
-
for (let index = 0; index < text.length; ++index) {
|
|
116
|
-
const c = text[index];
|
|
117
|
-
if (c === "\x1B") {
|
|
118
|
-
inColor = true;
|
|
119
|
-
}
|
|
120
|
-
else if (inColor) {
|
|
121
|
-
if (c === "m") {
|
|
122
|
-
inColor = false;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
visibleLength++;
|
|
127
|
-
}
|
|
128
|
-
if (visibleLength === limit) {
|
|
129
|
-
return [text.slice(0, index) + (inColor ? `\x1B[39m` : ""), true];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return [text, false];
|
|
133
|
-
}
|
|
134
|
-
exports.truncate = truncate;
|
|
135
99
|
function confirm(message) {
|
|
136
100
|
const rl = (0, readline_1.createInterface)({
|
|
137
101
|
input: process.stdin,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function calcFileHash(path: string, algorithm: string): Promise<string>;
|
package/utils/crypto.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calcFileHash = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
function calcFileHash(path, algorithm) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const hash = (0, crypto_1.createHash)(algorithm);
|
|
9
|
+
(0, fs_1.createReadStream)(path)
|
|
10
|
+
.on("error", reject)
|
|
11
|
+
.on("data", (chunk) => hash.update(chunk))
|
|
12
|
+
.on("end", () => resolve(hash.digest("hex")));
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
exports.calcFileHash = calcFileHash;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DiskStats } from "../fs";
|
|
1
2
|
import { AbstractFs, FsOptions } from "../virtual-fs";
|
|
2
3
|
export declare class RemoteFs extends AbstractFs {
|
|
3
4
|
readonly options: FsOptions;
|
|
@@ -15,6 +16,7 @@ export declare class RemoteFs extends AbstractFs {
|
|
|
15
16
|
ensureEmptyDir(path: string): Promise<void>;
|
|
16
17
|
writeFile(path: string, contents: string): Promise<void>;
|
|
17
18
|
rmAll(path: string): Promise<void>;
|
|
19
|
+
fetchDiskStats(path: string): Promise<DiskStats>;
|
|
18
20
|
upload(source: string, target: string): Promise<void>;
|
|
19
21
|
download(source: string, target: string, timeout?: number): Promise<void>;
|
|
20
22
|
}
|
|
@@ -65,6 +65,9 @@ class RemoteFs extends virtual_fs_1.AbstractFs {
|
|
|
65
65
|
async rmAll(path) {
|
|
66
66
|
await this.fetchJson("rmAll", [path]);
|
|
67
67
|
}
|
|
68
|
+
async fetchDiskStats(path) {
|
|
69
|
+
return await this.fetchJson("fetchDiskStats", [path]);
|
|
70
|
+
}
|
|
68
71
|
async upload(source, target) {
|
|
69
72
|
await (0, http_1.uploadFile)(`${this.url}/upload`, source, {
|
|
70
73
|
headers: this.headers,
|
|
@@ -2,6 +2,8 @@ import { ConfigType } from "../../Config/Config";
|
|
|
2
2
|
import type { PackageConfigType } from "../../Config/PackageConfig";
|
|
3
3
|
import { RepositoryConfigEnabledActionType, RepositoryConfigType } from "../../Config/RepositoryConfig";
|
|
4
4
|
export declare function findRepositoryOrFail(config: ConfigType, repositoryName: string): RepositoryConfigType;
|
|
5
|
+
export declare function findPackageOrFail(config: ConfigType, packageName: string): PackageConfigType;
|
|
6
|
+
export declare function ensureSameRepositoryType(a: RepositoryConfigType, b: RepositoryConfigType): void;
|
|
5
7
|
export declare function filterRepository(repository: RepositoryConfigType, action?: RepositoryConfigEnabledActionType): boolean;
|
|
6
8
|
export declare function filterPackages(config: ConfigType, options: {
|
|
7
9
|
packageNames?: string[];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.params = exports.dbNameParams = exports.pkgRestorePathParams = exports.pkgExcludeParams = exports.pkgIncludeParams = exports.pkgPathParams = exports.resolvePackages = exports.resolvePackage = exports.resolveDatabaseName = exports.resolvePackagePath = exports.filterPackages = exports.filterRepository = exports.findRepositoryOrFail = void 0;
|
|
3
|
+
exports.params = exports.dbNameParams = exports.pkgRestorePathParams = exports.pkgExcludeParams = exports.pkgIncludeParams = exports.pkgPathParams = exports.resolvePackages = exports.resolvePackage = exports.resolveDatabaseName = exports.resolvePackagePath = exports.filterPackages = exports.filterRepository = exports.ensureSameRepositoryType = exports.findPackageOrFail = exports.findRepositoryOrFail = void 0;
|
|
4
4
|
const AppError_1 = require("../../Error/AppError");
|
|
5
|
-
const fs_1 = require("../fs");
|
|
6
5
|
const string_1 = require("../string");
|
|
6
|
+
const temp_1 = require("../temp");
|
|
7
7
|
const micromatch_1 = require("micromatch");
|
|
8
8
|
function findRepositoryOrFail(config, repositoryName) {
|
|
9
9
|
const repo = config.repositories.find((v) => v.name === repositoryName);
|
|
@@ -12,6 +12,21 @@ function findRepositoryOrFail(config, repositoryName) {
|
|
|
12
12
|
return repo;
|
|
13
13
|
}
|
|
14
14
|
exports.findRepositoryOrFail = findRepositoryOrFail;
|
|
15
|
+
function findPackageOrFail(config, packageName) {
|
|
16
|
+
const pkg = config.packages.find((v) => v.name === packageName);
|
|
17
|
+
if (!pkg)
|
|
18
|
+
throw new AppError_1.AppError(`Package '${packageName}' not found`);
|
|
19
|
+
return pkg;
|
|
20
|
+
}
|
|
21
|
+
exports.findPackageOrFail = findPackageOrFail;
|
|
22
|
+
function ensureSameRepositoryType(a, b) {
|
|
23
|
+
if (a.type !== b.type) {
|
|
24
|
+
const names = [a.name, b.name].join(" and ");
|
|
25
|
+
const types = [a.type, b.type].join(" != ");
|
|
26
|
+
throw new Error(`Incompatible repository types between ${names} (${types})`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.ensureSameRepositoryType = ensureSameRepositoryType;
|
|
15
30
|
function filterRepository(repository, action) {
|
|
16
31
|
const enabled = repository.enabled ?? true;
|
|
17
32
|
if (typeof enabled === "boolean")
|
|
@@ -50,7 +65,7 @@ function resolvePackagePath(value, params) {
|
|
|
50
65
|
return (0, string_1.render)(value, {
|
|
51
66
|
...params,
|
|
52
67
|
...{
|
|
53
|
-
temp: (0,
|
|
68
|
+
temp: (0, temp_1.tmpDir)("pkg"),
|
|
54
69
|
},
|
|
55
70
|
});
|
|
56
71
|
}
|
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
import { PackageConfigType } from "../../Config/PackageConfig";
|
|
2
|
-
import {
|
|
2
|
+
import { PreSnapshot } from "../../Repository/RepositoryAbstract";
|
|
3
3
|
import { Step } from "../steps";
|
|
4
4
|
export type ParsePathsOptions = {
|
|
5
5
|
cwd?: string;
|
|
6
6
|
verbose?: boolean;
|
|
7
7
|
vars?: Record<string, any>;
|
|
8
|
-
};
|
|
9
|
-
export declare function parsePaths(values: (string | Step)[], options: {
|
|
10
|
-
cwd?: string;
|
|
11
|
-
verbose?: boolean;
|
|
12
|
-
vars?: Record<string, any>;
|
|
13
8
|
tempDir?: () => Promise<string>;
|
|
14
|
-
}
|
|
9
|
+
};
|
|
10
|
+
export declare function parsePaths(values: (string | Step)[], options: ParsePathsOptions): Promise<string[]>;
|
|
15
11
|
export type BackupPathsOptions = {
|
|
16
12
|
package: PackageConfigType;
|
|
17
|
-
snapshot:
|
|
18
|
-
|
|
13
|
+
snapshot: PreSnapshot;
|
|
14
|
+
path: string;
|
|
19
15
|
verbose?: boolean;
|
|
20
16
|
};
|
|
21
17
|
export declare function parseBackupPaths(paths: (string | Step)[], options: BackupPathsOptions): Promise<string[]>;
|
package/utils/datatruck/paths.js
CHANGED
|
@@ -21,13 +21,13 @@ async function parsePaths(values, options) {
|
|
|
21
21
|
exports.parsePaths = parsePaths;
|
|
22
22
|
async function parseBackupPaths(paths, options) {
|
|
23
23
|
return parsePaths(paths, {
|
|
24
|
-
cwd: options.
|
|
24
|
+
cwd: options.path,
|
|
25
25
|
verbose: options.verbose,
|
|
26
26
|
vars: {
|
|
27
27
|
dtt: {
|
|
28
28
|
package: options.package,
|
|
29
29
|
snapshot: options.snapshot,
|
|
30
|
-
|
|
30
|
+
path: options.path,
|
|
31
31
|
},
|
|
32
32
|
},
|
|
33
33
|
});
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { SnapshotGroupByType } from "../../Action/SnapshotsAction";
|
|
2
|
-
import {
|
|
2
|
+
import { Snapshot } from "../../Repository/RepositoryAbstract";
|
|
3
3
|
import { FilterByLastOptionsType } from "../date";
|
|
4
|
-
export declare function groupAndFilter<TSnapshot extends
|
|
4
|
+
export declare function groupAndFilter<TSnapshot extends Snapshot>(snapshots: TSnapshot[], groupKeys?: SnapshotGroupByType[], inFilter?: FilterByLastOptionsType | ((group: TSnapshot[]) => FilterByLastOptionsType | string)): {
|
|
5
|
+
item: TSnapshot;
|
|
6
|
+
reasons: string[];
|
|
7
|
+
}[];
|
|
@@ -3,29 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.groupAndFilter = void 0;
|
|
4
4
|
const date_1 = require("../date");
|
|
5
5
|
const object_1 = require("../object");
|
|
6
|
-
function groupAndFilter(snapshots,
|
|
7
|
-
const
|
|
8
|
-
? (0, object_1.groupBy)(snapshots,
|
|
6
|
+
function groupAndFilter(snapshots, groupKeys, inFilter) {
|
|
7
|
+
const groups = groupKeys?.length
|
|
8
|
+
? (0, object_1.groupBy)(snapshots, groupKeys)
|
|
9
9
|
: { "": snapshots };
|
|
10
|
-
const
|
|
11
|
-
for (const key in
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
result.push(...(0, date_1.filterByLast)(grouped[key], typeof filter === "function" ? filter(grouped[key]) : filter, groupReasons));
|
|
17
|
-
if (groupReasons && reasons) {
|
|
18
|
-
for (const groupItemIndex in groupReasons) {
|
|
19
|
-
const snapshot = grouped[key][groupItemIndex];
|
|
20
|
-
const snapshotIndex = snapshots.indexOf(snapshot);
|
|
21
|
-
reasons[snapshotIndex] = groupReasons[groupItemIndex];
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
result.push(...grouped[key]);
|
|
27
|
-
}
|
|
10
|
+
const keep = [];
|
|
11
|
+
for (const key in groups) {
|
|
12
|
+
const filter = typeof inFilter === "function" ? inFilter(groups[key]) : inFilter || {};
|
|
13
|
+
keep.push(...(typeof filter === "string"
|
|
14
|
+
? groups[key].map((item) => ({ item, reasons: [filter] }))
|
|
15
|
+
: (0, date_1.filterByLast)(groups[key], filter)));
|
|
28
16
|
}
|
|
29
|
-
return snapshots
|
|
17
|
+
return snapshots
|
|
18
|
+
.map((snapshot) => keep.find((v) => v.item === snapshot))
|
|
19
|
+
.filter((v) => !!v);
|
|
30
20
|
}
|
|
31
21
|
exports.groupAndFilter = groupAndFilter;
|
package/utils/date.d.ts
CHANGED
|
@@ -7,10 +7,27 @@ export type FilterByLastOptionsType = {
|
|
|
7
7
|
lastMonthly?: number;
|
|
8
8
|
lastYearly?: number;
|
|
9
9
|
};
|
|
10
|
+
export type KeepObject = {
|
|
11
|
+
keepLast?: number;
|
|
12
|
+
keepMinutely?: number;
|
|
13
|
+
keepHourly?: number;
|
|
14
|
+
keepDaily?: number;
|
|
15
|
+
keepWeekly?: number;
|
|
16
|
+
keepMonthly?: number;
|
|
17
|
+
keepYearly?: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function createFilterByLastOptions(keep: KeepObject): FilterByLastOptionsType;
|
|
10
20
|
export declare function filterByLast<TItem extends {
|
|
11
21
|
date: string;
|
|
12
|
-
}>(items: TItem[], options: FilterByLastOptionsType
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
22
|
+
}>(items: TItem[], options: FilterByLastOptionsType): {
|
|
23
|
+
item: TItem;
|
|
24
|
+
reasons: string[];
|
|
25
|
+
}[];
|
|
26
|
+
export type Timer = {
|
|
27
|
+
reset: (min?: number) => boolean;
|
|
28
|
+
check: (min: number) => boolean;
|
|
29
|
+
elapsed: () => number;
|
|
30
|
+
stop: () => void;
|
|
16
31
|
};
|
|
32
|
+
export declare function createTimer(): Timer;
|
|
33
|
+
export declare function duration(ms: number): string;
|
package/utils/date.js
CHANGED
|
@@ -3,14 +3,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
const string_1 = require("./string");
|
|
6
|
+
exports.duration = exports.createTimer = exports.filterByLast = exports.createFilterByLastOptions = void 0;
|
|
8
7
|
const dayjs_1 = __importDefault(require("dayjs"));
|
|
9
8
|
const advancedFormat_1 = __importDefault(require("dayjs/plugin/advancedFormat"));
|
|
9
|
+
const customParseFormat_1 = __importDefault(require("dayjs/plugin/customParseFormat"));
|
|
10
|
+
const duration_1 = __importDefault(require("dayjs/plugin/duration"));
|
|
10
11
|
const isoWeek_1 = __importDefault(require("dayjs/plugin/isoWeek"));
|
|
11
12
|
dayjs_1.default.extend(isoWeek_1.default);
|
|
12
13
|
dayjs_1.default.extend(advancedFormat_1.default);
|
|
13
|
-
|
|
14
|
+
dayjs_1.default.extend(duration_1.default);
|
|
15
|
+
dayjs_1.default.extend(customParseFormat_1.default);
|
|
16
|
+
function createFilterByLastOptions(keep) {
|
|
17
|
+
return {
|
|
18
|
+
last: keep.keepLast,
|
|
19
|
+
lastMinutely: keep.keepMinutely,
|
|
20
|
+
lastHourly: keep.keepHourly,
|
|
21
|
+
lastDaily: keep.keepDaily,
|
|
22
|
+
lastMonthly: keep.keepMonthly,
|
|
23
|
+
lastWeekly: keep.keepWeekly,
|
|
24
|
+
lastYearly: keep.keepYearly,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
exports.createFilterByLastOptions = createFilterByLastOptions;
|
|
28
|
+
function filterByLast(items, options) {
|
|
14
29
|
const filters = {
|
|
15
30
|
last: { handler: (_, i) => i.toString(), value: options.last },
|
|
16
31
|
lastMinutely: {
|
|
@@ -43,13 +58,13 @@ function filterByLast(items, options, reasons) {
|
|
|
43
58
|
}
|
|
44
59
|
}
|
|
45
60
|
if (!someFilter)
|
|
46
|
-
return items;
|
|
61
|
+
return items.map((item) => ({ item, reasons: ["no-filter"] }));
|
|
62
|
+
const reasons = new Map();
|
|
47
63
|
const validItems = items
|
|
48
64
|
.slice(0)
|
|
49
65
|
.sort((a, b) => b.date.localeCompare(a.date))
|
|
50
66
|
.filter((item, index) => {
|
|
51
67
|
const date = (0, dayjs_1.default)(item.date);
|
|
52
|
-
const itemIndex = items.indexOf(item);
|
|
53
68
|
let success = false;
|
|
54
69
|
for (const key in filters) {
|
|
55
70
|
const object = filters[key];
|
|
@@ -57,12 +72,7 @@ function filterByLast(items, options, reasons) {
|
|
|
57
72
|
const value = object.handler(date, index);
|
|
58
73
|
if (value != object.last) {
|
|
59
74
|
success = true;
|
|
60
|
-
|
|
61
|
-
if (!reasons[itemIndex])
|
|
62
|
-
reasons[itemIndex] = [];
|
|
63
|
-
if (!reasons[itemIndex].includes(key))
|
|
64
|
-
reasons[itemIndex].push(key);
|
|
65
|
-
}
|
|
75
|
+
reasons.set(item, (reasons.get(item) || new Set()).add(key));
|
|
66
76
|
object.last = value;
|
|
67
77
|
object.value--;
|
|
68
78
|
}
|
|
@@ -70,21 +80,33 @@ function filterByLast(items, options, reasons) {
|
|
|
70
80
|
}
|
|
71
81
|
return success;
|
|
72
82
|
});
|
|
73
|
-
return items
|
|
83
|
+
return items
|
|
84
|
+
.filter((item) => validItems.includes(item))
|
|
85
|
+
.map((item) => ({
|
|
86
|
+
item,
|
|
87
|
+
reasons: [...(reasons.get(item) || [])],
|
|
88
|
+
}));
|
|
74
89
|
}
|
|
75
90
|
exports.filterByLast = filterByLast;
|
|
76
|
-
function
|
|
77
|
-
let startTime;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
elapsed: (
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (
|
|
85
|
-
return
|
|
86
|
-
|
|
91
|
+
function createTimer() {
|
|
92
|
+
let startTime = Date.now();
|
|
93
|
+
let endTime;
|
|
94
|
+
const timer = {
|
|
95
|
+
elapsed: () => (endTime || Date.now()) - startTime,
|
|
96
|
+
check: (ms) => timer.elapsed() > ms,
|
|
97
|
+
stop: () => (endTime = Date.now()),
|
|
98
|
+
reset: (min) => {
|
|
99
|
+
if (typeof min === "number" && !timer.check(min))
|
|
100
|
+
return false;
|
|
101
|
+
startTime = Date.now();
|
|
102
|
+
endTime = undefined;
|
|
103
|
+
return true;
|
|
87
104
|
},
|
|
88
105
|
};
|
|
106
|
+
return timer;
|
|
107
|
+
}
|
|
108
|
+
exports.createTimer = createTimer;
|
|
109
|
+
function duration(ms) {
|
|
110
|
+
return dayjs_1.default.duration(ms, "ms").format("HH:mm:ss");
|
|
89
111
|
}
|
|
90
|
-
exports.
|
|
112
|
+
exports.duration = duration;
|
package/utils/fs.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export declare function isEmptyDir(path: string): Promise<boolean>;
|
|
|
11
11
|
export declare function isLocalDir(path: string): boolean;
|
|
12
12
|
export declare function mkdirIfNotExists(path: string): Promise<string>;
|
|
13
13
|
export declare function ensureEmptyDir(path: string): Promise<void>;
|
|
14
|
+
export declare function ensureSingleFile(path: string): Promise<string>;
|
|
15
|
+
export declare function ensureExistsDir(path: string): Promise<void>;
|
|
14
16
|
export declare function safeStat(path: string): Promise<Stats | undefined>;
|
|
15
17
|
export declare function existsDir(path: string): Promise<boolean>;
|
|
16
18
|
export declare function existsFile(path: string): Promise<boolean>;
|
|
@@ -23,13 +25,7 @@ export declare function parsePackageFile(): {
|
|
|
23
25
|
description: string;
|
|
24
26
|
};
|
|
25
27
|
export declare function findFile(sourcePath: string, baseName: string, extensions: string[], errorMessage?: string): Promise<string>;
|
|
26
|
-
export declare function parentTmpDir(): string;
|
|
27
|
-
export declare function sessionTmpDir(): string;
|
|
28
|
-
export declare function isTmpDir(path: string): boolean;
|
|
29
|
-
export declare function rmTmpDir(input: string | string[]): Promise<void>;
|
|
30
|
-
export declare function tmpDir(prefix: string, id?: string): string;
|
|
31
28
|
export declare function fastFolderSizeAsync(path: string): Promise<number>;
|
|
32
|
-
export declare function mkTmpDir(prefix: string, id?: string): Promise<string>;
|
|
33
29
|
export declare function readPartialFile(path: string, positions: [number, number?]): Promise<string>;
|
|
34
30
|
export declare function readDir(path: string, optional?: boolean): Promise<string[]>;
|
|
35
31
|
export declare function forEachFile(dirPath: string, cb: (path: string, dir: boolean) => void, includeDir?: boolean): Promise<void>;
|
|
@@ -60,7 +56,7 @@ export declare function cpy(options: {
|
|
|
60
56
|
path: string;
|
|
61
57
|
basePath: string;
|
|
62
58
|
};
|
|
63
|
-
|
|
59
|
+
outPath: string;
|
|
64
60
|
/**
|
|
65
61
|
* @default 1
|
|
66
62
|
*/
|
|
@@ -91,20 +87,20 @@ type ProgressObject = {
|
|
|
91
87
|
disposed: boolean;
|
|
92
88
|
total: number;
|
|
93
89
|
current: number;
|
|
94
|
-
update: (description: string, path?: string, increment?: boolean) =>
|
|
90
|
+
update: (description: string, path?: string, increment?: boolean) => void;
|
|
95
91
|
};
|
|
96
92
|
export declare function createProgress(options: {
|
|
97
|
-
onProgress: (data: Progress) =>
|
|
93
|
+
onProgress: (data: Progress) => void;
|
|
98
94
|
}): ProgressObject;
|
|
99
95
|
export declare function createFileScanner(options: {
|
|
100
96
|
glob: Options & {
|
|
101
97
|
include: string[];
|
|
102
98
|
};
|
|
103
|
-
onProgress: (data: Progress) =>
|
|
99
|
+
onProgress: (data: Progress) => void;
|
|
104
100
|
}): Promise<ProgressObject & {
|
|
105
101
|
progress: ProgressObject["update"];
|
|
106
102
|
start: (cb?: (entry: Required<Entry>) => any) => Promise<void>;
|
|
107
|
-
end: () =>
|
|
103
|
+
end: () => void;
|
|
108
104
|
}>;
|
|
109
105
|
type StreamItem = {
|
|
110
106
|
key: string;
|
|
@@ -128,4 +124,13 @@ export declare function countFileLines(path: string): Promise<number>;
|
|
|
128
124
|
export declare function fetchData<T>(input: T, onPath?: (input: Exclude<T, string>) => string | undefined): Promise<string | null>;
|
|
129
125
|
export declare function safeRename(oldPath: string, newPath: string): Promise<void>;
|
|
130
126
|
export declare function tryRm(path: string): Promise<void>;
|
|
127
|
+
export declare function initEmptyDir(path: string | undefined): Promise<string>;
|
|
128
|
+
export type DiskStats = {
|
|
129
|
+
total: number;
|
|
130
|
+
free: number;
|
|
131
|
+
};
|
|
132
|
+
export declare function fetchDiskStats(path: string): Promise<DiskStats>;
|
|
133
|
+
export declare function checkFreeDiskSpace(stat: DiskStats, inSize: string | number): Promise<void>;
|
|
134
|
+
export declare function ensureFreeDiskSpace(input: string[] | DiskStats, inSize: number | string): Promise<void>;
|
|
135
|
+
export declare function groupFiles(inFiles: string[], suffixes?: string[], gzSuffix?: string): [string[], Record<string, string>];
|
|
131
136
|
export {};
|