/**
* IOC 低码组件生成工具
*
* 生成符合 M8 低码规范的组件目录结构和文件模板
*/
import {
generateIocBaseTemplate,
generateIocConfigTemplate,
generateIocMockDataTemplate,
generateIocVueTemplate,
generateIocScssTemplate,
generateIocIndexJsTemplate,
generateEventGenerateTemplate,
generateBoxOptionsTemplate,
} from "../templates/ioc.js";
export interface GenerateIocOptions {
componentName: string; // 组件名称(PascalCase,如 ProductList)
displayName: string; // 组件中文名称
description: string; // 功能描述
author: string; // 作者
}
export interface GeneratedFile {
path: string;
content: string;
}
/**
* 生成 IOC 组件文件列表
*/
export function generateIocComponentFiles(
options: GenerateIocOptions,
): GeneratedFile[] {
const { componentName, displayName, description, author } = options;
const now = new Date();
const dateStr = formatDate(now);
const templateOptions = {
componentName,
displayName,
description,
author,
dateStr,
};
const files: GeneratedFile[] = [];
// 1. js/base.js - 基础配置
files.push({
path: "js/base.js",
content: generateIocBaseTemplate(templateOptions),
});
// 2. js/config.js - 低码配置
files.push({
path: "js/config.js",
content: generateIocConfigTemplate(templateOptions),
});
// 3. mock/data.js - Mock 数据
files.push({
path: "mock/data.js",
content: generateIocMockDataTemplate(templateOptions),
});
// 4. css/index.scss - 样式文件
files.push({
path: "css/index.scss",
content: generateIocScssTemplate(templateOptions),
});
// 5. index.vue - 组件主文件
files.push({
path: "index.vue",
content: generateIocVueTemplate(templateOptions),
});
// 6. index.js - 注册入口
files.push({
path: "index.js",
content: generateIocIndexJsTemplate(templateOptions),
});
// 7. plugin/eventgenerate/index.js - 事件生成插件
files.push({
path: "plugin/eventgenerate/index.js",
content: generateEventGenerateTemplate(),
});
// 8. plugin/boxoptions/config.js - 容器配置插件(与参考组件格式一致)
files.push({
path: "plugin/boxoptions/config.js",
content: generateBoxOptionsTemplate(),
});
return files;
}
/**
* 格式化日期
*/
function formatDate(date: Date): string {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
const seconds = String(date.getSeconds()).padStart(2, "0");
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
/**
* 验证组件名称是否符合 PascalCase 规范
*/
export function validateComponentName(name: string): {
valid: boolean;
message: string;
} {
// 检查是否为空
if (!name || name.trim() === "") {
return { valid: false, message: "组件名称不能为空" };
}
// 检查是否以大写字母开头
if (!/^[A-Z]/.test(name)) {
return {
valid: false,
message: "组件名称必须以大写字母开头(PascalCase)",
};
}
// 检查是否只包含字母和数字
if (!/^[A-Za-z][A-Za-z0-9]*$/.test(name)) {
return { valid: false, message: "组件名称只能包含字母和数字" };
}
return { valid: true, message: "组件名称有效" };
}