admindb 2.1.0 → 2.2.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 (191) hide show
  1. package/README.md +41 -12
  2. package/dist/app.d.ts +1 -69
  3. package/dist/app.js +3 -30
  4. package/dist/auth/config.d.ts +1 -19
  5. package/dist/auth/config.js +0 -26
  6. package/dist/auth/crypto.d.ts +1 -27
  7. package/dist/auth/crypto.js +1 -26
  8. package/dist/auth/index.d.ts +1 -5
  9. package/dist/auth/index.js +0 -1
  10. package/dist/auth/middleware.d.ts +1 -14
  11. package/dist/auth/middleware.js +0 -15
  12. package/dist/auth/routes.d.ts +1 -7
  13. package/dist/auth/routes.js +0 -8
  14. package/dist/auth/types.d.ts +1 -35
  15. package/dist/auth/types.js +1 -5
  16. package/dist/cli/args.d.ts +1 -45
  17. package/dist/cli/args.js +3 -11
  18. package/dist/cli/config.d.ts +1 -56
  19. package/dist/cli/config.js +0 -5
  20. package/dist/cli/index.d.ts +1 -4
  21. package/dist/cli/index.js +0 -1
  22. package/dist/cli/runner.d.ts +1 -1
  23. package/dist/cli/runner.js +6 -17
  24. package/dist/cli.d.ts +1 -2
  25. package/dist/cli.js +0 -1
  26. package/dist/data/chain.d.ts +1 -0
  27. package/dist/data/chain.js +707 -0
  28. package/dist/data/datasets.d.ts +1 -17
  29. package/dist/data/datasets.js +0 -4
  30. package/dist/data/detector.d.ts +1 -30
  31. package/dist/data/detector.js +53 -14
  32. package/dist/data/engine.d.ts +1 -10
  33. package/dist/data/engine.js +82 -48
  34. package/dist/data/index.d.ts +1 -5
  35. package/dist/data/index.js +1 -1
  36. package/dist/data/strategies.d.ts +1 -30
  37. package/dist/data/strategies.js +4 -8
  38. package/dist/data/types.d.ts +1 -73
  39. package/dist/data/types.js +0 -3
  40. package/dist/db/database.d.ts +1 -119
  41. package/dist/db/database.js +20 -14
  42. package/dist/db/export.d.ts +1 -12
  43. package/dist/db/export.js +54 -6
  44. package/dist/db/filters.d.ts +1 -22
  45. package/dist/db/filters.js +0 -16
  46. package/dist/db/index.d.ts +1 -8
  47. package/dist/db/index.js +0 -1
  48. package/dist/db/introspection.d.ts +1 -6
  49. package/dist/db/introspection.js +0 -5
  50. package/dist/db/manager.d.ts +1 -81
  51. package/dist/db/manager.js +13 -59
  52. package/dist/db/migrations.d.ts +1 -5
  53. package/dist/db/migrations.js +2 -5
  54. package/dist/db/postgres.d.ts +1 -85
  55. package/dist/db/postgres.js +21 -31
  56. package/dist/db/types.d.ts +1 -206
  57. package/dist/db/types.js +0 -1
  58. package/dist/index.d.ts +1 -23
  59. package/dist/index.js +0 -14
  60. package/dist/public/css/app.css +1 -1
  61. package/dist/public/js/api.js +1 -47
  62. package/dist/public/js/app.js +1 -262
  63. package/dist/public/js/browse.js +1 -1371
  64. package/dist/public/js/common.js +1 -0
  65. package/dist/public/js/databases.js +1 -235
  66. package/dist/public/js/designer.js +1 -258
  67. package/dist/public/js/forms.js +1 -826
  68. package/dist/public/js/home.js +1 -0
  69. package/dist/public/js/inspector.js +1 -638
  70. package/dist/public/js/query.js +1 -322
  71. package/dist/public/js/schema.js +1 -447
  72. package/dist/public/js/seed.js +1 -1090
  73. package/dist/routes/api/erd.d.ts +1 -0
  74. package/dist/routes/api/erd.js +50 -0
  75. package/dist/routes/api/helpers.d.ts +1 -42
  76. package/dist/routes/api/helpers.js +33 -3
  77. package/dist/routes/api/import-export.d.ts +1 -3
  78. package/dist/routes/api/import-export.js +0 -2
  79. package/dist/routes/api/index.d.ts +1 -4
  80. package/dist/routes/api/index.js +15 -4
  81. package/dist/routes/api/query.d.ts +1 -3
  82. package/dist/routes/api/query.js +13 -11
  83. package/dist/routes/api/rows.d.ts +1 -3
  84. package/dist/routes/api/rows.js +0 -11
  85. package/dist/routes/api/seed.d.ts +1 -3
  86. package/dist/routes/api/seed.js +79 -8
  87. package/dist/routes/api/tables.d.ts +1 -3
  88. package/dist/routes/api/tables.js +77 -6
  89. package/dist/routes/databases.d.ts +1 -26
  90. package/dist/routes/databases.js +1 -3
  91. package/dist/routes/index.d.ts +1 -3
  92. package/dist/routes/index.js +0 -1
  93. package/dist/routes/pages.d.ts +1 -9
  94. package/dist/routes/pages.js +18 -11
  95. package/dist/serverless.d.ts +1 -40
  96. package/dist/serverless.js +3 -39
  97. package/dist/sql/classifier.d.ts +1 -19
  98. package/dist/sql/classifier.js +0 -13
  99. package/dist/sql/error-analyzer.d.ts +1 -0
  100. package/dist/sql/error-analyzer.js +550 -0
  101. package/dist/sql/generator.d.ts +1 -81
  102. package/dist/sql/generator.js +0 -29
  103. package/dist/sql/index.d.ts +1 -2
  104. package/dist/sql/index.js +0 -1
  105. package/dist/types/api.d.ts +1 -412
  106. package/dist/types/api.js +0 -7
  107. package/dist/utils/colors.d.ts +1 -40
  108. package/dist/utils/colors.js +0 -10
  109. package/dist/utils/common.d.ts +1 -50
  110. package/dist/utils/common.js +19 -23
  111. package/dist/utils/csv.d.ts +1 -15
  112. package/dist/utils/csv.js +0 -13
  113. package/dist/utils/datatype.d.ts +1 -49
  114. package/dist/utils/datatype.js +0 -41
  115. package/dist/utils/icons.d.ts +1 -11
  116. package/dist/utils/icons.js +25 -16
  117. package/dist/utils/index.d.ts +1 -4
  118. package/dist/utils/index.js +0 -1
  119. package/dist/utils/logger.d.ts +1 -10
  120. package/dist/utils/logger.js +0 -4
  121. package/dist/views/layouts/main.hbs +14 -5
  122. package/dist/views/pages/databases.hbs +0 -18
  123. package/dist/views/pages/designer.hbs +0 -10
  124. package/dist/views/pages/erd.hbs +1241 -0
  125. package/dist/views/pages/error.hbs +0 -2
  126. package/dist/views/pages/form.hbs +0 -5
  127. package/dist/views/pages/home.hbs +98 -10
  128. package/dist/views/pages/info.hbs +107 -0
  129. package/dist/views/pages/login.hbs +0 -13
  130. package/dist/views/pages/query.hbs +54 -21
  131. package/dist/views/pages/schema.hbs +0 -20
  132. package/dist/views/pages/seed.hbs +435 -202
  133. package/dist/views/pages/table.hbs +0 -14
  134. package/dist/views/partials/icon.hbs +0 -1
  135. package/dist/views/partials/navbar.hbs +0 -6
  136. package/dist/views/partials/sidebar.hbs +12 -8
  137. package/docs/API.md +6 -1
  138. package/docs/EXAMPLES.md +3 -0
  139. package/package.json +7 -5
  140. package/dist/app.js.map +0 -1
  141. package/dist/auth/config.js.map +0 -1
  142. package/dist/auth/crypto.js.map +0 -1
  143. package/dist/auth/index.js.map +0 -1
  144. package/dist/auth/middleware.js.map +0 -1
  145. package/dist/auth/routes.js.map +0 -1
  146. package/dist/auth/types.js.map +0 -1
  147. package/dist/cli/args.js.map +0 -1
  148. package/dist/cli/config.js.map +0 -1
  149. package/dist/cli/index.js.map +0 -1
  150. package/dist/cli/runner.js.map +0 -1
  151. package/dist/cli.js.map +0 -1
  152. package/dist/data/datasets.js.map +0 -1
  153. package/dist/data/detector.js.map +0 -1
  154. package/dist/data/engine.js.map +0 -1
  155. package/dist/data/index.js.map +0 -1
  156. package/dist/data/strategies.js.map +0 -1
  157. package/dist/data/types.js.map +0 -1
  158. package/dist/db/database.js.map +0 -1
  159. package/dist/db/export.js.map +0 -1
  160. package/dist/db/filters.js.map +0 -1
  161. package/dist/db/index.js.map +0 -1
  162. package/dist/db/introspection.js.map +0 -1
  163. package/dist/db/manager.js.map +0 -1
  164. package/dist/db/migrations.js.map +0 -1
  165. package/dist/db/postgres.js.map +0 -1
  166. package/dist/db/types.js.map +0 -1
  167. package/dist/index.js.map +0 -1
  168. package/dist/public/css/input.css +0 -302
  169. package/dist/public/js/icons.js +0 -51
  170. package/dist/routes/api/helpers.js.map +0 -1
  171. package/dist/routes/api/import-export.js.map +0 -1
  172. package/dist/routes/api/index.js.map +0 -1
  173. package/dist/routes/api/query.js.map +0 -1
  174. package/dist/routes/api/rows.js.map +0 -1
  175. package/dist/routes/api/seed.js.map +0 -1
  176. package/dist/routes/api/tables.js.map +0 -1
  177. package/dist/routes/databases.js.map +0 -1
  178. package/dist/routes/index.js.map +0 -1
  179. package/dist/routes/pages.js.map +0 -1
  180. package/dist/serverless.js.map +0 -1
  181. package/dist/sql/classifier.js.map +0 -1
  182. package/dist/sql/generator.js.map +0 -1
  183. package/dist/sql/index.js.map +0 -1
  184. package/dist/types/api.js.map +0 -1
  185. package/dist/utils/colors.js.map +0 -1
  186. package/dist/utils/common.js.map +0 -1
  187. package/dist/utils/csv.js.map +0 -1
  188. package/dist/utils/datatype.js.map +0 -1
  189. package/dist/utils/icons.js.map +0 -1
  190. package/dist/utils/index.js.map +0 -1
  191. package/dist/utils/logger.js.map +0 -1
@@ -4,11 +4,7 @@ exports.registerAuthRoutes = registerAuthRoutes;
4
4
  const types_1 = require("./types");
5
5
  const middleware_1 = require("./middleware");
6
6
  const crypto_1 = require("./crypto");
7
- /**
8
- * Registers /login and /logout routes.
9
- */
10
7
  function registerAuthRoutes(router, config, basePath, logger) {
11
- // GET /login - render login screen
12
8
  router.get('/login', (req, res) => {
13
9
  if (!config.enabled) {
14
10
  return res.redirect(`${basePath}/`);
@@ -27,7 +23,6 @@ function registerAuthRoutes(router, config, basePath, logger) {
27
23
  error: req.query.error ? String(req.query.error) : null,
28
24
  });
29
25
  });
30
- // POST /login - process login submission
31
26
  router.post('/login', (req, res) => {
32
27
  if (!config.enabled) {
33
28
  return res.redirect(`${basePath}/`);
@@ -51,7 +46,6 @@ function registerAuthRoutes(router, config, basePath, logger) {
51
46
  error: 'Invalid username or password. Please check your credentials.',
52
47
  });
53
48
  }
54
- // Successful authentication: issue signed session cookie
55
49
  const token = (0, crypto_1.createSessionToken)(config.username, config.secret, config.sessionDurationMs);
56
50
  const maxAgeSec = Math.floor(config.sessionDurationMs / 1000);
57
51
  const expiresUtc = new Date(Date.now() + config.sessionDurationMs).toUTCString();
@@ -63,7 +57,6 @@ function registerAuthRoutes(router, config, basePath, logger) {
63
57
  const target = nextUrl.startsWith('/') ? nextUrl : `${basePath}/`;
64
58
  res.redirect(target);
65
59
  });
66
- // POST & GET /logout - clear session and redirect to login
67
60
  const handleLogout = (req, res) => {
68
61
  const cookiePath = basePath || '/';
69
62
  res.setHeader('Set-Cookie', `${types_1.SESSION_COOKIE_NAME}=; Path=${cookiePath}; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly; SameSite=Lax`);
@@ -75,4 +68,3 @@ function registerAuthRoutes(router, config, basePath, logger) {
75
68
  router.post('/logout', handleLogout);
76
69
  router.get('/logout', handleLogout);
77
70
  }
78
- //# sourceMappingURL=routes.js.map
@@ -1,35 +1 @@
1
- export interface AuthConfig {
2
- /**
3
- * Whether authentication is enabled.
4
- * Set to `false` to disable protection entirely (e.g. for development or custom upstream auth).
5
- * Defaults to `true`.
6
- */
7
- enabled?: boolean;
8
- /** Admin username. Defaults to `process.env.ADMINDB_USERNAME` or `'admin'`. */
9
- username?: string;
10
- /**
11
- * Admin password or password hash (e.g. `scrypt:<salt>:<hash>`).
12
- * Generate a hash using `npm run generatehash`.
13
- * Defaults to `process.env.ADMINDB_PASSWORD` or the hardcoded default hash for `'admin'`.
14
- */
15
- password?: string;
16
- /** Secret key used to sign session cookies. Defaults to `process.env.ADMINDB_SECRET` or auto-generated. */
17
- secret?: string;
18
- /** Session expiration time in milliseconds. Defaults to 7 days (604800000 ms). */
19
- sessionDurationMs?: number;
20
- }
21
- export interface ResolvedAuthConfig {
22
- enabled: boolean;
23
- username: string;
24
- password: string;
25
- secret: string;
26
- sessionDurationMs: number;
27
- isDefaultPassword: boolean;
28
- }
29
- export declare const DEFAULT_USERNAME = "admin";
30
- /**
31
- * Hardcoded default scrypt hash for password 'admin' (salt: d9f2e64b8a1c3d5e7f0a2b4c6e801357, keyLen: 64).
32
- */
33
- export declare const DEFAULT_PASSWORD_HASH = "scrypt:d9f2e64b8a1c3d5e7f0a2b4c6e801357:cb3032b16f29c8d44f75c779f070c61c846b17eb333d07596ceb8470fc1b4c06cc720c08796ebc86937dab28a3ef580ced38a71c940fd4a169fd2e9cb9fa40e2";
34
- export declare const DEFAULT_SESSION_DURATION_MS: number;
35
- export declare const SESSION_COOKIE_NAME = "admindb_session";
1
+ export interface AuthConfig{enabled?:boolean;username?:string;password?:string;secret?:string;sessionDurationMs?:number;}export interface ResolvedAuthConfig{enabled:boolean;username:string;password:string;secret:string;sessionDurationMs:number;isDefaultPassword:boolean;}export declare const DEFAULT_USERNAME="admin";export declare const DEFAULT_PASSWORD_HASH="scrypt:d9f2e64b8a1c3d5e7f0a2b4c6e801357:cb3032b16f29c8d44f75c779f070c61c846b17eb333d07596ceb8470fc1b4c06cc720c08796ebc86937dab28a3ef580ced38a71c940fd4a169fd2e9cb9fa40e2";export declare const DEFAULT_SESSION_DURATION_MS:number;export declare const SESSION_COOKIE_NAME="admindb_session";
@@ -2,10 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SESSION_COOKIE_NAME = exports.DEFAULT_SESSION_DURATION_MS = exports.DEFAULT_PASSWORD_HASH = exports.DEFAULT_USERNAME = void 0;
4
4
  exports.DEFAULT_USERNAME = 'admin';
5
- /**
6
- * Hardcoded default scrypt hash for password 'admin' (salt: d9f2e64b8a1c3d5e7f0a2b4c6e801357, keyLen: 64).
7
- */
8
5
  exports.DEFAULT_PASSWORD_HASH = 'scrypt:d9f2e64b8a1c3d5e7f0a2b4c6e801357:cb3032b16f29c8d44f75c779f070c61c846b17eb333d07596ceb8470fc1b4c06cc720c08796ebc86937dab28a3ef580ced38a71c940fd4a169fd2e9cb9fa40e2';
9
- exports.DEFAULT_SESSION_DURATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
6
+ exports.DEFAULT_SESSION_DURATION_MS = 7 * 24 * 60 * 60 * 1000;
10
7
  exports.SESSION_COOKIE_NAME = 'admindb_session';
11
- //# sourceMappingURL=types.js.map
@@ -1,45 +1 @@
1
- import type { LogLevel } from '../utils/logger';
2
- export interface CliArgs {
3
- help: boolean;
4
- version: boolean;
5
- /** Bind host/interface (`--host`, `-H`). */
6
- host?: string;
7
- /** Port to listen on (`--port`, `-p`). */
8
- port?: number;
9
- /** A single database file to open directly (`--open`/`--db`/`--file`/`--db-path`). */
10
- dbPath?: string;
11
- /** PostgreSQL or database connection string (`--connection`/`--conn`/`--pg`). */
12
- connection?: string;
13
- /** Database connections map (from JSON config file). */
14
- connections?: Record<string, string>;
15
- /** Path to a JSON configuration file (`--config`, `-C`). */
16
- configPath?: string;
17
- /** Directory of database files to manage (`--dir`/`--folder`/`--db-dir`, `-d`). */
18
- dbDir?: string;
19
- /** Explicit database file paths (`--files`/`--db-files`). */
20
- dbFiles?: string[];
21
- /** URL prefix to serve under (`--base-path`/`--base`, `-b`). */
22
- basePath?: string;
23
- /** Log level filter (`--log-level`, `-l`). */
24
- logLevel?: LogLevel;
25
- /** Open databases read-only (`--readonly`, `-r`). */
26
- readonly: boolean;
27
- /** Serverless mode (enforces read-only database operations) (`--serverless`). */
28
- serverless?: boolean;
29
- /** Whether authentication is enabled (defaults to true). Set to false via `--no-auth`. */
30
- auth?: boolean;
31
- /** Custom admin username (`--username`/`--user`/`--auth-username`, `-u`). */
32
- authUsername?: string;
33
- /** Custom admin password (`--password`/`--pass`/`--auth-password`, `-P`). */
34
- authPassword?: string;
35
- /** Secret key for session cookie signing (`--auth-secret`/`--secret`). */
36
- authSecret?: string;
37
- }
38
- export declare function helpText(): string;
39
- /** The installed `admindb` package version (from package.json), or '' when unknown. */
40
- export declare function getPackageVersion(): string;
41
- export declare function versionText(): string;
42
- export declare function parseArgs(argv: string[]): {
43
- args: CliArgs;
44
- error?: string;
45
- };
1
+ import type {LogLevel} from '../utils/logger';export interface CliArgs{help:boolean;version:boolean;host?:string;port?:number;dbPath?:string;connection?:string;connections?:Record<string,string>;configPath?:string;dbDir?:string;dbFiles?:string[];basePath?:string;logLevel?:LogLevel;readonly :boolean;serverless?:boolean;auth?:boolean;authUsername?:string;authPassword?:string;authSecret?:string;}export declare function helpText():string;export declare function getPackageVersion():string;export declare function versionText():string;export declare function parseArgs(argv:string[]):{args:CliArgs;error?:string;};
package/dist/cli/args.js CHANGED
@@ -7,14 +7,9 @@ exports.helpText = helpText;
7
7
  exports.getPackageVersion = getPackageVersion;
8
8
  exports.versionText = versionText;
9
9
  exports.parseArgs = parseArgs;
10
- /**
11
- * Command-line argument parsing for the standalone `admindb` server.
12
- *
13
- * The CLI supports flags to pick the port/host, open a single database file,
14
- * manage a folder of databases, or pass a JSON config file with multiple connections.
15
- */
16
10
  const node_fs_1 = require("node:fs");
17
11
  const node_path_1 = __importDefault(require("node:path"));
12
+ const common_1 = require("../utils/common");
18
13
  const config_1 = require("./config");
19
14
  const LOG_LEVELS = ['debug', 'info', 'warn', 'error'];
20
15
  function helpText() {
@@ -85,7 +80,6 @@ function packageVersion() {
85
80
  return '';
86
81
  }
87
82
  }
88
- /** The installed `admindb` package version (from package.json), or '' when unknown. */
89
83
  function getPackageVersion() {
90
84
  return packageVersion();
91
85
  }
@@ -93,7 +87,6 @@ function versionText() {
93
87
  const v = packageVersion();
94
88
  return v ? `admindb v${v}` : 'admindb';
95
89
  }
96
- /** True when a token is exactly a flag or `flag=value` (for long flags). */
97
90
  function isFlag(tok, ...names) {
98
91
  return names.includes(tok) || names.some((n) => n.length > 2 && tok.startsWith(n + '='));
99
92
  }
@@ -185,7 +178,7 @@ function parseArgs(argv) {
185
178
  if (v === undefined)
186
179
  return invalid('Missing value for --open / --db-path.');
187
180
  args.dbPath = v;
188
- if (v.startsWith('postgres://') || v.startsWith('postgresql://')) {
181
+ if ((0, common_1.isPostgresConnectionString)(v)) {
189
182
  args.connection = v;
190
183
  }
191
184
  }
@@ -263,7 +256,7 @@ function parseArgs(argv) {
263
256
  }
264
257
  const p = positional[0];
265
258
  if (p) {
266
- if (p.startsWith('postgres://') || p.startsWith('postgresql://')) {
259
+ if ((0, common_1.isPostgresConnectionString)(p)) {
267
260
  args.connection = p;
268
261
  args.dbPath = p;
269
262
  }
@@ -325,4 +318,3 @@ function parseArgs(argv) {
325
318
  }
326
319
  return { args };
327
320
  }
328
- //# sourceMappingURL=args.js.map
@@ -1,56 +1 @@
1
- import type { LogLevel } from '../utils/logger';
2
- export interface DatabaseConfigFile {
3
- /** Database connections mapped by name: { "name": "postgresql://...", "name1": "postgresql://..." } */
4
- connections?: Record<string, string>;
5
- /** Single database connection string */
6
- connection?: string;
7
- /** Port override */
8
- port?: number;
9
- /** Host override */
10
- host?: string;
11
- /** Base path */
12
- basePath?: string;
13
- /** Readonly flag */
14
- readonly?: boolean;
15
- /** Serverless flag */
16
- serverless?: boolean;
17
- /** Auth options */
18
- auth?: boolean | {
19
- username?: string;
20
- password?: string;
21
- secret?: string;
22
- };
23
- /** Log level */
24
- logLevel?: LogLevel;
25
- }
26
- export declare function parseConfigFile(filePath: string): DatabaseConfigFile | null;
27
- export interface Config {
28
- host: string;
29
- port: number;
30
- /** Single-database file or connection string. */
31
- dbPath: string;
32
- /** Database connection string (PostgreSQL or SQLite). */
33
- connection?: string;
34
- /** Named database connections map. */
35
- connections?: Record<string, string>;
36
- /** Directory of managed database files (multi-db mode source 1). */
37
- dbDir?: string;
38
- /** Explicit database file locations (multi-db mode source 2). */
39
- dbFiles?: string[];
40
- basePath: string;
41
- logLevel: LogLevel;
42
- /** Open the database read-only (writes disabled). */
43
- readonly: boolean;
44
- /** Serverless environment mode (enforces read-only). */
45
- serverless: boolean;
46
- /** Whether authentication is enabled (default: true). */
47
- auth: boolean;
48
- /** Custom admin username (default: 'admin'). */
49
- authUsername?: string;
50
- /** Custom admin password (default: 'admin'). */
51
- authPassword?: string;
52
- /** Custom secret for signing session cookies. */
53
- authSecret?: string;
54
- }
55
- /** Load configuration from environment variables with sensible defaults. */
56
- export declare function loadConfig(env?: NodeJS.ProcessEnv): Config;
1
+ import type {LogLevel} from '../utils/logger';export interface DatabaseConfigFile{connections?:Record<string,string>;connection?:string;port?:number;host?:string;basePath?:string;readonly ?:boolean;serverless?:boolean;auth?:boolean|{username?:string;password?:string;secret?:string;};logLevel?:LogLevel;}export declare function parseConfigFile(filePath:string):DatabaseConfigFile|null;export interface Config{host:string;port:number;dbPath:string;connection?:string;connections?:Record<string,string>;dbDir?:string;dbFiles?:string[];basePath:string;logLevel:LogLevel;readonly :boolean;serverless:boolean;auth:boolean;authUsername?:string;authPassword?:string;authSecret?:string;}export declare function loadConfig(env?:NodeJS.ProcessEnv):Config;
@@ -20,7 +20,6 @@ function parseConfigFile(filePath) {
20
20
  return null;
21
21
  const result = {};
22
22
  const conns = {};
23
- // 1. If parsed has a nested "databases" or "connections" map
24
23
  const topDbs = parsed.databases || parsed.connections;
25
24
  if (topDbs && typeof topDbs === 'object' && !Array.isArray(topDbs)) {
26
25
  for (const [k, v] of Object.entries(topDbs)) {
@@ -31,7 +30,6 @@ function parseConfigFile(filePath) {
31
30
  }
32
31
  }
33
32
  }
34
- // 2. Direct key-value map of { "name": "postgresql://...", "name1": "postgresql://..." }
35
33
  for (const [k, v] of Object.entries(parsed)) {
36
34
  if (['databases', 'connections', 'port', 'host', 'basePath', 'readonly', 'serverless', 'auth', 'logLevel', 'username', 'password', 'secret'].includes(k)) {
37
35
  continue;
@@ -70,7 +68,6 @@ function parseConfigFile(filePath) {
70
68
  throw new Error(`Failed to parse configuration file "${filePath}": ${(0, common_1.errorMessage)(err)}`);
71
69
  }
72
70
  }
73
- /** Load configuration from environment variables with sensible defaults. */
74
71
  function loadConfig(env = process.env) {
75
72
  const portRaw = env.ADMINDB_PORT ?? env.PORT ?? '45531';
76
73
  const port = Number.parseInt(portRaw, 10);
@@ -97,7 +94,6 @@ function loadConfig(env = process.env) {
97
94
  }
98
95
  }
99
96
  catch {
100
- /* ignore */
101
97
  }
102
98
  }
103
99
  const configPath = env.ADMINDB_CONFIG;
@@ -130,4 +126,3 @@ function loadConfig(env = process.env) {
130
126
  authSecret: (env.ADMINDB_SECRET ?? env.SESSION_SECRET) ? String(env.ADMINDB_SECRET ?? env.SESSION_SECRET).trim() : undefined,
131
127
  };
132
128
  }
133
- //# sourceMappingURL=config.js.map
@@ -1,4 +1 @@
1
- export * from './args';
2
- export * from '../utils/colors';
3
- export * from './config';
4
- export * from './runner';
1
+ export * from './args';export * from '../utils/colors';export * from './config';export * from './runner';
package/dist/cli/index.js CHANGED
@@ -18,4 +18,3 @@ __exportStar(require("./args"), exports);
18
18
  __exportStar(require("../utils/colors"), exports);
19
19
  __exportStar(require("./config"), exports);
20
20
  __exportStar(require("./runner"), exports);
21
- //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- export declare function runCli(): void;
1
+ export declare function runCli():void;
@@ -13,6 +13,7 @@ const logger_1 = require("../utils/logger");
13
13
  const manager_1 = require("../db/manager");
14
14
  const args_1 = require("./args");
15
15
  const auth_1 = require("../auth");
16
+ const common_1 = require("../utils/common");
16
17
  const colors_1 = require("../utils/colors");
17
18
  function runCli() {
18
19
  const env = (0, config_1.loadConfig)();
@@ -32,7 +33,6 @@ function runCli() {
32
33
  console.log((0, args_1.versionText)());
33
34
  process.exit(0);
34
35
  }
35
- // Merge CLI flags over environment variables.
36
36
  const authEnabled = args.auth !== undefined ? args.auth : env.auth;
37
37
  const authUsername = args.authUsername ?? env.authUsername ?? 'admin';
38
38
  const authPassword = args.authPassword ?? env.authPassword;
@@ -65,17 +65,10 @@ function runCli() {
65
65
  const logger = (0, logger_1.createLogger)(config.logLevel, 'admindb');
66
66
  const app = (0, express_1.default)();
67
67
  app.disable('x-powered-by');
68
- // Mode selection:
69
- // - Multiple database connections from JSON config -> Manager mode.
70
- // - A specific single file / connection without multiple connections -> single-database mode.
71
- // - Otherwise -> manager mode.
72
68
  const hasDir = Boolean(config.dbDir);
73
69
  const hasFiles = Boolean(config.dbFiles && config.dbFiles.length > 0);
74
- const explicitFile = args.connection ??
75
- config.connection ??
76
- args.dbPath ??
77
- (process.env.ADMINDB_DB_PATH || process.env.ADMINDB_PATH || process.env.DB_PATH ? config.dbPath : undefined);
78
- const isPg = Boolean(explicitFile && (explicitFile.startsWith('postgres://') || explicitFile.startsWith('postgresql://')));
70
+ const explicitFile = args.connection || args.dbPath || config.connection || config.dbPath;
71
+ const isPg = Boolean(explicitFile && (0, common_1.isPostgresConnectionString)(explicitFile));
79
72
  const singleFileOnly = !hasConnections && (Boolean(explicitFile) || isPg) && !hasDir && !hasFiles;
80
73
  const useManager = !singleFileOnly;
81
74
  const managerFiles = [...(config.dbFiles ?? [])];
@@ -117,7 +110,6 @@ function runCli() {
117
110
  }
118
111
  }
119
112
  catch {
120
- /* ignore */
121
113
  }
122
114
  return undefined;
123
115
  }
@@ -138,7 +130,6 @@ function runCli() {
138
130
  console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Network:')} ${colors_1.c.cyan(netUrl)}`);
139
131
  }
140
132
  }
141
- // Mode & Target Info
142
133
  if (useManager) {
143
134
  const modeDesc = config.serverless
144
135
  ? 'Manager [Serverless Read-Only]'
@@ -152,8 +143,8 @@ function runCli() {
152
143
  }
153
144
  if (hasConnections) {
154
145
  for (const [name, target] of Object.entries(connections)) {
155
- const sanitized = target.replace(/:([^@]+)@/, ':****@');
156
- const isTargetPg = target.startsWith('postgres://') || target.startsWith('postgresql://');
146
+ const sanitized = (0, common_1.sanitizeConnectionString)(target);
147
+ const isTargetPg = (0, common_1.isPostgresConnectionString)(target);
157
148
  const engine = isTargetPg ? 'PostgreSQL' : 'SQLite';
158
149
  console.log(` ${colors_1.c.dim('•')} ${colors_1.c.bold(name)}: ${colors_1.c.cyan(engine)} ${colors_1.c.dim(sanitized)}`);
159
150
  }
@@ -179,7 +170,7 @@ function runCli() {
179
170
  console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Config:')} ${colors_1.c.cyan(args.configPath)}`);
180
171
  }
181
172
  if (isPg) {
182
- const sanitized = explicitFile?.replace(/:([^@]+)@/, ':****@');
173
+ const sanitized = (0, common_1.sanitizeConnectionString)(explicitFile || '');
183
174
  console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Engine:')} ${colors_1.c.cyan('PostgreSQL')}`);
184
175
  console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Database:')} ${sanitized}`);
185
176
  }
@@ -188,7 +179,6 @@ function runCli() {
188
179
  console.log(` ${colors_1.c.green('➜')} ${colors_1.c.bold('Database:')} ${explicitFile}`);
189
180
  }
190
181
  }
191
- // Auth Status
192
182
  if (authEnabled) {
193
183
  const isDefaultPass = authUsername === 'admin' &&
194
184
  (!authPassword || authPassword === 'admin' || authPassword === auth_1.DEFAULT_PASSWORD_HASH);
@@ -219,4 +209,3 @@ function runCli() {
219
209
  process.on('SIGINT', () => shutdown('SIGINT'));
220
210
  process.on('SIGTERM', () => shutdown('SIGTERM'));
221
211
  }
222
- //# sourceMappingURL=runner.js.map
package/dist/cli.d.ts CHANGED
@@ -1,2 +1 @@
1
- #!/usr/bin/env node
2
- export {};
1
+ #!/usr/bin/env node export{};
package/dist/cli.js CHANGED
@@ -3,4 +3,3 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const runner_1 = require("./cli/runner");
5
5
  (0, runner_1.runCli)();
6
- //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ import type {IDatabase,TableInfoData} from '../db/index';import{type ColumnGeneratorConfig,type ColumnPlan,type ErChainConfig,type ErChainResult,type ErChainScope} from './types';export interface ErGraphNode{name:string;info:TableInfoData;columns:ColumnGeneratorConfig[];parents:{table:string; from :string;to:string;notnull:boolean;}[];children:{table:string; from :string;to:string;notnull:boolean;}[];hasSelfRef:boolean;depth:number;}export declare function buildErGraph(tables:TableInfoData[]):Map<string,ErGraphNode>;export declare function resolveErChain(graph:Map<string,ErGraphNode>,rootTable:string,scope?:ErChainScope):ErGraphNode[];export declare function topologicalSort(nodes:ErGraphNode[]):{sorted:ErGraphNode[];cycleDetected:boolean;cycleTables:string[];};export declare function getErChainConfig(db:IDatabase,rootTable:string,scope?:ErChainScope):Promise<ErChainConfig>;export declare function generateChainRows(db:IDatabase,chainConfig:ErChainConfig,customPlans?:Record<string,Record<string,ColumnPlan>>,customCounts?:Record<string,number>,truncate?:boolean):Promise<ErChainResult>;export declare function buildChainInsertSql(executionOrder:string[],tableResults:ErChainResult['tableResults']):string;export declare function executeChainInsert(db:IDatabase,chainResult:ErChainResult,truncate?:boolean):Promise<{inserted:Record<string,number>;totalInserted:number;elapsedMs:number;warnings:string[];}>;