herdux-cli 0.4.1 → 0.5.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/README.md +11 -4
- package/README.pt-BR.md +11 -4
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +12 -1
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/clean.d.ts.map +1 -1
- package/dist/commands/clean.js +9 -1
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +19 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +10 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +6 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/drop.d.ts.map +1 -1
- package/dist/commands/drop.js +11 -1
- package/dist/commands/drop.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +8 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +10 -1
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/version.d.ts.map +1 -1
- package/dist/commands/version.js +6 -1
- package/dist/commands/version.js.map +1 -1
- package/dist/core/interfaces/database-engine.interface.d.ts +1 -1
- package/dist/core/interfaces/database-engine.interface.d.ts.map +1 -1
- package/dist/index.js +27 -2
- package/dist/index.js.map +1 -1
- package/dist/infra/config/config.service.js +1 -1
- package/dist/infra/config/config.service.js.map +1 -1
- package/dist/infra/engines/engine-factory.d.ts.map +1 -1
- package/dist/infra/engines/engine-factory.js +3 -0
- package/dist/infra/engines/engine-factory.js.map +1 -1
- package/dist/infra/engines/resolve-connection.d.ts.map +1 -1
- package/dist/infra/engines/resolve-connection.js +80 -56
- package/dist/infra/engines/resolve-connection.js.map +1 -1
- package/dist/infra/engines/sqlite/sqlite-env.d.ts +2 -0
- package/dist/infra/engines/sqlite/sqlite-env.d.ts.map +1 -0
- package/dist/infra/engines/sqlite/sqlite-env.js +24 -0
- package/dist/infra/engines/sqlite/sqlite-env.js.map +1 -0
- package/dist/infra/engines/sqlite/sqlite.engine.d.ts +21 -0
- package/dist/infra/engines/sqlite/sqlite.engine.d.ts.map +1 -0
- package/dist/infra/engines/sqlite/sqlite.engine.js +207 -0
- package/dist/infra/engines/sqlite/sqlite.engine.js.map +1 -0
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../src/infra/config/config.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,UAAU,GACX,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAM7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../src/infra/config/config.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-factory.d.ts","sourceRoot":"","sources":["../../../src/infra/engines/engine-factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine-factory.d.ts","sourceRoot":"","sources":["../../../src/infra/engines/engine-factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACX,MAAM,oDAAoD,CAAC;AAE5D,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,eAAe,CAU/D"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { PostgresEngine } from "./postgres/postgres.engine.js";
|
|
2
2
|
import { MysqlEngine } from "./mysql/mysql.engine.js";
|
|
3
|
+
import { SqliteEngine } from "./sqlite/sqlite.engine.js";
|
|
3
4
|
export function createEngine(type) {
|
|
4
5
|
switch (type) {
|
|
5
6
|
case "mysql":
|
|
6
7
|
return new MysqlEngine();
|
|
8
|
+
case "sqlite":
|
|
9
|
+
return new SqliteEngine();
|
|
7
10
|
case "postgres":
|
|
8
11
|
default:
|
|
9
12
|
return new PostgresEngine();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-factory.js","sourceRoot":"","sources":["../../../src/infra/engines/engine-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine-factory.js","sourceRoot":"","sources":["../../../src/infra/engines/engine-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAMzD,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B,KAAK,UAAU,CAAC;QAChB;YACE,OAAO,IAAI,cAAc,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-connection.d.ts","sourceRoot":"","sources":["../../../src/infra/engines/resolve-connection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,eAAe,EAChB,MAAM,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-connection.d.ts","sourceRoot":"","sources":["../../../src/infra/engines/resolve-connection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,eAAe,EAChB,MAAM,oDAAoD,CAAC;AAO5D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAyFD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,OAAO,CAAC,kBAAkB,CAAC,CA0J7B"}
|
|
@@ -4,6 +4,66 @@ import prompts from "prompts";
|
|
|
4
4
|
import { createEngine } from "./engine-factory.js";
|
|
5
5
|
import * as config from "../config/config.service.js";
|
|
6
6
|
import { logger } from "../../presentation/logger.js";
|
|
7
|
+
/**
|
|
8
|
+
* Presents an interactive prompt for the user to select a server profile.
|
|
9
|
+
* Returns the selected server name, or undefined if the user selected
|
|
10
|
+
* the default connection or no options were available.
|
|
11
|
+
*/
|
|
12
|
+
async function promptServerSelection(servers, serverNames, savedDefaults, requestedEngine) {
|
|
13
|
+
const dEngine = savedDefaults.engine ?? "postgres";
|
|
14
|
+
const isDefaultCompatible = !requestedEngine || dEngine === requestedEngine;
|
|
15
|
+
const hasDefaults = Object.keys(savedDefaults).length > 0;
|
|
16
|
+
if (serverNames.length === 0 && !(hasDefaults && isDefaultCompatible)) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const choices = serverNames.map((name) => {
|
|
20
|
+
const srv = servers[name];
|
|
21
|
+
const engineLabel = srv.engine ? `, engine: ${srv.engine}` : "";
|
|
22
|
+
return {
|
|
23
|
+
title: `${name} (port ${srv.port ?? "?"}${engineLabel})`,
|
|
24
|
+
value: name,
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
if (hasDefaults && isDefaultCompatible) {
|
|
28
|
+
const defaultEngineLabel = `, engine: ${dEngine}`;
|
|
29
|
+
choices.unshift({
|
|
30
|
+
title: `Default connection (port ${savedDefaults.port ?? "?"}${defaultEngineLabel})`,
|
|
31
|
+
value: "__default__",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (choices.length === 0) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
if (choices.length === 1) {
|
|
38
|
+
const choice = choices[0];
|
|
39
|
+
console.log(chalk.green(`✔ Auto-selected connection: › ${choice.title}`));
|
|
40
|
+
return choice.value !== "__default__" ? choice.value : undefined;
|
|
41
|
+
}
|
|
42
|
+
const response = await prompts({
|
|
43
|
+
type: "select",
|
|
44
|
+
name: "server",
|
|
45
|
+
message: "Select a connection to use:",
|
|
46
|
+
choices,
|
|
47
|
+
});
|
|
48
|
+
if (!response.server) {
|
|
49
|
+
console.log(chalk.yellow("\n⚠ Operation cancelled.\n"));
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
return response.server !== "__default__" ? response.server : undefined;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Determines the engine type from the CLI flag, server profile, or config defaults.
|
|
56
|
+
* Priority: CLI flag > server profile engine > config default engine > "postgres"
|
|
57
|
+
*/
|
|
58
|
+
function resolveEngineType(rawEngine, serverName, savedDefaults) {
|
|
59
|
+
if (rawEngine)
|
|
60
|
+
return rawEngine;
|
|
61
|
+
if (serverName) {
|
|
62
|
+
const profile = config.getServer(serverName);
|
|
63
|
+
return profile?.engine ?? savedDefaults.engine ?? "postgres";
|
|
64
|
+
}
|
|
65
|
+
return savedDefaults.engine ?? "postgres";
|
|
66
|
+
}
|
|
7
67
|
// --- Main Resolver ---
|
|
8
68
|
/**
|
|
9
69
|
* Resolves both the database engine and connection options together.
|
|
@@ -23,71 +83,21 @@ import { logger } from "../../presentation/logger.js";
|
|
|
23
83
|
export async function resolveEngineAndConnection(rawOpts) {
|
|
24
84
|
const savedDefaults = config.getDefault();
|
|
25
85
|
let serverName = rawOpts.server;
|
|
26
|
-
let profileEngine;
|
|
27
86
|
// --- Step 1: Resolve server profile (may provide engine) ---
|
|
28
|
-
|
|
87
|
+
const isInteractive = process.stdout.isTTY || process.env.HERDUX_TEST_FORCE_TTY === "1";
|
|
88
|
+
if (!serverName && !rawOpts.port && !rawOpts.host && isInteractive) {
|
|
29
89
|
const servers = config.listServers();
|
|
30
90
|
let serverNames = Object.keys(servers);
|
|
31
91
|
if (rawOpts.engine) {
|
|
32
92
|
serverNames = serverNames.filter((name) => servers[name].engine === rawOpts.engine);
|
|
33
93
|
}
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (serverNames.length > 0 || (hasDefaults && isDefaultCompatible)) {
|
|
38
|
-
const choices = serverNames.map((name) => {
|
|
39
|
-
const srv = servers[name];
|
|
40
|
-
const engineLabel = srv.engine ? `, engine: ${srv.engine}` : "";
|
|
41
|
-
return {
|
|
42
|
-
title: `${name} (port ${srv.port ?? "?"}${engineLabel})`,
|
|
43
|
-
value: name,
|
|
44
|
-
};
|
|
45
|
-
});
|
|
46
|
-
if (hasDefaults && isDefaultCompatible) {
|
|
47
|
-
const defaultEngineLabel = `, engine: ${dEngine}`;
|
|
48
|
-
choices.unshift({
|
|
49
|
-
title: `Default connection (port ${savedDefaults.port ?? "?"}${defaultEngineLabel})`,
|
|
50
|
-
value: "__default__",
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
if (choices.length === 1) {
|
|
54
|
-
const choice = choices[0];
|
|
55
|
-
console.log(chalk.green(`✔ Auto-selected connection: › ${choice.title}`));
|
|
56
|
-
if (choice.value !== "__default__") {
|
|
57
|
-
serverName = choice.value;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
const response = await prompts({
|
|
62
|
-
type: "select",
|
|
63
|
-
name: "server",
|
|
64
|
-
message: "Select a connection to use:",
|
|
65
|
-
choices,
|
|
66
|
-
});
|
|
67
|
-
if (!response.server) {
|
|
68
|
-
console.log(chalk.yellow("\n⚠ Operation cancelled.\n"));
|
|
69
|
-
process.exit(0);
|
|
70
|
-
}
|
|
71
|
-
if (response.server !== "__default__") {
|
|
72
|
-
serverName = response.server;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
94
|
+
const selected = await promptServerSelection(servers, serverNames, savedDefaults, rawOpts.engine);
|
|
95
|
+
if (selected !== undefined) {
|
|
96
|
+
serverName = selected;
|
|
75
97
|
}
|
|
76
98
|
}
|
|
77
99
|
// --- Step 2: Determine engine type ---
|
|
78
|
-
|
|
79
|
-
let engineType;
|
|
80
|
-
if (rawOpts.engine) {
|
|
81
|
-
engineType = rawOpts.engine;
|
|
82
|
-
}
|
|
83
|
-
else if (serverName) {
|
|
84
|
-
const profile = config.getServer(serverName);
|
|
85
|
-
profileEngine = profile?.engine;
|
|
86
|
-
engineType = profileEngine ?? savedDefaults.engine ?? "postgres";
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
engineType = savedDefaults.engine ?? "postgres";
|
|
90
|
-
}
|
|
100
|
+
const engineType = resolveEngineType(rawOpts.engine, serverName, savedDefaults);
|
|
91
101
|
const engine = createEngine(engineType);
|
|
92
102
|
// --- Step 3: Resolve connection options ---
|
|
93
103
|
if (serverName) {
|
|
@@ -121,6 +131,7 @@ export async function resolveEngineAndConnection(rawOpts) {
|
|
|
121
131
|
};
|
|
122
132
|
}
|
|
123
133
|
// No server profile — merge CLI opts with config defaults
|
|
134
|
+
const engineDefaults = engine.getDefaultConnectionOptions();
|
|
124
135
|
const merged = {
|
|
125
136
|
host: rawOpts.host ?? savedDefaults.host,
|
|
126
137
|
port: rawOpts.port ?? savedDefaults.port,
|
|
@@ -130,6 +141,19 @@ export async function resolveEngineAndConnection(rawOpts) {
|
|
|
130
141
|
if (merged.port) {
|
|
131
142
|
return { engine, engineType, opts: merged };
|
|
132
143
|
}
|
|
144
|
+
// Engines that don't use ports (e.g. SQLite) skip port-based auto-discovery.
|
|
145
|
+
// They are fully identified by their host (database directory) alone.
|
|
146
|
+
if (!engineDefaults.port) {
|
|
147
|
+
return {
|
|
148
|
+
engine,
|
|
149
|
+
engineType,
|
|
150
|
+
opts: {
|
|
151
|
+
host: merged.host ?? engineDefaults.host,
|
|
152
|
+
user: merged.user ?? engineDefaults.user,
|
|
153
|
+
password: merged.password,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
133
157
|
// --- Step 4: Auto-discovery ---
|
|
134
158
|
const spinner = ora(`Scanning for running ${engine.getEngineName()} servers...`).start();
|
|
135
159
|
const instances = await engine.discoverInstances(merged);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-connection.js","sourceRoot":"","sources":["../../../src/infra/engines/resolve-connection.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnD,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-connection.js","sourceRoot":"","sources":["../../../src/infra/engines/resolve-connection.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnD,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAiBtD;;;;GAIG;AACH,KAAK,UAAU,qBAAqB,CAClC,OAAsC,EACtC,WAAqB,EACrB,aAA4B,EAC5B,eAA4B;IAE5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,IAAI,UAAU,CAAC;IACnD,MAAM,mBAAmB,GAAG,CAAC,eAAe,IAAI,OAAO,KAAK,eAAe,CAAC;IAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAE1D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,mBAAmB,CAAC,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO;YACL,KAAK,EAAE,GAAG,IAAI,UAAU,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,WAAW,GAAG;YACxD,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,IAAI,mBAAmB,EAAE,CAAC;QACvC,MAAM,kBAAkB,GAAG,aAAa,OAAO,EAAE,CAAC;QAClD,OAAO,CAAC,OAAO,CAAC;YACd,KAAK,EAAE,4BAA4B,aAAa,CAAC,IAAI,IAAI,GAAG,GAAG,kBAAkB,GAAG;YACpF,KAAK,EAAE,aAAa;SACrB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,6BAA6B;QACtC,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACxB,SAAiC,EACjC,UAA8B,EAC9B,aAA4B;IAE5B,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,OAAO,EAAE,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,UAAU,CAAC;IAC/D,CAAC;IACD,OAAO,aAAa,CAAC,MAAM,IAAI,UAAU,CAAC;AAC5C,CAAC;AAED,wBAAwB;AAExB;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAqE;IAErE,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1C,IAAI,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAEhC,8DAA8D;IAE9D,MAAM,aAAa,GACjB,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,CAAC;IAEpE,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,aAAa,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEvC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAClD,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAC1C,OAAO,EACP,WAAW,EACX,aAAa,EACb,OAAO,CAAC,MAAM,CACf,CAAC;QAEF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,UAAU,GAAG,QAAQ,CAAC;QACxB,CAAC;IACH,CAAC;IAED,wCAAwC;IAExC,MAAM,UAAU,GAAG,iBAAiB,CAClC,OAAO,CAAC,MAAM,EACd,UAAU,EACV,aAAa,CACd,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAExC,6CAA6C;IAE7C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,cAAc,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtB,MAAM,CAAC,IAAI,CACT,6EAA6E,CAC9E,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CACT,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAC5D,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,2BAA2B,EAAE,CAAC;QACtD,OAAO;YACL,MAAM;YACN,UAAU;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;gBACzD,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI;gBACxC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;gBACzD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ;aACrD;SACF,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,MAAM,cAAc,GAAG,MAAM,CAAC,2BAA2B,EAAE,CAAC;IAE5D,MAAM,MAAM,GAAsB;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI;QACxC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI;QACxC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ;KACrD,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED,6EAA6E;IAC7E,sEAAsE;IACtE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACzB,OAAO;YACL,MAAM;YACN,UAAU;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,cAAc,CAAC,IAAI;gBACxC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,cAAc,CAAC,IAAI;gBACxC,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;SACF,CAAC;IACJ,CAAC;IAED,iCAAiC;IAEjC,MAAM,OAAO,GAAG,GAAG,CACjB,wBAAwB,MAAM,CAAC,aAAa,EAAE,aAAa,CAC5D,CAAC,KAAK,EAAE,CAAC;IACV,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEzD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACnE,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CACV,sBAAsB,MAAM,CAAC,aAAa,EAAE,0BAA0B,CACvE,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,CAAC,OAAO,CACb,gCAAgC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,OAAO,GAAG,CAClF,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IAC1E,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,SAAS,SAAS,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvC,KAAK,EAAE,QAAQ,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE;QAC5C,KAAK,EAAE,IAAI,CAAC,IAAI;KACjB,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,YAAY,MAAM,CAAC,aAAa,EAAE,+CAA+C;QAC1F,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-env.d.ts","sourceRoot":"","sources":["../../../../src/infra/engines/sqlite/sqlite-env.ts"],"names":[],"mappings":"AAIA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAuBzD"}
|
|
@@ -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.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Modern Database workflow CLI focused on developer experience, safety, and automation.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -27,16 +27,20 @@
|
|
|
27
27
|
"test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch --selectProjects unit",
|
|
28
28
|
"test:unit": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js --selectProjects unit",
|
|
29
29
|
"test:e2e": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js --selectProjects e2e",
|
|
30
|
+
"test:integration": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js --selectProjects integration",
|
|
30
31
|
"test:e2e:pgsql": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js -- tests/e2e/postgres/",
|
|
31
32
|
"test:e2e:pgsql:up": "docker compose -f infra/docker/compose.e2e-pgsql.yml up -d --wait",
|
|
32
33
|
"test:e2e:pgsql:down": "docker compose -f infra/docker/compose.e2e-pgsql.yml down -v --remove-orphans",
|
|
33
34
|
"test:e2e:mysql": "node --no-warnings --experimental-vm-modules node_modules/jest/bin/jest.js -- tests/e2e/mysql/",
|
|
34
35
|
"test:e2e:mysql:up": "docker compose -f infra/docker/compose.e2e-mysql.yml up -d --wait",
|
|
35
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/",
|
|
36
38
|
"prepare": "husky"
|
|
37
39
|
},
|
|
38
40
|
"keywords": [
|
|
39
41
|
"postgresql",
|
|
42
|
+
"mysql",
|
|
43
|
+
"sqlite",
|
|
40
44
|
"cli",
|
|
41
45
|
"database",
|
|
42
46
|
"backup",
|