import path from 'path' import merge from 'lodash/merge' import pick from 'lodash/pick' import { ConeComponentConfig, ConeComponentScaffoldProps, Obj, ComponentFileProcessor, } from '../type' import { CONE_CONFIG_FILE_NAME } from '../project' import { pathExists, outputJsonWithSpaces } from '../fs' import log from '../log' import { loadJson } from '../json' import { formatJson } from '../prettier' // 确保 json key 的更新顺序 // 值要填满, 免得 ejs render 报错 const defaultConeComponentConfigScaffold: Required = { gitGroup: '', packageName: '', desc: '', version: '0.1.0', port: '7700', storybookPort: '7800', mobile: false, oneCode: false, lowcode: true, templateProcessorPackageName: '', } export async function checkIsConeComponent({ dir = process.cwd(), throwWhenNotValid = false, }: { dir?: string throwWhenNotValid?: boolean } = {}) { const exists = await pathExists(path.join(dir, CONE_CONFIG_FILE_NAME)) if (!exists && throwWhenNotValid) { const msg = `找不到 ${CONE_CONFIG_FILE_NAME}, 请确认目录 ${dir} 是合法的 cone 组件` log.error('cone', msg) process.exit(-1) } return exists } export async function loadConeComponentConfig( dir: string, ): Promise { return loadJson(dir, CONE_CONFIG_FILE_NAME) as unknown as ConeComponentConfig } export async function writeConeComponentConfig( dir: string, coneConfig: ConeComponentConfig, ): Promise { await outputJsonWithSpaces(path.join(dir, CONE_CONFIG_FILE_NAME), coneConfig) } export async function getComponentScaffoldConfig( dir: string, ): Promise { const coneConfig = await loadConeComponentConfig(dir) return merge( {}, defaultConeComponentConfigScaffold, coneConfig.scaffold || {}, ) } export const updateConeComponentConfig: ComponentFileProcessor = async ({ filepath, obj, props, }) => { const { mobile, oneCode, lowcode } = props const coneConfig = merge( {}, { scaffold: defaultConeComponentConfigScaffold }, obj, { // 只存已知的 key, 防止脏数据污染 scaffold: pick(props, Object.keys(defaultConeComponentConfigScaffold)), }, ) return coneConfig }