@eggjs/dal-runtime 4.0.0-beta.35 → 4.0.0-beta.36

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.
@@ -1,150 +1,119 @@
1
- import fs from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { PrototypeUtil } from '@eggjs/core-decorator';
4
- import { ColumnModel, TableModel } from '@eggjs/dal-decorator';
5
- import { Templates } from '@eggjs/tegg-types';
6
- import js_beautify from 'js-beautify';
7
- import _ from 'lodash';
8
- import nunjucks, {} from 'nunjucks';
9
- import { SqlGenerator } from "./SqlGenerator.js";
10
1
  import { TemplateUtil } from "./TemplateUtil.js";
11
- export class CodeGenerator {
12
- moduleDir;
13
- moduleName;
14
- teggPkg;
15
- dalPkg;
16
- constructor(options) {
17
- this.moduleDir = options.moduleDir;
18
- this.moduleName = options.moduleName;
19
- this.teggPkg = options.teggPkg ?? '@eggjs/tegg';
20
- this.dalPkg = options.dalPkg ?? '@eggjs/tegg/dal';
21
- this.createNunjucksEnv();
22
- }
23
- njkEnv;
24
- createNunjucksEnv() {
25
- this.njkEnv = nunjucks.configure(path.join(__dirname, './templates'), {
26
- autoescape: false,
27
- });
28
- this.njkEnv.addFilter('pascalCase', (name) => _.upperFirst(_.camelCase(name)));
29
- this.njkEnv.addFilter('camelCase', (name) => _.camelCase(name));
30
- this.njkEnv.addFilter('dbTypeToTSType', TemplateUtil.dbTypeToTsType);
31
- }
32
- genCode(tplName, filePath, tableModel) {
33
- let tableModelAbsolutePath = PrototypeUtil.getFilePath(tableModel.clazz);
34
- tableModelAbsolutePath = tableModelAbsolutePath.substring(0, tableModelAbsolutePath.length - 3);
35
- const data = {
36
- table: tableModel,
37
- file: filePath,
38
- fileName: path.basename(filePath),
39
- clazzName: tableModel.clazz.name,
40
- moduleName: this.moduleName,
41
- teggPkg: this.teggPkg,
42
- dalPkg: this.dalPkg,
43
- id: tableModel.columns.find((t) => t.propertyName === 'id'),
44
- primaryIndex: tableModel.getPrimary(),
45
- tableModelPath: TemplateUtil.importPath(tableModelAbsolutePath, path.dirname(filePath)) + '.ts',
46
- extensionPath: `../../extension/${tableModel.clazz.name}Extension.ts`,
47
- structurePath: `../../structure/${tableModel.clazz.name}.json`,
48
- // FIXME: not support with { type: 'json' } in nunjucks
49
- // importStructurePathWithJSON: `import Structure from '../../structure/${tableModel.clazz.name}.json' with { type: 'json' }`,
50
- sqlPath: `../../structure/${tableModel.clazz.name}.sql`,
51
- columnMap: tableModel.columns.reduce((p, c) => {
52
- p[c.propertyName] = c;
53
- return p;
54
- }, {}),
55
- };
56
- return this.njkEnv.render(`${tplName}.njk`, data);
57
- }
58
- async generate(tableModel) {
59
- let dalDir;
60
- try {
61
- await fs.access(path.join(this.moduleDir, 'src'));
62
- dalDir = path.join(this.moduleDir, 'src/dal');
63
- }
64
- catch {
65
- dalDir = path.join(this.moduleDir, 'dal');
66
- }
67
- // const tableName = tableModel.name;
68
- // const clazzName = tableModel.clazz.name;
69
- const clazzFileName = path.basename(PrototypeUtil.getFilePath(tableModel.clazz));
70
- const baseFileName = path.basename(clazzFileName, '.ts');
71
- // 要动的一些文件
72
- const paths = {
73
- // e.g. app/dal/dao/base/example.ts
74
- baseBizDAO: path.join(dalDir, `dao/base/Base${baseFileName}DAO.ts`),
75
- // e.g. app/dal/dao/example.ts
76
- bizDAO: path.join(dalDir, `dao/${baseFileName}DAO.ts`),
77
- // e.g. app/dal/extension/example.ts
78
- extension: path.join(dalDir, `extension/${baseFileName}Extension.ts`),
79
- // e.g. app/dal/structure/example.json
80
- structure: path.join(dalDir, `structure/${baseFileName}.json`),
81
- // e.g. app/dal/structure/example.sql
82
- structureSql: path.join(dalDir, `structure/${baseFileName}.sql`),
83
- };
84
- // 建立 structure 文件
85
- await fs.mkdir(path.dirname(paths.structure), {
86
- recursive: true,
87
- });
88
- await fs.writeFile(paths.structure, JSON.stringify(tableModel, null, 2), 'utf8');
89
- const sqlGenerator = new SqlGenerator();
90
- const structureSql = sqlGenerator.generate(tableModel);
91
- await fs.writeFile(paths.structureSql, structureSql, 'utf8');
92
- const codes = [
93
- {
94
- templates: Templates.BASE_DAO,
95
- filePath: paths.baseBizDAO,
96
- beautify: true,
97
- overwrite: true,
98
- },
99
- {
100
- templates: Templates.DAO,
101
- filePath: paths.bizDAO,
102
- beautify: true,
103
- overwrite: false,
104
- },
105
- {
106
- templates: Templates.EXTENSION,
107
- filePath: paths.extension,
108
- beautify: false,
109
- overwrite: false,
110
- },
111
- ];
112
- for (const { templates, filePath, beautify, overwrite } of codes) {
113
- await fs.mkdir(path.dirname(filePath), {
114
- recursive: true,
115
- });
116
- const code = this.genCode(templates, filePath, tableModel);
117
- let beautified;
118
- if (beautify) {
119
- beautified = js_beautify(code, {
120
- brace_style: 'preserve-inline',
121
- indent_size: 2,
122
- jslint_happy: true,
123
- preserve_newlines: false,
124
- });
125
- }
126
- else {
127
- beautified = code;
128
- }
129
- beautified = beautified
130
- .replace(/( )*\/\/ empty-line( )*/g, '')
131
- .replace(/Promise( )*<( )*(.+?)( )*>/g, 'Promise<$3>')
132
- .replace(/Optional( )*<( )*(.+?)( )*>/g, 'Optional<$3>')
133
- .replace(/Record( )*<( )*(.+?)( )*>/g, 'Record<$3>')
134
- .replace(/Partial( )*<( )*(.+?)( )*>/g, 'Partial<$3>')
135
- .replace(/DataSource( )*<( )*(.+?)( )*>/g, 'DataSource<$3>')
136
- .replace(/ \? :/g, '?:');
137
- if (overwrite !== true) {
138
- try {
139
- await fs.access(filePath);
140
- continue;
141
- }
142
- catch {
143
- // file not exists
144
- }
145
- }
146
- await fs.writeFile(filePath, beautified, 'utf8');
147
- }
148
- }
149
- }
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29kZUdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Db2RlR2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUMsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLFFBQVEsRUFBRSxFQUFvQixNQUFNLFVBQVUsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE1BQU0sT0FBTyxhQUFhO0lBQ1AsU0FBUyxDQUFTO0lBQ2xCLFVBQVUsQ0FBUztJQUNuQixPQUFPLENBQVM7SUFDaEIsTUFBTSxDQUFTO0lBRWhDLFlBQVksT0FBNkI7UUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksYUFBYSxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQztRQUNsRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU8sTUFBTSxDQUFjO0lBRTVCLGlCQUFpQjtRQUNmLElBQUksQ0FB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
2
+ import { SqlGenerator } from "./SqlGenerator.js";
3
+ import { ColumnModel, TableModel } from "@eggjs/dal-decorator";
4
+ import { Templates } from "@eggjs/tegg-types";
5
+ import _ from "lodash";
6
+ import path from "node:path";
7
+ import fs from "node:fs/promises";
8
+ import { PrototypeUtil } from "@eggjs/core-decorator";
9
+ import js_beautify from "js-beautify";
10
+ import nunjucks from "nunjucks";
11
+
12
+ //#region src/CodeGenerator.ts
13
+ var CodeGenerator = class {
14
+ moduleDir;
15
+ moduleName;
16
+ teggPkg;
17
+ dalPkg;
18
+ constructor(options) {
19
+ this.moduleDir = options.moduleDir;
20
+ this.moduleName = options.moduleName;
21
+ this.teggPkg = options.teggPkg ?? "@eggjs/tegg";
22
+ this.dalPkg = options.dalPkg ?? "@eggjs/tegg/dal";
23
+ this.createNunjucksEnv();
24
+ }
25
+ njkEnv;
26
+ createNunjucksEnv() {
27
+ this.njkEnv = nunjucks.configure(path.join(__dirname, "./templates"), { autoescape: false });
28
+ this.njkEnv.addFilter("pascalCase", (name) => _.upperFirst(_.camelCase(name)));
29
+ this.njkEnv.addFilter("camelCase", (name) => _.camelCase(name));
30
+ this.njkEnv.addFilter("dbTypeToTSType", TemplateUtil.dbTypeToTsType);
31
+ }
32
+ genCode(tplName, filePath, tableModel) {
33
+ let tableModelAbsolutePath = PrototypeUtil.getFilePath(tableModel.clazz);
34
+ tableModelAbsolutePath = tableModelAbsolutePath.substring(0, tableModelAbsolutePath.length - 3);
35
+ const data = {
36
+ table: tableModel,
37
+ file: filePath,
38
+ fileName: path.basename(filePath),
39
+ clazzName: tableModel.clazz.name,
40
+ moduleName: this.moduleName,
41
+ teggPkg: this.teggPkg,
42
+ dalPkg: this.dalPkg,
43
+ id: tableModel.columns.find((t) => t.propertyName === "id"),
44
+ primaryIndex: tableModel.getPrimary(),
45
+ tableModelPath: TemplateUtil.importPath(tableModelAbsolutePath, path.dirname(filePath)) + ".ts",
46
+ extensionPath: `../../extension/${tableModel.clazz.name}Extension.ts`,
47
+ structurePath: `../../structure/${tableModel.clazz.name}.json`,
48
+ sqlPath: `../../structure/${tableModel.clazz.name}.sql`,
49
+ columnMap: tableModel.columns.reduce((p, c) => {
50
+ p[c.propertyName] = c;
51
+ return p;
52
+ }, {})
53
+ };
54
+ return this.njkEnv.render(`${tplName}.njk`, data);
55
+ }
56
+ async generate(tableModel) {
57
+ let dalDir;
58
+ try {
59
+ await fs.access(path.join(this.moduleDir, "src"));
60
+ dalDir = path.join(this.moduleDir, "src/dal");
61
+ } catch {
62
+ dalDir = path.join(this.moduleDir, "dal");
63
+ }
64
+ const clazzFileName = path.basename(PrototypeUtil.getFilePath(tableModel.clazz));
65
+ const baseFileName = path.basename(clazzFileName, ".ts");
66
+ const paths = {
67
+ baseBizDAO: path.join(dalDir, `dao/base/Base${baseFileName}DAO.ts`),
68
+ bizDAO: path.join(dalDir, `dao/${baseFileName}DAO.ts`),
69
+ extension: path.join(dalDir, `extension/${baseFileName}Extension.ts`),
70
+ structure: path.join(dalDir, `structure/${baseFileName}.json`),
71
+ structureSql: path.join(dalDir, `structure/${baseFileName}.sql`)
72
+ };
73
+ await fs.mkdir(path.dirname(paths.structure), { recursive: true });
74
+ await fs.writeFile(paths.structure, JSON.stringify(tableModel, null, 2), "utf8");
75
+ const structureSql = new SqlGenerator().generate(tableModel);
76
+ await fs.writeFile(paths.structureSql, structureSql, "utf8");
77
+ const codes = [
78
+ {
79
+ templates: Templates.BASE_DAO,
80
+ filePath: paths.baseBizDAO,
81
+ beautify: true,
82
+ overwrite: true
83
+ },
84
+ {
85
+ templates: Templates.DAO,
86
+ filePath: paths.bizDAO,
87
+ beautify: true,
88
+ overwrite: false
89
+ },
90
+ {
91
+ templates: Templates.EXTENSION,
92
+ filePath: paths.extension,
93
+ beautify: false,
94
+ overwrite: false
95
+ }
96
+ ];
97
+ for (const { templates, filePath, beautify, overwrite } of codes) {
98
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
99
+ const code = this.genCode(templates, filePath, tableModel);
100
+ let beautified;
101
+ if (beautify) beautified = js_beautify(code, {
102
+ brace_style: "preserve-inline",
103
+ indent_size: 2,
104
+ jslint_happy: true,
105
+ preserve_newlines: false
106
+ });
107
+ else beautified = code;
108
+ beautified = beautified.replace(/( )*\/\/ empty-line( )*/g, "").replace(/Promise( )*<( )*(.+?)( )*>/g, "Promise<$3>").replace(/Optional( )*<( )*(.+?)( )*>/g, "Optional<$3>").replace(/Record( )*<( )*(.+?)( )*>/g, "Record<$3>").replace(/Partial( )*<( )*(.+?)( )*>/g, "Partial<$3>").replace(/DataSource( )*<( )*(.+?)( )*>/g, "DataSource<$3>").replace(/ \? :/g, "?:");
109
+ if (overwrite !== true) try {
110
+ await fs.access(filePath);
111
+ continue;
112
+ } catch {}
113
+ await fs.writeFile(filePath, beautified, "utf8");
114
+ }
115
+ }
116
+ };
117
+
118
+ //#endregion
119
+ export { CodeGenerator };
@@ -1,4 +1,8 @@
1
- import { type BaseDaoType } from '@eggjs/tegg-types/dal';
2
- export declare class DaoLoader {
3
- static loadDaos(moduleDir: string): Promise<Array<BaseDaoType>>;
1
+ import { BaseDaoType } from "@eggjs/tegg-types/dal";
2
+
3
+ //#region src/DaoLoader.d.ts
4
+ declare class DaoLoader {
5
+ static loadDaos(moduleDir: string): Promise<Array<BaseDaoType>>;
4
6
  }
7
+ //#endregion
8
+ export { DaoLoader };
package/dist/DaoLoader.js CHANGED
@@ -1,14 +1,16 @@
1
- import { DaoInfoUtil } from '@eggjs/dal-decorator';
2
- import { LoaderFactory } from '@eggjs/tegg-loader';
3
- import { EggLoadUnitType } from '@eggjs/tegg-types';
4
- import {} from '@eggjs/tegg-types/dal';
5
- export class DaoLoader {
6
- static async loadDaos(moduleDir) {
7
- const loader = LoaderFactory.createLoader(moduleDir, EggLoadUnitType.MODULE);
8
- const clazzList = await loader.load();
9
- return clazzList.filter((t) => {
10
- return DaoInfoUtil.getIsDao(t);
11
- });
12
- }
13
- }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFvTG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Rhb0xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQW9CLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsTUFBTSxPQUFPLFNBQVM7SUFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBaUI7UUFDckMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBb0IsRUFBRTtZQUM5QyxPQUFPLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YifQ==
1
+ import { DaoInfoUtil } from "@eggjs/dal-decorator";
2
+ import { EggLoadUnitType } from "@eggjs/tegg-types";
3
+ import { LoaderFactory } from "@eggjs/tegg-loader";
4
+ import "@eggjs/tegg-types/dal";
5
+
6
+ //#region src/DaoLoader.ts
7
+ var DaoLoader = class {
8
+ static async loadDaos(moduleDir) {
9
+ return (await LoaderFactory.createLoader(moduleDir, EggLoadUnitType.MODULE).load()).filter((t) => {
10
+ return DaoInfoUtil.getIsDao(t);
11
+ });
12
+ }
13
+ };
14
+
15
+ //#endregion
16
+ export { DaoLoader };
@@ -1,28 +1,32 @@
1
- import { TableModel } from '@eggjs/dal-decorator';
2
- import type { DataSource as IDataSource, PaginateData, SqlType } from '@eggjs/tegg-types';
3
- import { MysqlDataSource } from './MySqlDataSource.ts';
4
- import { TableSqlMap } from './TableSqlMap.ts';
5
- export interface ExecuteSql {
6
- sql: string;
7
- template: string;
8
- sqlType: SqlType;
1
+ import { MysqlDataSource } from "./MySqlDataSource.js";
2
+ import { TableSqlMap } from "./TableSqlMap.js";
3
+ import { TableModel } from "@eggjs/dal-decorator";
4
+ import { DataSource, PaginateData, SqlType } from "@eggjs/tegg-types";
5
+
6
+ //#region src/DataSource.d.ts
7
+ interface ExecuteSql {
8
+ sql: string;
9
+ template: string;
10
+ sqlType: SqlType;
9
11
  }
10
- export declare class DataSource<T> implements IDataSource<T> {
11
- #private;
12
- private readonly tableModel;
13
- private readonly mysqlDataSource;
14
- private readonly sqlMap;
15
- constructor(tableModel: TableModel<T>, mysqlDataSource: MysqlDataSource, sqlMap: TableSqlMap);
16
- /**
17
- * public for aop execute to implement sql hint append
18
- * @param sqlName - sql name
19
- * @param data - sql data
20
- */
21
- generateSql(sqlName: string, data: object): Promise<ExecuteSql>;
22
- count(sqlName: string, data?: any): Promise<number>;
23
- execute(sqlName: string, data?: any): Promise<Array<T>>;
24
- executeRaw(sqlName: string, data?: any): Promise<Array<any>>;
25
- executeScalar(sqlName: string, data?: any): Promise<T | null>;
26
- executeRawScalar(sqlName: string, data?: any): Promise<any | null>;
27
- paginate(sqlName: string, data: any, currentPage: number, perPageCount: number): Promise<PaginateData<T>>;
12
+ declare class DataSource$1<T> implements DataSource<T> {
13
+ #private;
14
+ private readonly tableModel;
15
+ private readonly mysqlDataSource;
16
+ private readonly sqlMap;
17
+ constructor(tableModel: TableModel<T>, mysqlDataSource: MysqlDataSource, sqlMap: TableSqlMap);
18
+ /**
19
+ * public for aop execute to implement sql hint append
20
+ * @param sqlName - sql name
21
+ * @param data - sql data
22
+ */
23
+ generateSql(sqlName: string, data: object): Promise<ExecuteSql>;
24
+ count(sqlName: string, data?: any): Promise<number>;
25
+ execute(sqlName: string, data?: any): Promise<Array<T>>;
26
+ executeRaw(sqlName: string, data?: any): Promise<Array<any>>;
27
+ executeScalar(sqlName: string, data?: any): Promise<T | null>;
28
+ executeRawScalar(sqlName: string, data?: any): Promise<any | null>;
29
+ paginate(sqlName: string, data: any, currentPage: number, perPageCount: number): Promise<PaginateData<T>>;
28
30
  }
31
+ //#endregion
32
+ export { DataSource$1 as DataSource, ExecuteSql };
@@ -1,75 +1,72 @@
1
- import { TableModel } from '@eggjs/dal-decorator';
2
- import { MysqlDataSource } from "./MySqlDataSource.js";
1
+ import "./MySqlDataSource.js";
3
2
  import { TableModelInstanceBuilder } from "./TableModelInstanceBuilder.js";
4
- import { TableSqlMap } from "./TableSqlMap.js";
5
- const PAGINATE_COUNT_WRAPPER = ['SELECT COUNT(0) as count FROM (', ') AS T'];
6
- export class DataSource {
7
- tableModel;
8
- mysqlDataSource;
9
- sqlMap;
10
- constructor(tableModel, mysqlDataSource, sqlMap) {
11
- this.tableModel = tableModel;
12
- this.mysqlDataSource = mysqlDataSource;
13
- this.sqlMap = sqlMap;
14
- }
15
- /**
16
- * public for aop execute to implement sql hint append
17
- * @param sqlName - sql name
18
- * @param data - sql data
19
- */
20
- async generateSql(sqlName, data) {
21
- const sql = this.sqlMap.generate(sqlName, data, this.mysqlDataSource.timezone);
22
- const sqlType = this.sqlMap.getType(sqlName);
23
- const template = this.sqlMap.getTemplateString(sqlName);
24
- return {
25
- sql,
26
- sqlType,
27
- template,
28
- };
29
- }
30
- async count(sqlName, data) {
31
- const newData = Object.assign({ $$count: true }, data);
32
- const executeSql = await this.generateSql(sqlName, newData);
33
- return await this.#paginateCount(executeSql.sql);
34
- }
35
- async execute(sqlName, data) {
36
- const executeSql = await this.generateSql(sqlName, data);
37
- const rows = await this.mysqlDataSource.query(executeSql.sql);
38
- return rows.map((t) => {
39
- return TableModelInstanceBuilder.buildInstance(this.tableModel, t);
40
- });
41
- }
42
- async executeRaw(sqlName, data) {
43
- const executeSql = await this.generateSql(sqlName, data);
44
- return await this.mysqlDataSource.query(executeSql.sql);
45
- }
46
- async executeScalar(sqlName, data) {
47
- const ret = await this.execute(sqlName, data);
48
- if (!Array.isArray(ret))
49
- return ret || null;
50
- return ret[0] || null;
51
- }
52
- async executeRawScalar(sqlName, data) {
53
- const ret = await this.executeRaw(sqlName, data);
54
- if (!Array.isArray(ret))
55
- return (ret || null);
56
- return ret[0] || null;
57
- }
58
- async paginate(sqlName, data, currentPage, perPageCount) {
59
- const limit = `LIMIT ${(currentPage - 1) * perPageCount}, ${perPageCount}`;
60
- const sql = (await this.generateSql(sqlName, data)).sql + ' ' + limit;
61
- const countSql = (await this.generateSql(sqlName, Object.assign({ $$count: true }, data))).sql;
62
- const ret = await Promise.all([this.mysqlDataSource.query(sql), this.#paginateCount(countSql)]);
63
- return {
64
- total: Number(ret[1]),
65
- pageNum: currentPage,
66
- rows: ret[0].map((t) => TableModelInstanceBuilder.buildInstance(this.tableModel, t)),
67
- };
68
- }
69
- async #paginateCount(baseSQL) {
70
- const sql = `${PAGINATE_COUNT_WRAPPER[0]}${baseSQL}${PAGINATE_COUNT_WRAPPER[1]}`;
71
- const result = await this.mysqlDataSource.query(sql);
72
- return result[0].count;
73
- }
74
- }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9EYXRhU291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUdsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBUS9DLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUU3RSxNQUFNLE9BQU8sVUFBVTtJQUNKLFVBQVUsQ0FBZ0I7SUFDMUIsZUFBZSxDQUFrQjtJQUNqQyxNQUFNLENBQWM7SUFFckMsWUFBWSxVQUF5QixFQUFFLGVBQWdDLEVBQUUsTUFBbUI7UUFDMUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQWUsRUFBRSxJQUFZO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFTLENBQUMsQ0FBQztRQUNoRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE9BQU87WUFDTCxHQUFHO1lBQ0gsT0FBTztZQUNQLFFBQVE7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
3
+ import "./TableSqlMap.js";
4
+ import { TableModel } from "@eggjs/dal-decorator";
5
+
6
+ //#region src/DataSource.ts
7
+ const PAGINATE_COUNT_WRAPPER = ["SELECT COUNT(0) as count FROM (", ") AS T"];
8
+ var DataSource = class {
9
+ tableModel;
10
+ mysqlDataSource;
11
+ sqlMap;
12
+ constructor(tableModel, mysqlDataSource, sqlMap) {
13
+ this.tableModel = tableModel;
14
+ this.mysqlDataSource = mysqlDataSource;
15
+ this.sqlMap = sqlMap;
16
+ }
17
+ /**
18
+ * public for aop execute to implement sql hint append
19
+ * @param sqlName - sql name
20
+ * @param data - sql data
21
+ */
22
+ async generateSql(sqlName, data) {
23
+ return {
24
+ sql: this.sqlMap.generate(sqlName, data, this.mysqlDataSource.timezone),
25
+ sqlType: this.sqlMap.getType(sqlName),
26
+ template: this.sqlMap.getTemplateString(sqlName)
27
+ };
28
+ }
29
+ async count(sqlName, data) {
30
+ const newData = Object.assign({ $$count: true }, data);
31
+ const executeSql = await this.generateSql(sqlName, newData);
32
+ return await this.#paginateCount(executeSql.sql);
33
+ }
34
+ async execute(sqlName, data) {
35
+ const executeSql = await this.generateSql(sqlName, data);
36
+ return (await this.mysqlDataSource.query(executeSql.sql)).map((t) => {
37
+ return TableModelInstanceBuilder.buildInstance(this.tableModel, t);
38
+ });
39
+ }
40
+ async executeRaw(sqlName, data) {
41
+ const executeSql = await this.generateSql(sqlName, data);
42
+ return await this.mysqlDataSource.query(executeSql.sql);
43
+ }
44
+ async executeScalar(sqlName, data) {
45
+ const ret = await this.execute(sqlName, data);
46
+ if (!Array.isArray(ret)) return ret || null;
47
+ return ret[0] || null;
48
+ }
49
+ async executeRawScalar(sqlName, data) {
50
+ const ret = await this.executeRaw(sqlName, data);
51
+ if (!Array.isArray(ret)) return ret || null;
52
+ return ret[0] || null;
53
+ }
54
+ async paginate(sqlName, data, currentPage, perPageCount) {
55
+ const limit = `LIMIT ${(currentPage - 1) * perPageCount}, ${perPageCount}`;
56
+ const sql = (await this.generateSql(sqlName, data)).sql + " " + limit;
57
+ const countSql = (await this.generateSql(sqlName, Object.assign({ $$count: true }, data))).sql;
58
+ const ret = await Promise.all([this.mysqlDataSource.query(sql), this.#paginateCount(countSql)]);
59
+ return {
60
+ total: Number(ret[1]),
61
+ pageNum: currentPage,
62
+ rows: ret[0].map((t) => TableModelInstanceBuilder.buildInstance(this.tableModel, t))
63
+ };
64
+ }
65
+ async #paginateCount(baseSQL) {
66
+ const sql = `${PAGINATE_COUNT_WRAPPER[0]}${baseSQL}${PAGINATE_COUNT_WRAPPER[1]}`;
67
+ return (await this.mysqlDataSource.query(sql))[0].count;
68
+ }
69
+ };
70
+
71
+ //#endregion
72
+ export { DataSource };
@@ -1,12 +1,16 @@
1
- import { type DataSourceOptions } from './MySqlDataSource.ts';
2
- export declare class DatabaseForker {
3
- private readonly env;
4
- private readonly options;
5
- constructor(env: string, options: DataSourceOptions);
6
- shouldFork(): boolean;
7
- forkDb(moduleDir: string): Promise<void>;
8
- private forkTables;
9
- private doForkTable;
10
- private doCreateUtDb;
11
- destroy(): Promise<void>;
1
+ import { DataSourceOptions } from "./MySqlDataSource.js";
2
+
3
+ //#region src/DatabaseForker.d.ts
4
+ declare class DatabaseForker {
5
+ private readonly env;
6
+ private readonly options;
7
+ constructor(env: string, options: DataSourceOptions);
8
+ shouldFork(): boolean;
9
+ forkDb(moduleDir: string): Promise<void>;
10
+ private forkTables;
11
+ private doForkTable;
12
+ private doCreateUtDb;
13
+ destroy(): Promise<void>;
12
14
  }
15
+ //#endregion
16
+ export { DatabaseForker };