scripts/mini-program-site/generateComponentIndex.js (94 lines of code) (raw):
const fse = require('fs-extra');
const { FILE_COMMENT } = require('./utils/constants');
/**
* 生成每个组件的index.[tsx|less]入口文件
*/
const generateComponentIndex = ({ theme, codeModules }, indexPath) => {
const demoName = `${theme.enName}Demo`;
const importBlock = codeModules.reduce(
(res, { componentName }) =>
res.concat(`import ${componentName} from './${componentName}';\n`),
`import './index.less';\nimport Taro from '@tarojs/taro';\n`,
);
// if (theme.enName === 'Button') {
// debugger;
// }
const componentsRender = codeModules.reduce(
(res, { componentName, descriptions }, index) =>
res.concat(
`<div className="demo-component">
${renderDesc(descriptions)}
<${componentName} />
</div>\n\n\t\t\t`,
),
'',
);
const contentBlock = `\n\nconst ${demoName} = () => {
return (
<div className="demo-wrapper bui-default-light">
${componentsRender}
</div>
);
};
export default ${demoName};`;
const demoFile = `${FILE_COMMENT}${importBlock}${contentBlock}`;
const lessFile = `@import '~@bifrostui/styles/index.less';\n
.demo-wrapper {
padding: 12px;
}
.demo-component {
padding: 6px 0;
border-bottom: 1px solid rgba(233,235,239,0.5);
&:first-child {
padding: 0 0 6px;
}
&:last-child {
border-bottom: none;
}
}
.demo-description {
margin-bottom: 9px;
}
.heading {
margin-bottom: 6px;
}
.paragraph {
font-size: 15px;
color: #484f58;
margin-bottom: 10px;
&:last-child {
margin-bottom: 0;
}
}
.heading-1 {
font-size: 20px;
font-weight: 700;
}
.heading-2 {
font-size: 18px;
font-weight: 500;
}
.heading-3 {
font-size: 16px;
font-weight: 500;
}
.heading-4 {
font-size: 14px;
font-weight: 400;
}
`;
fse.writeFileSync(`${indexPath}.tsx`, demoFile);
fse.writeFileSync(`${indexPath}.less`, lessFile);
};
const renderDesc = (descriptions) => {
const descStr = (descriptions || []).reduce(
(prev, desc, index) =>
prev.concat(
`${index === 0 ? '' : '\n\t\t\t\t\t'}<div className="${desc.type} ${
desc?.depth ? `${desc.type}-${desc?.depth}` : ''
}">
${desc.value}
</div>`,
),
'',
);
return `<div className="demo-description">
${descStr}
</div>
`;
};
exports.generateComponentIndex = generateComponentIndex;