@zenorm/generate 2.2.0 → 2.3.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/README.md +37 -0
- package/dist/bin/zenorm-generate.js +45 -8
- package/dist/generate.d.ts +1 -1
- package/dist/generate.js +36 -27
- package/dist/index.d.ts +1 -1
- package/dist/index.js +17 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.js +2 -1
- package/dist/utils.js +21 -11
- package/package.json +7 -8
package/README.md
CHANGED
|
@@ -4,6 +4,42 @@
|
|
|
4
4
|
|
|
5
5
|
表结构代码生成工具
|
|
6
6
|
|
|
7
|
+
## 安装
|
|
8
|
+
```bash
|
|
9
|
+
npm i -D @zenorm/generate
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 配置
|
|
13
|
+
|
|
14
|
+
新建配置文件 `dbgen.config.js`
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
/** @type {import("@zenorm/generate").GenerateConfig} */
|
|
18
|
+
export default {
|
|
19
|
+
"database": "you_db_name", // 数据库名
|
|
20
|
+
"host": "localhost", // 目标数据库地址
|
|
21
|
+
"port": 3306, // 数据库端口
|
|
22
|
+
"user": "root", // 数据库用户名
|
|
23
|
+
"password": "", // 数据库密码
|
|
24
|
+
"outputDir": "./model/", // 代码输出目录
|
|
25
|
+
"bindQuery": true, // 绑定 Query 对象
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 在 package.json 中添加命令
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"scripts": {
|
|
33
|
+
"dbgen": "zenorm-generate dbgen.config.js"
|
|
34
|
+
},
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 运行命令生成数据库代码
|
|
39
|
+
```bash
|
|
40
|
+
npm run dbgen
|
|
41
|
+
```
|
|
42
|
+
|
|
7
43
|
## Generate Config - 代码生成配置
|
|
8
44
|
|
|
9
45
|
| 配置项 | 类型 | 默认值 | 说明
|
|
@@ -22,3 +58,4 @@
|
|
|
22
58
|
| declareRepositoriesToModules | `string[]` | 无 | 是否需将 Repositories 实例定义到目标模块中 - 例如: `["@zenweb/core.Core.repositories"]`
|
|
23
59
|
| filter | `string` | 无 | 表过滤规则正则
|
|
24
60
|
| include | `string` | 无 | 表包含规则正则
|
|
61
|
+
| esModule | `boolean` | 无 | 是否输出满足 ESM 导入文件名 (必须带有 .js 扩展名)
|
|
@@ -1,25 +1,62 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
41
|
+
const generate_1 = require("../generate");
|
|
5
42
|
async function getConfig(filename) {
|
|
6
|
-
const configFile =
|
|
7
|
-
const config = (await
|
|
43
|
+
const configFile = node_path_1.default.join(process.cwd(), filename);
|
|
44
|
+
const config = (await Promise.resolve(`${configFile}`).then(s => __importStar(require(s)))).default;
|
|
8
45
|
return Object.assign({
|
|
9
46
|
backend: '@zenorm/generate-mysql',
|
|
10
47
|
}, config);
|
|
11
48
|
}
|
|
12
49
|
async function main(configFilename) {
|
|
13
50
|
const config = await getConfig(configFilename);
|
|
14
|
-
const call = (await
|
|
15
|
-
await generate(call()(config), config);
|
|
51
|
+
const call = (await Promise.resolve(`${config.backend}`).then(s => __importStar(require(s)))).default;
|
|
52
|
+
await (0, generate_1.generate)(call()(config), config);
|
|
16
53
|
}
|
|
17
54
|
if (!process.argv[2]) {
|
|
18
55
|
console.log('zenorm-generate config.js');
|
|
19
56
|
process.exit(1);
|
|
20
57
|
}
|
|
21
58
|
else {
|
|
22
|
-
|
|
59
|
+
main(process.argv[2]).then(() => {
|
|
23
60
|
console.log('Done.');
|
|
24
61
|
process.exit();
|
|
25
62
|
}, e => {
|
package/dist/generate.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { GenerateConfig, TabelDescribe } from './types
|
|
1
|
+
import { GenerateConfig, TabelDescribe } from './types';
|
|
2
2
|
export declare function generate(tables: AsyncGenerator<TabelDescribe>, cfg?: GenerateConfig): Promise<void>;
|
package/dist/generate.js
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generate = generate;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const pascal_case_1 = require("pascal-case");
|
|
10
|
+
const snake_case_1 = require("snake-case");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
6
12
|
const zenormName = process.env.ZENORM_NAME || 'zenorm';
|
|
7
|
-
|
|
13
|
+
async function generate(tables, cfg) {
|
|
8
14
|
console.log('generate models...');
|
|
9
15
|
const config = Object.assign({
|
|
10
16
|
outputDir: './src/model',
|
|
@@ -13,19 +19,22 @@ export async function generate(tables, cfg) {
|
|
|
13
19
|
staticMethods: true,
|
|
14
20
|
instanceMethods: true,
|
|
15
21
|
}, cfg);
|
|
16
|
-
|
|
17
|
-
|
|
22
|
+
function importFilename(filename) {
|
|
23
|
+
return cfg?.esModule ? `${filename}.js` : filename;
|
|
24
|
+
}
|
|
25
|
+
const outputDir = (0, utils_1.cwdPath)(config.outputDir);
|
|
26
|
+
await (0, utils_1.checkFileDir)(outputDir);
|
|
18
27
|
console.log('database:', config.database);
|
|
19
28
|
const remark = [
|
|
20
29
|
'// zenorm 自动生成文件',
|
|
21
30
|
'// 请不要修改此文件,因为此文件在每次重新生成数据库结构时会被覆盖',
|
|
22
|
-
`// create at: ${currentDatetime()}`,
|
|
31
|
+
`// create at: ${(0, utils_1.currentDatetime)()}`,
|
|
23
32
|
`// create by: ${process.env.USER || process.env.USERNAME || '-'}@${process.env.COMPUTERNAME || '-'}`,
|
|
24
33
|
`// database: ${config.database}`,
|
|
25
34
|
];
|
|
26
35
|
const structs = [
|
|
27
36
|
...remark,
|
|
28
|
-
config.globalFilename ? `import _Global from './${config.globalFilename}
|
|
37
|
+
config.globalFilename ? `import _Global from './${importFilename(config.globalFilename)}';` : null,
|
|
29
38
|
'',
|
|
30
39
|
];
|
|
31
40
|
const typesOut = {};
|
|
@@ -40,9 +49,9 @@ export async function generate(tables, cfg) {
|
|
|
40
49
|
// console.log('table:', tableName, 'ignore');
|
|
41
50
|
continue;
|
|
42
51
|
}
|
|
43
|
-
const className = pascalCase(tableName);
|
|
44
|
-
const name = snakeCase(tableName);
|
|
45
|
-
const outputFilename =
|
|
52
|
+
const className = (0, pascal_case_1.pascalCase)(tableName);
|
|
53
|
+
const name = (0, snake_case_1.snakeCase)(tableName);
|
|
54
|
+
const outputFilename = node_path_1.default.join(outputDir, name + '.ts');
|
|
46
55
|
console.log('table:', tableName);
|
|
47
56
|
// 自定义类型
|
|
48
57
|
Object.assign(typesOut, t.types);
|
|
@@ -78,10 +87,10 @@ export async function generate(tables, cfg) {
|
|
|
78
87
|
tablesOut.push('}');
|
|
79
88
|
tablesOut.push('');
|
|
80
89
|
// model class
|
|
81
|
-
await notExistsPut(outputFilename, () => {
|
|
90
|
+
await (0, utils_1.notExistsPut)(outputFilename, () => {
|
|
82
91
|
return [
|
|
83
92
|
`import { Model } from '${zenormName}';`,
|
|
84
|
-
`import { ${className}Table } from './${config.tablesFilename}
|
|
93
|
+
`import { ${className}Table } from './${importFilename(config.tablesFilename)}';`,
|
|
85
94
|
'',
|
|
86
95
|
`@Model({`,
|
|
87
96
|
pk ? ` pk: '${pk}',` : null,
|
|
@@ -100,9 +109,9 @@ export async function generate(tables, cfg) {
|
|
|
100
109
|
structs.push(`type ${tname} = ${typesOut[tname]};`);
|
|
101
110
|
}
|
|
102
111
|
structs.push(...tablesOut);
|
|
103
|
-
const tablesFilename =
|
|
112
|
+
const tablesFilename = node_path_1.default.join(outputDir, config.tablesFilename + '.ts');
|
|
104
113
|
console.log(`write tables file: ${tablesFilename}`);
|
|
105
|
-
await
|
|
114
|
+
await node_fs_1.promises.writeFile(tablesFilename, structs.filter(i => i !== null).join('\n'));
|
|
106
115
|
const imports = ['createRepositoryQuery'];
|
|
107
116
|
if (config.generateRepositories || config.bindQuery) {
|
|
108
117
|
imports.push('QueryParam');
|
|
@@ -110,8 +119,8 @@ export async function generate(tables, cfg) {
|
|
|
110
119
|
const repositories = [
|
|
111
120
|
...remark,
|
|
112
121
|
`import { ${imports.join(', ')} } from '${zenormName}';`,
|
|
113
|
-
`import * as _tables from './${config.tablesFilename}
|
|
114
|
-
...models.map(({ name, className }) => `import _${className} from './${name}
|
|
122
|
+
`import * as _tables from './${importFilename(config.tablesFilename)}';`,
|
|
123
|
+
...models.map(({ name, className }) => `import _${className} from './${importFilename(name)}';`),
|
|
115
124
|
];
|
|
116
125
|
// 绑定静态 Query
|
|
117
126
|
if (config.bindQuery) {
|
|
@@ -168,24 +177,24 @@ export async function generate(tables, cfg) {
|
|
|
168
177
|
}
|
|
169
178
|
}
|
|
170
179
|
}
|
|
171
|
-
const repositoriesFilename =
|
|
180
|
+
const repositoriesFilename = node_path_1.default.join(outputDir, config.repositoriesFilename + '.ts');
|
|
172
181
|
console.log(`write repositories file: ${repositoriesFilename}`);
|
|
173
|
-
await
|
|
182
|
+
await node_fs_1.promises.writeFile(repositoriesFilename, repositories.join('\n'));
|
|
174
183
|
// 生成 global.ts
|
|
175
184
|
if (config.globalFilename) {
|
|
176
|
-
const globalFilename =
|
|
177
|
-
await notExistsPut(globalFilename, () => {
|
|
185
|
+
const globalFilename = node_path_1.default.join(outputDir, config.globalFilename + '.ts');
|
|
186
|
+
await (0, utils_1.notExistsPut)(globalFilename, () => {
|
|
178
187
|
console.log(`write file: ${globalFilename}`);
|
|
179
188
|
return 'export default class Global {}';
|
|
180
189
|
});
|
|
181
190
|
}
|
|
182
191
|
// 生成 index.ts
|
|
183
|
-
const indexFilename =
|
|
184
|
-
await notExistsPut(indexFilename, () => {
|
|
192
|
+
const indexFilename = node_path_1.default.join(outputDir, 'index.ts');
|
|
193
|
+
await (0, utils_1.notExistsPut)(indexFilename, () => {
|
|
185
194
|
console.log(`write file: ${indexFilename}`);
|
|
186
195
|
return [
|
|
187
|
-
`export * from './${config.tablesFilename}
|
|
188
|
-
`export * from './${config.repositoriesFilename}
|
|
196
|
+
`export * from './${importFilename(config.tablesFilename)}';`,
|
|
197
|
+
`export * from './${importFilename(config.repositoriesFilename)}';`,
|
|
189
198
|
].join('\n');
|
|
190
199
|
});
|
|
191
200
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './types
|
|
1
|
+
export * from './types';
|
package/dist/index.js
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
|
|
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("./types"), exports);
|
package/dist/types.d.ts
CHANGED
package/dist/types.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
package/dist/utils.js
CHANGED
|
@@ -1,29 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cwdPath = cwdPath;
|
|
7
|
+
exports.checkFileDir = checkFileDir;
|
|
8
|
+
exports.fileExists = fileExists;
|
|
9
|
+
exports.notExistsPut = notExistsPut;
|
|
10
|
+
exports.currentDatetime = currentDatetime;
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
+
function cwdPath(p) {
|
|
4
14
|
if (p.startsWith('./')) {
|
|
5
|
-
return
|
|
15
|
+
return node_path_1.default.join(process.cwd(), p.slice(2));
|
|
6
16
|
}
|
|
7
17
|
return p;
|
|
8
18
|
}
|
|
9
|
-
|
|
10
|
-
return
|
|
19
|
+
function checkFileDir(dir) {
|
|
20
|
+
return node_fs_1.promises.mkdir(dir, { recursive: true });
|
|
11
21
|
}
|
|
12
|
-
|
|
13
|
-
return
|
|
22
|
+
function fileExists(f) {
|
|
23
|
+
return node_fs_1.promises.access(f).then(() => true, () => false);
|
|
14
24
|
}
|
|
15
25
|
/**
|
|
16
26
|
* 文件不存在则创建并写入内容
|
|
17
27
|
* @param filename
|
|
18
28
|
* @param getContent
|
|
19
29
|
*/
|
|
20
|
-
|
|
30
|
+
async function notExistsPut(filename, getContent) {
|
|
21
31
|
if (!await fileExists(filename)) {
|
|
22
|
-
await
|
|
32
|
+
await node_fs_1.promises.writeFile(filename, await getContent());
|
|
23
33
|
return true;
|
|
24
34
|
}
|
|
25
35
|
return false;
|
|
26
36
|
}
|
|
27
|
-
|
|
37
|
+
function currentDatetime() {
|
|
28
38
|
return new Date().toLocaleString();
|
|
29
39
|
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenorm/generate",
|
|
3
|
-
"type": "module",
|
|
4
3
|
"description": "Easy ORM, easy query. easy typing! Auto generate typescript declaration.",
|
|
5
|
-
"version": "2.
|
|
4
|
+
"version": "2.3.0",
|
|
6
5
|
"exports": "./dist/index.js",
|
|
7
6
|
"types": "./dist/index.d.ts",
|
|
8
7
|
"homepage": "https://zenorm.node.ltd",
|
|
@@ -15,10 +14,10 @@
|
|
|
15
14
|
"dist"
|
|
16
15
|
],
|
|
17
16
|
"scripts": {
|
|
18
|
-
"build": "rimraf dist && tsc",
|
|
17
|
+
"build": "rimraf dist && tsc -p tsconfig.build.json",
|
|
19
18
|
"prepack": "npm run build",
|
|
20
|
-
"gen": "cd test && node
|
|
21
|
-
"t1": "cd test && cross-env DEBUG=* node
|
|
19
|
+
"gen": "cd test && node -r ts-node/register ../src/bin/zenorm-generate.ts config.js",
|
|
20
|
+
"t1": "cd test && cross-env DEBUG=* node -r ts-node/register t1.ts"
|
|
22
21
|
},
|
|
23
22
|
"keywords": [
|
|
24
23
|
"mysql",
|
|
@@ -32,11 +31,11 @@
|
|
|
32
31
|
"@types/node": "^16.18.126",
|
|
33
32
|
"@zenorm/generate-mysql": "^2.2.1",
|
|
34
33
|
"cross-env": "^7.0.3",
|
|
35
|
-
"mysql-easy-query": "^
|
|
34
|
+
"mysql-easy-query": "^4.1.0",
|
|
36
35
|
"rimraf": "^4.4.1",
|
|
37
36
|
"ts-node": "^10.9.2",
|
|
38
|
-
"typescript": "^
|
|
39
|
-
"zenorm": "^4.
|
|
37
|
+
"typescript": "^6.0.3",
|
|
38
|
+
"zenorm": "^4.5.0"
|
|
40
39
|
},
|
|
41
40
|
"dependencies": {
|
|
42
41
|
"pascal-case": "^3.1.2",
|