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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +82 -0
  3. package/build/generators/api.d.ts +3 -0
  4. package/build/generators/api.d.ts.map +1 -0
  5. package/build/generators/api.js +8 -0
  6. package/build/generators/api.js.map +1 -0
  7. package/build/generators/form-vue.d.ts +3 -0
  8. package/build/generators/form-vue.d.ts.map +1 -0
  9. package/build/generators/form-vue.js +8 -0
  10. package/build/generators/form-vue.js.map +1 -0
  11. package/build/generators/index-vue.d.ts +3 -0
  12. package/build/generators/index-vue.d.ts.map +1 -0
  13. package/build/generators/index-vue.js +8 -0
  14. package/build/generators/index-vue.js.map +1 -0
  15. package/build/generators/options.d.ts +3 -0
  16. package/build/generators/options.d.ts.map +1 -0
  17. package/build/generators/options.js +8 -0
  18. package/build/generators/options.js.map +1 -0
  19. package/build/index.d.ts +3 -0
  20. package/build/index.d.ts.map +1 -0
  21. package/build/index.js +74 -0
  22. package/build/index.js.map +1 -0
  23. package/build/templates/api.tpl.d.ts +3 -0
  24. package/build/templates/api.tpl.d.ts.map +1 -0
  25. package/build/templates/api.tpl.js +53 -0
  26. package/build/templates/api.tpl.js.map +1 -0
  27. package/build/templates/form-vue.tpl.d.ts +3 -0
  28. package/build/templates/form-vue.tpl.d.ts.map +1 -0
  29. package/build/templates/form-vue.tpl.js +862 -0
  30. package/build/templates/form-vue.tpl.js.map +1 -0
  31. package/build/templates/index-vue.tpl.d.ts +3 -0
  32. package/build/templates/index-vue.tpl.d.ts.map +1 -0
  33. package/build/templates/index-vue.tpl.js +591 -0
  34. package/build/templates/index-vue.tpl.js.map +1 -0
  35. package/build/templates/options.tpl.d.ts +3 -0
  36. package/build/templates/options.tpl.d.ts.map +1 -0
  37. package/build/templates/options.tpl.js +48 -0
  38. package/build/templates/options.tpl.js.map +1 -0
  39. package/build/tools/generate.d.ts +11 -0
  40. package/build/tools/generate.d.ts.map +1 -0
  41. package/build/tools/generate.js +95 -0
  42. package/build/tools/generate.js.map +1 -0
  43. package/build/tools/validate.d.ts +1051 -0
  44. package/build/tools/validate.d.ts.map +1 -0
  45. package/build/tools/validate.js +147 -0
  46. package/build/tools/validate.js.map +1 -0
  47. package/build/types/schema.d.ts +124 -0
  48. package/build/types/schema.d.ts.map +1 -0
  49. package/build/types/schema.js +7 -0
  50. package/build/types/schema.js.map +1 -0
  51. 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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"}