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.
- package/README.md +41 -12
- package/dist/app.d.ts +1 -69
- package/dist/app.js +3 -30
- package/dist/auth/config.d.ts +1 -19
- package/dist/auth/config.js +0 -26
- package/dist/auth/crypto.d.ts +1 -27
- package/dist/auth/crypto.js +1 -26
- package/dist/auth/index.d.ts +1 -5
- package/dist/auth/index.js +0 -1
- package/dist/auth/middleware.d.ts +1 -14
- package/dist/auth/middleware.js +0 -15
- package/dist/auth/routes.d.ts +1 -7
- package/dist/auth/routes.js +0 -8
- package/dist/auth/types.d.ts +1 -35
- package/dist/auth/types.js +1 -5
- package/dist/cli/args.d.ts +1 -45
- package/dist/cli/args.js +3 -11
- package/dist/cli/config.d.ts +1 -56
- package/dist/cli/config.js +0 -5
- package/dist/cli/index.d.ts +1 -4
- package/dist/cli/index.js +0 -1
- package/dist/cli/runner.d.ts +1 -1
- package/dist/cli/runner.js +6 -17
- package/dist/cli.d.ts +1 -2
- package/dist/cli.js +0 -1
- package/dist/data/chain.d.ts +1 -0
- package/dist/data/chain.js +707 -0
- package/dist/data/datasets.d.ts +1 -17
- package/dist/data/datasets.js +0 -4
- package/dist/data/detector.d.ts +1 -30
- package/dist/data/detector.js +53 -14
- package/dist/data/engine.d.ts +1 -10
- package/dist/data/engine.js +82 -48
- package/dist/data/index.d.ts +1 -5
- package/dist/data/index.js +1 -1
- package/dist/data/strategies.d.ts +1 -30
- package/dist/data/strategies.js +4 -8
- package/dist/data/types.d.ts +1 -73
- package/dist/data/types.js +0 -3
- package/dist/db/database.d.ts +1 -119
- package/dist/db/database.js +20 -14
- package/dist/db/export.d.ts +1 -12
- package/dist/db/export.js +54 -6
- package/dist/db/filters.d.ts +1 -22
- package/dist/db/filters.js +0 -16
- package/dist/db/index.d.ts +1 -8
- package/dist/db/index.js +0 -1
- package/dist/db/introspection.d.ts +1 -6
- package/dist/db/introspection.js +0 -5
- package/dist/db/manager.d.ts +1 -81
- package/dist/db/manager.js +13 -59
- package/dist/db/migrations.d.ts +1 -5
- package/dist/db/migrations.js +2 -5
- package/dist/db/postgres.d.ts +1 -85
- package/dist/db/postgres.js +21 -31
- package/dist/db/types.d.ts +1 -206
- package/dist/db/types.js +0 -1
- package/dist/index.d.ts +1 -23
- package/dist/index.js +0 -14
- package/dist/public/css/app.css +1 -1
- package/dist/public/js/api.js +1 -47
- package/dist/public/js/app.js +1 -262
- package/dist/public/js/browse.js +1 -1371
- package/dist/public/js/common.js +1 -0
- package/dist/public/js/databases.js +1 -235
- package/dist/public/js/designer.js +1 -258
- package/dist/public/js/forms.js +1 -826
- package/dist/public/js/home.js +1 -0
- package/dist/public/js/inspector.js +1 -638
- package/dist/public/js/query.js +1 -322
- package/dist/public/js/schema.js +1 -447
- package/dist/public/js/seed.js +1 -1090
- package/dist/routes/api/erd.d.ts +1 -0
- package/dist/routes/api/erd.js +50 -0
- package/dist/routes/api/helpers.d.ts +1 -42
- package/dist/routes/api/helpers.js +33 -3
- package/dist/routes/api/import-export.d.ts +1 -3
- package/dist/routes/api/import-export.js +0 -2
- package/dist/routes/api/index.d.ts +1 -4
- package/dist/routes/api/index.js +15 -4
- package/dist/routes/api/query.d.ts +1 -3
- package/dist/routes/api/query.js +13 -11
- package/dist/routes/api/rows.d.ts +1 -3
- package/dist/routes/api/rows.js +0 -11
- package/dist/routes/api/seed.d.ts +1 -3
- package/dist/routes/api/seed.js +79 -8
- package/dist/routes/api/tables.d.ts +1 -3
- package/dist/routes/api/tables.js +77 -6
- package/dist/routes/databases.d.ts +1 -26
- package/dist/routes/databases.js +1 -3
- package/dist/routes/index.d.ts +1 -3
- package/dist/routes/index.js +0 -1
- package/dist/routes/pages.d.ts +1 -9
- package/dist/routes/pages.js +18 -11
- package/dist/serverless.d.ts +1 -40
- package/dist/serverless.js +3 -39
- package/dist/sql/classifier.d.ts +1 -19
- package/dist/sql/classifier.js +0 -13
- package/dist/sql/error-analyzer.d.ts +1 -0
- package/dist/sql/error-analyzer.js +550 -0
- package/dist/sql/generator.d.ts +1 -81
- package/dist/sql/generator.js +0 -29
- package/dist/sql/index.d.ts +1 -2
- package/dist/sql/index.js +0 -1
- package/dist/types/api.d.ts +1 -412
- package/dist/types/api.js +0 -7
- package/dist/utils/colors.d.ts +1 -40
- package/dist/utils/colors.js +0 -10
- package/dist/utils/common.d.ts +1 -50
- package/dist/utils/common.js +19 -23
- package/dist/utils/csv.d.ts +1 -15
- package/dist/utils/csv.js +0 -13
- package/dist/utils/datatype.d.ts +1 -49
- package/dist/utils/datatype.js +0 -41
- package/dist/utils/icons.d.ts +1 -11
- package/dist/utils/icons.js +25 -16
- package/dist/utils/index.d.ts +1 -4
- package/dist/utils/index.js +0 -1
- package/dist/utils/logger.d.ts +1 -10
- package/dist/utils/logger.js +0 -4
- package/dist/views/layouts/main.hbs +14 -5
- package/dist/views/pages/databases.hbs +0 -18
- package/dist/views/pages/designer.hbs +0 -10
- package/dist/views/pages/erd.hbs +1241 -0
- package/dist/views/pages/error.hbs +0 -2
- package/dist/views/pages/form.hbs +0 -5
- package/dist/views/pages/home.hbs +98 -10
- package/dist/views/pages/info.hbs +107 -0
- package/dist/views/pages/login.hbs +0 -13
- package/dist/views/pages/query.hbs +54 -21
- package/dist/views/pages/schema.hbs +0 -20
- package/dist/views/pages/seed.hbs +435 -202
- package/dist/views/pages/table.hbs +0 -14
- package/dist/views/partials/icon.hbs +0 -1
- package/dist/views/partials/navbar.hbs +0 -6
- package/dist/views/partials/sidebar.hbs +12 -8
- package/docs/API.md +6 -1
- package/docs/EXAMPLES.md +3 -0
- package/package.json +7 -5
- package/dist/app.js.map +0 -1
- package/dist/auth/config.js.map +0 -1
- package/dist/auth/crypto.js.map +0 -1
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/middleware.js.map +0 -1
- package/dist/auth/routes.js.map +0 -1
- package/dist/auth/types.js.map +0 -1
- package/dist/cli/args.js.map +0 -1
- package/dist/cli/config.js.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/runner.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/data/datasets.js.map +0 -1
- package/dist/data/detector.js.map +0 -1
- package/dist/data/engine.js.map +0 -1
- package/dist/data/index.js.map +0 -1
- package/dist/data/strategies.js.map +0 -1
- package/dist/data/types.js.map +0 -1
- package/dist/db/database.js.map +0 -1
- package/dist/db/export.js.map +0 -1
- package/dist/db/filters.js.map +0 -1
- package/dist/db/index.js.map +0 -1
- package/dist/db/introspection.js.map +0 -1
- package/dist/db/manager.js.map +0 -1
- package/dist/db/migrations.js.map +0 -1
- package/dist/db/postgres.js.map +0 -1
- package/dist/db/types.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/public/css/input.css +0 -302
- package/dist/public/js/icons.js +0 -51
- package/dist/routes/api/helpers.js.map +0 -1
- package/dist/routes/api/import-export.js.map +0 -1
- package/dist/routes/api/index.js.map +0 -1
- package/dist/routes/api/query.js.map +0 -1
- package/dist/routes/api/rows.js.map +0 -1
- package/dist/routes/api/seed.js.map +0 -1
- package/dist/routes/api/tables.js.map +0 -1
- package/dist/routes/databases.js.map +0 -1
- package/dist/routes/index.js.map +0 -1
- package/dist/routes/pages.js.map +0 -1
- package/dist/serverless.js.map +0 -1
- package/dist/sql/classifier.js.map +0 -1
- package/dist/sql/generator.js.map +0 -1
- package/dist/sql/index.js.map +0 -1
- package/dist/types/api.js.map +0 -1
- package/dist/utils/colors.js.map +0 -1
- package/dist/utils/common.js.map +0 -1
- package/dist/utils/csv.js.map +0 -1
- package/dist/utils/datatype.js.map +0 -1
- package/dist/utils/icons.js.map +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.js.map +0 -1
package/dist/auth/routes.js
CHANGED
|
@@ -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
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -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";
|
package/dist/auth/types.js
CHANGED
|
@@ -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;
|
|
6
|
+
exports.DEFAULT_SESSION_DURATION_MS = 7 * 24 * 60 * 60 * 1000;
|
|
10
7
|
exports.SESSION_COOKIE_NAME = 'admindb_session';
|
|
11
|
-
//# sourceMappingURL=types.js.map
|
package/dist/cli/args.d.ts
CHANGED
|
@@ -1,45 +1 @@
|
|
|
1
|
-
import type {
|
|
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 (
|
|
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 (
|
|
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
|
package/dist/cli/config.d.ts
CHANGED
|
@@ -1,56 +1 @@
|
|
|
1
|
-
import type {
|
|
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;
|
package/dist/cli/config.js
CHANGED
|
@@ -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
|
package/dist/cli/index.d.ts
CHANGED
package/dist/cli/index.js
CHANGED
package/dist/cli/runner.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function runCli():
|
|
1
|
+
export declare function runCli():void;
|
package/dist/cli/runner.js
CHANGED
|
@@ -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
|
-
|
|
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 =
|
|
156
|
-
const isTargetPg =
|
|
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 =
|
|
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
|
@@ -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[];}>;
|