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;
|