utils.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import {
  2. type AttributeNode,
  3. type DirectiveNode,
  4. type ElementNode,
  5. ElementTypes,
  6. NodeTypes,
  7. type SimpleExpressionNode,
  8. type TemplateChildNode,
  9. type TemplateNode,
  10. createSimpleExpression,
  11. } from '@vue/compiler-dom'
  12. import { extend } from '@vue/shared'
  13. import {
  14. type BlockIRNode,
  15. DynamicFlag,
  16. type IRDynamicInfo,
  17. IRNodeTypes,
  18. } from '../ir'
  19. export const newDynamic = (): IRDynamicInfo => ({
  20. flags: DynamicFlag.REFERENCED,
  21. children: [],
  22. })
  23. export const newBlock = (node: BlockIRNode['node']): BlockIRNode => ({
  24. type: IRNodeTypes.BLOCK,
  25. node,
  26. dynamic: newDynamic(),
  27. effect: [],
  28. operation: [],
  29. returns: [],
  30. expressions: [],
  31. tempId: 0,
  32. hasLazyApplyVShow: false,
  33. })
  34. export function wrapTemplate(node: ElementNode, dirs: string[]): TemplateNode {
  35. if (node.tagType === ElementTypes.TEMPLATE) {
  36. return node
  37. }
  38. const reserved: Array<AttributeNode | DirectiveNode> = []
  39. const pass: Array<AttributeNode | DirectiveNode> = []
  40. node.props.forEach(prop => {
  41. if (prop.type === NodeTypes.DIRECTIVE && dirs.includes(prop.name)) {
  42. reserved.push(prop)
  43. } else {
  44. pass.push(prop)
  45. }
  46. })
  47. return extend({}, node, {
  48. type: NodeTypes.ELEMENT,
  49. tag: 'template',
  50. props: reserved,
  51. tagType: ElementTypes.TEMPLATE,
  52. children: [extend({}, node, { props: pass } as TemplateChildNode)],
  53. } as Partial<TemplateNode>)
  54. }
  55. export const EMPTY_EXPRESSION: SimpleExpressionNode = createSimpleExpression(
  56. '',
  57. true,
  58. )