| 
									
										
										
										
											2022-03-23 10:37:12 +01:00
										 |  |  | /* eslint-disable node/no-missing-require */ | 
					
						
							|  |  |  | /* eslint-disable node/no-extraneous-require */ | 
					
						
							|  |  |  | '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; |