@lcap/builder
Version:
lcap builder utils
207 lines (206 loc) • 8.15 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.processComponentConfigExtends = void 0;
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const lodash_1 = require("lodash");
const logger_1 = __importDefault(require("../../utils/logger"));
const parse_component_api_1 = __importDefault(require("../../nasl/parse-component-api"));
const story_nasl_block_1 = __importDefault(require("../../nasl/story-nasl-block"));
const utils_1 = require("../../utils");
function hasImg(dir) {
return fs_extra_1.default.existsSync(path_1.default.join(dir, '0.png'));
}
function hasSvg(dir) {
return fs_extra_1.default.existsSync(path_1.default.join(dir, '0.svg'));
}
function getScreenShot(componentDir, assetsPublicPath) {
let screenShot = [];
try {
const screenShotPath = `${componentDir}/screenshots`;
if (hasImg(screenShotPath)) {
screenShot = fs_extra_1.default
.readdirSync(screenShotPath)
.sort((a, b) => parseInt(a, 10) - parseInt(b, 10))
.filter((filename) => filename.indexOf('.DS_Store') === -1);
screenShot = screenShot.map((screen) => {
return `${assetsPublicPath}/screenshots/${screen}`;
});
}
}
catch (e) {
logger_1.default.warn(`找不到 screenShot 文件 ${componentDir}/screenshots`);
}
return screenShot;
}
function getDrawings(componentDir, assetsPublicPath) {
let drawings = [];
try {
const drawingsPath = `${componentDir}/drawings`;
if (hasSvg(drawingsPath)) {
drawings = fs_extra_1.default.readdirSync(drawingsPath)
.sort((a, b) => parseInt(a, 10) - parseInt(b, 10))
.filter((filename) => filename.indexOf('.DS_Store') === -1);
drawings = drawings.map((drawing) => {
return `${assetsPublicPath}/drawings/${drawing}`;
});
}
}
catch (e) {
logger_1.default.warn(`找不到 drawings 文件 ${componentDir}/drawings`);
}
return drawings;
}
function getBlocksByDemo(componentDir, { screenshots, drawings }) {
const dir = path_1.default.join(componentDir, 'demos/blocks');
if (!fs_extra_1.default.existsSync(dir)) {
logger_1.default.warn('未找到 blocks: ', dir);
return [];
}
const files = fs_extra_1.default.readdirSync(dir).filter((p) => p.endsWith('.vue'));
const blocks = [];
files.sort((a, b) => {
const n1 = Number(a.substring('BlocksDemo'.length, a.lastIndexOf('.')));
const n2 = Number(b.substring('BlocksDemo'.length, b.lastIndexOf('.')));
return n1 - n2;
}).forEach((file, index) => {
let content = fs_extra_1.default.readFileSync(path_1.default.join(dir, file), 'utf-8');
const matches = content.match(/<!--.*?-->/);
let title = '';
if (matches && matches.length > 0) {
title = matches[0]
.replace(/<!--/, '')
.replace(/-->/, '')
.trim();
content = content.replace(/<!--.*?-->/, '');
}
const code = content
.split('\n')
.map((s) => s.trim())
.filter((s) => !!s)
.join('\n');
blocks.push({
concept: 'ViewBlockWithImage',
title,
description: '',
code,
screenshot: screenshots[index] || '',
drawing: drawings[index] || '',
});
});
return blocks;
}
function genBlockConfig(componentDir, { screenshots, drawings }, framework) {
let storyFilePath = `${componentDir}/stories/block.stories`;
if (fs_extra_1.default.existsSync(`${storyFilePath}.jsx`)) {
storyFilePath = `${storyFilePath}.jsx`;
}
else if (fs_extra_1.default.existsSync(`${storyFilePath}.tsx`)) {
storyFilePath = `${storyFilePath}.tsx`;
}
else if (fs_extra_1.default.existsSync(`${storyFilePath}.js`)) {
storyFilePath = `${storyFilePath}.js`;
}
else {
return getBlocksByDemo(componentDir, { screenshots, drawings });
}
const code = fs_extra_1.default.readFileSync(storyFilePath);
const blocks = (0, story_nasl_block_1.default)(code.toString(), framework);
return blocks.map(({ name, template }, index) => ({
concept: 'ViewBlockWithImage',
title: name,
description: '',
code: template,
screenshot: screenshots[index] || '',
drawing: drawings[index] || '',
}));
}
function genNaslComponentConfig({ apiPath, rootPath, assetsPublicPath, libInfo, extraConfig = {}, framework = 'react', }) {
const component = Object.assign({}, extraConfig);
try {
const nasl = (0, parse_component_api_1.default)(fs_extra_1.default.readFileSync(apiPath, 'utf8'), framework);
Object.assign(component, nasl[0]);
}
catch (e) {
logger_1.default.error(`解析 ${apiPath} 失败`);
throw e;
}
if (component.apiPath && !component.show) {
delete component.symbol;
delete component.apiPath;
return Object.assign(Object.assign({}, component), { blocks: [] });
}
const componentDir = path_1.default.resolve(apiPath, '../');
const assetsPath = [assetsPublicPath, libInfo, componentDir.substring(rootPath.length + 1)].join('/');
const screenshots = getScreenShot(componentDir, assetsPath);
const drawings = getDrawings(componentDir, assetsPath);
try {
const blocks = genBlockConfig(componentDir, { screenshots, drawings }, framework);
Object.assign(component, { blocks });
}
catch (e) {
logger_1.default.error(`${component.name} 处理 block 异常`);
logger_1.default.error(e);
throw e;
}
return component;
}
exports.default = genNaslComponentConfig;
function processComponentConfigExtends(components, lcapUIComponents = []) {
components.map((c) => {
const arr = [c];
if (Array.isArray(c.children)) {
arr.push(...c.children);
}
return arr;
}).flat().filter((c) => Array.isArray(c.extends) && c.extends.length > 0).forEach((component) => {
const extendList = (component.extends || []).map((exd) => {
if (typeof exd === 'string') {
return {
name: exd,
};
}
return exd;
});
extendList.forEach((exd) => {
const { name, excludes = [] } = exd;
if (!name) {
return;
}
const exdComp = (0, utils_1.getComponentConfigByName)(name, [...components, ...lcapUIComponents]);
if (!exdComp || (exdComp.extends && exdComp.extends.length > 0)) {
logger_1.default.warn(`找不到 ${component.name} 继承的组件 ${name} 的配置`);
return;
}
[
'methods',
'slots',
'readableProps',
'props',
'events',
].forEach((key) => {
if (!component[key]) {
component[key] = [];
}
(exdComp[key] || []).forEach((it) => {
const i = component[key].findIndex((c) => c.name === it.name);
let attrName = it.name;
if (key === 'slots') {
attrName = `slot${(0, lodash_1.upperFirst)(attrName)}`;
}
else if (key === 'events') {
attrName = `on${(0, lodash_1.upperFirst)(attrName)}`;
}
if (i !== -1 || excludes.includes(attrName)) {
return;
}
component[key].push(it);
});
});
});
});
}
exports.processComponentConfigExtends = processComponentConfigExtends;