mcp-vue-codegen 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/LICENSE +21 -0
- package/README.md +82 -0
- package/build/generators/api.d.ts +3 -0
- package/build/generators/api.d.ts.map +1 -0
- package/build/generators/api.js +8 -0
- package/build/generators/api.js.map +1 -0
- package/build/generators/form-vue.d.ts +3 -0
- package/build/generators/form-vue.d.ts.map +1 -0
- package/build/generators/form-vue.js +8 -0
- package/build/generators/form-vue.js.map +1 -0
- package/build/generators/index-vue.d.ts +3 -0
- package/build/generators/index-vue.d.ts.map +1 -0
- package/build/generators/index-vue.js +8 -0
- package/build/generators/index-vue.js.map +1 -0
- package/build/generators/options.d.ts +3 -0
- package/build/generators/options.d.ts.map +1 -0
- package/build/generators/options.js +8 -0
- package/build/generators/options.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +74 -0
- package/build/index.js.map +1 -0
- package/build/templates/api.tpl.d.ts +3 -0
- package/build/templates/api.tpl.d.ts.map +1 -0
- package/build/templates/api.tpl.js +53 -0
- package/build/templates/api.tpl.js.map +1 -0
- package/build/templates/form-vue.tpl.d.ts +3 -0
- package/build/templates/form-vue.tpl.d.ts.map +1 -0
- package/build/templates/form-vue.tpl.js +862 -0
- package/build/templates/form-vue.tpl.js.map +1 -0
- package/build/templates/index-vue.tpl.d.ts +3 -0
- package/build/templates/index-vue.tpl.d.ts.map +1 -0
- package/build/templates/index-vue.tpl.js +591 -0
- package/build/templates/index-vue.tpl.js.map +1 -0
- package/build/templates/options.tpl.d.ts +3 -0
- package/build/templates/options.tpl.d.ts.map +1 -0
- package/build/templates/options.tpl.js +48 -0
- package/build/templates/options.tpl.js.map +1 -0
- package/build/tools/generate.d.ts +11 -0
- package/build/tools/generate.d.ts.map +1 -0
- package/build/tools/generate.js +95 -0
- package/build/tools/generate.js.map +1 -0
- package/build/tools/validate.d.ts +1051 -0
- package/build/tools/validate.d.ts.map +1 -0
- package/build/tools/validate.js +147 -0
- package/build/tools/validate.js.map +1 -0
- package/build/types/schema.d.ts +124 -0
- package/build/types/schema.d.ts.map +1 -0
- package/build/types/schema.js +7 -0
- package/build/types/schema.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateOptionsTemplate = generateOptionsTemplate;
|
|
4
|
+
function generateEntityBlock(fields, entityName, comment) {
|
|
5
|
+
const lines = [];
|
|
6
|
+
lines.push(`/**`);
|
|
7
|
+
lines.push(` * 定义${comment}属性配置,用于控制表格列的显示和智能搜索的启用`);
|
|
8
|
+
lines.push(` * @param {boolean} show - 是否显示在表格中(当alwaysHide为true表示一直不显示,为false再配合show来动态控制是否显示)`);
|
|
9
|
+
lines.push(` * @param {boolean} smart - 是否支持智能搜索`);
|
|
10
|
+
lines.push(` * @param {string} label - 列的显示名称`);
|
|
11
|
+
lines.push(` * @param {string} width - 列宽`);
|
|
12
|
+
lines.push(` */`);
|
|
13
|
+
lines.push(`export const ${entityName} = {`);
|
|
14
|
+
fields.forEach((field, index) => {
|
|
15
|
+
const show = field.showInTable;
|
|
16
|
+
const alwaysHide = field.alwaysHide;
|
|
17
|
+
const smart = field.smartSearch;
|
|
18
|
+
const label = field.label;
|
|
19
|
+
const width = field.tableWidth;
|
|
20
|
+
const comma = index < fields.length - 1 ? ',' : '';
|
|
21
|
+
lines.push(` ${field.fieldName}: { show: ${show}, alwaysHide: ${alwaysHide}, smart: ${smart}, label: '${label}', width: '${width}' }${comma}`);
|
|
22
|
+
});
|
|
23
|
+
lines.push(`}`);
|
|
24
|
+
return lines.join('\n');
|
|
25
|
+
}
|
|
26
|
+
function generateOptionsTemplate(schema) {
|
|
27
|
+
const parts = [];
|
|
28
|
+
// Master entity
|
|
29
|
+
parts.push(generateEntityBlock(schema.master.fields, 'dataMasterEntity', schema.module.businessName));
|
|
30
|
+
// Detail entity (if exists)
|
|
31
|
+
if (schema.detail) {
|
|
32
|
+
parts.push(generateEntityBlock(schema.detail.fields, 'dataDetailEntity', `${schema.module.businessName}从表`));
|
|
33
|
+
}
|
|
34
|
+
// Filter types
|
|
35
|
+
const filterEntries = Object.entries(schema.master.filterTypes);
|
|
36
|
+
if (filterEntries.length > 0) {
|
|
37
|
+
parts.push('');
|
|
38
|
+
parts.push('// 设置过滤类型,用于定义特定属性的过滤行为');
|
|
39
|
+
parts.push('export const filterTypes = {');
|
|
40
|
+
filterEntries.forEach(([key, value], index) => {
|
|
41
|
+
const comma = index < filterEntries.length - 1 ? ',' : '';
|
|
42
|
+
parts.push(` ${key}: ${value}${comma}`);
|
|
43
|
+
});
|
|
44
|
+
parts.push('}');
|
|
45
|
+
}
|
|
46
|
+
return parts.join('\n') + '\n';
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=options.tpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.tpl.js","sourceRoot":"","sources":["../../src/templates/options.tpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface GenerateResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
files: {
|
|
4
|
+
path: string;
|
|
5
|
+
lines: number;
|
|
6
|
+
description: string;
|
|
7
|
+
}[];
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function generateVueCrud(schemaJson: string, outputDir: string): Promise<GenerateResult>;
|
|
11
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/tools/generate.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAuDpG"}
|
|
@@ -0,0 +1,95 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.generateVueCrud = generateVueCrud;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const validate_js_1 = require("./validate.js");
|
|
40
|
+
const options_js_1 = require("../generators/options.js");
|
|
41
|
+
const api_js_1 = require("../generators/api.js");
|
|
42
|
+
const index_vue_js_1 = require("../generators/index-vue.js");
|
|
43
|
+
const form_vue_js_1 = require("../generators/form-vue.js");
|
|
44
|
+
async function generateVueCrud(schemaJson, outputDir) {
|
|
45
|
+
try {
|
|
46
|
+
const schema = (0, validate_js_1.parseSchema)(schemaJson);
|
|
47
|
+
const files = [];
|
|
48
|
+
// Ensure output directory exists
|
|
49
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
50
|
+
// 1. Generate options.ts
|
|
51
|
+
const optionsCode = (0, options_js_1.generateOptions)(schema);
|
|
52
|
+
const optionsPath = path.join(outputDir, 'options.ts');
|
|
53
|
+
fs.writeFileSync(optionsPath, optionsCode, 'utf-8');
|
|
54
|
+
files.push({
|
|
55
|
+
path: optionsPath,
|
|
56
|
+
lines: optionsCode.split('\n').length,
|
|
57
|
+
description: '表单配置(字段属性、过滤类型)'
|
|
58
|
+
});
|
|
59
|
+
// 2. Generate API file
|
|
60
|
+
const apiCode = (0, api_js_1.generateApi)(schema);
|
|
61
|
+
const apiDir = path.join(outputDir, ...schema.module.apiFilePath.split('/').slice(0, -1));
|
|
62
|
+
fs.mkdirSync(apiDir, { recursive: true });
|
|
63
|
+
const apiFileName = schema.module.apiFilePath.split('/').pop();
|
|
64
|
+
const apiPath = path.join(outputDir, ...schema.module.apiFilePath.split('/')) + '.ts';
|
|
65
|
+
fs.writeFileSync(apiPath, apiCode, 'utf-8');
|
|
66
|
+
files.push({
|
|
67
|
+
path: apiPath,
|
|
68
|
+
lines: apiCode.split('\n').length,
|
|
69
|
+
description: 'API 接口(CRUD 5个标准方法)'
|
|
70
|
+
});
|
|
71
|
+
// 3. Generate index.vue
|
|
72
|
+
const indexCode = (0, index_vue_js_1.generateIndexVue)(schema);
|
|
73
|
+
const indexPath = path.join(outputDir, 'index.vue');
|
|
74
|
+
fs.writeFileSync(indexPath, indexCode, 'utf-8');
|
|
75
|
+
files.push({
|
|
76
|
+
path: indexPath,
|
|
77
|
+
lines: indexCode.split('\n').length,
|
|
78
|
+
description: '列表页(表格、搜索、按钮、分页)'
|
|
79
|
+
});
|
|
80
|
+
// 4. Generate form.vue
|
|
81
|
+
const formCode = (0, form_vue_js_1.generateFormVue)(schema);
|
|
82
|
+
const formPath = path.join(outputDir, 'form.vue');
|
|
83
|
+
fs.writeFileSync(formPath, formCode, 'utf-8');
|
|
84
|
+
files.push({
|
|
85
|
+
path: formPath,
|
|
86
|
+
lines: formCode.split('\n').length,
|
|
87
|
+
description: '表单页(折叠面板、字段控件、校验规则、从表)'
|
|
88
|
+
});
|
|
89
|
+
return { success: true, files };
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
return { success: false, files: [], error: e.message };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/tools/generate.ts"],"names":[],"mappings":"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"}
|