@meadmin/cli 1.0.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/commanders/crud.d.ts +2 -0
- package/dist/commanders/crud.js +543 -0
- package/dist/commanders/index.d.ts +2 -0
- package/dist/commanders/index.js +12 -0
- package/dist/commanders/sync.d.ts +2 -0
- package/dist/commanders/sync.js +32 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +12 -0
- package/dist/utils/app.d.ts +5 -0
- package/dist/utils/app.js +12 -0
- package/dist/utils/db.d.ts +1 -0
- package/dist/utils/db.js +8 -0
- package/dist/utils/env.d.ts +1 -0
- package/dist/utils/env.js +20 -0
- package/dist/utils/file.d.ts +13 -0
- package/dist/utils/file.js +24 -0
- package/dist/utils/formatting.d.ts +68 -0
- package/dist/utils/formatting.js +103 -0
- package/dist/utils/log.d.ts +12 -0
- package/dist/utils/log.js +59 -0
- package/package.json +55 -0
- package/template/crud/server/controller/controller.ts.art +124 -0
- package/template/crud/server/dto/create.dto.ts.art +11 -0
- package/template/crud/server/dto/query.dto.ts.art +19 -0
- package/template/crud/server/dto/update.dto.ts.art +11 -0
- package/template/crud/server/service/service.ts.art +220 -0
- package/template/crud/view/api/api.ts.art +120 -0
- package/template/crud/view/api/class.ts.art +2 -0
- package/template/crud/view/api/searchTypes.ts.art +4 -0
- package/template/crud/view/api/type.ts.art +2 -0
- package/template/crud/view/api/valueDefault.ts.art +1 -0
- package/template/crud/view/api/valueType.ts.art +3 -0
- package/template/crud/view/views/components/addOrUp.vue.art +96 -0
- package/template/crud/view/views/components/addOrUpItem.vue.art +26 -0
- package/template/crud/view/views/components/info.vue.art +63 -0
- package/template/crud/view/views/components/rules.ts.art +5 -0
- package/template/crud/view/views/components/rulesList.ts.art +2 -0
- package/template/crud/view/views/dict.ts.art +11 -0
- package/template/crud/view/views/index.vue.art +83 -0
- package/template/crud/view/views/lang/en.json.art +4 -0
- package/template/crud/view/views/searchItem.vue.art +17 -0
- package/template/crud/view/views/tableColum.vue.art +19 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { join, resolve } from 'node:path';
|
|
2
|
+
import { importModels, Sequelize } from '@sequelize/core';
|
|
3
|
+
import { Log } from '../utils/log.js';
|
|
4
|
+
import { getConfig } from '../utils/db.js';
|
|
5
|
+
export const syncInit = (program) => {
|
|
6
|
+
program
|
|
7
|
+
.command('sync')
|
|
8
|
+
.description('同步数据库结构')
|
|
9
|
+
.argument('<file>', '需要同步的entity文件地址支持,隔开的多文件或glob,文件地址相对于项目dist/entities')
|
|
10
|
+
.option('-d, --dbConfig <char>', '数据库配置文件地址默认为当前目录下dist/config/database.js', join(process.cwd(), 'dist/config/database.js'))
|
|
11
|
+
.option('-n, --name <char>', '使用的数据库配置defaultDataSourceName')
|
|
12
|
+
.action(async (file, options) => {
|
|
13
|
+
const files = file.split(' ');
|
|
14
|
+
files.push('./abstract/*');
|
|
15
|
+
const config = Object.assign(await getConfig(options.dbConfig, options.name), {
|
|
16
|
+
logging: message => Log.log(message),
|
|
17
|
+
models: await importModels(files.map(item => resolve(process.cwd(), 'dist/entities/', item.endsWith('.js') ||
|
|
18
|
+
item.endsWith('.mjs') ||
|
|
19
|
+
item.endsWith('.cjs') ||
|
|
20
|
+
item.endsWith('.ts') ||
|
|
21
|
+
item.endsWith('.mts') ||
|
|
22
|
+
item.endsWith('.cts')
|
|
23
|
+
? item
|
|
24
|
+
: item + '.entity.js').replace(/\\/g, '/'))),
|
|
25
|
+
});
|
|
26
|
+
const sequelize = new Sequelize(config);
|
|
27
|
+
await sequelize.sync({ alter: true });
|
|
28
|
+
sequelize.close();
|
|
29
|
+
Log.success('同步数据表结构成功');
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kZXJzL3N5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzNDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBSSxDQUFDLE9BQWdCLEVBQUUsRUFBRTtJQUM1QyxPQUFPO1NBQ0osT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUNmLFdBQVcsQ0FBQyxTQUFTLENBQUM7U0FDdEIsUUFBUSxDQUNQLFFBQVEsRUFDUixzREFBc0QsQ0FDdkQ7U0FDQSxNQUFNLENBQ0wsdUJBQXVCLEVBQ3ZCLDBDQUEwQyxFQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLHlCQUF5QixDQUFDLENBQy9DO1NBQ0EsTUFBTSxDQUFDLG1CQUFtQixFQUFFLCtCQUErQixDQUFDO1NBQzVELE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUMxQixNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDL0M7WUFDRSxPQUFPLEVBQUUsT0FBTyxDQUFBLEVBQUUsQ0FBQSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUNsQyxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUMxQyxPQUFPLENBQ0wsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUNiLGdCQUFnQixFQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUNyQixDQUFDLENBQUMsSUFBSTtnQkFDTixDQUFDLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FDeEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFDLEdBQUcsQ0FBQyxDQUNyQixDQUFDO1NBQ0gsQ0FDRixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUM7UUFDbkMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMifQ==
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { init } from './commanders/index.js';
|
|
4
|
+
const program = new Command();
|
|
5
|
+
const { version } = JSON.parse(readFileSync(import.meta.dirname + '/../package.json').toString());
|
|
6
|
+
program
|
|
7
|
+
.name('meadmin')
|
|
8
|
+
.description('CLI of MEADMIN')
|
|
9
|
+
.version(version);
|
|
10
|
+
init(program);
|
|
11
|
+
program.parse();
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQzlCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUM1QixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FDbEUsQ0FBQztBQUNGLE9BQU87S0FDSixJQUFJLENBQUMsU0FBUyxDQUFDO0tBQ2YsV0FBVyxDQUFDLGdCQUFnQixDQUFDO0tBQzdCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDZCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMifQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createApp } from '@midwayjs/mock';
|
|
2
|
+
import { Framework } from '@midwayjs/koa';
|
|
3
|
+
import { IMidwayFramework } from '@midwayjs/core';
|
|
4
|
+
export declare function getApp<T extends IMidwayFramework<any, any, any, any, any> = Framework>(args?: Parameters<typeof createApp<T>>): Promise<ReturnType<T["getApplication"]>>;
|
|
5
|
+
export declare function closeApp(): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createApp, close } from '@midwayjs/mock';
|
|
2
|
+
let app;
|
|
3
|
+
export async function getApp(args) {
|
|
4
|
+
// create app
|
|
5
|
+
return app = await createApp(...args ?? []);
|
|
6
|
+
}
|
|
7
|
+
export function closeApp() {
|
|
8
|
+
if (app) {
|
|
9
|
+
close(app);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSWxELElBQUksR0FBZSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUFrRSxJQUFxQztJQUNqSSxhQUFhO0lBQ2IsT0FBTyxHQUFHLEdBQUcsTUFBTSxTQUFTLENBQUksR0FBRyxJQUFJLElBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRO0lBQ3RCLElBQUcsR0FBRyxFQUFDLENBQUM7UUFDTixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getConfig(dbConfig: any, name: any): Promise<any>;
|
package/dist/utils/db.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { pathToFileURL } from "node:url";
|
|
2
|
+
export async function getConfig(dbConfig, name) {
|
|
3
|
+
const infos = await import(pathToFileURL(dbConfig).href);
|
|
4
|
+
const config = await (infos.__esModule ? infos.default : infos).default();
|
|
5
|
+
const configName = name ?? config.defaultDataSourceName ?? 'default';
|
|
6
|
+
return config.dataSource[configName];
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV6QyxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSTtJQUM1QyxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFFLE1BQU0sVUFBVSxHQUFHLElBQUksSUFBSSxNQUFNLENBQUMscUJBQXFCLElBQUksU0FBUyxDQUFDO0lBQ3JFLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN2QyxDQUFDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const setEnv: (node_env?: string) => void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
export const setEnv = (node_env) => {
|
|
3
|
+
if (node_env) {
|
|
4
|
+
process.env.NODE_ENV = node_env;
|
|
5
|
+
}
|
|
6
|
+
// 根据当前环境加载不同的 .env 文件
|
|
7
|
+
if (process.env.NODE_ENV) {
|
|
8
|
+
dotenv.config({
|
|
9
|
+
path: ['.env', `.env.${process.env.NODE_ENV}`],
|
|
10
|
+
override: true,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
dotenv.config({
|
|
15
|
+
path: ['.env'],
|
|
16
|
+
override: true,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2Vudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsUUFBZ0IsRUFBQyxFQUFFO0lBQ3hDLElBQUcsUUFBUSxFQUFDLENBQUM7UUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQUNELHNCQUFzQjtJQUN0QixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNaLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDOUMsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDWixJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDZCxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { WriteFileOptions } from 'node:fs';
|
|
2
|
+
/**
|
|
3
|
+
* 写入文件【当文件所在文件夹不存在时会递归创建】
|
|
4
|
+
* @param filePath
|
|
5
|
+
* @param content
|
|
6
|
+
* @returns
|
|
7
|
+
*/
|
|
8
|
+
export declare function recursionWriteFileSync(filePath: string, content: string, options?: WriteFileOptions): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 删除文件
|
|
11
|
+
* @param filePath
|
|
12
|
+
*/
|
|
13
|
+
export declare function delFileSync(filePath: string): void;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync, existsSync, rmSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* 写入文件【当文件所在文件夹不存在时会递归创建】
|
|
5
|
+
* @param filePath
|
|
6
|
+
* @param content
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
9
|
+
export function recursionWriteFileSync(filePath, content, options) {
|
|
10
|
+
const path = dirname(filePath);
|
|
11
|
+
mkdirSync(path, { recursive: true });
|
|
12
|
+
writeFileSync(filePath, content, options);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 删除文件
|
|
17
|
+
* @param filePath
|
|
18
|
+
*/
|
|
19
|
+
export function delFileSync(filePath) {
|
|
20
|
+
if (existsSync(filePath)) {
|
|
21
|
+
rmSync(filePath, { recursive: true, force: true });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQW9CLE1BQU0sU0FBUyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsUUFBZSxFQUFFLE9BQWMsRUFBRyxPQUF5QjtJQUNoRyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsUUFBZTtJQUN6QyxJQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将camelCase字符串更改为kebab-case,用破折号替换空格并保留下划线。
|
|
3
|
+
*
|
|
4
|
+
* @param {string} str [str description]
|
|
5
|
+
* @param {string} replaceStr 替换的字符串
|
|
6
|
+
* @return {[type]} [return description]
|
|
7
|
+
*/
|
|
8
|
+
export declare function normalizeToKebabOrSnakeCase(str: string, replaceStr?: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* kebab-case/kebab_case 更改为 camelCase
|
|
11
|
+
*
|
|
12
|
+
* @param {string} str [str description]
|
|
13
|
+
*
|
|
14
|
+
* @return {[string]} [return description]
|
|
15
|
+
*/
|
|
16
|
+
export declare function toHump(str: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* 首字母小写
|
|
19
|
+
*
|
|
20
|
+
* @param {string} str [str description]
|
|
21
|
+
*
|
|
22
|
+
* @return {[type]} [return description]
|
|
23
|
+
*/
|
|
24
|
+
export declare function lowerFirstCase(str: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* 首字母大写
|
|
27
|
+
*
|
|
28
|
+
* @param {string} str [str description]
|
|
29
|
+
*
|
|
30
|
+
* @return {[type]} [return description]
|
|
31
|
+
*/
|
|
32
|
+
export declare function upFirstCase(str: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* 获取绝对路径 并添加对应后缀
|
|
35
|
+
*
|
|
36
|
+
* @param {string} str [str description]
|
|
37
|
+
* @param {string[]} suffix 后缀数组
|
|
38
|
+
*
|
|
39
|
+
* @return {string}
|
|
40
|
+
*/
|
|
41
|
+
export declare function resovePath(str: string, suffix?: string[], base?: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* 获取相对路径并移除对应后缀
|
|
44
|
+
*
|
|
45
|
+
* @param {string} from 基础路径 允许文件路径
|
|
46
|
+
* @param {string} to 需要获取的路径
|
|
47
|
+
* @param {string[]} suffix 后缀
|
|
48
|
+
*
|
|
49
|
+
* @return {string}
|
|
50
|
+
*/
|
|
51
|
+
export declare function relativePath(from: string, to: string, suffix?: string[]): string;
|
|
52
|
+
/**
|
|
53
|
+
* 将备注转换为格式化数据
|
|
54
|
+
* @param description
|
|
55
|
+
* @returns
|
|
56
|
+
*/
|
|
57
|
+
export declare function getKeyInfo(description: string): {
|
|
58
|
+
name: string;
|
|
59
|
+
dict: Record<string, string>;
|
|
60
|
+
dictArr: {
|
|
61
|
+
label: string;
|
|
62
|
+
value: string;
|
|
63
|
+
}[];
|
|
64
|
+
} | {
|
|
65
|
+
name: string;
|
|
66
|
+
dict?: undefined;
|
|
67
|
+
dictArr?: undefined;
|
|
68
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { resolve, relative, extname, dirname } from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* 将camelCase字符串更改为kebab-case,用破折号替换空格并保留下划线。
|
|
4
|
+
*
|
|
5
|
+
* @param {string} str [str description]
|
|
6
|
+
* @param {string} replaceStr 替换的字符串
|
|
7
|
+
* @return {[type]} [return description]
|
|
8
|
+
*/
|
|
9
|
+
export function normalizeToKebabOrSnakeCase(str, replaceStr = '-') {
|
|
10
|
+
const STRING_DASHERIZE_REGEXP = /\s/g;
|
|
11
|
+
const STRING_DECAMELIZE_REGEXP = /([a-z\d])([A-Z])/g;
|
|
12
|
+
return str.replace(STRING_DECAMELIZE_REGEXP, `$1${replaceStr}$2`).toLowerCase().replace(STRING_DASHERIZE_REGEXP, replaceStr);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* kebab-case/kebab_case 更改为 camelCase
|
|
16
|
+
*
|
|
17
|
+
* @param {string} str [str description]
|
|
18
|
+
*
|
|
19
|
+
* @return {[string]} [return description]
|
|
20
|
+
*/
|
|
21
|
+
export function toHump(str) {
|
|
22
|
+
return str.replace(/[\-_]([A-Za-z])/g, function (all, letter) {
|
|
23
|
+
return letter.toUpperCase();
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 首字母小写
|
|
28
|
+
*
|
|
29
|
+
* @param {string} str [str description]
|
|
30
|
+
*
|
|
31
|
+
* @return {[type]} [return description]
|
|
32
|
+
*/
|
|
33
|
+
export function lowerFirstCase(str) {
|
|
34
|
+
return str[0].toLowerCase() + str.slice(1);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 首字母大写
|
|
38
|
+
*
|
|
39
|
+
* @param {string} str [str description]
|
|
40
|
+
*
|
|
41
|
+
* @return {[type]} [return description]
|
|
42
|
+
*/
|
|
43
|
+
export function upFirstCase(str) {
|
|
44
|
+
return str[0].toUpperCase() + str.slice(1);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 获取绝对路径 并添加对应后缀
|
|
48
|
+
*
|
|
49
|
+
* @param {string} str [str description]
|
|
50
|
+
* @param {string[]} suffix 后缀数组
|
|
51
|
+
*
|
|
52
|
+
* @return {string}
|
|
53
|
+
*/
|
|
54
|
+
export function resovePath(str, suffix = ['.ts'], base = process.cwd()) {
|
|
55
|
+
suffix.forEach((item) => {
|
|
56
|
+
if (!str.endsWith(item)) {
|
|
57
|
+
str += item;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return resolve(base, str).replace(/\\/g, '/');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 获取相对路径并移除对应后缀
|
|
64
|
+
*
|
|
65
|
+
* @param {string} from 基础路径 允许文件路径
|
|
66
|
+
* @param {string} to 需要获取的路径
|
|
67
|
+
* @param {string[]} suffix 后缀
|
|
68
|
+
*
|
|
69
|
+
* @return {string}
|
|
70
|
+
*/
|
|
71
|
+
export function relativePath(from, to, suffix = ['.ts']) {
|
|
72
|
+
let path = relative(extname(from) ? dirname(from) : from, to);
|
|
73
|
+
suffix.reverse().forEach((item) => {
|
|
74
|
+
if (path.endsWith(item)) {
|
|
75
|
+
path = path.slice(0, 0 - item.length);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
path = path.replace(/\\/g, '/');
|
|
79
|
+
return path.startsWith('.') ? path : './' + path;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 将备注转换为格式化数据
|
|
83
|
+
* @param description
|
|
84
|
+
* @returns
|
|
85
|
+
*/
|
|
86
|
+
export function getKeyInfo(description) {
|
|
87
|
+
//示例 恒定展示(只有一个子元素时不隐藏):1=是;0=否
|
|
88
|
+
const nameArr = description.split(':');
|
|
89
|
+
const dict = {};
|
|
90
|
+
const dictArr = [];
|
|
91
|
+
if (nameArr[1]) {
|
|
92
|
+
nameArr[1].split(';').forEach((value) => {
|
|
93
|
+
const valueArr = value.split('=');
|
|
94
|
+
dict[valueArr[0]] = valueArr[1];
|
|
95
|
+
dictArr.push({ label: valueArr[1], value: valueArr[0] });
|
|
96
|
+
});
|
|
97
|
+
return { name: nameArr[0], dict: dict, dictArr: dictArr };
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
return { name: nameArr[0] };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9mb3JtYXR0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEdBQVcsRUFBRSxVQUFVLEdBQUcsR0FBRztJQUN2RSxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN0QyxNQUFNLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDO0lBQ3JELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQy9ILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQVc7SUFDaEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsR0FBRyxFQUFFLE1BQU07UUFDMUQsT0FBTyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFXO0lBQ3hDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBVztJQUNyQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxD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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class Log {
|
|
2
|
+
context: string;
|
|
3
|
+
constructor(context?: string);
|
|
4
|
+
log(message: string, data?: any): void;
|
|
5
|
+
success(message: string, data?: any): void;
|
|
6
|
+
warn(message: string, data?: any): void;
|
|
7
|
+
error(message: string, data?: any): void;
|
|
8
|
+
static log(message: string, data?: any): void;
|
|
9
|
+
static success(message: string, data?: any): void;
|
|
10
|
+
static warn(message: string, data?: any): void;
|
|
11
|
+
static error(message: string, data?: any): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const colorConfig = {
|
|
2
|
+
reset: '\x1B[0m', //结束标签
|
|
3
|
+
bright: '\x1B[1m', // 亮色
|
|
4
|
+
grey: '\x1B[2m', // 灰色
|
|
5
|
+
italic: '\x1B[3m', // 斜体
|
|
6
|
+
underline: '\x1B[4m', // 下划线
|
|
7
|
+
reverse: '\x1B[7m', // 反向
|
|
8
|
+
hidden: '\x1B[8m', // 隐藏
|
|
9
|
+
black: '\x1B[30m', // 黑色
|
|
10
|
+
red: '\x1B[31m', // 红色
|
|
11
|
+
green: '\x1B[32m', // 绿色
|
|
12
|
+
yellow: '\x1B[33m', // 黄色
|
|
13
|
+
blue: '\x1B[34m', // 蓝色
|
|
14
|
+
magenta: '\x1B[35m', // 品红
|
|
15
|
+
cyan: '\x1B[36m', // 青色
|
|
16
|
+
white: '\x1B[37m', // 白色
|
|
17
|
+
blackBG: '\x1B[40m', // 背景色为黑色
|
|
18
|
+
redBG: '\x1B[41m', // 背景色为红色
|
|
19
|
+
greenBG: '\x1B[42m', // 背景色为绿色
|
|
20
|
+
yellowBG: '\x1B[43m', // 背景色为黄色
|
|
21
|
+
blueBG: '\x1B[44m', // 背景色为蓝色
|
|
22
|
+
magentaBG: '\x1B[45m', // 背景色为品红
|
|
23
|
+
cyanBG: '\x1B[46m', // 背景色为青色
|
|
24
|
+
whiteBG: '\x1B[47m', // 背景色为白色
|
|
25
|
+
};
|
|
26
|
+
export class Log {
|
|
27
|
+
context;
|
|
28
|
+
constructor(context = '') {
|
|
29
|
+
this.context = context;
|
|
30
|
+
if (context) {
|
|
31
|
+
this.context = `[${context}] `;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
log(message, data) {
|
|
35
|
+
console.info(`${this.context}[${new Date().toLocaleString()}] ${message}`, data ?? '');
|
|
36
|
+
}
|
|
37
|
+
success(message, data) {
|
|
38
|
+
console.info(`${this.context}${colorConfig.green} [${new Date().toLocaleString()}] ${message}\x1B[0m`, data ?? '');
|
|
39
|
+
}
|
|
40
|
+
warn(message, data) {
|
|
41
|
+
console.warn(`${this.context}${colorConfig.yellow} [${new Date().toLocaleString()}] ${message}\x1B[0m`, data ?? '');
|
|
42
|
+
}
|
|
43
|
+
error(message, data) {
|
|
44
|
+
console.error(`${this.context}${colorConfig.red} [${new Date().toLocaleString()}] ${message}\x1B[0m`, data ?? '');
|
|
45
|
+
}
|
|
46
|
+
static log(message, data) {
|
|
47
|
+
return new Log('meadmin').log(message, data);
|
|
48
|
+
}
|
|
49
|
+
static success(message, data) {
|
|
50
|
+
return new Log('meadmin').success(message, data);
|
|
51
|
+
}
|
|
52
|
+
static warn(message, data) {
|
|
53
|
+
return new Log('meadmin').warn(message, data);
|
|
54
|
+
}
|
|
55
|
+
static error(message, data) {
|
|
56
|
+
return new Log('meadmin').error(message, data);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFdBQVcsR0FBRztJQUNsQixLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU07SUFDeEIsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLO0lBQ3hCLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSztJQUN0QixNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUs7SUFDeEIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNO0lBQzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSztJQUN6QixNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUs7SUFDeEIsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLO0lBQ3hCLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSztJQUN0QixLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUs7SUFDeEIsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLO0lBQ3pCLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSztJQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUs7SUFDMUIsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLO0lBQ3ZCLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSztJQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVM7SUFDOUIsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUztJQUM5QixRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVM7SUFDL0IsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQzdCLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUztJQUNoQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVM7SUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTO0NBQy9CLENBQUM7QUFFRixNQUFNLE9BQU8sR0FBRztJQUNZO0lBQTFCLFlBQTBCLFVBQVUsRUFBRTtRQUFaLFlBQU8sR0FBUCxPQUFPLENBQUs7UUFDcEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLElBQUksQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUNNLEdBQUcsQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLGNBQWMsRUFBRSxLQUFLLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ00sT0FBTyxDQUFDLE9BQWUsRUFBRSxJQUFVO1FBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxPQUFPLFNBQVMsRUFDeEYsSUFBSSxJQUFJLEVBQUUsQ0FDWCxDQUFDO0lBQ0osQ0FBQztJQUNNLElBQUksQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUNyQyxPQUFPLENBQUMsSUFBSSxDQUNWLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsY0FBYyxFQUFFLEtBQUssT0FBTyxTQUFTLEVBQ3pGLElBQUksSUFBSSxFQUFFLENBQ1gsQ0FBQztJQUNKLENBQUM7SUFDTSxLQUFLLENBQUMsT0FBZSxFQUFFLElBQVU7UUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FDWCxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLGNBQWMsRUFBRSxLQUFLLE9BQU8sU0FBUyxFQUN0RixJQUFJLElBQUksRUFBRSxDQUNYLENBQUM7SUFDSixDQUFDO0lBQ00sTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUMzQyxPQUFPLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNNLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBZSxFQUFFLElBQVU7UUFDL0MsT0FBTyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDTSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQWUsRUFBRSxJQUFVO1FBQzVDLE9BQU8sSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ00sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUM3QyxPQUFPLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGIn0=
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@meadmin/cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "meadmin cli",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"meadmin": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
12
|
+
"build": "rimraf dist && tsc --build"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist/**/*.js",
|
|
16
|
+
"dist/**/*.d.ts",
|
|
17
|
+
"template"
|
|
18
|
+
],
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/meadmin-cn/meadmin"
|
|
21
|
+
},
|
|
22
|
+
"author": "yuntian001",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/meadmin-cn/meadmin"
|
|
26
|
+
},
|
|
27
|
+
"exports": {
|
|
28
|
+
".": "./dist/index.js",
|
|
29
|
+
"./utils/formatting": "./dist/utils/formatting.js"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [],
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/mocha": "^10.0.10",
|
|
35
|
+
"mocha": "^10.8.2",
|
|
36
|
+
"prettier": "2.8.8",
|
|
37
|
+
"prettier-plugin-organize-imports": "^4.3.0",
|
|
38
|
+
"rimraf": "^6.0.1",
|
|
39
|
+
"typescript": "^5.9.2"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"art-template": "4.13.2",
|
|
43
|
+
"commander": "^14.0.0",
|
|
44
|
+
"dotenv": "^16.6.1",
|
|
45
|
+
"swagger-client": "^3.35.6"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"@sequelize/cli": "7.x || >=7.0.0-alpha.46",
|
|
49
|
+
"@sequelize/core": "7.x || >=7.0.0-alpha.46",
|
|
50
|
+
"@sequelize/postgres": "7.x || >=7.0.0-alpha.46"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=20.13.1"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Body, Controller, Get, Post, Inject, Param } from '@midwayjs/core';
|
|
2
|
+
import { BaseController } from '{{@ paths.baseControllerPath}}';
|
|
3
|
+
import { {{@ replaceNames.Name}} } from '{{@ paths.entityPath}}';
|
|
4
|
+
import { {{@ replaceNames.CreateDto}} } from '{{@ paths.createDtoPath}}';
|
|
5
|
+
import { {{@ replaceNames.QueryDto}} } from '{{@ paths.queryDtoPath}}';
|
|
6
|
+
import { {{@ replaceNames.UpdateDto}} } from '{{@ paths.updateDtoPath}}';
|
|
7
|
+
import { {{@ replaceNames.Service}} } from '{{@ paths.servicePath}}';
|
|
8
|
+
import { ApiOperationResponse } from '@/decorators/index.js';
|
|
9
|
+
{{if adminPermission}}import { AdminPermission } from '@/decorators/index.js';{{/if}}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 为了防止防火墙禁止PUT、DELETE请求,方便传参,除详情外统一使用post请求。
|
|
13
|
+
* meadmin对controller做了装饰器继承封装,当以/开头时会使用当前controller前缀地址,不以/开头时会递归继承controller前缀地址
|
|
14
|
+
*/
|
|
15
|
+
@Controller('{{@ replaceNames.controllerPath}}')
|
|
16
|
+
export class {{@ replaceNames.Controller}} extends BaseController {
|
|
17
|
+
@Inject()
|
|
18
|
+
{{@ replaceNames.service}}: {{@ replaceNames.Service}};
|
|
19
|
+
|
|
20
|
+
<% const hasStatement = ['File']; %>
|
|
21
|
+
{{each $imports.objectKeys(entity.belongsToEntity)}}<% const valueEntity = entity.belongsToEntity[$value]; %>{{if hasStatement.includes(valueEntity.entityName)}}<% return; %>{{else}}<% hasStatement.push(valueEntity.entityName);%>{{/if}}
|
|
22
|
+
//查询belongsTo关联模型{{@ $value}}{{@ valueEntity.tableComment}}
|
|
23
|
+
//获取{{@ valueEntity.tableComment}}信息
|
|
24
|
+
@Post('/get{{@ valueEntity.entityName}}')
|
|
25
|
+
@ApiOperationResponse({
|
|
26
|
+
responseType: {{@ replaceNames.Name}},
|
|
27
|
+
summary: '查询{{@ valueEntity.tableComment}}信息',
|
|
28
|
+
}){{if adminPermission}}
|
|
29
|
+
@AdminPermission('{{@replaceNames.Name}}List'){{/if}}
|
|
30
|
+
async get{{@ valueEntity.entityName}}(
|
|
31
|
+
@Body('{{@ valueEntity.pk[0]}}') {{@ valueEntity.pk[0]}}: {{@ swaggerSchemas[valueEntity.entityName]?.properties?.[entity.pk[0]]?.type || 'string'}},{{if valueEntity.nameKeys.length}}
|
|
32
|
+
@Body('{{@ valueEntity.nameKeys[0]}}') {{@ valueEntity.nameKeys[0]}}: string,{{/if}}
|
|
33
|
+
@Body('page') page = 1,
|
|
34
|
+
@Body('pageSize') pageSize=10
|
|
35
|
+
) {
|
|
36
|
+
return this.success(await this.{{@ replaceNames.service}}.get{{@ valueEntity.entityName}}(page,pageSize,{{@ valueEntity.pk[0]}}{{if valueEntity.nameKeys.length}},{{@ valueEntity.nameKeys[0]}}{{/if}}));
|
|
37
|
+
}{{/each}}
|
|
38
|
+
|
|
39
|
+
{{each $imports.objectKeys(entity.belongsToManyEntity)}}<% const valueEntity = entity.belongsToManyEntity[$value]; %>{{if hasStatement.includes(valueEntity.entityName)}}<% return; %>{{else}}<% hasStatement.push(valueEntity.entityName);%>{{/if}}
|
|
40
|
+
//查询belongsToMany关联模型{{@ $value}}{{@ valueEntity.tableComment}}
|
|
41
|
+
//获取{{@ valueEntity.tableComment}}信息
|
|
42
|
+
@Post('/get{{@ valueEntity.entityName}}')
|
|
43
|
+
@ApiOperationResponse({
|
|
44
|
+
responseType: {{@ replaceNames.Name}},
|
|
45
|
+
summary: '查询{{@ valueEntity.tableComment}}信息',
|
|
46
|
+
}){{if adminPermission}}
|
|
47
|
+
@AdminPermission('{{@replaceNames.Name}}List'){{/if}}
|
|
48
|
+
async get{{@ valueEntity.entityName}}(
|
|
49
|
+
@Body('{{@ valueEntity.pk[0]}}') {{@ valueEntity.pk[0]}}: {{@ swaggerSchemas[valueEntity.entityName]?.properties?.[entity.pk[0]]?.type || 'string'}},{{if valueEntity.nameKeys.length}}
|
|
50
|
+
@Body('{{@ valueEntity.nameKeys[0]}}') {{@ valueEntity.nameKeys[0]}}: string,{{/if}}
|
|
51
|
+
@Body('page') page = 1,
|
|
52
|
+
@Body('pageSize') pageSize=10
|
|
53
|
+
) {
|
|
54
|
+
return this.success(await this.{{@ replaceNames.service}}.get{{@ valueEntity.entityName}}(page,pageSize,{{@ valueEntity.pk[0]}}{{if valueEntity.nameKeys.length}},{{@ valueEntity.nameKeys[0]}}{{/if}}));
|
|
55
|
+
}{{/each}}
|
|
56
|
+
|
|
57
|
+
//接口方法必须加async 方法的接口装饰器值必须/开头
|
|
58
|
+
@Post('/add')
|
|
59
|
+
@ApiOperationResponse({
|
|
60
|
+
responseType: {{@ replaceNames.Name}},
|
|
61
|
+
summary: '添加{{@ entity.tableComment}}信息',
|
|
62
|
+
}){{if adminPermission}}
|
|
63
|
+
@AdminPermission('{{@replaceNames.Name}}Add'){{/if}}
|
|
64
|
+
async add(@Body() createDto: {{@ replaceNames.CreateDto}}) {
|
|
65
|
+
return this.success(await this.{{@ replaceNames.service}}.create(createDto));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
//接口方法必须加async 方法的接口装饰器值必须/开头
|
|
69
|
+
@Post('/')
|
|
70
|
+
@ApiOperationResponse({
|
|
71
|
+
responsePage: {{@ replaceNames.Name}},
|
|
72
|
+
summary: '获取{{@ entity.tableComment}}列表',
|
|
73
|
+
}){{if adminPermission}}
|
|
74
|
+
@AdminPermission('{{@replaceNames.Name}}List'){{/if}}
|
|
75
|
+
async list(@Body() queryDto: {{@ replaceNames.QueryDto}}) {
|
|
76
|
+
return this.success(await this.{{@ replaceNames.service}}.list(queryDto));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
//接口方法必须加async 方法的接口装饰器值必须/开头
|
|
80
|
+
@Get('/info/:{{@ entity.pk.join('/:')}}')
|
|
81
|
+
@ApiOperationResponse({
|
|
82
|
+
responseType: {{@ replaceNames.Name}},
|
|
83
|
+
summary: '根据{{@ entity.pk.join('/:')}}获取{{@ entity.tableComment}}详情',
|
|
84
|
+
}){{if adminPermission}}
|
|
85
|
+
@AdminPermission('{{@replaceNames.Name}}Edit'){{/if}}
|
|
86
|
+
async findOne({{each entity.pk}}{{if index>0}}, {{/if}}@Param('{{@ $value}}') {{@ $value}}: {{@ entitySchema.properties[$value].type}}{{/each}}) {
|
|
87
|
+
{{if entity.pk.length>1}}const entity = await this.{{@ replaceNames.service}}.findOne({
|
|
88
|
+
{{each entity.pk}}{{@ $value}},{{/each}}
|
|
89
|
+
});
|
|
90
|
+
{{else}}const entity = await this.{{@ replaceNames.service}}.findOne({{@ entity.pk[0]}});{{/if}}
|
|
91
|
+
return this.success(entity);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
//接口方法必须加async 方法的接口装饰器值必须/开头
|
|
95
|
+
@Post('/up/:{{@ entity.pk.join('/:')}}')
|
|
96
|
+
@ApiOperationResponse({
|
|
97
|
+
responseType: {{@ replaceNames.Name}},
|
|
98
|
+
summary: '根据{{@ entity.pk.join('/:')}}更新{{@ entity.tableComment}}详情',
|
|
99
|
+
}){{if adminPermission}}
|
|
100
|
+
@AdminPermission('{{@replaceNames.Name}}Edit'){{/if}}
|
|
101
|
+
async update({{each entity.pk}}@Param('{{@ $value}}') {{@ $value}}: {{@ entitySchema.properties[$value].type}}, {{/each}}@Body() updateDto: {{@ replaceNames.UpdateDto}}) {
|
|
102
|
+
return this.success(
|
|
103
|
+
{{if entity.pk.length>1}}await this.{{@ replaceNames.service}}.update({
|
|
104
|
+
{{each entity.pk}}{{@ $value}},{{/each}}
|
|
105
|
+
}, updateDto)
|
|
106
|
+
{{else}}await this.{{@ replaceNames.service}}.update({{@ entity.pk[0]}}, updateDto){{/if}}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//接口方法必须加async 方法的接口装饰器值必须/开头
|
|
111
|
+
@Post('/del/:{{@ entity.pk.join('/:')}}')
|
|
112
|
+
@ApiOperationResponse({
|
|
113
|
+
summary: '根据{{@ entity.pk.join('/:')}}删除{{@ entity.tableComment}}信息',
|
|
114
|
+
}){{if adminPermission}}
|
|
115
|
+
@AdminPermission('{{@replaceNames.Name}}Del'){{/if}}
|
|
116
|
+
async delete({{each entity.pk}}{{if index>0}}, {{/if}}@Param('{{@ $value}}') {{@ $value}}: {{@ entitySchema.properties[$value].type}}{{/each}}) {
|
|
117
|
+
{{if entity.pk.length>1}}await this.{{@ replaceNames.service}}.remove({
|
|
118
|
+
{{each entity.pk}}
|
|
119
|
+
{{@ $value}},
|
|
120
|
+
{{/each}}
|
|
121
|
+
});{{else}}await this.{{@ replaceNames.service}}.remove({{@ entity.pk[0]}});{{/if}}
|
|
122
|
+
return this.success();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { {{@ replaceNames.Name}} } from '{{@ paths.entityPath}}';
|
|
2
|
+
import { OmitDtoType } from '@/helper/dto.js';
|
|
3
|
+
import { InferAttributesLoose } from '@/types/entity.js';
|
|
4
|
+
|
|
5
|
+
//dto参数校验继承 entity必须使用 PickDtoType|OmitDtoType|PartialType|RequiredType|IntersectionType 之一 否则不会生效
|
|
6
|
+
export class {{@ replaceNames.CreateDto}} extends OmitDtoType(
|
|
7
|
+
{{replaceNames.Name}} as new () => InferAttributesLoose<{{@ replaceNames.Name}}>, //只保留声明属性
|
|
8
|
+
['{{@ entity.autoAttributes.join("','")}}'] //排除自动创建的字段
|
|
9
|
+
) {
|
|
10
|
+
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { IntersectionType, PartialType } from '@/helper/dto.js';
|
|
2
|
+
import { {{@ replaceNames.Name}} } from '{{@ paths.entityPath}}';
|
|
3
|
+
import { InferAttributesLoose } from '@/types/entity.js';
|
|
4
|
+
import { PageDto } from '@/dto/page.dto.js';
|
|
5
|
+
{{if $imports.objectKeys(entitySchema.properties).some(v=>v.endsWith('At'))}}import { ApiPropertyRule } from '@/decorators/index.js';
|
|
6
|
+
import { RuleType } from '@/ruleType/index.js';{{/if}}
|
|
7
|
+
|
|
8
|
+
//dto参数校验继承 entity必须使用 PickDtoType|OmitDtoType|PartialType|RequiredType|IntersectionType 之一 否则不会生效
|
|
9
|
+
export class {{@ replaceNames.QueryDto}} extends IntersectionType(
|
|
10
|
+
PageDto,
|
|
11
|
+
PartialType({{@ replaceNames.Name}} as new () => InferAttributesLoose<{{@ replaceNames.Name}}>)
|
|
12
|
+
) {
|
|
13
|
+
{{each entitySchema.properties}}{{if $index.endsWith('At')}}@ApiPropertyRule({ description: '{{@ $value.description}}(起)', rule: RuleType.date() })
|
|
14
|
+
start{{@ $imports.upFirstCase($index)}}?:Date;
|
|
15
|
+
|
|
16
|
+
@ApiPropertyRule({ description: '{{@ $value.description}}(止)', rule: RuleType.date() })
|
|
17
|
+
end{{@ $imports.upFirstCase($index)}}?:Date;{{/if}}
|
|
18
|
+
{{/each}}
|
|
19
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { {{@ replaceNames.Name}} } from '{{@ paths.entityPath}}';
|
|
2
|
+
import { InferAttributesLoose } from '@/types/entity.js';
|
|
3
|
+
import { PartialType, OmitDtoType } from '@/helper/dto.js';
|
|
4
|
+
|
|
5
|
+
//dto参数校验继承 entity必须使用 PickDtoType|OmitDtoType|PartialType|RequiredType|IntersectionType 之一 否则不会生效
|
|
6
|
+
export class {{@ replaceNames.UpdateDto}} extends PartialType(OmitDtoType(
|
|
7
|
+
{{replaceNames.Name}} as new () => InferAttributesLoose<{{@ replaceNames.Name}}>, //只保留声明属性
|
|
8
|
+
['{{@ entity.autoAttributes.join("','")}}'] //排除自动创建的字段
|
|
9
|
+
)) {
|
|
10
|
+
|
|
11
|
+
}
|