ir.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import type {
  2. CompoundExpressionNode,
  3. DirectiveNode,
  4. RootNode,
  5. SimpleExpressionNode,
  6. SourceLocation,
  7. } from '@vue/compiler-dom'
  8. import type { Prettify } from '@vue/shared'
  9. import type { DirectiveTransform, NodeTransform } from './transform'
  10. export enum IRNodeTypes {
  11. ROOT,
  12. TEMPLATE_FACTORY,
  13. FRAGMENT_FACTORY,
  14. SET_PROP,
  15. SET_TEXT,
  16. SET_EVENT,
  17. SET_HTML,
  18. INSERT_NODE,
  19. PREPEND_NODE,
  20. APPEND_NODE,
  21. CREATE_TEXT_NODE,
  22. WITH_DIRECTIVE,
  23. }
  24. export interface BaseIRNode {
  25. type: IRNodeTypes
  26. loc: SourceLocation
  27. }
  28. // TODO refactor
  29. export type VaporHelper = keyof typeof import('../../runtime-vapor/src')
  30. export interface RootIRNode extends BaseIRNode {
  31. type: IRNodeTypes.ROOT
  32. source: string
  33. node: RootNode
  34. template: Array<TemplateFactoryIRNode | FragmentFactoryIRNode>
  35. dynamic: IRDynamicInfo
  36. effect: IREffect[]
  37. operation: OperationNode[]
  38. helpers: Set<string>
  39. vaporHelpers: Set<VaporHelper>
  40. }
  41. export interface TemplateFactoryIRNode extends BaseIRNode {
  42. type: IRNodeTypes.TEMPLATE_FACTORY
  43. template: string
  44. }
  45. export interface FragmentFactoryIRNode extends BaseIRNode {
  46. type: IRNodeTypes.FRAGMENT_FACTORY
  47. }
  48. export interface SetPropIRNode extends BaseIRNode {
  49. type: IRNodeTypes.SET_PROP
  50. element: number
  51. key: IRExpression
  52. value: IRExpression
  53. runtimeCamelize: boolean
  54. }
  55. export interface SetTextIRNode extends BaseIRNode {
  56. type: IRNodeTypes.SET_TEXT
  57. element: number
  58. value: IRExpression
  59. }
  60. export type KeyOverride = [find: string, replacement: string]
  61. export interface SetEventIRNode extends BaseIRNode {
  62. type: IRNodeTypes.SET_EVENT
  63. element: number
  64. key: IRExpression
  65. value?: SimpleExpressionNode
  66. modifiers: {
  67. // modifiers for addEventListener() options, e.g. .passive & .capture
  68. options: string[]
  69. // modifiers that needs runtime guards, withKeys
  70. keys: string[]
  71. // modifiers that needs runtime guards, withModifiers
  72. nonKeys: string[]
  73. }
  74. keyOverride?: KeyOverride
  75. }
  76. export interface SetHtmlIRNode extends BaseIRNode {
  77. type: IRNodeTypes.SET_HTML
  78. element: number
  79. value: IRExpression
  80. }
  81. export interface CreateTextNodeIRNode extends BaseIRNode {
  82. type: IRNodeTypes.CREATE_TEXT_NODE
  83. id: number
  84. value: IRExpression
  85. }
  86. export interface InsertNodeIRNode extends BaseIRNode {
  87. type: IRNodeTypes.INSERT_NODE
  88. element: number | number[]
  89. parent: number
  90. anchor: number
  91. }
  92. export interface PrependNodeIRNode extends BaseIRNode {
  93. type: IRNodeTypes.PREPEND_NODE
  94. elements: number[]
  95. parent: number
  96. }
  97. export interface AppendNodeIRNode extends BaseIRNode {
  98. type: IRNodeTypes.APPEND_NODE
  99. elements: number[]
  100. parent: number
  101. }
  102. export interface WithDirectiveIRNode extends BaseIRNode {
  103. type: IRNodeTypes.WITH_DIRECTIVE
  104. element: number
  105. dir: VaporDirectiveNode
  106. }
  107. export type IRNode =
  108. | OperationNode
  109. | RootIRNode
  110. | TemplateFactoryIRNode
  111. | FragmentFactoryIRNode
  112. export type OperationNode =
  113. | SetPropIRNode
  114. | SetTextIRNode
  115. | SetEventIRNode
  116. | SetHtmlIRNode
  117. | CreateTextNodeIRNode
  118. | InsertNodeIRNode
  119. | PrependNodeIRNode
  120. | AppendNodeIRNode
  121. | WithDirectiveIRNode
  122. export interface IRDynamicInfo {
  123. id: number | null
  124. referenced: boolean
  125. /** created by DOM API */
  126. ghost: boolean
  127. placeholder: number | null
  128. children: IRDynamicChildren
  129. }
  130. export type IRDynamicChildren = Record<number, IRDynamicInfo>
  131. export type IRExpression = SimpleExpressionNode | string
  132. export interface IREffect {
  133. // TODO multi-expression effect
  134. expressions: IRExpression[]
  135. operations: OperationNode[]
  136. }
  137. type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> &
  138. Pick<U, Extract<keyof U, keyof T>>
  139. export type HackOptions<T> = Prettify<
  140. Overwrite<
  141. T,
  142. {
  143. nodeTransforms?: NodeTransform[]
  144. directiveTransforms?: Record<string, DirectiveTransform | undefined>
  145. }
  146. >
  147. >
  148. export type VaporDirectiveNode = Overwrite<
  149. DirectiveNode,
  150. {
  151. exp: Exclude<DirectiveNode['exp'], CompoundExpressionNode>
  152. arg: Exclude<DirectiveNode['arg'], CompoundExpressionNode>
  153. }
  154. >