nexorm
Version:
A powerful TypeScript ORM with advanced features.
412 lines (401 loc) • 16.5 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cachedConfig = exports.connections = exports.sequelizes = void 0;
exports.readConfig = readConfig;
exports.connect = connect;
exports.connectAll = connectAll;
exports.closeConnection = closeConnection;
exports.dropProvider = dropProvider;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const chalk_1 = __importDefault(require("chalk"));
const glob = __importStar(require("glob"));
const sequelize_1 = require("sequelize");
const errorHandler_1 = __importDefault(require("./errorHandler"));
const modelBuilder_1 = require("./modelBuilder");
const connectionManager_1 = require("./util/connectionManager");
/* eslint-disable @typescript-eslint/no-var-requires */
/* Operator Deprecation Error */
const originalEmitWarning = process.emitWarning;
process.emitWarning = ((warning, type, code, ctor) => {
if (code == 'SEQUELIZE0003' || type == 'DeprecationWarning')
return;
originalEmitWarning(warning, type, code);
});
var cachedConfig = [];
exports.cachedConfig = cachedConfig;
var sequelizes = [];
exports.sequelizes = sequelizes;
var connections = [];
exports.connections = connections;
async function connectAll() {
var config = await readConfig().catch((err) => { return undefined; });
if (!config) {
throw new errorHandler_1.default("Configuration file not found. Please run 'npx nexorm init' to initialize a new configuration file.", "#FF0000");
}
;
exports.cachedConfig = cachedConfig = config;
for (var conf of config) {
await connect(conf.$provider);
connectionManager_1.ConnectionManager.markConnected(conf.$provider);
}
;
}
;
async function connect(providerName) {
if (!providerName)
providerName = 'nexorm';
var config = await readConfig();
exports.cachedConfig = cachedConfig = config;
var conf = config.find((item) => item.$provider === providerName);
if (!conf) {
throw new errorHandler_1.default(`Provider '${providerName}' not found.`, "#FF0000");
}
;
if (sequelizes.find((item) => item.name === conf?.$provider)) {
throw new errorHandler_1.default(`Provider '${conf.$provider}' already exists.`, "#FF0000");
}
;
if (typeof conf.$filePath == 'string' && sequelizes.find((item) => item.filePath === conf?.$filePath)) {
throw new errorHandler_1.default(`File path '${conf.$filePath}' already exists.`, "#FF0000");
}
connectionManager_1.ConnectionManager.markConnecting(conf.$provider);
try {
const sequelize = new sequelize_1.Sequelize({
dialect: conf.$database,
dialectModule: conf.$dialectModule,
database: conf.$databaseTable,
storage: conf.$filePath,
protocol: conf.$protocol,
pool: {
acquire: conf.$pool?.$acquire,
idle: conf.$pool?.$idle,
max: conf.$pool?.$max,
min: conf.$pool?.$min,
evict: conf.$pool?.$evict,
},
host: conf.$host || conf.$connectionURI?.split(":")[0] || undefined,
port: conf.$port || parseInt(conf.$connectionURI?.split(":")[1]) || undefined,
username: conf.$username || conf.$connectionURI?.split(":")[2] || undefined,
password: conf.$password || conf.$connectionURI?.split(":")[3] || undefined,
ssl: conf.$ssl,
dialectOptions: conf.$dialectOptions,
logging: false,
define: {
freezeTableName: true,
},
operatorsAliases: {
'$eq': sequelize_1.Op.eq,
'$gt': sequelize_1.Op.gt,
'$gte': sequelize_1.Op.gte,
'$lt': sequelize_1.Op.lt,
'$lte': sequelize_1.Op.lte,
'$ne': sequelize_1.Op.ne,
'$like': sequelize_1.Op.like,
'$notLike': sequelize_1.Op.notLike,
'$startsWith': sequelize_1.Op.startsWith,
'$endsWith': sequelize_1.Op.endsWith,
'$substring': sequelize_1.Op.substring,
'$and': sequelize_1.Op.and,
'$or': sequelize_1.Op.or,
'$is': sequelize_1.Op.is,
'$not': sequelize_1.Op.not,
'$overlap': sequelize_1.Op.overlap,
'$contains': sequelize_1.Op.contains,
'$contained': sequelize_1.Op.contained,
'$any': sequelize_1.Op.any,
'$regexp': sequelize_1.Op.regexp,
'$notRegexp': sequelize_1.Op.notRegexp,
'$iLike': sequelize_1.Op.iLike,
'$notILike': sequelize_1.Op.notILike,
'$adjacent': sequelize_1.Op.adjacent,
'$in': sequelize_1.Op.in,
'$notIn': sequelize_1.Op.notIn,
'$exists': sequelize_1.Op.contains,
'$between': sequelize_1.Op.between,
'$notBetween': sequelize_1.Op.notBetween,
'$elementMatch': sequelize_1.Op.contains,
'$ceil': sequelize_1.Op.col,
'$match': sequelize_1.Op.match,
'$strictLeft': sequelize_1.Op.strictLeft,
'$strictRight': sequelize_1.Op.strictRight,
'$noExtendLeft': sequelize_1.Op.noExtendLeft,
'$noExtendRight': sequelize_1.Op.noExtendRight,
'$placeholder': sequelize_1.Op.placeholder,
'$all': sequelize_1.Op.all
}
});
await pushValue({ sequelize, name: conf.$provider, filePath: conf.$filePath });
connections.push(conf.$provider);
var entities = conf.$entities || [];
for (var entity of entities) {
if (typeof entity == 'string') {
const files = glob.sync(entity, { cwd: process.cwd() });
for (const file of files) {
const model = await Promise.resolve(`${path_1.default.join(process.cwd(), file)}`).then(s => __importStar(require(s)));
if (!model || !model.default) {
throw new errorHandler_1.default(`Model file '${file}' does not export a default model.`, "#FF0000");
}
;
await (0, modelBuilder_1.initializeBuilder)(providerName, model.default, sequelize);
}
;
}
else if (typeof entity == 'function') {
await (0, modelBuilder_1.initializeBuilder)(providerName, entity, sequelize);
}
else {
throw new errorHandler_1.default(`Invalid entity type: ${typeof entity}. Expected string or function.`, "#FF0000");
}
}
;
const providerModelList = await (0, modelBuilder_1.getProviderModels)(providerName);
for (const model of providerModelList) {
if (!model)
continue;
await (0, modelBuilder_1.loadRelationships)(model.model.name, sequelize, model.$schema, model.model, model.providerName);
}
;
var forceModel = conf.$force || false;
if (conf.$database === "sqlite") {
await sequelize.sync({ force: forceModel, alter: !forceModel });
}
else {
await sequelize.authenticate();
await sequelize.sync({ force: forceModel, alter: !forceModel });
}
;
for (const model of providerModelList) {
if (!model)
continue;
await (0, modelBuilder_1.loadIndexed)(model.model.name, sequelize, model.schema).catch((err) => {
console.error(chalk_1.default.red(`Error loading indexed for model '${model.model.name}':`), err);
});
}
;
connectionManager_1.ConnectionManager.markConnected(conf.$provider);
if (conf.$onConnection)
conf.$onConnection();
}
catch (err) {
connectionManager_1.ConnectionManager.markDisconnected(conf.$provider);
if (conf.$onError) {
conf.$onError(err);
}
else {
console.error(`Error connecting to '${conf.$provider}':`, err);
process.exit();
}
}
}
;
async function closeConnection(providerName) {
var config = await readConfig();
exports.cachedConfig = cachedConfig = config;
var conf = config.find((item) => item.$provider === providerName);
var sequelize = sequelizes.find((item) => item.name === providerName)?.sequelize;
if (!sequelize) {
throw new errorHandler_1.default(`Provider '${providerName}' not found.`, "#FF0000");
}
;
try {
sequelize.close();
exports.connections = connections = connections.filter((item) => item !== providerName);
if (conf?.$onDisconnect)
conf.$onDisconnect();
}
catch (err) {
if (conf?.$onError) {
conf.$onError(new Error(`Error closing connection to '${providerName}': ${err}`));
}
else {
console.error(`Error closing connection to '${providerName}':`, err);
process.exit();
}
;
}
connectionManager_1.ConnectionManager.markDisconnected(providerName);
}
;
async function dropProvider(providerName) {
var config = await readConfig();
exports.cachedConfig = cachedConfig = config;
var conf = config.find((item) => item.$provider === providerName);
var sequelize = sequelizes.find((item) => item.name === providerName)?.sequelize;
if (!sequelize) {
throw new errorHandler_1.default(`Provider '${providerName}' not found.`, "#FF0000");
}
;
try {
sequelize.drop();
exports.connections = connections = connections.filter((item) => item !== providerName);
}
catch (err) {
if (conf?.$onError) {
conf.$onError(new Error(`Error dropping connection to '${providerName}': ${err}`));
process.exit();
}
else {
console.error(`Error dropping connection to '${providerName}':`, err);
process.exit();
}
;
}
}
;
async function readConfig() {
return new Promise((resolve, reject) => {
const cwd = process.cwd();
const tsConfigPath = path_1.default.join(cwd, "nexorm.config.ts");
const jsConfigPath = path_1.default.join(cwd, "nexorm.config.js");
const mjsConfigPath = path_1.default.join(cwd, "nexorm.config.mjs");
const cjsConfigPath = path_1.default.join(cwd, "nexorm.config.cjs");
const configPaths = [tsConfigPath, jsConfigPath, mjsConfigPath, cjsConfigPath];
const foundPath = configPaths.find((p) => fs_1.default.existsSync(p));
if (!foundPath) {
console.log(chalk_1.default.red.bold("Configuration file not found. Please run 'npx nexorm init' to initialize a new configuration file."));
process.exit(1);
}
const ext = path_1.default.extname(foundPath);
try {
if (ext === ".js" || ext === ".cjs") {
const config = require(foundPath)?.default || require(foundPath);
if (!config)
throw new Error("Config file is empty.");
return resolve(config);
}
if (ext === ".ts" || ext === ".mjs") {
try {
try {
require("ts-node").register({
transpileOnly: true,
compilerOptions: {
module: "commonjs",
},
});
}
catch {
try {
require("esbuild-register");
}
catch {
console.log(chalk_1.default.red("TypeScript config requires 'ts-node' or 'esbuild-register'. Please install one."));
return process.exit(1);
}
}
const config = require(foundPath)?.default || require(foundPath);
if (!config)
throw new Error("Config file is empty.");
return resolve(config);
}
catch (err) {
console.log(chalk_1.default.red.bold("Failed to load TypeScript or ESM config."));
console.error(err);
process.exit(1);
}
}
console.log(chalk_1.default.red.bold("Unsupported config file type."));
process.exit(1);
}
catch (e) {
console.log(chalk_1.default.red.bold("Unexpected error loading configuration file."));
console.error(e);
process.exit(1);
}
});
}
/*
async function readConfig(): Promise<NexormConfig> {
return await new Promise<NexormConfig>((resolve, reject) => {
if (!fs.existsSync(path.join(process.cwd(), "nexorm.config.ts")) && !fs.existsSync(path.join(process.cwd(), "nexorm.config.js"))) {
console.log(chalk.red.bold("Configuration file not found. Please run ' npx nexorm init ' to initialize a new configuration file"));
process.exit();
};
var config = {} as NexormConfig;
try {
const jsFile = (() => {
try {
return require(path.join(process.cwd(), "nexorm.config.js"))?.default;
} catch (err) {
return null;
}
})();
const tsFile = (() => {
try {
return require(path.join(process.cwd(), "nexorm.config.ts"))?.default;
} catch (err) {
return null;
}
})();
if (jsFile) config = jsFile;
if (tsFile) config = tsFile;
if (!config) {
console.log(chalk.red.bold("Configuration file not found. Please run ' npx nexorm init ' to initialize a new configuration file."));
process.exit();
}
} catch (e) {
console.log(chalk.red.bold("Error reading configuration file. Please check if the file is correctly formatted."));
console.error(e);
process.exit();
}
resolve(config as NexormConfig);
}).catch((err) => {
console.error(chalk.red.bold("Error reading configuration file. Please check if the file is correctly formatted."));
console.error(err);
process.exit();
});
};
*/
async function pushValue(options) {
await new Promise((resolve) => {
sequelizes.push(options);
resolve(true);
});
}
;
function isNestProject() {
try {
require.resolve('@nestjs/core', { paths: [process.cwd()] });
return true;
}
catch {
return false;
}
}
;