herdux-cli 0.4.2 → 0.7.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 (68) hide show
  1. package/README.md +116 -241
  2. package/README.pt-BR.md +120 -215
  3. package/dist/commands/backup.d.ts.map +1 -1
  4. package/dist/commands/backup.js +12 -1
  5. package/dist/commands/backup.js.map +1 -1
  6. package/dist/commands/clean.d.ts.map +1 -1
  7. package/dist/commands/clean.js +12 -2
  8. package/dist/commands/clean.js.map +1 -1
  9. package/dist/commands/config.d.ts.map +1 -1
  10. package/dist/commands/config.js +19 -2
  11. package/dist/commands/config.js.map +1 -1
  12. package/dist/commands/create.d.ts.map +1 -1
  13. package/dist/commands/create.js +13 -2
  14. package/dist/commands/create.js.map +1 -1
  15. package/dist/commands/docker.d.ts +3 -0
  16. package/dist/commands/docker.d.ts.map +1 -0
  17. package/dist/commands/docker.js +106 -0
  18. package/dist/commands/docker.js.map +1 -0
  19. package/dist/commands/doctor.d.ts.map +1 -1
  20. package/dist/commands/doctor.js +8 -2
  21. package/dist/commands/doctor.js.map +1 -1
  22. package/dist/commands/drop.d.ts.map +1 -1
  23. package/dist/commands/drop.js +14 -2
  24. package/dist/commands/drop.js.map +1 -1
  25. package/dist/commands/inspect.d.ts +3 -0
  26. package/dist/commands/inspect.d.ts.map +1 -0
  27. package/dist/commands/inspect.js +29 -0
  28. package/dist/commands/inspect.js.map +1 -0
  29. package/dist/commands/list.d.ts.map +1 -1
  30. package/dist/commands/list.js +11 -2
  31. package/dist/commands/list.js.map +1 -1
  32. package/dist/commands/restore.d.ts.map +1 -1
  33. package/dist/commands/restore.js +10 -1
  34. package/dist/commands/restore.js.map +1 -1
  35. package/dist/commands/version.d.ts.map +1 -1
  36. package/dist/commands/version.js +32 -17
  37. package/dist/commands/version.js.map +1 -1
  38. package/dist/core/interfaces/database-engine.interface.d.ts +1 -1
  39. package/dist/core/interfaces/database-engine.interface.d.ts.map +1 -1
  40. package/dist/index.js +31 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/infra/docker/docker.service.d.ts +14 -0
  43. package/dist/infra/docker/docker.service.d.ts.map +1 -0
  44. package/dist/infra/docker/docker.service.js +83 -0
  45. package/dist/infra/docker/docker.service.js.map +1 -0
  46. package/dist/infra/engines/engine-factory.d.ts.map +1 -1
  47. package/dist/infra/engines/engine-factory.js +3 -0
  48. package/dist/infra/engines/engine-factory.js.map +1 -1
  49. package/dist/infra/engines/inspect-backup.d.ts +13 -0
  50. package/dist/infra/engines/inspect-backup.d.ts.map +1 -0
  51. package/dist/infra/engines/inspect-backup.js +97 -0
  52. package/dist/infra/engines/inspect-backup.js.map +1 -0
  53. package/dist/infra/engines/mysql/mysql.engine.d.ts +1 -1
  54. package/dist/infra/engines/mysql/mysql.engine.d.ts.map +1 -1
  55. package/dist/infra/engines/mysql/mysql.engine.js +4 -1
  56. package/dist/infra/engines/mysql/mysql.engine.js.map +1 -1
  57. package/dist/infra/engines/resolve-connection.d.ts.map +1 -1
  58. package/dist/infra/engines/resolve-connection.js +78 -55
  59. package/dist/infra/engines/resolve-connection.js.map +1 -1
  60. package/dist/infra/engines/sqlite/sqlite-env.d.ts +2 -0
  61. package/dist/infra/engines/sqlite/sqlite-env.d.ts.map +1 -0
  62. package/dist/infra/engines/sqlite/sqlite-env.js +24 -0
  63. package/dist/infra/engines/sqlite/sqlite-env.js.map +1 -0
  64. package/dist/infra/engines/sqlite/sqlite.engine.d.ts +21 -0
  65. package/dist/infra/engines/sqlite/sqlite.engine.d.ts.map +1 -0
  66. package/dist/infra/engines/sqlite/sqlite.engine.js +207 -0
  67. package/dist/infra/engines/sqlite/sqlite.engine.js.map +1 -0
  68. package/package.json +4 -1
@@ -0,0 +1,24 @@
1
+ import ora from "ora";
2
+ import { logger } from "../../../presentation/logger.js";
3
+ import { binaryExists, getBinaryVersion } from "../../utils/detect-binary.js";
4
+ export async function checkSqliteClient() {
5
+ const spinner = ora("Checking SQLite client...").start();
6
+ const exists = await binaryExists("sqlite3");
7
+ if (!exists) {
8
+ spinner.fail("SQLite client (sqlite3) not found");
9
+ logger.blank();
10
+ logger.error("sqlite3 is not available in your PATH.");
11
+ logger.blank();
12
+ logger.info("To fix this, you can:");
13
+ logger.line("1. Install SQLite:");
14
+ logger.line(" • Windows: choco install sqlite");
15
+ logger.line(" • macOS: brew install sqlite");
16
+ logger.line(" • Ubuntu: sudo apt install sqlite3");
17
+ logger.blank();
18
+ process.exit(1);
19
+ }
20
+ const version = await getBinaryVersion("sqlite3");
21
+ spinner.succeed(`Found ${version ?? "sqlite3"}`);
22
+ return version ?? "unknown";
23
+ }
24
+ //# sourceMappingURL=sqlite-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-env.js","sourceRoot":"","sources":["../../../../src/infra/engines/sqlite/sqlite-env.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE9E,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAClD,OAAO,CAAC,OAAO,CAAC,SAAS,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IAEjD,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { IDatabaseEngine, ConnectionOptions, DatabaseInstance, DatabaseInfo, HealthCheck } from "../../../core/interfaces/database-engine.interface.js";
2
+ export declare class SqliteEngine implements IDatabaseEngine {
3
+ getHealthChecks(): HealthCheck[];
4
+ getEngineName(): string;
5
+ getDefaultConnectionOptions(): ConnectionOptions;
6
+ checkClientVersion(): Promise<string>;
7
+ checkBackupRequirements(): Promise<void>;
8
+ discoverInstances(_opts?: ConnectionOptions): Promise<DatabaseInstance[]>;
9
+ getServerVersion(_opts?: ConnectionOptions): Promise<string | null>;
10
+ listDatabases(opts?: ConnectionOptions & {
11
+ includeSize?: boolean;
12
+ }): Promise<DatabaseInfo[]>;
13
+ createDatabase(name: string, opts?: ConnectionOptions): Promise<void>;
14
+ dropDatabase(name: string, opts?: ConnectionOptions): Promise<void>;
15
+ backupDatabase(dbName: string, outputDir: string, opts?: ConnectionOptions, format?: string): Promise<string>;
16
+ restoreDatabase(filePath: string, dbName: string, opts?: ConnectionOptions): Promise<{
17
+ hasWarnings: boolean;
18
+ warnings?: string;
19
+ } | void>;
20
+ }
21
+ //# sourceMappingURL=sqlite.engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.engine.d.ts","sourceRoot":"","sources":["../../../../src/infra/engines/sqlite/sqlite.engine.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACZ,MAAM,uDAAuD,CAAC;AAiC/D,qBAAa,YAAa,YAAW,eAAe;IAClD,eAAe,IAAI,WAAW,EAAE;IAmDhC,aAAa,IAAI,MAAM;IAIvB,2BAA2B,IAAI,iBAAiB;IAI1C,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxC,iBAAiB,CACrB,KAAK,CAAC,EAAE,iBAAiB,GACxB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKxB,gBAAgB,CAAC,KAAK,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMnE,aAAa,CACjB,IAAI,GAAE,iBAAiB,GAAG;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAO,GACvD,OAAO,CAAC,YAAY,EAAE,CAAC;IAgCpB,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC;IAqBV,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC;IAUV,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,iBAAsB,EAC5B,MAAM,GAAE,MAAiB,GACxB,OAAO,CAAC,MAAM,CAAC;IAiCZ,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CA8B/D"}
@@ -0,0 +1,207 @@
1
+ import { existsSync, mkdirSync, readdirSync, statSync, unlinkSync, copyFileSync, writeFileSync, } from "fs";
2
+ import { join, resolve, basename, extname } from "path";
3
+ import { homedir } from "os";
4
+ import { runCommand } from "../../command-runner.js";
5
+ import { checkSqliteClient } from "./sqlite-env.js";
6
+ // --- Internal Helpers ---
7
+ function defaultDbDir() {
8
+ return join(homedir(), ".herdux", "sqlite");
9
+ }
10
+ function resolveDbDir(opts) {
11
+ return opts.host ? resolve(opts.host) : defaultDbDir();
12
+ }
13
+ function resolveDbPath(name, opts) {
14
+ return join(resolveDbDir(opts), `${name}.db`);
15
+ }
16
+ function generateBackupFilename(dbName, format) {
17
+ const date = new Date().toISOString().slice(0, 10);
18
+ return `${dbName}_${date}.${format === "plain" ? "sql" : "db"}`;
19
+ }
20
+ function formatFileSize(bytes) {
21
+ if (bytes < 1024)
22
+ return `${bytes} B`;
23
+ if (bytes < 1024 * 1024)
24
+ return `${(bytes / 1024).toFixed(1)} KB`;
25
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
26
+ }
27
+ // --- SqliteEngine ---
28
+ export class SqliteEngine {
29
+ getHealthChecks() {
30
+ return [
31
+ {
32
+ name: "sqlite3",
33
+ pendingMessage: "Checking sqlite3...",
34
+ run: async () => {
35
+ try {
36
+ const result = await runCommand("sqlite3", ["--version"]);
37
+ if (result.exitCode === 0) {
38
+ return {
39
+ status: "success",
40
+ message: `sqlite3 is installed: ${result.stdout.trim().split("\n")[0]}`,
41
+ };
42
+ }
43
+ return {
44
+ status: "error",
45
+ message: "sqlite3 returned a non-zero exit code.",
46
+ };
47
+ }
48
+ catch {
49
+ return {
50
+ status: "error",
51
+ message: "sqlite3 is missing. Install it: apt install sqlite3 / brew install sqlite",
52
+ };
53
+ }
54
+ },
55
+ },
56
+ {
57
+ name: "Database directory",
58
+ pendingMessage: "Checking database directory...",
59
+ run: async (opts) => {
60
+ const dbDir = resolveDbDir(opts);
61
+ try {
62
+ if (!existsSync(dbDir)) {
63
+ mkdirSync(dbDir, { recursive: true });
64
+ }
65
+ return {
66
+ status: "success",
67
+ message: `Database directory is accessible: ${dbDir}`,
68
+ };
69
+ }
70
+ catch (err) {
71
+ return {
72
+ status: "error",
73
+ message: `Cannot access database directory "${dbDir}": ${err.message}`,
74
+ };
75
+ }
76
+ },
77
+ },
78
+ ];
79
+ }
80
+ getEngineName() {
81
+ return "SQLite";
82
+ }
83
+ getDefaultConnectionOptions() {
84
+ return { host: defaultDbDir() };
85
+ }
86
+ async checkClientVersion() {
87
+ return await checkSqliteClient();
88
+ }
89
+ async checkBackupRequirements() {
90
+ // SQLite backups use Node.js fs (file copy) or sqlite3 .dump.
91
+ // sqlite3 is already validated in checkClientVersion — nothing else needed.
92
+ }
93
+ async discoverInstances(_opts) {
94
+ // SQLite is file-based and has no running server instances.
95
+ return [];
96
+ }
97
+ async getServerVersion(_opts) {
98
+ const result = await runCommand("sqlite3", ["--version"]);
99
+ if (result.exitCode !== 0)
100
+ return null;
101
+ return `SQLite ${result.stdout.trim().split("\n")[0]}`;
102
+ }
103
+ async listDatabases(opts = {}) {
104
+ const dbDir = resolveDbDir(opts);
105
+ if (!existsSync(dbDir)) {
106
+ return [];
107
+ }
108
+ const entries = readdirSync(dbDir);
109
+ const databases = [];
110
+ for (const entry of entries) {
111
+ const ext = extname(entry).toLowerCase();
112
+ if (ext !== ".db" && ext !== ".sqlite")
113
+ continue;
114
+ const name = basename(entry, ext);
115
+ const info = { name };
116
+ if (opts.includeSize) {
117
+ try {
118
+ const stat = statSync(join(dbDir, entry));
119
+ info.size = formatFileSize(stat.size);
120
+ }
121
+ catch {
122
+ info.size = "unknown";
123
+ }
124
+ }
125
+ databases.push(info);
126
+ }
127
+ return databases.sort((a, b) => a.name.localeCompare(b.name));
128
+ }
129
+ async createDatabase(name, opts = {}) {
130
+ const dbDir = resolveDbDir(opts);
131
+ if (!existsSync(dbDir)) {
132
+ mkdirSync(dbDir, { recursive: true });
133
+ }
134
+ const dbPath = join(dbDir, `${name}.db`);
135
+ if (existsSync(dbPath)) {
136
+ throw new Error(`Database "${name}" already exists at ${dbPath}`);
137
+ }
138
+ // Running sqlite3 with an empty command creates a valid empty database file.
139
+ const result = await runCommand("sqlite3", [dbPath, ""]);
140
+ if (result.exitCode !== 0) {
141
+ throw new Error(`Failed to create database "${name}": ${result.stderr}`);
142
+ }
143
+ }
144
+ async dropDatabase(name, opts = {}) {
145
+ const dbPath = resolveDbPath(name, opts);
146
+ if (!existsSync(dbPath)) {
147
+ throw new Error(`Database "${name}" not found at ${dbPath}`);
148
+ }
149
+ unlinkSync(dbPath);
150
+ }
151
+ async backupDatabase(dbName, outputDir, opts = {}, format = "custom") {
152
+ const dbPath = resolveDbPath(dbName, opts);
153
+ if (!existsSync(dbPath)) {
154
+ throw new Error(`Database "${dbName}" not found at ${dbPath}`);
155
+ }
156
+ const resolvedDir = resolve(outputDir);
157
+ if (!existsSync(resolvedDir)) {
158
+ mkdirSync(resolvedDir, { recursive: true });
159
+ }
160
+ const typedFormat = format === "plain" ? "plain" : "custom";
161
+ const filename = generateBackupFilename(dbName, typedFormat);
162
+ const outputPath = join(resolvedDir, filename);
163
+ if (typedFormat === "plain") {
164
+ // SQL dump via sqlite3 .dump
165
+ const result = await runCommand("sqlite3", [dbPath, ".dump"], {
166
+ timeout: 0,
167
+ });
168
+ if (result.exitCode !== 0) {
169
+ throw new Error(`Backup failed for "${dbName}": ${result.stderr}`);
170
+ }
171
+ writeFileSync(outputPath, result.stdout, "utf8");
172
+ }
173
+ else {
174
+ // Binary copy of the .db file
175
+ copyFileSync(dbPath, outputPath);
176
+ }
177
+ return outputPath;
178
+ }
179
+ async restoreDatabase(filePath, dbName, opts = {}) {
180
+ const resolvedPath = resolve(filePath);
181
+ if (!existsSync(resolvedPath)) {
182
+ throw new Error(`Backup file not found: ${resolvedPath}`);
183
+ }
184
+ const dbDir = resolveDbDir(opts);
185
+ if (!existsSync(dbDir)) {
186
+ mkdirSync(dbDir, { recursive: true });
187
+ }
188
+ const targetPath = join(dbDir, `${dbName}.db`);
189
+ const ext = extname(resolvedPath).toLowerCase();
190
+ const isPlain = ext === ".sql" || ext === ".txt";
191
+ if (isPlain) {
192
+ // Restore from SQL dump: sqlite3 target.db < backup.sql
193
+ const result = await runCommand("sqlite3", [targetPath], {
194
+ stdin: resolvedPath,
195
+ timeout: 0,
196
+ });
197
+ if (result.exitCode !== 0) {
198
+ throw new Error(`Restore failed: ${result.stderr}`);
199
+ }
200
+ }
201
+ else {
202
+ // Restore from .db file copy
203
+ copyFileSync(resolvedPath, targetPath);
204
+ }
205
+ }
206
+ }
207
+ //# sourceMappingURL=sqlite.engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.engine.js","sourceRoot":"","sources":["../../../../src/infra/engines/sqlite/sqlite.engine.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "herdux-cli",
3
- "version": "0.4.2",
3
+ "version": "0.7.0",
4
4
  "description": "Modern Database workflow CLI focused on developer experience, safety, and automation.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -34,10 +34,13 @@
34
34
  "test:e2e:mysql": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js -- tests/e2e/mysql/",
35
35
  "test:e2e:mysql:up": "docker compose -f infra/docker/compose.e2e-mysql.yml up -d --wait",
36
36
  "test:e2e:mysql:down": "docker compose -f infra/docker/compose.e2e-mysql.yml down -v --remove-orphans",
37
+ "test:e2e:sqlite": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js -- tests/e2e/sqlite/",
37
38
  "prepare": "husky"
38
39
  },
39
40
  "keywords": [
40
41
  "postgresql",
42
+ "mysql",
43
+ "sqlite",
41
44
  "cli",
42
45
  "database",
43
46
  "backup",