🐛 fix(mongodb): 支持 Mongo shell 快捷查询命令

- 为 show dbs 和 show databases 转换 listDatabases JSON 命令
- 为 show collections 和 show tables 转换 listCollections JSON 命令
- 补充 Mongo shell 快捷命令回归测试并验证前端构建

Fixes #390
This commit is contained in:
Syngnat
2026-04-17 18:56:01 +08:00
parent dca5f629b2
commit 8a1a9a8fb8
2 changed files with 51 additions and 0 deletions

View File

@@ -0,0 +1,19 @@
import { describe, expect, it } from 'vitest';
import { convertMongoShellToJsonCommand } from './mongodb';
describe('convertMongoShellToJsonCommand', () => {
it('converts show dbs shell shortcut to listDatabases command', () => {
expect(convertMongoShellToJsonCommand('show dbs;')).toEqual({
recognized: true,
command: JSON.stringify({ listDatabases: 1, nameOnly: true }),
});
});
it('converts show collections shell shortcut to listCollections command', () => {
expect(convertMongoShellToJsonCommand(' show collections ')).toEqual({
recognized: true,
command: JSON.stringify({ listCollections: 1, filter: {}, nameOnly: true }),
});
});
});

View File

@@ -752,10 +752,42 @@ const buildMongoDeleteCommand = (
return JSON.stringify(command);
};
const convertMongoShellShortcutCommand = (raw: string): ShellConvertResult | null => {
const normalized = String(raw || '')
.replace(/[;]+\s*$/, '')
.trim()
.replace(/\s+/g, ' ')
.toLowerCase();
if (!normalized) {
return null;
}
if (normalized === 'show dbs' || normalized === 'show databases') {
return {
recognized: true,
command: JSON.stringify({ listDatabases: 1, nameOnly: true }),
};
}
if (normalized === 'show collections' || normalized === 'show tables') {
return {
recognized: true,
command: JSON.stringify({ listCollections: 1, filter: {}, nameOnly: true }),
};
}
return null;
};
export const convertMongoShellToJsonCommand = (raw: string): ShellConvertResult => {
let input = String(raw || '').trim();
input = input.replace(/^[\s]*(\/\/[^\n]*\n)+/g, '').trim();
input = input.replace(/[;]+\s*$/, '');
const shortcut = convertMongoShellShortcutCommand(input);
if (shortcut) {
return shortcut;
}
if (!/^db\./i.test(input)) {
return { recognized: false };
}