admindb 1.2.1 → 2.1.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 (208) hide show
  1. package/README.md +262 -329
  2. package/dist/app.d.ts +25 -4
  3. package/dist/app.js +79 -15
  4. package/dist/app.js.map +1 -1
  5. package/dist/auth/config.d.ts +19 -0
  6. package/dist/auth/config.js +147 -0
  7. package/dist/auth/config.js.map +1 -0
  8. package/dist/auth/crypto.d.ts +27 -0
  9. package/dist/auth/crypto.js +133 -0
  10. package/dist/auth/crypto.js.map +1 -0
  11. package/dist/auth/index.d.ts +5 -0
  12. package/dist/auth/index.js +22 -0
  13. package/dist/auth/index.js.map +1 -0
  14. package/dist/auth/middleware.d.ts +14 -0
  15. package/dist/auth/middleware.js +100 -0
  16. package/dist/auth/middleware.js.map +1 -0
  17. package/dist/auth/routes.d.ts +7 -0
  18. package/dist/auth/routes.js +78 -0
  19. package/dist/auth/routes.js.map +1 -0
  20. package/dist/auth/types.d.ts +35 -0
  21. package/dist/auth/types.js +11 -0
  22. package/dist/auth/types.js.map +1 -0
  23. package/dist/cli/args.d.ts +45 -0
  24. package/dist/cli/args.js +328 -0
  25. package/dist/cli/args.js.map +1 -0
  26. package/dist/cli/config.d.ts +56 -0
  27. package/dist/cli/config.js +133 -0
  28. package/dist/cli/config.js.map +1 -0
  29. package/dist/cli/index.d.ts +4 -0
  30. package/dist/cli/index.js +21 -0
  31. package/dist/cli/index.js.map +1 -0
  32. package/dist/cli/runner.d.ts +1 -0
  33. package/dist/cli/runner.js +222 -0
  34. package/dist/cli/runner.js.map +1 -0
  35. package/dist/cli.js +2 -127
  36. package/dist/cli.js.map +1 -1
  37. package/dist/data/datasets.d.ts +17 -0
  38. package/dist/data/datasets.js +133 -0
  39. package/dist/data/datasets.js.map +1 -0
  40. package/dist/data/detector.d.ts +30 -0
  41. package/dist/data/detector.js +472 -0
  42. package/dist/data/detector.js.map +1 -0
  43. package/dist/data/engine.d.ts +10 -0
  44. package/dist/data/engine.js +211 -0
  45. package/dist/data/engine.js.map +1 -0
  46. package/dist/data/index.d.ts +5 -0
  47. package/dist/data/index.js +22 -0
  48. package/dist/data/index.js.map +1 -0
  49. package/dist/data/strategies.d.ts +30 -0
  50. package/dist/data/strategies.js +343 -0
  51. package/dist/data/strategies.js.map +1 -0
  52. package/dist/data/types.d.ts +73 -0
  53. package/dist/data/types.js +8 -0
  54. package/dist/data/types.js.map +1 -0
  55. package/dist/db/database.d.ts +14 -146
  56. package/dist/db/database.js +208 -461
  57. package/dist/db/database.js.map +1 -1
  58. package/dist/db/export.d.ts +2 -2
  59. package/dist/db/export.js +7 -2
  60. package/dist/db/export.js.map +1 -1
  61. package/dist/db/filters.d.ts +22 -0
  62. package/dist/db/filters.js +158 -0
  63. package/dist/db/filters.js.map +1 -0
  64. package/dist/db/index.d.ts +8 -0
  65. package/dist/db/index.js +25 -0
  66. package/dist/db/index.js.map +1 -0
  67. package/dist/db/introspection.d.ts +6 -0
  68. package/dist/db/introspection.js +172 -0
  69. package/dist/db/introspection.js.map +1 -0
  70. package/dist/db/manager.d.ts +32 -19
  71. package/dist/db/manager.js +203 -44
  72. package/dist/db/manager.js.map +1 -1
  73. package/dist/db/migrations.d.ts +5 -0
  74. package/dist/db/migrations.js +110 -0
  75. package/dist/db/migrations.js.map +1 -0
  76. package/dist/db/postgres.d.ts +85 -0
  77. package/dist/db/postgres.js +745 -0
  78. package/dist/db/postgres.js.map +1 -0
  79. package/dist/db/types.d.ts +206 -0
  80. package/dist/db/types.js +7 -0
  81. package/dist/db/types.js.map +1 -0
  82. package/dist/index.d.ts +9 -2
  83. package/dist/index.js +46 -4
  84. package/dist/index.js.map +1 -1
  85. package/dist/public/css/app.css +1 -1
  86. package/dist/public/css/input.css +74 -11
  87. package/dist/public/js/app.js +142 -0
  88. package/dist/public/js/browse.js +591 -104
  89. package/dist/public/js/databases.js +105 -13
  90. package/dist/public/js/designer.js +55 -2
  91. package/dist/public/js/forms.js +610 -28
  92. package/dist/public/js/icons.js +51 -0
  93. package/dist/public/js/inspector.js +638 -0
  94. package/dist/public/js/query.js +93 -3
  95. package/dist/public/js/schema.js +185 -52
  96. package/dist/public/js/seed.js +865 -152
  97. package/dist/routes/api/helpers.d.ts +42 -0
  98. package/dist/routes/api/helpers.js +133 -0
  99. package/dist/routes/api/helpers.js.map +1 -0
  100. package/dist/routes/api/import-export.d.ts +3 -0
  101. package/dist/routes/api/import-export.js +85 -0
  102. package/dist/routes/api/import-export.js.map +1 -0
  103. package/dist/routes/api/index.d.ts +4 -0
  104. package/dist/routes/api/index.js +37 -0
  105. package/dist/routes/api/index.js.map +1 -0
  106. package/dist/routes/api/query.d.ts +3 -0
  107. package/dist/routes/api/query.js +76 -0
  108. package/dist/routes/api/query.js.map +1 -0
  109. package/dist/routes/api/rows.d.ts +3 -0
  110. package/dist/routes/api/rows.js +373 -0
  111. package/dist/routes/api/rows.js.map +1 -0
  112. package/dist/routes/api/seed.d.ts +3 -0
  113. package/dist/routes/api/seed.js +82 -0
  114. package/dist/routes/api/seed.js.map +1 -0
  115. package/dist/routes/api/tables.d.ts +3 -0
  116. package/dist/routes/api/tables.js +160 -0
  117. package/dist/routes/api/tables.js.map +1 -0
  118. package/dist/routes/databases.d.ts +8 -11
  119. package/dist/routes/databases.js +100 -66
  120. package/dist/routes/databases.js.map +1 -1
  121. package/dist/routes/index.d.ts +3 -0
  122. package/dist/routes/index.js +20 -0
  123. package/dist/routes/index.js.map +1 -0
  124. package/dist/routes/pages.d.ts +3 -3
  125. package/dist/routes/pages.js +157 -64
  126. package/dist/routes/pages.js.map +1 -1
  127. package/dist/serverless.d.ts +40 -0
  128. package/dist/serverless.js +210 -0
  129. package/dist/serverless.js.map +1 -0
  130. package/dist/sql/generator.d.ts +7 -3
  131. package/dist/sql/generator.js +144 -7
  132. package/dist/sql/generator.js.map +1 -1
  133. package/dist/sql/index.d.ts +2 -0
  134. package/dist/sql/index.js +19 -0
  135. package/dist/sql/index.js.map +1 -0
  136. package/dist/types/api.d.ts +412 -0
  137. package/dist/types/api.js +9 -0
  138. package/dist/types/api.js.map +1 -0
  139. package/dist/utils/colors.d.ts +40 -0
  140. package/dist/utils/colors.js +64 -0
  141. package/dist/utils/colors.js.map +1 -0
  142. package/dist/{util.d.ts → utils/common.d.ts} +10 -6
  143. package/dist/{util.js → utils/common.js} +80 -13
  144. package/dist/utils/common.js.map +1 -0
  145. package/dist/utils/csv.js.map +1 -0
  146. package/dist/utils/datatype.d.ts +49 -0
  147. package/dist/utils/datatype.js +222 -0
  148. package/dist/utils/datatype.js.map +1 -0
  149. package/dist/utils/icons.d.ts +11 -0
  150. package/dist/utils/icons.js +72 -0
  151. package/dist/utils/icons.js.map +1 -0
  152. package/dist/utils/index.d.ts +4 -0
  153. package/dist/utils/index.js +21 -0
  154. package/dist/utils/index.js.map +1 -0
  155. package/dist/{logger.d.ts → utils/logger.d.ts} +1 -1
  156. package/dist/utils/logger.js +40 -0
  157. package/dist/utils/logger.js.map +1 -0
  158. package/dist/views/layouts/main.hbs +40 -11
  159. package/dist/views/pages/databases.hbs +182 -74
  160. package/dist/views/pages/designer.hbs +29 -11
  161. package/dist/views/pages/error.hbs +3 -3
  162. package/dist/views/pages/form.hbs +5 -3
  163. package/dist/views/pages/home.hbs +22 -13
  164. package/dist/views/pages/login.hbs +111 -0
  165. package/dist/views/pages/query.hbs +8 -6
  166. package/dist/views/pages/schema.hbs +41 -13
  167. package/dist/views/pages/seed.hbs +200 -54
  168. package/dist/views/pages/table.hbs +152 -72
  169. package/dist/views/partials/icon.hbs +2 -0
  170. package/dist/views/partials/navbar.hbs +69 -25
  171. package/dist/views/partials/sidebar.hbs +108 -94
  172. package/docs/API.md +144 -0
  173. package/docs/EXAMPLES.md +576 -0
  174. package/docs/SECURITY.md +265 -0
  175. package/package.json +15 -4
  176. package/dist/args.d.ts +0 -28
  177. package/dist/args.js +0 -187
  178. package/dist/args.js.map +0 -1
  179. package/dist/config.d.ts +0 -17
  180. package/dist/config.js +0 -23
  181. package/dist/config.js.map +0 -1
  182. package/dist/csv.js.map +0 -1
  183. package/dist/data/generator.d.ts +0 -86
  184. package/dist/data/generator.js +0 -1031
  185. package/dist/data/generator.js.map +0 -1
  186. package/dist/logger.js +0 -25
  187. package/dist/logger.js.map +0 -1
  188. package/dist/routes/api.d.ts +0 -9
  189. package/dist/routes/api.js +0 -848
  190. package/dist/routes/api.js.map +0 -1
  191. package/dist/test/classifier.test.d.ts +0 -1
  192. package/dist/test/classifier.test.js +0 -44
  193. package/dist/test/classifier.test.js.map +0 -1
  194. package/dist/test/csv.test.d.ts +0 -1
  195. package/dist/test/csv.test.js +0 -64
  196. package/dist/test/csv.test.js.map +0 -1
  197. package/dist/test/database.test.d.ts +0 -1
  198. package/dist/test/database.test.js +0 -402
  199. package/dist/test/database.test.js.map +0 -1
  200. package/dist/test/generator.test.d.ts +0 -1
  201. package/dist/test/generator.test.js +0 -132
  202. package/dist/test/generator.test.js.map +0 -1
  203. package/dist/test/manager.test.d.ts +0 -1
  204. package/dist/test/manager.test.js +0 -146
  205. package/dist/test/manager.test.js.map +0 -1
  206. package/dist/util.js.map +0 -1
  207. /package/dist/{csv.d.ts → utils/csv.d.ts} +0 -0
  208. /package/dist/{csv.js → utils/csv.js} +0 -0
@@ -1,33 +1,36 @@
1
- import { SqliteDatabase } from './database';
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 (absolute or relative). Any extension accepted. */
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
- /** File name for display. */
16
+ /** Name for display. */
15
17
  name: string;
16
- /** Absolute path on disk. */
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 up to two sources:
25
- * - a `dir` — every file with a known extension is scanned in,
26
- * - an explicit `files[]` array — specific file locations anywhere on disk.
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
- /** Open (and cache) a database by id; creates the file if it is new. */
53
- open(id: string): SqliteDatabase;
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): SqliteDatabase | undefined;
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;
@@ -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 logger_1 = require("../logger");
11
- const util_1 = require("../util");
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 up to two sources:
17
- * - a `dir` — every file with a known extension is scanned in,
18
- * - an explicit `files[]` array — specific file locations anywhere on disk.
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 = []; // absolute paths, registry order
30
- idByPath = new Map(); // absPath -> id
31
- pathById = new Map(); // id -> absPath
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, util_1.errorMessage)(err)}`);
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 abs = node_path_1.default.resolve(String(f ?? ''));
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
- return this.files.map((p) => {
99
- let size = 0;
100
- let modified = '';
101
- try {
102
- const st = (0, node_fs_1.statSync)(p);
103
- size = st.size;
104
- modified = st.mtime.toISOString();
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
- catch {
107
- /* ignore */
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
- return { id: this.idByPath.get(p) ?? node_path_1.default.basename(p), name: node_path_1.default.basename(p), path: p, size, modified };
110
- });
189
+ }
190
+ return entries;
111
191
  }
112
192
  has(id) {
113
193
  return this.pathById.has(id);
114
194
  }
115
- /** Open (and cache) a database by id; creates the file if it is new. */
116
- open(id) {
117
- const abs = this.pathById.get(id);
118
- if (!abs)
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
- db = new database_1.SqliteDatabase(abs, this.logger.child(`db:${id}`), { readonly: this.readonlyMode });
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 abs = this.pathById.get(id);
192
- if (!abs)
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(abs);
206
- this.files = this.files.filter((p) => p !== abs);
207
- for (const suffix of ['', '-wal', '-shm']) {
208
- try {
209
- (0, node_fs_1.unlinkSync)(abs + suffix);
210
- }
211
- catch {
212
- /* ignore */
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
  }
@@ -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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"}