diff --git a/lib/dialects/index.js b/lib/dialects/index.js new file mode 100644 index 0000000000..4f2b3ae8c8 --- /dev/null +++ b/lib/dialects/index.js @@ -0,0 +1,35 @@ +const { resolveClientNameWithAliases } = require('../util/helpers'); + +const dbNameToDialectLoader = Object.freeze({ + 'better-sqlite3': () => require('./better-sqlite3'), + cockroachdb: () => require('./cockroachdb'), + mssql: () => require('./mssql'), + mysql: () => require('./mysql'), + mysql2: () => require('./mysql2'), + oracle: () => require('./oracle'), + oracledb: () => require('./oracledb'), + pgnative: () => require('./pgnative'), + postgres: () => require('./postgres'), + redshift: () => require('./redshift'), + sqlite3: () => require('./sqlite3'), +}); + +/** + * Gets the Dialect object with the given client name or throw an + * error if not found. + * + * NOTE: This is a replacement for prior practice of doing dynamic + * string construction for imports of Dialect objects. + */ +function getDialectByNameOrAlias(clientName) { + const resolvedClientName = resolveClientNameWithAliases(clientName); + const dialectLoader = dbNameToDialectLoader[resolvedClientName]; + if (!dialectLoader) { + throw new Error(`Invalid clientName given: ${clientName}`); + } + return dialectLoader(); +} + +module.exports = { + getDialectByNameOrAlias, +}; diff --git a/lib/knex-builder/internal/config-resolver.js b/lib/knex-builder/internal/config-resolver.js index dc2f322653..a8ad65774d 100644 --- a/lib/knex-builder/internal/config-resolver.js +++ b/lib/knex-builder/internal/config-resolver.js @@ -2,7 +2,7 @@ const Client = require('../../client'); const { SUPPORTED_CLIENTS } = require('../../constants'); const parseConnection = require('./parse-connection'); -const { resolveClientNameWithAliases } = require('../../util/helpers'); +const { getDialectByNameOrAlias } = require('../../dialects'); function resolveConfig(config) { let Dialect; @@ -34,8 +34,7 @@ function resolveConfig(config) { ); } - const resolvedClientName = resolveClientNameWithAliases(clientName); - Dialect = require(`../../dialects/${resolvedClientName}/index.js`); + Dialect = getDialectByNameOrAlias(clientName); } // If config connection parameter is passed as string, try to parse it