export function parseProps()

in packages/designer/src/builtin-simulator/utils/parse-metadata.ts [140:212]


export function parseProps(component: any): IPublicTypePropConfig[] {
  if (!component) {
    return [];
  }
  const propTypes = component.propTypes || ({} as any);
  const defaultProps = component.defaultProps || ({} as any);
  const result: any = {};
  if (!propTypes) return [];
  Object.keys(propTypes).forEach((key) => {
    const propTypeItem = propTypes[key];
    const defaultValue = defaultProps[key];
    const { lowcodeType } = propTypeItem;
    if (lowcodeType) {
      result[key] = {
        name: key,
        propType: lowcodeType,
      };
      if (defaultValue != null) {
        result[key].defaultValue = defaultValue;
      }
      return;
    }

    let i = primitiveTypes.length;
    while (i-- > 0) {
      const k = primitiveTypes[i];
      if ((LowcodeTypes as any)[k] === propTypeItem) {
        result[key] = {
          name: key,
          propType: k,
        };
        if (defaultValue != null) {
          result[key].defaultValue = defaultValue;
        }
        return;
      }
    }
    result[key] = {
      name: key,
      propType: 'any',
    };
    if (defaultValue != null) {
      result[key].defaultValue = defaultValue;
    }
  });

  Object.keys(defaultProps).forEach((key) => {
    if (result[key]) return;
    const defaultValue = defaultProps[key];
    let type: string = typeof defaultValue;
    if (type === 'boolean') {
      type = 'bool';
    } else if (type === 'function') {
      type = 'func';
    } else if (type === 'object' && Array.isArray(defaultValue)) {
      type = 'array';
    } else if (defaultValue && isValidElement(defaultValue)) {
      type = 'node';
    } else if (defaultValue && isElement(defaultValue)) {
      type = 'element';
    } else if (!BasicTypes.includes(type)) {
      type = 'any';
    }

    result[key] = {
      name: key,
      propType: type || 'any',
      defaultValue,
    };
  });

  return Object.keys(result).map((key) => result[key]);
}