/
connection.js
64 lines (52 loc) 路 1.47 KB
/
connection.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* eslint-disable import/no-extraneous-dependencies */
'use strict';
const knex = require('knex');
const SqliteClient = require('knex/lib/dialects/sqlite3/index');
const trySqlitePackage = (packageName) => {
try {
require.resolve(packageName);
return packageName;
} catch (error) {
if (error.code === 'MODULE_NOT_FOUND') {
return false;
}
throw error;
}
};
class LegacySqliteClient extends SqliteClient {
_driver() {
return require('sqlite3');
}
}
const clientMap = {
'better-sqlite3': 'better-sqlite3',
'@vscode/sqlite3': 'sqlite',
sqlite3: LegacySqliteClient,
};
const getSqlitePackageName = () => {
// NOTE: allow forcing the package to use (mostly used for testing purposes)
if (typeof process.env.SQLITE_PKG !== 'undefined') {
return process.env.SQLITE_PKG;
}
// NOTE: this tries to find the best sqlite module possible to use
// while keeping retro compatibility
return (
trySqlitePackage('better-sqlite3') ||
trySqlitePackage('@vscode/sqlite3') ||
trySqlitePackage('sqlite3')
);
};
const createConnection = (config) => {
const knexConfig = { ...config };
if (knexConfig.client === 'sqlite') {
const sqlitePackageName = getSqlitePackageName();
knexConfig.client = clientMap[sqlitePackageName];
}
const knexInstance = knex(knexConfig);
return Object.assign(knexInstance, {
getSchemaName() {
return this.client.connectionSettings.schema;
},
});
};
module.exports = createConnection;