{"version":3,"file":"vnode.mjs","sources":["../../../../packages/utils/vnode.ts"],"sourcesContent":["import {\n  Fragment,\n  Text,\n  Comment,\n  createBlock,\n  openBlock,\n  createCommentVNode,\n  isVNode,\n  camelize,\n} from 'vue'\n\nimport { hasOwn } from '@vue/shared'\nimport { debugWarn } from './error'\nimport type { VNode, VNodeTypes, VNodeChild } from 'vue'\n\ntype Children = VNodeTypes[] | VNodeTypes\n\nconst TEMPLATE = 'template'\n\nexport const SCOPE = 'VNode'\n\nexport enum PatchFlags {\n  TEXT = 1,\n  CLASS = 2,\n  STYLE = 4,\n  PROPS = 8,\n  FULL_PROPS = 16,\n  HYDRATE_EVENTS = 32,\n  STABLE_FRAGMENT = 64,\n  KEYED_FRAGMENT = 128,\n  UNKEYED_FRAGMENT = 256,\n  NEED_PATCH = 512,\n  DYNAMIC_SLOTS = 1024,\n  HOISTED = -1,\n  BAIL = -2,\n}\n\nexport const isFragment = (node: unknown): node is VNode =>\n  isVNode(node) && node.type === Fragment\n\nexport const isText = (node: VNodeChild) => (node as VNode).type === Text\n\nexport const isComment = (node: VNodeChild) => (node as VNode).type === Comment\n\nexport const isTemplate = (node: VNodeChild) =>\n  (node as VNode).type === TEMPLATE\n\n/**\n * get a valid child node (not fragment nor comment)\n * @param node {VNode} node to be searched\n * @param depth {number} depth to be searched\n */\nfunction getChildren(node: VNode, depth: number): undefined | VNode {\n  if (isComment(node)) return\n  if (isFragment(node) || isTemplate(node)) {\n    return depth > 0\n      ? getFirstValidNode(node.children as VNodeChild, depth - 1)\n      : undefined\n  }\n  return node\n}\n\n/**\n * determine if the element is a valid element type rather than fragments and comment e.g. <template> v-if\n * @param node {VNode} node to be tested\n */\nexport const isValidElementNode = (node: unknown): node is VNode =>\n  isVNode(node) && !isFragment(node) && !isComment(node)\n\nexport const getFirstValidNode = (\n  nodes: VNodeChild,\n  maxDepth = 3\n): ReturnType<typeof getChildren> => {\n  if (Array.isArray(nodes)) {\n    return getChildren(nodes[0] as VNode, maxDepth)\n  } else {\n    return getChildren(nodes as VNode, maxDepth)\n  }\n}\n\nexport function renderIf(\n  condition: boolean,\n  node: VNodeTypes,\n  props: any,\n  children?: Children,\n  patchFlag?: number,\n  patchProps?: string[]\n) {\n  return condition\n    ? renderBlock(node, props, children, patchFlag, patchProps)\n    : createCommentVNode('v-if', true)\n}\n\nexport function renderBlock(\n  node: VNodeTypes,\n  props: any,\n  children?: Children,\n  patchFlag?: number,\n  patchProps?: string[]\n) {\n  return openBlock(), createBlock(node, props, children, patchFlag, patchProps)\n}\n\n/**\n * todo\n * get normalized props from VNode\n * @param node\n */\nexport const getNormalizedProps = (node: VNode) => {\n  if (!isVNode(node)) {\n    debugWarn(SCOPE, 'value must be a VNode')\n    return\n  }\n\n  const raw = node.props || {}\n  const type = (node.type as any).props || {}\n  const props = {} as any\n\n  Object.keys(type).forEach((key) => {\n    if (hasOwn(type[key], 'default')) {\n      props[key] = type[key].default\n    }\n  })\n\n  Object.keys(raw).forEach((key) => {\n    props[camelize(key)] = raw[key]\n  })\n\n  return props\n}\n"],"names":[],"mappings":";;;;AAiBA,MAAM,WAAW;MAEJ,QAAQ;IAET;AAAL,UAAK,aAAL;AACL,oCAAO,KAAP;AACA,qCAAQ,KAAR;AACA,qCAAQ,KAAR;AACA,qCAAQ,KAAR;AACA,0CAAa,MAAb;AACA,8CAAiB,MAAjB;AACA,+CAAkB,MAAlB;AACA,8CAAiB,OAAjB;AACA,gDAAmB,OAAnB;AACA,0CAAa,OAAb;AACA,6CAAgB,QAAhB;AACA,uCAAU,MAAV;AACA,oCAAO,MAAP;AAAA,GAbU;MAgBC,aAAa,CAAC,SACzB,QAAQ,SAAS,KAAK,SAAS;MAEpB,SAAS,CAAC,SAAsB,KAAe,SAAS;MAExD,YAAY,CAAC,SAAsB,KAAe,SAAS;MAE3D,aAAa,CAAC,SACxB,KAAe,SAAS;AAO3B,qBAAqB,MAAa,OAAkC;AAClE,MAAI,UAAU;AAAO;AACrB,MAAI,WAAW,SAAS,WAAW,OAAO;AACxC,WAAO,QAAQ,IACX,kBAAkB,KAAK,UAAwB,QAAQ,KACvD;AAAA;AAEN,SAAO;AAAA;MAOI,qBAAqB,CAAC,SACjC,QAAQ,SAAS,CAAC,WAAW,SAAS,CAAC,UAAU;MAEtC,oBAAoB,CAC/B,OACA,WAAW,MACwB;AACnC,MAAI,MAAM,QAAQ,QAAQ;AACxB,WAAO,YAAY,MAAM,IAAa;AAAA,SACjC;AACL,WAAO,YAAY,OAAgB;AAAA;AAAA;kBAKrC,WACA,MACA,OACA,UACA,WACA,YACA;AACA,SAAO,YACH,YAAY,MAAM,OAAO,UAAU,WAAW,cAC9C,mBAAmB,QAAQ;AAAA;qBAI/B,MACA,OACA,UACA,WACA,YACA;AACA,SAAO,aAAa,YAAY,MAAM,OAAO,UAAU,WAAW;AAAA;MAQvD,qBAAqB,CAAC,SAAgB;AACjD,MAAI,CAAC,QAAQ,OAAO;AAClB,cAAU,OAAO;AACjB;AAAA;AAGF,QAAM,MAAM,KAAK,SAAS;AAC1B,QAAM,OAAQ,KAAK,KAAa,SAAS;AACzC,QAAM,QAAQ;AAEd,SAAO,KAAK,MAAM,QAAQ,CAAC,QAAQ;AACjC,QAAI,OAAO,KAAK,MAAM,YAAY;AAChC,YAAM,OAAO,KAAK,KAAK;AAAA;AAAA;AAI3B,SAAO,KAAK,KAAK,QAAQ,CAAC,QAAQ;AAChC,UAAM,SAAS,QAAQ,IAAI;AAAA;AAG7B,SAAO;AAAA;;;;"}