UNPKG

nestjs-transaction

Version:

A library that extracts and provides only some of the functions of the 'typeorm-transactional' npm module that are needed to operate in the Nestjs + TypeORM environment

135 lines 5.91 kB
"use strict"; 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 __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.addTransactionalDataSource = exports.initializeTransactionalContext = exports.getDataSource = void 0; const typeorm_1 = require("typeorm"); const errors_1 = require("../errors"); const storage_1 = require("../storage"); const utils_1 = require("../utils"); const constants_1 = require("./constants"); __exportStar(require("./constants"), exports); __exportStar(require("./symbol"), exports); __exportStar(require("./store"), exports); const dataSourceMap = new Map(); function getDataSource(key) { const dataSource = dataSourceMap.get(key); if (dataSource === undefined) { throw new errors_1.NoRegistedDataSourceError(); } return dataSource; } exports.getDataSource = getDataSource; const initializeTransactionalContext = () => { // {repository.manager} return context manager if exist Object.defineProperty(typeorm_1.Repository.prototype, 'manager', { configurable: true, get() { var _a; return (((_a = getStoreQueryRunner(this[constants_1.TYPEORM_ENTITY_MANAGER_NAME].connection[constants_1.TYPEORM_DATA_SOURCE_NAME])) === null || _a === void 0 ? void 0 : _a.manager) || this[constants_1.TYPEORM_ENTITY_MANAGER_NAME]); }, set(manager) { this[constants_1.TYPEORM_ENTITY_MANAGER_NAME] = manager; }, }); }; exports.initializeTransactionalContext = initializeTransactionalContext; const addTransactionalDataSource = (input) => { if ((0, utils_1.isDataSource)(input)) { input = { dataSource: input, name: input.name }; } const { dataSource, name = 'default' } = input; if (dataSourceMap.has(name)) { throw new Error(`DataSource with name "${name}" has already added.`); } let originalManager = dataSource.manager; // {dataSource.manager} return context manager if exist Object.defineProperty(dataSource, 'manager', { configurable: true, get() { var _a; return (((_a = getStoreQueryRunner(this[constants_1.TYPEORM_DATA_SOURCE_NAME])) === null || _a === void 0 ? void 0 : _a.manager) || originalManager); }, set(manager) { originalManager = manager; }, }); /** * Redeclare {EntityManager.queryRunner} to get queryRunner from context * - see https://github.com/typeorm/typeorm/blob/master/src/persistence/EntityPersistExecutor.ts#L20 * - If queryRunner is exist in context, return context queryRunner * - If queryRunner is not exist in context, return original queryRunner */ Object.defineProperty(dataSource.manager, 'queryRunner', { configurable: true, get() { const originalQueryRunner = this[constants_1.TYPEORM_ENTITY_MANAGER_QUERY_RUNNER_NAME]; const storedQueryRunner = getStoreQueryRunner(this.connection[constants_1.TYPEORM_DATA_SOURCE_NAME]); if (storedQueryRunner) { return storedQueryRunner; } return originalQueryRunner; }, set(queryRunner) { this[constants_1.TYPEORM_ENTITY_MANAGER_QUERY_RUNNER_NAME] = queryRunner; }, }); const originalQuery = typeorm_1.DataSource.prototype.query; if (originalQuery.length !== 3) { throw new errors_1.TypeOrmUpdatedPatchError(); } // {dataSource.query, $.manager.query} execute transaction in context dataSource.query = function (...args) { var _a; args[2] = args[2] || ((_a = this.manager) === null || _a === void 0 ? void 0 : _a.queryRunner); return originalQuery.apply(this, args); }; const originalCreateQueryBuilder = typeorm_1.DataSource.prototype.createQueryBuilder; if (originalCreateQueryBuilder.length !== 3) { throw new errors_1.TypeOrmUpdatedPatchError(); } dataSource.createQueryBuilder = function (...args) { var _a, _b; if (args.length === 0) { return originalCreateQueryBuilder.apply(this, [(_a = this.manager) === null || _a === void 0 ? void 0 : _a.queryRunner]); } args[2] = args[2] || ((_b = this.manager) === null || _b === void 0 ? void 0 : _b.queryRunner); return originalCreateQueryBuilder.apply(this, args); }; // {dataSource.transaction} execute transaction in context dataSource.transaction = function (...args) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore return originalManager.transaction(...args); }; dataSourceMap.set(name, dataSource); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore dataSource[constants_1.TYPEORM_DATA_SOURCE_NAME] = name; return dataSource; }; exports.addTransactionalDataSource = addTransactionalDataSource; /** * Get current stored queryRunner from context * @param dataSourceName name of data source * @returns QueryRunner, if queryRunner is exist * @returns undefined, if queryRunner is not exist */ function getStoreQueryRunner(dataSourceName) { const queryRunner = storage_1.storage.get(dataSourceName); return queryRunner; } //# sourceMappingURL=index.js.map