fix(runtime): 解决启动脚本不识别组件包内的插件

This commit is contained in:
kevinyzheng 2022-07-07 11:30:38 +08:00 committed by jia000
parent db96610c91
commit 8b70edeaf2

View File

@ -28,6 +28,12 @@ const pluginList = {};
let cwd = __dirname; let cwd = __dirname;
const pageRoot = () => path.resolve(cwd, '..'); const pageRoot = () => path.resolve(cwd, '..');
const entryPath = () => path.resolve(pageRoot(), './src'); const entryPath = () => path.resolve(pageRoot(), './src');
const defineTypes = {
component: 'component',
config: 'config',
value: 'value',
event: 'event',
};
const makeCamelCase = function (name) { const makeCamelCase = function (name) {
if (typeof name !== 'string') { if (typeof name !== 'string') {
@ -47,16 +53,16 @@ const parseEntry = function ({ ast, package, indexPath }) {
const { importComponentSource, importComponentToken } = tokens; const { importComponentSource, importComponentToken } = tokens;
if (!config) { if (!config) {
console.log(`${package} config 文件声明不合法`); console.log(`${package} ${defineTypes.config} 文件声明不合法`);
return exit(1); return exit(1);
} }
if (!value) { if (!value) {
console.log(`${package} value 文件声明不合法`); console.log(`${package} ${defineTypes.value} 文件声明不合法`);
return exit(1); return exit(1);
} }
if (!event) { if (!event) {
// event 非必须,不需要 exit // event 非必须,不需要 exit
console.log(`${package} event 文件声明缺失`); console.log(`${package} ${defineTypes.event} 文件声明缺失`);
} }
const findIndex = importComponentToken.indexOf(exportDefaultToken); const findIndex = importComponentToken.indexOf(exportDefaultToken);
@ -66,7 +72,7 @@ const parseEntry = function ({ ast, package, indexPath }) {
} }
if (!component) { if (!component) {
console.log(`${package} component 文件声明不合法`); console.log(`${package} ${defineTypes.component} 文件声明不合法`);
return exit(1); return exit(1);
} }
@ -106,11 +112,11 @@ const getASTTokenByTraverse = ({ ast, indexPath }) => {
const { specifiers, source } = node; const { specifiers, source } = node;
const name = specifiers[0].exported.name.toLowerCase(); const name = specifiers[0].exported.name.toLowerCase();
if (name === 'value') { if (name === defineTypes.value) {
value = path.resolve(path.dirname(indexPath), source.value); value = path.resolve(path.dirname(indexPath), source.value);
} else if (name === 'config') { } else if (name === defineTypes.config) {
config = path.resolve(path.dirname(indexPath), source.value); config = path.resolve(path.dirname(indexPath), source.value);
} else if (name === 'event') { } else if (name === defineTypes.event) {
event = path.resolve(path.dirname(indexPath), source.value); event = path.resolve(path.dirname(indexPath), source.value);
} }
@ -136,11 +142,11 @@ const getASTTokenByTraverse = ({ ast, indexPath }) => {
const generateEntry = function ({ entries, type = 'build', componentFileAffix }) { const generateEntry = function ({ entries, type = 'build', componentFileAffix }) {
const commonArgs = { entries, componentFileAffix }; const commonArgs = { entries, componentFileAffix };
generateEntryFile({ entryFile: 'comp-entry.ts', type: 'component', ...commonArgs }); generateEntryFile({ entryFile: 'comp-entry.ts', type: defineTypes.component, ...commonArgs });
if (type === 'build') { if (type === 'build') {
generateEntryFile({ entryFile: 'config-entry.ts', type: 'config', ...commonArgs }); generateEntryFile({ entryFile: 'config-entry.ts', type: defineTypes.config, ...commonArgs });
generateEntryFile({ entryFile: 'value-entry.ts', type: 'value', ...commonArgs }); generateEntryFile({ entryFile: 'value-entry.ts', type: defineTypes.value, ...commonArgs });
generateEntryFile({ entryFile: 'event-entry.ts', type: 'event', ...commonArgs }); generateEntryFile({ entryFile: 'event-entry.ts', type: defineTypes.event, ...commonArgs });
} }
}; };
@ -154,7 +160,7 @@ const generateEntryFile = function ({ entries, entryFile, type, componentFileAff
const name = makeCamelCase(entry.type); const name = makeCamelCase(entry.type);
importDeclarations.push( importDeclarations.push(
`import ${name} from '${entry.entry[type]}${ `import ${name} from '${entry.entry[type]}${
type === 'component' && !entry.entry[type].includes(componentFileAffix) ? componentFileAffix : '' type === defineTypes.component && !entry.entry[type].includes(componentFileAffix) ? componentFileAffix : ''
}'`, }'`,
); );
list.push(`'${entry.type}': ${name}`); list.push(`'${entry.type}': ${name}`);
@ -165,7 +171,7 @@ const generateEntryFile = function ({ entries, entryFile, type, componentFileAff
let jsString = ''; let jsString = '';
let exportData = `window.magicPreset${capitalToken} = ${exportToken};`; let exportData = `window.magicPreset${capitalToken} = ${exportToken};`;
if (type === 'component') { if (type === defineTypes.component) {
const pList = []; const pList = [];
Object.keys(pluginList).forEach((pluginType) => { Object.keys(pluginList).forEach((pluginType) => {
@ -271,7 +277,7 @@ const isPlugin = function (properties) {
}; };
/** /**
* 1 判断是否组件 * 1 判断是否组件&插件
* 2 判断是组件还是插件 * 2 判断是组件还是插件
* 3 组件插件分开写入 comp-entry.ts * 3 组件插件分开写入 comp-entry.ts
* @param {*} ast * @param {*} ast
@ -393,22 +399,28 @@ const start = function ({ type, componentFileAffix, units, workingDir }) {
// 组件 // 组件
const entry = parseEntry({ ast, package, indexPath }); const entry = parseEntry({ ast, package, indexPath });
entries.push({ type: componentType, entry }); entries.push({ type: componentType, entry });
} else if (result.type === typePlugin) {
// 插件
pluginList[componentType] = package;
} else if (result.type === typeComponentPackage) { } else if (result.type === typeComponentPackage) {
// 组件包 // 组件&插件
result.imports.forEach((i) => { result.imports.forEach((i) => {
const affixReg = new RegExp(`${componentFileAffix}$`); const affixReg = new RegExp(`${componentFileAffix}$`);
if (affixReg.test(i.indexPath)) { if (affixReg.test(i.indexPath)) {
entries.push({ type: i.type, entry: { component: i.indexPath } }); entries.push({ type: i.type, entry: { component: i.indexPath } });
return;
}
const indexCode = fs.readFileSync(i.indexPath, { encoding: 'utf-8', flag: 'r' });
const ast = parse(indexCode);
if (typeAssertion({ ast, indexPath }).type === typePlugin) {
// 插件
pluginList[i.type] = i.indexPath;
} else { } else {
const indexCode = fs.readFileSync(i.indexPath, { encoding: 'utf-8', flag: 'r' }); // 组件
const ast = parse(indexCode);
const entry = parseEntry({ ast, package: `${package} | ${i.name}`, indexPath: i.indexPath }); const entry = parseEntry({ ast, package: `${package} | ${i.name}`, indexPath: i.indexPath });
entries.push({ type: i.type, entry }); entries.push({ type: i.type, entry });
} }
}); });
} else if (result.type === typePlugin) {
// 插件
pluginList[componentType] = package;
} }
}); });