UNPKG

typeorm

Version:

Data-Mapper ORM for TypeScript, ES7, ES6, ES5. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB databases.

237 lines (235 loc) • 9.88 kB
import { __read, __spreadArray, __values } from "tslib"; import { hash, shorten } from "../util/StringUtils"; /** * Common driver utility functions. */ var DriverUtils = /** @class */ (function () { function DriverUtils() { } // ------------------------------------------------------------------------- // Public Static Methods // ------------------------------------------------------------------------- /** * Normalizes and builds a new driver options. * Extracts settings from connection url and sets to a new options object. */ DriverUtils.buildDriverOptions = function (options, buildOptions) { var e_1, _a; if (options.url) { var urlDriverOptions = this.parseConnectionUrl(options.url); if (buildOptions && buildOptions.useSid && urlDriverOptions.database) { urlDriverOptions.sid = urlDriverOptions.database; } try { for (var _b = __values(Object.keys(urlDriverOptions)), _c = _b.next(); !_c.done; _c = _b.next()) { var key = _c.value; if (typeof urlDriverOptions[key] === "undefined") { delete urlDriverOptions[key]; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } return Object.assign({}, options, urlDriverOptions); } return Object.assign({}, options); }; /** * buildDriverOptions for MongodDB only to support replica set */ DriverUtils.buildMongoDBDriverOptions = function (options, buildOptions) { var e_2, _a; if (options.url) { var urlDriverOptions = this.parseMongoDBConnectionUrl(options.url); if (buildOptions && buildOptions.useSid && urlDriverOptions.database) { urlDriverOptions.sid = urlDriverOptions.database; } try { for (var _b = __values(Object.keys(urlDriverOptions)), _c = _b.next(); !_c.done; _c = _b.next()) { var key = _c.value; if (typeof urlDriverOptions[key] === "undefined") { delete urlDriverOptions[key]; } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } return Object.assign({}, options, urlDriverOptions); } return Object.assign({}, options); }; /** * Joins and shortens alias if needed. * * If the alias length is greater than the limit allowed by the current * driver, replaces it with a shortend string, if the shortend string * is still too long, it will then hash the alias. * * @param driver Current `Driver`. * @param buildOptions Optional settings. * @param alias Alias parts. * * @return An alias that is no longer than the divers max alias length. */ DriverUtils.buildAlias = function (_a, buildOptions) { var maxAliasLength = _a.maxAliasLength; var alias = []; for (var _i = 2; _i < arguments.length; _i++) { alias[_i - 2] = arguments[_i]; } if (typeof buildOptions === "string") { alias.unshift(buildOptions); buildOptions = { shorten: false, joiner: "_" }; } else { buildOptions = Object.assign({ shorten: false, joiner: "_" }, buildOptions); } var newAlias = alias.length === 1 ? alias[0] : alias.join(buildOptions.joiner); if (maxAliasLength && maxAliasLength > 0 && newAlias.length > maxAliasLength) { if (buildOptions.shorten === true) { var shortenedAlias = shorten(newAlias); if (shortenedAlias.length < maxAliasLength) { return shortenedAlias; } } return hash(newAlias, { length: maxAliasLength }); } return newAlias; }; /** * @deprecated use `buildAlias` instead. */ DriverUtils.buildColumnAlias = function (_a, buildOptions) { var maxAliasLength = _a.maxAliasLength; var alias = []; for (var _i = 2; _i < arguments.length; _i++) { alias[_i - 2] = arguments[_i]; } return this.buildAlias.apply(this, __spreadArray([{ maxAliasLength: maxAliasLength }, buildOptions], __read(alias))); }; // ------------------------------------------------------------------------- // Private Static Methods // ------------------------------------------------------------------------- /** * Extracts connection data from the connection url. */ DriverUtils.parseConnectionUrl = function (url) { var type = url.split(":")[0]; var firstSlashes = url.indexOf("//"); var preBase = url.substr(firstSlashes + 2); var secondSlash = preBase.indexOf("/"); var base = (secondSlash !== -1) ? preBase.substr(0, secondSlash) : preBase; var afterBase = (secondSlash !== -1) ? preBase.substr(secondSlash + 1) : undefined; // remove mongodb query params if (afterBase && afterBase.indexOf("?") !== -1) { afterBase = afterBase.substr(0, afterBase.indexOf("?")); } var lastAtSign = base.lastIndexOf("@"); var usernameAndPassword = base.substr(0, lastAtSign); var hostAndPort = base.substr(lastAtSign + 1); var username = usernameAndPassword; var password = ""; var firstColon = usernameAndPassword.indexOf(":"); if (firstColon !== -1) { username = usernameAndPassword.substr(0, firstColon); password = usernameAndPassword.substr(firstColon + 1); } var _a = __read(hostAndPort.split(":"), 2), host = _a[0], port = _a[1]; return { type: type, host: host, username: decodeURIComponent(username), password: decodeURIComponent(password), port: port ? parseInt(port) : undefined, database: afterBase || undefined }; }; /** * Extracts connection data from the connection url for MongoDB to support replica set. */ DriverUtils.parseMongoDBConnectionUrl = function (url) { var _a, e_3, _b; var type = url.split(":")[0]; var firstSlashes = url.indexOf("//"); var preBase = url.substr(firstSlashes + 2); var secondSlash = preBase.indexOf("/"); var base = (secondSlash !== -1) ? preBase.substr(0, secondSlash) : preBase; var afterBase = (secondSlash !== -1) ? preBase.substr(secondSlash + 1) : undefined; var afterQuestionMark = ""; var host = undefined; var port = undefined; var hostReplicaSet = undefined; var replicaSet = undefined; var optionsObject = {}; if (afterBase && afterBase.indexOf("?") !== -1) { // split params afterQuestionMark = afterBase.substr((afterBase.indexOf("?") + 1), afterBase.length); var optionsList = afterQuestionMark.split("&"); var optionKey_1; var optionValue_1; // create optionsObject for merge with connectionUrl object before return optionsList.forEach(function (optionItem) { optionKey_1 = optionItem.split("=")[0]; optionValue_1 = optionItem.split("=")[1]; optionsObject[optionKey_1] = optionValue_1; }); // specific replicaSet value to set options about hostReplicaSet replicaSet = optionsObject["replicaSet"]; afterBase = afterBase.substr(0, afterBase.indexOf("?")); } var lastAtSign = base.lastIndexOf("@"); var usernameAndPassword = base.substr(0, lastAtSign); var hostAndPort = base.substr(lastAtSign + 1); var username = usernameAndPassword; var password = ""; var firstColon = usernameAndPassword.indexOf(":"); if (firstColon !== -1) { username = usernameAndPassword.substr(0, firstColon); password = usernameAndPassword.substr(firstColon + 1); } // If replicaSet have value set It as hostlist, If not set like standalone host if (replicaSet) { hostReplicaSet = hostAndPort; } else { _a = __read(hostAndPort.split(":"), 2), host = _a[0], port = _a[1]; } var connectionUrl = { type: type, host: host, hostReplicaSet: hostReplicaSet, username: decodeURIComponent(username), password: decodeURIComponent(password), port: port ? parseInt(port) : undefined, database: afterBase || undefined }; try { // Loop to set every options in connectionUrl to object for (var _c = __values(Object.entries(optionsObject)), _d = _c.next(); !_d.done; _d = _c.next()) { var _e = __read(_d.value, 2), key = _e[0], value = _e[1]; connectionUrl[key] = value; } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_d && !_d.done && (_b = _c.return)) _b.call(_c); } finally { if (e_3) throw e_3.error; } } return connectionUrl; }; return DriverUtils; }()); export { DriverUtils }; //# sourceMappingURL=DriverUtils.js.map