@rsdk/db.typeorm 3.5.0-next.7 → 3.5.0-next.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/exceptions.d.ts +3 -0
- package/dist/internal/exceptions.js +7 -1
- package/dist/internal/exceptions.js.map +1 -1
- package/dist/metadata/override-entity.decorator.d.ts +13 -0
- package/dist/metadata/override-entity.decorator.js +17 -0
- package/dist/metadata/override-entity.decorator.js.map +1 -0
- package/dist/metadata/typeorm-entity.decorator.d.ts +13 -0
- package/dist/metadata/typeorm-entity.decorator.js +17 -0
- package/dist/metadata/typeorm-entity.decorator.js.map +1 -0
- package/dist/providers/typeorm-override-entities.data-source-factory.d.ts +9 -0
- package/dist/providers/typeorm-override-entities.data-source-factory.js +62 -0
- package/dist/providers/typeorm-override-entities.data-source-factory.js.map +1 -0
- package/dist/typeorm.errors-transformer.js +2 -9
- package/dist/typeorm.errors-transformer.js.map +1 -1
- package/dist/typeorm.plugin.js +9 -0
- package/dist/typeorm.plugin.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +2 -0
- package/src/internal/exceptions.ts +6 -0
- package/src/metadata/override-entity.decorator.ts +32 -0
- package/src/metadata/typeorm-entity.decorator.ts +32 -0
- package/src/providers/typeorm-override-entities.data-source-factory.ts +113 -0
- package/src/typeorm.errors-transformer.ts +2 -12
- package/src/typeorm.plugin.ts +13 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.5.0-next.9](https://github.com/R-Vision/rsdk/compare/v3.5.0-next.8...v3.5.0-next.9) (2023-10-03)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @rsdk/db.typeorm
|
|
9
|
+
|
|
10
|
+
## [3.5.0-next.8](https://github.com/R-Vision/rsdk/compare/v3.5.0-next.7...v3.5.0-next.8) (2023-10-03)
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
* **kafka.producer.outbox:** PFM-460 Append custom outbox table name ([#127](https://github.com/R-Vision/rsdk/issues/127)) ([4870f48](https://github.com/R-Vision/rsdk/commit/4870f48c16bb7dc6379dd204e83edd8715e26826))
|
|
15
|
+
* remove typeorm error hiding ([#126](https://github.com/R-Vision/rsdk/issues/126)) ([cef179b](https://github.com/R-Vision/rsdk/commit/cef179bfffcd2da72984f4a5a750f7ede5d8cfb7))
|
|
16
|
+
|
|
6
17
|
## [3.5.0-next.7](https://github.com/R-Vision/rsdk/compare/v3.5.0-next.6...v3.5.0-next.7) (2023-10-02)
|
|
7
18
|
|
|
8
19
|
**Note:** Version bump only for package @rsdk/db.typeorm
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { TransactionRunner } from '@rsdk/db';
|
|
2
2
|
export { TypeOrmPlugin } from './typeorm.plugin';
|
|
3
3
|
export { IsolationLevel } from './types';
|
|
4
|
+
export { OverrideEntity } from './metadata/override-entity.decorator';
|
|
5
|
+
export { TypeormEntity } from './metadata/typeorm-entity.decorator';
|
|
4
6
|
export declare const Runner: TransactionRunner<import("./types").IsolationLevel, import("./internal/context").TypeOrmContext>;
|
|
5
7
|
export declare const Transactional: (payload?: {
|
|
6
8
|
isolation?: import("./types").IsolationLevel;
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Transactional = exports.Runner = exports.IsolationLevel = exports.TypeOrmPlugin = void 0;
|
|
3
|
+
exports.Transactional = exports.Runner = exports.TypeormEntity = exports.OverrideEntity = exports.IsolationLevel = exports.TypeOrmPlugin = void 0;
|
|
4
4
|
const db_1 = require("@rsdk/db");
|
|
5
5
|
const strategy_1 = require("./internal/strategy");
|
|
6
6
|
var typeorm_plugin_1 = require("./typeorm.plugin");
|
|
7
7
|
Object.defineProperty(exports, "TypeOrmPlugin", { enumerable: true, get: function () { return typeorm_plugin_1.TypeOrmPlugin; } });
|
|
8
8
|
var types_1 = require("./types");
|
|
9
9
|
Object.defineProperty(exports, "IsolationLevel", { enumerable: true, get: function () { return types_1.IsolationLevel; } });
|
|
10
|
+
var override_entity_decorator_1 = require("./metadata/override-entity.decorator");
|
|
11
|
+
Object.defineProperty(exports, "OverrideEntity", { enumerable: true, get: function () { return override_entity_decorator_1.OverrideEntity; } });
|
|
12
|
+
var typeorm_entity_decorator_1 = require("./metadata/typeorm-entity.decorator");
|
|
13
|
+
Object.defineProperty(exports, "TypeormEntity", { enumerable: true, get: function () { return typeorm_entity_decorator_1.TypeormEntity; } });
|
|
10
14
|
exports.Runner = new db_1.TransactionRunner(new strategy_1.TypeormTransactionalStrategy());
|
|
11
15
|
exports.Transactional = exports.Runner.Transactional.bind(exports.Runner);
|
|
12
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAA6C;AAE7C,kDAAmE;AAEnE,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,iCAAyC;AAAhC,uGAAA,cAAc,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAA6C;AAE7C,kDAAmE;AAEnE,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,iCAAyC;AAAhC,uGAAA,cAAc,OAAA;AACvB,kFAAsE;AAA7D,2HAAA,cAAc,OAAA;AACvB,gFAAoE;AAA3D,yHAAA,aAAa,OAAA;AAET,QAAA,MAAM,GAAG,IAAI,sBAAiB,CAAC,IAAI,uCAA4B,EAAE,CAAC,CAAC;AACnE,QAAA,aAAa,GAAG,cAAM,CAAC,aAAa,CAAC,IAAI,CAAC,cAAM,CAAC,CAAC"}
|
|
@@ -65,3 +65,6 @@ export declare class QueryRunnerIsReleased extends InternalException {
|
|
|
65
65
|
export declare class QueryRunnerIsTransactionActive extends InternalException {
|
|
66
66
|
constructor();
|
|
67
67
|
}
|
|
68
|
+
export declare class DatasourceOptionsNotSet extends TypeormdbException {
|
|
69
|
+
constructor();
|
|
70
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.QueryRunnerIsTransactionActive = exports.QueryRunnerIsReleased = exports.ContextIsReleased = exports.MustReleased = exports.UnexpectedRelease = exports.ContextMustBeProvided = exports.QueryRunnerMustBeAttached = exports.AlreadyAttached = exports.ProxiedMethodIsNotFunction = exports.TypeormdbException = void 0;
|
|
3
|
+
exports.DatasourceOptionsNotSet = exports.QueryRunnerIsTransactionActive = exports.QueryRunnerIsReleased = exports.ContextIsReleased = exports.MustReleased = exports.UnexpectedRelease = exports.ContextMustBeProvided = exports.QueryRunnerMustBeAttached = exports.AlreadyAttached = exports.ProxiedMethodIsNotFunction = exports.TypeormdbException = void 0;
|
|
4
4
|
const core_1 = require("@rsdk/core");
|
|
5
5
|
class TypeormdbException extends core_1.InternalException {
|
|
6
6
|
}
|
|
@@ -96,4 +96,10 @@ class QueryRunnerIsTransactionActive extends core_1.InternalException {
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
exports.QueryRunnerIsTransactionActive = QueryRunnerIsTransactionActive;
|
|
99
|
+
class DatasourceOptionsNotSet extends TypeormdbException {
|
|
100
|
+
constructor() {
|
|
101
|
+
super('Datasource options not set');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.DatasourceOptionsNotSet = DatasourceOptionsNotSet;
|
|
99
105
|
//# sourceMappingURL=exceptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../src/internal/exceptions.ts"],"names":[],"mappings":";;;AAAA,qCAA+C;AAE/C,MAAa,kBAAmB,SAAQ,wBAAiB;CAAG;AAA5D,gDAA4D;AAE5D,MAAa,0BAA2B,SAAQ,kBAAkB;IAChE;QACE,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC7C,CAAC;CACF;AAJD,gEAIC;AAED,MAAa,eAAgB,SAAQ,kBAAkB;IACrD;QACE,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC5B,CAAC;CACF;AAJD,0CAIC;AAED,MAAa,yBAA0B,SAAQ,kBAAkB;IAC/D;QACE,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACxC,CAAC;CACF;AAJD,8DAIC;AAED,MAAa,qBAAsB,SAAQ,kBAAkB;IAC3D;QACE,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACpD,CAAC;CACF;AAJD,sDAIC;AAED;;GAEG;AACH,MAAa,iBAAkB,SAAQ,kBAAkB;IACvD;QACE,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzC,CAAC;CACF;AAJD,8CAIC;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,kBAAkB;IAClD;QACE,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACtD,CAAC;CACF;AAJD,oCAIC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,iBAAkB,SAAQ,wBAAiB;IACtD;QACE,KAAK,CACH,yGAAyG,CAC1G,CAAC;IACJ,CAAC;CACF;AAND,8CAMC;AAED;;;GAGG;AACH,MAAa,qBAAsB,SAAQ,wBAAiB;IAC1D;QACE,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC3D,CAAC;CACF;AAJD,sDAIC;AAED;;;GAGG;AACH,MAAa,8BAA+B,SAAQ,wBAAiB;IACnE;QACE,KAAK,CAAC,0DAA0D,CAAC,CAAC;IACpE,CAAC;CACF;AAJD,wEAIC"}
|
|
1
|
+
{"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../src/internal/exceptions.ts"],"names":[],"mappings":";;;AAAA,qCAA+C;AAE/C,MAAa,kBAAmB,SAAQ,wBAAiB;CAAG;AAA5D,gDAA4D;AAE5D,MAAa,0BAA2B,SAAQ,kBAAkB;IAChE;QACE,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC7C,CAAC;CACF;AAJD,gEAIC;AAED,MAAa,eAAgB,SAAQ,kBAAkB;IACrD;QACE,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC5B,CAAC;CACF;AAJD,0CAIC;AAED,MAAa,yBAA0B,SAAQ,kBAAkB;IAC/D;QACE,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACxC,CAAC;CACF;AAJD,8DAIC;AAED,MAAa,qBAAsB,SAAQ,kBAAkB;IAC3D;QACE,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACpD,CAAC;CACF;AAJD,sDAIC;AAED;;GAEG;AACH,MAAa,iBAAkB,SAAQ,kBAAkB;IACvD;QACE,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzC,CAAC;CACF;AAJD,8CAIC;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,kBAAkB;IAClD;QACE,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACtD,CAAC;CACF;AAJD,oCAIC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,iBAAkB,SAAQ,wBAAiB;IACtD;QACE,KAAK,CACH,yGAAyG,CAC1G,CAAC;IACJ,CAAC;CACF;AAND,8CAMC;AAED;;;GAGG;AACH,MAAa,qBAAsB,SAAQ,wBAAiB;IAC1D;QACE,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC3D,CAAC;CACF;AAJD,sDAIC;AAED;;;GAGG;AACH,MAAa,8BAA+B,SAAQ,wBAAiB;IACnE;QACE,KAAK,CAAC,0DAA0D,CAAC,CAAC;IACpE,CAAC;CACF;AAJD,wEAIC;AAED,MAAa,uBAAwB,SAAQ,kBAAkB;IAC7D;QACE,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACtC,CAAC;CACF;AAJD,0DAIC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Type } from '@nestjs/common';
|
|
2
|
+
import type { EntitySchema } from 'typeorm';
|
|
3
|
+
export type OverrideEntityOptions = {
|
|
4
|
+
/**
|
|
5
|
+
* Table name in entity for override
|
|
6
|
+
*/
|
|
7
|
+
name: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Decorator for replacing one entity to another
|
|
11
|
+
*/
|
|
12
|
+
export declare const OverrideEntity: (overrideEntityOptions: OverrideEntityOptions) => ClassDecorator;
|
|
13
|
+
export declare function getOverrideEntityMetadata(entity: string | Function | EntitySchema | Type): OverrideEntityOptions | undefined;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.getOverrideEntityMetadata = exports.OverrideEntity = void 0;
|
|
5
|
+
const TYPEORM_OVERRIDE_ENTITY_METADATA = 'metadata:typeorm-override-entity';
|
|
6
|
+
/**
|
|
7
|
+
* Decorator for replacing one entity to another
|
|
8
|
+
*/
|
|
9
|
+
const OverrideEntity = (overrideEntityOptions) => (target) => {
|
|
10
|
+
Reflect.defineMetadata(TYPEORM_OVERRIDE_ENTITY_METADATA, overrideEntityOptions, target);
|
|
11
|
+
};
|
|
12
|
+
exports.OverrideEntity = OverrideEntity;
|
|
13
|
+
function getOverrideEntityMetadata(entity) {
|
|
14
|
+
return Reflect.getMetadata(TYPEORM_OVERRIDE_ENTITY_METADATA, entity);
|
|
15
|
+
}
|
|
16
|
+
exports.getOverrideEntityMetadata = getOverrideEntityMetadata;
|
|
17
|
+
//# sourceMappingURL=override-entity.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"override-entity.decorator.js","sourceRoot":"","sources":["../../src/metadata/override-entity.decorator.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAYjD,MAAM,gCAAgC,GAAG,kCAAkC,CAAC;AAE5E;;GAEG;AACI,MAAM,cAAc,GACzB,CAAC,qBAA4C,EAAkB,EAAE,CACjE,CAAC,MAAsC,EAAE,EAAE;IACzC,OAAO,CAAC,cAAc,CACpB,gCAAgC,EAChC,qBAAqB,EACrB,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AARS,QAAA,cAAc,kBAQvB;AAEJ,SAAgB,yBAAyB,CACvC,MAA+C;IAE/C,OAAO,OAAO,CAAC,WAAW,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC;AAJD,8DAIC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Type } from '@nestjs/common';
|
|
2
|
+
import type { EntitySchema } from 'typeorm';
|
|
3
|
+
export type TypeormEntityOptions = {
|
|
4
|
+
/**
|
|
5
|
+
* Table name
|
|
6
|
+
*/
|
|
7
|
+
name: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Decorator for set our options
|
|
11
|
+
*/
|
|
12
|
+
export declare const TypeormEntity: (typeormEntityOptions: TypeormEntityOptions) => ClassDecorator;
|
|
13
|
+
export declare function getTypeormEntityMetadata(entity: string | Function | EntitySchema | Type): TypeormEntityOptions | undefined;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.getTypeormEntityMetadata = exports.TypeormEntity = void 0;
|
|
5
|
+
const TYPEORM_ENTITY_METADATA = 'metadata:typeorm-entity';
|
|
6
|
+
/**
|
|
7
|
+
* Decorator for set our options
|
|
8
|
+
*/
|
|
9
|
+
const TypeormEntity = (typeormEntityOptions) => (target) => {
|
|
10
|
+
Reflect.defineMetadata(TYPEORM_ENTITY_METADATA, typeormEntityOptions, target);
|
|
11
|
+
};
|
|
12
|
+
exports.TypeormEntity = TypeormEntity;
|
|
13
|
+
function getTypeormEntityMetadata(entity) {
|
|
14
|
+
return Reflect.getMetadata(TYPEORM_ENTITY_METADATA, entity);
|
|
15
|
+
}
|
|
16
|
+
exports.getTypeormEntityMetadata = getTypeormEntityMetadata;
|
|
17
|
+
//# sourceMappingURL=typeorm-entity.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm-entity.decorator.js","sourceRoot":"","sources":["../../src/metadata/typeorm-entity.decorator.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAYjD,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAE1D;;GAEG;AACI,MAAM,aAAa,GACxB,CAAC,oBAA0C,EAAkB,EAAE,CAC/D,CAAC,MAAsC,EAAE,EAAE;IACzC,OAAO,CAAC,cAAc,CACpB,uBAAuB,EACvB,oBAAoB,EACpB,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AARS,QAAA,aAAa,iBAQtB;AAEJ,SAAgB,wBAAwB,CACtC,MAA+C;IAE/C,OAAO,OAAO,CAAC,WAAW,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC;AAJD,4DAIC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DataSourceOptions } from 'typeorm';
|
|
2
|
+
import { DataSource } from 'typeorm';
|
|
3
|
+
export declare class TypeormOverrideEntitiesDataSourceFactory {
|
|
4
|
+
static create(dataSourceOptions: DataSourceOptions): DataSource;
|
|
5
|
+
private static getOverrideEntitiesMetadataByObjectMapOfEntities;
|
|
6
|
+
private static getOverrideEntitiesMetadataByArrayOfEntities;
|
|
7
|
+
private static isTypeormEntityOverrided;
|
|
8
|
+
private static getTypeormMetadataByEntity;
|
|
9
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TypeormOverrideEntitiesDataSourceFactory = void 0;
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const override_entity_decorator_1 = require("../metadata/override-entity.decorator");
|
|
7
|
+
const typeorm_entity_decorator_1 = require("../metadata/typeorm-entity.decorator");
|
|
8
|
+
class TypeormOverrideEntitiesDataSourceFactory {
|
|
9
|
+
static create(dataSourceOptions) {
|
|
10
|
+
// if we dont have any eitities, we dont start any proccess with override logics
|
|
11
|
+
if (!dataSourceOptions.entities) {
|
|
12
|
+
return new typeorm_1.DataSource(dataSourceOptions);
|
|
13
|
+
}
|
|
14
|
+
// because options.entities can have two type: array, object map
|
|
15
|
+
// we use two different code for processing
|
|
16
|
+
// List of T-s passed as an array
|
|
17
|
+
if (Array.isArray(dataSourceOptions.entities)) {
|
|
18
|
+
const overrideEntitiesMetadata = this.getOverrideEntitiesMetadataByArrayOfEntities(dataSourceOptions.entities);
|
|
19
|
+
const overridedEntities = dataSourceOptions.entities.filter((entity) => !this.isTypeormEntityOverrided(this.getTypeormMetadataByEntity(entity), overrideEntitiesMetadata));
|
|
20
|
+
return new typeorm_1.DataSource({
|
|
21
|
+
...dataSourceOptions,
|
|
22
|
+
entities: overridedEntities,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
// List of T-s passed as object map.
|
|
26
|
+
const overrideEntitiesMetadata = this.getOverrideEntitiesMetadataByObjectMapOfEntities(dataSourceOptions);
|
|
27
|
+
const overridedEntities = Object.fromEntries(Object.entries(dataSourceOptions.entities).filter(([_key, entity]) => !this.isTypeormEntityOverrided(this.getTypeormMetadataByEntity(entity), overrideEntitiesMetadata)));
|
|
28
|
+
return new typeorm_1.DataSource({
|
|
29
|
+
...dataSourceOptions,
|
|
30
|
+
entities: overridedEntities,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
static getOverrideEntitiesMetadataByObjectMapOfEntities(dataSourceOptions) {
|
|
34
|
+
const overrideEntitiesMetadata = {};
|
|
35
|
+
for (const entity in dataSourceOptions.entities) {
|
|
36
|
+
const overrideEntityMetadata = (0, override_entity_decorator_1.getOverrideEntityMetadata)(entity);
|
|
37
|
+
if (overrideEntityMetadata) {
|
|
38
|
+
overrideEntitiesMetadata[overrideEntityMetadata.name] = entity;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return overrideEntitiesMetadata;
|
|
42
|
+
}
|
|
43
|
+
static getOverrideEntitiesMetadataByArrayOfEntities(entities) {
|
|
44
|
+
const overrideEntitiesMetadata = {};
|
|
45
|
+
for (const entity of entities) {
|
|
46
|
+
const overrideEntityMetadata = (0, override_entity_decorator_1.getOverrideEntityMetadata)(entity);
|
|
47
|
+
if (overrideEntityMetadata) {
|
|
48
|
+
overrideEntitiesMetadata[overrideEntityMetadata.name] = entity;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return overrideEntitiesMetadata;
|
|
52
|
+
}
|
|
53
|
+
static isTypeormEntityOverrided(typeormEntityMetadata, overrideEntitiesMetadata) {
|
|
54
|
+
return (typeormEntityMetadata?.name &&
|
|
55
|
+
overrideEntitiesMetadata[typeormEntityMetadata.name]);
|
|
56
|
+
}
|
|
57
|
+
static getTypeormMetadataByEntity(entity) {
|
|
58
|
+
return (0, typeorm_entity_decorator_1.getTypeormEntityMetadata)(entity);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.TypeormOverrideEntitiesDataSourceFactory = TypeormOverrideEntitiesDataSourceFactory;
|
|
62
|
+
//# sourceMappingURL=typeorm-override-entities.data-source-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm-override-entities.data-source-factory.js","sourceRoot":"","sources":["../../src/providers/typeorm-override-entities.data-source-factory.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAIjD,qCAAqC;AAErC,qFAAkF;AAElF,mFAAgF;AAEhF,MAAa,wCAAwC;IACnD,MAAM,CAAC,MAAM,CAAC,iBAAoC;QAChD,gFAAgF;QAChF,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;YAC/B,OAAO,IAAI,oBAAU,CAAC,iBAAiB,CAAC,CAAC;SAC1C;QAED,gEAAgE;QAChE,2CAA2C;QAE3C,iCAAiC;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE;YAC7C,MAAM,wBAAwB,GAC5B,IAAI,CAAC,4CAA4C,CAC/C,iBAAiB,CAAC,QAAQ,CAC3B,CAAC;YAEJ,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CACzD,CAAC,MAAM,EAAE,EAAE,CACT,CAAC,IAAI,CAAC,wBAAwB,CAC5B,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,EACvC,wBAAwB,CACzB,CACJ,CAAC;YAEF,OAAO,IAAI,oBAAU,CAAC;gBACpB,GAAG,iBAAiB;gBACpB,QAAQ,EAAE,iBAAiB;aAC5B,CAAC,CAAC;SACJ;QACD,oCAAoC;QACpC,MAAM,wBAAwB,GAC5B,IAAI,CAAC,gDAAgD,CAAC,iBAAiB,CAAC,CAAC;QAE3E,MAAM,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAC1C,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAC/C,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CACjB,CAAC,IAAI,CAAC,wBAAwB,CAC5B,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,EACvC,wBAAwB,CACzB,CACJ,CACF,CAAC;QAEF,OAAO,IAAI,oBAAU,CAAC;YACpB,GAAG,iBAAiB;YACpB,QAAQ,EAAE,iBAAiB;SAC5B,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,gDAAgD,CAC7D,iBAAoC;QAEpC,MAAM,wBAAwB,GAG1B,EAAE,CAAC;QAEP,KAAK,MAAM,MAAM,IAAI,iBAAiB,CAAC,QAAQ,EAAE;YAC/C,MAAM,sBAAsB,GAAG,IAAA,qDAAyB,EAAC,MAAM,CAAC,CAAC;YACjE,IAAI,sBAAsB,EAAE;gBAC1B,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;aAChE;SACF;QACD,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAEO,MAAM,CAAC,4CAA4C,CACzD,QAA8C;QAE9C,MAAM,wBAAwB,GAG1B,EAAE,CAAC;QAEP,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE;YAC7B,MAAM,sBAAsB,GAAG,IAAA,qDAAyB,EAAC,MAAM,CAAC,CAAC;YACjE,IAAI,sBAAsB,EAAE;gBAC1B,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;aAChE;SACF;QACD,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAEO,MAAM,CAAC,wBAAwB,CACrC,qBAAuD,EACvD,wBAGC;QAED,OAAO,CACL,qBAAqB,EAAE,IAAI;YAC3B,wBAAwB,CAAC,qBAAqB,CAAC,IAAI,CAAC,CACrD,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,0BAA0B,CACvC,MAAwC;QAExC,OAAO,IAAA,mDAAwB,EAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;CACF;AAtGD,4FAsGC"}
|
|
@@ -3,25 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TypeormErrorTransformer = void 0;
|
|
4
4
|
const core_1 = require("@rsdk/core");
|
|
5
5
|
const typeorm_1 = require("typeorm");
|
|
6
|
-
const DEFAULT_MESSAGE = 'Something went wrong';
|
|
7
6
|
class TypeormErrorTransformer {
|
|
8
7
|
match(ex) {
|
|
9
8
|
return ex instanceof typeorm_1.TypeORMError;
|
|
10
9
|
}
|
|
11
10
|
transform(ex) {
|
|
12
|
-
/**
|
|
13
|
-
* Потому что в `message` typeorm exception может быть информация о таблицах и сущностях, которую не хочется лишний раз светить
|
|
14
|
-
*/
|
|
15
|
-
const message = ex.message;
|
|
16
|
-
ex.message = DEFAULT_MESSAGE;
|
|
17
|
-
ex._message = message;
|
|
18
11
|
if (ex instanceof typeorm_1.EntityNotFoundError) {
|
|
19
|
-
return new core_1.NotFoundException(
|
|
12
|
+
return new core_1.NotFoundException(ex.message, {
|
|
20
13
|
cause: ex,
|
|
21
14
|
});
|
|
22
15
|
}
|
|
23
16
|
if (ex instanceof typeorm_1.TypeORMError) {
|
|
24
|
-
return new core_1.InternalException(
|
|
17
|
+
return new core_1.InternalException(ex.message, {
|
|
25
18
|
cause: ex,
|
|
26
19
|
});
|
|
27
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm.errors-transformer.js","sourceRoot":"","sources":["../src/typeorm.errors-transformer.ts"],"names":[],"mappings":";;;AACA,qCAAkE;AAClE,qCAA4D;AAE5D,
|
|
1
|
+
{"version":3,"file":"typeorm.errors-transformer.js","sourceRoot":"","sources":["../src/typeorm.errors-transformer.ts"],"names":[],"mappings":";;;AACA,qCAAkE;AAClE,qCAA4D;AAE5D,MAAa,uBAAuB;IAClC,KAAK,CAAC,EAAW;QACf,OAAO,EAAE,YAAY,sBAAY,CAAC;IACpC,CAAC;IAED,SAAS,CAAC,EAAO;QACf,IAAI,EAAE,YAAY,6BAAmB,EAAE;YACrC,OAAO,IAAI,wBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;gBACvC,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;SACJ;QAED,IAAI,EAAE,YAAY,sBAAY,EAAE;YAC9B,OAAO,IAAI,wBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;gBACvC,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;SACJ;QAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;CACF;AApBD,0DAoBC"}
|
package/dist/typeorm.plugin.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
4
|
exports.TypeOrmPlugin = void 0;
|
|
4
5
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
5
6
|
const core_1 = require("@rsdk/core");
|
|
6
7
|
const logging_1 = require("@rsdk/logging");
|
|
7
8
|
const node_path_1 = require("node:path");
|
|
9
|
+
const exceptions_1 = require("./internal/exceptions");
|
|
8
10
|
const initializer_1 = require("./internal/initializer");
|
|
9
11
|
const migration_checker_module_1 = require("./modules/migration-checker.module");
|
|
12
|
+
const typeorm_override_entities_data_source_factory_1 = require("./providers/typeorm-override-entities.data-source-factory");
|
|
10
13
|
const providers_1 = require("./providers");
|
|
11
14
|
const typeorm_errors_transformer_1 = require("./typeorm.errors-transformer");
|
|
12
15
|
class TypeOrmPlugin {
|
|
@@ -66,6 +69,12 @@ class TypeOrmPlugin {
|
|
|
66
69
|
migrationsTableName: 'typeorm_migrations',
|
|
67
70
|
...this.options.overrideConfig,
|
|
68
71
|
}),
|
|
72
|
+
dataSourceFactory: (options) => {
|
|
73
|
+
if (!options) {
|
|
74
|
+
throw new exceptions_1.DatasourceOptionsNotSet();
|
|
75
|
+
}
|
|
76
|
+
return typeorm_override_entities_data_source_factory_1.TypeormOverrideEntitiesDataSourceFactory.create(options).initialize();
|
|
77
|
+
},
|
|
69
78
|
}),
|
|
70
79
|
migration_checker_module_1.MigrationCheckerModule,
|
|
71
80
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm.plugin.js","sourceRoot":"","sources":["../src/typeorm.plugin.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"typeorm.plugin.js","sourceRoot":"","sources":["../src/typeorm.plugin.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAIjD,6CAAgD;AAOhD,qCAA4D;AAC5D,2CAA8C;AAC9C,yCAAoC;AAGpC,sDAAgE;AAChE,wDAAqD;AACrD,iFAA4E;AAC5E,6HAAqH;AACrH,2CAIqB;AACrB,6EAAuE;AAGvE,MAAa,aAAa;IAMK;IALrB,MAAM,CAAU,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAErE;;OAEG;IACH,YAA6B,OAA6B;QAA7B,YAAO,GAAP,OAAO,CAAsB;QACxD,yBAAW,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;IACjC,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;SACnD;QAED,OAAO;YACL,uBAAa,CAAC,YAAY,CAAC;gBACzB,OAAO,EAAE;oBACP,2BAAoB,CAAC,UAAU,CAAC,+BAAmB,CAAC;oBACpD;wBACE,MAAM,EAAE,uBAAa;wBACrB,SAAS,EAAE,CAAC,kCAAsB,EAAE,gCAAoB,CAAC;wBACzD,OAAO,EAAE,CAAC,gCAAoB,CAAC;qBAChC;iBACF;gBACD,MAAM,EAAE,CAAC,+BAAmB,EAAE,gCAAoB,EAAE,eAAQ,CAAC;gBAC7D,UAAU,EAAE,CACV,MAA2B,EAC3B,MAA4B,EAC5B,OAAe,EACO,EAAE,CAAC,CAAC;oBAC1B;;;;uBAIG;oBACH,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;oBACvB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;oBAC1B,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI;wBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;qBACtB,CAAC;oBACF,MAAM;oBACN,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACjD,gBAAgB,EAAE,CAAC,IAAI,CAAC,QAAQ;oBAChC,UAAU,EAAE,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE;oBAC7C,aAAa,EAAE,MAAM,CAAC,iBAAiB;oBACvC,eAAe,EAAE,OAAO,GAAG,UAAU;oBACrC,KAAK,EAAE;wBACL,GAAG,EAAE,MAAM,CAAC,OAAO;wBACnB,GAAG,EAAE,MAAM,CAAC,OAAO;qBACpB;oBACD,UAAU;oBACV,mBAAmB,EAAE,oBAAoB;oBACzC,GAAI,IAAI,CAAC,OAAO,CAAC,cAAsB;iBACxC,CAAC;gBACF,iBAAiB,EAAE,CAAC,OAA2B,EAAE,EAAE;oBACjD,IAAI,CAAC,OAAO,EAAE;wBACZ,MAAM,IAAI,oCAAuB,EAAE,CAAC;qBACrC;oBACD,OAAO,wFAAwC,CAAC,MAAM,CACpD,OAAO,CACR,CAAC,UAAU,EAAE,CAAC;gBACjB,CAAC;aACF,CAAC;YACF,iDAAsB;SACvB,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,OAAO,CAAC,IAAI,oDAAuB,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,mBAAmB;QACzB,OAAO,CAAC,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,+BAA+B,CAAC,CAAC,CAAC;IACnE,CAAC;;AAnFH,sCAoFC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/db.typeorm",
|
|
3
|
-
"version": "3.5.0-next.
|
|
3
|
+
"version": "3.5.0-next.9",
|
|
4
4
|
"description": "Typeorm module for platform",
|
|
5
5
|
"license": "Apache License 2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
"@nestjs/typeorm": "^10.0.0",
|
|
20
20
|
"@rsdk/common": "^3.5.0-next.7",
|
|
21
21
|
"@rsdk/common.nestjs": "^3.5.0-next.7",
|
|
22
|
-
"@rsdk/core": "^3.5.0-next.
|
|
23
|
-
"@rsdk/db": "^3.5.0-next.
|
|
22
|
+
"@rsdk/core": "^3.5.0-next.9",
|
|
23
|
+
"@rsdk/db": "^3.5.0-next.9",
|
|
24
24
|
"@rsdk/logging": "^3.5.0-next.7",
|
|
25
25
|
"@rsdk/nest-tools": "^3.4.1",
|
|
26
26
|
"typeorm": "^0.3.12"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "39d1919e0ae2fbb4f637bd7dcb3a74eede698c19"
|
|
29
29
|
}
|
package/src/index.ts
CHANGED
|
@@ -4,6 +4,8 @@ import { TypeormTransactionalStrategy } from './internal/strategy';
|
|
|
4
4
|
|
|
5
5
|
export { TypeOrmPlugin } from './typeorm.plugin';
|
|
6
6
|
export { IsolationLevel } from './types';
|
|
7
|
+
export { OverrideEntity } from './metadata/override-entity.decorator';
|
|
8
|
+
export { TypeormEntity } from './metadata/typeorm-entity.decorator';
|
|
7
9
|
|
|
8
10
|
export const Runner = new TransactionRunner(new TypeormTransactionalStrategy());
|
|
9
11
|
export const Transactional = Runner.Transactional.bind(Runner);
|
|
@@ -94,3 +94,9 @@ export class QueryRunnerIsTransactionActive extends InternalException {
|
|
|
94
94
|
super('queryRunner.isTransactionActive must be false for attach');
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
+
|
|
98
|
+
export class DatasourceOptionsNotSet extends TypeormdbException {
|
|
99
|
+
constructor() {
|
|
100
|
+
super('Datasource options not set');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
2
|
+
|
|
3
|
+
import type { Type } from '@nestjs/common';
|
|
4
|
+
import type { EntitySchema } from 'typeorm';
|
|
5
|
+
|
|
6
|
+
export type OverrideEntityOptions = {
|
|
7
|
+
/**
|
|
8
|
+
* Table name in entity for override
|
|
9
|
+
*/
|
|
10
|
+
name: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const TYPEORM_OVERRIDE_ENTITY_METADATA = 'metadata:typeorm-override-entity';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Decorator for replacing one entity to another
|
|
17
|
+
*/
|
|
18
|
+
export const OverrideEntity =
|
|
19
|
+
(overrideEntityOptions: OverrideEntityOptions): ClassDecorator =>
|
|
20
|
+
(target: Function | EntitySchema | Type) => {
|
|
21
|
+
Reflect.defineMetadata(
|
|
22
|
+
TYPEORM_OVERRIDE_ENTITY_METADATA,
|
|
23
|
+
overrideEntityOptions,
|
|
24
|
+
target,
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export function getOverrideEntityMetadata(
|
|
29
|
+
entity: string | Function | EntitySchema | Type,
|
|
30
|
+
): OverrideEntityOptions | undefined {
|
|
31
|
+
return Reflect.getMetadata(TYPEORM_OVERRIDE_ENTITY_METADATA, entity);
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
2
|
+
|
|
3
|
+
import type { Type } from '@nestjs/common';
|
|
4
|
+
import type { EntitySchema } from 'typeorm';
|
|
5
|
+
|
|
6
|
+
export type TypeormEntityOptions = {
|
|
7
|
+
/**
|
|
8
|
+
* Table name
|
|
9
|
+
*/
|
|
10
|
+
name: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const TYPEORM_ENTITY_METADATA = 'metadata:typeorm-entity';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Decorator for set our options
|
|
17
|
+
*/
|
|
18
|
+
export const TypeormEntity =
|
|
19
|
+
(typeormEntityOptions: TypeormEntityOptions): ClassDecorator =>
|
|
20
|
+
(target: Function | EntitySchema | Type) => {
|
|
21
|
+
Reflect.defineMetadata(
|
|
22
|
+
TYPEORM_ENTITY_METADATA,
|
|
23
|
+
typeormEntityOptions,
|
|
24
|
+
target,
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export function getTypeormEntityMetadata(
|
|
29
|
+
entity: string | Function | EntitySchema | Type,
|
|
30
|
+
): TypeormEntityOptions | undefined {
|
|
31
|
+
return Reflect.getMetadata(TYPEORM_ENTITY_METADATA, entity);
|
|
32
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
2
|
+
|
|
3
|
+
import type { Type } from '@nestjs/common';
|
|
4
|
+
import type { DataSourceOptions, EntitySchema } from 'typeorm';
|
|
5
|
+
import { DataSource } from 'typeorm';
|
|
6
|
+
|
|
7
|
+
import { getOverrideEntityMetadata } from '../metadata/override-entity.decorator';
|
|
8
|
+
import type { TypeormEntityOptions } from '../metadata/typeorm-entity.decorator';
|
|
9
|
+
import { getTypeormEntityMetadata } from '../metadata/typeorm-entity.decorator';
|
|
10
|
+
|
|
11
|
+
export class TypeormOverrideEntitiesDataSourceFactory {
|
|
12
|
+
static create(dataSourceOptions: DataSourceOptions): DataSource {
|
|
13
|
+
// if we dont have any eitities, we dont start any proccess with override logics
|
|
14
|
+
if (!dataSourceOptions.entities) {
|
|
15
|
+
return new DataSource(dataSourceOptions);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// because options.entities can have two type: array, object map
|
|
19
|
+
// we use two different code for processing
|
|
20
|
+
|
|
21
|
+
// List of T-s passed as an array
|
|
22
|
+
if (Array.isArray(dataSourceOptions.entities)) {
|
|
23
|
+
const overrideEntitiesMetadata =
|
|
24
|
+
this.getOverrideEntitiesMetadataByArrayOfEntities(
|
|
25
|
+
dataSourceOptions.entities,
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const overridedEntities = dataSourceOptions.entities.filter(
|
|
29
|
+
(entity) =>
|
|
30
|
+
!this.isTypeormEntityOverrided(
|
|
31
|
+
this.getTypeormMetadataByEntity(entity),
|
|
32
|
+
overrideEntitiesMetadata,
|
|
33
|
+
),
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
return new DataSource({
|
|
37
|
+
...dataSourceOptions,
|
|
38
|
+
entities: overridedEntities,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// List of T-s passed as object map.
|
|
42
|
+
const overrideEntitiesMetadata =
|
|
43
|
+
this.getOverrideEntitiesMetadataByObjectMapOfEntities(dataSourceOptions);
|
|
44
|
+
|
|
45
|
+
const overridedEntities = Object.fromEntries(
|
|
46
|
+
Object.entries(dataSourceOptions.entities).filter(
|
|
47
|
+
([_key, entity]) =>
|
|
48
|
+
!this.isTypeormEntityOverrided(
|
|
49
|
+
this.getTypeormMetadataByEntity(entity),
|
|
50
|
+
overrideEntitiesMetadata,
|
|
51
|
+
),
|
|
52
|
+
),
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
return new DataSource({
|
|
56
|
+
...dataSourceOptions,
|
|
57
|
+
entities: overridedEntities,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private static getOverrideEntitiesMetadataByObjectMapOfEntities(
|
|
62
|
+
dataSourceOptions: DataSourceOptions,
|
|
63
|
+
): Record<string, string | Function | EntitySchema | Type> {
|
|
64
|
+
const overrideEntitiesMetadata: Record<
|
|
65
|
+
string,
|
|
66
|
+
string | Function | EntitySchema | Type
|
|
67
|
+
> = {};
|
|
68
|
+
|
|
69
|
+
for (const entity in dataSourceOptions.entities) {
|
|
70
|
+
const overrideEntityMetadata = getOverrideEntityMetadata(entity);
|
|
71
|
+
if (overrideEntityMetadata) {
|
|
72
|
+
overrideEntitiesMetadata[overrideEntityMetadata.name] = entity;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return overrideEntitiesMetadata;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private static getOverrideEntitiesMetadataByArrayOfEntities(
|
|
79
|
+
entities: (Function | string | EntitySchema)[],
|
|
80
|
+
): Record<string, string | Function | Type | EntitySchema> {
|
|
81
|
+
const overrideEntitiesMetadata: Record<
|
|
82
|
+
string,
|
|
83
|
+
string | Function | EntitySchema | Type
|
|
84
|
+
> = {};
|
|
85
|
+
|
|
86
|
+
for (const entity of entities) {
|
|
87
|
+
const overrideEntityMetadata = getOverrideEntityMetadata(entity);
|
|
88
|
+
if (overrideEntityMetadata) {
|
|
89
|
+
overrideEntitiesMetadata[overrideEntityMetadata.name] = entity;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return overrideEntitiesMetadata;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private static isTypeormEntityOverrided(
|
|
96
|
+
typeormEntityMetadata: TypeormEntityOptions | undefined,
|
|
97
|
+
overrideEntitiesMetadata: Record<
|
|
98
|
+
string,
|
|
99
|
+
string | Function | EntitySchema | Type
|
|
100
|
+
>,
|
|
101
|
+
): string | Function | EntitySchema | Type | undefined {
|
|
102
|
+
return (
|
|
103
|
+
typeormEntityMetadata?.name &&
|
|
104
|
+
overrideEntitiesMetadata[typeormEntityMetadata.name]
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private static getTypeormMetadataByEntity(
|
|
109
|
+
entity: string | Function | EntitySchema,
|
|
110
|
+
): TypeormEntityOptions | undefined {
|
|
111
|
+
return getTypeormEntityMetadata(entity);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -2,30 +2,20 @@ import type { IErrorsTransformer, PipelineException } from '@rsdk/core';
|
|
|
2
2
|
import { InternalException, NotFoundException } from '@rsdk/core';
|
|
3
3
|
import { EntityNotFoundError, TypeORMError } from 'typeorm';
|
|
4
4
|
|
|
5
|
-
const DEFAULT_MESSAGE = 'Something went wrong';
|
|
6
|
-
|
|
7
5
|
export class TypeormErrorTransformer implements IErrorsTransformer {
|
|
8
6
|
match(ex: unknown): boolean {
|
|
9
7
|
return ex instanceof TypeORMError;
|
|
10
8
|
}
|
|
11
9
|
|
|
12
10
|
transform(ex: any): PipelineException {
|
|
13
|
-
/**
|
|
14
|
-
* Потому что в `message` typeorm exception может быть информация о таблицах и сущностях, которую не хочется лишний раз светить
|
|
15
|
-
*/
|
|
16
|
-
const message = ex.message;
|
|
17
|
-
|
|
18
|
-
ex.message = DEFAULT_MESSAGE;
|
|
19
|
-
ex._message = message;
|
|
20
|
-
|
|
21
11
|
if (ex instanceof EntityNotFoundError) {
|
|
22
|
-
return new NotFoundException(
|
|
12
|
+
return new NotFoundException(ex.message, {
|
|
23
13
|
cause: ex,
|
|
24
14
|
});
|
|
25
15
|
}
|
|
26
16
|
|
|
27
17
|
if (ex instanceof TypeORMError) {
|
|
28
|
-
return new InternalException(
|
|
18
|
+
return new InternalException(ex.message, {
|
|
29
19
|
cause: ex,
|
|
30
20
|
});
|
|
31
21
|
}
|
package/src/typeorm.plugin.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
2
|
+
|
|
1
3
|
import type { DynamicModule } from '@nestjs/common';
|
|
2
4
|
import type { TypeOrmModuleOptions } from '@nestjs/typeorm';
|
|
3
5
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
@@ -10,9 +12,12 @@ import type {
|
|
|
10
12
|
import { APP_NAME, PlatformConfigModule } from '@rsdk/core';
|
|
11
13
|
import { LoggerFactory } from '@rsdk/logging';
|
|
12
14
|
import { resolve } from 'node:path';
|
|
15
|
+
import type { DataSourceOptions } from 'typeorm';
|
|
13
16
|
|
|
17
|
+
import { DatasourceOptionsNotSet } from './internal/exceptions';
|
|
14
18
|
import { Initializer } from './internal/initializer';
|
|
15
19
|
import { MigrationCheckerModule } from './modules/migration-checker.module';
|
|
20
|
+
import { TypeormOverrideEntitiesDataSourceFactory } from './providers/typeorm-override-entities.data-source-factory';
|
|
16
21
|
import {
|
|
17
22
|
TypeOrmHealthIndicator,
|
|
18
23
|
TypeormLoggerAdapter,
|
|
@@ -85,6 +90,14 @@ export class TypeOrmPlugin implements PlatformAppPlugin {
|
|
|
85
90
|
migrationsTableName: 'typeorm_migrations',
|
|
86
91
|
...(this.options.overrideConfig as any),
|
|
87
92
|
}),
|
|
93
|
+
dataSourceFactory: (options?: DataSourceOptions) => {
|
|
94
|
+
if (!options) {
|
|
95
|
+
throw new DatasourceOptionsNotSet();
|
|
96
|
+
}
|
|
97
|
+
return TypeormOverrideEntitiesDataSourceFactory.create(
|
|
98
|
+
options,
|
|
99
|
+
).initialize();
|
|
100
|
+
},
|
|
88
101
|
}),
|
|
89
102
|
MigrationCheckerModule,
|
|
90
103
|
];
|