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.
Files changed (107) hide show
  1. package/README.md +47 -0
  2. package/bin/fdb2.js +78 -3
  3. package/dist/public/explorer.css +517 -478
  4. package/dist/public/explorer.js +1114 -872
  5. package/dist/public/index.css +87 -27
  6. package/dist/public/index.js +97 -49
  7. package/dist/public/layout.js +2 -2
  8. package/dist/public/vue.js +1 -1
  9. package/dist/server/core/schema/__tests__/canonical.test.ts +195 -0
  10. package/dist/server/core/schema/__tests__/ddl-emitter.test.ts +456 -0
  11. package/dist/server/core/schema/__tests__/diff.test.ts +242 -0
  12. package/dist/server/core/schema/__tests__/roundtrip.property.test.ts +403 -0
  13. package/dist/server/core/schema/canonical.d.ts +50 -0
  14. package/dist/server/core/schema/canonical.d.ts.map +1 -0
  15. package/dist/server/core/schema/canonical.js +212 -0
  16. package/dist/server/core/schema/canonical.js.map +1 -0
  17. package/dist/server/core/schema/canonical.ts +223 -0
  18. package/dist/server/core/schema/ddl-emitter.d.ts +68 -0
  19. package/dist/server/core/schema/ddl-emitter.d.ts.map +1 -0
  20. package/dist/server/core/schema/ddl-emitter.js +813 -0
  21. package/dist/server/core/schema/ddl-emitter.js.map +1 -0
  22. package/dist/server/core/schema/ddl-emitter.ts +925 -0
  23. package/dist/server/core/schema/diff.d.ts +16 -0
  24. package/dist/server/core/schema/diff.d.ts.map +1 -0
  25. package/dist/server/core/schema/diff.js +115 -0
  26. package/dist/server/core/schema/diff.js.map +1 -0
  27. package/dist/server/core/schema/diff.ts +134 -0
  28. package/dist/server/core/schema/type-defaults.d.ts +27 -0
  29. package/dist/server/core/schema/type-defaults.d.ts.map +1 -0
  30. package/dist/server/core/schema/type-defaults.js +61 -0
  31. package/dist/server/core/schema/type-defaults.js.map +1 -0
  32. package/dist/server/core/schema/type-defaults.ts +79 -0
  33. package/dist/server/index.d.ts +1 -1
  34. package/dist/server/index.d.ts.map +1 -1
  35. package/dist/server/index.js +347 -124
  36. package/dist/server/index.js.map +1 -1
  37. package/dist/server/index.ts +336 -161
  38. package/dist/server/model/ddl-spec.d.ts +163 -0
  39. package/dist/server/model/ddl-spec.d.ts.map +1 -0
  40. package/dist/server/model/ddl-spec.js +32 -0
  41. package/dist/server/model/ddl-spec.js.map +1 -0
  42. package/dist/server/model/ddl-spec.ts +175 -0
  43. package/dist/server/service/connection.service.d.ts +20 -0
  44. package/dist/server/service/connection.service.d.ts.map +1 -1
  45. package/dist/server/service/connection.service.js +99 -25
  46. package/dist/server/service/connection.service.js.map +1 -1
  47. package/dist/server/service/connection.service.ts +104 -25
  48. package/dist/server/service/database/base.service.d.ts +0 -4
  49. package/dist/server/service/database/base.service.d.ts.map +1 -1
  50. package/dist/server/service/database/base.service.js.map +1 -1
  51. package/dist/server/service/database/base.service.ts +0 -5
  52. package/dist/server/service/database/clickhouse.service.d.ts +0 -5
  53. package/dist/server/service/database/clickhouse.service.d.ts.map +1 -1
  54. package/dist/server/service/database/clickhouse.service.js +0 -49
  55. package/dist/server/service/database/clickhouse.service.js.map +1 -1
  56. package/dist/server/service/database/clickhouse.service.ts +0 -52
  57. package/dist/server/service/database/cockroachdb.service.d.ts +0 -5
  58. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
  59. package/dist/server/service/database/cockroachdb.service.js +11 -142
  60. package/dist/server/service/database/cockroachdb.service.js.map +1 -1
  61. package/dist/server/service/database/cockroachdb.service.ts +11 -161
  62. package/dist/server/service/database/database.service.d.ts +55 -2
  63. package/dist/server/service/database/database.service.d.ts.map +1 -1
  64. package/dist/server/service/database/database.service.js +246 -4
  65. package/dist/server/service/database/database.service.js.map +1 -1
  66. package/dist/server/service/database/database.service.ts +295 -7
  67. package/dist/server/service/database/mongodb.service.d.ts +0 -6
  68. package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
  69. package/dist/server/service/database/mongodb.service.js +0 -8
  70. package/dist/server/service/database/mongodb.service.js.map +1 -1
  71. package/dist/server/service/database/mongodb.service.ts +0 -8
  72. package/dist/server/service/database/mssql.service.d.ts +8 -4
  73. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  74. package/dist/server/service/database/mssql.service.js +27 -101
  75. package/dist/server/service/database/mssql.service.js.map +1 -1
  76. package/dist/server/service/database/mssql.service.ts +28 -122
  77. package/dist/server/service/database/mysql.service.d.ts +0 -4
  78. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  79. package/dist/server/service/database/mysql.service.js +11 -137
  80. package/dist/server/service/database/mysql.service.js.map +1 -1
  81. package/dist/server/service/database/mysql.service.ts +11 -173
  82. package/dist/server/service/database/oracle.service.d.ts +0 -4
  83. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  84. package/dist/server/service/database/oracle.service.js +11 -104
  85. package/dist/server/service/database/oracle.service.js.map +1 -1
  86. package/dist/server/service/database/oracle.service.ts +11 -127
  87. package/dist/server/service/database/postgres.service.d.ts +0 -4
  88. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  89. package/dist/server/service/database/postgres.service.js +11 -112
  90. package/dist/server/service/database/postgres.service.js.map +1 -1
  91. package/dist/server/service/database/postgres.service.ts +11 -133
  92. package/dist/server/service/database/sap.service.d.ts +0 -4
  93. package/dist/server/service/database/sap.service.d.ts.map +1 -1
  94. package/dist/server/service/database/sap.service.js +11 -137
  95. package/dist/server/service/database/sap.service.js.map +1 -1
  96. package/dist/server/service/database/sap.service.ts +11 -158
  97. package/dist/server/service/database/sql-type.helper.d.ts.map +1 -1
  98. package/dist/server/service/database/sql-type.helper.js +9 -47
  99. package/dist/server/service/database/sql-type.helper.js.map +1 -1
  100. package/dist/server/service/database/sql-type.helper.ts +11 -53
  101. package/dist/server/service/database/sqlite.service.d.ts +0 -5
  102. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  103. package/dist/server/service/database/sqlite.service.js +11 -147
  104. package/dist/server/service/database/sqlite.service.js.map +1 -1
  105. package/dist/server/service/database/sqlite.service.ts +11 -177
  106. package/package.json +1 -1
  107. 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 Start the project');
353
- console.log(' fdb2 stop Stop the project');
354
- console.log(' fdb2 restart Restart the project');
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
  }