UNPKG

@lcap/builder

Version:
207 lines (206 loc) 8.15 kB
"use strict"; 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;