strapi/packages/core/database/lib/connection.js

66 lines
1.5 KiB
JavaScript
Raw Normal View History

2022-03-23 10:37:12 +01:00
/* eslint-disable node/no-missing-require */
/* eslint-disable node/no-extraneous-require */
2022-08-08 15:50:34 +02:00
2022-03-23 10:37:12 +01:00
'use strict';
const knex = require('knex');
const SqliteClient = require('knex/lib/dialects/sqlite3/index');
2022-03-25 09:02:19 +01:00
const trySqlitePackage = packageName => {
2022-03-23 10:37:12 +01:00
try {
2022-03-25 09:02:19 +01:00
require.resolve(packageName);
return packageName;
2022-03-23 10:37:12 +01:00
} catch (error) {
if (error.code === 'MODULE_NOT_FOUND') {
return false;
}
throw error;
}
};
2022-03-25 09:02:19 +01:00
class LegacySqliteClient extends SqliteClient {
_driver() {
return require('sqlite3');
2022-03-23 10:37:12 +01:00
}
2022-03-25 09:02:19 +01:00
}
2022-03-23 10:37:12 +01:00
2022-03-25 09:02:19 +01:00
const clientMap = {
'better-sqlite3': 'better-sqlite3',
'@vscode/sqlite3': 'sqlite',
sqlite3: LegacySqliteClient,
};
2022-03-23 10:37:12 +01:00
2022-03-25 09:02:19 +01:00
const getSqlitePackageName = () => {
// NOTE: allow forcing the package to use (mostly used for testing purposes)
2022-03-28 19:24:02 +02:00
if (typeof process.env.SQLITE_PKG !== 'undefined') {
2022-03-25 09:02:19 +01:00
return process.env.SQLITE_PKG;
2022-03-23 10:37:12 +01:00
}
2022-03-25 09:02:19 +01:00
// NOTE: this tries to find the best sqlite module possible to use
2022-03-28 19:24:02 +02:00
// while keeping retro compatibility
2022-03-25 09:02:19 +01:00
return (
trySqlitePackage('better-sqlite3') ||
trySqlitePackage('@vscode/sqlite3') ||
trySqlitePackage('sqlite3')
);
2022-03-23 10:37:12 +01:00
};
const createConnection = config => {
const knexConfig = { ...config };
if (knexConfig.client === 'sqlite') {
2022-03-25 09:02:19 +01:00
const sqlitePackageName = getSqlitePackageName();
knexConfig.client = clientMap[sqlitePackageName];
2022-03-23 10:37:12 +01:00
}
const knexInstance = knex(knexConfig);
return Object.assign(knexInstance, {
getSchemaName() {
return this.client.connectionSettings.schema;
},
});
};
module.exports = createConnection;