@datatruck/cli 0.27.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/Action/BackupAction.d.ts +69 -34
  2. package/Action/BackupAction.js +284 -244
  3. package/Action/CleanCacheAction.d.ts +8 -4
  4. package/Action/CleanCacheAction.js +8 -5
  5. package/Action/ConfigAction.d.ts +12 -5
  6. package/Action/ConfigAction.js +14 -18
  7. package/Action/CopyAction.d.ts +49 -0
  8. package/Action/CopyAction.js +144 -0
  9. package/Action/InitAction.d.ts +3 -3
  10. package/Action/InitAction.js +9 -9
  11. package/Action/PruneAction.d.ts +9 -9
  12. package/Action/PruneAction.js +39 -23
  13. package/Action/RestoreAction.d.ts +48 -23
  14. package/Action/RestoreAction.js +158 -195
  15. package/Action/SnapshotsAction.d.ts +8 -8
  16. package/Action/SnapshotsAction.js +8 -8
  17. package/CHANGELOG.md +495 -0
  18. package/Command/BackupCommand.d.ts +6 -4
  19. package/Command/BackupCommand.js +9 -26
  20. package/Command/CleanCacheCommand.d.ts +4 -4
  21. package/Command/CleanCacheCommand.js +26 -5
  22. package/Command/CommandAbstract.d.ts +10 -7
  23. package/Command/CommandAbstract.js +4 -1
  24. package/Command/ConfigCommand.d.ts +6 -9
  25. package/Command/ConfigCommand.js +13 -8
  26. package/Command/CopyCommand.d.ts +15 -0
  27. package/Command/CopyCommand.js +61 -0
  28. package/Command/InitCommand.d.ts +4 -4
  29. package/Command/InitCommand.js +11 -15
  30. package/Command/PruneCommand.d.ts +3 -3
  31. package/Command/PruneCommand.js +13 -12
  32. package/Command/RestoreCommand.js +9 -17
  33. package/Command/SnapshotsCommand.d.ts +4 -4
  34. package/Command/SnapshotsCommand.js +16 -15
  35. package/Command/StartServerCommand.d.ts +3 -3
  36. package/Config/Config.d.ts +9 -0
  37. package/Config/Config.js +17 -0
  38. package/Config/PrunePolicyConfig.d.ts +2 -2
  39. package/Factory/CommandFactory.d.ts +27 -34
  40. package/Factory/CommandFactory.js +27 -54
  41. package/Factory/RepositoryFactory.d.ts +1 -1
  42. package/Factory/RepositoryFactory.js +3 -3
  43. package/Factory/TaskFactory.d.ts +1 -1
  44. package/Factory/TaskFactory.js +3 -3
  45. package/Repository/DatatruckRepository.d.ts +9 -8
  46. package/Repository/DatatruckRepository.js +42 -25
  47. package/Repository/GitRepository.d.ts +9 -8
  48. package/Repository/GitRepository.js +22 -25
  49. package/Repository/RepositoryAbstract.d.ts +39 -37
  50. package/Repository/RepositoryAbstract.js +4 -5
  51. package/Repository/ResticRepository.d.ts +9 -8
  52. package/Repository/ResticRepository.js +30 -28
  53. package/Task/GitTask.d.ts +6 -7
  54. package/Task/GitTask.js +24 -30
  55. package/Task/MariadbTask.d.ts +4 -5
  56. package/Task/MariadbTask.js +26 -32
  57. package/Task/MssqlTask.d.ts +5 -3
  58. package/Task/MssqlTask.js +11 -12
  59. package/Task/MysqlDumpTask.d.ts +10 -3
  60. package/Task/MysqlDumpTask.js +107 -31
  61. package/Task/ScriptTask.d.ts +23 -18
  62. package/Task/ScriptTask.js +34 -24
  63. package/Task/SqlDumpTaskAbstract.d.ts +8 -3
  64. package/Task/SqlDumpTaskAbstract.js +31 -19
  65. package/Task/TaskAbstract.d.ts +24 -25
  66. package/Task/TaskAbstract.js +6 -10
  67. package/cli.js +13 -5
  68. package/config.schema.json +86 -1
  69. package/package.json +4 -5
  70. package/utils/DataFormat.d.ts +23 -12
  71. package/utils/DataFormat.js +36 -14
  72. package/utils/cli.d.ts +2 -9
  73. package/utils/cli.js +9 -52
  74. package/utils/datatruck/client.d.ts +2 -0
  75. package/utils/datatruck/client.js +3 -0
  76. package/utils/datatruck/config.d.ts +2 -0
  77. package/utils/datatruck/config.js +18 -3
  78. package/utils/datatruck/paths.d.ts +5 -9
  79. package/utils/datatruck/paths.js +2 -2
  80. package/utils/datatruck/snapshot.d.ts +2 -2
  81. package/utils/date.d.ts +7 -3
  82. package/utils/date.js +22 -14
  83. package/utils/fs.d.ts +16 -11
  84. package/utils/fs.js +81 -48
  85. package/utils/list.d.ts +64 -0
  86. package/utils/list.js +145 -0
  87. package/utils/mysql.d.ts +2 -0
  88. package/utils/mysql.js +21 -2
  89. package/utils/process.d.ts +1 -0
  90. package/utils/process.js +24 -31
  91. package/utils/progress.d.ts +33 -0
  92. package/utils/progress.js +113 -0
  93. package/utils/steps.d.ts +11 -0
  94. package/utils/steps.js +22 -10
  95. package/utils/stream.d.ts +7 -0
  96. package/utils/stream.js +10 -0
  97. package/utils/string.d.ts +0 -1
  98. package/utils/string.js +1 -13
  99. package/utils/tar.d.ts +10 -3
  100. package/utils/tar.js +70 -44
  101. package/utils/temp.d.ts +26 -0
  102. package/utils/temp.js +133 -0
  103. package/utils/virtual-fs.d.ts +6 -2
  104. package/utils/virtual-fs.js +6 -0
  105. package/Action/BackupSessionsAction.d.ts +0 -13
  106. package/Action/BackupSessionsAction.js +0 -18
  107. package/Action/RestoreSessionsAction.d.ts +0 -13
  108. package/Action/RestoreSessionsAction.js +0 -18
  109. package/Command/BackupSessionsCommand.d.ts +0 -12
  110. package/Command/BackupSessionsCommand.js +0 -92
  111. package/Command/RestoreSessionsCommand.d.ts +0 -12
  112. package/Command/RestoreSessionsCommand.js +0 -91
  113. package/Decorator/EntityDecorator.d.ts +0 -11
  114. package/Decorator/EntityDecorator.js +0 -17
  115. package/Entity/BackupSessionEntity.d.ts +0 -6
  116. package/Entity/BackupSessionEntity.js +0 -25
  117. package/Entity/BackupSessionRepositoryEntity.d.ts +0 -6
  118. package/Entity/BackupSessionRepositoryEntity.js +0 -25
  119. package/Entity/BackupSessionTaskEntity.d.ts +0 -5
  120. package/Entity/BackupSessionTaskEntity.js +0 -24
  121. package/Entity/CrudEntityAbstract.d.ts +0 -5
  122. package/Entity/CrudEntityAbstract.js +0 -9
  123. package/Entity/RestoreSessionEntity.d.ts +0 -5
  124. package/Entity/RestoreSessionEntity.js +0 -24
  125. package/Entity/RestoreSessionRepositoryEntity.d.ts +0 -6
  126. package/Entity/RestoreSessionRepositoryEntity.js +0 -25
  127. package/Entity/RestoreSessionTaskEntity.d.ts +0 -5
  128. package/Entity/RestoreSessionTaskEntity.js +0 -24
  129. package/Entity/StateEntityAbstract.d.ts +0 -9
  130. package/Entity/StateEntityAbstract.js +0 -12
  131. package/Factory/EntityFactory.d.ts +0 -6
  132. package/Factory/EntityFactory.js +0 -40
  133. package/SessionDriver/ConsoleSessionDriver.d.ts +0 -42
  134. package/SessionDriver/ConsoleSessionDriver.js +0 -208
  135. package/SessionDriver/SessionDriverAbstract.d.ts +0 -77
  136. package/SessionDriver/SessionDriverAbstract.js +0 -28
  137. package/SessionDriver/SqliteSessionDriver.d.ts +0 -20
  138. package/SessionDriver/SqliteSessionDriver.js +0 -173
  139. package/SessionManager/BackupSessionManager.d.ts +0 -45
  140. package/SessionManager/BackupSessionManager.js +0 -218
  141. package/SessionManager/RestoreSessionManager.d.ts +0 -47
  142. package/SessionManager/RestoreSessionManager.js +0 -218
  143. package/SessionManager/SessionManagerAbstract.d.ts +0 -18
  144. package/SessionManager/SessionManagerAbstract.js +0 -36
  145. package/migrations/001-initial.sql +0 -98
  146. package/utils/entity.d.ts +0 -4
  147. package/utils/entity.js +0 -10
@@ -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 cli_table3_1 = __importDefault(require("cli-table3"));
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.options.json
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.options.items);
43
+ }, this.getJson());
31
44
  }
32
45
  formatToYaml() {
33
- return require("yaml").stringify(this.options.items);
46
+ return require("yaml").stringify(this.getJson());
34
47
  }
35
48
  formatToTable() {
36
- const table = new cli_table3_1.default({
37
- head: this.options.table.labels,
38
- });
39
- for (const item of this.options.items)
40
- table.push(this.options.table.handler(item));
41
- return table.toString();
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.options.items, code);
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,9 @@
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 resultColumn(error: Error | null | string, state?: "started" | "ended"): "❌" | " ? " | "✅";
12
- export declare function errorColumn(error: Error | null | string, verbose: number): string;
5
+ export declare function resultColumn(error: Error | null | string | boolean | undefined, color?: boolean): string;
6
+ export declare function errorColumn(error: Error | null | string | undefined, verbose?: number): string;
13
7
  export type OptionsType<T1, T2 extends {
14
8
  [K in keyof T1]: unknown;
15
9
  }> = {
@@ -24,5 +18,4 @@ export type OptionsType<T1, T2 extends {
24
18
  export declare function parseOptions<T1, T2 extends {
25
19
  [K in keyof T1]: unknown;
26
20
  }>(object: T1, options: OptionsType<T1, T2>): T2;
27
- export declare function truncate(text: string, limit: number): [string, boolean];
28
21
  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.truncate = exports.parseOptions = exports.errorColumn = exports.resultColumn = exports.logExec = exports.logVars = exports.renderProgressBar = exports.renderSpinner = exports.hideCursorCommand = exports.clearCommand = exports.showCursorCommand = exports.spinnerChars = exports.clearLastLine = void 0;
6
+ exports.confirm = exports.parseOptions = exports.errorColumn = exports.resultColumn = 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,8 +48,14 @@ function logExec(command, argv = [], env, logToStderr) {
72
48
  : console.info(text);
73
49
  }
74
50
  exports.logExec = logExec;
75
- function resultColumn(error, state) {
76
- return error ? "❌" : state === "started" ? " ? " : "✅";
51
+ function resultColumn(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
60
  exports.resultColumn = resultColumn;
79
61
  function errorColumn(error, verbose) {
@@ -107,31 +89,6 @@ function parseOptions(object, options) {
107
89
  return result;
108
90
  }
109
91
  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
92
  function confirm(message) {
136
93
  const rl = (0, readline_1.createInterface)({
137
94
  input: process.stdin,
@@ -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, fs_1.tmpDir)("pkg"),
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 { SnapshotType } from "../../Repository/RepositoryAbstract";
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
- }): Promise<string[]>;
9
+ };
10
+ export declare function parsePaths(values: (string | Step)[], options: ParsePathsOptions): Promise<string[]>;
15
11
  export type BackupPathsOptions = {
16
12
  package: PackageConfigType;
17
- snapshot: SnapshotType;
18
- targetPath: string;
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[]>;
@@ -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.targetPath,
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
- targetPath: options.targetPath,
30
+ path: options.path,
31
31
  },
32
32
  },
33
33
  });
@@ -1,4 +1,4 @@
1
1
  import { SnapshotGroupByType } from "../../Action/SnapshotsAction";
2
- import { SnapshotResultType } from "../../Repository/RepositoryAbstract";
2
+ import { Snapshot } from "../../Repository/RepositoryAbstract";
3
3
  import { FilterByLastOptionsType } from "../date";
4
- export declare function groupAndFilter<TSnapshot extends SnapshotResultType>(snapshots: TSnapshot[], groupByKey?: SnapshotGroupByType[], filter?: FilterByLastOptionsType | ((groupedSnapshots: TSnapshot[]) => FilterByLastOptionsType), reasons?: Record<number, string[]>): TSnapshot[];
4
+ export declare function groupAndFilter<TSnapshot extends Snapshot>(snapshots: TSnapshot[], groupByKey?: SnapshotGroupByType[], filter?: FilterByLastOptionsType | ((groupedSnapshots: TSnapshot[]) => FilterByLastOptionsType), reasons?: Record<number, string[]>): TSnapshot[];
package/utils/date.d.ts CHANGED
@@ -10,7 +10,11 @@ export type FilterByLastOptionsType = {
10
10
  export declare function filterByLast<TItem extends {
11
11
  date: string;
12
12
  }>(items: TItem[], options: FilterByLastOptionsType, reasons?: Record<number, string[]>): TItem[];
13
- export declare function createChron(): {
14
- start: () => number;
15
- elapsed: (formatted?: boolean) => string | number;
13
+ export type Timer = {
14
+ reset: (min?: number) => boolean;
15
+ check: (min: number) => boolean;
16
+ elapsed: () => number;
17
+ stop: () => void;
16
18
  };
19
+ export declare function createTimer(): Timer;
20
+ export declare function duration(ms: number): string;
package/utils/date.js CHANGED
@@ -3,13 +3,14 @@ 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.createChron = exports.filterByLast = void 0;
7
- const string_1 = require("./string");
6
+ exports.duration = exports.createTimer = exports.filterByLast = void 0;
8
7
  const dayjs_1 = __importDefault(require("dayjs"));
9
8
  const advancedFormat_1 = __importDefault(require("dayjs/plugin/advancedFormat"));
9
+ const duration_1 = __importDefault(require("dayjs/plugin/duration"));
10
10
  const isoWeek_1 = __importDefault(require("dayjs/plugin/isoWeek"));
11
11
  dayjs_1.default.extend(isoWeek_1.default);
12
12
  dayjs_1.default.extend(advancedFormat_1.default);
13
+ dayjs_1.default.extend(duration_1.default);
13
14
  function filterByLast(items, options, reasons) {
14
15
  const filters = {
15
16
  last: { handler: (_, i) => i.toString(), value: options.last },
@@ -73,18 +74,25 @@ function filterByLast(items, options, reasons) {
73
74
  return items.filter((item) => validItems.includes(item));
74
75
  }
75
76
  exports.filterByLast = filterByLast;
76
- function createChron() {
77
- let startTime;
78
- return {
79
- start: () => (startTime = Date.now()),
80
- elapsed: (formatted) => {
81
- if (!startTime)
82
- throw new Error(`Chron was not started`);
83
- const seconds = (Date.now() - startTime) / 1000;
84
- if (formatted)
85
- return (0, string_1.formatSeconds)(seconds);
86
- return seconds;
77
+ function createTimer() {
78
+ let startTime = Date.now();
79
+ let endTime;
80
+ const timer = {
81
+ elapsed: () => (endTime || Date.now()) - startTime,
82
+ check: (ms) => timer.elapsed() > ms,
83
+ stop: () => (endTime = Date.now()),
84
+ reset: (min) => {
85
+ if (typeof min === "number" && !timer.check(min))
86
+ return false;
87
+ startTime = Date.now();
88
+ endTime = undefined;
89
+ return true;
87
90
  },
88
91
  };
92
+ return timer;
89
93
  }
90
- exports.createChron = createChron;
94
+ exports.createTimer = createTimer;
95
+ function duration(ms) {
96
+ return dayjs_1.default.duration(ms, "ms").format("HH:mm:ss");
97
+ }
98
+ 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
- targetPath: string;
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) => Promise<void>;
90
+ update: (description: string, path?: string, increment?: boolean) => void;
95
91
  };
96
92
  export declare function createProgress(options: {
97
- onProgress: (data: Progress) => Promise<void>;
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) => Promise<void>;
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: () => Promise<void>;
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 {};