@eggjs/dal-plugin 4.0.0-beta.0

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/app.js ADDED
@@ -0,0 +1,38 @@
1
+ import { DalTableEggPrototypeHook } from "./lib/DalTableEggPrototypeHook.js";
2
+ import { MysqlDataSourceManager } from "./lib/MysqlDataSourceManager.js";
3
+ import { SqlMapManager } from "./lib/SqlMapManager.js";
4
+ import { TableModelManager } from "./lib/TableModelManager.js";
5
+ import { DalModuleLoadUnitHook } from "./lib/DalModuleLoadUnitHook.js";
6
+ import { TransactionPrototypeHook } from "./lib/TransactionPrototypeHook.js";
7
+ export default class DalAppBootHook {
8
+ app;
9
+ dalTableEggPrototypeHook;
10
+ dalModuleLoadUnitHook;
11
+ transactionPrototypeHook;
12
+ constructor(app) {
13
+ this.app = app;
14
+ }
15
+ configWillLoad() {
16
+ this.dalModuleLoadUnitHook = new DalModuleLoadUnitHook(this.app.config.env, this.app.moduleConfigs);
17
+ this.dalTableEggPrototypeHook = new DalTableEggPrototypeHook(this.app.logger);
18
+ this.transactionPrototypeHook = new TransactionPrototypeHook(this.app.moduleConfigs, this.app.logger);
19
+ this.app.eggPrototypeLifecycleUtil.registerLifecycle(this.dalTableEggPrototypeHook);
20
+ this.app.eggPrototypeLifecycleUtil.registerLifecycle(this.transactionPrototypeHook);
21
+ this.app.loadUnitLifecycleUtil.registerLifecycle(this.dalModuleLoadUnitHook);
22
+ }
23
+ async beforeClose() {
24
+ if (this.dalTableEggPrototypeHook) {
25
+ this.app.eggPrototypeLifecycleUtil.deleteLifecycle(this.dalTableEggPrototypeHook);
26
+ }
27
+ if (this.dalModuleLoadUnitHook) {
28
+ this.app.loadUnitLifecycleUtil.deleteLifecycle(this.dalModuleLoadUnitHook);
29
+ }
30
+ if (this.transactionPrototypeHook) {
31
+ this.app.eggPrototypeLifecycleUtil.deleteLifecycle(this.transactionPrototypeHook);
32
+ }
33
+ MysqlDataSourceManager.instance.clear();
34
+ SqlMapManager.instance.clear();
35
+ TableModelManager.instance.clear();
36
+ }
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFN0UsTUFBTSxDQUFDLE9BQU8sT0FBTyxjQUFjO0lBQ2hCLEdBQUcsQ0FBYztJQUMxQix3QkFBd0IsQ0FBMkI7SUFDbkQscUJBQXFCLENBQXdCO0lBQzdDLHdCQUF3QixDQUEyQjtJQUUzRCxZQUFZLEdBQWdCO1FBQzFCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEcsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,9 @@
1
+ import './types.ts';
2
+ export * from './lib/DalModuleLoadUnitHook.ts';
3
+ export * from './lib/DalTableEggPrototypeHook.ts';
4
+ export * from './lib/DataSource.ts';
5
+ export * from './lib/MysqlDataSourceManager.ts';
6
+ export * from './lib/SqlMapManager.ts';
7
+ export * from './lib/TableModelManager.ts';
8
+ export * from './lib/TransactionalAOP.ts';
9
+ export * from './lib/TransactionPrototypeHook.ts';
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ import "./types.js";
2
+ export * from "./lib/DalModuleLoadUnitHook.js";
3
+ export * from "./lib/DalTableEggPrototypeHook.js";
4
+ export * from "./lib/DataSource.js";
5
+ export * from "./lib/MysqlDataSourceManager.js";
6
+ export * from "./lib/SqlMapManager.js";
7
+ export * from "./lib/TableModelManager.js";
8
+ export * from "./lib/TransactionalAOP.js";
9
+ export * from "./lib/TransactionPrototypeHook.js";
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLENBQUM7QUFFcEIsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLG1DQUFtQyxDQUFDIn0=
@@ -0,0 +1,10 @@
1
+ import type { LifecycleHook } from '@eggjs/lifecycle';
2
+ import type { Logger, ModuleConfigHolder } from '@eggjs/tegg-types';
3
+ import type { LoadUnit, LoadUnitLifecycleContext } from '@eggjs/metadata';
4
+ export declare class DalModuleLoadUnitHook implements LifecycleHook<LoadUnitLifecycleContext, LoadUnit> {
5
+ private readonly moduleConfigs;
6
+ private readonly env;
7
+ private readonly logger?;
8
+ constructor(env: string, moduleConfigs: Record<string, ModuleConfigHolder>, logger?: Logger);
9
+ preCreate(_: LoadUnitLifecycleContext, loadUnit: LoadUnit): Promise<void>;
10
+ }
@@ -0,0 +1,42 @@
1
+ import { DatabaseForker } from '@eggjs/dal-runtime';
2
+ import { MysqlDataSourceManager } from "./MysqlDataSourceManager.js";
3
+ export class DalModuleLoadUnitHook {
4
+ moduleConfigs;
5
+ env;
6
+ logger;
7
+ constructor(env, moduleConfigs, logger) {
8
+ this.env = env;
9
+ this.moduleConfigs = moduleConfigs;
10
+ this.logger = logger;
11
+ }
12
+ async preCreate(_, loadUnit) {
13
+ const moduleConfigHolder = this.moduleConfigs[loadUnit.name];
14
+ if (!moduleConfigHolder)
15
+ return;
16
+ const dataSourceConfig = moduleConfigHolder.config
17
+ .dataSource;
18
+ if (!dataSourceConfig)
19
+ return;
20
+ await Promise.all(Object.entries(dataSourceConfig).map(async ([name, config]) => {
21
+ const dataSourceOptions = {
22
+ ...config,
23
+ name,
24
+ logger: this.logger,
25
+ };
26
+ const forker = new DatabaseForker(this.env, dataSourceOptions);
27
+ if (forker.shouldFork()) {
28
+ await forker.forkDb(loadUnit.unitPath);
29
+ }
30
+ try {
31
+ await MysqlDataSourceManager.instance.createDataSource(loadUnit.name, name, dataSourceOptions);
32
+ }
33
+ catch (e) {
34
+ if (e instanceof Error) {
35
+ e.message = `create module ${loadUnit.name} datasource ${name} failed: ${e.message}`;
36
+ }
37
+ throw e;
38
+ }
39
+ }));
40
+ }
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFsTW9kdWxlTG9hZFVuaXRIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9EYWxNb2R1bGVMb2FkVW5pdEhvb2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGNBQWMsRUFBMEIsTUFBTSxvQkFBb0IsQ0FBQztBQUc1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxNQUFNLE9BQU8scUJBQXFCO0lBQ2YsYUFBYSxDQUFxQztJQUNsRCxHQUFHLENBQVM7SUFDWixNQUFNLENBQVU7SUFFakMsWUFBWSxHQUFXLEVBQUUsYUFBaUQsRUFBRSxNQUFlO1FBQ3pGLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBMkIsRUFBRSxRQUFrQjtRQUM3RCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxrQkFBa0I7WUFBRSxPQUFPO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQW1ELGtCQUFrQixDQUFDLE1BQWM7YUFDdkcsVUFBVSxDQUFDO1FBQ2QsSUFBSSxDQUFDLGdCQUFnQjtZQUFFLE9BQU87UUFDOUIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDNUQsTUFBTSxpQkFBaUIsR0FBRztnQkFDeEIsR0FBRyxNQUFNO2dCQUNULElBQUk7Z0JBQ0osTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQ3BCLENBQUM7WUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDL0QsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sc0JBQXNCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDakcsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUM7b0JBQ3ZCLENBQUMsQ0FBQyxPQUFPLEdBQUcsaUJBQWlCLFFBQVEsQ0FBQyxJQUFJLGVBQWUsSUFBSSxZQUFZLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdkYsQ0FBQztnQkFDRCxNQUFNLENBQUMsQ0FBQztZQUNWLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGIn0=
@@ -0,0 +1,8 @@
1
+ import type { LifecycleHook } from '@eggjs/lifecycle';
2
+ import type { Logger } from '@eggjs/tegg-types';
3
+ import type { EggPrototype, EggPrototypeLifecycleContext } from '@eggjs/metadata';
4
+ export declare class DalTableEggPrototypeHook implements LifecycleHook<EggPrototypeLifecycleContext, EggPrototype> {
5
+ private readonly logger;
6
+ constructor(logger: Logger);
7
+ preCreate(ctx: EggPrototypeLifecycleContext): Promise<void>;
8
+ }
@@ -0,0 +1,22 @@
1
+ import { DaoInfoUtil, TableModel } from '@eggjs/dal-decorator';
2
+ import { SqlMapLoader } from '@eggjs/dal-runtime';
3
+ import { TableModelManager } from "./TableModelManager.js";
4
+ import { SqlMapManager } from "./SqlMapManager.js";
5
+ export class DalTableEggPrototypeHook {
6
+ logger;
7
+ constructor(logger) {
8
+ this.logger = logger;
9
+ }
10
+ async preCreate(ctx) {
11
+ if (!DaoInfoUtil.getIsDao(ctx.clazz)) {
12
+ return;
13
+ }
14
+ const tableClazz = ctx.clazz.clazzModel;
15
+ const tableModel = TableModel.build(tableClazz);
16
+ TableModelManager.instance.set(ctx.loadUnit.name, tableModel);
17
+ const loader = new SqlMapLoader(tableModel, ctx.clazz, this.logger);
18
+ const sqlMap = loader.load();
19
+ SqlMapManager.instance.set(ctx.loadUnit.name, sqlMap);
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFsVGFibGVFZ2dQcm90b3R5cGVIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9EYWxUYWJsZUVnZ1Byb3RvdHlwZUhvb2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE1BQU0sT0FBTyx3QkFBd0I7SUFDbEIsTUFBTSxDQUFTO0lBRWhDLFlBQVksTUFBYztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFpQztRQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUF1QixVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BFLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,8 @@
1
+ import { type ObjectInfo } from '@eggjs/core-decorator';
2
+ import { DataSource } from '@eggjs/dal-runtime';
3
+ import { TransactionalAOP } from './TransactionalAOP.ts';
4
+ export declare class DataSourceDelegate<T> extends DataSource<T> {
5
+ private transactionalAOP;
6
+ objInfo: ObjectInfo;
7
+ constructor(transactionalAOP: TransactionalAOP, objInfo: ObjectInfo);
8
+ }
@@ -0,0 +1,83 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import assert from 'node:assert';
14
+ import { AccessLevel, Inject, LoadUnitNameQualifierAttribute, MultiInstanceInfo, MultiInstanceProto, ObjectInitType, } from '@eggjs/core-decorator';
15
+ import { EggLoadUnitType } from '@eggjs/tegg-types';
16
+ import { LoaderFactory } from '@eggjs/tegg-loader';
17
+ import { ModuleConfigUtil } from '@eggjs/tegg-common-util';
18
+ import { DataSourceInjectName, DataSourceQualifierAttribute, TableInfoUtil, TableModel } from '@eggjs/dal-decorator';
19
+ import { DataSource } from '@eggjs/dal-runtime';
20
+ import { TableModelManager } from "./TableModelManager.js";
21
+ import { MysqlDataSourceManager } from "./MysqlDataSourceManager.js";
22
+ import { SqlMapManager } from "./SqlMapManager.js";
23
+ import { TransactionalAOP } from "./TransactionalAOP.js";
24
+ let DataSourceDelegate = class DataSourceDelegate extends DataSource {
25
+ // @ts-expect-error ignore nerver use
26
+ transactionalAOP;
27
+ objInfo;
28
+ constructor(transactionalAOP, objInfo) {
29
+ const dataSourceQualifierValue = objInfo.qualifiers.find((t) => t.attribute === DataSourceQualifierAttribute)?.value;
30
+ assert(dataSourceQualifierValue);
31
+ const [moduleName, dataSource, clazzName] = dataSourceQualifierValue.split('.');
32
+ const tableModel = TableModelManager.instance.get(moduleName, clazzName);
33
+ assert(tableModel, `not found table ${dataSourceQualifierValue}`);
34
+ const mysqlDataSource = MysqlDataSourceManager.instance.get(moduleName, dataSource);
35
+ assert(mysqlDataSource, `not found dataSource ${dataSource} in module ${moduleName}`);
36
+ const sqlMap = SqlMapManager.instance.get(moduleName, clazzName);
37
+ assert(sqlMap, `not found SqlMap ${clazzName} in module ${moduleName}`);
38
+ super(tableModel, mysqlDataSource, sqlMap);
39
+ this.transactionalAOP = transactionalAOP;
40
+ this.objInfo = objInfo;
41
+ }
42
+ };
43
+ DataSourceDelegate = __decorate([
44
+ MultiInstanceProto({
45
+ accessLevel: AccessLevel.PUBLIC,
46
+ initType: ObjectInitType.SINGLETON,
47
+ async getObjects(ctx) {
48
+ const config = ModuleConfigUtil.loadModuleConfigSync(ctx.unitPath);
49
+ const dataSources = Object.keys(config?.dataSource || {});
50
+ const result = [];
51
+ const loader = LoaderFactory.createLoader(ctx.unitPath, EggLoadUnitType.MODULE);
52
+ const clazzList = await loader.load();
53
+ const tableClazzList = clazzList.filter((t) => {
54
+ return TableInfoUtil.getIsTable(t);
55
+ });
56
+ const dataSourceLength = dataSources.length;
57
+ for (const dataSource of dataSources) {
58
+ const moduleClazzList = tableClazzList.filter((clazz) => {
59
+ const tableParams = TableInfoUtil.getTableParams(clazz);
60
+ const dataSourceName = tableParams?.dataSourceName ?? 'default';
61
+ return dataSourceLength === 1 || dataSourceName === dataSource;
62
+ });
63
+ for (const clazz of moduleClazzList) {
64
+ result.push({
65
+ name: DataSourceInjectName,
66
+ qualifiers: [
67
+ {
68
+ attribute: DataSourceQualifierAttribute,
69
+ value: `${ctx.moduleName}.${dataSource}.${clazz.name}`,
70
+ },
71
+ ],
72
+ });
73
+ }
74
+ }
75
+ return result;
76
+ },
77
+ }),
78
+ __param(0, Inject({ name: 'transactionalAOP' })),
79
+ __param(1, MultiInstanceInfo([DataSourceQualifierAttribute, LoadUnitNameQualifierAttribute])),
80
+ __metadata("design:paramtypes", [TransactionalAOP, Object])
81
+ ], DataSourceDelegate);
82
+ export { DataSourceDelegate };
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvRGF0YVNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsT0FBTyxFQUNMLFdBQVcsRUFDWCxNQUFNLEVBQ04sOEJBQThCLEVBQzlCLGlCQUFpQixFQUNqQixrQkFBa0IsRUFHbEIsY0FBYyxHQUNmLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsNEJBQTRCLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFvQ2xELElBQU0sa0JBQWtCLEdBQXhCLE1BQU0sa0JBQXNCLFNBQVEsVUFBYTtJQUN0RCxxQ0FBcUM7SUFDN0IsZ0JBQWdCLENBQW1CO0lBQzNDLE9BQU8sQ0FBYTtJQUVwQixZQUN3QyxnQkFBa0MsRUFFeEUsT0FBbUI7UUFFbkIsTUFBTSx3QkFBd0IsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDdEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMs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
@@ -0,0 +1,11 @@
1
+ import { type DataSourceOptions, MysqlDataSource } from '@eggjs/dal-runtime';
2
+ export declare class MysqlDataSourceManager {
3
+ static instance: MysqlDataSourceManager;
4
+ private readonly dataSourceIndices;
5
+ private readonly dataSources;
6
+ constructor();
7
+ get(moduleName: string, dataSourceName: string): MysqlDataSource | undefined;
8
+ createDataSource(moduleName: string, dataSourceName: string, config: DataSourceOptions): Promise<void>;
9
+ clear(): void;
10
+ static createDataSourceKey(dataSourceOptions: DataSourceOptions): string;
11
+ }
@@ -0,0 +1,53 @@
1
+ import crypto from 'node:crypto';
2
+ import { MysqlDataSource } from '@eggjs/dal-runtime';
3
+ export class MysqlDataSourceManager {
4
+ static instance = new MysqlDataSourceManager();
5
+ dataSourceIndices;
6
+ dataSources;
7
+ constructor() {
8
+ this.dataSourceIndices = new Map();
9
+ this.dataSources = new Map();
10
+ }
11
+ get(moduleName, dataSourceName) {
12
+ const dataSourceIndex = this.dataSourceIndices.get(moduleName)?.get(dataSourceName);
13
+ if (dataSourceIndex) {
14
+ return this.dataSources.get(dataSourceIndex);
15
+ }
16
+ }
17
+ async createDataSource(moduleName, dataSourceName, config) {
18
+ const { logger, ...dsConfig } = config || {};
19
+ const dataSourceConfig = {
20
+ ...dsConfig,
21
+ name: dataSourceName,
22
+ };
23
+ const index = MysqlDataSourceManager.createDataSourceKey(dataSourceConfig);
24
+ let dataSource = this.dataSources.get(index);
25
+ if (!dataSource) {
26
+ dataSource = new MysqlDataSource({ ...dataSourceConfig, logger });
27
+ this.dataSources.set(index, dataSource);
28
+ }
29
+ let moduleDataSourceIndices = this.dataSourceIndices.get(moduleName);
30
+ if (!moduleDataSourceIndices) {
31
+ moduleDataSourceIndices = new Map();
32
+ this.dataSourceIndices.set(moduleName, moduleDataSourceIndices);
33
+ }
34
+ moduleDataSourceIndices.set(dataSourceName, index);
35
+ await dataSource.ready();
36
+ }
37
+ clear() {
38
+ this.dataSourceIndices.clear();
39
+ }
40
+ static createDataSourceKey(dataSourceOptions) {
41
+ const hash = crypto.createHash('md5');
42
+ const keys = Object.keys(dataSourceOptions).sort();
43
+ for (const key of keys) {
44
+ const value = dataSourceOptions[key];
45
+ if (value) {
46
+ hash.update(key);
47
+ hash.update(String(value));
48
+ }
49
+ }
50
+ return hash.digest('hex');
51
+ }
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXlzcWxEYXRhU291cmNlTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvTXlzcWxEYXRhU291cmNlTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsT0FBTyxFQUEwQixlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3RSxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLE1BQU0sQ0FBQyxRQUFRLEdBQTJCLElBQUksc0JBQXNCLEVBQUUsQ0FBQztJQUV0RCxpQkFBaUIsQ0FHaEM7SUFDZSxXQUFXLENBQXFEO0lBRWpGO1FBQ0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxHQUFHLENBQUMsVUFBa0IsRUFBRSxjQUFzQjtRQUM1QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRixJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBa0IsRUFBRSxjQUFzQixFQUFFLE1BQXlCO1FBQzFGLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQzdDLE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsR0FBRyxRQUFRO1lBQ1gsSUFBSSxFQUFFLGNBQWM7U0FDckIsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0UsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLFVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUM3Qix1QkFBdUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkQsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBb0M7UUFDN0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxHQUE4QixDQUFDLENBQUM7WUFDaEUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUMifQ==
@@ -0,0 +1,9 @@
1
+ import type { TableSqlMap } from '@eggjs/dal-runtime';
2
+ export declare class SqlMapManager {
3
+ static instance: SqlMapManager;
4
+ private sqlMaps;
5
+ constructor();
6
+ get(moduleName: string, clazzName: string): TableSqlMap | undefined;
7
+ set(moduleName: string, sqlMap: TableSqlMap): void;
8
+ clear(): void;
9
+ }
@@ -0,0 +1,22 @@
1
+ export class SqlMapManager {
2
+ static instance = new SqlMapManager();
3
+ sqlMaps;
4
+ constructor() {
5
+ this.sqlMaps = new Map();
6
+ }
7
+ get(moduleName, clazzName) {
8
+ return this.sqlMaps.get(moduleName)?.get(clazzName);
9
+ }
10
+ set(moduleName, sqlMap) {
11
+ let tables = this.sqlMaps.get(moduleName);
12
+ if (!tables) {
13
+ tables = new Map();
14
+ this.sqlMaps.set(moduleName, tables);
15
+ }
16
+ tables.set(sqlMap.name, sqlMap);
17
+ }
18
+ clear() {
19
+ this.sqlMaps.clear();
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FsTWFwTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvU3FsTWFwTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sYUFBYTtJQUN4QixNQUFNLENBQUMsUUFBUSxHQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO0lBRTdDLE9BQU8sQ0FBeUQ7SUFFeEU7UUFDRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELEdBQUcsQ0FBQyxVQUFrQixFQUFFLFNBQWlCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxHQUFHLENBQUMsVUFBa0IsRUFBRSxNQUFtQjtRQUN6QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsQ0FBQyJ9
@@ -0,0 +1,9 @@
1
+ import type { TableModel } from '@eggjs/dal-decorator';
2
+ export declare class TableModelManager {
3
+ static instance: TableModelManager;
4
+ private tableModels;
5
+ constructor();
6
+ get(moduleName: string, clazzName: string): TableModel | undefined;
7
+ set(moduleName: string, tableModel: TableModel): void;
8
+ clear(): void;
9
+ }
@@ -0,0 +1,22 @@
1
+ export class TableModelManager {
2
+ static instance = new TableModelManager();
3
+ tableModels;
4
+ constructor() {
5
+ this.tableModels = new Map();
6
+ }
7
+ get(moduleName, clazzName) {
8
+ return this.tableModels.get(moduleName)?.get(clazzName);
9
+ }
10
+ set(moduleName, tableModel) {
11
+ let tables = this.tableModels.get(moduleName);
12
+ if (!tables) {
13
+ tables = new Map();
14
+ this.tableModels.set(moduleName, tables);
15
+ }
16
+ tables.set(tableModel.clazz.name, tableModel);
17
+ }
18
+ clear() {
19
+ this.tableModels.clear();
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFibGVNb2RlbE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL1RhYmxlTW9kZWxNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsTUFBTSxDQUFDLFFBQVEsR0FBc0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0lBRXJELFdBQVcsQ0FBd0Q7SUFFM0U7UUFDRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELEdBQUcsQ0FBQyxVQUFrQixFQUFFLFNBQWlCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxHQUFHLENBQUMsVUFBa0IsRUFBRSxVQUFzQjtRQUM1QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUMifQ==
@@ -0,0 +1,9 @@
1
+ import type { LifecycleHook } from '@eggjs/lifecycle';
2
+ import type { ModuleConfigHolder, Logger } from '@eggjs/tegg-types';
3
+ import type { EggPrototype, EggPrototypeLifecycleContext } from '@eggjs/metadata';
4
+ export declare class TransactionPrototypeHook implements LifecycleHook<EggPrototypeLifecycleContext, EggPrototype> {
5
+ private readonly moduleConfigs;
6
+ private readonly logger;
7
+ constructor(moduleConfigs: Record<string, ModuleConfigHolder>, logger: Logger);
8
+ preCreate(ctx: EggPrototypeLifecycleContext): Promise<void>;
9
+ }
@@ -0,0 +1,55 @@
1
+ import assert from 'node:assert';
2
+ import { PropagationType } from '@eggjs/tegg-types';
3
+ import { TransactionMetaBuilder } from '@eggjs/transaction-decorator';
4
+ import { Pointcut } from '@eggjs/aop-decorator';
5
+ import { TransactionalAOP } from "./TransactionalAOP.js";
6
+ import { MysqlDataSourceManager } from "./MysqlDataSourceManager.js";
7
+ export class TransactionPrototypeHook {
8
+ moduleConfigs;
9
+ logger;
10
+ constructor(moduleConfigs, logger) {
11
+ this.moduleConfigs = moduleConfigs;
12
+ this.logger = logger;
13
+ }
14
+ async preCreate(ctx) {
15
+ const builder = new TransactionMetaBuilder(ctx.clazz);
16
+ const transactionMetadataList = builder.build();
17
+ if (transactionMetadataList.length < 1) {
18
+ return;
19
+ }
20
+ const moduleName = ctx.loadUnit.name;
21
+ for (const transactionMetadata of transactionMetadataList) {
22
+ const clazzName = `${moduleName}.${ctx.clazz.name}.${String(transactionMetadata.method)}`;
23
+ const datasourceConfigs = this.moduleConfigs[moduleName]?.config?.dataSource || {};
24
+ let datasourceName;
25
+ if (transactionMetadata.datasourceName) {
26
+ assert(datasourceConfigs[transactionMetadata.datasourceName], `method ${clazzName} specified datasource ${transactionMetadata.datasourceName} not exists`);
27
+ datasourceName = transactionMetadata.datasourceName;
28
+ this.logger.info(`use datasource [${transactionMetadata.datasourceName}] for class ${clazzName}`);
29
+ }
30
+ else {
31
+ const dataSources = Object.keys(datasourceConfigs);
32
+ if (dataSources.length === 1) {
33
+ datasourceName = dataSources[0];
34
+ }
35
+ else {
36
+ throw new Error(`method ${clazzName} not specified datasource, module ${moduleName} has multi datasource, should specify datasource name`);
37
+ }
38
+ this.logger.info(`use default datasource ${dataSources[0]} for class ${clazzName}`);
39
+ }
40
+ const adviceParams = {
41
+ propagation: transactionMetadata.propagation,
42
+ dataSourceGetter: () => {
43
+ const mysqlDataSource = MysqlDataSourceManager.instance.get(moduleName, datasourceName);
44
+ if (!mysqlDataSource) {
45
+ throw new Error(`method ${clazzName} not found datasource ${datasourceName}`);
46
+ }
47
+ return mysqlDataSource;
48
+ },
49
+ };
50
+ assert(adviceParams.propagation === PropagationType.REQUIRED, 'Transactional propagation only support required for now');
51
+ Pointcut(TransactionalAOP, { adviceParams })(ctx.clazz.prototype, transactionMetadata.method);
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25Qcm90b3R5cGVIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9UcmFuc2FjdGlvblByb3RvdHlwZUhvb2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBS2pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGdCQUFnQixFQUE0QixNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXJFLE1BQU0sT0FBTyx3QkFBd0I7SUFDbEIsYUFBYSxDQUFxQztJQUNsRCxNQUFNLENBQVM7SUFFaEMsWUFBWSxhQUFpRCxFQUFFLE1BQWM7UUFDM0UsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBaUM7UUFDdEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEQsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNyQyxLQUFLLE1BQU0sbUJBQW1CLElBQUksdUJBQXVCLEVBQUUsQ0FBQztZQUMxRCxNQUFNLFNBQVMsR0FBRyxHQUFHLFVBQVUsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxRixNQUFNLGlCQUFpQixHQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBYyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUM7WUFFNUYsSUFBSSxjQUFzQixDQUFDO1lBQzNCLElBQUksbUJBQW1CLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sQ0FDSixpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsRUFDckQsVUFBVSxTQUFTLHlCQUF5QixtQkFBbUIsQ0FBQyxjQUFjLGFBQWEsQ0FDNUYsQ0FBQztnQkFDRixjQUFjLEdBQUcsbUJBQW1CLENBQUMsY0FBYyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsbUJBQW1CLENBQUMsY0FBYyxlQUFlLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDcEcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM3QixjQUFjLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixVQUFVLFNBQVMscUNBQXFDLFVBQVUsdURBQXVELENBQzFILENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUNELE1BQU0sWUFBWSxHQUF3QjtnQkFDeEMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLFdBQVc7Z0JBQzVDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtvQkFDckIsTUFBTSxlQUFlLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3hGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLFNBQVMseUJBQXlCLGNBQWMsRUFBRSxDQUFDLENBQUM7b0JBQ2hGLENBQUM7b0JBQ0QsT0FBTyxlQUFlLENBQUM7Z0JBQ3pCLENBQUM7YUFDRixDQUFDO1lBQ0YsTUFBTSxDQUNKLFlBQVksQ0FBQyxXQUFXLEtBQUssZUFBZSxDQUFDLFFBQVEsRUFDckQseURBQXlELENBQzFELENBQUM7WUFDRixRQUFRLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFFLEdBQUcsQ0FBQyxLQUFhLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pHLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,11 @@
1
+ import { type AdviceContext, type IAdvice } from '@eggjs/aop-decorator';
2
+ import { type EggProtoImplClass } from '@eggjs/core-decorator';
3
+ import { PropagationType } from '@eggjs/tegg-types';
4
+ import { MysqlDataSource } from '@eggjs/dal-runtime';
5
+ export interface TransactionalParams {
6
+ propagation: PropagationType;
7
+ dataSourceGetter: () => MysqlDataSource;
8
+ }
9
+ export declare class TransactionalAOP implements IAdvice<EggProtoImplClass, TransactionalParams> {
10
+ around(ctx: AdviceContext<EggProtoImplClass, TransactionalParams>, next: () => Promise<any>): Promise<void>;
11
+ }
@@ -0,0 +1,28 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Advice } from '@eggjs/aop-decorator';
8
+ import { AccessLevel, ObjectInitType } from '@eggjs/core-decorator';
9
+ import { PropagationType } from '@eggjs/tegg-types';
10
+ import { MysqlDataSource } from '@eggjs/dal-runtime';
11
+ let TransactionalAOP = class TransactionalAOP {
12
+ async around(ctx, next) {
13
+ const { propagation, dataSourceGetter } = ctx.adviceParams;
14
+ const dataSource = dataSourceGetter();
15
+ if (propagation === PropagationType.ALWAYS_NEW) {
16
+ return await dataSource.beginTransactionScope(next);
17
+ }
18
+ return await dataSource.beginTransactionScope(next);
19
+ }
20
+ };
21
+ TransactionalAOP = __decorate([
22
+ Advice({
23
+ accessLevel: AccessLevel.PUBLIC,
24
+ initType: ObjectInitType.SINGLETON,
25
+ })
26
+ ], TransactionalAOP);
27
+ export { TransactionalAOP };
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25hbEFPUC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvVHJhbnNhY3Rpb25hbEFPUC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFvQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxXQUFXLEVBQTBCLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFXOUMsSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBZ0I7SUFDcEIsS0FBSyxDQUFDLE1BQU0sQ0FDakIsR0FBMEQsRUFDMUQsSUFBd0I7UUFFeEIsTUFBTSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEdBQUcsQ0FBQyxZQUFhLENBQUM7UUFDNUQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QyxJQUFJLFdBQVcsS0FBSyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDL0MsT0FBTyxNQUFNLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsT0FBTyxNQUFNLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0YsQ0FBQTtBQVpZLGdCQUFnQjtJQUo1QixNQUFNLENBQUM7UUFDTixXQUFXLEVBQUUsV0FBVyxDQUFDLE1BQU07UUFDL0IsUUFBUSxFQUFFLGNBQWMsQ0FBQyxTQUFTO0tBQ25DLENBQUM7R0FDVyxnQkFBZ0IsQ0FZNUIifQ==
@@ -0,0 +1 @@
1
+ import '@eggjs/tegg-plugin/types';
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ import '@eggjs/tegg-plugin/types';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTywwQkFBMEIsQ0FBQyJ9
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "@eggjs/dal-plugin",
3
+ "eggPlugin": {
4
+ "name": "teggDal",
5
+ "strict": false,
6
+ "dependencies": [
7
+ "tegg"
8
+ ]
9
+ },
10
+ "eggModule": {
11
+ "name": "teggDal"
12
+ },
13
+ "version": "4.0.0-beta.0",
14
+ "description": "dal plugin for egg",
15
+ "keywords": [
16
+ "egg",
17
+ "plugin",
18
+ "typescript",
19
+ "module",
20
+ "tegg",
21
+ "dal"
22
+ ],
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "type": "module",
27
+ "exports": {
28
+ ".": "./dist/index.js",
29
+ "./app": "./dist/app.js",
30
+ "./lib/DalModuleLoadUnitHook": "./dist/lib/DalModuleLoadUnitHook.js",
31
+ "./lib/DalTableEggPrototypeHook": "./dist/lib/DalTableEggPrototypeHook.js",
32
+ "./lib/DataSource": "./dist/lib/DataSource.js",
33
+ "./lib/MysqlDataSourceManager": "./dist/lib/MysqlDataSourceManager.js",
34
+ "./lib/SqlMapManager": "./dist/lib/SqlMapManager.js",
35
+ "./lib/TableModelManager": "./dist/lib/TableModelManager.js",
36
+ "./lib/TransactionalAOP": "./dist/lib/TransactionalAOP.js",
37
+ "./lib/TransactionPrototypeHook": "./dist/lib/TransactionPrototypeHook.js",
38
+ "./types": "./dist/types.js",
39
+ "./package.json": "./package.json"
40
+ },
41
+ "homepage": "https://github.com/eggjs/egg/tree/next/tegg/plugin/dal",
42
+ "bugs": {
43
+ "url": "https://github.com/eggjs/egg/issues"
44
+ },
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git@github.com:eggjs/egg.git",
48
+ "directory": "tegg/plugin/dal"
49
+ },
50
+ "engines": {
51
+ "node": ">=22.18.0"
52
+ },
53
+ "dependencies": {
54
+ "@eggjs/aop-decorator": "4.0.0-beta.29",
55
+ "@eggjs/dal-runtime": "4.0.0-beta.29",
56
+ "@eggjs/tegg-common-util": "4.0.0-beta.29",
57
+ "@eggjs/dal-decorator": "4.0.0-beta.29",
58
+ "@eggjs/core-decorator": "4.0.0-beta.29",
59
+ "@eggjs/lifecycle": "4.0.0-beta.29",
60
+ "@eggjs/tegg-loader": "4.0.0-beta.29",
61
+ "@eggjs/metadata": "4.0.0-beta.29",
62
+ "@eggjs/tegg-types": "4.0.0-beta.29",
63
+ "@eggjs/transaction-decorator": "4.0.0-beta.29"
64
+ },
65
+ "peerDependencies": {
66
+ "@eggjs/tegg-plugin": "4.0.0-beta.29",
67
+ "egg": "4.1.0-beta.29"
68
+ },
69
+ "devDependencies": {
70
+ "@types/node": "^24.9.1",
71
+ "globby": "^11.0.2",
72
+ "tsdown": "0.15.9",
73
+ "typescript": "^5.9.3",
74
+ "unplugin-unused": "^0.5.4",
75
+ "@eggjs/tegg": "4.0.0-beta.29",
76
+ "@eggjs/mock": "7.0.0-beta.29",
77
+ "@eggjs/aop-plugin": "4.0.0-beta.29",
78
+ "@eggjs/tegg-plugin": "4.0.0-beta.29",
79
+ "@eggjs/tegg-config": "4.0.0-beta.29",
80
+ "@eggjs/tracer": "4.0.0-beta.29",
81
+ "egg": "4.1.0-beta.29"
82
+ },
83
+ "publishConfig": {
84
+ "access": "public"
85
+ },
86
+ "main": "./dist/index.js",
87
+ "module": "./dist/index.js",
88
+ "types": "./dist/index.d.ts",
89
+ "scripts": {
90
+ "clean": "rimraf dist *.tsbuildinfo",
91
+ "build": "tsdown && npm run clean && tsc -p tsconfig.build.json",
92
+ "typecheck": "tsc --noEmit"
93
+ }
94
+ }