UNPKG

@alilc/lowcode-editor-skeleton

Version:

alibaba lowcode editor skeleton

258 lines (256 loc) 7.68 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports["default"] = _default; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); function propConfigToFieldConfig(propConfig) { var name = propConfig.name, description = propConfig.description; var title = { label: { type: 'i18n', 'en-US': name, 'zh-CN': (description === null || description === void 0 ? void 0 : description.slice(0, 10)) || name }, tip: description ? name + " | " + description : undefined }; return (0, _extends2["default"])({ title: title }, propConfig, { // TODO 这边直接用propConfig,将setter丢在propconfig里,需要确认是否在PropConfig扩展还是换实现 setter: propConfig.setter ? propConfig.setter : propTypeToSetter(propConfig.propType) }); } function propTypeToSetter(propType) { var typeName; var isRequired = false; if (typeof propType === 'string') { typeName = propType; } else if (typeof propType === 'object') { typeName = propType.type; isRequired = propType.isRequired; } else { typeName = 'string'; } // TODO: use mixinSetter wrapper switch (typeName) { case 'string': return { componentName: 'StringSetter', isRequired: isRequired, initialValue: '' }; case 'number': return { componentName: 'NumberSetter', isRequired: isRequired, initialValue: 0 }; case 'bool': return { componentName: 'BoolSetter', isRequired: isRequired, initialValue: false }; case 'oneOf': var dataSource = (propType.value || []).map(function (value, index) { var t = typeof value; return { label: t === 'string' || t === 'number' || t === 'boolean' ? String(value) : "value " + index, value: value }; }); var componentName = dataSource.length >= 4 ? 'SelectSetter' : 'RadioGroupSetter'; return { componentName: componentName, props: { dataSource: dataSource, options: dataSource }, isRequired: isRequired, initialValue: dataSource[0] ? dataSource[0].value : null }; case 'element': case 'node': // TODO: use Mixin return { // slotSetter componentName: 'SlotSetter', props: { mode: typeName }, isRequired: isRequired, initialValue: { type: 'JSSlot', value: [] } }; case 'shape': case 'exact': var items = (propType.value || []).map(function (item) { return propConfigToFieldConfig(item); }); return { componentName: 'ObjectSetter', props: { config: { items: items, extraSetter: typeName === 'shape' ? propTypeToSetter('any') : null } }, isRequired: isRequired, initialValue: function initialValue(field) { var data = {}; items.forEach(function (item) { var initial = item.defaultValue; if (initial == null && item.setter && typeof item.setter === 'object') { initial = item.setter.initialValue; } data[item.name] = initial ? typeof initial === 'function' ? initial(field) : initial : null; }); return data; } }; case 'object': case 'objectOf': return { componentName: 'ObjectSetter', props: { config: { extraSetter: propTypeToSetter(typeName === 'objectOf' ? propType.value : 'any') } }, isRequired: isRequired, initialValue: {} }; case 'array': case 'arrayOf': return { componentName: 'ArraySetter', props: { itemSetter: propTypeToSetter(typeName === 'arrayOf' ? propType.value : 'any') }, isRequired: isRequired, initialValue: [] }; case 'func': return { componentName: 'FunctionSetter', isRequired: isRequired }; case 'color': return { componentName: 'ColorSetter', isRequired: isRequired }; case 'oneOfType': return { componentName: 'MixedSetter', props: { // TODO: setters: propType.value.map(function (item) { return propTypeToSetter(item); }) }, isRequired: isRequired }; default: // do nothing } return { componentName: 'MixedSetter', isRequired: isRequired, props: {} }; } var EVENT_RE = /^on|after|before[A-Z][\w]*$/; function _default(metadata) { var _metadata$configure = metadata.configure, configure = _metadata$configure === void 0 ? {} : _metadata$configure; // TODO types后续补充 var extendsProps = null; if (configure.props) { if (Array.isArray(configure.props)) { return metadata; } var _configure$props = configure.props, isExtends = _configure$props.isExtends, _configure$props$over = _configure$props.override, override = _configure$props$over === void 0 ? [] : _configure$props$over; // 不开启继承时,直接返回configure配置 if (!isExtends) { return (0, _extends2["default"])({}, metadata, { configure: (0, _extends2["default"])({}, configure, { props: [].concat(override) }) }); } extendsProps = {}; // 开启继承后,缓存重写内容的配置 override.forEach(function (prop) { extendsProps[prop.name] = prop; }); } if (!metadata.props) { return (0, _extends2["default"])({}, metadata, { configure: (0, _extends2["default"])({}, configure, { props: [] }) }); } var _configure$component = configure.component, component = _configure$component === void 0 ? {} : _configure$component, _configure$supports = configure.supports, supports = _configure$supports === void 0 ? {} : _configure$supports; var supportedEvents = supports.events ? null : []; var props = []; metadata.props.forEach(function (prop) { var _prop = prop, name = _prop.name, propType = _prop.propType, description = _prop.description; if (name === 'children' && (component.isContainer || propType === 'node' || propType === 'element' || propType === 'any')) { if (component.isContainer !== false) { component.isContainer = true; props.push(propConfigToFieldConfig(prop)); return; } } if (EVENT_RE.test(name) && (propType === 'func' || propType === 'any')) { if (supportedEvents) { supportedEvents.push({ name: name, description: description }); supports.events = supportedEvents; } return; } if (name === 'className' && (propType === 'string' || propType === 'any')) { if (supports.className == null) { supports.className = true; } return; } if (name === 'style' && (propType === 'object' || propType === 'any')) { if (supports.style == null) { supports.style = true; } return; } // 存在覆盖配置时 if (extendsProps) { if (name in extendsProps) { prop = extendsProps[name]; } } props.push(propConfigToFieldConfig(prop)); }); return (0, _extends2["default"])({}, metadata, { configure: (0, _extends2["default"])({}, configure, { props: props, supports: supports, component: component }) }); }