spindb 0.44.1 → 0.45.1

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 (56) hide show
  1. package/README.md +22 -10
  2. package/dist/cli/commands/create.js +6 -1
  3. package/dist/cli/commands/create.js.map +1 -1
  4. package/dist/cli/commands/engines.js +46 -0
  5. package/dist/cli/commands/engines.js.map +1 -1
  6. package/dist/cli/commands/menu/backup-handlers.js +5 -0
  7. package/dist/cli/commands/menu/backup-handlers.js.map +1 -1
  8. package/dist/cli/commands/menu/settings-handlers.js +3 -0
  9. package/dist/cli/commands/menu/settings-handlers.js.map +1 -1
  10. package/dist/cli/commands/menu/shell-handlers.js +31 -1
  11. package/dist/cli/commands/menu/shell-handlers.js.map +1 -1
  12. package/dist/cli/constants.js +4 -0
  13. package/dist/cli/constants.js.map +1 -1
  14. package/dist/cli/helpers.js +53 -2
  15. package/dist/cli/helpers.js.map +1 -1
  16. package/dist/config/backup-formats.js +18 -0
  17. package/dist/config/backup-formats.js.map +1 -1
  18. package/dist/config/engine-defaults.js +13 -0
  19. package/dist/config/engine-defaults.js.map +1 -1
  20. package/dist/config/engines.json +18 -0
  21. package/dist/config/version.js +1 -1
  22. package/dist/core/config-manager.js +4 -1
  23. package/dist/core/config-manager.js.map +1 -1
  24. package/dist/core/credential-manager.js +2 -0
  25. package/dist/core/credential-manager.js.map +1 -1
  26. package/dist/core/database-capabilities.js +8 -0
  27. package/dist/core/database-capabilities.js.map +1 -1
  28. package/dist/core/dependency-manager.js +2 -0
  29. package/dist/core/dependency-manager.js.map +1 -1
  30. package/dist/core/docker-exporter.js +12 -0
  31. package/dist/core/docker-exporter.js.map +1 -1
  32. package/dist/core/remote-container.js +2 -0
  33. package/dist/core/remote-container.js.map +1 -1
  34. package/dist/engines/index.js +5 -1
  35. package/dist/engines/index.js.map +1 -1
  36. package/dist/engines/libsql/api-client.js +134 -0
  37. package/dist/engines/libsql/api-client.js.map +1 -0
  38. package/dist/engines/libsql/backup.js +151 -0
  39. package/dist/engines/libsql/backup.js.map +1 -0
  40. package/dist/engines/libsql/binary-manager.js +31 -0
  41. package/dist/engines/libsql/binary-manager.js.map +1 -0
  42. package/dist/engines/libsql/binary-urls.js +50 -0
  43. package/dist/engines/libsql/binary-urls.js.map +1 -0
  44. package/dist/engines/libsql/hostdb-releases.js +21 -0
  45. package/dist/engines/libsql/hostdb-releases.js.map +1 -0
  46. package/dist/engines/libsql/index.js +578 -0
  47. package/dist/engines/libsql/index.js.map +1 -0
  48. package/dist/engines/libsql/restore.js +219 -0
  49. package/dist/engines/libsql/restore.js.map +1 -0
  50. package/dist/engines/libsql/version-maps.js +63 -0
  51. package/dist/engines/libsql/version-maps.js.map +1 -0
  52. package/dist/engines/libsql/version-validator.js +111 -0
  53. package/dist/engines/libsql/version-validator.js.map +1 -0
  54. package/dist/types/index.js +2 -0
  55. package/dist/types/index.js.map +1 -1
  56. package/package.json +2 -1
@@ -0,0 +1,151 @@
1
+ /**
2
+ * libSQL backup module
3
+ * Supports binary (file copy) and SQL dump backup formats
4
+ */
5
+ import { mkdir, stat, cp } from 'fs/promises';
6
+ import { existsSync, statSync } from 'fs';
7
+ import { join, dirname } from 'path';
8
+ import { logDebug } from '../../core/error-handler.js';
9
+ import { paths } from '../../config/paths.js';
10
+ import { loadCredentials, getDefaultUsername, } from '../../core/credential-manager.js';
11
+ import { libsqlQuery } from './api-client.js';
12
+ import { Engine, } from '../../types/index.js';
13
+ import { writeFile } from 'fs/promises';
14
+ /**
15
+ * Create a backup of a libSQL database
16
+ */
17
+ export async function createBackup(container, outputPath, options) {
18
+ const format = (options.format || 'binary');
19
+ // Ensure output directory exists
20
+ const outputDir = dirname(outputPath);
21
+ if (!existsSync(outputDir)) {
22
+ await mkdir(outputDir, { recursive: true });
23
+ }
24
+ if (format === 'binary') {
25
+ return createBinaryBackup(container, outputPath);
26
+ }
27
+ return createSqlBackup(container, outputPath);
28
+ }
29
+ /**
30
+ * Create a binary backup by copying the database directory.
31
+ * sqld's --db-path creates a directory tree (data.db/dbs/default/data is the
32
+ * actual SQLite file, plus WAL, metastore, etc.). We copy the whole directory
33
+ * to preserve all state needed for a clean restore.
34
+ */
35
+ async function createBinaryBackup(container, outputPath) {
36
+ const containerDir = paths.getContainerPath(container.name, {
37
+ engine: 'libsql',
38
+ });
39
+ const dbDir = join(containerDir, 'data', 'data.db');
40
+ if (!existsSync(dbDir)) {
41
+ throw new Error(`Database directory not found: ${dbDir}. Is the container initialized?`);
42
+ }
43
+ logDebug(`Creating binary backup of libSQL database: ${dbDir}`);
44
+ // Copy the entire data.db directory tree
45
+ await cp(dbDir, outputPath, { recursive: true });
46
+ // Calculate total size of the backup
47
+ let totalSize = 0;
48
+ const isDir = statSync(outputPath).isDirectory();
49
+ if (isDir) {
50
+ const { readdir } = await import('fs/promises');
51
+ async function sumDir(dir) {
52
+ const entries = await readdir(dir, { withFileTypes: true });
53
+ for (const entry of entries) {
54
+ const fullPath = join(dir, entry.name);
55
+ if (entry.isDirectory()) {
56
+ await sumDir(fullPath);
57
+ }
58
+ else {
59
+ totalSize += (await stat(fullPath)).size;
60
+ }
61
+ }
62
+ }
63
+ await sumDir(outputPath);
64
+ }
65
+ else {
66
+ totalSize = (await stat(outputPath)).size;
67
+ }
68
+ return {
69
+ path: outputPath,
70
+ format: 'binary',
71
+ size: totalSize,
72
+ };
73
+ }
74
+ /**
75
+ * Create a SQL dump backup via the HTTP API
76
+ */
77
+ async function createSqlBackup(container, outputPath) {
78
+ const { port, name } = container;
79
+ logDebug(`Creating SQL backup of libSQL database via HTTP API on port ${port}`);
80
+ // Load auth token if credentials are stored
81
+ const username = getDefaultUsername(Engine.LibSQL);
82
+ const creds = await loadCredentials(name, Engine.LibSQL, username);
83
+ const authToken = creds?.apiKey ?? undefined;
84
+ // Get all table names
85
+ const tablesResult = await libsqlQuery(port, "SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '_litestream_%' ORDER BY name", { authToken });
86
+ const lines = [
87
+ '-- libSQL SQL dump',
88
+ `-- Server port: ${port}`,
89
+ `-- Date: ${new Date().toISOString()}`,
90
+ '',
91
+ 'BEGIN TRANSACTION;',
92
+ '',
93
+ ];
94
+ for (const row of tablesResult.rows) {
95
+ const tableName = String(row[0]?.type === 'text' ? row[0].value : row[0]);
96
+ const createSql = String(row[1]?.type === 'text' ? row[1].value : row[1]);
97
+ const escapedName = tableName.replace(/"/g, '""');
98
+ lines.push(`${createSql};`);
99
+ lines.push('');
100
+ // Dump all rows
101
+ const dataResult = await libsqlQuery(port, `SELECT * FROM "${escapedName}"`, { authToken });
102
+ for (const dataRow of dataResult.rows) {
103
+ const values = dataRow.map((val) => {
104
+ if (val.type === 'null')
105
+ return 'NULL';
106
+ if (val.type === 'integer')
107
+ return val.value;
108
+ if (val.type === 'float')
109
+ return String(val.value);
110
+ if (val.type === 'text')
111
+ return `'${String(val.value).replace(/'/g, "''")}'`;
112
+ if (val.type === 'blob')
113
+ return `X'${Buffer.from(val.base64, 'base64').toString('hex')}'`;
114
+ return 'NULL';
115
+ });
116
+ const columns = dataResult.cols.map((c) => `"${c.name.replace(/"/g, '""')}"`);
117
+ lines.push(`INSERT INTO "${escapedName}" (${columns.join(', ')}) VALUES (${values.join(', ')});`);
118
+ }
119
+ lines.push('');
120
+ }
121
+ // Get indexes
122
+ const indexResult = await libsqlQuery(port, "SELECT sql FROM sqlite_master WHERE type='index' AND sql IS NOT NULL ORDER BY name", { authToken });
123
+ for (const row of indexResult.rows) {
124
+ const sql = String(row[0]?.type === 'text' ? row[0].value : row[0]);
125
+ lines.push(`${sql};`);
126
+ }
127
+ // Get views
128
+ const viewResult = await libsqlQuery(port, "SELECT sql FROM sqlite_master WHERE type='view' ORDER BY name", { authToken });
129
+ for (const row of viewResult.rows) {
130
+ const sql = String(row[0]?.type === 'text' ? row[0].value : row[0]);
131
+ lines.push(`${sql};`);
132
+ }
133
+ // Get triggers
134
+ const triggerResult = await libsqlQuery(port, "SELECT sql FROM sqlite_master WHERE type='trigger' ORDER BY name", { authToken });
135
+ for (const row of triggerResult.rows) {
136
+ const sql = String(row[0]?.type === 'text' ? row[0].value : row[0]);
137
+ lines.push(`${sql};`);
138
+ }
139
+ lines.push('');
140
+ lines.push('COMMIT;');
141
+ lines.push('');
142
+ const content = lines.join('\n');
143
+ await writeFile(outputPath, content, 'utf-8');
144
+ const stats = await stat(outputPath);
145
+ return {
146
+ path: outputPath,
147
+ format: 'sql',
148
+ size: stats.size,
149
+ };
150
+ }
151
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../engines/libsql/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * libSQL Binary Manager
3
+ *
4
+ * Handles downloading, extracting, and managing libSQL (sqld) binaries from hostdb.
5
+ * Extends BaseBinaryManager for shared download/extraction logic.
6
+ */
7
+ import { BaseBinaryManager, } from '../../core/base-binary-manager.js';
8
+ import { getBinaryUrl } from './binary-urls.js';
9
+ import { normalizeVersion } from './version-maps.js';
10
+ import { Engine } from '../../types/index.js';
11
+ class LibSQLBinaryManager extends BaseBinaryManager {
12
+ config = {
13
+ engine: Engine.LibSQL,
14
+ engineName: 'libsql',
15
+ displayName: 'libSQL',
16
+ serverBinary: 'sqld',
17
+ };
18
+ getBinaryUrlFromModule(version, platform, arch) {
19
+ return getBinaryUrl(version, platform, arch);
20
+ }
21
+ normalizeVersionFromModule(version) {
22
+ return normalizeVersion(version);
23
+ }
24
+ parseVersionFromOutput(stdout) {
25
+ // Extract version from output like "sqld 0.24.32" or "v0.24.32"
26
+ const match = stdout.match(/(?:sqld\s+)?v?(\d+\.\d+\.\d+)/);
27
+ return match?.[1] ?? null;
28
+ }
29
+ }
30
+ export const libsqlBinaryManager = new LibSQLBinaryManager();
31
+ //# sourceMappingURL=binary-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-manager.js","sourceRoot":"","sources":["../../../engines/libsql/binary-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,GAElB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,MAAM,EAA4B,MAAM,aAAa,CAAA;AAE9D,MAAM,mBAAoB,SAAQ,iBAAiB;IAC9B,MAAM,GAAwB;QAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,QAAQ;QACrB,YAAY,EAAE,MAAM;KACrB,CAAA;IAES,sBAAsB,CAC9B,OAAe,EACf,QAAkB,EAClB,IAAU;QAEV,OAAO,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC9C,CAAC;IAES,0BAA0B,CAAC,OAAe;QAClD,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAES,sBAAsB,CAAC,MAAc;QAC7C,gEAAgE;QAChE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAC3D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IAC3B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAA"}
@@ -0,0 +1,50 @@
1
+ import { normalizeVersion } from './version-maps.js';
2
+ import { buildHostdbUrl } from '../../core/hostdb-client.js';
3
+ import { Engine } from '../../types/index.js';
4
+ /**
5
+ * Supported platform identifiers for hostdb downloads.
6
+ * libSQL (sqld) does not have Windows binaries.
7
+ */
8
+ const SUPPORTED_PLATFORMS = new Set([
9
+ 'darwin-arm64',
10
+ 'darwin-x64',
11
+ 'linux-arm64',
12
+ 'linux-x64',
13
+ ]);
14
+ /**
15
+ * Get the hostdb platform identifier
16
+ *
17
+ * @param platform - Node.js platform (e.g., 'darwin', 'linux')
18
+ * @param arch - Node.js architecture (e.g., 'arm64', 'x64')
19
+ * @returns hostdb platform identifier or null if unsupported
20
+ */
21
+ export function getHostdbPlatform(platform, arch) {
22
+ const key = `${platform}-${arch}`;
23
+ return SUPPORTED_PLATFORMS.has(key) ? key : null;
24
+ }
25
+ /**
26
+ * Build the download URL for libSQL binaries from hostdb
27
+ *
28
+ * Format: https://registry.layerbase.host/libsql-{version}/libsql-{version}-{platform}-{arch}.tar.gz
29
+ *
30
+ * @param version - libSQL version (e.g., '0.24', '0.24.32')
31
+ * @param platform - Platform identifier (e.g., 'darwin', 'linux')
32
+ * @param arch - Architecture identifier (e.g., 'arm64', 'x64')
33
+ * @returns Download URL for the binary
34
+ */
35
+ export function getBinaryUrl(version, platform, arch) {
36
+ const platformKey = `${platform}-${arch}`;
37
+ const hostdbPlatform = getHostdbPlatform(platform, arch);
38
+ if (!hostdbPlatform) {
39
+ const supported = Array.from(SUPPORTED_PLATFORMS).join(', ');
40
+ throw new Error(`Unsupported platform: ${platformKey}. Supported platforms: ${supported}`);
41
+ }
42
+ // Normalize version (handles major version lookup and X.Y -> X.Y.Z conversion)
43
+ const fullVersion = normalizeVersion(version);
44
+ return buildHostdbUrl(Engine.LibSQL, {
45
+ version: fullVersion,
46
+ hostdbPlatform,
47
+ extension: 'tar.gz',
48
+ });
49
+ }
50
+ //# sourceMappingURL=binary-urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-urls.js","sourceRoot":"","sources":["../../../engines/libsql/binary-urls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,MAAM,EAA4B,MAAM,aAAa,CAAA;AAE9D;;;GAGG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,cAAc;IACd,YAAY;IACZ,aAAa;IACb,WAAW;CACZ,CAAC,CAAA;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAkB,EAClB,IAAU;IAEV,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAA;IACjC,OAAO,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,QAAkB,EAClB,IAAU;IAEV,MAAM,WAAW,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAA;IACzC,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACxD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5D,MAAM,IAAI,KAAK,CACb,yBAAyB,WAAW,0BAA0B,SAAS,EAAE,CAC1E,CAAA;IACH,CAAC;IAED,+EAA+E;IAC/E,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAE7C,OAAO,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,OAAO,EAAE,WAAW;QACpB,cAAc;QACd,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * hostdb Releases Module for libSQL
3
+ *
4
+ * Fetches libSQL binary information from the hostdb repository at
5
+ * https://github.com/robertjbass/hostdb
6
+ */
7
+ import { createHostdbReleases } from '../../core/hostdb-releases-factory.js';
8
+ import { LIBSQL_VERSION_MAP, SUPPORTED_MAJOR_VERSIONS } from './version-maps.js';
9
+ import { libsqlBinaryManager } from './binary-manager.js';
10
+ import { Engine } from '../../types/index.js';
11
+ const hostdbReleases = createHostdbReleases({
12
+ engine: Engine.LibSQL,
13
+ displayName: 'libSQL',
14
+ versionMap: LIBSQL_VERSION_MAP,
15
+ supportedMajorVersions: SUPPORTED_MAJOR_VERSIONS,
16
+ groupingStrategy: 'xy-format',
17
+ listInstalled: () => libsqlBinaryManager.listInstalled(),
18
+ });
19
+ export const fetchAvailableVersions = hostdbReleases.fetchAvailableVersions;
20
+ export const getLatestVersion = hostdbReleases.getLatestVersion;
21
+ //# sourceMappingURL=hostdb-releases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostdb-releases.js","sourceRoot":"","sources":["../../../engines/libsql/hostdb-releases.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,cAAc,GAAG,oBAAoB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,kBAAkB;IAC9B,sBAAsB,EAAE,wBAAwB;IAChD,gBAAgB,EAAE,WAAW;IAC7B,aAAa,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE;CACzD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAc,CAAC,sBAAsB,CAAA;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC,gBAAgB,CAAA"}