typeorm
Version:
Data-Mapper ORM for TypeScript and ES2021+. Supports MySQL/MariaDB, PostgreSQL, MS SQL Server, Oracle, SAP HANA, SQLite, MongoDB databases.
199 lines (197 loc) • 8.43 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConnectionOptionsReader = void 0;
const tslib_1 = require("tslib");
const app_root_path_1 = tslib_1.__importDefault(require("app-root-path"));
const path_1 = tslib_1.__importDefault(require("path"));
const error_1 = require("../error");
const PlatformTools_1 = require("../platform/PlatformTools");
const ImportUtils_1 = require("../util/ImportUtils");
const PathUtils_1 = require("../util/PathUtils");
const ConnectionOptionsEnvReader_1 = require("./options-reader/ConnectionOptionsEnvReader");
/**
* Reads connection options from the ormconfig.
*/
class ConnectionOptionsReader {
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
constructor(options) {
this.options = options;
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Returns all connection options read from the ormconfig.
*/
async all() {
const options = await this.load();
if (!options)
throw new error_1.TypeORMError(`No connection options were found in any orm configuration files.`);
return options;
}
/**
* Gets a connection with a given name read from ormconfig.
* If connection with such name would not be found then it throw error.
*/
async get(name) {
const allOptions = await this.all();
const targetOptions = allOptions.find((options) => options.name === name || (name === "default" && !options.name));
if (!targetOptions)
throw new error_1.TypeORMError(`Cannot find connection ${name} because its not defined in any orm configuration files.`);
return targetOptions;
}
/**
* Checks if there is a TypeORM configuration file.
*/
async has(name) {
const allOptions = await this.load();
if (!allOptions)
return false;
const targetOptions = allOptions.find((options) => options.name === name || (name === "default" && !options.name));
return !!targetOptions;
}
// -------------------------------------------------------------------------
// Protected Methods
// -------------------------------------------------------------------------
/**
* Loads all connection options from a configuration file.
*
* todo: get in count NODE_ENV somehow
*/
async load() {
let connectionOptions = undefined;
const fileFormats = [
"env",
"js",
"mjs",
"cjs",
"ts",
"mts",
"cts",
"json",
];
// Detect if baseFilePath contains file extension
const possibleExtension = this.baseFilePath.substr(this.baseFilePath.lastIndexOf("."));
const fileExtension = fileFormats.find((extension) => `.${extension}` === possibleExtension);
// try to find any of following configuration formats
const foundFileFormat = fileExtension ||
fileFormats.find((format) => {
return PlatformTools_1.PlatformTools.fileExist(this.baseFilePath + "." + format);
});
// Determine config file name
const configFile = fileExtension
? this.baseFilePath
: this.baseFilePath + "." + foundFileFormat;
// if .env file found then load all its variables into process.env using dotenv package
if (foundFileFormat === "env") {
PlatformTools_1.PlatformTools.dotenv(configFile);
}
else if (PlatformTools_1.PlatformTools.fileExist(this.baseDirectory + "/.env")) {
PlatformTools_1.PlatformTools.dotenv(this.baseDirectory + "/.env");
}
// try to find connection options from any of available sources of configuration
if (PlatformTools_1.PlatformTools.getEnvVariable("TYPEORM_CONNECTION") ||
PlatformTools_1.PlatformTools.getEnvVariable("TYPEORM_URL")) {
connectionOptions = await new ConnectionOptionsEnvReader_1.ConnectionOptionsEnvReader().read();
}
else if (foundFileFormat === "js" ||
foundFileFormat === "mjs" ||
foundFileFormat === "cjs" ||
foundFileFormat === "ts" ||
foundFileFormat === "mts" ||
foundFileFormat === "cts") {
const [importOrRequireResult, moduleSystem] = await (0, ImportUtils_1.importOrRequireFile)(configFile);
const configModule = await importOrRequireResult;
if (moduleSystem === "esm" ||
(configModule &&
"__esModule" in configModule &&
"default" in configModule)) {
connectionOptions = configModule.default;
}
else {
connectionOptions = configModule;
}
}
else if (foundFileFormat === "json") {
connectionOptions = require(configFile);
}
// normalize and return connection options
if (connectionOptions) {
return this.normalizeConnectionOptions(connectionOptions);
}
return undefined;
}
/**
* Normalize connection options.
*/
normalizeConnectionOptions(connectionOptions) {
if (!Array.isArray(connectionOptions))
connectionOptions = [connectionOptions];
connectionOptions.forEach((options) => {
options.baseDirectory = this.baseDirectory;
if (options.entities) {
const entities = options.entities.map((entity) => {
if (typeof entity === "string" &&
entity.substr(0, 1) !== "/")
return this.baseDirectory + "/" + entity;
return entity;
});
Object.assign(connectionOptions, { entities: entities });
}
if (options.subscribers) {
const subscribers = options.subscribers.map((subscriber) => {
if (typeof subscriber === "string" &&
subscriber.substr(0, 1) !== "/")
return this.baseDirectory + "/" + subscriber;
return subscriber;
});
Object.assign(connectionOptions, { subscribers: subscribers });
}
if (options.migrations) {
const migrations = options.migrations.map((migration) => {
if (typeof migration === "string" &&
migration.substr(0, 1) !== "/")
return this.baseDirectory + "/" + migration;
return migration;
});
Object.assign(connectionOptions, { migrations: migrations });
}
// make database path file in sqlite relative to package.json
if (options.type === "sqlite" ||
options.type === "better-sqlite3") {
if (typeof options.database === "string" &&
!(0, PathUtils_1.isAbsolute)(options.database) &&
options.database.substr(0, 1) !== "/" && // unix absolute
options.database.substr(1, 2) !== ":\\" && // windows absolute
options.database !== ":memory:") {
Object.assign(options, {
database: this.baseDirectory + "/" + options.database,
});
}
}
});
return connectionOptions;
}
/**
* Gets directory where configuration file should be located and configuration file name.
*/
get baseFilePath() {
return path_1.default.resolve(this.baseDirectory, this.baseConfigName);
}
/**
* Gets directory where configuration file should be located.
*/
get baseDirectory() {
return this.options?.root ?? app_root_path_1.default.path;
}
/**
* Gets configuration file name.
*/
get baseConfigName() {
return this.options?.configName ?? "ormconfig";
}
}
exports.ConnectionOptionsReader = ConnectionOptionsReader;
//# sourceMappingURL=ConnectionOptionsReader.js.map
;