@bytebase/dbhub
Version:
Token-efficient database MCP server for PostgreSQL, MySQL, MariaDB, SQL Server, Oracle, SQLite
50 lines (48 loc) • 1.52 kB
JavaScript
// src/utils/module-loader.ts
var MISSING_MODULE_RE = /Cannot find (?:package|module) '([^']+)'/;
function isDriverNotInstalled(err, driver) {
if (!(err instanceof Error) || !("code" in err) || err.code !== "ERR_MODULE_NOT_FOUND") {
return false;
}
const match = err.message.match(MISSING_MODULE_RE);
if (!match) {
return false;
}
const missingSpecifier = match[1];
return missingSpecifier === driver || missingSpecifier.startsWith(`${driver}/`);
}
function isModuleNotFound(err) {
if (!(err instanceof Error) || !("code" in err)) {
return false;
}
const code = err.code;
return code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND";
}
async function loadConnectors(connectorModules) {
await Promise.all(
connectorModules.map(async ({ load, name, driver }) => {
try {
await load();
} catch (err) {
if (isDriverNotInstalled(err, driver)) {
console.error(
`Skipping ${name} connector: driver package "${driver}" not installed.`
);
} else if (isModuleNotFound(err)) {
const msg = err instanceof Error ? err.message : String(err);
const match = msg.match(MISSING_MODULE_RE);
const missing = match ? match[1] : "unknown";
console.error(
`Skipping ${name} connector: required dependency "${missing}" not installed.`
);
} else {
throw err;
}
}
})
);
}
export {
isDriverNotInstalled,
loadConnectors
};