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
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 __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