@wgoo/cli
Version:
Wgoo Cli 是一个 React 组件库构建工具,通过 Wgoo Cli 可以快速搭建一套功能完备的 React 组件库。
102 lines (84 loc) • 2.2 kB
JavaScript
const { join } = require('path');
const { existsSync, readdirSync } = require('fs-extra');
const { SRC_DIR, SITE_MODILE_SHARED_FILE } = require('../common/constant');
const {
pascalize,
removeExt,
decamelize,
getWgooConfig,
smartOutputFile,
normalizePath,
} = require('../common');
function genInstall() {
return `import packageEntry from './package-entry';
import './package-style';
`;
}
function genImports(demos) {
return demos
.map(
(item) =>
`import ${item.name} from '${removeExt(normalizePath(item.path))}';`
)
.join('\n');
}
function genExports(demos) {
return `export const demos = {\n ${demos
.map((item) => item.name)
.join(',\n ')}\n};`;
}
function getSetName(demos) {
return demos
.map((item) => ` ${item.name}.name = 'demo-${item.component}';`)
.join('\n');
}
function genConfig(demos) {
const wgooConfig = getWgooConfig();
const demoNames = demos.map((item) => decamelize(item.name));
function demoFilter(nav) {
return nav.filter((group) => {
group.items = group.items.filter((item) =>
demoNames.includes(item.path)
);
return group.items.length;
});
}
const { nav, locales } = wgooConfig.site;
if (locales) {
Object.keys(locales).forEach((lang) => {
if (locales[lang].nav) {
locales[lang].nav = demoFilter(locales[lang].nav);
}
});
} else if (nav) {
wgooConfig.site.nav = demoFilter(nav);
}
return `export const config = ${JSON.stringify(wgooConfig, null, 2)}`;
}
function genCode(components) {
const demos = components
.map((component) => ({
component,
name: pascalize(component),
path: join(SRC_DIR, component, 'demo/index'),
}))
.filter((item) => {
const path = item.path + '.jsx';
return existsSync(path);
});
return `${genInstall()}
${genImports(demos)}
export { packageEntry };
try {
${getSetName(demos)}
} catch(e) {}
${genExports(demos)}
${genConfig(demos)}
`;
}
function genSiteMobileShared() {
const dirs = readdirSync(SRC_DIR);
const code = genCode(dirs);
smartOutputFile(SITE_MODILE_SHARED_FILE, code);
}
module.exports = { genSiteMobileShared };