@forestadmin/datasource-sql 1.2.9 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connection/index.d.ts +6 -0
- package/dist/connection/index.js +75 -0
- package/dist/connection/preprocess.d.ts +11 -0
- package/dist/connection/preprocess.js +50 -0
- package/dist/connection/utils.d.ts +9 -0
- package/dist/connection/utils.js +63 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -24
- package/dist/introspection/helpers/sql-type-converter.js +3 -2
- package/dist/introspection/introspector.js +3 -28
- package/dist/types.d.ts +5 -2
- package/package.json +1 -1
- package/dist/introspection/errors.d.ts +0 -25
- package/dist/introspection/errors.js +0 -53
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ConnectionOptions } from '../types';
|
|
2
|
+
import type { Logger } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
import { Sequelize } from 'sequelize';
|
|
4
|
+
/** Attempt to connect to the database */
|
|
5
|
+
export default function connect(uriOrOptions: ConnectionOptions, logger?: Logger): Promise<Sequelize>;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const sequelize_1 = require("sequelize");
|
|
7
|
+
const preprocess_1 = __importDefault(require("./preprocess"));
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
function getSslConfiguration(dialect, sslMode, logger) {
|
|
10
|
+
switch (dialect) {
|
|
11
|
+
case 'mariadb':
|
|
12
|
+
if (sslMode === 'disabled')
|
|
13
|
+
return { ssl: false };
|
|
14
|
+
if (sslMode === 'required')
|
|
15
|
+
return { ssl: { rejectUnauthorized: false } };
|
|
16
|
+
if (sslMode === 'verify')
|
|
17
|
+
return { ssl: true };
|
|
18
|
+
break;
|
|
19
|
+
case 'mssql':
|
|
20
|
+
if (sslMode === 'disabled')
|
|
21
|
+
return { options: { encrypt: false } };
|
|
22
|
+
if (sslMode === 'required')
|
|
23
|
+
return { options: { encrypt: true, trustServerCertificate: true } };
|
|
24
|
+
if (sslMode === 'verify')
|
|
25
|
+
return { options: { encrypt: true, trustServerCertificate: false } };
|
|
26
|
+
break;
|
|
27
|
+
case 'mysql':
|
|
28
|
+
if (sslMode === 'disabled')
|
|
29
|
+
return { ssl: false };
|
|
30
|
+
if (sslMode === 'required')
|
|
31
|
+
return { ssl: { rejectUnauthorized: false } };
|
|
32
|
+
if (sslMode === 'verify')
|
|
33
|
+
return { ssl: { rejectUnauthorized: true } };
|
|
34
|
+
break;
|
|
35
|
+
case 'postgres':
|
|
36
|
+
if (sslMode === 'disabled')
|
|
37
|
+
return { ssl: false };
|
|
38
|
+
if (sslMode === 'required')
|
|
39
|
+
return { ssl: { require: true, rejectUnauthorized: false } };
|
|
40
|
+
if (sslMode === 'verify')
|
|
41
|
+
return { ssl: { require: true, rejectUnauthorized: true } };
|
|
42
|
+
break;
|
|
43
|
+
case 'db2':
|
|
44
|
+
case 'oracle':
|
|
45
|
+
case 'snowflake':
|
|
46
|
+
case 'sqlite':
|
|
47
|
+
default:
|
|
48
|
+
if (sslMode && sslMode !== 'manual') {
|
|
49
|
+
logger?.('Warn', `ignoring sslMode=${sslMode} (not supported for ${dialect})`);
|
|
50
|
+
}
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Attempt to connect to the database */
|
|
55
|
+
async function connect(uriOrOptions, logger) {
|
|
56
|
+
try {
|
|
57
|
+
const { uri, sslMode, ...opts } = await (0, preprocess_1.default)(uriOrOptions);
|
|
58
|
+
const schema = opts.schema ?? (0, utils_1.getSchema)(uri);
|
|
59
|
+
const logging = logger ? (0, utils_1.getLogger)(logger) : false;
|
|
60
|
+
opts.dialectOptions = {
|
|
61
|
+
...(opts.dialectOptions ?? {}),
|
|
62
|
+
...getSslConfiguration(opts.dialect, sslMode, logger),
|
|
63
|
+
};
|
|
64
|
+
const sequelize = uri
|
|
65
|
+
? new sequelize_1.Sequelize(uri, { ...opts, schema, logging })
|
|
66
|
+
: new sequelize_1.Sequelize({ ...opts, schema, logging });
|
|
67
|
+
await sequelize.authenticate(); // Test connection
|
|
68
|
+
return sequelize;
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
(0, utils_1.handleSequelizeError)(e);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.default = connect;
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29ubmVjdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLHlDQUErQztBQUUvQyw4REFBNkM7QUFDN0MsbUNBQXFFO0FBRXJFLFNBQVMsbUJBQW1CLENBQzFCLE9BQWdCLEVBQ2hCLE9BQWdCLEVBQ2hCLE1BQWU7SUFFZixRQUFRLE9BQU8sRUFBRTtRQUNmLEtBQUssU0FBUztZQUNaLElBQUksT0FBTyxLQUFLLFVBQVU7Z0JBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNsRCxJQUFJLE9BQU8sS0FBSyxVQUFVO2dCQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzFFLElBQUksT0FBTyxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMvQyxNQUFNO1FBRVIsS0FBSyxPQUFPO1lBQ1YsSUFBSSxPQUFPLEtBQUssVUFBVTtnQkFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbkUsSUFBSSxPQUFPLEtBQUssVUFBVTtnQkFDeEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN0RSxJQUFJLE9BQU8sS0FBSyxRQUFRO2dCQUN0QixPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3ZFLE1BQU07UUFFUixLQUFLLE9BQU87WUFDVixJQUFJLE9BQU8sS0FBSyxVQUFVO2dCQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDbEQsSUFB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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ConnectionOptions, ConnectionOptionsObj } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Preprocess connection options.
|
|
4
|
+
* Allows to speed up the connection process by avoiding attempts to connect to the database.
|
|
5
|
+
*
|
|
6
|
+
* It ensures that
|
|
7
|
+
* - both sslMode and dialect are set
|
|
8
|
+
* - the automatic 'preferred' sslMode is resolved to the most appropriate value
|
|
9
|
+
*/
|
|
10
|
+
export default function preprocessOptions(uriOrOptions: ConnectionOptions): Promise<ConnectionOptionsObj>;
|
|
11
|
+
//# sourceMappingURL=preprocess.d.ts.map
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const index_1 = __importDefault(require("./index"));
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
async function resolveSslMode(uriOrOptions) {
|
|
9
|
+
// Try to connect with the different sslModes in order of preference
|
|
10
|
+
if (uriOrOptions.sslMode === 'preferred') {
|
|
11
|
+
// When NODE_TLS_REJECT_UNAUTHORIZED is set to 0, we skip the 'verify' mode, as we know it will
|
|
12
|
+
// always work locally, but not when deploying to another environment.
|
|
13
|
+
const modes = ['verify', 'required', 'disabled'];
|
|
14
|
+
if (process.env.NODE_TLS_REJECT_UNAUTHORIZED === '0')
|
|
15
|
+
modes.shift();
|
|
16
|
+
let error;
|
|
17
|
+
for (const sslMode of modes) {
|
|
18
|
+
try {
|
|
19
|
+
// eslint-disable-next-line no-await-in-loop
|
|
20
|
+
const sequelize = await (0, index_1.default)({ ...uriOrOptions, sslMode });
|
|
21
|
+
await sequelize.close(); // eslint-disable-line no-await-in-loop
|
|
22
|
+
return sslMode;
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
error = e;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
return uriOrOptions.sslMode ?? 'manual';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Preprocess connection options.
|
|
34
|
+
* Allows to speed up the connection process by avoiding attempts to connect to the database.
|
|
35
|
+
*
|
|
36
|
+
* It ensures that
|
|
37
|
+
* - both sslMode and dialect are set
|
|
38
|
+
* - the automatic 'preferred' sslMode is resolved to the most appropriate value
|
|
39
|
+
*/
|
|
40
|
+
async function preprocessOptions(uriOrOptions) {
|
|
41
|
+
// Extract sanitized dialect and uri from the connection options
|
|
42
|
+
const dialect = (0, utils_1.getDialect)(uriOrOptions);
|
|
43
|
+
const uri = (0, utils_1.getUri)(uriOrOptions, dialect);
|
|
44
|
+
// Create a new object with the sanitized dialect and uri and resolve the sslMode
|
|
45
|
+
const obj = typeof uriOrOptions === 'string' ? { uri, dialect } : { ...uriOrOptions, uri, dialect };
|
|
46
|
+
const sslMode = await resolveSslMode(obj);
|
|
47
|
+
return { ...obj, sslMode };
|
|
48
|
+
}
|
|
49
|
+
exports.default = preprocessOptions;
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25uZWN0aW9uL3ByZXByb2Nlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxvREFBOEI7QUFDOUIsbUNBQTZDO0FBRTdDLEtBQUssVUFBVSxjQUFjLENBQUMsWUFBa0M7SUFDOUQsb0VBQW9FO0lBQ3BFLElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxXQUFXLEVBQUU7UUFDeEMsK0ZBQStGO1FBQy9GLHNFQUFzRTtRQUN0RSxNQUFNLEtBQUssR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFjLENBQUM7UUFDOUQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixLQUFLLEdBQUc7WUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFcEUsSUFBSSxLQUFZLENBQUM7UUFFakIsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLEVBQUU7WUFDM0IsSUFBSTtnQkFDRiw0Q0FBNEM7Z0JBQzVDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSxlQUFPLEVBQUMsRUFBRSxHQUFHLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLHVDQUF1QztnQkFFaEUsT0FBTyxPQUFPLENBQUM7YUFDaEI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixLQUFLLEdBQUcsQ0FBQyxDQUFDO2FBQ1g7U0FDRjtRQUVELE1BQU0sS0FBSyxDQUFDO0tBQ2I7SUFFRCxPQUFPLFlBQVksQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDO0FBQzFDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ1ksS0FBSyxVQUFVLGlCQUFpQixDQUM3QyxZQUErQjtJQUUvQixnRUFBZ0U7SUFDaEUsTUFBTSxPQUFPLEdBQUcsSUFBQSxrQkFBVSxFQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUEsY0FBTSxFQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUUxQyxpRkFBaUY7SUFDakYsTUFBTSxHQUFHLEdBQ1AsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFlBQVksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDMUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFMUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzdCLENBQUM7QUFiRCxvQ0FhQyJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConnectionOptions } from '../types';
|
|
2
|
+
import type { Logger } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
import { Dialect } from 'sequelize';
|
|
4
|
+
export declare function getUri(uriOrOptions: ConnectionOptions, dialect: Dialect): string | null;
|
|
5
|
+
export declare function getDialect(uriOrOptions: ConnectionOptions): Dialect;
|
|
6
|
+
export declare function getSchema(uri: string): string;
|
|
7
|
+
export declare function getLogger(logger: Logger): (sql: string) => void;
|
|
8
|
+
export declare function handleSequelizeError(error: Error): void;
|
|
9
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleSequelizeError = exports.getLogger = exports.getSchema = exports.getDialect = exports.getUri = void 0;
|
|
4
|
+
const sequelize_1 = require("sequelize");
|
|
5
|
+
function checkUri(uri) {
|
|
6
|
+
if (!/.*:\/\//g.test(uri) && uri !== 'sqlite::memory:') {
|
|
7
|
+
throw new Error(`Connection Uri "${uri}" provided to SQL data source is not valid.` +
|
|
8
|
+
' Should be <dialect>://<connection>.');
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function getUri(uriOrOptions, dialect) {
|
|
12
|
+
const uri = typeof uriOrOptions === 'string' ? uriOrOptions : uriOrOptions.uri;
|
|
13
|
+
if (uri) {
|
|
14
|
+
checkUri(uri);
|
|
15
|
+
const url = new URL(uri);
|
|
16
|
+
url.protocol = dialect;
|
|
17
|
+
return url.toString();
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
exports.getUri = getUri;
|
|
22
|
+
function getDialect(uriOrOptions) {
|
|
23
|
+
let dialect;
|
|
24
|
+
if (typeof uriOrOptions !== 'string' && uriOrOptions.dialect) {
|
|
25
|
+
dialect = uriOrOptions.dialect;
|
|
26
|
+
}
|
|
27
|
+
else if (typeof uriOrOptions === 'string' || uriOrOptions.uri) {
|
|
28
|
+
const uri = typeof uriOrOptions === 'string' ? uriOrOptions : uriOrOptions.uri;
|
|
29
|
+
checkUri(uri);
|
|
30
|
+
dialect = new URL(uri).protocol.slice(0, -1);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
throw new Error('Expected dialect to be provided in options or uri.');
|
|
34
|
+
}
|
|
35
|
+
if (dialect === 'mysql2')
|
|
36
|
+
return 'mysql';
|
|
37
|
+
if (dialect === 'tedious')
|
|
38
|
+
return 'mssql';
|
|
39
|
+
if (dialect === 'pg' || dialect === 'postgresql')
|
|
40
|
+
return 'postgres';
|
|
41
|
+
return dialect;
|
|
42
|
+
}
|
|
43
|
+
exports.getDialect = getDialect;
|
|
44
|
+
function getSchema(uri) {
|
|
45
|
+
return uri ? new URL(uri).searchParams.get('schema') : null;
|
|
46
|
+
}
|
|
47
|
+
exports.getSchema = getSchema;
|
|
48
|
+
function getLogger(logger) {
|
|
49
|
+
return (sql) => logger?.('Debug', sql.substring(sql.indexOf(':') + 2));
|
|
50
|
+
}
|
|
51
|
+
exports.getLogger = getLogger;
|
|
52
|
+
function handleSequelizeError(error) {
|
|
53
|
+
if (error instanceof sequelize_1.BaseError) {
|
|
54
|
+
const nameWithoutSequelize = error.name.replace('Sequelize', '');
|
|
55
|
+
const nameWithSpaces = nameWithoutSequelize.replace(/([a-z])([A-Z])/g, (_, m1, m2) => `${m1} ${m2.toLowerCase()}`);
|
|
56
|
+
const newError = new Error(`${nameWithSpaces}: ${error.message}`);
|
|
57
|
+
newError.name = nameWithoutSequelize;
|
|
58
|
+
throw newError;
|
|
59
|
+
}
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
exports.handleSequelizeError = handleSequelizeError;
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29ubmVjdGlvbi91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSx5Q0FBK0M7QUFFL0MsU0FBUyxRQUFRLENBQUMsR0FBVztJQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssaUJBQWlCLEVBQUU7UUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FDYixtQkFBbUIsR0FBRyw2Q0FBNkM7WUFDakUsc0NBQXNDLENBQ3pDLENBQUM7S0FDSDtBQUNILENBQUM7QUFFRCxTQUFnQixNQUFNLENBQUMsWUFBK0IsRUFBRSxPQUFnQjtJQUN0RSxNQUFNLEdBQUcsR0FBRyxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztJQUUvRSxJQUFJLEdBQUcsRUFBRTtRQUNQLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVkLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBRXZCLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3ZCO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBYkQsd0JBYUM7QUFFRCxTQUFnQixVQUFVLENBQUMsWUFBK0I7SUFDeEQsSUFBSSxPQUFlLENBQUM7SUFFcEIsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRTtRQUM1RCxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQztLQUNoQztTQUFNLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUU7UUFDL0QsTUFBTSxHQUFHLEdBQUcsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7UUFDL0UsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWQsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDOUM7U0FBTTtRQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztLQUN2RTtJQUVELElBQUksT0FBTyxLQUFLLFFBQVE7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUN6QyxJQUFJLE9BQU8sS0FBSyxTQUFTO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDMUMsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxZQUFZO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFFcEUsT0FBTyxPQUFrQixDQUFDO0FBQzVCLENBQUM7QUFuQkQsZ0NBbUJDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLEdBQVc7SUFDbkMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM5RCxDQUFDO0FBRkQsOEJBRUM7QUFFRCxTQUFnQixTQUFTLENBQUMsTUFBYztJQUN0QyxPQUFPLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakYsQ0FBQztBQUZELDhCQUVDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsS0FBWTtJQUMvQyxJQUFJLEtBQUssWUFBWSxxQkFBUyxFQUFFO1FBQzlCLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FDakQsaUJBQWlCLEVBQ2pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUMzQyxDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxjQUFjLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbEUsUUFBUSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztRQUVyQyxNQUFNLFFBQVEsQ0FBQztLQUNoQjtJQUVELE1BQU0sS0FBSyxDQUFDO0FBQ2QsQ0FBQztBQWZELG9EQWVDIn0=
|
package/dist/index.d.ts
CHANGED
|
@@ -8,4 +8,5 @@ export declare function createSqlDataSource(uriOrOptions: ConnectionOptions, opt
|
|
|
8
8
|
introspection: Table[];
|
|
9
9
|
}): DataSourceFactory;
|
|
10
10
|
export type { ConnectionOptions, Table };
|
|
11
|
+
export { default as preprocessOptions } from './connection/preprocess';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -3,40 +3,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createSqlDataSource = exports.buildSequelizeInstance = exports.introspect = void 0;
|
|
6
|
+
exports.preprocessOptions = exports.createSqlDataSource = exports.buildSequelizeInstance = exports.introspect = void 0;
|
|
7
7
|
const datasource_sequelize_1 = require("@forestadmin/datasource-sequelize");
|
|
8
|
-
const
|
|
8
|
+
const connection_1 = __importDefault(require("./connection"));
|
|
9
9
|
const introspector_1 = __importDefault(require("./introspection/introspector"));
|
|
10
10
|
const model_1 = __importDefault(require("./orm-builder/model"));
|
|
11
11
|
const relations_1 = __importDefault(require("./orm-builder/relations"));
|
|
12
|
-
function createEmptySequelize(uriOrOptions, logger) {
|
|
13
|
-
if (typeof uriOrOptions === 'string' && !/.*:\/\//g.test(uriOrOptions))
|
|
14
|
-
throw new Error(`Connection Uri "${uriOrOptions}" provided to SQL data source is not valid.` +
|
|
15
|
-
' Should be <dialect>://<connection>.');
|
|
16
|
-
const logging = (sql) => logger?.('Debug', sql.substring(sql.indexOf(':') + 2));
|
|
17
|
-
const getSchema = (uri) => new URL(uri).searchParams.get('schema');
|
|
18
|
-
let sequelize;
|
|
19
|
-
if (typeof uriOrOptions === 'string') {
|
|
20
|
-
sequelize = new sequelize_1.Sequelize(uriOrOptions, { schema: getSchema(uriOrOptions), logging });
|
|
21
|
-
}
|
|
22
|
-
else if (uriOrOptions.uri) {
|
|
23
|
-
const { uri, ...options } = uriOrOptions;
|
|
24
|
-
sequelize = new sequelize_1.Sequelize(uri, { ...options, schema: getSchema(uri), logging });
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
sequelize = new sequelize_1.Sequelize({ ...uriOrOptions, logging });
|
|
28
|
-
}
|
|
29
|
-
return sequelize;
|
|
30
|
-
}
|
|
31
12
|
async function introspect(uriOrOptions, logger) {
|
|
32
|
-
const sequelize =
|
|
13
|
+
const sequelize = await (0, connection_1.default)(uriOrOptions, logger);
|
|
33
14
|
const tables = await introspector_1.default.introspect(sequelize, logger);
|
|
34
15
|
await sequelize.close();
|
|
35
16
|
return tables;
|
|
36
17
|
}
|
|
37
18
|
exports.introspect = introspect;
|
|
38
19
|
async function buildSequelizeInstance(uriOrOptions, logger, introspection) {
|
|
39
|
-
const sequelize =
|
|
20
|
+
const sequelize = await (0, connection_1.default)(uriOrOptions, logger);
|
|
40
21
|
const tables = introspection ?? (await introspector_1.default.introspect(sequelize, logger));
|
|
41
22
|
model_1.default.defineModels(sequelize, logger, tables);
|
|
42
23
|
relations_1.default.defineRelations(sequelize, logger, tables);
|
|
@@ -50,4 +31,6 @@ function createSqlDataSource(uriOrOptions, options) {
|
|
|
50
31
|
};
|
|
51
32
|
}
|
|
52
33
|
exports.createSqlDataSource = createSqlDataSource;
|
|
53
|
-
|
|
34
|
+
var preprocess_1 = require("./connection/preprocess");
|
|
35
|
+
Object.defineProperty(exports, "preprocessOptions", { enumerable: true, get: function () { return __importDefault(preprocess_1).default; } });
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBSUEsNEVBQXdFO0FBR3hFLDhEQUFtQztBQUNuQyxnRkFBd0Q7QUFDeEQsZ0VBQStDO0FBQy9DLHdFQUFzRDtBQUUvQyxLQUFLLFVBQVUsVUFBVSxDQUM5QixZQUErQixFQUMvQixNQUFlO0lBRWYsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFBLG9CQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRXhCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFURCxnQ0FTQztBQUVNLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsWUFBK0IsRUFDL0IsTUFBYyxFQUNkLGFBQXVCO0lBRXZCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSxvQkFBTyxFQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRyxhQUFhLElBQUksQ0FBQyxNQUFNLHNCQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRW5GLGVBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRCxtQkFBZSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFaRCx3REFZQztBQUVELFNBQWdCLG1CQUFtQixDQUNqQyxZQUErQixFQUMvQixPQUFvQztJQUVwQyxPQUFPLEtBQUssRUFBRSxNQUFjLEVBQUUsRUFBRTtRQUM5QixNQUFNLFNBQVMsR0FBRyxNQUFNLHNCQUFzQixDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRTdGLE9BQU8sSUFBSSwwQ0FBbUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVRELGtEQVNDO0FBR0Qsc0RBQXVFO0FBQTlELGdJQUFBLE9BQU8sT0FBcUIifQ==
|
|
@@ -76,8 +76,9 @@ class SqlTypeConverter {
|
|
|
76
76
|
switch (type.toUpperCase()) {
|
|
77
77
|
case 'JSON':
|
|
78
78
|
return 'JSON';
|
|
79
|
+
case 'BIT(1)': // In MySQL / MariaDB / Postgres, BIT(N) is used for bitmasks
|
|
79
80
|
case 'TINYINT(1)': // MYSQL bool
|
|
80
|
-
case 'BIT': //
|
|
81
|
+
case 'BIT': // MSSQL type.
|
|
81
82
|
case 'BOOLEAN':
|
|
82
83
|
return 'BOOLEAN';
|
|
83
84
|
case 'CHARACTER VARYING':
|
|
@@ -137,4 +138,4 @@ class SqlTypeConverter {
|
|
|
137
138
|
}
|
|
138
139
|
exports.default = SqlTypeConverter;
|
|
139
140
|
SqlTypeConverter.enumRegex = /ENUM\((.*)\)/i;
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLXR5cGUtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaGVscGVycy9zcWwtdHlwZS1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBcUU7QUFJckUsTUFBcUIsZ0JBQWdCO0lBSW5DLFlBQVksU0FBb0I7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsU0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsVUFBNkI7UUFFN0IsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRWxELEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztnQkFDOUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXRDO2dCQUNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUN4RCxXQUFXLENBQUMsVUFBNkI7UUFDL0MsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUN0QyxnQkFBZ0I7WUFDaEIsT0FBTyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUM5QyxDQUFDLENBQUMsMERBQTBEO29C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
|
|
@@ -3,37 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const errors_1 = require("./errors");
|
|
7
6
|
const default_value_parser_1 = __importDefault(require("./helpers/default-value-parser"));
|
|
8
7
|
const sql_type_converter_1 = __importDefault(require("./helpers/sql-type-converter"));
|
|
9
8
|
class Introspector {
|
|
10
9
|
static async introspect(sequelize, logger) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return await Promise.all(tableNames.map(name => this.getTable(sequelize, logger, name)));
|
|
14
|
-
}
|
|
15
|
-
catch (e) {
|
|
16
|
-
switch (e.name) {
|
|
17
|
-
case 'SequelizeConnectionError':
|
|
18
|
-
throw new errors_1.ConnectionError(e.message);
|
|
19
|
-
case 'SequelizeHostNotFoundError':
|
|
20
|
-
throw new errors_1.HostNotFoundError(e.message);
|
|
21
|
-
case 'SequelizeConnectionRefusedError':
|
|
22
|
-
throw new errors_1.ConnectionRefusedError(e.message);
|
|
23
|
-
case 'SequelizeHostNotReachableError':
|
|
24
|
-
throw new errors_1.HostNotReachableError(e.message);
|
|
25
|
-
case 'SequelizeAccessDeniedError':
|
|
26
|
-
throw new errors_1.AccessDeniedError(e.message);
|
|
27
|
-
case 'SequelizeConnectionAcquireTimeoutError':
|
|
28
|
-
throw new errors_1.ConnectionAcquireTimeoutError(e.message);
|
|
29
|
-
case 'SequelizeConnectionTimedOutError':
|
|
30
|
-
throw new errors_1.ConnectionTimedOutError(e.message);
|
|
31
|
-
case 'SequelizeInvalidConnectionError':
|
|
32
|
-
throw new errors_1.InvalidConnectionError(e.message);
|
|
33
|
-
default:
|
|
34
|
-
throw new errors_1.ConnectionError(e.message);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
10
|
+
const tableNames = await this.getTableNames(sequelize);
|
|
11
|
+
return Promise.all(tableNames.map(name => this.getTable(sequelize, logger, name)));
|
|
37
12
|
}
|
|
38
13
|
/** Get names of all tables in the public schema of the db */
|
|
39
14
|
static async getTableNames(sequelize) {
|
|
@@ -96,4 +71,4 @@ class Introspector {
|
|
|
96
71
|
}
|
|
97
72
|
}
|
|
98
73
|
exports.default = Introspector;
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50cm9zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vaW50cm9zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0EsMEZBQWdFO0FBQ2hFLHNGQUE0RDtBQUc1RCxNQUFxQixZQUFZO0lBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQW9CLEVBQUUsTUFBZTtRQUMzRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdkQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCw2REFBNkQ7SUFDckQsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBb0I7UUFDckQsTUFBTSxLQUFLLEdBQXVDLE1BQU0sU0FBUzthQUM5RCxpQkFBaUIsRUFBRTthQUNuQixhQUFhLEVBQUUsQ0FBQztRQUVuQixvREFBb0Q7UUFDcEQsNkVBQTZFO1FBQzdFLG9EQUFvRDtRQUNwRCwyRkFBMkY7UUFDM0YsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVELGlDQUFpQztJQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDM0IsU0FBb0IsRUFDcEIsTUFBYyxFQUNkLFNBQWlCO1FBRWpCLDBFQUEwRTtRQUMxRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLGVBQWUs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
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { Options } from 'sequelize/types';
|
|
2
|
-
export type
|
|
2
|
+
export type ConnectionOptionsObj = {
|
|
3
3
|
uri?: string;
|
|
4
|
-
|
|
4
|
+
sslMode?: SslMode;
|
|
5
|
+
} & Pick<Options, 'database' | 'dialect' | 'dialectModule' | 'dialectModulePath' | 'dialectOptions' | 'host' | 'minifyAliases' | 'native' | 'password' | 'pool' | 'port' | 'protocol' | 'replication' | 'schema' | 'ssl' | 'storage' | 'username'>;
|
|
6
|
+
export type ConnectionOptions = ConnectionOptionsObj | string;
|
|
7
|
+
export type SslMode = 'preferred' | 'disabled' | 'required' | 'verify' | 'manual';
|
|
5
8
|
//# sourceMappingURL=types.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export declare class ConnectionError extends Error {
|
|
2
|
-
constructor(message: string);
|
|
3
|
-
}
|
|
4
|
-
export declare class HostNotFoundError extends Error {
|
|
5
|
-
constructor(message: string);
|
|
6
|
-
}
|
|
7
|
-
export declare class ConnectionRefusedError extends Error {
|
|
8
|
-
constructor(message: string);
|
|
9
|
-
}
|
|
10
|
-
export declare class HostNotReachableError extends Error {
|
|
11
|
-
constructor(message: string);
|
|
12
|
-
}
|
|
13
|
-
export declare class AccessDeniedError extends Error {
|
|
14
|
-
constructor(message: string);
|
|
15
|
-
}
|
|
16
|
-
export declare class InvalidConnectionError extends Error {
|
|
17
|
-
constructor(message: string);
|
|
18
|
-
}
|
|
19
|
-
export declare class ConnectionAcquireTimeoutError extends Error {
|
|
20
|
-
constructor(message: string);
|
|
21
|
-
}
|
|
22
|
-
export declare class ConnectionTimedOutError extends Error {
|
|
23
|
-
constructor(message: string);
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ConnectionTimedOutError = exports.ConnectionAcquireTimeoutError = exports.InvalidConnectionError = exports.AccessDeniedError = exports.HostNotReachableError = exports.ConnectionRefusedError = exports.HostNotFoundError = exports.ConnectionError = void 0;
|
|
4
|
-
// eslint-disable-next-line max-classes-per-file
|
|
5
|
-
class ConnectionError extends Error {
|
|
6
|
-
constructor(message) {
|
|
7
|
-
super(`Connection error: ${message}`);
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
exports.ConnectionError = ConnectionError;
|
|
11
|
-
class HostNotFoundError extends Error {
|
|
12
|
-
constructor(message) {
|
|
13
|
-
super(`Host not found error: ${message}`);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
exports.HostNotFoundError = HostNotFoundError;
|
|
17
|
-
class ConnectionRefusedError extends Error {
|
|
18
|
-
constructor(message) {
|
|
19
|
-
super(`Connection refused error: ${message}`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
exports.ConnectionRefusedError = ConnectionRefusedError;
|
|
23
|
-
class HostNotReachableError extends Error {
|
|
24
|
-
constructor(message) {
|
|
25
|
-
super(`Host not reachable: ${message}`);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
exports.HostNotReachableError = HostNotReachableError;
|
|
29
|
-
class AccessDeniedError extends Error {
|
|
30
|
-
constructor(message) {
|
|
31
|
-
super(`Access denied: ${message}`);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
exports.AccessDeniedError = AccessDeniedError;
|
|
35
|
-
class InvalidConnectionError extends Error {
|
|
36
|
-
constructor(message) {
|
|
37
|
-
super(`Invalid connection: ${message}`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
exports.InvalidConnectionError = InvalidConnectionError;
|
|
41
|
-
class ConnectionAcquireTimeoutError extends Error {
|
|
42
|
-
constructor(message) {
|
|
43
|
-
super(`Connection acquire timeout: ${message}`);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
exports.ConnectionAcquireTimeoutError = ConnectionAcquireTimeoutError;
|
|
47
|
-
class ConnectionTimedOutError extends Error {
|
|
48
|
-
constructor(message) {
|
|
49
|
-
super(`Connection timed out: ${message}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
exports.ConnectionTimedOutError = ConnectionTimedOutError;
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludHJvc3BlY3Rpb24vZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUFnRDtBQUNoRCxNQUFhLGVBQWdCLFNBQVEsS0FBSztJQUN4QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLHFCQUFxQixPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQUpELDBDQUlDO0FBQ0QsTUFBYSxpQkFBa0IsU0FBUSxLQUFLO0lBQzFDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMseUJBQXlCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBSkQsOENBSUM7QUFDRCxNQUFhLHNCQUF1QixTQUFRLEtBQUs7SUFDL0MsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyw2QkFBNkIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFKRCx3REFJQztBQUNELE1BQWEscUJBQXNCLFNBQVEsS0FBSztJQUM5QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLHVCQUF1QixPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQUpELHNEQUlDO0FBRUQsTUFBYSxpQkFBa0IsU0FBUSxLQUFLO0lBQzFDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsa0JBQWtCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBSkQsOENBSUM7QUFDRCxNQUFhLHNCQUF1QixTQUFRLEtBQUs7SUFDL0MsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyx1QkFBdUIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFKRCx3REFJQztBQUVELE1BQWEsNkJBQThCLFNBQVEsS0FBSztJQUN0RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLCtCQUErQixPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQUpELHNFQUlDO0FBRUQsTUFBYSx1QkFBd0IsU0FBUSxLQUFLO0lBQ2hELFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMseUJBQXlCLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBSkQsMERBSUMifQ==
|