UNPKG

@tsrt/typeorm-transactions

Version:
109 lines 5.39 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.insertEntityProperties = exports.getEntityColumns = exports.insertIntoClass = exports.getConnection = exports.removeManagerFromNs = exports.getManagerFromNs = exports.setManagerIntoNs = exports.execInTransactionsNamespace = exports.bindTransactionsNamespace = exports.getTransactionsNamespace = exports.createTransactionsNamespace = void 0; /* eslint-disable @typescript-eslint/ban-types */ /* eslint-disable max-classes-per-file */ const typeorm_1 = require("typeorm"); const cls_hooked_1 = require("cls-hooked"); const NAMESPACE = '__typeorm_transactions_namespace__'; const TRANSACTION_KEY = '__typeorm_transaction_key__'; // Cls Namespace related utils function createTransactionsNamespace() { var _a; return (_a = cls_hooked_1.getNamespace(NAMESPACE)) !== null && _a !== void 0 ? _a : cls_hooked_1.createNamespace(NAMESPACE); } exports.createTransactionsNamespace = createTransactionsNamespace; function getTransactionsNamespace() { return cls_hooked_1.getNamespace(NAMESPACE); } exports.getTransactionsNamespace = getTransactionsNamespace; function bindTransactionsNamespace(req, res, next) { const ns = createTransactionsNamespace(); ns.bindEmitter(req); ns.bindEmitter(res); ns.run(() => next()); } exports.bindTransactionsNamespace = bindTransactionsNamespace; function execInTransactionsNamespace(cb) { return __awaiter(this, void 0, void 0, function* () { const ns = createTransactionsNamespace(); // Call `runPromise` only if there is no `active` namespace yet, as there are context loss problems // running `runPromise` inside another `runPromise`. const runner = ns.active ? ns.runAndReturn.bind(ns) : ns.runPromise.bind(ns); return runner(cb); }); } exports.execInTransactionsNamespace = execInTransactionsNamespace; function setManagerIntoNs(connectionName, manager) { const ns = getTransactionsNamespace(); if (ns && ns.active) return ns.set(`${TRANSACTION_KEY}_${connectionName}`, manager); } exports.setManagerIntoNs = setManagerIntoNs; function getManagerFromNs(connectionName) { const ns = getTransactionsNamespace(); if (ns && ns.active) return ns.get(`${TRANSACTION_KEY}_${connectionName}`); } exports.getManagerFromNs = getManagerFromNs; function removeManagerFromNs(connectionName) { const ns = getTransactionsNamespace(); if (ns && ns.active) return ns.set(`${TRANSACTION_KEY}_${connectionName}`, null); } exports.removeManagerFromNs = removeManagerFromNs; // TypeORM related utils function getConnection(connectionFactory, connectionNameFactory) { const connection = typeof connectionFactory === 'function' ? connectionFactory() : connectionFactory; const connectionName = typeof connectionNameFactory === 'function' ? connectionNameFactory() : connectionNameFactory; const result = connection !== null && connection !== void 0 ? connection : typeorm_1.getConnection(connectionName); if (!result.isConnected) throw new Error('Please, initialize TypeORM connection.'); return result; } exports.getConnection = getConnection; function insertIntoClass(context, data) { if (!data || !context) throw new Error('It is necessary to provide both: data and context'); Object.entries(data).forEach(([key, value]) => { if (!Object.prototype.hasOwnProperty.call(data, key)) return; // eslint-disable-next-line no-param-reassign context[key] = value; }); } exports.insertIntoClass = insertIntoClass; function getPrototypes(target) { var _a; let result = [target]; if ((_a = Object.getPrototypeOf(target)) === null || _a === void 0 ? void 0 : _a.name) result = result.concat(getPrototypes(Object.getPrototypeOf(target))); return result; } function getEntityColumns(target) { let result = []; getPrototypes(target).forEach((item) => { result = result.concat(typeorm_1.getMetadataArgsStorage().filterColumns(item)); }); return result; } exports.getEntityColumns = getEntityColumns; function insertEntityProperties(context, data) { var _a; if (!data) return; const properties = (_a = getEntityColumns(context.constructor)) === null || _a === void 0 ? void 0 : _a.map(({ propertyName }) => propertyName); const filteredData = {}; Object.entries(data).forEach(([key, value]) => { if (properties === null || properties === void 0 ? void 0 : properties.includes(key)) filteredData[key] = value; }); insertIntoClass(context, filteredData); } exports.insertEntityProperties = insertEntityProperties; //# sourceMappingURL=utils.js.map