@rsdk/db.typeorm 5.11.0-next.1 → 5.11.0-next.10
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/dist/flat-order.d.ts +16 -0
- package/dist/flat-order.js +69 -0
- package/dist/flat-order.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/typeorm.config.d.ts +2 -0
- package/dist/providers/typeorm.config.js +9 -0
- package/dist/providers/typeorm.config.js.map +1 -1
- package/package.json +4 -4
- package/src/flat-order.ts +99 -0
- package/src/index.ts +1 -0
- package/src/providers/typeorm.config.ts +8 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FindOptionsOrder } from 'typeorm';
|
|
2
|
+
type OrderNormalizedType = 'ASC' | 'DESC';
|
|
3
|
+
type OrderNullsNormalizedType = 'FIRST' | 'LAST';
|
|
4
|
+
type OrderWithNullsNormalizedType = {
|
|
5
|
+
direction?: OrderNormalizedType | undefined;
|
|
6
|
+
nulls?: OrderNullsNormalizedType | undefined;
|
|
7
|
+
};
|
|
8
|
+
type FlatNormalizedType = OrderNormalizedType | OrderWithNullsNormalizedType;
|
|
9
|
+
/**
|
|
10
|
+
* Метод для "разглаживания" сортировки в запросах для получения простой структуры сортировки.
|
|
11
|
+
* @param obj - исходные условия сортировки
|
|
12
|
+
* @param concatenator - символ-соединитель для условий
|
|
13
|
+
* @returns Запись в формате "Ключ - Значение (ASC или DESC)"
|
|
14
|
+
*/
|
|
15
|
+
export declare function flatOrder(obj: Record<string, FindOptionsOrder<unknown>>, concatenator?: string): Record<string, FlatNormalizedType>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.flatOrder = flatOrder;
|
|
4
|
+
const DIRECTION_SET = new Set(['ASC', 'DESC', 'asc', 'desc']);
|
|
5
|
+
const NULLS_SET = new Set(['FIRST', 'LAST', 'first', 'last']);
|
|
6
|
+
const SCHEMA = {
|
|
7
|
+
direction: DIRECTION_SET,
|
|
8
|
+
nulls: NULLS_SET,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Метод для "разглаживания" сортировки в запросах для получения простой структуры сортировки.
|
|
12
|
+
* @param obj - исходные условия сортировки
|
|
13
|
+
* @param concatenator - символ-соединитель для условий
|
|
14
|
+
* @returns Запись в формате "Ключ - Значение (ASC или DESC)"
|
|
15
|
+
*/
|
|
16
|
+
function flatOrder(obj, concatenator = '.') {
|
|
17
|
+
return Object.entries(obj).reduce((acc, [key, value]) => {
|
|
18
|
+
if (typeof value !== 'object') {
|
|
19
|
+
acc[key] = castOrderValue(value);
|
|
20
|
+
return acc;
|
|
21
|
+
}
|
|
22
|
+
if (Object.entries(value).every(([key, val]) => !!SCHEMA[key] && SCHEMA[key].has(val))) {
|
|
23
|
+
const validated = value;
|
|
24
|
+
acc[key] = {};
|
|
25
|
+
if (validated.direction) {
|
|
26
|
+
acc[key].direction = castOrderValue(validated.direction);
|
|
27
|
+
}
|
|
28
|
+
if (validated.nulls) {
|
|
29
|
+
acc[key].nulls = castNullsValue(validated.nulls);
|
|
30
|
+
}
|
|
31
|
+
return acc;
|
|
32
|
+
}
|
|
33
|
+
const flattenedChild = flatOrder(value, concatenator);
|
|
34
|
+
return {
|
|
35
|
+
...acc,
|
|
36
|
+
...Object.fromEntries(Object.keys(flattenedChild).map((childKey) => [
|
|
37
|
+
`${key}${concatenator}${childKey}`,
|
|
38
|
+
flattenedChild[childKey],
|
|
39
|
+
])),
|
|
40
|
+
};
|
|
41
|
+
}, {});
|
|
42
|
+
}
|
|
43
|
+
function castOrderValue(value) {
|
|
44
|
+
switch (value) {
|
|
45
|
+
case 1:
|
|
46
|
+
case 'ASC':
|
|
47
|
+
case 'asc':
|
|
48
|
+
return 'ASC';
|
|
49
|
+
case 'desc':
|
|
50
|
+
case 'DESC':
|
|
51
|
+
case -1:
|
|
52
|
+
return 'DESC';
|
|
53
|
+
default:
|
|
54
|
+
throw new Error('Got unexpected value for cast');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function castNullsValue(value) {
|
|
58
|
+
switch (value) {
|
|
59
|
+
case 'FIRST':
|
|
60
|
+
case 'first':
|
|
61
|
+
return 'FIRST';
|
|
62
|
+
case 'LAST':
|
|
63
|
+
case 'last':
|
|
64
|
+
return 'LAST';
|
|
65
|
+
default:
|
|
66
|
+
throw new Error('Got unexpected value for cast');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=flat-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flat-order.js","sourceRoot":"","sources":["../src/flat-order.ts"],"names":[],"mappings":";;AA2BA,8BA2CC;AA1DD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,MAAM,MAAM,GAAoC;IAC9C,SAAS,EAAE,aAAa;IACxB,KAAK,EAAE,SAAS;CACjB,CAAC;AAIF;;;;;GAKG;AACH,SAAgB,SAAS,CACvB,GAA8C,EAC9C,YAAY,GAAG,GAAG;IAElB,OAAO,MAAM,CAAC,OAAO,CAA4B,GAAG,CAAC,CAAC,MAAM,CAC1D,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACpB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IACE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CACzB,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAa,CAAC,CAChE,EACD,CAAC;YACD,MAAM,SAAS,GAAG,KAAqC,CAAC;YAExD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACnD,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAEtD,OAAO;YACL,GAAG,GAAG;YACN,GAAG,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC5C,GAAG,GAAG,GAAG,YAAY,GAAG,QAAQ,EAAE;gBAClC,cAAc,CAAC,QAAQ,CAAC;aACzB,CAAC,CACH;SACF,CAAC;IACJ,CAAC,EACD,EAAwC,CACzC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAA4B;IAClD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,CAAC;QACP,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,CAAC,CAAC;YACL,OAAO,MAAM,CAAC;QAChB;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAqB;IAC3C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export { TypeOrmPlugin } from './typeorm.plugin';
|
|
|
4
4
|
export { IsolationLevel } from './types';
|
|
5
5
|
export { OverrideEntity } from './metadata/override-entity.decorator';
|
|
6
6
|
export { TypeOrmEntity } from './metadata/typeorm-entity.decorator';
|
|
7
|
+
export { flatOrder } from './flat-order';
|
|
7
8
|
export declare const Runner: TransactionRunner<import("./types").IsolationLevel, import("./internal/context").TypeOrmContext>;
|
|
8
9
|
export declare const Transactional: (payload?: {
|
|
9
10
|
isolation?: import("./types").IsolationLevel;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Transactional = exports.Runner = exports.TypeOrmEntity = exports.OverrideEntity = exports.IsolationLevel = exports.TypeOrmPlugin = exports.DataSourceExtractor = void 0;
|
|
3
|
+
exports.Transactional = exports.Runner = exports.flatOrder = exports.TypeOrmEntity = exports.OverrideEntity = exports.IsolationLevel = exports.TypeOrmPlugin = exports.DataSourceExtractor = void 0;
|
|
4
4
|
const db_1 = require("@rsdk/db");
|
|
5
5
|
const strategy_1 = require("./internal/strategy");
|
|
6
6
|
var data_source_extractor_1 = require("./data-source-extractor");
|
|
@@ -13,6 +13,8 @@ var override_entity_decorator_1 = require("./metadata/override-entity.decorator"
|
|
|
13
13
|
Object.defineProperty(exports, "OverrideEntity", { enumerable: true, get: function () { return override_entity_decorator_1.OverrideEntity; } });
|
|
14
14
|
var typeorm_entity_decorator_1 = require("./metadata/typeorm-entity.decorator");
|
|
15
15
|
Object.defineProperty(exports, "TypeOrmEntity", { enumerable: true, get: function () { return typeorm_entity_decorator_1.TypeOrmEntity; } });
|
|
16
|
+
var flat_order_1 = require("./flat-order");
|
|
17
|
+
Object.defineProperty(exports, "flatOrder", { enumerable: true, get: function () { return flat_order_1.flatOrder; } });
|
|
16
18
|
exports.Runner = new db_1.TransactionRunner(new strategy_1.TypeOrmTransactionalStrategy());
|
|
17
19
|
exports.Transactional = exports.Runner.Transactional.bind(exports.Runner);
|
|
18
20
|
//# 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,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAE5B,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,iCAAyC;AAAhC,uGAAA,cAAc,OAAA;AACvB,kFAAsE;AAA7D,2HAAA,cAAc,OAAA;AACvB,gFAAoE;AAA3D,yHAAA,aAAa,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAA6C;AAE7C,kDAAmE;AAEnE,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAE5B,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,iCAAyC;AAAhC,uGAAA,cAAc,OAAA;AACvB,kFAAsE;AAA7D,2HAAA,cAAc,OAAA;AACvB,gFAAoE;AAA3D,yHAAA,aAAa,OAAA;AACtB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAEL,QAAA,MAAM,GAAG,IAAI,sBAAiB,CAAC,IAAI,uCAA4B,EAAE,CAAC,CAAC;AACnE,QAAA,aAAa,GAAG,cAAM,CAAC,aAAa,CAAC,IAAI,CAAC,cAAM,CAAC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Timespan } from '@rsdk/common';
|
|
2
2
|
import { Config } from '@rsdk/core';
|
|
3
|
+
import { SslModeEnum } from '@rsdk/db';
|
|
3
4
|
export declare class TypeOrmPluginConfig extends Config {
|
|
4
5
|
url: URL;
|
|
5
6
|
schema: string;
|
|
@@ -10,6 +11,7 @@ export declare class TypeOrmPluginConfig extends Config {
|
|
|
10
11
|
keepAlive: boolean;
|
|
11
12
|
keepAliveInitialDelay: number;
|
|
12
13
|
allowSelfSignedCert?: boolean | undefined;
|
|
14
|
+
sslMode: SslModeEnum;
|
|
13
15
|
tlsCa?: string | undefined;
|
|
14
16
|
tlsCert?: string | undefined;
|
|
15
17
|
tlsKey?: string | undefined;
|
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.TypeOrmPluginConfig = void 0;
|
|
13
13
|
const common_1 = require("@rsdk/common");
|
|
14
14
|
const core_1 = require("@rsdk/core");
|
|
15
|
+
const db_1 = require("@rsdk/db");
|
|
15
16
|
let TypeOrmPluginConfig = class TypeOrmPluginConfig extends core_1.Config {
|
|
16
17
|
url;
|
|
17
18
|
schema;
|
|
@@ -22,6 +23,7 @@ let TypeOrmPluginConfig = class TypeOrmPluginConfig extends core_1.Config {
|
|
|
22
23
|
keepAlive;
|
|
23
24
|
keepAliveInitialDelay;
|
|
24
25
|
allowSelfSignedCert;
|
|
26
|
+
sslMode;
|
|
25
27
|
tlsCa;
|
|
26
28
|
tlsCert;
|
|
27
29
|
tlsKey;
|
|
@@ -106,6 +108,13 @@ __decorate([
|
|
|
106
108
|
}),
|
|
107
109
|
__metadata("design:type", Object)
|
|
108
110
|
], TypeOrmPluginConfig.prototype, "allowSelfSignedCert", void 0);
|
|
111
|
+
__decorate([
|
|
112
|
+
(0, core_1.Property)('SSL_MODE', new core_1.EnumParser(db_1.SslModeEnum), {
|
|
113
|
+
defaultValue: db_1.SslModeEnum.DISABLE,
|
|
114
|
+
description: 'Db connection ssl mode',
|
|
115
|
+
}),
|
|
116
|
+
__metadata("design:type", String)
|
|
117
|
+
], TypeOrmPluginConfig.prototype, "sslMode", void 0);
|
|
109
118
|
__decorate([
|
|
110
119
|
(0, core_1.Property)('TLS_CA', new core_1.StringParser(), {
|
|
111
120
|
defaultValue: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm.config.js","sourceRoot":"","sources":["../../src/providers/typeorm.config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAA8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"typeorm.config.js","sourceRoot":"","sources":["../../src/providers/typeorm.config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/db.typeorm",
|
|
3
|
-
"version": "5.11.0-next.
|
|
3
|
+
"version": "5.11.0-next.10",
|
|
4
4
|
"description": "TypeOrm module for platform",
|
|
5
5
|
"license": "Apache License 2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
"prepublishOnly": "npm run build"
|
|
15
15
|
},
|
|
16
16
|
"peerDependencies": {
|
|
17
|
-
"@nestjs/common": "^10.
|
|
18
|
-
"@nestjs/core": "^10.
|
|
17
|
+
"@nestjs/common": "^10.4.20",
|
|
18
|
+
"@nestjs/core": "^10.4.20",
|
|
19
19
|
"@nestjs/typeorm": "^10.0.0",
|
|
20
20
|
"@rsdk/common": "*",
|
|
21
21
|
"@rsdk/common.nestjs": "*",
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
"rxjs": "^7.1.0",
|
|
29
29
|
"typeorm": "^0.3.12"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "de767781fa92c9a3db87d8aa982aa682cb6375b6"
|
|
32
32
|
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { FindOptionsOrder, FindOptionsOrderValue } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
type OrderNullsType = 'FIRST' | 'LAST' | 'first' | 'last';
|
|
4
|
+
|
|
5
|
+
type OrderNormalizedType = 'ASC' | 'DESC';
|
|
6
|
+
type OrderNullsNormalizedType = 'FIRST' | 'LAST';
|
|
7
|
+
|
|
8
|
+
type OrderWithNullsNormalizedType = {
|
|
9
|
+
direction?: OrderNormalizedType | undefined;
|
|
10
|
+
nulls?: OrderNullsNormalizedType | undefined;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const DIRECTION_SET = new Set(['ASC', 'DESC', 'asc', 'desc']);
|
|
14
|
+
const NULLS_SET = new Set(['FIRST', 'LAST', 'first', 'last']);
|
|
15
|
+
const SCHEMA: { [key: string]: Set<unknown> } = {
|
|
16
|
+
direction: DIRECTION_SET,
|
|
17
|
+
nulls: NULLS_SET,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type FlatNormalizedType = OrderNormalizedType | OrderWithNullsNormalizedType;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Метод для "разглаживания" сортировки в запросах для получения простой структуры сортировки.
|
|
24
|
+
* @param obj - исходные условия сортировки
|
|
25
|
+
* @param concatenator - символ-соединитель для условий
|
|
26
|
+
* @returns Запись в формате "Ключ - Значение (ASC или DESC)"
|
|
27
|
+
*/
|
|
28
|
+
export function flatOrder(
|
|
29
|
+
obj: Record<string, FindOptionsOrder<unknown>>,
|
|
30
|
+
concatenator = '.',
|
|
31
|
+
): Record<string, FlatNormalizedType> {
|
|
32
|
+
return Object.entries<FindOptionsOrder<unknown>>(obj).reduce(
|
|
33
|
+
(acc, [key, value]) => {
|
|
34
|
+
if (typeof value !== 'object') {
|
|
35
|
+
acc[key] = castOrderValue(value);
|
|
36
|
+
return acc;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (
|
|
40
|
+
Object.entries(value).every(
|
|
41
|
+
([key, val]) => !!SCHEMA[key] && SCHEMA[key].has(val as string),
|
|
42
|
+
)
|
|
43
|
+
) {
|
|
44
|
+
const validated = value as OrderWithNullsNormalizedType;
|
|
45
|
+
|
|
46
|
+
acc[key] = {};
|
|
47
|
+
if (validated.direction) {
|
|
48
|
+
acc[key].direction = castOrderValue(validated.direction);
|
|
49
|
+
}
|
|
50
|
+
if (validated.nulls) {
|
|
51
|
+
acc[key].nulls = castNullsValue(validated.nulls);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return acc;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const flattenedChild = flatOrder(value, concatenator);
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
...acc,
|
|
61
|
+
...Object.fromEntries(
|
|
62
|
+
Object.keys(flattenedChild).map((childKey) => [
|
|
63
|
+
`${key}${concatenator}${childKey}`,
|
|
64
|
+
flattenedChild[childKey],
|
|
65
|
+
]),
|
|
66
|
+
),
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
{} as Record<string, FlatNormalizedType>,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function castOrderValue(value: FindOptionsOrderValue): OrderNormalizedType {
|
|
74
|
+
switch (value) {
|
|
75
|
+
case 1:
|
|
76
|
+
case 'ASC':
|
|
77
|
+
case 'asc':
|
|
78
|
+
return 'ASC';
|
|
79
|
+
case 'desc':
|
|
80
|
+
case 'DESC':
|
|
81
|
+
case -1:
|
|
82
|
+
return 'DESC';
|
|
83
|
+
default:
|
|
84
|
+
throw new Error('Got unexpected value for cast');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function castNullsValue(value: OrderNullsType): OrderNullsNormalizedType {
|
|
89
|
+
switch (value) {
|
|
90
|
+
case 'FIRST':
|
|
91
|
+
case 'first':
|
|
92
|
+
return 'FIRST';
|
|
93
|
+
case 'LAST':
|
|
94
|
+
case 'last':
|
|
95
|
+
return 'LAST';
|
|
96
|
+
default:
|
|
97
|
+
throw new Error('Got unexpected value for cast');
|
|
98
|
+
}
|
|
99
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ export { TypeOrmPlugin } from './typeorm.plugin';
|
|
|
8
8
|
export { IsolationLevel } from './types';
|
|
9
9
|
export { OverrideEntity } from './metadata/override-entity.decorator';
|
|
10
10
|
export { TypeOrmEntity } from './metadata/typeorm-entity.decorator';
|
|
11
|
+
export { flatOrder } from './flat-order';
|
|
11
12
|
|
|
12
13
|
export const Runner = new TransactionRunner(new TypeOrmTransactionalStrategy());
|
|
13
14
|
export const Transactional = Runner.Transactional.bind(Runner);
|
|
@@ -4,12 +4,14 @@ import {
|
|
|
4
4
|
Config,
|
|
5
5
|
ConfigSection,
|
|
6
6
|
ConfigTag,
|
|
7
|
+
EnumParser,
|
|
7
8
|
IntParser,
|
|
8
9
|
Property,
|
|
9
10
|
StringParser,
|
|
10
11
|
TimespanParser,
|
|
11
12
|
UrlParser,
|
|
12
13
|
} from '@rsdk/core';
|
|
14
|
+
import { SslModeEnum } from '@rsdk/db';
|
|
13
15
|
|
|
14
16
|
@ConfigSection({
|
|
15
17
|
name: 'typeorm database config',
|
|
@@ -87,6 +89,12 @@ export class TypeOrmPluginConfig extends Config {
|
|
|
87
89
|
})
|
|
88
90
|
allowSelfSignedCert?: boolean | undefined;
|
|
89
91
|
|
|
92
|
+
@Property('SSL_MODE', new EnumParser(SslModeEnum), {
|
|
93
|
+
defaultValue: SslModeEnum.DISABLE,
|
|
94
|
+
description: 'Db connection ssl mode',
|
|
95
|
+
})
|
|
96
|
+
sslMode!: SslModeEnum;
|
|
97
|
+
|
|
90
98
|
@Property('TLS_CA', new StringParser(), {
|
|
91
99
|
defaultValue: undefined,
|
|
92
100
|
description: 'CA certificate (filepath or content)',
|