初始化项目版本
This commit is contained in:
69
vite-plugins/axhubComponentEnforcer.ts
Normal file
69
vite-plugins/axhubComponentEnforcer.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
import type { Plugin } from 'vite';
|
||||
import path from 'path';
|
||||
|
||||
/**
|
||||
*本项目组件规范强制检查插件
|
||||
* 1. 检查是否包含 default export
|
||||
* 2. 在底部注入第三方平台所需的注册代码
|
||||
*/
|
||||
export function axhubComponentEnforcer(entryPath?: string): Plugin {
|
||||
function resolveDefaultExportTarget(code: string, filePath: string) {
|
||||
if (!/\bexport\s+default\b/.test(code)) {
|
||||
throw new Error(`\n\n❌ 构建失败: ${filePath}\n必须包含 default export 以符合本项目组件规范。\n`);
|
||||
}
|
||||
|
||||
const namedFunctionMatch = code.match(/export\s+default\s+(?:async\s+)?function\s+([A-Za-z_$][\w$]*)\s*\(/);
|
||||
if (namedFunctionMatch) {
|
||||
return {
|
||||
transformedCode: code,
|
||||
target: namedFunctionMatch[1]
|
||||
};
|
||||
}
|
||||
|
||||
const namedClassMatch = code.match(/export\s+default\s+class\s+([A-Za-z_$][\w$]*)\b/);
|
||||
if (namedClassMatch) {
|
||||
return {
|
||||
transformedCode: code,
|
||||
target: namedClassMatch[1]
|
||||
};
|
||||
}
|
||||
|
||||
const identifierMatch = code.match(/export\s+default\s+(?!function\b|class\b)([A-Za-z_$][\w$]*)\s*;?/);
|
||||
if (identifierMatch) {
|
||||
return {
|
||||
transformedCode: code,
|
||||
target: identifierMatch[1]
|
||||
};
|
||||
}
|
||||
|
||||
const exportDefaultPattern = /\bexport\s+default\s+/;
|
||||
const replacedCode = code.replace(exportDefaultPattern, 'const __AXHUB_DEFAULT_COMPONENT__ = ');
|
||||
if (replacedCode === code) {
|
||||
throw new Error(`\n\n❌ 构建失败: ${filePath}\n无法解析 default export,请使用标准导出语法。\n`);
|
||||
}
|
||||
|
||||
return {
|
||||
transformedCode: `${replacedCode}\n\nexport default __AXHUB_DEFAULT_COMPONENT__;\n`,
|
||||
target: '__AXHUB_DEFAULT_COMPONENT__'
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
name: 'axhub-component-enforcer',
|
||||
enforce: 'pre',
|
||||
transform(code, id) {
|
||||
if (!entryPath || path.resolve(id) !== path.resolve(entryPath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const { transformedCode, target } = resolveDefaultExportTarget(code, entryPath);
|
||||
|
||||
const injection = `
|
||||
if (typeof window !== 'undefined' && window.__AXHUB_DEFINE_COMPONENT__) {
|
||||
window.__AXHUB_DEFINE_COMPONENT__(${target});
|
||||
}
|
||||
`;
|
||||
return transformedCode + injection;
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user