-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathconfigurationUrlParser.js
114 lines (88 loc) · 2.56 KB
/
configurationUrlParser.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
const url = require('url');
const querystring = require('querystring');
class ConfigurationUrlParser {
constructor() {
this.$driverAliases = {
'mssql': 'sqlsrv',
'mysql2': 'mysql', // RDS
'postgres': 'pgsql',
'postgresql': 'pgsql',
'sqlite3': 'sqlite',
'redis': 'tcp',
'rediss': 'tls',
};
}
parseConfiguration(config) {
if (typeof config === 'string') {
config = { url: config };
}
const $url = config['url'];
if (! $url) {
return config;
}
const urlParts = this.parseUrl(config.url);
const decodedComponents = this.parseStringsToNativeTypes(urlParts);
return {
...config,
...this.getPrimaryOptions(decodedComponents),
...this.getQueryOptions(urlParts),
};
}
getPrimaryOptions(url) {
return {
driver: this.getDriver(url),
database: this.getDatabase(url),
host: url.host || null,
port: url.port || null,
username: url.user || null,
password: url.pass || null,
};
}
getDriver(url) {
const alias = url.protocol && url.protocol.replace(':', '');
if (!alias) {
return null;
}
return this.$driverAliases[alias] || alias;
}
getDatabase(url) {
const path = url.pathname || '';
return path !== '/' ? path.slice(1) : null;
}
getQueryOptions(url) {
const queryString = url.query || '';
if (!queryString) {
return {};
}
const query = querystring.parse(queryString);
return this.parseStringsToNativeTypes(query);
}
parseUrl(url) {
url = url.replace(/^(sqlite3?):\/\//, '$1://null/');
const parsedUrl = new URL(url);
if (!parsedUrl) {
throw new Error('The database configuration URL is malformed.');
}
return parsedUrl;
}
parseStringsToNativeTypes(value) {
if (Array.isArray(value)) {
return value.map(v => this.parseStringsToNativeTypes(v));
}
if (typeof value !== 'string') {
return value;
}
try {
return JSON.parse(value);
} catch (error) {
return value;
}
}
get$DriverAliases() {
return this.$driverAliases;
}
addDriverAlias(alias, driver) {
this.$driverAliases[alias] = driver;
}
}
module.exports = ConfigurationUrlParser;