{"version":3,"sources":["jsdelivr-header.js","/npm/@chamn/model@0.10.4/src/types/base.ts","/npm/@chamn/model@0.10.4/src/const/schema.ts","/npm/@chamn/model@0.10.4/src/types/node.ts","/npm/@chamn/model@0.10.4/src/types/material.ts","/npm/@chamn/model@0.10.4/src/util/dataCheck.ts","/npm/@chamn/model@0.10.4/src/types/rootNode.ts","/npm/@chamn/model@0.10.4/src/util/modelEmitter.ts","/npm/@chamn/model@0.10.4/src/Page/RootNode/Node/slot.ts","/npm/@chamn/model@0.10.4/src/Page/RootNode/Node/prop.ts","/npm/@chamn/model@0.10.4/src/Page/RootNode/Node/index.ts","/npm/@chamn/model@0.10.4/src/Page/RootNode/index.ts","/npm/@chamn/model@0.10.4/src/util/index.ts","/npm/@chamn/model@0.10.4/src/Material/index.ts","/npm/@chamn/model@0.10.4/src/types/page.ts","/npm/@chamn/model@0.10.4/src/Page/index.ts","/npm/@chamn/model@0.10.4/src/const/eventList.ts"],"names":[],"mappings":"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","file":"/npm/@chamn/model@0.10.4/dist/index.cjs.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@chamn/model@0.10.4/dist/index.cjs.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { array, boolean, object, optional, string } from 'superstruct';\nimport { htmlTagNames } from 'html-tag-names';\n\nexport const HTMl_TAGS = htmlTagNames;\n\nexport enum SetterTypeEnum {\n  STRING_SETTER = 'StringSetter',\n  BOOLEAN_SETTER = 'BooleanSetter',\n  JSON_SETTER = 'JSONSetter',\n  SELECT_SETTER = 'SelectSetter',\n  NUMBER_SETTER = 'NumberSetter',\n  EXPRESSION_SETTER = 'ExpressionSetter',\n  FUNCTION_SETTER = 'FunctionSetter',\n  COMPONENT_SETTER = 'ComponentSetter',\n  TEXT_AREA_SETTER = 'TextAreaSetter',\n  COLOR_SETTER = 'ColorSetter',\n  ANTD_COLOR_SETTER = 'AntDColorSetter',\n  RADIO_CROUP_SETTER = 'RadioGroupSetter',\n  ACTION_FLOW_SETTER = 'ActionFlowSetter',\n  EMPTY_VALUE_SETTER = 'EmptyValueSetter',\n}\n\nexport type SetterBasicType = string;\n\nexport enum ComplexSetterTypeEnum {\n  SHAPE_SETTER = 'ShapeSetter',\n  ARRAY_SETTER = 'ArraySetter',\n}\n\nexport type AssetItem = {\n  id?: string;\n  type?: 'CSS' | 'JS';\n  src: string;\n};\n\nexport type AssetPackage = {\n  id?: string;\n  package: string;\n  // window.[globalName]\n  globalName: string;\n  resources: AssetItem[];\n};\n\nexport type LibMetaType = {\n  // unique\n  package: string;\n  name: string;\n  version: string;\n  exportName?: string;\n  destructuring?: boolean;\n  // some library need to import css file\n  cssPaths?: string[];\n  subName?: string;\n  // 库的特殊路径\n  main?: string;\n};\n\nexport const LibMetaTypeDescribe = object({\n  package: string(),\n  version: string(),\n  name: string(),\n  exportName: optional(string()),\n  destructuring: optional(boolean()),\n  subName: optional(string()),\n  main: optional(string()),\n  cssPaths: optional(array(string())),\n});\n\nexport const ThirdLibTypeDescribe = array(LibMetaTypeDescribe);\n\nexport type MaterialAssetPackage = {\n  name: string;\n  material: AssetPackage;\n  component: AssetPackage;\n  version?: string;\n};\n\nexport type CSSValue = {\n  /**  'normal' | 'hover' | 'active' | 'focus' etc */\n  state: string;\n  media?: {\n    type: 'max-width';\n    value: string;\n    text?: string;\n  }[];\n  // css 样式字符串\n  text?: string;\n};\n\nexport type CSSType = {\n  class?: string;\n  value: CSSValue[];\n};\n\n/** 基础的组件列表 */\nexport const BaseComponentTagList = [\n  'CBlock',\n  'CContainer',\n  'CImage',\n  'CCanvas',\n  'CVideo',\n  'CAudio',\n  'CText',\n  'CNativeTag',\n];\n\nexport type DropPosType = {\n  direction: 'vertical' | 'horizontal';\n  pos: 'before' | 'after' | 'current';\n};\n\nexport type DesignerInjectProps = {\n  $SET_DOM?: (dom: HTMLElement) => void;\n};\n\n/** 存储开发过程中的中间态配置，不影响渲染 */\nexport const DEV_CONFIG_KEY = '__DEV_CONFIG__';\n","export enum CNodePropsTypeEnum {\n  SLOT = 'SLOT',\n  FUNCTION = 'FUNCTION',\n  EXPRESSION = 'EXPRESSION',\n  ACTION = 'ACTION',\n  EVENT = 'EVENT',\n}\n\nexport enum ExportTypeEnum {\n  DESIGN = 'design',\n  SAVE = 'save',\n}\n\nexport type ExportType = ExportTypeEnum | `${ExportTypeEnum}`;\n\nexport enum SlotRenderType {\n  FUNC = 'FUNC',\n  COMP = 'COMP',\n}\n","import {\n  string,\n  number,\n  boolean,\n  any,\n  union,\n  object,\n  literal,\n  optional,\n  record,\n  dynamic,\n  array,\n  define,\n  validate,\n  enums,\n} from 'superstruct';\nimport { CNodePropsTypeEnum, SlotRenderType } from '../const/schema';\nimport { isPlainObject } from '../util/lodash';\nimport { CSSType, DEV_CONFIG_KEY } from './base';\nimport type { CPage } from '../Page';\nimport type { CNode } from '../Page/RootNode/Node';\n\nexport type NormalPropType = string | boolean | number | Record<string, any> | undefined | null;\n\n// get enum value list\ntype IValue = `${SlotRenderType}`;\n\nexport type RenderPropType = {\n  type: CNodePropsTypeEnum.SLOT | `${CNodePropsTypeEnum.SLOT}`;\n  params?: string[];\n  renderType: SlotRenderType | IValue;\n  value: CNodeDataType | CNodeDataType[];\n};\n\nexport type JSExpressionPropType = {\n  type: CNodePropsTypeEnum.EXPRESSION | `${CNodePropsTypeEnum.EXPRESSION}`;\n  value: string;\n};\n\nexport type TBaseFunction = {\n  /** TODO: 编辑器使，存储函数的源码，用于编辑器使用  */\n  sourceCode?: string;\n  /** 编辑器使用 */\n  tsType?: string;\n  /** 可直接在浏览器运行的代码  */\n  value: string;\n  /** 函数名称 */\n  name?: string;\n};\n\nexport type FunctionPropType = {\n  type: CNodePropsTypeEnum.FUNCTION | `${CNodePropsTypeEnum.FUNCTION}`;\n} & TBaseFunction;\n\nexport enum LogicType {\n  JUMP_LINK = 'JUMP_LINK',\n  RUN_CODE = 'RUN_CODE',\n  REQUEST_API = 'REQUEST_API',\n  /** 调用节点方法 */\n  CALL_NODE_METHOD = 'CALL_NODE_METHOD',\n  // 赋予值操作\n  ASSIGN_VALUE = 'ASSIGN_VALUE',\n}\n\nexport type TDynamicValue = string | number | JSExpressionPropType | FunctionPropType;\n\nexport type TBaseActionNode = {\n  id: string;\n  next?: string | number;\n};\n/** 存储开发中的一些临时状态 */\nexport type TActionFlowDevConfig = {\n  pageModel: CPage;\n  currentNode: CNode;\n  defaultSetterMap: Record<\n    string,\n    {\n      name: string;\n      setter: string;\n    }\n  >;\n};\nexport type TLogicJumpLinkItem = {\n  type: LogicType.JUMP_LINK | `${LogicType.JUMP_LINK}`;\n  link: TDynamicValue;\n  [DEV_CONFIG_KEY]?: TActionFlowDevConfig;\n} & TBaseActionNode;\n\n/** 🌧️函数类型 */\nexport type TLogicRunCodeItem = {\n  /** 函数最好有返回值 */\n  type: LogicType.RUN_CODE | `${LogicType.RUN_CODE}`;\n  [DEV_CONFIG_KEY]?: TActionFlowDevConfig;\n} & TBaseFunction &\n  TBaseActionNode;\n\nexport type TLogicCallNodeMethodItem = {\n  type: LogicType.CALL_NODE_METHOD | `${LogicType.CALL_NODE_METHOD}`;\n  nodeId: string;\n  methodName: string;\n  args?: TDynamicValue[];\n  /** 返回值的变量名 */\n  returnVarName?: string;\n  [DEV_CONFIG_KEY]?: TActionFlowDevConfig;\n} & TBaseActionNode;\n\nexport type TLogicRequestAPIItem = {\n  type: LogicType.REQUEST_API | `${LogicType.REQUEST_API}`;\n  /** 直接获取具体的 API path, 完整的 host, 特殊场景使用，一般使用 apiId, 可以控制环境切换 */\n  apiPath: TDynamicValue;\n  /** 默认 get */\n  method?: 'POST' | 'GET' | 'PUT' | 'PATCH' | 'DELETE';\n  query?: Record<string, TDynamicValue>;\n  body?: Record<string, TDynamicValue>;\n  header?: Record<string, TDynamicValue>;\n  // 请求响应成功之后的执行代码， 获取到返回值，可以继续执行多个操作\n  afterSuccessResponse?: TLogicItemHandlerFlow;\n  // 请求响应失败之后的执行代码， 获取到返回值，可以继续执行多个操作\n  afterFailedResponse?: TLogicItemHandlerFlow;\n  /** 响应变量名 */\n  responseVarName?: string;\n  /** 额外的数据 */\n  extra?: Record<any, any>;\n  [DEV_CONFIG_KEY]?: TActionFlowDevConfig;\n} & TBaseActionNode;\n\nexport enum AssignValueType {\n  /** 组件内的局部变量，没有响应性， 只在当前的上下文中有效 */\n  MEMORY = 'MEMORY',\n  STATE = 'STATE',\n}\n\nexport type TAssignValueType = `${AssignValueType}`;\n\nexport type TargetValueNameObject = {\n  nodeId: string;\n  keyPath: string;\n};\n/** 赋值操作  */\nexport type TLogicAssignValueItem = {\n  type: LogicType.ASSIGN_VALUE | `${LogicType.ASSIGN_VALUE}`;\n  valueType: AssignValueType | TAssignValueType;\n  currentValue: TDynamicValue;\n  /** 如果是 STATE 类型需要 nodeId, 否则只用填 string */\n  targetValueName?: TargetValueNameObject | string;\n  [DEV_CONFIG_KEY]?: TActionFlowDevConfig;\n} & TBaseActionNode;\n\nexport type TLogicItemHandlerFlow = (\n  | TLogicJumpLinkItem\n  | TLogicRunCodeItem\n  | TLogicRequestAPIItem\n  | TLogicCallNodeMethodItem\n  | TLogicAssignValueItem\n)[];\n\nexport type TActionLogicItem = {\n  type: CNodePropsTypeEnum.ACTION | `${CNodePropsTypeEnum.ACTION}`;\n  handler: TLogicItemHandlerFlow;\n  /** 调用方传入的参数列表 */\n  params?: string[];\n};\n\nexport type SpecialProp = RenderPropType | JSExpressionPropType | FunctionPropType | TActionLogicItem;\n\nexport type CPropDataType = NormalPropType | SpecialProp | CPropObjDataType;\n\nexport type CPropObjDataType = {\n  [key: string]: CPropDataType | CPropDataType[] | Record<string, CPropDataType>;\n};\n\nconst normalObj = () =>\n  define('normalObj', (value: any) => {\n    if (!isPlainObject(value)) {\n      return false;\n    }\n    if ([CNodePropsTypeEnum.SLOT, CNodePropsTypeEnum.EXPRESSION, CNodePropsTypeEnum.FUNCTION].includes(value?.type)) {\n      return false;\n    }\n    validate(value, record(string(), PropsDataStructDescribe));\n    return true;\n  });\n\nexport const PropsDataStructDescribe: any = union([\n  string(),\n  number(),\n  boolean(),\n  object({\n    type: literal(CNodePropsTypeEnum.SLOT),\n    renderType: enums([SlotRenderType.FUNC, SlotRenderType.COMP]),\n    // if renderType is Func， params will be useful\n    params: optional(array(string())),\n    // here can't use PropsDataStructDescribe, it will  caused  \"Maximum call stack size exceeded\" error\n    value: dynamic(() => {\n      return union([CNodeDataStructDescribe, array(CNodeDataStructDescribe)]);\n    }),\n  }),\n  object({\n    type: literal(CNodePropsTypeEnum.EXPRESSION),\n    value: string(),\n  }),\n  object({\n    type: literal(CNodePropsTypeEnum.FUNCTION),\n    value: string(),\n  }),\n  object({\n    type: literal(CNodePropsTypeEnum.ACTION),\n    /** 暂时不做规则强检验 */\n    handler: any(),\n  }),\n  normalObj(),\n  array(\n    dynamic(() => {\n      return PropsDataStructDescribe;\n    })\n  ),\n]);\n\n// 开发模式使用的 key,导出为生产模式时，需要移除\nexport const DevKey = ['configure'];\n\nexport type ClassNameType = {\n  name: string;\n  status?: JSExpressionPropType;\n};\n\n/** 支持注入到运行时组件的引擎内置变量名列表 */\nexport enum ENGEnvEnum {\n  COMPONENTS = 'COMPONENTS',\n}\n\nexport type CNodeDataType<ExtraT = any> = {\n  id?: string;\n  title?: string;\n  componentName: string;\n  /** 节点类型 */\n  type?: 'dynamic' | 'normal';\n  /** 所有的 props 的 value 需要支持表达式 $$context */\n  props?: CPropObjDataType;\n  state?: Record<string, any>;\n  /** 当前节点的事件处理逻辑，会被压缩为 prop 传入 */\n  eventListener?: {\n    name: string;\n    /** 处理程序 */\n    func: TActionLogicItem;\n  }[];\n  nodeName?: string;\n  children?: (string | CNodeDataType)[];\n  /**\n   * only used in dev mode, if you are run in prod, this key will be undefined\n   *\n   * @type {Record<any, any>}\n   */\n  configure?: {\n    /** 由于一个 prop 可能会有多个设置器，这里用来存储当前使用的那个设置器 */\n    propsSetter?: Record<\n      string,\n      {\n        name: string;\n        setter: string;\n      }\n    >;\n    advanceSetter?: Record<\n      string,\n      {\n        name: string;\n        setter: string;\n      }\n    >;\n    /** 开发模式下中的临时状态存储 */\n    devState?: {\n      condition?: boolean | JSExpressionPropType;\n      props?: CPropObjDataType;\n    };\n    /** 当前节点是否时容器节点 */\n    isContainer?: boolean;\n  };\n  classNames?: ClassNameType[];\n  css?: CSSType;\n  /** css 属性有顺序 */\n  style?: {\n    property: string;\n    value: JSExpressionPropType | string;\n  }[];\n  // 组件引用的唯一id\n  refId?: string;\n  // 组件上写的自定义方法, 一般不会使用\n  methods?: FunctionPropType[];\n  loop?: {\n    open: boolean;\n    data: any[] | JSExpressionPropType;\n    forName?: string;\n    forIndex?: string;\n    key?: JSExpressionPropType | string;\n    name?: string;\n  };\n  /** 需要注入运行时组件的环境变量列表，可以在组件内部通过 props 获取 */\n  injectEnvList?: (ENGEnvEnum | `${ENGEnvEnum}`)[];\n  // 是否渲染\n  condition?: boolean | JSExpressionPropType;\n  extra?: ExtraT;\n};\n\nconst JSExpressionDescribe = object({\n  type: literal(CNodePropsTypeEnum.EXPRESSION),\n  value: string(),\n});\n\nexport const CNodeDataStructDescribe: any = object({\n  id: optional(string()),\n  title: optional(string()),\n  componentName: string(),\n  props: optional(record(string(), PropsDataStructDescribe)),\n  nodeName: optional(string()),\n  state: optional(record(string(), any())),\n  children: dynamic(() => {\n    return optional(array(union([string(), CNodeDataStructDescribe])));\n  }),\n  eventListener: optional(array(any())),\n  configure: optional(any()),\n  css: optional(any()),\n  style: optional(any()),\n  classNames: optional(array(any())),\n  refId: optional(string()),\n  extra: optional(record(any(), any())),\n  condition: optional(union([boolean(), JSExpressionDescribe])),\n  loop: optional(\n    object({\n      open: boolean(),\n      data: union([array(any()), JSExpressionDescribe]),\n      args: optional(array(string())),\n      forName: optional(string()),\n      forIndex: optional(string()),\n      key: optional(any()),\n      name: optional(string()),\n    })\n  ),\n  injectEnvList: optional(array(any())),\n  methods: optional(array(any())),\n});\n","import { isPlainObject } from 'lodash-es';\nimport React, { ReactInstance } from 'react';\nimport {\n  object,\n  string,\n  optional,\n  boolean,\n  enums,\n  literal,\n  any,\n  array,\n  func,\n  union,\n  number,\n  omit,\n  record,\n  dynamic,\n  assign,\n} from 'superstruct';\nimport {\n  ComplexSetterTypeEnum,\n  DropPosType,\n  LibMetaType,\n  LibMetaTypeDescribe,\n  SetterBasicType,\n  SetterTypeEnum,\n} from './base';\nimport { CNodeDataStructDescribe, CNodeDataType } from './node';\nimport type { CNode } from '../Page/RootNode/Node';\nimport type { CRootNode } from '../Page/RootNode';\n\nexport enum BaseDataType {\n  STRING = 'string',\n  NUMBER = 'number',\n  BOOLEAN = 'boolean',\n  OBJECT = 'object',\n  ARRAY = 'array',\n}\n\nexport enum AdvanceDataType {\n  SHAPE = 'shape',\n  ENUMS = 'enums',\n  UNION = 'union',\n}\n\nexport enum SpecialDataType {\n  COMPONENT = 'component',\n  EXPRESSION = 'expression',\n  FUNCTION = 'function',\n}\n\nexport type MTitle =\n  | string\n  | {\n      label: string;\n      tip?: string;\n    };\n\nexport const getMTitle = (title: MTitle) => {\n  if (isPlainObject(title)) {\n    return (title as any).label;\n  } else {\n    return title;\n  }\n};\n\nexport const getMTitleTip = (title: MTitle) => {\n  if (isPlainObject(title)) {\n    return (title as any).tip;\n  } else {\n    return '';\n  }\n};\n\nexport const MTitleDescribe = union([\n  string(),\n  object({\n    label: string(),\n    tip: optional(string()),\n  }),\n]);\n\nexport type ShapeDataType = {\n  type: AdvanceDataType.SHAPE | `${AdvanceDataType.SHAPE}`;\n  value: {\n    name: string;\n    title: MTitle;\n    valueType: PropsValueType;\n  }[];\n};\n\nexport const ShapeDataTypeDescribe = object({\n  type: literal(AdvanceDataType.SHAPE),\n  value: array(\n    object({\n      name: string(),\n      title: MTitleDescribe,\n      valueType: dynamic(() => {\n        return PropsValueTypeDescribe;\n      }),\n    })\n  ),\n});\n\nexport type EnumDataType = {\n  type: AdvanceDataType.ENUMS | `${AdvanceDataType.ENUMS}`;\n  value: string[];\n};\n\nexport const EnumDataTypeDescribe = object({\n  type: literal(AdvanceDataType.ENUMS),\n  value: array(string()),\n});\n\nexport type ArrayDataType = {\n  type: BaseDataType.ARRAY | `${BaseDataType.ARRAY}`;\n  value: PropsValueType;\n};\n\nexport const ArrayDataTypeDescribe = object({\n  type: literal(BaseDataType.ARRAY),\n  value: dynamic(() => {\n    return PropsValueTypeDescribe;\n  }),\n});\n\nexport type UnionDataType = {\n  type: AdvanceDataType.UNION | `${AdvanceDataType.UNION}`;\n  value: PropsValueType[];\n};\n\nexport const UnionDataTypeDescribe = object({\n  type: literal(BaseDataType.ARRAY),\n  value: dynamic(() => {\n    return array(PropsValueTypeDescribe);\n  }),\n});\n\nexport type PropsValueType =\n  | BaseDataType\n  | `${BaseDataType}`\n  | SpecialDataType\n  | `${SpecialDataType}`\n  | ShapeDataType\n  | EnumDataType\n  | ArrayDataType\n  | UnionDataType;\n\nexport const PropsValueTypeDescribe: any = union([\n  enums([BaseDataType.ARRAY, BaseDataType.BOOLEAN, BaseDataType.NUMBER, BaseDataType.OBJECT, BaseDataType.STRING]),\n  enums([SpecialDataType.COMPONENT, SpecialDataType.EXPRESSION, SpecialDataType.FUNCTION]),\n  ShapeDataTypeDescribe,\n  EnumDataTypeDescribe,\n  UnionDataTypeDescribe,\n]);\n\nexport type SetterType<T extends SetterBasicType = ''> =\n  | SetterTypeEnum\n  | `${SetterTypeEnum}`\n  | ComplexSetterTypeEnum\n  | `${ComplexSetterTypeEnum}`\n  | SetterObjType<T>\n  | T\n  | `${T}`;\n\nexport type BasicSetterObjType<T extends SetterBasicType = ''> = {\n  componentName: SetterTypeEnum | `${SetterTypeEnum}` | T | `${T}`;\n  props?: Record<any, any>;\n  /** 被设置属性的初始值 */\n  initialValue?: any;\n  /** props reference CSetterProps<T> from engine */\n  component?: (props: any) => React.ReactNode;\n  /** 是否隐藏前面的 label */\n  hiddenLabel?: boolean;\n  labelWidth?: string;\n  labelAlign?: 'start' | 'center' | 'end';\n};\n\nexport type ShapeSetterObjType<T extends SetterBasicType = ''> = {\n  componentName: ComplexSetterTypeEnum.SHAPE_SETTER | `${ComplexSetterTypeEnum.SHAPE_SETTER}` | T | `${T}`;\n  props?: {\n    elements: MaterialPropType<T>[];\n    /** 是否可以收缩，默认： true  */\n    collapse?:\n      | boolean\n      | {\n          open?: boolean;\n        };\n  } & {};\n  initialValue: any;\n  /** props reference CSetterProps<T> from engine */\n  component?: (props: any) => React.ReactNode;\n  hiddenLabel?: boolean;\n  labelWidth?: string;\n  labelAlign?: 'start' | 'center' | 'end';\n};\n\nexport type ArraySetterObjType<T extends SetterBasicType = ''> = {\n  componentName: ComplexSetterTypeEnum.ARRAY_SETTER | `${ComplexSetterTypeEnum.ARRAY_SETTER}` | T | `${T}`;\n  props?: {\n    collapse?:\n      | boolean\n      | {\n          open?: boolean;\n        };\n    item: {\n      setters: SetterType<T>[];\n      initialValue: any;\n    };\n    itemLabelPrefix?: string;\n    sortLabelKey?: any;\n  };\n  initialValue: any;\n  /** props reference CSetterProps<T> from engine */\n  component?: (props: any) => React.ReactNode;\n  hiddenLabel?: boolean;\n  labelWidth?: string;\n  labelAlign?: 'start' | 'center' | 'end';\n};\n\nexport type SetterObjType<T extends SetterBasicType = ''> =\n  | BasicSetterObjType<T>\n  | ShapeSetterObjType<T>\n  | ArraySetterObjType<T>;\n\nexport const SetterTypeDescribe = union([\n  string(),\n  object({\n    componentName: string(),\n    props: optional(any()),\n    /** 用于标记当前数据的初始值，如添加一个数组元素可以使用该值填充 */\n    initialValue: optional(any()),\n    component: optional(any()),\n    hiddenLabel: optional(boolean()),\n  }),\n]);\n\nexport type MaterialPropType<CustomSetter extends SetterBasicType = ''> = {\n  name: string;\n  title: MTitle;\n  valueType: PropsValueType;\n  description?: string;\n  defaultValue?: any;\n  setters?: SetterType<CustomSetter>[];\n  condition?: (state: any) => boolean;\n};\n\nexport const MaterialPropDescribe = object({\n  name: string(),\n  title: MTitleDescribe,\n  // 描述 name 对应值的类型\n  valueType: PropsValueTypeDescribe,\n  description: optional(string()),\n  defaultValue: any(),\n  //用于产生 valueType 类型的值\n  setters: optional(array(SetterTypeDescribe)),\n  condition: optional(func()),\n});\n\nexport type ActionType = string | ((node: CNode | CRootNode, context: any) => React.ReactNode);\n\nexport const ActionTypeDescribe = union([string(), func()]);\n\nexport enum PropsUIType {\n  SINGLE = 'single',\n  GROUP = 'group',\n}\n\nexport type SpecialMaterialPropType<CustomSetter extends SetterBasicType = ''> =\n  | {\n      title: MTitle;\n      type: PropsUIType.SINGLE | `${PropsUIType.SINGLE}`;\n      content: MaterialPropType<CustomSetter>;\n    }\n  | {\n      title: MTitle;\n      type: PropsUIType.GROUP | `${PropsUIType.GROUP}`;\n      content: MaterialPropType<CustomSetter>[];\n    };\n\nexport type CMaterialPropsType<CustomSetter extends SetterBasicType = ''> = (\n  | MaterialPropType<CustomSetter>\n  | SpecialMaterialPropType<CustomSetter>\n)[];\n\nexport const isSpecialMaterialPropType = <CustomSetter extends SetterBasicType = ''>(\n  val: any\n): val is SpecialMaterialPropType<CustomSetter> => {\n  if (val.type && [PropsUIType.GROUP, PropsUIType.SINGLE].includes(val.type)) {\n    return true;\n  } else {\n    return false;\n  }\n};\n\nexport type TFunctionOrEventParameter = {\n  /** 参数名 */\n  name: string;\n  /** 参数的 ts 类型 */\n  tsType?: string;\n  description?: string;\n  example?: string;\n};\n\nexport type CMaterialEventType =\n  | string\n  | {\n      /** 对外展示的描述 */\n      name?: string;\n      /** 事件 key */\n      event: string;\n      descriptions?: string;\n      // 事件参数描述\n      params?: TFunctionOrEventParameter[];\n      // function string\n      template?: string;\n    };\nexport const CMaterialEventTypeDescribe = union([\n  string(),\n  object({\n    event: string(),\n    name: optional(string()),\n    describe: optional(string()),\n    params: optional(\n      array(\n        object({\n          name: string(),\n          description: string(),\n          example: string(),\n        })\n      )\n    ),\n    template: optional(string()),\n  }),\n]);\n\nexport type SnippetsType = {\n  id?: string;\n  title: string;\n  snapshotText?: string;\n  snapshot?: string | React.ReactNode;\n  description?: string | React.ReactNode;\n  // 组件标签用于搜索\n  tags?: string[];\n  // 分 tab 面板\n  groupName?: string;\n  // 分类\n  category?: string;\n  schema: Omit<CNodeDataType, 'id' | 'componentName'> & {\n    componentName?: string;\n  };\n};\n\nexport type SnippetsStanderType = Omit<SnippetsType, 'schema'> & {\n  schema: Omit<CNodeDataType, 'id'>;\n};\n\nexport const SnippetsTypeDescribe = object({\n  id: optional(string()),\n  title: string(),\n  snapshot: union([string(), any()]),\n  snapshotText: optional(string()),\n  description: optional(string()),\n  // 组件分类,用于搜索\n  tags: optional(array(string())),\n  // 分 tab 面板\n  groupName: optional(string()),\n  // 分类\n  category: optional(string()),\n  schema: assign(omit(CNodeDataStructDescribe, ['id']), object({ componentName: optional(string()) })),\n});\n\nexport type ContainerConfig = {\n  placeholder: string;\n  width: string;\n  height: string;\n  style?: React.CSSProperties;\n};\n\nexport type DragAndDropEventExtraData = {\n  dropType?: 'NEW_ADD' | 'NORMAL' | '';\n  dragNode?: CNode | CRootNode;\n  dragNodeUID?: string;\n  dropNode?: CNode | CRootNode;\n  dropNodeUID?: string;\n  dropPosInfo?: DropPosType;\n};\n\nexport type CustomViewRenderProps = {\n  node: CNode | CRootNode;\n  params: AdvanceCustomFuncParam;\n  componentInstance?: ReactInstance;\n  /** 一个组件可能被循环渲染，这里表示是第几个索引 **/\n  componentInstanceIndex?: number;\n};\n\nexport type AdvanceCustomFuncParam = {\n  dropNode?: CNode | CRootNode;\n  viewPortal: {\n    setView: (view: React.ReactNode) => void;\n    clearView: () => void;\n  };\n  //  当前元素在拖动中是否被锁住\n  isLock?: boolean;\n  context: any;\n  cancelDrag?: () => void;\n  /** 如果是 api 触发的，则没有事件对象 */\n  event?: any;\n  extra: DragAndDropEventExtraData;\n};\n\nexport type EventName = keyof HTMLElementEventMap;\n\nexport type AdvanceCustom = {\n  canDragNode?: (\n    node: CNode | CRootNode,\n    params: AdvanceCustomFuncParam\n  ) => Promise<\n    | boolean\n    | {\n        dragNode?: CNode | CRootNode;\n      }\n  >;\n  onDragStart?: (node: CNode | CRootNode, params: AdvanceCustomFuncParam) => Promise<boolean | void | undefined>;\n  /** 拖动中触发 */\n  onDragging?: (node: CNode | CRootNode, params: AdvanceCustomFuncParam) => Promise<boolean | void | undefined>;\n  onDragEnd?: (node: CNode | CRootNode, params: AdvanceCustomFuncParam) => void;\n  /** 当有其他 node 被放置到当前 node 的 child 时触发校验，可以控制落点的 UI 样式？ */\n  canAcceptNode?: (node: CNode | CRootNode, params: AdvanceCustomFuncParam) => Promise<boolean | void | undefined>;\n  /** 当前节点是否能被放置, 可以控制落点的 UI 样 */\n  canDropNode?: (\n    node: CNode | CRootNode,\n    params: AdvanceCustomFuncParam\n  ) => Promise<\n    | boolean\n    | void\n    | undefined\n    | {\n        /** 被拖动的节点 */\n        dragNode?: CNode | CRootNode;\n        /** node 可能被循环渲染多次，这里表示 node 的唯一 id， node.id 只能表示 node 在 schema 中唯一，不代表渲染唯一 */\n        dragNodeUID?: string;\n        /** 放置到的目标节点 */\n        dropNode?: CNode | CRootNode;\n        dropNodeUID?: string;\n        dropPosInfo?: DropPosType;\n      }\n  >;\n  onDrop?: (node: CNode | CRootNode, params: AdvanceCustomFuncParam) => Promise<boolean | void | undefined>;\n  /** 当第一次被拖入到画布时触发 */\n  onNewAdd?: (\n    node: CNode | CRootNode,\n    params: AdvanceCustomFuncParam\n  ) => Promise<\n    | boolean\n    | void\n    | undefined\n    | {\n        addNode?: CNode | CRootNode;\n        dropNode?: CNode | CRootNode;\n        dropPosInfo?: DropPosType;\n      }\n  >;\n  /** 当元素被删除时触发 */\n  onDelete?: (\n    node: CNode | CRootNode,\n    params: AdvanceCustomFuncParam\n  ) => Promise<\n    | boolean\n    | void\n    | undefined\n    | {\n        deleteNode?: CNode | CRootNode;\n      }\n  >;\n  /** 元素被选中时触发 */\n  onSelect?: (\n    node: CNode | CRootNode,\n    params: AdvanceCustomFuncParam\n  ) =>\n    | Promise<boolean | void | undefined>\n    | {\n        selectedNode?: CNode | CRootNode;\n      };\n  onCopy?: (\n    node: CNode | CRootNode,\n    params: AdvanceCustomFuncParam\n  ) => Promise<\n    | boolean\n    | void\n    | undefined\n    | {\n        copyNode?: CNode | CRootNode;\n      }\n  >;\n  toolbarViewRender?: (props: {\n    node: CNode | CRootNode;\n    context: any;\n    toolBarItems: {\n      copyItem: React.ReactElement;\n      deleteItem: React.ReactElement;\n      visibleItem: React.ReactElement;\n      nodeLayout: React.ReactElement;\n    };\n    toolBarItemList: React.ReactElement[];\n  }) => React.ReactElement;\n  selectRectViewRender?: (props: CustomViewRenderProps) => React.ReactElement;\n  hoverRectViewRender?: (props: CustomViewRenderProps) => React.ReactElement;\n  dropViewRender?: (\n    props: CustomViewRenderProps & {\n      // 是否可以放置\n      canDrop: boolean;\n      posInfo: DropPosType;\n    }\n  ) => React.ReactElement;\n  ghostViewRender?: (props: CustomViewRenderProps) => React.ReactElement;\n  // TODO: 编辑模式下会使用该函数包裹目标组件，可用于定制编辑模式下的特殊信息\n  wrapComponent?: (\n    targetComponent: (...args: any[]) => React.ReactElement,\n    options: {\n      ctx: any;\n      node: CNode | CRootNode;\n    }\n  ) => (...args: any[]) => React.ReactElement;\n  dropPlaceholder?: (props: { node: CNode | CRootNode }) => React.ReactElement;\n  /** 配置右侧面板 */\n  rightPanel?: {\n    /** 是否显示相应的面板 */\n    visual?: boolean;\n    state?: boolean;\n    advance?: boolean;\n    advanceOptions?: {\n      /** 是否展示 loop 选项 */\n      loop?: boolean;\n      /** 是否展示 render 选项, 如果为 false 会被包裹 div 并设置 display 为 none */\n      render?: boolean;\n    };\n    property?: boolean;\n    customTabs?: {\n      /** 唯一标识 */\n      key: string;\n      name: string | ((params: { node: CNode | CRootNode | null; pluginCtx: any }) => string);\n      view: (params: { node: CNode | CRootNode | null; pluginCtx: any }) => React.ReactElement;\n      show?: (options: { node: CNode | CRootNode | null; pluginCtx: any }) => boolean;\n    }[];\n  };\n  /** 是否自动获取 元素 dom, 配置 getDom  使用, 默认 为 true */\n  autoGetDom?: boolean;\n};\n\nexport type CMaterialType<PropsSetter extends string = ''> = {\n  componentName: string;\n  title: string;\n  screenshot?: string;\n  icon?: string;\n  /** 组件标签用于搜索 */\n  tags?: string[];\n  /** 分 tab 面板 */\n  groupName?: string;\n  /** 分类 */\n  category?: string;\n  /** 排序 */\n  priority?: number;\n  npm?: LibMetaType;\n  snippets: SnippetsType[];\n  props: CMaterialPropsType<PropsSetter>;\n  /** 固定的props, 不被 setter 的值覆盖, 只在编辑模式下会生效 */\n  fixedProps?: Record<string, any> | ((props: Record<string, any>) => Record<string, any>);\n  /** 可以拖入组件 */\n  isContainer?: boolean | ContainerConfig;\n  /** 选择框的根选择器 */\n  rootSelector?: string;\n  /** 是否禁止编辑器的 drag 事件，被命中的 dom 不会出发 编辑器的 */\n  disableEditorDragDom?:\n    | {\n        class?: string[];\n        id?: string[];\n      }\n    | boolean;\n  /** TODO: 组件支持的可被调用的方法， todo： 没有补充验证 类型 describe */\n  methods?: {\n    title: string;\n    // 方法名\n    name: string;\n    params?: TFunctionOrEventParameter[];\n    // 方法的 ts 类型定义\n    tsType?: string;\n    template?: string;\n  }[];\n  /**  组件可能触发的事件 */\n  events?: CMaterialEventType[];\n  /** 定制组件高级编辑行为 */\n  advanceCustom?: AdvanceCustom;\n  /** 自定义扩展配置 */\n  extra?: Record<any, any>;\n};\n\nexport type CMaterialStanderType = Omit<CMaterialType, 'snippets'> & {\n  snippets: SnippetsStanderType[];\n};\n\nexport const CMaterialTypeDescribe = object({\n  componentName: string(),\n  title: string(),\n  screenshot: optional(string()),\n  icon: optional(string()),\n  // 组件分类,用于搜索\n  tags: optional(array(string())),\n  // 分 tab 面板\n  groupName: optional(string()),\n  // 分类\n  category: optional(string()),\n  // 排序\n  priority: optional(number()),\n  npm: optional(LibMetaTypeDescribe),\n  snippets: array(SnippetsTypeDescribe),\n  props: array(\n    union([\n      MaterialPropDescribe,\n      object({\n        title: optional(MTitleDescribe),\n        type: literal(PropsUIType.SINGLE),\n        content: MaterialPropDescribe,\n      }),\n      object({\n        title: optional(MTitleDescribe),\n        type: literal(PropsUIType.GROUP),\n        content: array(MaterialPropDescribe),\n      }),\n    ])\n  ),\n  events: optional(any()),\n  methods: optional(any()),\n  fixedProps: optional(any()),\n  // 可以拖入组件\n  isContainer: optional(\n    union([\n      boolean(),\n      object({\n        placeholder: string(),\n        width: string(),\n        height: string(),\n      }),\n    ])\n  ),\n  disableEditorDragDom: optional(any()),\n  // 如果是布局组件，可以考虑将拖拽控制权转移 or 实现 resize\n  isLayout: optional(boolean()),\n  rootSelector: optional(string()),\n  // selectionToolBarView: optional(func()),\n  advanceCustom: optional(any()),\n  // 扩展配置\n  extra: optional(record(any(), any())),\n});\n","import { assert, Struct, StructError } from 'superstruct';\nimport { isPlainObject } from './lodash';\nexport type BaseDataCheckParameters = {\n  data: any;\n  message?: string;\n  throwError?: boolean;\n};\nexport type DataCheckFunc = (parameters: BaseDataCheckParameters) => {\n  isValidate: boolean;\n  message?: string;\n  throwError?: boolean;\n  error?: any;\n};\n\nexport const checkFuncWrap = (func: DataCheckFunc): DataCheckFunc => {\n  return ({ data, message, throwError }) => {\n    const validateRes = func({ data, message, throwError });\n\n    if (validateRes.isValidate) {\n      return validateRes;\n    } else {\n      if (throwError) {\n        if (validateRes.message || message) {\n          throw new Error(`${validateRes.message || message}\\n originData: ${JSON.stringify(data)}`);\n        } else {\n          throw new Error(`${JSON.stringify(data)} \\n data struct format is invalidate`);\n        }\n      } else {\n        if (validateRes.message || message) {\n          console.warn(`${validateRes.message || message}\\n originData: ${JSON.stringify(data)}`);\n        } else {\n          console.warn(`${JSON.stringify(data)} \\n data struct format is invalidate`);\n        }\n        return validateRes;\n      }\n    }\n  };\n};\n\nexport const checkString = checkFuncWrap((data) => {\n  if (data && typeof data === 'string') {\n    return {\n      isValidate: true,\n    };\n  } else {\n    return {\n      isValidate: false,\n    };\n  }\n});\n\nexport const checkNumber = checkFuncWrap((data) => {\n  if (data && typeof data === 'number') {\n    return {\n      isValidate: true,\n    };\n  } else {\n    return {\n      isValidate: false,\n    };\n  }\n});\n\nexport const checkIsObject = checkFuncWrap((data) => {\n  if (isPlainObject(data)) {\n    return {\n      isValidate: true,\n    };\n  } else {\n    return {\n      isValidate: false,\n    };\n  }\n});\n\nexport const checkComplexData = (parameters: {\n  data: any;\n  dataStruct: Struct<any, any>;\n  message?: string;\n  throwError?: boolean;\n}) => {\n  const { data, message, throwError, dataStruct } = parameters;\n  const newFunc = checkFuncWrap(({ data: innerData }) => {\n    try {\n      assert(innerData, dataStruct);\n      return {\n        isValidate: true,\n      };\n    } catch (e: any) {\n      let message = e;\n\n      if (e instanceof StructError) {\n        const failures = e.failures();\n\n        message = failures.map((failure) => {\n          return `【${failure.path.join('.')}】: ${failure.message}\\n`;\n        });\n      }\n      return {\n        isValidate: false,\n        message: message,\n        error: e,\n      };\n    }\n  });\n  return newFunc({ data, message, throwError });\n};\n","import { assign, literal, object, omit, string } from 'superstruct';\nimport { CNodePropsTypeEnum } from '../const/schema';\nimport { CNodeDataStructDescribe, CNodeDataType } from './node';\n\nexport enum InnerComponentNameEnum {\n  ROOT_CONTAINER = 'RootContainer',\n}\n\nexport type CRootNodeDataType<ExtraT = any> = CNodeDataType<ExtraT> & {\n  componentName: InnerComponentNameEnum | `${InnerComponentNameEnum}`;\n};\n\nexport const FunctionPropertyTypeDescribe = object({\n  type: literal(CNodePropsTypeEnum.FUNCTION),\n  value: string(),\n});\n\nexport const CRootNodeDataTypeDescribe = assign(\n  omit(CNodeDataStructDescribe, ['componentName']),\n  object({\n    componentName: literal(InnerComponentNameEnum.ROOT_CONTAINER),\n  })\n);\n","import mitt, { Emitter } from 'mitt';\nimport { CRootNode, CRootNodeModelDataType } from '../Page/RootNode';\nimport { CNode, CNodeModelDataType } from '../Page/RootNode/Node';\nimport { CProp } from '../Page/RootNode//Node/prop';\nimport { CPropDataType } from '../types/node';\nimport { CPageDataType } from '../types/page';\nimport { CPage, CPpageDataModelType } from '../Page';\n\nexport type DataModelEventType = {\n  onPageChange: {\n    value: CPageDataType | CPpageDataModelType;\n    preValue: CPageDataType | CPpageDataModelType;\n    node: CPage;\n  };\n  onReloadPage: {\n    value: CPageDataType | CPpageDataModelType;\n    preValue: CPageDataType | CPpageDataModelType;\n    node: CPage;\n  };\n  onSchemaChange: any;\n  onNodeChange: {\n    value: CNodeModelDataType | CRootNodeModelDataType;\n    preValue: CNodeModelDataType | CRootNodeModelDataType;\n    node: CNode | CRootNode;\n  };\n  onPropChange: {\n    value: CPropDataType;\n    preValue: CPropDataType;\n    node: CProp;\n  };\n};\n\nexport const DataModelEmitter: Emitter<DataModelEventType> = mitt<DataModelEventType>();\nexport type DataModelEmitterType = Emitter<DataModelEventType>;\n","import { CNode } from '.';\nimport { ExportType } from '../../../const/schema';\nimport { CMaterials } from '../../../Material';\n\nimport { RenderPropType } from '../../../types/node';\nimport { getRandomStr } from '../../../util';\nimport { isArray, isPlainObject } from '../../../util/lodash';\nimport { DataModelEmitter, DataModelEmitterType } from '../../../util/modelEmitter';\nimport { CProp } from './prop';\n\nexport type CJSSlotPropDataType = Omit<RenderPropType, 'value'> & {\n  value: CNode[];\n};\ntype ParentType = CSlot | null;\n\n// 递归处理所有的节点\nconst parseData = (data: any, parent?: ParentType) => {\n  const newData: CJSSlotPropDataType = {\n    ...data,\n    value: [],\n  };\n  const nodeValue = data.value;\n  let material = new CMaterials([]);\n  if (parent) {\n    material = parent.materialsMode || new CMaterials([]);\n  }\n  if (nodeValue) {\n    if (isArray(nodeValue)) {\n      newData.value = nodeValue.map(\n        (el) =>\n          new CNode(el, {\n            parent,\n            materials: material,\n          })\n      );\n    } else if (isPlainObject(nodeValue)) {\n      newData.value.push(\n        new CNode(nodeValue, {\n          parent: parent,\n          materials: material,\n        })\n      );\n    }\n  }\n  return newData;\n};\n\nexport class CSlot {\n  nodeType = 'SLOT' as const;\n  private rawData: RenderPropType;\n  parent: CProp | null;\n  emitter: DataModelEmitterType = DataModelEmitter;\n  private data: CJSSlotPropDataType;\n  id: string;\n  materialsMode: CMaterials;\n  constructor(data: RenderPropType, options?: { parent: CProp | null; materials: CMaterials }) {\n    this.parent = options?.parent || null;\n    this.rawData = data;\n    const materials = options?.materials || new CMaterials([]);\n    this.materialsMode = materials;\n    this.id = getRandomStr();\n    this.data = parseData(data, this);\n  }\n\n  get value() {\n    return this.data;\n  }\n\n  export(mode: ExportType) {\n    const data = this.data;\n    const handleSingleProps = (propVal: any) => {\n      if (propVal instanceof CNode) {\n        return propVal.export(mode);\n      }\n      if (isPlainObject(propVal)) {\n        const newObj: Record<string, any> = {};\n\n        Object.keys(propVal || {}).forEach((key) => {\n          newObj[key] = handleSingleProps(propVal[key]);\n        });\n        return newObj;\n      }\n\n      if (isArray(propVal)) {\n        const newList: any[] = propVal.map((el) => {\n          return handleSingleProps(el);\n        });\n        return newList;\n      }\n      if (mode === 'design') {\n        delete propVal.id;\n      }\n      return propVal;\n    };\n    return handleSingleProps(data);\n  }\n}\n","import { CNode } from '.';\nimport { CRootNode } from '..';\nimport { CNodePropsTypeEnum, ExportType } from '../../../const/schema';\nimport { CMaterials } from '../../../Material';\nimport { CMaterialPropsType, MaterialPropType, PropsUIType, SpecialMaterialPropType } from '../../../types/material';\n\nimport {\n  FunctionPropType,\n  JSExpressionPropType,\n  NormalPropType,\n  CPropDataType,\n  CPropObjDataType,\n} from '../../../types/node';\nimport { isArray, isPlainObject } from '../../../util/lodash';\nimport { DataModelEmitter, DataModelEmitterType } from '../../../util/modelEmitter';\nimport { CJSSlotPropDataType, CSlot } from './slot';\n\nexport type CSpecialPropDataType = CJSSlotPropDataType | FunctionPropType | JSExpressionPropType;\n\nexport type CPropModelDataType = NormalPropType | CSpecialPropDataType | CSpecialPropDataType[];\n\nconst flatProps = (props: CMaterialPropsType): MaterialPropType[] => {\n  let allProps: MaterialPropType[] = [];\n  props.forEach((el) => {\n    const specialProp = el as SpecialMaterialPropType;\n    if (specialProp.type) {\n      if (specialProp.type === PropsUIType.SINGLE) {\n        allProps.push(specialProp.content);\n      } else if (specialProp.type === PropsUIType.GROUP) {\n        allProps = [...allProps, ...flatProps(specialProp.content)];\n      }\n    } else {\n      allProps.push(el as MaterialPropType);\n    }\n  });\n\n  return allProps;\n};\n\n// TODO: 需要递归处理每个节点，将特殊节点转换为 CProp Model\nconst handleObjProp = (data: any, parent: ParentType, materials: CMaterials): any => {\n  if (data.type) {\n    if (data.type === CNodePropsTypeEnum.SLOT) {\n      // 转换为 Slot Node\n      const newNode = new CSlot(data, { parent, materials });\n      return newNode;\n\n      // return newData;\n    }\n    return data;\n  } else if (isPlainObject(data)) {\n    const newData: CPropDataType = {};\n    Object.keys(data).forEach((key) => {\n      newData[key] = parseData(data[key], parent, materials);\n    });\n    return newData;\n  } else if (Array.isArray(data)) {\n    return data.map((el) => handleObjProp(el, parent, materials));\n  } else {\n    return data;\n  }\n};\ntype ParentType = CProp | null;\n\n// 递归处理所有的节点\nconst parseData = (data: any, parent: ParentType, materials: CMaterials) => {\n  if (isPlainObject(data)) {\n    return handleObjProp(data, parent, materials);\n  }\n  if (isArray(data)) {\n    return data.map((el) => handleObjProp(el, parent, materials));\n  }\n  return data;\n};\n\nexport class CProp {\n  nodeType = 'PROP' as const;\n  private rawData: CPropDataType;\n  parent: CNode | CRootNode | null;\n  emitter: DataModelEmitterType = DataModelEmitter;\n  private data: CPropModelDataType;\n  name: string;\n  materialsMode: CMaterials;\n  constructor(\n    name: string,\n    data: CPropDataType,\n    options: { parent: CNode | CRootNode | null; materials?: CMaterials }\n  ) {\n    const materials = options?.materials || new CMaterials([]);\n    this.materialsMode = materials;\n    this.parent = options?.parent;\n    this.rawData = data;\n    this.name = name;\n    this.data = parseData(data, this, materials);\n  }\n  // TODO:\n  isIncludeSlot() {\n    return false;\n  }\n  // TODO:\n  isIncludeExpression() {\n    return false;\n  }\n\n  get value() {\n    return this.data;\n  }\n\n  updateValue(val?: CPropDataType | CPropModelDataType) {\n    const oldData = this.data;\n    this.data = parseData(val ?? oldData, this, this.materialsMode);\n    this.emitter.emit('onPropChange', {\n      value: this.data,\n      preValue: oldData,\n      node: this,\n    });\n    // 排除 CSlot 类型\n    if (this.parent && !(this.parent instanceof CSlot)) {\n      this.emitter.emit('onNodeChange', {\n        value: this.parent.value,\n        preValue: this.parent.value,\n        node: this.parent,\n      });\n    }\n  }\n\n  get material() {\n    const parent = this.parent;\n    if (parent instanceof CNode) {\n      const parentMaterial = parent.material;\n      const allProps = flatProps(parentMaterial?.value.props || []);\n      const target = allProps.find((el) => el.name === this.name);\n      return target;\n    } else {\n      return null;\n    }\n  }\n\n  export(mode: ExportType): any {\n    const data = this.data;\n    const handleSingleProps = (propVal: any) => {\n      if (propVal instanceof CProp) {\n        return propVal.export(mode);\n      }\n      if (propVal instanceof CSlot) {\n        return propVal.export(mode);\n      }\n\n      if (propVal instanceof CNode) {\n        return propVal.export(mode);\n      }\n\n      if (isArray(propVal)) {\n        const newList: any[] = propVal.map((el) => {\n          return handleSingleProps(el);\n        });\n        return newList;\n      }\n\n      if (isPlainObject(propVal)) {\n        const newObj: Record<string, any> = {};\n\n        Object.keys(propVal || {}).forEach((key) => {\n          newObj[key] = handleSingleProps(propVal[key]);\n        });\n        return newObj;\n      }\n\n      return propVal;\n    };\n    return handleSingleProps(data);\n  }\n}\n\nexport const transformObjToPropsModelObj = (props: CPropObjDataType, parent: CNode | null = null) => {\n  const newProps: Record<string, CPropModelDataType> = {};\n  const propsKeys = Object.keys(props || {});\n  if (propsKeys.length) {\n    propsKeys.forEach((propKey) => {\n      newProps[propKey] = new CProp(propKey, props[propKey], {\n        parent: parent,\n      });\n    });\n  }\n  return newProps;\n};\n","import { get, isPlainObject, merge } from 'lodash-es';\nimport { CRootNode } from '..';\nimport { ExportType } from '../../../const/schema';\nimport { CMaterials } from '../../../Material';\nimport { CNodeDataStructDescribe, CNodeDataType } from '../../../types/node';\nimport { getRandomStr, clearSchema, getNode } from '../../../util';\nimport { checkComplexData } from '../../../util/dataCheck';\nimport { DataModelEmitter } from '../../../util/modelEmitter';\nimport type { DataModelEmitterType, DataModelEventType } from '../../../util/modelEmitter';\nimport { CProp } from './prop';\nimport { CSlot } from './slot';\n\nexport const checkNode = (data: any) => {\n  if (typeof data === 'string') {\n    return true;\n  }\n  // check data\n  checkComplexData({\n    data: data,\n    dataStruct: CNodeDataStructDescribe,\n    throwError: false,\n  });\n};\n\nexport type CNodeModelDataType = Omit<CNodeDataType, 'children'> & {\n  id: string;\n  children: (CNode | string)[];\n  props: Record<string, CProp>;\n  configure: Required<CNodeDataType>['configure'];\n};\n\nexport const parseNode = (data: CNodeDataType | CNodeModelDataType, self: CNode | CRootNode, materials: CMaterials) => {\n  if (typeof data === 'string') {\n    return data;\n  }\n  const res: CNodeModelDataType = {\n    ...data,\n    id: data.id ?? getRandomStr(),\n    children: [],\n    props: {},\n    methods: data.methods || [],\n    configure: merge(data.configure || {}, {\n      propsSetter: {},\n      advanceSetter: {},\n    }),\n  };\n\n  const propsKeys = Object.keys(data.props || {});\n  if (propsKeys.length) {\n    propsKeys.forEach((propKey) => {\n      const targetProps = data.props?.[propKey];\n\n      if (targetProps instanceof CProp) {\n        res.props[propKey] = targetProps;\n        return;\n      }\n      res.props[propKey] = new CProp(propKey, targetProps, {\n        parent: self,\n        materials,\n      });\n    });\n  }\n\n  if (data.children) {\n    if (Array.isArray(data.children)) {\n      res.children = data.children.map((el) => {\n        if (el instanceof CNode) {\n          return el;\n        }\n        if (isPlainObject(el)) {\n          const tmpObj = el as CNodeDataType;\n          return new CNode(tmpObj, {\n            parent: self,\n            materials,\n          });\n        } else {\n          return el as string;\n        }\n      });\n    } else {\n      if ((data.children as any) instanceof CNode) {\n        res.children = [data.children];\n      }\n      res.children = [\n        new CNode(data.children, {\n          parent: self,\n          materials: materials,\n        }),\n      ];\n    }\n  }\n  return res;\n};\n\ntype OnNodeChangeType = (params: DataModelEventType['onNodeChange']) => void;\ntype ParentType = CNode | CRootNode | CSlot | null;\n\nexport class CNode {\n  nodeType = 'NODE' as const;\n  private rawData: CNodeDataType;\n  private data: CNodeModelDataType;\n  emitter: DataModelEmitterType = DataModelEmitter;\n  parent: ParentType;\n  materialsModel: CMaterials;\n  listenerHandler: (() => void)[];\n  onChangeCbQueue: OnNodeChangeType[];\n\n  constructor(data: CNodeDataType, options?: { parent?: ParentType; materials: CMaterials | null }) {\n    this.rawData = JSON.parse(JSON.stringify(data));\n    checkNode(data);\n    const materials = options?.materials || new CMaterials([]);\n    this.parent = options?.parent || null;\n    this.materialsModel = materials;\n    this.data = parseNode(data, this, materials);\n    this.listenerHandler = [];\n    this.onChangeCbQueue = [];\n    this.registerListener();\n  }\n\n  registerListener() {\n    const onNodeChange = (params: DataModelEventType['onNodeChange']) => {\n      const { node } = params;\n      if (node === this && node.id === this.id) {\n        this.onChangeCbQueue.forEach((it) => it(params));\n      }\n    };\n    this.emitter.on('onNodeChange', onNodeChange);\n    this.listenerHandler.push(() => {\n      this.emitter.off('onNodeChange', onNodeChange);\n    });\n  }\n\n  onChange(cb: OnNodeChangeType) {\n    this.onChangeCbQueue.push(cb);\n    return () => {\n      this.onChangeCbQueue = this.onChangeCbQueue.filter((el) => el !== cb);\n    };\n  }\n\n  destroy() {\n    this.listenerHandler.forEach((it) => it());\n  }\n\n  get id() {\n    return this.data.id;\n  }\n\n  get value(): CNodeModelDataType {\n    return this.data;\n  }\n\n  clone(id?: string) {\n    const newData = {\n      ...this.export('design'),\n      id: id || getRandomStr(),\n    };\n    return new CNode(newData, {\n      materials: this.materialsModel,\n    });\n  }\n\n  updateWithPlainObj(val?: Partial<CNodeModelDataType | CNodeDataType>) {\n    const newVal: any = {\n      ...this.data,\n      ...val,\n    };\n    this.data = parseNode(newVal, this, this.materialsModel);\n    return newVal;\n  }\n\n  updateValue(val?: Partial<CNodeModelDataType | CNodeDataType>) {\n    const oldData = this.data;\n    const newVal = this.updateWithPlainObj(val);\n    this.emitter.emit('onNodeChange', {\n      value: newVal,\n      preValue: oldData,\n      node: this,\n    });\n  }\n\n  contains(nodeId: string) {\n    const res = getNode(this, nodeId);\n    return res;\n  }\n\n  get props() {\n    return this.data.props;\n  }\n\n  get material() {\n    const materialModel = this.materialsModel;\n    return materialModel?.findByComponentName(this.data.componentName);\n  }\n\n  getPlainProps() {\n    const data = this.data;\n    const props: any = {};\n    Object.keys(data.props || {}).forEach((key) => {\n      props[key] = data.props[key].export('design');\n    });\n    return props;\n  }\n\n  // 节点物料中的配置信息\n  getMaterialConfig(key: 'isContainer') {\n    if (this.data.configure[key] !== undefined) {\n      return this.data.configure.isContainer;\n    } else {\n      return this.material?.value.isContainer;\n    }\n  }\n\n  isContainer() {\n    return this.getMaterialConfig('isContainer');\n  }\n\n  export(mode: ExportType): CNodeDataType {\n    const data = this.data;\n    if (typeof data === 'string') {\n      return data;\n    }\n    const props: any = {};\n    Object.keys(data.props || {}).forEach((key) => {\n      props[key] = data.props[key].export(mode);\n    });\n    const children: any[] = data.children?.map((child) => {\n      if (child instanceof CNode) {\n        return child.export(mode);\n      } else {\n        return child;\n      }\n    });\n\n    // handle configure props setter config, clear invalidate setter config\n    const configure = data.configure || {};\n    const propsSetter = configure.propsSetter || {};\n    const newPropsSetter: typeof configure.propsSetter = {};\n    Object.keys(propsSetter).forEach((key) => {\n      const val = get(propsSetter, key, false);\n      if (val) {\n        newPropsSetter[key] = val;\n      }\n    });\n    configure.propsSetter = newPropsSetter;\n    // handle configure props setter config, clear invalidate setter config end\n    // 避免重复的物料\n    const hasExitsMeta = this.materialsModel.usedMaterials.find(\n      (el) => el.componentName === this.material?.componentName\n    );\n    if (this.material && !hasExitsMeta) {\n      this.materialsModel.usedMaterials.push(this.material);\n    }\n    let newRes: CNodeDataType = {\n      ...data,\n      configure,\n      props: props,\n      children,\n      condition: data.condition,\n      extra: this.data.extra,\n    };\n    if (mode === 'design') {\n      delete newRes.id;\n    }\n    newRes = clearSchema(newRes);\n    return newRes;\n  }\n}\n","import { merge, omit } from 'lodash-es';\nimport { CPage } from '..';\nimport { ExportType, ExportTypeEnum } from '../../const/schema';\nimport { CMaterials } from '../../Material';\nimport { CRootNodeDataType, CRootNodeDataTypeDescribe, InnerComponentNameEnum } from '../../types/rootNode';\nimport { clearSchema, getNode, getRandomStr } from '../../util';\nimport { checkComplexData } from '../../util/dataCheck';\nimport { isArray, isPlainObject } from '../../util/lodash';\nimport { DataModelEmitter, DataModelEmitterType, DataModelEventType } from '../../util/modelEmitter';\nimport { CNode } from './Node/index';\nimport { CProp } from './Node/prop';\n\nexport type CRootNodeModelDataType = Omit<CRootNodeDataType, 'children'> & {\n  id: string;\n  children: CNode[];\n  props: Record<string, CProp>;\n  configure: Required<CRootNodeDataType>['configure'];\n};\n\nexport const checkRootNode = (data: any): CRootNodeDataType => {\n  checkComplexData({\n    data: data,\n    dataStruct: CRootNodeDataTypeDescribe,\n    throwError: false,\n  });\n  return data;\n};\n\nexport const parseSchema = (\n  data: CRootNodeDataType | CRootNodeModelDataType,\n  parent: CRootNode,\n  materials: CMaterials\n): CRootNodeModelDataType => {\n  const res: CRootNodeModelDataType = {\n    ...data,\n    id: getRandomStr(),\n    props: {} as any,\n    componentName: InnerComponentNameEnum.ROOT_CONTAINER,\n    children: [],\n    methods: data.methods || [],\n    configure: merge(data.configure || {}, {\n      propsSetter: {},\n      advanceSetter: {},\n    }),\n    /** 需要注入给特定组件的运行时引擎的内置变量 */\n    injectEnvList: data.injectEnvList,\n  };\n  let child: any = [];\n  if (isArray(data.children)) {\n    child = data.children.map((el: any) => {\n      if (el instanceof CNode) {\n        return el;\n      }\n      if (isPlainObject(el)) {\n        return new CNode(el, { parent: parent, materials });\n      } else {\n        return el;\n      }\n    });\n  } else {\n    if ((data.children as unknown) instanceof CNode) {\n      child.push(data.children);\n    } else {\n      if (data.children && isPlainObject(data.children)) {\n        child.push(new CNode(data.children, { parent: parent, materials }));\n      }\n    }\n  }\n\n  const propsKeys = Object.keys(data.props || {});\n\n  if (propsKeys.length) {\n    propsKeys.forEach((propKey) => {\n      const targetProps = data.props?.[propKey];\n      if (targetProps instanceof CProp) {\n        res.props[propKey] = targetProps;\n      } else {\n        res.props[propKey] = new CProp(propKey, targetProps || '', {\n          parent: parent,\n          materials,\n        });\n      }\n    });\n  }\n  res.children = child;\n\n  return res;\n};\n\ntype OnNodeChangeType = (params: DataModelEventType['onNodeChange']) => void;\n\nexport class CRootNode {\n  private rawData: CRootNodeDataType;\n  private data: CRootNodeModelDataType;\n  nodeType = InnerComponentNameEnum.ROOT_CONTAINER;\n  emitter: DataModelEmitterType = DataModelEmitter;\n  materialsModel: CMaterials;\n  listenerHandler: (() => void)[];\n  onChangeCbQueue: OnNodeChangeType[];\n  parent: CPage | null;\n\n  constructor(data: any, { parent, materials }: { parent: CPage | null; materials: CMaterials }) {\n    this.materialsModel = materials;\n    this.rawData = JSON.parse(JSON.stringify(data));\n    this.data = parseSchema(data, this, materials);\n    this.listenerHandler = [];\n    this.onChangeCbQueue = [];\n    this.registerListener();\n    this.parent = parent;\n  }\n\n  registerListener() {\n    const onNodeChange = (params: DataModelEventType['onNodeChange']) => {\n      const { node } = params;\n      if (node === this && node.id === this.id) {\n        this.onChangeCbQueue.forEach((it) => it(params));\n      }\n    };\n    this.emitter.on('onNodeChange', onNodeChange);\n    this.listenerHandler.push(() => {\n      this.emitter.off('onNodeChange', onNodeChange);\n    });\n  }\n\n  onChange(cb: OnNodeChangeType) {\n    this.onChangeCbQueue.push(cb);\n    return () => {\n      this.onChangeCbQueue = this.onChangeCbQueue.filter((el) => el !== cb);\n    };\n  }\n\n  get id() {\n    return this.data.id;\n  }\n\n  get value() {\n    return this.data;\n  }\n\n  get props() {\n    return this.data.props;\n  }\n\n  get material() {\n    const materialModel = this.materialsModel;\n    return materialModel?.findByComponentName(this.data.componentName);\n  }\n\n  updateWithPlainObj(val?: Partial<CRootNodeModelDataType | CRootNodeDataType>) {\n    const newVal: any = {\n      ...this.data,\n      ...val,\n    };\n    this.data = parseSchema(newVal, this, this.materialsModel);\n    return newVal;\n  }\n\n  updateValue(val?: Partial<CRootNodeModelDataType | CRootNodeDataType>) {\n    const oldData = this.data;\n    this.updateWithPlainObj(val);\n    this.emitter.emit('onNodeChange', {\n      value: this.data,\n      preValue: oldData,\n      node: this,\n    });\n  }\n\n  contains(nodeId: string) {\n    const res = getNode(this, nodeId);\n    return res;\n  }\n\n  /**\n   * 从物料 和 node config 中获取合并后的属性，node 中的配置优先级更高\n   * @param key 目前只支持 isContainer 属性\n   * @returns\n   */\n  getMaterialConfig(key: 'isContainer') {\n    if (this.data.configure[key] !== undefined) {\n      return this.data.configure.isContainer;\n    } else {\n      return this.material?.value.isContainer;\n    }\n  }\n\n  isContainer() {\n    return this.getMaterialConfig('isContainer');\n  }\n\n  export(mode: ExportType = ExportTypeEnum.SAVE): CRootNodeDataType {\n    const data = this.data;\n    const props: any = {};\n    Object.keys(data.props || {}).forEach((key) => {\n      props[key] = data.props[key].export(mode);\n    });\n    const children: any[] =\n      data.children?.map((child) => {\n        return child?.export?.(mode);\n      }) || [];\n\n    const tempData: CRootNodeDataType = {\n      ...data,\n      props: props,\n      children: children.filter((el) => el),\n      condition: data.condition,\n      extra: this.data.extra,\n    };\n    let finalRes: any = omit(tempData, ['id']);\n    finalRes = clearSchema(finalRes);\n\n    return finalRes;\n  }\n\n  getPlainProps() {\n    const data = this.data;\n    const props: any = {};\n    Object.keys(data.props || {}).forEach((key) => {\n      props[key] = data.props[key].export('design');\n    });\n    return props;\n  }\n\n  destroy() {\n    this.listenerHandler.forEach((it) => it());\n  }\n\n  clone(id?: string) {\n    const newData = {\n      ...this.export('design'),\n      id: id || getRandomStr(),\n    };\n    return new CRootNode(newData, {\n      materials: this.materialsModel,\n      parent: null,\n    });\n  }\n}\n","import { isArray, isPlainObject, omitBy } from 'lodash-es';\nimport { CNodePropsTypeEnum } from '../const/schema';\nimport { CPage } from '../Page';\nimport { CRootNode } from '../Page/RootNode';\nimport { CNode } from '../Page/RootNode/Node';\nimport { CProp } from '../Page/RootNode/Node/prop';\nimport { CSlot } from '../Page/RootNode/Node/slot';\nimport { InnerComponentNameEnum } from '../types/rootNode';\nimport { FunctionPropType, JSExpressionPropType, RenderPropType, TActionLogicItem } from '../types/node';\n\nexport const isExpression = (val: any): val is JSExpressionPropType => {\n  if (val?.type === CNodePropsTypeEnum.EXPRESSION) {\n    return true;\n  } else {\n    return false;\n  }\n};\n\nexport const isJSSlotPropNode = (val: any): val is RenderPropType => {\n  if (val?.type === CNodePropsTypeEnum.SLOT) {\n    return true;\n  } else {\n    return false;\n  }\n};\n\nexport const isFunction = (val: any): val is FunctionPropType => {\n  if (val?.type === CNodePropsTypeEnum.FUNCTION) {\n    return true;\n  } else {\n    return false;\n  }\n};\n\nexport const isAction = (val: any): val is TActionLogicItem => {\n  if (val?.type === CNodePropsTypeEnum.ACTION) {\n    return true;\n  } else {\n    return false;\n  }\n};\n\nexport const getRandomStr = () => {\n  return Math.random().toString(32).slice(3, 9);\n};\n\nexport const isSchemaModel = (val: any): val is CRootNode => {\n  if (val?.nodeType === 'SCHEMA' && val instanceof CRootNode) {\n    return true;\n  }\n\n  return false;\n};\n\nexport const isPageModel = (val: any): val is CPage => {\n  if (val?.nodeType === InnerComponentNameEnum.ROOT_CONTAINER) {\n    return true;\n  }\n\n  return false;\n};\n\nexport const isNodeModel = (val: any): val is CNode => {\n  if (val?.nodeType === 'NODE') {\n    return true;\n  }\n\n  return false;\n};\n\nexport const isPropModel = (val: any): val is CProp => {\n  if (val?.nodeType === 'PROP') {\n    return true;\n  }\n  return false;\n};\n\nexport const isSlotModel = (val: any): val is CSlot => {\n  if (val?.nodeType === 'SLOT') {\n    return true;\n  }\n  return false;\n};\n\n/**\n *\n * @param res clear empty array and object\n */\nexport const clearSchema = (res: any) => {\n  const newRes: any = omitBy(res, (val) => {\n    if (isPlainObject(val)) {\n      return !Object.keys(val).length;\n    }\n    if (isArray(val)) {\n      return !val.length;\n    }\n\n    if (val === null || val === undefined) {\n      return true;\n    }\n    return false;\n  });\n  return newRes;\n};\n\nexport function findNode(nodeTree: CRootNode | CNode, iterator: (item: CNode | CRootNode) => boolean) {\n  const nodeList: (CRootNode | CNode)[] = [nodeTree];\n  while (nodeList.length) {\n    const target = nodeList.shift();\n    if (target && iterator(target)) {\n      return target;\n    }\n\n    const props = target?.props || {};\n\n    const dpProps = (prop: unknown) => {\n      if (prop instanceof CNode) {\n        nodeList.push(prop);\n        return;\n      }\n\n      if (prop instanceof CSlot) {\n        dpProps(prop.value.value);\n      }\n\n      if (prop instanceof CProp) {\n        dpProps(prop.value);\n        return;\n      }\n      if (isPlainObject(prop)) {\n        const obj = prop as Record<string, any>;\n        Object.keys(obj).forEach((key) => {\n          dpProps(obj[key]);\n        });\n        return;\n      }\n\n      if (isArray(prop)) {\n        prop.forEach((it) => {\n          dpProps(it);\n        });\n        return;\n      }\n    };\n\n    // 检索所有的 props 中的节点\n    dpProps(props);\n    // 合并入待索引的列表\n    const tempNodeList: CNode[] = (target?.value.children.filter((el) => el instanceof CNode) as CNode[]) || [];\n    nodeList.push(...tempNodeList);\n  }\n  return undefined;\n}\n\nexport function getNode(nodeTree: CRootNode | CNode, id: string) {\n  return findNode(nodeTree, (node) => node.id === id);\n}\n\nexport function findContainerNode(\n  node: CNode | CRootNode | CSlot | CPage | null | undefined\n): CNode | CRootNode | CSlot | CPage | undefined {\n  if (!node) return undefined;\n  if (isSlotModel(node) || isPageModel(node) || node.isContainer()) {\n    return node;\n  }\n  return findContainerNode(node.parent);\n}\n\ntype CBFunction = (node: CNode | CRootNode) => any;\n\n/** 遍历 page 上所有的节点 */\nexport const traversePageNode = (pageModel: CPage, cb: CBFunction) => {\n  // 结合物料以及 state 的定义计算出当前页面的 类型提示\n  const pageNodeTree = pageModel.value.componentsTree;\n  const rootNode = pageNodeTree;\n  traversePageNodeCore(rootNode, cb);\n};\n\nexport const traversePageNodeCore = (node: CNode | CRootNode | (CNode | CRootNode)[], cb: CBFunction) => {\n  if (isArray(node)) {\n    node.map((e) => {\n      traversePageNodeCore(e, cb);\n    });\n    return;\n  }\n\n  cb(node);\n\n  // 处理 props 中的 节点\n  const processProps = (val: Record<any, CProp>, key: string, keys: string[], cb: CBFunction) => {\n    const flag = isSlotModel(val);\n    if (flag) {\n      if (isArray(val.value.value)) {\n        const nodeList = val.value.value;\n        return traversePageNodeCore(nodeList, cb);\n      } else {\n        return traversePageNodeCore(val.value.value, cb);\n      }\n    }\n    if (isPlainObject(val)) {\n      const tempVal = val as any;\n      Object.keys(tempVal).forEach((newKey) => {\n        processProps(tempVal[newKey], newKey, [...keys, key], cb);\n      });\n    }\n\n    if (Array.isArray(val)) {\n      const tempVal = val as any[];\n      tempVal.forEach((item, index) => {\n        processProps(item, String(index), [...keys, key], cb);\n      });\n    }\n    return;\n  };\n\n  const props = node.props;\n\n  processProps(props, '', [], cb);\n\n  // 处理 children\n  if (node.value.children.length) {\n    node.value.children.forEach((el) => {\n      if (isNodeModel(el)) {\n        traversePageNodeCore(el, cb);\n      }\n    });\n  }\n};\n","import { CMaterialStanderType, CMaterialType, CMaterialTypeDescribe, SnippetsType } from '../types/material';\nimport { cloneDeep, isArray } from '../util/lodash';\nimport { checkComplexData } from '../util/dataCheck';\nimport { getRandomStr } from '../util';\n\nconst parseMaterial = (data: CMaterialType): CMaterialStanderType => {\n  const newData = cloneDeep(data);\n  const snippets = newData.snippets;\n  delete (newData as any).snippets;\n  newData.snippets = snippets.map((el) => {\n    return {\n      ...newData,\n      ...el,\n      id: el.id || `${data.componentName}-${getRandomStr()}`,\n      title: el.title || data.title,\n      category: el.category || data.category,\n      tags: [...(el.tags || []), ...(data.tags || [])],\n      groupName: el.groupName || data.groupName,\n      snapshot: el.snapshot || data.icon,\n      snapshotText: el.snapshotText,\n      schema: {\n        ...el.schema,\n        componentName: el.schema.componentName || data.componentName,\n      },\n    };\n  });\n  return newData as CMaterialStanderType;\n};\n\nexport class CMaterial {\n  private rawData: CMaterialType;\n  private data: CMaterialStanderType;\n  constructor(data: CMaterialType) {\n    this.rawData = data;\n    this.data = parseMaterial(data);\n  }\n\n  get value() {\n    return this.data;\n  }\n\n  get rawValue() {\n    return this.rawData;\n  }\n\n  get componentName() {\n    return this.data.componentName;\n  }\n\n  get snippets() {\n    return this.data.snippets;\n  }\n\n  getSnippetById(id: string) {\n    return this.data.snippets.find((el) => el.id === id);\n  }\n}\n\nconst parseMaterials = (data: any[]) => {\n  if (!isArray(data)) {\n    throw new Error('Materials must be a array');\n  }\n  return data.map((el) => {\n    return new CMaterial(el);\n  });\n};\n\nexport const checkMaterials = (data: CMaterialType[]) => {\n  // check page children\n  data?.forEach((it: any) => {\n    checkComplexData({\n      data: it,\n      dataStruct: CMaterialTypeDescribe,\n      throwError: false,\n    });\n  });\n};\n\nexport type SnippetsCollection = {\n  name: string;\n  list: { name: string; list: SnippetsType[] }[];\n}[];\nexport class CMaterials {\n  private rawData: CMaterialType[];\n  private data: CMaterial[];\n  // 使用过的物料\n  usedMaterials: CMaterial[] = [];\n\n  constructor(data: CMaterialType[]) {\n    this.rawData = data;\n    checkMaterials(data);\n    this.data = parseMaterials(data);\n  }\n\n  addMaterials(data: CMaterialType[]) {\n    const appendMaterial = parseMaterials(data);\n    const updateItemIndex: number[] = [];\n    const newList = this.data.map((el) => {\n      const targetItemIndex = appendMaterial.findIndex((it) => it.componentName === el.componentName);\n      if (targetItemIndex >= 0) {\n        updateItemIndex.push(targetItemIndex);\n        return appendMaterial[targetItemIndex];\n      }\n      return el;\n    });\n    const needAppend = appendMaterial.filter((_el, index) => {\n      return !updateItemIndex.includes(index);\n    });\n\n    this.data = [...newList, ...needAppend];\n  }\n\n  // 使用新的物料整个替换现有的物料列表\n  replaceMaterials(data: CMaterialType[]) {\n    const appendMaterial = parseMaterials(data);\n    this.data = [...appendMaterial];\n  }\n\n  removeMaterial(componentNames: string[]) {\n    const newData = this.data.filter((el) => {\n      return !componentNames.includes(el.componentName);\n    });\n    this.data = newData;\n  }\n\n  findByComponentName(componentName: string) {\n    const target = this.data.find((el) => el.componentName === componentName);\n    return target;\n  }\n\n  findSnippetById(id: string) {\n    const list = [...this.data];\n    let res = null;\n    while (!res && list.length) {\n      const target = list.pop();\n      res = target?.getSnippetById(id);\n    }\n    return res;\n  }\n\n  getAllSnippets() {\n    const allSnippets = this.data.reduce((res, el) => {\n      res.push(...el.snippets);\n      return res;\n    }, [] as SnippetsType[]);\n    const groups: string[] = [];\n    const groupRes: Record<string, SnippetsType[]> = {\n      default: [],\n    };\n\n    // split group\n    allSnippets.forEach((el) => {\n      const groupName = el.groupName || 'default';\n      if (!groups.includes(groupName)) {\n        groups.push(groupName);\n        groupRes[groupName] = [];\n      }\n      groupRes[groupName].push(el);\n    });\n\n    let res: SnippetsCollection = [];\n    groups.forEach((groupName) => {\n      const categories: string[] = ['default'];\n      const categoryRes: Record<string, SnippetsType[]> = {\n        default: [],\n      };\n      const list = groupRes[groupName];\n      if (list.length !== 0) {\n        list.forEach((el) => {\n          const categoryName = el.category || 'default';\n          if (!categories.includes(categoryName)) {\n            categories.push(categoryName);\n            categoryRes[categoryName] = [];\n          }\n          categoryRes[categoryName].push(el);\n        });\n\n        const categoryList: {\n          name: string;\n          list: SnippetsType[];\n        }[] = [];\n        categories.forEach((category) => {\n          if (categoryRes[category].length) {\n            categoryList.push({\n              name: category,\n              list: categoryRes[category],\n            });\n          }\n        });\n\n        const val = {\n          name: groupName,\n          list: categoryList,\n        };\n\n        res.push(val);\n      }\n    });\n\n    res = res.sort((a, b) => {\n      return (a.name || '') > (b.name || '') ? 1 : -1;\n    });\n\n    return res;\n  }\n\n  get value() {\n    return this.data;\n  }\n\n  get rawValue() {\n    return this.rawData;\n  }\n}\n","import { any, array, assign, object, optional, string } from 'superstruct';\nimport { LibMetaType, ThirdLibTypeDescribe, LibMetaTypeDescribe, AssetPackage, CSSType } from './base';\nimport { FunctionPropType } from './node';\nimport { CRootNodeDataType, CRootNodeDataTypeDescribe, FunctionPropertyTypeDescribe } from './rootNode';\nimport type { CNode } from '../Page/RootNode/Node';\nimport type { CPage } from '../Page';\nimport type { CRootNode } from '../Page/RootNode';\n\nexport type ComponentMetaType = {\n  componentName: string;\n} & LibMetaType;\n\nexport enum RenderType {\n  PAGE = 'PAGE',\n  COMPONENT = 'COMPONENT',\n}\n\nexport type LifecycleItem = {\n  nodeId: string;\n  run: (params: { ctx: any }) => void;\n};\n\nexport type CPageDataType<T = any> = {\n  version: string;\n  name: string;\n  // TODO\n  css?: CSSType[];\n  // TODO\n  lifecycle?: {\n    beforeMount?: LifecycleItem[];\n    didMount?: LifecycleItem[];\n    beforeUnmount?: LifecycleItem[];\n  };\n  // TODO\n  /** 页面级 别 或者组件级别的外部传入的 props, 用于数据交互，比如通过平台导出源码，直接集成到 pro code 项目中使用 */\n  props?: Record<string, any>;\n  methods?: FunctionPropType[];\n  componentsMeta: ComponentMetaType[];\n  thirdLibs?: LibMetaType[];\n  componentsTree: CRootNodeDataType;\n  // runtime render need\n  assets?: AssetPackage[];\n  extra?: T;\n};\n\nexport const CPageDataTypeDescribe = object({\n  version: optional(string()),\n  name: optional(string()),\n  css: optional(string()),\n  lifecycle: optional(any()),\n  props: optional(any()),\n  methods: optional(array(FunctionPropertyTypeDescribe)),\n  componentsMeta: array(\n    assign(\n      object({\n        componentName: string(),\n      }),\n      LibMetaTypeDescribe\n    )\n  ),\n  thirdLibs: optional(ThirdLibTypeDescribe),\n  componentsTree: CRootNodeDataTypeDescribe,\n  assets: optional(array(any())),\n  extra: optional(any()),\n});\n\nexport type CPageNode = CNode | CPage | CRootNode;\n","import { checkComplexData } from '../util/dataCheck';\nimport { ComponentMetaType, CPageDataType, CPageDataTypeDescribe } from '../types/page';\nimport { DataModelEmitter, DataModelEmitterType } from '../util/modelEmitter';\nimport { CRootNode } from './RootNode';\nimport { ExportType, ExportTypeEnum } from '../const/schema';\nimport { CMaterials } from '../Material';\nimport { CNode } from './RootNode/Node';\nimport { CNodeDataType } from '../types/node';\nimport { cloneDeep, isPlainObject, omit, unionBy } from 'lodash-es';\nimport { CProp } from './RootNode/Node/prop';\nimport { CSlot } from './RootNode/Node/slot';\nimport { clearSchema, getNode, getRandomStr } from '../util';\nimport { InnerComponentNameEnum } from '../types/rootNode';\nimport { AssetPackage } from '../types/base';\nimport { CMaterialType } from '../types/material';\n\nexport const checkPage = (data: any): CPageDataType => {\n  checkComplexData({\n    data: data,\n    dataStruct: CPageDataTypeDescribe,\n    throwError: false,\n  });\n\n  return data;\n};\n\nexport const parsePage = (data: CPageDataType, parent: CPage, materials: CMaterials) => {\n  return {\n    ...data,\n    componentsTree: new CRootNode(data.componentsTree, {\n      parent: parent,\n      materials,\n    }),\n  };\n};\n\nexport type CPpageDataModelType = Omit<CPageDataType, 'componentsTree'> & {\n  componentsTree: CRootNode;\n};\n\nexport type PosObj = {\n  type: 'CHILD';\n  index: number;\n  pos: 'BEFORE' | 'AFTER';\n};\n\nexport type InsertNodePosType = 'BEFORE' | 'AFTER' | 'CHILD_START' | 'CHILD_END' | PosObj;\n\nexport class CPage {\n  nodeType = 'PAGE' as const;\n  rawData: CPageDataType;\n  emitter: DataModelEmitterType = DataModelEmitter;\n  data: CPpageDataModelType;\n  parent: null | undefined;\n  materialsModel: CMaterials;\n  assetPackagesList: AssetPackage[];\n\n  constructor(\n    data: CPageDataType,\n    options?: {\n      materials?: CMaterialType[];\n      assetPackagesList?: AssetPackage[];\n    }\n  ) {\n    checkPage(data);\n    this.rawData = JSON.parse(JSON.stringify(data));\n    this.materialsModel = new CMaterials(options?.materials || []);\n    this.data = parsePage(data, this, this.materialsModel);\n    this.assetPackagesList = [...(options?.assetPackagesList || []), ...(this.data.assets || [])];\n  }\n\n  updatePage(data: CPageDataType) {\n    const oldData = this.data;\n    this.rawData = JSON.parse(JSON.stringify(data));\n    this.data = parsePage(data, this, this.materialsModel);\n    this.emitter.emit('onPageChange', {\n      value: this.data,\n      preValue: oldData,\n      node: this,\n    });\n  }\n\n  reloadPage(data?: CPageDataType) {\n    const oldData = this.data;\n    if (data) {\n      this.rawData = JSON.parse(JSON.stringify(data));\n      this.data = parsePage(data, this, this.materialsModel);\n    }\n    this.emitter.emit('onReloadPage', {\n      value: this.data,\n      preValue: oldData,\n      node: this,\n    });\n  }\n\n  get value() {\n    return this.data;\n  }\n\n  // moveNode(from, to, pos) {}\n  getNode(id?: string) {\n    if (!id) return undefined;\n    const nodeTree = this.data.componentsTree;\n    return getNode(nodeTree, id);\n  }\n\n  addNode(newNode: CNode, targetNode: CNode | CRootNode, pos: InsertNodePosType = 'AFTER') {\n    if (pos === 'AFTER' || pos === 'BEFORE') {\n      const parentNode = targetNode.parent;\n      // 说明是容器节点, 只能插入 child\n      if (parentNode === null && targetNode instanceof CRootNode) {\n        console.warn('Not found parent node');\n        return false;\n      }\n\n      if (parentNode instanceof CProp) {\n        console.warn('CProp can not add node');\n        return false;\n      }\n      // TODO:\n      if (parentNode instanceof CSlot) {\n        const parentList = parentNode.value.value;\n        // find it on children;\n        const targetIndex = parentList.findIndex((el) => el === targetNode) ?? -1;\n        if (targetIndex >= 0) {\n          if (pos === 'BEFORE') {\n            parentList.splice(targetIndex, 0, newNode);\n          } else {\n            parentList.splice(targetIndex + 1, 0, newNode);\n          }\n          newNode.parent = parentNode;\n          parentNode.parent?.updateValue();\n          return true;\n        }\n        return false;\n      }\n      // TODO:\n      if (parentNode instanceof CPage) {\n        return false;\n      }\n      // find it on children;\n      const targetIndex = parentNode?.value.children.findIndex((el) => el === targetNode) ?? -1;\n      if (targetIndex >= 0) {\n        if (pos === 'BEFORE') {\n          parentNode?.value.children.splice(targetIndex, 0, newNode);\n        } else {\n          parentNode?.value.children.splice(targetIndex + 1, 0, newNode);\n        }\n        newNode.parent = parentNode;\n        parentNode?.updateValue();\n        return true;\n      }\n      console.warn('Not found target node');\n      return false;\n    }\n\n    if (pos === 'CHILD_START') {\n      targetNode.value.children.unshift(newNode);\n      newNode.parent = targetNode;\n      targetNode.updateValue();\n      return true;\n    }\n\n    if (pos === 'CHILD_END') {\n      targetNode.value.children.push(newNode);\n      newNode.parent = targetNode;\n      targetNode.updateValue();\n      return true;\n    }\n\n    if (isPlainObject(pos)) {\n      const posObj = pos as PosObj;\n      if (posObj.type === 'CHILD') {\n        const subPos = posObj.pos;\n        const index = posObj.index || 0;\n        if (subPos === 'BEFORE') {\n          targetNode?.value.children.splice(index, 0, newNode);\n        } else {\n          targetNode?.value.children.splice(index + 1, 0, newNode);\n        }\n        newNode.parent = targetNode;\n        targetNode.updateValue();\n        return true;\n      } else {\n        console.warn('Can not parse pos obj');\n      }\n    }\n    return false;\n  }\n\n  createNode(nodeData: CNodeDataType) {\n    delete nodeData.id;\n    const newNode = new CNode(nodeData, {\n      parent: null,\n      materials: this.materialsModel,\n    });\n    return newNode;\n  }\n\n  addNodeById(newNode: CNode, targetNodeId: string, pos: InsertNodePosType = 'AFTER') {\n    const targetNode = this.getNode(targetNodeId);\n    if (targetNode) {\n      return this.addNode(newNode, targetNode, pos);\n    } else {\n      console.warn(`Not find a node by ${targetNodeId}, pls check it`);\n      return false;\n    }\n  }\n\n  copyNode(node: CNode) {\n    const newNodeData = node.export('design');\n    newNodeData.id = getRandomStr();\n    const newNode = new CNode(newNodeData, {\n      parent: node.parent,\n      materials: this.materialsModel,\n    });\n    this.addNode(newNode, node, 'AFTER');\n    return newNode;\n  }\n\n  copyNodeById(nodeId: string) {\n    const node = this.getNode(nodeId);\n    if (node && node instanceof CNode) {\n      return this.copyNode(node);\n    } else {\n      return false;\n    }\n  }\n\n  moveNode(from: CNode, to: CNode, pos: InsertNodePosType) {\n    this.deleteNode(from);\n    let parent: any = to;\n    const tempTypeList: InsertNodePosType[] = ['AFTER', 'BEFORE'];\n    if (tempTypeList.includes(pos)) {\n      parent = to.parent;\n    }\n    from.parent = parent;\n\n    return this.addNode(from, to, pos);\n  }\n\n  moveNodeById(fromId: string, toId: string, pos: InsertNodePosType) {\n    const from = this.getNode(fromId);\n    const to = this.getNode(toId);\n    if (from && to && from instanceof CNode && to instanceof CNode) {\n      return this.moveNode(from, to, pos);\n    }\n\n    return false;\n  }\n\n  // replaceNode(targetNode, node) {}\n\n  deleteNode(node: CNode | CRootNode) {\n    const parent = node.parent;\n    if (!parent) {\n      throw new Error('parent node is null or undefined, pls check it');\n    }\n\n    if (parent instanceof CSlot) {\n      const childList = parent.value.value;\n      const targetIndex = childList.findIndex((el) => el === node);\n      const deleteNode = childList[targetIndex];\n\n      childList.splice(targetIndex, 1);\n      parent.parent?.updateValue();\n\n      return deleteNode;\n    }\n\n    if (parent instanceof CNode || parent instanceof CRootNode) {\n      const childList = parent.value.children;\n      const targetIndex = childList.findIndex((el) => el === node);\n      const deleteNode = childList[targetIndex];\n\n      childList.splice(targetIndex, 1);\n      parent.updateValue();\n      return deleteNode;\n    }\n  }\n\n  deleteNodeById(nodeId: string) {\n    const node = this.getNode(nodeId);\n    if (node) {\n      return this.deleteNode(node);\n    }\n  }\n\n  export(mode: ExportType = ExportTypeEnum.SAVE): CPageDataType {\n    const componentsTree = this.data.componentsTree.export(mode);\n\n    const assetPackagesList = this.assetPackagesList;\n\n    const finalAssets: AssetPackage[] = [];\n    const componentsMetaList: ComponentMetaType[] = this.materialsModel.usedMaterials.map((it) => {\n      const asset = assetPackagesList.find((el) => {\n        return el.package === it.value.npm?.package;\n      });\n      if (asset) {\n        finalAssets.push(asset);\n      }\n      return {\n        componentName: it.componentName,\n        ...cloneDeep(it.value.npm || {}),\n      } as ComponentMetaType;\n    });\n    // 剔除不合法的 meta\n    const finalComponentsMetaList = componentsMetaList.filter((el) => {\n      if (el.componentName && el.package && el.version) {\n        return true;\n      }\n      console.warn(`${JSON.stringify(el, null, 2)} not a valid material info`);\n      return false;\n    });\n    this.materialsModel.usedMaterials = [];\n    let res: CPageDataType = {\n      ...this.data,\n      componentsTree: clearSchema(componentsTree),\n      componentsMeta: finalComponentsMetaList,\n      thirdLibs: this.data.thirdLibs,\n      assets: [],\n      extra: this.data.extra,\n    };\n\n    this.data.thirdLibs?.forEach((thirdEl) => {\n      const asset = assetPackagesList.find((el) => {\n        return thirdEl.package === el.package;\n      });\n      if (asset) {\n        finalAssets.push(asset);\n      }\n    });\n\n    res.assets = unionBy(finalAssets, (el) => el.package);\n    res = omit(res, ['id']) as any;\n    return JSON.parse(JSON.stringify(res));\n  }\n\n  getRootNode() {\n    return this.data.componentsTree;\n  }\n}\n\nexport const EmptyPage: CPageDataType = {\n  version: '1.0.0',\n  name: 'EmptyPage',\n  componentsMeta: [],\n  componentsTree: {\n    componentName: InnerComponentNameEnum.ROOT_CONTAINER,\n    props: {},\n    children: [],\n  },\n};\n","import { CMaterialEventType } from '../types/material';\n\nexport const DEFAULT_EVENT_LIST: CMaterialEventType[] = [\n  {\n    event: 'onClick',\n  },\n  {\n    event: 'onDoubleClick',\n  },\n  {\n    event: 'onMouseOver',\n  },\n  {\n    event: 'onMouseDown',\n  },\n  {\n    event: 'onMouseUp',\n  },\n  {\n    event: 'onMouseMove',\n  },\n  {\n    event: 'onMouseIn',\n  },\n  {\n    event: 'onMouseOut',\n  },\n  {\n    event: 'onMouseLeave',\n  },\n];\n"]}