@rsdk/db.mikro-orm 4.0.8-next.8

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +6 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/mikro-orm.errors-transformer.d.ts +5 -0
  6. package/dist/mikro-orm.errors-transformer.js +25 -0
  7. package/dist/mikro-orm.errors-transformer.js.map +1 -0
  8. package/dist/mikro-orm.plugin.d.ts +17 -0
  9. package/dist/mikro-orm.plugin.js +85 -0
  10. package/dist/mikro-orm.plugin.js.map +1 -0
  11. package/dist/providers/index.d.ts +3 -0
  12. package/dist/providers/index.js +20 -0
  13. package/dist/providers/index.js.map +1 -0
  14. package/dist/providers/mikro-orm-logger.adapter.d.ts +26 -0
  15. package/dist/providers/mikro-orm-logger.adapter.js +100 -0
  16. package/dist/providers/mikro-orm-logger.adapter.js.map +1 -0
  17. package/dist/providers/mikro-orm.config.d.ts +7 -0
  18. package/dist/providers/mikro-orm.config.js +65 -0
  19. package/dist/providers/mikro-orm.config.js.map +1 -0
  20. package/dist/providers/mikro-orm.healthcheck.d.ts +8 -0
  21. package/dist/providers/mikro-orm.healthcheck.js +40 -0
  22. package/dist/providers/mikro-orm.healthcheck.js.map +1 -0
  23. package/dist/types.d.ts +7 -0
  24. package/dist/types.js +3 -0
  25. package/dist/types.js.map +1 -0
  26. package/jest.config.e2e.js +1 -0
  27. package/jest.config.js +1 -0
  28. package/jest.config.unit.js +1 -0
  29. package/package.json +35 -0
  30. package/src/index.ts +1 -0
  31. package/src/mikro-orm.errors-transformer.ts +33 -0
  32. package/src/mikro-orm.plugin.ts +97 -0
  33. package/src/providers/index.ts +3 -0
  34. package/src/providers/mikro-orm-logger.adapter.ts +111 -0
  35. package/src/providers/mikro-orm.config.ts +49 -0
  36. package/src/providers/mikro-orm.healthcheck.ts +23 -0
  37. package/src/types.ts +8 -0
  38. package/tsconfig.build.json +17 -0
  39. package/tsconfig.json +8 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+ See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
+
6
+ ## [4.0.8-next.8](https://github.com/R-Vision/rsdk/compare/v4.0.8-next.7...v4.0.8-next.8) (2024-01-22)
7
+
8
+ ### Features
9
+
10
+ * **db.mikro-orm:** added db.mikro-orm package ([79f7972](https://github.com/R-Vision/rsdk/commit/79f797296ade2fca4d2ecbd7ea76340d2ca4bce0))
@@ -0,0 +1 @@
1
+ export { MikroOrmPlugin } from './mikro-orm.plugin';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MikroOrmPlugin = void 0;
4
+ var mikro_orm_plugin_1 = require("./mikro-orm.plugin");
5
+ Object.defineProperty(exports, "MikroOrmPlugin", { enumerable: true, get: function () { return mikro_orm_plugin_1.MikroOrmPlugin; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uDAAoD;AAA3C,kHAAA,cAAc,OAAA"}
@@ -0,0 +1,5 @@
1
+ import type { IErrorsTransformer, PipelineException } from '@rsdk/core';
2
+ export declare class MikroOrmErrorTransformer implements IErrorsTransformer {
3
+ match(ex: unknown): boolean;
4
+ transform(ex: any): PipelineException;
5
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MikroOrmErrorTransformer = void 0;
4
+ const core_1 = require("@mikro-orm/core");
5
+ const core_2 = require("@rsdk/core");
6
+ class MikroOrmErrorTransformer {
7
+ match(ex) {
8
+ return ex instanceof core_1.ValidationError || ex instanceof core_1.SyntaxErrorException;
9
+ }
10
+ transform(ex) {
11
+ if (ex instanceof core_1.NotFoundError) {
12
+ return new core_2.NotFoundException(ex.message, {
13
+ cause: ex,
14
+ });
15
+ }
16
+ if (ex instanceof core_1.ValidationError) {
17
+ return new core_2.InputException(ex.message, {
18
+ cause: ex,
19
+ });
20
+ }
21
+ throw new core_2.InternalException(ex.message, { cause: ex });
22
+ }
23
+ }
24
+ exports.MikroOrmErrorTransformer = MikroOrmErrorTransformer;
25
+ //# sourceMappingURL=mikro-orm.errors-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mikro-orm.errors-transformer.js","sourceRoot":"","sources":["../src/mikro-orm.errors-transformer.ts"],"names":[],"mappings":";;;AAAA,0CAIyB;AAEzB,qCAIoB;AAEpB,MAAa,wBAAwB;IACnC,KAAK,CAAC,EAAW;QACf,OAAO,EAAE,YAAY,sBAAe,IAAI,EAAE,YAAY,2BAAoB,CAAC;IAC7E,CAAC;IAED,SAAS,CAAC,EAAO;QACf,IAAI,EAAE,YAAY,oBAAa,EAAE,CAAC;YAChC,OAAO,IAAI,wBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;gBACvC,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;QACL,CAAC;QAED,IAAI,EAAE,YAAY,sBAAe,EAAE,CAAC;YAClC,OAAO,IAAI,qBAAc,CAAC,EAAE,CAAC,OAAO,EAAE;gBACpC,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,wBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;CACF;AApBD,4DAoBC"}
@@ -0,0 +1,17 @@
1
+ import type { DynamicModule } from '@nestjs/common';
2
+ import type { Constructor } from '@rsdk/common';
3
+ import type { AppropriateTransports, IErrorsTransformer, PlatformAppPlugin } from '@rsdk/core';
4
+ import type { MikroOrmPluginOptions } from './types';
5
+ export declare class MikroOrmPlugin implements PlatformAppPlugin {
6
+ private readonly options;
7
+ private static readonly logger;
8
+ /**
9
+ * По умолчанию парсит тип драйвера из env %PACKAGE_NAME%_DB_URL
10
+ */
11
+ constructor(options: MikroOrmPluginOptions);
12
+ get entities(): (string | any)[] | undefined;
13
+ forTransports(): AppropriateTransports;
14
+ modules(): (Constructor | DynamicModule)[];
15
+ errorTransformers(): IErrorsTransformer[];
16
+ private getMigrationsOption;
17
+ }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/ban-types */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MikroOrmPlugin = void 0;
8
+ const nestjs_1 = require("@mikro-orm/nestjs");
9
+ const core_1 = require("@rsdk/core");
10
+ const logging_1 = require("@rsdk/logging");
11
+ const lodash_1 = __importDefault(require("lodash"));
12
+ const node_path_1 = require("node:path");
13
+ const mikro_orm_config_1 = require("./providers/mikro-orm.config");
14
+ const mikro_orm_logger_adapter_1 = require("./providers/mikro-orm-logger.adapter");
15
+ const mikro_orm_errors_transformer_1 = require("./mikro-orm.errors-transformer");
16
+ const providers_1 = require("./providers");
17
+ class MikroOrmPlugin {
18
+ options;
19
+ static logger = logging_1.LoggerFactory.create(MikroOrmPlugin);
20
+ /**
21
+ * По умолчанию парсит тип драйвера из env %PACKAGE_NAME%_DB_URL
22
+ */
23
+ constructor(options) {
24
+ this.options = options;
25
+ }
26
+ get entities() {
27
+ return this?.options?.entitiesTs;
28
+ }
29
+ forTransports() {
30
+ return 'any';
31
+ }
32
+ modules() {
33
+ const migrations = this.getMigrationsOption();
34
+ if (migrations.length === 0) {
35
+ MikroOrmPlugin.logger.warn('migrations not found');
36
+ }
37
+ return [
38
+ nestjs_1.MikroOrmModule.forRootAsync({
39
+ imports: [
40
+ {
41
+ module: nestjs_1.MikroOrmModule,
42
+ providers: [providers_1.MikroOrmHealthIndicator, mikro_orm_logger_adapter_1.MikroOrmAdapter],
43
+ exports: [mikro_orm_logger_adapter_1.MikroOrmAdapter],
44
+ },
45
+ ],
46
+ inject: [mikro_orm_config_1.MikroOrmPluginConfig, mikro_orm_logger_adapter_1.MikroOrmAdapter, core_1.APP_NAME],
47
+ useFactory: (config, logger, appName) => {
48
+ return (0, lodash_1.default)({
49
+ type: this.options.type,
50
+ clientUrl: config.url.toString(),
51
+ ...(config.schema && {
52
+ schema: config.schema,
53
+ }),
54
+ loggerFactory: () => logger,
55
+ entities: this.entities,
56
+ autoLoadEntities: !this.entities,
57
+ name: appName + ':mikro-orm',
58
+ pool: {
59
+ min: config.poolMin,
60
+ max: config.poolMax,
61
+ },
62
+ migrations: {
63
+ tableName: 'mikro_orm_migrations',
64
+ path: './migrations',
65
+ glob: '!(*.d).{js,ts}',
66
+ },
67
+ allowGlobalContext: true,
68
+ ...this.options.overrideConfig,
69
+ })
70
+ .omitBy(lodash_1.default.isUndefined)
71
+ .omitBy(lodash_1.default.isNull)
72
+ .value();
73
+ },
74
+ }),
75
+ ];
76
+ }
77
+ errorTransformers() {
78
+ return [new mikro_orm_errors_transformer_1.MikroOrmErrorTransformer()];
79
+ }
80
+ getMigrationsOption() {
81
+ return [(0, node_path_1.resolve)(process.cwd(), 'dist/mikro-orm/migrations')];
82
+ }
83
+ }
84
+ exports.MikroOrmPlugin = MikroOrmPlugin;
85
+ //# sourceMappingURL=mikro-orm.plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mikro-orm.plugin.js","sourceRoot":"","sources":["../src/mikro-orm.plugin.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;;;;AAGjD,8CAAmD;AAQnD,qCAAsC;AACtC,2CAA8C;AAC9C,oDAAuB;AACvB,yCAAoC;AAEpC,mEAAoE;AACpE,mFAAuE;AACvE,iFAA0E;AAC1E,2CAAsD;AAGtD,MAAa,cAAc;IAMI;IALrB,MAAM,CAAU,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAEtE;;OAEG;IACH,YAA6B,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;IAAG,CAAC;IAE/D,IAAI,QAAQ;QACV,OAAO,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC;IACnC,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,CAAC;YAC5B,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrD,CAAC;QAED,OAAO;YACL,uBAAc,CAAC,YAAY,CAAC;gBAC1B,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,uBAAc;wBACtB,SAAS,EAAE,CAAC,mCAAuB,EAAE,0CAAe,CAAC;wBACrD,OAAO,EAAE,CAAC,0CAAe,CAAC;qBAC3B;iBACF;gBACD,MAAM,EAAE,CAAC,uCAAoB,EAAE,0CAAe,EAAE,eAAQ,CAAC;gBACzD,UAAU,EAAE,CACV,MAA4B,EAC5B,MAAuB,EACvB,OAAe,EACY,EAAE;oBAC7B,OAAO,IAAA,gBAAC,EAA4B;wBAClC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;wBACvB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;wBAChC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI;4BACnB,MAAM,EAAE,MAAM,CAAC,MAAM;yBACtB,CAAC;wBACF,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM;wBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,gBAAgB,EAAE,CAAC,IAAI,CAAC,QAAQ;wBAChC,IAAI,EAAE,OAAO,GAAG,YAAY;wBAC5B,IAAI,EAAE;4BACJ,GAAG,EAAE,MAAM,CAAC,OAAO;4BACnB,GAAG,EAAE,MAAM,CAAC,OAAO;yBACpB;wBACD,UAAU,EAAE;4BACV,SAAS,EAAE,sBAAsB;4BACjC,IAAI,EAAE,cAAc;4BACpB,IAAI,EAAE,gBAAgB;yBACvB;wBACD,kBAAkB,EAAE,IAAI;wBACxB,GAAI,IAAI,CAAC,OAAO,CAAC,cAAsB;qBACxC,CAAC;yBACC,MAAM,CAAC,gBAAC,CAAC,WAAW,CAAC;yBACrB,MAAM,CAAC,gBAAC,CAAC,MAAM,CAAC;yBAChB,KAAK,EAAE,CAAC;gBACb,CAAC;aACF,CAAC;SACH,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,OAAO,CAAC,IAAI,uDAAwB,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,mBAAmB;QACzB,OAAO,CAAC,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAC/D,CAAC;;AAzEH,wCA0EC"}
@@ -0,0 +1,3 @@
1
+ export * from './mikro-orm-logger.adapter';
2
+ export * from './mikro-orm.config';
3
+ export * from './mikro-orm.healthcheck';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mikro-orm-logger.adapter"), exports);
18
+ __exportStar(require("./mikro-orm.config"), exports);
19
+ __exportStar(require("./mikro-orm.healthcheck"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C;AAC3C,qDAAmC;AACnC,0DAAwC"}
@@ -0,0 +1,26 @@
1
+ import type { LogContext, Logger, LoggerNamespace } from '@mikro-orm/core';
2
+ import { ILogger } from '@rsdk/logging';
3
+ export declare class MikroOrmAdapter implements Logger {
4
+ private platformLogger;
5
+ constructor(platformLogger: ILogger);
6
+ setDebugMode(_debugMode: boolean | LoggerNamespace[]): void;
7
+ isEnabled(_namespace: LoggerNamespace): boolean;
8
+ logQuery(context: LogContext): any;
9
+ logMigration(message: string): any;
10
+ formatParts(...parts: (string | boolean | undefined)[]): string;
11
+ logQuerySlow(time: number, query: string, parameters?: any[]): any;
12
+ logQueryError(error: string | Error, query: string, parameters?: any[]): any;
13
+ logSchemaBuild(message: string): any;
14
+ /**
15
+ * Logs a message inside given namespace.
16
+ */
17
+ log(_namespace: LoggerNamespace, message: string, context?: LogContext): void;
18
+ /**
19
+ * Logs error message inside given namespace.
20
+ */
21
+ error(_namespace: LoggerNamespace, message: string, _context?: LogContext): void;
22
+ /**
23
+ * Logs warning message inside given namespace.
24
+ */
25
+ warn(_namespace: LoggerNamespace, message: string, _context?: LogContext): void;
26
+ }
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.MikroOrmAdapter = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const core_1 = require("@rsdk/core");
18
+ const db_1 = require("@rsdk/db");
19
+ let MikroOrmAdapter = class MikroOrmAdapter {
20
+ platformLogger;
21
+ constructor(platformLogger) {
22
+ this.platformLogger = platformLogger;
23
+ }
24
+ setDebugMode(_debugMode) {
25
+ // Так как мы управляем логированием на уровне приложения,
26
+ // нам не нужно обрабатывать события по включению и отключению дебага от микро-орм,
27
+ // но сам микро орм переодически дергает этот метод,
28
+ // для того чтобы он не падал с ошибкой отсутствия метода - создаем пустой метод
29
+ }
30
+ isEnabled(_namespace) {
31
+ // Так как мы управляем логированием на уровне приложения,
32
+ // нам не нужно обрабатывать события по включению и отключению дебага от микро-орм,
33
+ // но сам микро орм переодически дергает этот метод,
34
+ // для того чтобы он не падал с ошибкой отсутствия метода - создаем пустой метод
35
+ return true;
36
+ }
37
+ logQuery(context) {
38
+ const message = this.formatParts(`query: ${context.query}`, context.params && `parameters: ${JSON.stringify(context.params)}`);
39
+ if (context.query === db_1.HEALTH_CHECK_QUERY) {
40
+ this.platformLogger.trace(message);
41
+ }
42
+ else {
43
+ this.platformLogger.debug(message);
44
+ }
45
+ }
46
+ logMigration(message) {
47
+ this.platformLogger.info('Migration: ' + message);
48
+ }
49
+ formatParts(...parts) {
50
+ return parts.filter(Boolean).join(' ');
51
+ }
52
+ logQuerySlow(time, query, parameters) {
53
+ const message = this.formatParts(`query: ${query}`, parameters && 'parameters: ' + parameters, `time: ${time}`);
54
+ this.platformLogger.warn(message);
55
+ }
56
+ logQueryError(error, query, parameters) {
57
+ const parts = [
58
+ `error: ${JSON.stringify(error)}`,
59
+ `query: ${query}`,
60
+ parameters && `parameters: ${JSON.stringify(parameters)}`,
61
+ ];
62
+ const message = this.formatParts(...parts);
63
+ this.platformLogger.error(message);
64
+ }
65
+ logSchemaBuild(message) {
66
+ this.platformLogger.info(`SchemaBuild: ${message}`);
67
+ }
68
+ /**
69
+ * Logs a message inside given namespace.
70
+ */
71
+ log(_namespace, message, context) {
72
+ switch (context?.level) {
73
+ case 'info':
74
+ return this.platformLogger.info(message);
75
+ case 'error':
76
+ return this.platformLogger.error(message);
77
+ default:
78
+ return this.platformLogger.warn(message);
79
+ }
80
+ }
81
+ /**
82
+ * Logs error message inside given namespace.
83
+ */
84
+ error(_namespace, message, _context) {
85
+ return this.platformLogger.error(message);
86
+ }
87
+ /**
88
+ * Logs warning message inside given namespace.
89
+ */
90
+ warn(_namespace, message, _context) {
91
+ return this.platformLogger.warn(message);
92
+ }
93
+ };
94
+ exports.MikroOrmAdapter = MikroOrmAdapter;
95
+ exports.MikroOrmAdapter = MikroOrmAdapter = __decorate([
96
+ (0, common_1.Injectable)(),
97
+ __param(0, (0, core_1.InjectLogger)('MikroOrm')),
98
+ __metadata("design:paramtypes", [Object])
99
+ ], MikroOrmAdapter);
100
+ //# sourceMappingURL=mikro-orm-logger.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mikro-orm-logger.adapter.js","sourceRoot":"","sources":["../../src/providers/mikro-orm-logger.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Config } from '@rsdk/core';
2
+ export declare class MikroOrmPluginConfig extends Config {
3
+ url: URL;
4
+ schema: string;
5
+ poolMin: number;
6
+ poolMax: number;
7
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MikroOrmPluginConfig = void 0;
13
+ const common_1 = require("@rsdk/common");
14
+ const core_1 = require("@rsdk/core");
15
+ let MikroOrmPluginConfig = class MikroOrmPluginConfig extends core_1.Config {
16
+ url;
17
+ schema;
18
+ poolMin;
19
+ poolMax;
20
+ };
21
+ exports.MikroOrmPluginConfig = MikroOrmPluginConfig;
22
+ __decorate([
23
+ (0, core_1.Property)('URL', new core_1.UrlParser(), {
24
+ description: 'Database server url',
25
+ }),
26
+ __metadata("design:type", URL)
27
+ ], MikroOrmPluginConfig.prototype, "url", void 0);
28
+ __decorate([
29
+ (0, core_1.Property)('SCHEMA', new core_1.StringParser(), {
30
+ description: (0, common_1.text) `
31
+ Use schema for all entities.
32
+ **Only for postgres at the moment!**
33
+ `,
34
+ defaultValue: undefined,
35
+ }),
36
+ __metadata("design:type", String)
37
+ ], MikroOrmPluginConfig.prototype, "schema", void 0);
38
+ __decorate([
39
+ (0, core_1.Property)('POOL_MIN', new core_1.IntParser(), {
40
+ defaultValue: 1,
41
+ description: (0, common_1.text) `
42
+ Minimum connection pool size.
43
+ **Only for postgres at the moment!**
44
+ `,
45
+ }),
46
+ __metadata("design:type", Number)
47
+ ], MikroOrmPluginConfig.prototype, "poolMin", void 0);
48
+ __decorate([
49
+ (0, core_1.Property)('POOL_MAX', new core_1.IntParser(), {
50
+ defaultValue: 10,
51
+ description: (0, common_1.text) `
52
+ Maximum connection pool size.
53
+ **Only for postgres at the moment!**
54
+ `,
55
+ }),
56
+ __metadata("design:type", Number)
57
+ ], MikroOrmPluginConfig.prototype, "poolMax", void 0);
58
+ exports.MikroOrmPluginConfig = MikroOrmPluginConfig = __decorate([
59
+ (0, core_1.ConfigSection)({
60
+ name: 'mikro-orm database config',
61
+ tags: [core_1.ConfigTag.infrastructure, core_1.ConfigTag.storage],
62
+ prefix: 'DB',
63
+ })
64
+ ], MikroOrmPluginConfig);
65
+ //# sourceMappingURL=mikro-orm.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mikro-orm.config.js","sourceRoot":"","sources":["../../src/providers/mikro-orm.config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAoC;AACpC,qCAQoB;AAOb,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,aAAM;IAI9C,GAAG,CAAO;IASV,MAAM,CAAU;IAShB,OAAO,CAAU;IASjB,OAAO,CAAU;CAClB,CAAA;AAhCY,oDAAoB;AAI/B;IAHC,IAAA,eAAQ,EAAC,KAAK,EAAE,IAAI,gBAAS,EAAE,EAAE;QAChC,WAAW,EAAE,qBAAqB;KACnC,CAAC;8BACI,GAAG;iDAAC;AASV;IAPC,IAAA,eAAQ,EAAC,QAAQ,EAAE,IAAI,mBAAY,EAAE,EAAE;QACtC,WAAW,EAAE,IAAA,aAAI,EAAA;;;KAGhB;QACD,YAAY,EAAE,SAAS;KACxB,CAAC;;oDACc;AAShB;IAPC,IAAA,eAAQ,EAAC,UAAU,EAAE,IAAI,gBAAS,EAAE,EAAE;QACrC,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,IAAA,aAAI,EAAA;;;KAGhB;KACF,CAAC;;qDACe;AASjB;IAPC,IAAA,eAAQ,EAAC,UAAU,EAAE,IAAI,gBAAS,EAAE,EAAE;QACrC,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,IAAA,aAAI,EAAA;;;KAGhB;KACF,CAAC;;qDACe;+BA/BN,oBAAoB;IALhC,IAAA,oBAAa,EAAC;QACb,IAAI,EAAE,2BAA2B;QACjC,IAAI,EAAE,CAAC,gBAAS,CAAC,cAAc,EAAE,gBAAS,CAAC,OAAO,CAAC;QACnD,MAAM,EAAE,IAAI;KACb,CAAC;GACW,oBAAoB,CAgChC"}
@@ -0,0 +1,8 @@
1
+ import { EntityManager } from '@mikro-orm/core';
2
+ import type { HealthIndicator } from '@rsdk/core';
3
+ import { CheckResult } from '@rsdk/core';
4
+ export declare class MikroOrmHealthIndicator implements HealthIndicator {
5
+ private manager;
6
+ constructor(manager: EntityManager);
7
+ check(): Promise<CheckResult>;
8
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MikroOrmHealthIndicator = void 0;
13
+ const core_1 = require("@mikro-orm/core");
14
+ const common_1 = require("@nestjs/common");
15
+ const common_2 = require("@rsdk/common");
16
+ const core_2 = require("@rsdk/core");
17
+ const db_1 = require("@rsdk/db");
18
+ let MikroOrmHealthIndicator = class MikroOrmHealthIndicator {
19
+ manager;
20
+ constructor(manager) {
21
+ this.manager = manager;
22
+ }
23
+ async check() {
24
+ try {
25
+ await this.manager.getConnection().execute(db_1.HEALTH_CHECK_QUERY);
26
+ return core_2.CheckResult.up({ query: db_1.HEALTH_CHECK_QUERY });
27
+ }
28
+ catch (error) {
29
+ common_2.Assert.isError(error);
30
+ return core_2.CheckResult.down({ error: error.message });
31
+ }
32
+ }
33
+ };
34
+ exports.MikroOrmHealthIndicator = MikroOrmHealthIndicator;
35
+ exports.MikroOrmHealthIndicator = MikroOrmHealthIndicator = __decorate([
36
+ (0, common_1.Injectable)(),
37
+ (0, core_2.Indicator)('mikro-orm'),
38
+ __metadata("design:paramtypes", [core_1.EntityManager])
39
+ ], MikroOrmHealthIndicator);
40
+ //# sourceMappingURL=mikro-orm.healthcheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mikro-orm.healthcheck.js","sourceRoot":"","sources":["../../src/providers/mikro-orm.healthcheck.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0CAAgD;AAChD,2CAA4C;AAC5C,yCAAsC;AAEtC,qCAAoD;AACpD,iCAA8C;AAIvC,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IACd;IAApB,YAAoB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IAAG,CAAC;IAE9C,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,uBAAkB,CAAC,CAAC;YAE/D,OAAO,kBAAW,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAkB,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,eAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,kBAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF,CAAA;AAbY,0DAAuB;kCAAvB,uBAAuB;IAFnC,IAAA,mBAAU,GAAE;IACZ,IAAA,gBAAS,EAAC,WAAW,CAAC;qCAEQ,oBAAa;GAD/B,uBAAuB,CAanC"}
@@ -0,0 +1,7 @@
1
+ import type { MikroOrmModuleSyncOptions } from '@mikro-orm/nestjs';
2
+ import type { Type } from '@nestjs/common';
3
+ export interface MikroOrmPluginOptions {
4
+ type: NonNullable<MikroOrmModuleSyncOptions['type']>;
5
+ entitiesTs: NonNullable<MikroOrmModuleSyncOptions['entitiesTs'] | Type>[];
6
+ overrideConfig?: Partial<Omit<MikroOrmModuleSyncOptions, 'type'>>;
7
+ }
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ module.exports = require('@rsdk/jest/jest.config.e2e');
package/jest.config.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('@rsdk/jest/jest.config');
@@ -0,0 +1 @@
1
+ module.exports = require('@rsdk/jest/jest.config.unit');
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@rsdk/db.mikro-orm",
3
+ "version": "4.0.8-next.8",
4
+ "description": "MikroOrm module for platform",
5
+ "license": "Apache License 2.0",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "repository": {
10
+ "url": "https://github.com/R-Vision/rsdk"
11
+ },
12
+ "main": "dist/index.js",
13
+ "scripts": {
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "dependencies": {
17
+ "@rsdk/common.node": "^4.0.8-next.8",
18
+ "lodash": "^4.17.21"
19
+ },
20
+ "peerDependencies": {
21
+ "@mikro-orm/core": "5.7.12",
22
+ "@mikro-orm/nestjs": "5.2.3",
23
+ "@nestjs/common": "^10.0.0",
24
+ "@nestjs/core": "^10.0.0",
25
+ "@rsdk/common": "^4.0.8-next.8",
26
+ "@rsdk/common.nestjs": "^4.0.8-next.8",
27
+ "@rsdk/core": "^4.0.8-next.8",
28
+ "@rsdk/db": "^4.0.8-next.8",
29
+ "@rsdk/logging": "^4.0.8-next.8",
30
+ "@rsdk/nest-tools": "^4.0.8-next.8",
31
+ "reflect-metadata": "^0.1.13",
32
+ "rxjs": "^7.0.0"
33
+ },
34
+ "gitHead": "bf400e23af6cdb1c75f4136207422480d2beef61"
35
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export { MikroOrmPlugin } from './mikro-orm.plugin';
@@ -0,0 +1,33 @@
1
+ import {
2
+ NotFoundError,
3
+ SyntaxErrorException,
4
+ ValidationError,
5
+ } from '@mikro-orm/core';
6
+ import type { IErrorsTransformer, PipelineException } from '@rsdk/core';
7
+ import {
8
+ InputException,
9
+ InternalException,
10
+ NotFoundException,
11
+ } from '@rsdk/core';
12
+
13
+ export class MikroOrmErrorTransformer implements IErrorsTransformer {
14
+ match(ex: unknown): boolean {
15
+ return ex instanceof ValidationError || ex instanceof SyntaxErrorException;
16
+ }
17
+
18
+ transform(ex: any): PipelineException {
19
+ if (ex instanceof NotFoundError) {
20
+ return new NotFoundException(ex.message, {
21
+ cause: ex,
22
+ });
23
+ }
24
+
25
+ if (ex instanceof ValidationError) {
26
+ return new InputException(ex.message, {
27
+ cause: ex,
28
+ });
29
+ }
30
+
31
+ throw new InternalException(ex.message, { cause: ex });
32
+ }
33
+ }
@@ -0,0 +1,97 @@
1
+ /* eslint-disable @typescript-eslint/ban-types */
2
+
3
+ import type { MikroOrmModuleSyncOptions } from '@mikro-orm/nestjs';
4
+ import { MikroOrmModule } from '@mikro-orm/nestjs';
5
+ import type { DynamicModule } from '@nestjs/common';
6
+ import type { Constructor } from '@rsdk/common';
7
+ import type {
8
+ AppropriateTransports,
9
+ IErrorsTransformer,
10
+ PlatformAppPlugin,
11
+ } from '@rsdk/core';
12
+ import { APP_NAME } from '@rsdk/core';
13
+ import { LoggerFactory } from '@rsdk/logging';
14
+ import _ from 'lodash';
15
+ import { resolve } from 'node:path';
16
+
17
+ import { MikroOrmPluginConfig } from './providers/mikro-orm.config';
18
+ import { MikroOrmAdapter } from './providers/mikro-orm-logger.adapter';
19
+ import { MikroOrmErrorTransformer } from './mikro-orm.errors-transformer';
20
+ import { MikroOrmHealthIndicator } from './providers';
21
+ import type { MikroOrmPluginOptions } from './types';
22
+
23
+ export class MikroOrmPlugin implements PlatformAppPlugin {
24
+ private static readonly logger = LoggerFactory.create(MikroOrmPlugin);
25
+
26
+ /**
27
+ * По умолчанию парсит тип драйвера из env %PACKAGE_NAME%_DB_URL
28
+ */
29
+ constructor(private readonly options: MikroOrmPluginOptions) {}
30
+
31
+ get entities(): (string | any)[] | undefined {
32
+ return this?.options?.entitiesTs;
33
+ }
34
+
35
+ forTransports(): AppropriateTransports {
36
+ return 'any';
37
+ }
38
+
39
+ modules(): (Constructor | DynamicModule)[] {
40
+ const migrations = this.getMigrationsOption();
41
+ if (migrations.length === 0) {
42
+ MikroOrmPlugin.logger.warn('migrations not found');
43
+ }
44
+
45
+ return [
46
+ MikroOrmModule.forRootAsync({
47
+ imports: [
48
+ {
49
+ module: MikroOrmModule,
50
+ providers: [MikroOrmHealthIndicator, MikroOrmAdapter],
51
+ exports: [MikroOrmAdapter],
52
+ },
53
+ ],
54
+ inject: [MikroOrmPluginConfig, MikroOrmAdapter, APP_NAME],
55
+ useFactory: (
56
+ config: MikroOrmPluginConfig,
57
+ logger: MikroOrmAdapter,
58
+ appName: string,
59
+ ): MikroOrmModuleSyncOptions => {
60
+ return _(<MikroOrmModuleSyncOptions>{
61
+ type: this.options.type,
62
+ clientUrl: config.url.toString(),
63
+ ...(config.schema && {
64
+ schema: config.schema,
65
+ }),
66
+ loggerFactory: () => logger,
67
+ entities: this.entities,
68
+ autoLoadEntities: !this.entities,
69
+ name: appName + ':mikro-orm',
70
+ pool: {
71
+ min: config.poolMin,
72
+ max: config.poolMax,
73
+ },
74
+ migrations: {
75
+ tableName: 'mikro_orm_migrations',
76
+ path: './migrations',
77
+ glob: '!(*.d).{js,ts}',
78
+ },
79
+ allowGlobalContext: true,
80
+ ...(this.options.overrideConfig as any),
81
+ })
82
+ .omitBy(_.isUndefined)
83
+ .omitBy(_.isNull)
84
+ .value();
85
+ },
86
+ }),
87
+ ];
88
+ }
89
+
90
+ errorTransformers(): IErrorsTransformer[] {
91
+ return [new MikroOrmErrorTransformer()];
92
+ }
93
+
94
+ private getMigrationsOption(): string[] {
95
+ return [resolve(process.cwd(), 'dist/mikro-orm/migrations')];
96
+ }
97
+ }
@@ -0,0 +1,3 @@
1
+ export * from './mikro-orm-logger.adapter';
2
+ export * from './mikro-orm.config';
3
+ export * from './mikro-orm.healthcheck';
@@ -0,0 +1,111 @@
1
+ import type { LogContext, Logger, LoggerNamespace } from '@mikro-orm/core';
2
+ import { Injectable } from '@nestjs/common';
3
+ import { InjectLogger } from '@rsdk/core';
4
+ import { HEALTH_CHECK_QUERY } from '@rsdk/db';
5
+ import { ILogger } from '@rsdk/logging';
6
+
7
+ @Injectable()
8
+ export class MikroOrmAdapter implements Logger {
9
+ constructor(@InjectLogger('MikroOrm') private platformLogger: ILogger) {}
10
+
11
+ setDebugMode(_debugMode: boolean | LoggerNamespace[]): void {
12
+ // Так как мы управляем логированием на уровне приложения,
13
+ // нам не нужно обрабатывать события по включению и отключению дебага от микро-орм,
14
+ // но сам микро орм переодически дергает этот метод,
15
+ // для того чтобы он не падал с ошибкой отсутствия метода - создаем пустой метод
16
+ }
17
+
18
+ isEnabled(_namespace: LoggerNamespace): boolean {
19
+ // Так как мы управляем логированием на уровне приложения,
20
+ // нам не нужно обрабатывать события по включению и отключению дебага от микро-орм,
21
+ // но сам микро орм переодически дергает этот метод,
22
+ // для того чтобы он не падал с ошибкой отсутствия метода - создаем пустой метод
23
+ return true;
24
+ }
25
+
26
+ logQuery(context: LogContext): any {
27
+ const message = this.formatParts(
28
+ `query: ${context.query}`,
29
+ context.params && `parameters: ${JSON.stringify(context.params)}`,
30
+ );
31
+
32
+ if (context.query === HEALTH_CHECK_QUERY) {
33
+ this.platformLogger.trace(message);
34
+ } else {
35
+ this.platformLogger.debug(message);
36
+ }
37
+ }
38
+
39
+ logMigration(message: string): any {
40
+ this.platformLogger.info('Migration: ' + message);
41
+ }
42
+
43
+ formatParts(...parts: (string | boolean | undefined)[]): string {
44
+ return parts.filter(Boolean).join(' ');
45
+ }
46
+
47
+ logQuerySlow(time: number, query: string, parameters?: any[]): any {
48
+ const message = this.formatParts(
49
+ `query: ${query}`,
50
+ parameters && 'parameters: ' + parameters,
51
+ `time: ${time}`,
52
+ );
53
+
54
+ this.platformLogger.warn(message);
55
+ }
56
+
57
+ logQueryError(error: string | Error, query: string, parameters?: any[]): any {
58
+ const parts = [
59
+ `error: ${JSON.stringify(error)}`,
60
+ `query: ${query}`,
61
+ parameters && `parameters: ${JSON.stringify(parameters)}`,
62
+ ];
63
+ const message = this.formatParts(...parts);
64
+
65
+ this.platformLogger.error(message);
66
+ }
67
+
68
+ logSchemaBuild(message: string): any {
69
+ this.platformLogger.info(`SchemaBuild: ${message}`);
70
+ }
71
+
72
+ /**
73
+ * Logs a message inside given namespace.
74
+ */
75
+ log(
76
+ _namespace: LoggerNamespace,
77
+ message: string,
78
+ context?: LogContext,
79
+ ): void {
80
+ switch (context?.level) {
81
+ case 'info':
82
+ return this.platformLogger.info(message);
83
+ case 'error':
84
+ return this.platformLogger.error(message);
85
+ default:
86
+ return this.platformLogger.warn(message);
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Logs error message inside given namespace.
92
+ */
93
+ error(
94
+ _namespace: LoggerNamespace,
95
+ message: string,
96
+ _context?: LogContext,
97
+ ): void {
98
+ return this.platformLogger.error(message);
99
+ }
100
+
101
+ /**
102
+ * Logs warning message inside given namespace.
103
+ */
104
+ warn(
105
+ _namespace: LoggerNamespace,
106
+ message: string,
107
+ _context?: LogContext,
108
+ ): void {
109
+ return this.platformLogger.warn(message);
110
+ }
111
+ }
@@ -0,0 +1,49 @@
1
+ import { text } from '@rsdk/common';
2
+ import {
3
+ Config,
4
+ ConfigSection,
5
+ ConfigTag,
6
+ IntParser,
7
+ Property,
8
+ StringParser,
9
+ UrlParser,
10
+ } from '@rsdk/core';
11
+
12
+ @ConfigSection({
13
+ name: 'mikro-orm database config',
14
+ tags: [ConfigTag.infrastructure, ConfigTag.storage],
15
+ prefix: 'DB',
16
+ })
17
+ export class MikroOrmPluginConfig extends Config {
18
+ @Property('URL', new UrlParser(), {
19
+ description: 'Database server url',
20
+ })
21
+ url!: URL;
22
+
23
+ @Property('SCHEMA', new StringParser(), {
24
+ description: text`
25
+ Use schema for all entities.
26
+ **Only for postgres at the moment!**
27
+ `,
28
+ defaultValue: undefined,
29
+ })
30
+ schema!: string;
31
+
32
+ @Property('POOL_MIN', new IntParser(), {
33
+ defaultValue: 1,
34
+ description: text`
35
+ Minimum connection pool size.
36
+ **Only for postgres at the moment!**
37
+ `,
38
+ })
39
+ poolMin!: number;
40
+
41
+ @Property('POOL_MAX', new IntParser(), {
42
+ defaultValue: 10,
43
+ description: text`
44
+ Maximum connection pool size.
45
+ **Only for postgres at the moment!**
46
+ `,
47
+ })
48
+ poolMax!: number;
49
+ }
@@ -0,0 +1,23 @@
1
+ import { EntityManager } from '@mikro-orm/core';
2
+ import { Injectable } from '@nestjs/common';
3
+ import { Assert } from '@rsdk/common';
4
+ import type { HealthIndicator } from '@rsdk/core';
5
+ import { CheckResult, Indicator } from '@rsdk/core';
6
+ import { HEALTH_CHECK_QUERY } from '@rsdk/db';
7
+
8
+ @Injectable()
9
+ @Indicator('mikro-orm')
10
+ export class MikroOrmHealthIndicator implements HealthIndicator {
11
+ constructor(private manager: EntityManager) {}
12
+
13
+ async check(): Promise<CheckResult> {
14
+ try {
15
+ await this.manager.getConnection().execute(HEALTH_CHECK_QUERY);
16
+
17
+ return CheckResult.up({ query: HEALTH_CHECK_QUERY });
18
+ } catch (error: unknown) {
19
+ Assert.isError(error);
20
+ return CheckResult.down({ error: error.message });
21
+ }
22
+ }
23
+ }
package/src/types.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { MikroOrmModuleSyncOptions } from '@mikro-orm/nestjs';
2
+ import type { Type } from '@nestjs/common';
3
+
4
+ export interface MikroOrmPluginOptions {
5
+ type: NonNullable<MikroOrmModuleSyncOptions['type']>;
6
+ entitiesTs: NonNullable<MikroOrmModuleSyncOptions['entitiesTs'] | Type>[];
7
+ overrideConfig?: Partial<Omit<MikroOrmModuleSyncOptions, 'type'>>;
8
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "incremental": false,
5
+ "rootDir": "./src"
6
+ },
7
+ "include": [
8
+ "src/**/*"
9
+ ],
10
+ "exclude": [
11
+ "node_modules",
12
+ "dist",
13
+ "test",
14
+ "**/*spec.ts",
15
+ "**/*test.ts"
16
+ ]
17
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "@rsdk/tsconfig/base.json",
3
+ "compilerOptions": {
4
+ "declaration": true,
5
+ "incremental": false,
6
+ "outDir": "dist"
7
+ }
8
+ }