admindb 1.2.1 → 2.0.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 +262 -329
- package/dist/app.d.ts +25 -4
- package/dist/app.js +79 -15
- package/dist/app.js.map +1 -1
- package/dist/auth/config.d.ts +19 -0
- package/dist/auth/config.js +147 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/crypto.d.ts +27 -0
- package/dist/auth/crypto.js +133 -0
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.js +22 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +14 -0
- package/dist/auth/middleware.js +100 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/routes.d.ts +7 -0
- package/dist/auth/routes.js +78 -0
- package/dist/auth/routes.js.map +1 -0
- package/dist/auth/types.d.ts +35 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/args.d.ts +45 -0
- package/dist/cli/args.js +328 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config.d.ts +56 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/runner.d.ts +1 -0
- package/dist/cli/runner.js +222 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli.js +2 -127
- package/dist/cli.js.map +1 -1
- package/dist/data/datasets.d.ts +17 -0
- package/dist/data/datasets.js +133 -0
- package/dist/data/datasets.js.map +1 -0
- package/dist/data/detector.d.ts +30 -0
- package/dist/data/detector.js +472 -0
- package/dist/data/detector.js.map +1 -0
- package/dist/data/engine.d.ts +10 -0
- package/dist/data/engine.js +211 -0
- package/dist/data/engine.js.map +1 -0
- package/dist/data/index.d.ts +5 -0
- package/dist/data/index.js +22 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/strategies.d.ts +30 -0
- package/dist/data/strategies.js +343 -0
- package/dist/data/strategies.js.map +1 -0
- package/dist/data/types.d.ts +73 -0
- package/dist/data/types.js +8 -0
- package/dist/data/types.js.map +1 -0
- package/dist/db/database.d.ts +14 -146
- package/dist/db/database.js +208 -461
- package/dist/db/database.js.map +1 -1
- package/dist/db/export.d.ts +2 -2
- package/dist/db/export.js +7 -2
- package/dist/db/export.js.map +1 -1
- package/dist/db/filters.d.ts +22 -0
- package/dist/db/filters.js +158 -0
- package/dist/db/filters.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.js +25 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/introspection.d.ts +6 -0
- package/dist/db/introspection.js +172 -0
- package/dist/db/introspection.js.map +1 -0
- package/dist/db/manager.d.ts +32 -19
- package/dist/db/manager.js +203 -44
- package/dist/db/manager.js.map +1 -1
- package/dist/db/migrations.d.ts +5 -0
- package/dist/db/migrations.js +110 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/postgres.d.ts +85 -0
- package/dist/db/postgres.js +745 -0
- package/dist/db/postgres.js.map +1 -0
- package/dist/db/types.d.ts +206 -0
- package/dist/db/types.js +7 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/public/css/app.css +1 -1
- package/dist/public/css/input.css +74 -11
- package/dist/public/js/app.js +142 -0
- package/dist/public/js/browse.js +591 -104
- package/dist/public/js/databases.js +105 -13
- package/dist/public/js/designer.js +40 -2
- package/dist/public/js/forms.js +610 -28
- package/dist/public/js/icons.js +51 -0
- package/dist/public/js/inspector.js +638 -0
- package/dist/public/js/query.js +93 -3
- package/dist/public/js/schema.js +170 -52
- package/dist/public/js/seed.js +865 -152
- package/dist/routes/api/helpers.d.ts +42 -0
- package/dist/routes/api/helpers.js +133 -0
- package/dist/routes/api/helpers.js.map +1 -0
- package/dist/routes/api/import-export.d.ts +3 -0
- package/dist/routes/api/import-export.js +85 -0
- package/dist/routes/api/import-export.js.map +1 -0
- package/dist/routes/api/index.d.ts +4 -0
- package/dist/routes/api/index.js +37 -0
- package/dist/routes/api/index.js.map +1 -0
- package/dist/routes/api/query.d.ts +3 -0
- package/dist/routes/api/query.js +76 -0
- package/dist/routes/api/query.js.map +1 -0
- package/dist/routes/api/rows.d.ts +3 -0
- package/dist/routes/api/rows.js +373 -0
- package/dist/routes/api/rows.js.map +1 -0
- package/dist/routes/api/seed.d.ts +3 -0
- package/dist/routes/api/seed.js +82 -0
- package/dist/routes/api/seed.js.map +1 -0
- package/dist/routes/api/tables.d.ts +3 -0
- package/dist/routes/api/tables.js +160 -0
- package/dist/routes/api/tables.js.map +1 -0
- package/dist/routes/databases.d.ts +8 -11
- package/dist/routes/databases.js +100 -66
- package/dist/routes/databases.js.map +1 -1
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.js +20 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/pages.d.ts +3 -3
- package/dist/routes/pages.js +147 -62
- package/dist/routes/pages.js.map +1 -1
- package/dist/serverless.d.ts +40 -0
- package/dist/serverless.js +210 -0
- package/dist/serverless.js.map +1 -0
- package/dist/sql/generator.d.ts +4 -3
- package/dist/sql/generator.js +103 -6
- package/dist/sql/generator.js.map +1 -1
- package/dist/sql/index.d.ts +2 -0
- package/dist/sql/index.js +19 -0
- package/dist/sql/index.js.map +1 -0
- package/dist/types/api.d.ts +412 -0
- package/dist/types/api.js +9 -0
- package/dist/types/api.js.map +1 -0
- package/dist/utils/colors.d.ts +40 -0
- package/dist/utils/colors.js +64 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/{util.d.ts → utils/common.d.ts} +10 -6
- package/dist/{util.js → utils/common.js} +80 -13
- package/dist/utils/common.js.map +1 -0
- package/dist/utils/csv.js.map +1 -0
- package/dist/utils/datatype.d.ts +49 -0
- package/dist/utils/datatype.js +222 -0
- package/dist/utils/datatype.js.map +1 -0
- package/dist/utils/icons.d.ts +11 -0
- package/dist/utils/icons.js +72 -0
- package/dist/utils/icons.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/{logger.d.ts → utils/logger.d.ts} +1 -1
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/views/layouts/main.hbs +33 -11
- package/dist/views/pages/databases.hbs +182 -74
- package/dist/views/pages/designer.hbs +9 -6
- package/dist/views/pages/error.hbs +3 -3
- package/dist/views/pages/form.hbs +5 -3
- package/dist/views/pages/home.hbs +22 -13
- package/dist/views/pages/login.hbs +111 -0
- package/dist/views/pages/query.hbs +8 -6
- package/dist/views/pages/schema.hbs +41 -13
- package/dist/views/pages/seed.hbs +200 -54
- package/dist/views/pages/table.hbs +152 -72
- package/dist/views/partials/icon.hbs +2 -0
- package/dist/views/partials/navbar.hbs +69 -25
- package/dist/views/partials/sidebar.hbs +108 -94
- package/package.json +11 -4
- package/dist/args.d.ts +0 -28
- package/dist/args.js +0 -187
- package/dist/args.js.map +0 -1
- package/dist/config.d.ts +0 -17
- package/dist/config.js +0 -23
- package/dist/config.js.map +0 -1
- package/dist/csv.js.map +0 -1
- package/dist/data/generator.d.ts +0 -86
- package/dist/data/generator.js +0 -1031
- package/dist/data/generator.js.map +0 -1
- package/dist/logger.js +0 -25
- package/dist/logger.js.map +0 -1
- package/dist/routes/api.d.ts +0 -9
- package/dist/routes/api.js +0 -848
- package/dist/routes/api.js.map +0 -1
- package/dist/test/classifier.test.d.ts +0 -1
- package/dist/test/classifier.test.js +0 -44
- package/dist/test/classifier.test.js.map +0 -1
- package/dist/test/csv.test.d.ts +0 -1
- package/dist/test/csv.test.js +0 -64
- package/dist/test/csv.test.js.map +0 -1
- package/dist/test/database.test.d.ts +0 -1
- package/dist/test/database.test.js +0 -402
- package/dist/test/database.test.js.map +0 -1
- package/dist/test/generator.test.d.ts +0 -1
- package/dist/test/generator.test.js +0 -132
- package/dist/test/generator.test.js.map +0 -1
- package/dist/test/manager.test.d.ts +0 -1
- package/dist/test/manager.test.js +0 -146
- package/dist/test/manager.test.js.map +0 -1
- package/dist/util.js.map +0 -1
- /package/dist/{csv.d.ts → utils/csv.d.ts} +0 -0
- /package/dist/{csv.js → utils/csv.js} +0 -0
package/dist/db/manager.d.ts
CHANGED
|
@@ -1,33 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type Logger } from '../logger';
|
|
1
|
+
import type { IDatabase } from './types';
|
|
2
|
+
import { type Logger } from '../utils/logger';
|
|
3
3
|
export interface DbManagerOptions {
|
|
4
4
|
/** Directory of database files. Scanned for known extensions; new DBs are created here. */
|
|
5
5
|
dir?: string;
|
|
6
|
-
/** Explicit database file paths
|
|
6
|
+
/** Explicit database file paths or connection strings. */
|
|
7
7
|
files?: string[];
|
|
8
|
+
/** Named database connections map (e.g. { "mydb": "postgresql://...", "name1": "postgresql://..." }). */
|
|
9
|
+
connections?: Record<string, string>;
|
|
8
10
|
/** Open every managed database read-only (no writes, no create/delete of files). */
|
|
9
11
|
readonly?: boolean;
|
|
10
12
|
}
|
|
11
13
|
export interface DatabaseEntry {
|
|
12
|
-
/** Stable, URL-safe id (usually the file name, deduped on collision). */
|
|
14
|
+
/** Stable, URL-safe id (usually the file name or connection name, deduped on collision). */
|
|
13
15
|
id: string;
|
|
14
|
-
/**
|
|
16
|
+
/** Name for display. */
|
|
15
17
|
name: string;
|
|
16
|
-
/**
|
|
18
|
+
/** Path on disk or sanitized connection URI. */
|
|
17
19
|
path: string;
|
|
20
|
+
/** Database dialect (sqlite or postgres). */
|
|
21
|
+
dialect: 'sqlite' | 'postgres';
|
|
18
22
|
size: number;
|
|
19
23
|
modified: string;
|
|
24
|
+
/** Whether this specific database is opened in read-only mode. */
|
|
25
|
+
readonly: boolean;
|
|
20
26
|
}
|
|
21
27
|
/**
|
|
22
|
-
* Manages multiple SQLite database files.
|
|
28
|
+
* Manages multiple SQLite database files and PostgreSQL database connections.
|
|
23
29
|
*
|
|
24
|
-
* Databases come from
|
|
25
|
-
* - a `
|
|
26
|
-
* -
|
|
27
|
-
*
|
|
28
|
-
* New databases created through `create()` land in `dir` (or the working
|
|
29
|
-
* directory when no dir is configured). Each database gets a stable id (the
|
|
30
|
-
* file name, or a deduped `name__2.ext` when names collide across sources).
|
|
30
|
+
* Databases come from three sources:
|
|
31
|
+
* - a `connections` map — named PostgreSQL or SQLite connection strings (e.g. from JSON config),
|
|
32
|
+
* - a `dir` — every SQLite file with a known extension is scanned in,
|
|
33
|
+
* - an explicit `files[]` array — specific file locations or connection strings.
|
|
31
34
|
*/
|
|
32
35
|
export declare class DbManager {
|
|
33
36
|
private logger;
|
|
@@ -37,31 +40,41 @@ export declare class DbManager {
|
|
|
37
40
|
private files;
|
|
38
41
|
private idByPath;
|
|
39
42
|
private pathById;
|
|
43
|
+
private nameById;
|
|
44
|
+
private readonlyById;
|
|
40
45
|
private openDbs;
|
|
41
46
|
constructor(options: DbManagerOptions | string, logger?: Logger);
|
|
42
47
|
get directory(): string;
|
|
43
48
|
/** True when this manager opens every database read-only. */
|
|
44
49
|
get isReadOnly(): boolean;
|
|
45
50
|
isDbFile(name: string): boolean;
|
|
51
|
+
private registerConnections;
|
|
46
52
|
private registerDirFiles;
|
|
47
53
|
private registerExplicitFiles;
|
|
54
|
+
private addNamedTarget;
|
|
48
55
|
private addFile;
|
|
49
56
|
/** List all managed databases (metadata only — does not open them). */
|
|
50
57
|
list(): DatabaseEntry[];
|
|
51
58
|
has(id: string): boolean;
|
|
52
|
-
/**
|
|
53
|
-
|
|
59
|
+
/** True if global manager is in readonly mode or this database is explicitly marked read-only. */
|
|
60
|
+
isDbReadOnly(id: string): boolean;
|
|
61
|
+
/** Set or toggle read-only mode for a specific database id. */
|
|
62
|
+
setReadonly(id: string, readonly: boolean): void;
|
|
63
|
+
/** Open (and cache) a database by id; creates the file if it is new SQLite database. */
|
|
64
|
+
open(id: string, readonlyOverride?: boolean): IDatabase;
|
|
54
65
|
/**
|
|
55
66
|
* Register and open an existing database file by path, returning its id.
|
|
56
67
|
* Used by the "Open an existing database" file browser. Validates that the
|
|
57
68
|
* file is a readable SQLite database before keeping it registered.
|
|
58
69
|
*/
|
|
59
|
-
openFile(absPath: string): string;
|
|
60
|
-
get(id: string):
|
|
70
|
+
openFile(absPath: string, readonly?: boolean): string;
|
|
71
|
+
get(id: string): IDatabase | undefined;
|
|
61
72
|
/** Count the tables in a database (opens it if necessary). */
|
|
62
73
|
countTables(id: string): Promise<number>;
|
|
63
|
-
/** Create a new (empty) database. Returns its id. */
|
|
74
|
+
/** Create a new (empty) SQLite database. Returns its id. */
|
|
64
75
|
create(name: string): string;
|
|
76
|
+
/** Dynamically register a named PostgreSQL or SQLite connection string. Returns its id. */
|
|
77
|
+
addConnection(name: string, connectionString: string, readonly?: boolean): string;
|
|
65
78
|
/** Close and delete a database file (including WAL/SHM sidecars). */
|
|
66
79
|
remove(id: string): void;
|
|
67
80
|
closeAll(): void;
|
package/dist/db/manager.js
CHANGED
|
@@ -7,28 +7,28 @@ exports.DbManager = void 0;
|
|
|
7
7
|
const node_fs_1 = require("node:fs");
|
|
8
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
9
|
const database_1 = require("./database");
|
|
10
|
-
const
|
|
11
|
-
const
|
|
10
|
+
const postgres_1 = require("./postgres");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
const common_1 = require("../utils/common");
|
|
12
13
|
const DB_EXTENSIONS = ['.db', '.sqlite', '.sqlite3'];
|
|
13
14
|
/**
|
|
14
|
-
* Manages multiple SQLite database files.
|
|
15
|
+
* Manages multiple SQLite database files and PostgreSQL database connections.
|
|
15
16
|
*
|
|
16
|
-
* Databases come from
|
|
17
|
-
* - a `
|
|
18
|
-
* -
|
|
19
|
-
*
|
|
20
|
-
* New databases created through `create()` land in `dir` (or the working
|
|
21
|
-
* directory when no dir is configured). Each database gets a stable id (the
|
|
22
|
-
* file name, or a deduped `name__2.ext` when names collide across sources).
|
|
17
|
+
* Databases come from three sources:
|
|
18
|
+
* - a `connections` map — named PostgreSQL or SQLite connection strings (e.g. from JSON config),
|
|
19
|
+
* - a `dir` — every SQLite file with a known extension is scanned in,
|
|
20
|
+
* - an explicit `files[]` array — specific file locations or connection strings.
|
|
23
21
|
*/
|
|
24
22
|
class DbManager {
|
|
25
23
|
logger;
|
|
26
24
|
dir;
|
|
27
25
|
createDir;
|
|
28
26
|
readonlyMode;
|
|
29
|
-
files = []; //
|
|
30
|
-
idByPath = new Map(); //
|
|
31
|
-
pathById = new Map(); // id ->
|
|
27
|
+
files = []; // targets (paths or URIs), registry order
|
|
28
|
+
idByPath = new Map(); // target -> id
|
|
29
|
+
pathById = new Map(); // id -> target
|
|
30
|
+
nameById = new Map(); // id -> display name
|
|
31
|
+
readonlyById = new Map(); // id -> readonly override
|
|
32
32
|
openDbs = new Map(); // id -> db
|
|
33
33
|
constructor(options, logger) {
|
|
34
34
|
const opts = typeof options === 'string' ? { dir: options } : (options ?? {});
|
|
@@ -38,6 +38,9 @@ class DbManager {
|
|
|
38
38
|
this.readonlyMode = !!opts.readonly;
|
|
39
39
|
if (this.dir)
|
|
40
40
|
(0, node_fs_1.mkdirSync)(this.dir, { recursive: true });
|
|
41
|
+
if (opts.connections) {
|
|
42
|
+
this.registerConnections(opts.connections);
|
|
43
|
+
}
|
|
41
44
|
this.registerDirFiles();
|
|
42
45
|
this.registerExplicitFiles(opts.files ?? []);
|
|
43
46
|
}
|
|
@@ -52,6 +55,16 @@ class DbManager {
|
|
|
52
55
|
const lower = String(name ?? '').toLowerCase();
|
|
53
56
|
return DB_EXTENSIONS.some((ext) => lower.endsWith(ext));
|
|
54
57
|
}
|
|
58
|
+
registerConnections(conns) {
|
|
59
|
+
for (const [name, target] of Object.entries(conns ?? {})) {
|
|
60
|
+
if (!name || !target)
|
|
61
|
+
continue;
|
|
62
|
+
const cleanTarget = String(target).trim();
|
|
63
|
+
if (!cleanTarget)
|
|
64
|
+
continue;
|
|
65
|
+
this.addNamedTarget(name.trim(), cleanTarget);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
55
68
|
registerDirFiles() {
|
|
56
69
|
if (!this.dir)
|
|
57
70
|
return;
|
|
@@ -62,14 +75,30 @@ class DbManager {
|
|
|
62
75
|
.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }));
|
|
63
76
|
}
|
|
64
77
|
catch (err) {
|
|
65
|
-
this.logger.warn(`Failed to list database directory ${this.dir}: ${(0,
|
|
78
|
+
this.logger.warn(`Failed to list database directory ${this.dir}: ${(0, common_1.errorMessage)(err)}`);
|
|
66
79
|
}
|
|
67
80
|
for (const name of names)
|
|
68
81
|
this.addFile(node_path_1.default.join(this.dir, name));
|
|
69
82
|
}
|
|
70
83
|
registerExplicitFiles(files) {
|
|
71
84
|
for (const f of files ?? []) {
|
|
72
|
-
const
|
|
85
|
+
const raw = String(f ?? '').trim();
|
|
86
|
+
if (!raw)
|
|
87
|
+
continue;
|
|
88
|
+
const isPg = raw.startsWith('postgres://') || raw.startsWith('postgresql://');
|
|
89
|
+
if (isPg) {
|
|
90
|
+
let name = 'postgres';
|
|
91
|
+
try {
|
|
92
|
+
const u = new URL(raw);
|
|
93
|
+
name = u.pathname.replace(/^\//, '') || 'postgres';
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
name = 'postgres';
|
|
97
|
+
}
|
|
98
|
+
this.addNamedTarget(name, raw);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const abs = node_path_1.default.resolve(raw);
|
|
73
102
|
if (!(0, node_fs_1.existsSync)(abs)) {
|
|
74
103
|
this.logger.warn(`Skipping missing database file: ${f}`);
|
|
75
104
|
continue;
|
|
@@ -77,6 +106,18 @@ class DbManager {
|
|
|
77
106
|
this.addFile(abs);
|
|
78
107
|
}
|
|
79
108
|
}
|
|
109
|
+
addNamedTarget(name, target) {
|
|
110
|
+
let id = name;
|
|
111
|
+
let n = 2;
|
|
112
|
+
while (this.pathById.has(id)) {
|
|
113
|
+
id = `${name}__${n}`;
|
|
114
|
+
n += 1;
|
|
115
|
+
}
|
|
116
|
+
this.files.push(target);
|
|
117
|
+
this.idByPath.set(target, id);
|
|
118
|
+
this.pathById.set(id, target);
|
|
119
|
+
this.nameById.set(id, name);
|
|
120
|
+
}
|
|
80
121
|
addFile(abs) {
|
|
81
122
|
if (this.idByPath.has(abs))
|
|
82
123
|
return;
|
|
@@ -92,34 +133,115 @@ class DbManager {
|
|
|
92
133
|
this.files.push(abs);
|
|
93
134
|
this.idByPath.set(abs, id);
|
|
94
135
|
this.pathById.set(id, abs);
|
|
136
|
+
this.nameById.set(id, base);
|
|
95
137
|
}
|
|
96
138
|
/** List all managed databases (metadata only — does not open them). */
|
|
97
139
|
list() {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
140
|
+
const entries = [];
|
|
141
|
+
const seen = new Set();
|
|
142
|
+
for (const [id, target] of this.pathById.entries()) {
|
|
143
|
+
if (seen.has(id))
|
|
144
|
+
continue;
|
|
145
|
+
seen.add(id);
|
|
146
|
+
const isPg = target.startsWith('postgres://') || target.startsWith('postgresql://');
|
|
147
|
+
if (isPg) {
|
|
148
|
+
let sanitized = target;
|
|
149
|
+
try {
|
|
150
|
+
const u = new URL(target);
|
|
151
|
+
if (u.password)
|
|
152
|
+
u.password = '****';
|
|
153
|
+
sanitized = u.toString();
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
sanitized = target.replace(/:([^:@]+)@/, ':****@');
|
|
157
|
+
}
|
|
158
|
+
entries.push({
|
|
159
|
+
id,
|
|
160
|
+
name: this.nameById.get(id) ?? id,
|
|
161
|
+
path: sanitized,
|
|
162
|
+
dialect: 'postgres',
|
|
163
|
+
size: 0,
|
|
164
|
+
modified: 'Connected',
|
|
165
|
+
readonly: this.isDbReadOnly(id),
|
|
166
|
+
});
|
|
105
167
|
}
|
|
106
|
-
|
|
107
|
-
|
|
168
|
+
else {
|
|
169
|
+
let size = 0;
|
|
170
|
+
let modified = '';
|
|
171
|
+
try {
|
|
172
|
+
const st = (0, node_fs_1.statSync)(target);
|
|
173
|
+
size = st.size;
|
|
174
|
+
modified = st.mtime.toISOString();
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
/* ignore */
|
|
178
|
+
}
|
|
179
|
+
entries.push({
|
|
180
|
+
id,
|
|
181
|
+
name: this.nameById.get(id) ?? node_path_1.default.basename(target),
|
|
182
|
+
path: target,
|
|
183
|
+
dialect: 'sqlite',
|
|
184
|
+
size,
|
|
185
|
+
modified,
|
|
186
|
+
readonly: this.isDbReadOnly(id),
|
|
187
|
+
});
|
|
108
188
|
}
|
|
109
|
-
|
|
110
|
-
|
|
189
|
+
}
|
|
190
|
+
return entries;
|
|
111
191
|
}
|
|
112
192
|
has(id) {
|
|
113
193
|
return this.pathById.has(id);
|
|
114
194
|
}
|
|
115
|
-
/**
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
195
|
+
/** True if global manager is in readonly mode or this database is explicitly marked read-only. */
|
|
196
|
+
isDbReadOnly(id) {
|
|
197
|
+
return this.readonlyMode || (this.readonlyById.get(id) ?? false);
|
|
198
|
+
}
|
|
199
|
+
/** Set or toggle read-only mode for a specific database id. */
|
|
200
|
+
setReadonly(id, readonly) {
|
|
201
|
+
if (this.readonlyMode && !readonly) {
|
|
202
|
+
throw new Error('Manager is in global read-only mode — databases cannot be made writable.');
|
|
203
|
+
}
|
|
204
|
+
const current = this.readonlyById.get(id);
|
|
205
|
+
if (current === readonly)
|
|
206
|
+
return;
|
|
207
|
+
this.readonlyById.set(id, readonly);
|
|
208
|
+
// Close existing connection instance so it is re-opened with new readonly mode on next use
|
|
209
|
+
const db = this.openDbs.get(id);
|
|
210
|
+
if (db) {
|
|
211
|
+
try {
|
|
212
|
+
db.close();
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
/* ignore */
|
|
216
|
+
}
|
|
217
|
+
this.openDbs.delete(id);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/** Open (and cache) a database by id; creates the file if it is new SQLite database. */
|
|
221
|
+
open(id, readonlyOverride) {
|
|
222
|
+
const target = this.pathById.get(id);
|
|
223
|
+
if (!target)
|
|
119
224
|
throw new Error(`Database "${id}" is not registered.`);
|
|
225
|
+
const isRo = this.readonlyMode || (readonlyOverride !== undefined ? readonlyOverride : (this.readonlyById.get(id) ?? false));
|
|
120
226
|
let db = this.openDbs.get(id);
|
|
227
|
+
if (db && db.isReadOnly !== isRo) {
|
|
228
|
+
try {
|
|
229
|
+
db.close();
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
/* ignore */
|
|
233
|
+
}
|
|
234
|
+
this.openDbs.delete(id);
|
|
235
|
+
db = undefined;
|
|
236
|
+
}
|
|
121
237
|
if (!db) {
|
|
122
|
-
|
|
238
|
+
const isPg = target.startsWith('postgres://') || target.startsWith('postgresql://');
|
|
239
|
+
if (isPg) {
|
|
240
|
+
db = new postgres_1.PostgresDatabase(target, this.logger.child(`db:${id}`), { readonly: isRo });
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
db = new database_1.SqliteDatabase(target, this.logger.child(`db:${id}`), { readonly: isRo });
|
|
244
|
+
}
|
|
123
245
|
this.openDbs.set(id, db);
|
|
124
246
|
}
|
|
125
247
|
return db;
|
|
@@ -129,7 +251,7 @@ class DbManager {
|
|
|
129
251
|
* Used by the "Open an existing database" file browser. Validates that the
|
|
130
252
|
* file is a readable SQLite database before keeping it registered.
|
|
131
253
|
*/
|
|
132
|
-
openFile(absPath) {
|
|
254
|
+
openFile(absPath, readonly) {
|
|
133
255
|
const abs = node_path_1.default.resolve(String(absPath ?? '').trim());
|
|
134
256
|
if (!abs)
|
|
135
257
|
throw new Error('Database path is required.');
|
|
@@ -137,12 +259,17 @@ class DbManager {
|
|
|
137
259
|
throw new Error(`Not a file: ${abs}`);
|
|
138
260
|
}
|
|
139
261
|
const existing = this.idByPath.get(abs);
|
|
140
|
-
if (existing)
|
|
262
|
+
if (existing) {
|
|
263
|
+
if (readonly !== undefined)
|
|
264
|
+
this.setReadonly(existing, readonly);
|
|
141
265
|
return existing;
|
|
266
|
+
}
|
|
142
267
|
this.addFile(abs);
|
|
143
268
|
const id = this.idByPath.get(abs);
|
|
144
269
|
if (!id)
|
|
145
270
|
throw new Error('Failed to register database file.');
|
|
271
|
+
if (readonly !== undefined)
|
|
272
|
+
this.readonlyById.set(id, readonly);
|
|
146
273
|
try {
|
|
147
274
|
this.open(id); // throws if the file is not a readable SQLite database
|
|
148
275
|
}
|
|
@@ -150,6 +277,8 @@ class DbManager {
|
|
|
150
277
|
// Roll the registration back so a bad file doesn't linger in the list.
|
|
151
278
|
this.pathById.delete(id);
|
|
152
279
|
this.idByPath.delete(abs);
|
|
280
|
+
this.nameById.delete(id);
|
|
281
|
+
this.readonlyById.delete(id);
|
|
153
282
|
this.files = this.files.filter((p) => p !== abs);
|
|
154
283
|
throw err;
|
|
155
284
|
}
|
|
@@ -169,7 +298,7 @@ class DbManager {
|
|
|
169
298
|
return 0;
|
|
170
299
|
}
|
|
171
300
|
}
|
|
172
|
-
/** Create a new (empty) database. Returns its id. */
|
|
301
|
+
/** Create a new (empty) SQLite database. Returns its id. */
|
|
173
302
|
create(name) {
|
|
174
303
|
if (this.readonlyMode)
|
|
175
304
|
throw new Error('Read-only mode — creating databases is disabled.');
|
|
@@ -184,12 +313,37 @@ class DbManager {
|
|
|
184
313
|
this.open(id); // better-sqlite3 creates the file on first open
|
|
185
314
|
return id;
|
|
186
315
|
}
|
|
316
|
+
/** Dynamically register a named PostgreSQL or SQLite connection string. Returns its id. */
|
|
317
|
+
addConnection(name, connectionString, readonly) {
|
|
318
|
+
if (this.readonlyMode)
|
|
319
|
+
throw new Error('Read-only mode — adding connections is disabled.');
|
|
320
|
+
const raw = String(connectionString ?? '').trim();
|
|
321
|
+
if (!raw)
|
|
322
|
+
throw new Error('Connection string is required.');
|
|
323
|
+
let cleanName = String(name ?? '').trim();
|
|
324
|
+
if (!cleanName) {
|
|
325
|
+
try {
|
|
326
|
+
const u = new URL(raw);
|
|
327
|
+
cleanName = u.pathname.replace(/^\//, '') || 'postgres';
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
cleanName = 'postgres';
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
this.addNamedTarget(cleanName, raw);
|
|
334
|
+
const id = this.idByPath.get(raw);
|
|
335
|
+
if (!id)
|
|
336
|
+
throw new Error('Failed to register connection.');
|
|
337
|
+
if (readonly !== undefined)
|
|
338
|
+
this.readonlyById.set(id, readonly);
|
|
339
|
+
return id;
|
|
340
|
+
}
|
|
187
341
|
/** Close and delete a database file (including WAL/SHM sidecars). */
|
|
188
342
|
remove(id) {
|
|
189
343
|
if (this.readonlyMode)
|
|
190
344
|
throw new Error('Read-only mode — deleting databases is disabled.');
|
|
191
|
-
const
|
|
192
|
-
if (!
|
|
345
|
+
const target = this.pathById.get(id);
|
|
346
|
+
if (!target)
|
|
193
347
|
return;
|
|
194
348
|
const db = this.openDbs.get(id);
|
|
195
349
|
if (db) {
|
|
@@ -202,14 +356,19 @@ class DbManager {
|
|
|
202
356
|
this.openDbs.delete(id);
|
|
203
357
|
}
|
|
204
358
|
this.pathById.delete(id);
|
|
205
|
-
this.idByPath.delete(
|
|
206
|
-
this.
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
359
|
+
this.idByPath.delete(target);
|
|
360
|
+
this.nameById.delete(id);
|
|
361
|
+
this.readonlyById.delete(id);
|
|
362
|
+
this.files = this.files.filter((p) => p !== target);
|
|
363
|
+
const isPg = target.startsWith('postgres://') || target.startsWith('postgresql://');
|
|
364
|
+
if (!isPg) {
|
|
365
|
+
for (const suffix of ['', '-wal', '-shm']) {
|
|
366
|
+
try {
|
|
367
|
+
(0, node_fs_1.unlinkSync)(target + suffix);
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
/* ignore */
|
|
371
|
+
}
|
|
213
372
|
}
|
|
214
373
|
}
|
|
215
374
|
}
|
package/dist/db/manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/db/manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/db/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import { type ColumnDef } from '../sql/generator';
|
|
3
|
+
export declare function modifyTableStructureSync(db: Database.Database, table: string, transformColumns: (columns: ColumnDef[]) => ColumnDef[], renamedOldCol?: string, renamedNewCol?: string): {
|
|
4
|
+
changes: number;
|
|
5
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.modifyTableStructureSync = modifyTableStructureSync;
|
|
4
|
+
const generator_1 = require("../sql/generator");
|
|
5
|
+
function modifyTableStructureSync(db, table, transformColumns, renamedOldCol, renamedNewCol) {
|
|
6
|
+
const rawCols = db.prepare(`PRAGMA table_info(${(0, generator_1.quoteIdentifier)(table)})`).all();
|
|
7
|
+
if (!rawCols.length)
|
|
8
|
+
throw new Error(`Table "${table}" does not exist.`);
|
|
9
|
+
const fks = db.prepare(`PRAGMA foreign_key_list(${(0, generator_1.quoteIdentifier)(table)})`).all();
|
|
10
|
+
const indexRows = db.prepare(`PRAGMA index_list(${(0, generator_1.quoteIdentifier)(table)})`).all();
|
|
11
|
+
// Discover which single columns are UNIQUE across the whole table (so existing uniqueness is preserved)
|
|
12
|
+
const uniqueCols = new Set();
|
|
13
|
+
for (const ix of indexRows) {
|
|
14
|
+
if (ix.unique) {
|
|
15
|
+
const ixCols = db.prepare(`PRAGMA index_info(${(0, generator_1.quoteIdentifier)(ix.name)})`).all().map((c) => c.name);
|
|
16
|
+
if (ixCols.length === 1) {
|
|
17
|
+
uniqueCols.add(ixCols[0]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const userIndexes = [];
|
|
22
|
+
for (const ix of indexRows) {
|
|
23
|
+
if (ix.origin === 'c') {
|
|
24
|
+
const ixCols = db.prepare(`PRAGMA index_info(${(0, generator_1.quoteIdentifier)(ix.name)})`).all().map((c) => c.name);
|
|
25
|
+
let ixName = ix.name;
|
|
26
|
+
if (renamedOldCol && renamedNewCol) {
|
|
27
|
+
if (ixName === `idx_${table}_${renamedOldCol}`) {
|
|
28
|
+
ixName = `idx_${table}_${renamedNewCol}`;
|
|
29
|
+
}
|
|
30
|
+
else if (ixName === `idx_${table}_${renamedOldCol}_unique`) {
|
|
31
|
+
ixName = `idx_${table}_${renamedNewCol}_unique`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
userIndexes.push({
|
|
35
|
+
name: ixName,
|
|
36
|
+
unique: !!ix.unique,
|
|
37
|
+
columns: ixCols.map((c) => (renamedOldCol && renamedNewCol && c === renamedOldCol ? renamedNewCol : c)),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const currentCols = rawCols.map((c) => {
|
|
42
|
+
const existingFk = fks.find((f) => f.from === c.name);
|
|
43
|
+
return {
|
|
44
|
+
name: c.name,
|
|
45
|
+
type: c.type,
|
|
46
|
+
primaryKey: c.pk > 0,
|
|
47
|
+
notNull: !!c.notnull,
|
|
48
|
+
unique: uniqueCols.has(c.name),
|
|
49
|
+
defaultValue: c.dflt_value,
|
|
50
|
+
foreignKey: existingFk ? { table: existingFk.table, column: existingFk.to ?? '' } : null,
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
const newCols = transformColumns(currentCols);
|
|
54
|
+
const tempTable = `_admindb_tmp_${table}_${Date.now()}`;
|
|
55
|
+
const createSql = (0, generator_1.generateCreateTable)(tempTable, newCols);
|
|
56
|
+
const oldColMap = new Set(rawCols.map((c) => c.name));
|
|
57
|
+
const matchingOldCols = [];
|
|
58
|
+
const matchingNewCols = [];
|
|
59
|
+
for (const nc of newCols) {
|
|
60
|
+
let sourceColName = nc.name;
|
|
61
|
+
if (renamedOldCol && renamedNewCol && nc.name === renamedNewCol) {
|
|
62
|
+
sourceColName = renamedOldCol;
|
|
63
|
+
}
|
|
64
|
+
if (oldColMap.has(sourceColName)) {
|
|
65
|
+
matchingOldCols.push((0, generator_1.quoteIdentifier)(sourceColName));
|
|
66
|
+
matchingNewCols.push((0, generator_1.quoteIdentifier)(nc.name));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
db.exec('PRAGMA foreign_keys = OFF;');
|
|
70
|
+
db.exec('BEGIN TRANSACTION;');
|
|
71
|
+
try {
|
|
72
|
+
db.exec(createSql);
|
|
73
|
+
if (matchingOldCols.length > 0) {
|
|
74
|
+
db.exec(`INSERT INTO ${(0, generator_1.quoteIdentifier)(tempTable)} (${matchingNewCols.join(', ')}) SELECT ${matchingOldCols.join(', ')} FROM ${(0, generator_1.quoteIdentifier)(table)};`);
|
|
75
|
+
}
|
|
76
|
+
db.exec(`DROP TABLE ${(0, generator_1.quoteIdentifier)(table)};`);
|
|
77
|
+
db.exec(`ALTER TABLE ${(0, generator_1.quoteIdentifier)(tempTable)} RENAME TO ${(0, generator_1.quoteIdentifier)(table)};`);
|
|
78
|
+
for (const ix of userIndexes) {
|
|
79
|
+
const uq = ix.unique ? 'UNIQUE ' : '';
|
|
80
|
+
const ixColsStr = ix.columns.map(generator_1.quoteIdentifier).join(', ');
|
|
81
|
+
try {
|
|
82
|
+
db.exec(`CREATE ${uq}INDEX IF NOT EXISTS ${(0, generator_1.quoteIdentifier)(ix.name)} ON ${(0, generator_1.quoteIdentifier)(table)} (${ixColsStr});`);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
/* ignore index recreation error */
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const fkCheck = db.prepare('PRAGMA foreign_key_check;').all();
|
|
89
|
+
if (fkCheck.length > 0) {
|
|
90
|
+
throw new Error('Foreign key constraint check failed after schema modification.');
|
|
91
|
+
}
|
|
92
|
+
db.exec('COMMIT;');
|
|
93
|
+
return { changes: 1 };
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
try {
|
|
97
|
+
db.exec('ROLLBACK;');
|
|
98
|
+
}
|
|
99
|
+
catch { /* ignore */ }
|
|
100
|
+
try {
|
|
101
|
+
db.exec(`DROP TABLE IF EXISTS ${(0, generator_1.quoteIdentifier)(tempTable)};`);
|
|
102
|
+
}
|
|
103
|
+
catch { /* ignore */ }
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
db.exec('PRAGMA foreign_keys = ON;');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"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"}
|