fdb2 1.0.37 → 1.0.39
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 +47 -0
- package/bin/fdb2.js +78 -3
- package/dist/public/explorer.css +517 -478
- package/dist/public/explorer.js +1114 -872
- package/dist/public/index.css +87 -27
- package/dist/public/index.js +97 -49
- package/dist/public/layout.js +2 -2
- package/dist/public/vue.js +1 -1
- package/dist/server/core/schema/__tests__/canonical.test.ts +195 -0
- package/dist/server/core/schema/__tests__/ddl-emitter.test.ts +456 -0
- package/dist/server/core/schema/__tests__/diff.test.ts +242 -0
- package/dist/server/core/schema/__tests__/roundtrip.property.test.ts +403 -0
- package/dist/server/core/schema/canonical.d.ts +50 -0
- package/dist/server/core/schema/canonical.d.ts.map +1 -0
- package/dist/server/core/schema/canonical.js +212 -0
- package/dist/server/core/schema/canonical.js.map +1 -0
- package/dist/server/core/schema/canonical.ts +223 -0
- package/dist/server/core/schema/ddl-emitter.d.ts +68 -0
- package/dist/server/core/schema/ddl-emitter.d.ts.map +1 -0
- package/dist/server/core/schema/ddl-emitter.js +813 -0
- package/dist/server/core/schema/ddl-emitter.js.map +1 -0
- package/dist/server/core/schema/ddl-emitter.ts +925 -0
- package/dist/server/core/schema/diff.d.ts +16 -0
- package/dist/server/core/schema/diff.d.ts.map +1 -0
- package/dist/server/core/schema/diff.js +115 -0
- package/dist/server/core/schema/diff.js.map +1 -0
- package/dist/server/core/schema/diff.ts +134 -0
- package/dist/server/core/schema/type-defaults.d.ts +27 -0
- package/dist/server/core/schema/type-defaults.d.ts.map +1 -0
- package/dist/server/core/schema/type-defaults.js +61 -0
- package/dist/server/core/schema/type-defaults.js.map +1 -0
- package/dist/server/core/schema/type-defaults.ts +79 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +347 -124
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.ts +336 -161
- package/dist/server/model/ddl-spec.d.ts +163 -0
- package/dist/server/model/ddl-spec.d.ts.map +1 -0
- package/dist/server/model/ddl-spec.js +32 -0
- package/dist/server/model/ddl-spec.js.map +1 -0
- package/dist/server/model/ddl-spec.ts +175 -0
- package/dist/server/service/connection.service.d.ts +20 -0
- package/dist/server/service/connection.service.d.ts.map +1 -1
- package/dist/server/service/connection.service.js +99 -25
- package/dist/server/service/connection.service.js.map +1 -1
- package/dist/server/service/connection.service.ts +104 -25
- package/dist/server/service/database/base.service.d.ts +0 -4
- package/dist/server/service/database/base.service.d.ts.map +1 -1
- package/dist/server/service/database/base.service.js.map +1 -1
- package/dist/server/service/database/base.service.ts +0 -5
- package/dist/server/service/database/clickhouse.service.d.ts +0 -5
- package/dist/server/service/database/clickhouse.service.d.ts.map +1 -1
- package/dist/server/service/database/clickhouse.service.js +0 -49
- package/dist/server/service/database/clickhouse.service.js.map +1 -1
- package/dist/server/service/database/clickhouse.service.ts +0 -52
- package/dist/server/service/database/cockroachdb.service.d.ts +0 -5
- package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
- package/dist/server/service/database/cockroachdb.service.js +11 -142
- package/dist/server/service/database/cockroachdb.service.js.map +1 -1
- package/dist/server/service/database/cockroachdb.service.ts +11 -161
- package/dist/server/service/database/database.service.d.ts +55 -2
- package/dist/server/service/database/database.service.d.ts.map +1 -1
- package/dist/server/service/database/database.service.js +246 -4
- package/dist/server/service/database/database.service.js.map +1 -1
- package/dist/server/service/database/database.service.ts +295 -7
- package/dist/server/service/database/mongodb.service.d.ts +0 -6
- package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
- package/dist/server/service/database/mongodb.service.js +0 -8
- package/dist/server/service/database/mongodb.service.js.map +1 -1
- package/dist/server/service/database/mongodb.service.ts +0 -8
- package/dist/server/service/database/mssql.service.d.ts +8 -4
- package/dist/server/service/database/mssql.service.d.ts.map +1 -1
- package/dist/server/service/database/mssql.service.js +27 -101
- package/dist/server/service/database/mssql.service.js.map +1 -1
- package/dist/server/service/database/mssql.service.ts +28 -122
- package/dist/server/service/database/mysql.service.d.ts +0 -4
- package/dist/server/service/database/mysql.service.d.ts.map +1 -1
- package/dist/server/service/database/mysql.service.js +11 -137
- package/dist/server/service/database/mysql.service.js.map +1 -1
- package/dist/server/service/database/mysql.service.ts +11 -173
- package/dist/server/service/database/oracle.service.d.ts +0 -4
- package/dist/server/service/database/oracle.service.d.ts.map +1 -1
- package/dist/server/service/database/oracle.service.js +11 -104
- package/dist/server/service/database/oracle.service.js.map +1 -1
- package/dist/server/service/database/oracle.service.ts +11 -127
- package/dist/server/service/database/postgres.service.d.ts +0 -4
- package/dist/server/service/database/postgres.service.d.ts.map +1 -1
- package/dist/server/service/database/postgres.service.js +11 -112
- package/dist/server/service/database/postgres.service.js.map +1 -1
- package/dist/server/service/database/postgres.service.ts +11 -133
- package/dist/server/service/database/sap.service.d.ts +0 -4
- package/dist/server/service/database/sap.service.d.ts.map +1 -1
- package/dist/server/service/database/sap.service.js +11 -137
- package/dist/server/service/database/sap.service.js.map +1 -1
- package/dist/server/service/database/sap.service.ts +11 -158
- package/dist/server/service/database/sql-type.helper.d.ts.map +1 -1
- package/dist/server/service/database/sql-type.helper.js +9 -47
- package/dist/server/service/database/sql-type.helper.js.map +1 -1
- package/dist/server/service/database/sql-type.helper.ts +11 -53
- package/dist/server/service/database/sqlite.service.d.ts +0 -5
- package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
- package/dist/server/service/database/sqlite.service.js +11 -147
- package/dist/server/service/database/sqlite.service.js.map +1 -1
- package/dist/server/service/database/sqlite.service.ts +11 -177
- package/package.json +1 -1
- package/server.js +1 -1
package/README.md
CHANGED
|
@@ -78,6 +78,53 @@ http://localhost:9800
|
|
|
78
78
|
|
|
79
79
|
> 💡 **Tip**: Default port is 9800, but if occupied, it will automatically select another available port
|
|
80
80
|
|
|
81
|
+
## 🌍 Remote Database Access (HTTP Proxy)
|
|
82
|
+
|
|
83
|
+
Sometimes the database is **not reachable from your machine** — it sits behind a corporate VPN, on a private subnet, or on a bastion host. In that case, run `fdb2` on a machine that *can* reach it and let your local client talk to that service over HTTP.
|
|
84
|
+
|
|
85
|
+
### How it works
|
|
86
|
+
Add a connection of type **Remote Proxy Service** and point it at the remote `fdb2` server. Once saved, **every database connection configured on that remote server is merged into your local connection list**, and every operation — browsing schemas, running SQL, DDL, data CRUD, export, even editing or deleting the connection config — is forwarded to the remote server and executed there.
|
|
87
|
+
|
|
88
|
+
The remote database password never leaves the remote server: it is **not** sent down to your client.
|
|
89
|
+
|
|
90
|
+
### Setup
|
|
91
|
+
1. **On the machine that can reach the database**, start the service and confirm it is reachable from your client:
|
|
92
|
+
```bash
|
|
93
|
+
fdb2 start -p 9800
|
|
94
|
+
# then open http://<remote-ip>:9800 in a browser to confirm
|
|
95
|
+
```
|
|
96
|
+
2. **On that remote service**, add the real database connections as usual.
|
|
97
|
+
3. **On your local client** (web UI or the VSCode extension) → *Add Connection* → **Type: Remote Proxy Service**:
|
|
98
|
+
|
|
99
|
+
| Field | Description |
|
|
100
|
+
| --- | --- |
|
|
101
|
+
| Service URL | Base URL of the remote `fdb2` server, e.g. `http://10.0.0.5:9800` — the **root** of the service, without a trailing `/api`. |
|
|
102
|
+
| Access Token | Optional. Only needed when the remote server was started with `DB_TOOL_REMOTE_TOKEN`. |
|
|
103
|
+
|
|
104
|
+
4. **Save.** The remote connections now appear in your local connection list — expand, query, and edit them exactly like local ones. Editing or deleting one of those remote connections applies to the remote server's configuration.
|
|
105
|
+
|
|
106
|
+
### Securing the remote service
|
|
107
|
+
```bash
|
|
108
|
+
# on the remote machine
|
|
109
|
+
DB_TOOL_REMOTE_TOKEN=your-secret fdb2 start -p 9800
|
|
110
|
+
|
|
111
|
+
# 也可以把令牌持久化保存,之后 `fdb2 start` 会自动读取,无需每次设置环境变量:
|
|
112
|
+
fdb2 token set your-secret
|
|
113
|
+
fdb2 start -p 9800
|
|
114
|
+
# 查看已保存的令牌:
|
|
115
|
+
fdb2 token get
|
|
116
|
+
```
|
|
117
|
+
Once set, the remote server rejects every HTTP request that does not carry the matching `x-db-tool-token` header, and answers `远程访问令牌无效` (*invalid remote access token*). Put the same value into the proxy connection's **Access Token** field.
|
|
118
|
+
|
|
119
|
+
> ⚠️ Set the token **only on the remote server**. Setting it on your own local server would also lock out your local browser/extension.
|
|
120
|
+
> The token guards the HTTP entry point only; in-process calls (e.g. from the VSCode extension host) are not affected.
|
|
121
|
+
|
|
122
|
+
### Notes & limits
|
|
123
|
+
- The remote service must be reachable from your client (LAN IP, VPN, SSH tunnel, …).
|
|
124
|
+
- Proxying is **one level deep** — a chain `A → B → C` is not supported.
|
|
125
|
+
- If the remote service is unreachable, the proxy entry exposes no connections and the connection detail panel shows the error.
|
|
126
|
+
- The remote server keeps its own database credentials; the local client only stores the proxy URL and token.
|
|
127
|
+
|
|
81
128
|
## 🔌 VSCode Extension
|
|
82
129
|
|
|
83
130
|
Prefer staying inside the editor? `fdb2` also ships as a **VSCode extension** — "Database Tool (fdb2)" — that embeds the same UI directly in VSCode.
|
package/bin/fdb2.js
CHANGED
|
@@ -50,6 +50,31 @@ function deleteServerInfo() {
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
// 获取本地配置文件路径(与 PID/INFO 同目录)
|
|
54
|
+
function getConfigPath() {
|
|
55
|
+
const dataDir = process.env.DB_TOOL_DATA_DIR || path.join(os.homedir(), '.fdb2');
|
|
56
|
+
if (!fs.existsSync(dataDir)) {
|
|
57
|
+
fs.mkdirSync(dataDir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
return path.join(dataDir, 'fdb2.config.json');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 读取本地配置(容错:损坏时回退空对象)
|
|
63
|
+
function readConfig() {
|
|
64
|
+
try {
|
|
65
|
+
const p = getConfigPath();
|
|
66
|
+
if (!fs.existsSync(p)) return {};
|
|
67
|
+
return JSON.parse(fs.readFileSync(p, 'utf8')) || {};
|
|
68
|
+
} catch {
|
|
69
|
+
return {};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// 写入本地配置
|
|
74
|
+
function writeConfig(cfg) {
|
|
75
|
+
fs.writeFileSync(getConfigPath(), JSON.stringify(cfg, null, 2));
|
|
76
|
+
}
|
|
77
|
+
|
|
53
78
|
// 解析命令行参数
|
|
54
79
|
const args = process.argv.slice(2);
|
|
55
80
|
const command = args[0] || 'help';
|
|
@@ -66,10 +91,18 @@ switch (command) {
|
|
|
66
91
|
case 'restart':
|
|
67
92
|
restartProject();
|
|
68
93
|
break;
|
|
94
|
+
case 'token':
|
|
95
|
+
handleTokenCommand(commandArgs);
|
|
96
|
+
break;
|
|
69
97
|
case '-v':
|
|
70
98
|
case '--version':
|
|
71
99
|
showVersion();
|
|
72
100
|
break;
|
|
101
|
+
case '-h':
|
|
102
|
+
case '--help':
|
|
103
|
+
case 'help':
|
|
104
|
+
showHelp();
|
|
105
|
+
break;
|
|
73
106
|
default: {
|
|
74
107
|
// 数据库命令(conn/db/table/rows/...)交给编译后的 CLI
|
|
75
108
|
const cliMain = path.join(projectRoot, 'dist', 'server', 'cli', 'main.js');
|
|
@@ -198,6 +231,16 @@ async function startProject() {
|
|
|
198
231
|
// 创建日志文件流
|
|
199
232
|
const logFileFd = createLogFileStream(logFilePath);
|
|
200
233
|
|
|
234
|
+
// 注入远程访问令牌:若未通过环境变量显式指定,则从本地配置读取并写入子进程环境
|
|
235
|
+
if (!process.env.DB_TOOL_REMOTE_TOKEN) {
|
|
236
|
+
const cfg = readConfig();
|
|
237
|
+
if (cfg.remoteToken) {
|
|
238
|
+
process.env.DB_TOOL_REMOTE_TOKEN = cfg.remoteToken;
|
|
239
|
+
console.log('已从本地配置载入远程访问令牌。');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
|
|
201
244
|
// 使用 node 命令启动服务器(异步,后台运行)
|
|
202
245
|
const child = spawn(cmd, args, {
|
|
203
246
|
cwd: projectRoot,
|
|
@@ -349,8 +392,40 @@ function showHelp() {
|
|
|
349
392
|
console.log('FDB2 Database Tool');
|
|
350
393
|
console.log('');
|
|
351
394
|
console.log('Usage:');
|
|
352
|
-
console.log(' fdb2 start
|
|
353
|
-
console.log(' fdb2 stop
|
|
354
|
-
console.log(' fdb2 restart
|
|
395
|
+
console.log(' fdb2 start Start the project');
|
|
396
|
+
console.log(' fdb2 stop Stop the project');
|
|
397
|
+
console.log(' fdb2 restart Restart the project');
|
|
398
|
+
console.log(' fdb2 token set <token> Save remote access token to local config');
|
|
399
|
+
console.log(' fdb2 token get Show the saved remote access token');
|
|
355
400
|
console.log('');
|
|
401
|
+
console.log('数据库操作(连接/库表/数据/SQL 等)作为子命令使用,例如 `fdb2 conn`、`fdb2 db`。');
|
|
402
|
+
console.log('远程连接相关说明见 README 的「远程代理服务」章节。');
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// 处理 token 子命令:set / get
|
|
406
|
+
function handleTokenCommand(args) {
|
|
407
|
+
const sub = args[0];
|
|
408
|
+
if (sub === 'set') {
|
|
409
|
+
const value = args[1];
|
|
410
|
+
if (!value) {
|
|
411
|
+
console.error('用法: fdb2 token set <token>');
|
|
412
|
+
process.exitCode = 1;
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
const cfg = readConfig();
|
|
416
|
+
cfg.remoteToken = value;
|
|
417
|
+
writeConfig(cfg);
|
|
418
|
+
console.log('远程访问令牌已保存到本地配置文件。');
|
|
419
|
+
console.log('下次执行 `fdb2 start` 时会自动应用到服务端。');
|
|
420
|
+
} else if (sub === 'get' || sub === 'view') {
|
|
421
|
+
const cfg = readConfig();
|
|
422
|
+
if (cfg.remoteToken) {
|
|
423
|
+
console.log(cfg.remoteToken);
|
|
424
|
+
} else {
|
|
425
|
+
console.log('(尚未设置远程访问令牌)');
|
|
426
|
+
}
|
|
427
|
+
} else {
|
|
428
|
+
console.error('用法: fdb2 token set <token> | fdb2 token get');
|
|
429
|
+
process.exitCode = 1;
|
|
430
|
+
}
|
|
356
431
|
}
|