vue 2.6.13 → 2.7.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +17 -295
  2. package/compiler-sfc/index.d.ts +1 -0
  3. package/compiler-sfc/index.js +1 -0
  4. package/compiler-sfc/index.mjs +1 -0
  5. package/compiler-sfc/package.json +5 -0
  6. package/dist/vue.common.dev.js +11481 -11946
  7. package/dist/vue.common.prod.js +8 -3
  8. package/dist/vue.esm.browser.js +11321 -12011
  9. package/dist/vue.esm.browser.min.js +8 -3
  10. package/dist/vue.esm.js +11476 -11984
  11. package/dist/vue.js +11484 -11949
  12. package/dist/vue.min.js +8 -3
  13. package/dist/vue.runtime.common.dev.js +8427 -8421
  14. package/dist/vue.runtime.common.prod.js +8 -3
  15. package/dist/vue.runtime.esm.js +8436 -8454
  16. package/dist/vue.runtime.js +8430 -8424
  17. package/dist/vue.runtime.min.js +8 -3
  18. package/package.json +88 -111
  19. package/packages/compiler-sfc/dist/compiler-sfc.js +7 -0
  20. package/packages/compiler-sfc/node_modules/.bin/parser +17 -0
  21. package/packages/compiler-sfc/node_modules/.bin/sass +17 -0
  22. package/packages/compiler-sfc/package.json +30 -0
  23. package/src/compiler/{codeframe.js → codeframe.ts} +9 -7
  24. package/src/compiler/codegen/{events.js → events.ts} +21 -41
  25. package/src/compiler/codegen/{index.js → index.ts} +146 -136
  26. package/src/compiler/{create-compiler.js → create-compiler.ts} +26 -18
  27. package/src/compiler/directives/bind.ts +9 -0
  28. package/src/compiler/directives/{index.js → index.ts} +0 -2
  29. package/src/compiler/directives/{model.js → model.ts} +15 -18
  30. package/src/compiler/directives/{on.js → on.ts} +3 -4
  31. package/src/compiler/{error-detector.js → error-detector.ts} +61 -31
  32. package/src/compiler/{helpers.js → helpers.ts} +73 -61
  33. package/src/compiler/{index.js → index.ts} +2 -3
  34. package/src/compiler/{optimizer.js → optimizer.ts} +30 -23
  35. package/src/compiler/parser/{entity-decoder.js → entity-decoder.ts} +1 -3
  36. package/src/compiler/parser/{filter-parser.js → filter-parser.ts} +43 -24
  37. package/src/compiler/parser/{html-parser.js → html-parser.ts} +50 -29
  38. package/src/compiler/parser/{index.js → index.ts} +190 -172
  39. package/src/compiler/parser/{text-parser.js → text-parser.ts} +8 -9
  40. package/src/compiler/{to-function.js → to-function.ts} +27 -22
  41. package/src/core/components/{index.js → index.ts} +0 -0
  42. package/src/core/components/{keep-alive.js → keep-alive.ts} +42 -30
  43. package/src/core/{config.js → config.ts} +28 -30
  44. package/src/core/global-api/{assets.js → assets.ts} +8 -7
  45. package/src/core/global-api/{extend.js → extend.ts} +10 -13
  46. package/src/core/global-api/{index.js → index.ts} +4 -5
  47. package/src/core/global-api/{mixin.js → mixin.ts} +2 -3
  48. package/src/core/global-api/use.ts +23 -0
  49. package/src/core/{index.js → index.ts} +1 -1
  50. package/src/core/instance/{events.js → events.ts} +41 -24
  51. package/src/core/instance/{index.js → index.ts} +9 -5
  52. package/src/core/instance/{init.js → init.ts} +26 -15
  53. package/src/core/instance/inject.ts +72 -0
  54. package/src/core/instance/{lifecycle.js → lifecycle.ts} +86 -44
  55. package/src/core/instance/{proxy.js → proxy.ts} +29 -24
  56. package/src/core/instance/render-helpers/{bind-dynamic-keys.js → bind-dynamic-keys.ts} +6 -5
  57. package/src/core/instance/render-helpers/{bind-object-listeners.js → bind-object-listeners.ts} +4 -8
  58. package/src/core/instance/render-helpers/{bind-object-props.js → bind-object-props.ts} +12 -17
  59. package/src/core/instance/render-helpers/{check-keycodes.js → check-keycodes.ts} +5 -7
  60. package/src/core/instance/render-helpers/{index.js → index.ts} +1 -3
  61. package/src/core/instance/render-helpers/{render-list.js → render-list.ts} +12 -13
  62. package/src/core/instance/render-helpers/{render-slot.js → render-slot.ts} +10 -11
  63. package/src/core/instance/render-helpers/{render-static.js → render-static.ts} +7 -10
  64. package/src/core/instance/render-helpers/{resolve-filter.js → resolve-filter.ts} +1 -3
  65. package/src/core/instance/render-helpers/{resolve-scoped-slots.js → resolve-scoped-slots.ts} +11 -8
  66. package/src/core/instance/render-helpers/{resolve-slots.js → resolve-slots.ts} +12 -11
  67. package/src/core/instance/{render.js → render.ts} +66 -29
  68. package/src/core/instance/{state.js → state.ts} +100 -83
  69. package/src/core/observer/{array.js → array.ts} +11 -2
  70. package/src/core/observer/{dep.js → dep.ts} +37 -15
  71. package/src/core/observer/{index.js → index.ts} +137 -71
  72. package/src/core/observer/{scheduler.js → scheduler.ts} +42 -43
  73. package/src/core/observer/{traverse.js → traverse.ts} +10 -7
  74. package/src/core/observer/{watcher.js → watcher.ts} +88 -60
  75. package/src/core/util/{debug.js → debug.ts} +38 -34
  76. package/src/core/util/{env.js → env.ts} +27 -30
  77. package/src/core/util/{error.js → error.ts} +12 -14
  78. package/src/core/util/{index.js → index.ts} +0 -2
  79. package/src/core/util/{lang.js → lang.ts} +6 -7
  80. package/src/core/util/{next-tick.js → next-tick.ts} +16 -10
  81. package/src/core/util/{options.js → options.ts} +119 -114
  82. package/src/core/util/{perf.js → perf.ts} +5 -1
  83. package/src/core/util/{props.js → props.ts} +54 -50
  84. package/src/core/vdom/{create-component.js → create-component.ts} +51 -50
  85. package/src/core/vdom/{create-element.js → create-element.ts} +49 -43
  86. package/src/core/vdom/{create-functional-component.js → create-functional-component.ts} +52 -27
  87. package/src/core/vdom/helpers/{extract-props.js → extract-props.ts} +18 -18
  88. package/src/core/vdom/helpers/{get-first-component-child.js → get-first-component-child.ts} +6 -5
  89. package/src/core/vdom/helpers/{index.js → index.ts} +0 -2
  90. package/src/core/vdom/helpers/is-async-placeholder.ts +6 -0
  91. package/src/core/vdom/helpers/{merge-hook.js → merge-hook.ts} +7 -5
  92. package/src/core/vdom/helpers/{normalize-children.js → normalize-children.ts} +26 -16
  93. package/src/core/vdom/helpers/{normalize-scoped-slots.js → normalize-scoped-slots.ts} +23 -17
  94. package/src/core/vdom/helpers/{resolve-async-component.js → resolve-async-component.ts} +29 -37
  95. package/src/core/vdom/helpers/update-listeners.ts +101 -0
  96. package/src/core/vdom/modules/{directives.js → directives.ts} +20 -14
  97. package/src/core/vdom/modules/index.ts +4 -0
  98. package/src/core/vdom/modules/template-ref.ts +96 -0
  99. package/src/core/vdom/{patch.js → patch.ts} +239 -138
  100. package/src/core/vdom/{vnode.js → vnode.ts} +36 -31
  101. package/src/global.d.ts +15 -0
  102. package/src/platforms/web/compiler/directives/html.ts +8 -0
  103. package/src/platforms/web/compiler/directives/{index.js → index.ts} +0 -0
  104. package/src/platforms/web/compiler/directives/{model.js → model.ts} +47 -41
  105. package/src/platforms/web/compiler/directives/{text.js → text.ts} +2 -3
  106. package/src/platforms/web/compiler/{index.js → index.ts} +0 -2
  107. package/src/platforms/web/compiler/modules/{class.js → class.ts} +10 -15
  108. package/src/platforms/web/compiler/modules/{index.js → index.ts} +1 -5
  109. package/src/platforms/web/compiler/modules/{model.js → model.ts} +6 -11
  110. package/src/platforms/web/compiler/modules/{style.js → style.ts} +9 -14
  111. package/src/platforms/web/compiler/{options.js → options.ts} +1 -2
  112. package/src/platforms/web/compiler/{util.js → util.ts} +5 -7
  113. package/src/platforms/web/entry-compiler-sfc.ts +1 -0
  114. package/src/platforms/web/{entry-compiler.js → entry-compiler.ts} +1 -3
  115. package/src/platforms/web/{entry-runtime.js → entry-runtime-esm.ts} +2 -2
  116. package/src/platforms/web/entry-runtime-with-compiler-esm.ts +5 -0
  117. package/src/platforms/web/entry-runtime-with-compiler.ts +10 -0
  118. package/src/platforms/web/entry-runtime.ts +7 -0
  119. package/src/platforms/web/runtime/{class-util.js → class-util.ts} +2 -4
  120. package/src/platforms/web/runtime/components/{index.js → index.ts} +0 -0
  121. package/src/platforms/web/runtime/components/{transition-group.js → transition-group.ts} +59 -46
  122. package/src/platforms/web/runtime/components/{transition.js → transition.ts} +43 -36
  123. package/src/platforms/web/runtime/directives/{index.js → index.ts} +0 -0
  124. package/src/platforms/web/runtime/directives/{model.js → model.ts} +22 -21
  125. package/src/platforms/web/runtime/directives/{show.js → show.ts} +11 -10
  126. package/src/platforms/web/runtime/{index.js → index.ts} +9 -10
  127. package/src/platforms/web/runtime/modules/{attrs.js → attrs.ts} +12 -16
  128. package/src/platforms/web/runtime/modules/{class.js → class.ts} +7 -18
  129. package/src/platforms/web/runtime/modules/{dom-props.js → dom-props.ts} +24 -17
  130. package/src/platforms/web/runtime/modules/{events.js → events.ts} +22 -15
  131. package/src/platforms/web/runtime/modules/{index.js → index.ts} +1 -8
  132. package/src/platforms/web/runtime/modules/{style.js → style.ts} +24 -13
  133. package/src/platforms/web/runtime/modules/{transition.js → transition.ts} +61 -63
  134. package/src/platforms/web/runtime/node-ops.ts +66 -0
  135. package/src/platforms/web/runtime/{patch.js → patch.ts} +0 -2
  136. package/src/platforms/web/runtime/{transition-util.js → transition-util.ts} +63 -38
  137. package/src/platforms/web/{entry-runtime-with-compiler.js → runtime-with-compiler.ts} +28 -19
  138. package/src/platforms/web/util/{attrs.js → attrs.ts} +18 -14
  139. package/src/platforms/web/util/{class.js → class.ts} +23 -21
  140. package/src/platforms/web/util/{compat.js → compat.ts} +4 -4
  141. package/src/platforms/web/util/{element.js → element.ts} +21 -22
  142. package/src/platforms/web/util/{index.js → index.ts} +2 -6
  143. package/src/platforms/web/util/{style.js → style.ts} +12 -12
  144. package/src/sfc/{parser.js → parser.ts} +18 -15
  145. package/src/shared/{constants.js → constants.ts} +2 -6
  146. package/src/shared/{util.js → util.ts} +78 -55
  147. package/src/types/compiler.ts +224 -0
  148. package/src/types/component.ts +209 -0
  149. package/src/types/global-api.ts +37 -0
  150. package/src/types/modules.d.ts +15 -0
  151. package/src/types/options.ts +120 -0
  152. package/src/types/ssr.ts +27 -0
  153. package/src/types/utils.ts +3 -0
  154. package/src/types/vnode.ts +127 -0
  155. package/src/v3/apiInject.ts +66 -0
  156. package/src/v3/apiLifecycle.ts +53 -0
  157. package/src/v3/apiSetup.ts +161 -0
  158. package/src/v3/apiWatch.ts +355 -0
  159. package/src/v3/currentInstance.ts +23 -0
  160. package/src/v3/debug.ts +21 -0
  161. package/src/v3/h.ts +18 -0
  162. package/src/v3/index.ts +77 -0
  163. package/src/v3/reactivity/computed.ts +100 -0
  164. package/src/v3/reactivity/effect.ts +20 -0
  165. package/src/v3/reactivity/effectScope.ts +134 -0
  166. package/src/v3/reactivity/operations.ts +14 -0
  167. package/src/v3/reactivity/reactive.ts +123 -0
  168. package/src/v3/reactivity/readonly.ts +121 -0
  169. package/src/v3/reactivity/ref.ts +249 -0
  170. package/types/index.d.ts +10 -13
  171. package/types/options.d.ts +265 -132
  172. package/types/plugin.d.ts +4 -4
  173. package/types/umd.d.ts +47 -27
  174. package/types/v3-generated.d.ts +389 -0
  175. package/types/v3.d.ts +16 -0
  176. package/types/vnode.d.ts +70 -57
  177. package/types/vue.d.ts +292 -88
  178. package/dist/README.md +0 -122
  179. package/src/compiler/directives/bind.js +0 -11
  180. package/src/core/global-api/use.js +0 -23
  181. package/src/core/instance/inject.js +0 -73
  182. package/src/core/vdom/helpers/is-async-placeholder.js +0 -5
  183. package/src/core/vdom/helpers/update-listeners.js +0 -95
  184. package/src/core/vdom/modules/index.js +0 -7
  185. package/src/core/vdom/modules/ref.js +0 -45
  186. package/src/platforms/web/compiler/directives/html.js +0 -9
  187. package/src/platforms/web/entry-server-basic-renderer.js +0 -13
  188. package/src/platforms/web/entry-server-renderer.js +0 -27
  189. package/src/platforms/web/runtime/node-ops.js +0 -59
  190. package/src/platforms/web/server/compiler.js +0 -11
  191. package/src/platforms/web/server/directives/index.js +0 -7
  192. package/src/platforms/web/server/directives/model.js +0 -44
  193. package/src/platforms/web/server/directives/show.js +0 -12
  194. package/src/platforms/web/server/modules/attrs.js +0 -67
  195. package/src/platforms/web/server/modules/class.js +0 -11
  196. package/src/platforms/web/server/modules/dom-props.js +0 -50
  197. package/src/platforms/web/server/modules/index.js +0 -11
  198. package/src/platforms/web/server/modules/style.js +0 -41
  199. package/src/platforms/web/server/util.js +0 -101
  200. package/src/platforms/weex/compiler/directives/index.js +0 -5
  201. package/src/platforms/weex/compiler/directives/model.js +0 -33
  202. package/src/platforms/weex/compiler/index.js +0 -52
  203. package/src/platforms/weex/compiler/modules/append.js +0 -27
  204. package/src/platforms/weex/compiler/modules/class.js +0 -74
  205. package/src/platforms/weex/compiler/modules/index.js +0 -13
  206. package/src/platforms/weex/compiler/modules/props.js +0 -37
  207. package/src/platforms/weex/compiler/modules/recycle-list/component-root.js +0 -13
  208. package/src/platforms/weex/compiler/modules/recycle-list/component.js +0 -16
  209. package/src/platforms/weex/compiler/modules/recycle-list/index.js +0 -60
  210. package/src/platforms/weex/compiler/modules/recycle-list/recycle-list.js +0 -50
  211. package/src/platforms/weex/compiler/modules/recycle-list/text.js +0 -23
  212. package/src/platforms/weex/compiler/modules/recycle-list/v-bind.js +0 -21
  213. package/src/platforms/weex/compiler/modules/recycle-list/v-for.js +0 -33
  214. package/src/platforms/weex/compiler/modules/recycle-list/v-if.js +0 -63
  215. package/src/platforms/weex/compiler/modules/recycle-list/v-on.js +0 -25
  216. package/src/platforms/weex/compiler/modules/recycle-list/v-once.js +0 -19
  217. package/src/platforms/weex/compiler/modules/style.js +0 -87
  218. package/src/platforms/weex/entry-compiler.js +0 -2
  219. package/src/platforms/weex/entry-framework.js +0 -187
  220. package/src/platforms/weex/entry-runtime-factory.js +0 -6
  221. package/src/platforms/weex/runtime/components/index.js +0 -9
  222. package/src/platforms/weex/runtime/components/richtext.js +0 -82
  223. package/src/platforms/weex/runtime/components/transition-group.js +0 -148
  224. package/src/platforms/weex/runtime/components/transition.js +0 -9
  225. package/src/platforms/weex/runtime/directives/index.js +0 -2
  226. package/src/platforms/weex/runtime/index.js +0 -42
  227. package/src/platforms/weex/runtime/modules/attrs.js +0 -44
  228. package/src/platforms/weex/runtime/modules/class.js +0 -76
  229. package/src/platforms/weex/runtime/modules/events.js +0 -54
  230. package/src/platforms/weex/runtime/modules/index.js +0 -13
  231. package/src/platforms/weex/runtime/modules/style.js +0 -84
  232. package/src/platforms/weex/runtime/modules/transition.js +0 -270
  233. package/src/platforms/weex/runtime/node-ops.js +0 -91
  234. package/src/platforms/weex/runtime/patch.js +0 -16
  235. package/src/platforms/weex/runtime/recycle-list/render-component-template.js +0 -34
  236. package/src/platforms/weex/runtime/recycle-list/virtual-component.js +0 -136
  237. package/src/platforms/weex/runtime/text-node.js +0 -9
  238. package/src/platforms/weex/util/element.js +0 -52
  239. package/src/platforms/weex/util/index.js +0 -40
  240. package/src/platforms/weex/util/parser.js +0 -60
  241. package/src/server/bundle-renderer/create-bundle-renderer.js +0 -151
  242. package/src/server/bundle-renderer/create-bundle-runner.js +0 -150
  243. package/src/server/bundle-renderer/source-map-support.js +0 -45
  244. package/src/server/create-basic-renderer.js +0 -37
  245. package/src/server/create-renderer.js +0 -152
  246. package/src/server/optimizing-compiler/codegen.js +0 -264
  247. package/src/server/optimizing-compiler/index.js +0 -20
  248. package/src/server/optimizing-compiler/modules.js +0 -124
  249. package/src/server/optimizing-compiler/optimizer.js +0 -141
  250. package/src/server/optimizing-compiler/runtime-helpers.js +0 -150
  251. package/src/server/render-context.js +0 -130
  252. package/src/server/render-stream.js +0 -95
  253. package/src/server/render.js +0 -437
  254. package/src/server/template-renderer/create-async-file-mapper.js +0 -57
  255. package/src/server/template-renderer/index.js +0 -277
  256. package/src/server/template-renderer/parse-template.js +0 -42
  257. package/src/server/template-renderer/template-stream.js +0 -82
  258. package/src/server/util.js +0 -18
  259. package/src/server/webpack-plugin/client.js +0 -65
  260. package/src/server/webpack-plugin/server.js +0 -66
  261. package/src/server/webpack-plugin/util.js +0 -34
  262. package/src/server/write.js +0 -50
@@ -0,0 +1,101 @@
1
+ import { warn, invokeWithErrorHandling } from 'core/util/index'
2
+ import { cached, isUndef, isTrue, isArray } from 'shared/util'
3
+ import type { Component } from 'types/component'
4
+
5
+ const normalizeEvent = cached(
6
+ (
7
+ name: string
8
+ ): {
9
+ name: string
10
+ once: boolean
11
+ capture: boolean
12
+ passive: boolean
13
+ handler?: Function
14
+ params?: Array<any>
15
+ } => {
16
+ const passive = name.charAt(0) === '&'
17
+ name = passive ? name.slice(1) : name
18
+ const once = name.charAt(0) === '~' // Prefixed last, checked first
19
+ name = once ? name.slice(1) : name
20
+ const capture = name.charAt(0) === '!'
21
+ name = capture ? name.slice(1) : name
22
+ return {
23
+ name,
24
+ once,
25
+ capture,
26
+ passive
27
+ }
28
+ }
29
+ )
30
+
31
+ export function createFnInvoker(
32
+ fns: Function | Array<Function>,
33
+ vm?: Component
34
+ ): Function {
35
+ function invoker() {
36
+ const fns = invoker.fns
37
+ if (isArray(fns)) {
38
+ const cloned = fns.slice()
39
+ for (let i = 0; i < cloned.length; i++) {
40
+ invokeWithErrorHandling(
41
+ cloned[i],
42
+ null,
43
+ arguments as any,
44
+ vm,
45
+ `v-on handler`
46
+ )
47
+ }
48
+ } else {
49
+ // return handler return value for single handlers
50
+ return invokeWithErrorHandling(
51
+ fns,
52
+ null,
53
+ arguments as any,
54
+ vm,
55
+ `v-on handler`
56
+ )
57
+ }
58
+ }
59
+ invoker.fns = fns
60
+ return invoker
61
+ }
62
+
63
+ export function updateListeners(
64
+ on: Object,
65
+ oldOn: Object,
66
+ add: Function,
67
+ remove: Function,
68
+ createOnceHandler: Function,
69
+ vm: Component
70
+ ) {
71
+ let name, cur, old, event
72
+ for (name in on) {
73
+ cur = on[name]
74
+ old = oldOn[name]
75
+ event = normalizeEvent(name)
76
+ if (isUndef(cur)) {
77
+ __DEV__ &&
78
+ warn(
79
+ `Invalid handler for event "${event.name}": got ` + String(cur),
80
+ vm
81
+ )
82
+ } else if (isUndef(old)) {
83
+ if (isUndef(cur.fns)) {
84
+ cur = on[name] = createFnInvoker(cur, vm)
85
+ }
86
+ if (isTrue(event.once)) {
87
+ cur = on[name] = createOnceHandler(event.name, cur, event.capture)
88
+ }
89
+ add(event.name, cur, event.capture, event.passive, event.params)
90
+ } else if (cur !== old) {
91
+ old.fns = cur
92
+ on[name] = old
93
+ }
94
+ }
95
+ for (name in oldOn) {
96
+ if (isUndef(on[name])) {
97
+ event = normalizeEvent(name)
98
+ remove(event.name, oldOn[name], event.capture)
99
+ }
100
+ }
101
+ }
@@ -1,31 +1,35 @@
1
- /* @flow */
2
-
3
1
  import { emptyNode } from 'core/vdom/patch'
4
2
  import { resolveAsset, handleError } from 'core/util/index'
5
3
  import { mergeVNodeHook } from 'core/vdom/helpers/index'
4
+ import type { VNodeDirective, VNodeWithData } from 'types/vnode'
5
+ import type { Component } from 'types/component'
6
6
 
7
7
  export default {
8
8
  create: updateDirectives,
9
9
  update: updateDirectives,
10
- destroy: function unbindDirectives (vnode: VNodeWithData) {
10
+ destroy: function unbindDirectives(vnode: VNodeWithData) {
11
+ // @ts-expect-error emptyNode is not VNodeWithData
11
12
  updateDirectives(vnode, emptyNode)
12
13
  }
13
14
  }
14
15
 
15
- function updateDirectives (oldVnode: VNodeWithData, vnode: VNodeWithData) {
16
+ function updateDirectives(oldVnode: VNodeWithData, vnode: VNodeWithData) {
16
17
  if (oldVnode.data.directives || vnode.data.directives) {
17
18
  _update(oldVnode, vnode)
18
19
  }
19
20
  }
20
21
 
21
- function _update (oldVnode, vnode) {
22
+ function _update(oldVnode, vnode) {
22
23
  const isCreate = oldVnode === emptyNode
23
24
  const isDestroy = vnode === emptyNode
24
- const oldDirs = normalizeDirectives(oldVnode.data.directives, oldVnode.context)
25
+ const oldDirs = normalizeDirectives(
26
+ oldVnode.data.directives,
27
+ oldVnode.context
28
+ )
25
29
  const newDirs = normalizeDirectives(vnode.data.directives, vnode.context)
26
30
 
27
- const dirsWithInsert = []
28
- const dirsWithPostpatch = []
31
+ const dirsWithInsert: any[] = []
32
+ const dirsWithPostpatch: any[] = []
29
33
 
30
34
  let key, oldDir, dir
31
35
  for (key in newDirs) {
@@ -81,8 +85,8 @@ function _update (oldVnode, vnode) {
81
85
 
82
86
  const emptyModifiers = Object.create(null)
83
87
 
84
- function normalizeDirectives (
85
- dirs: ?Array<VNodeDirective>,
88
+ function normalizeDirectives(
89
+ dirs: Array<VNodeDirective> | undefined,
86
90
  vm: Component
87
91
  ): { [key: string]: VNodeDirective } {
88
92
  const res = Object.create(null)
@@ -104,16 +108,18 @@ function normalizeDirectives (
104
108
  return res
105
109
  }
106
110
 
107
- function getRawDirName (dir: VNodeDirective): string {
108
- return dir.rawName || `${dir.name}.${Object.keys(dir.modifiers || {}).join('.')}`
111
+ function getRawDirName(dir: VNodeDirective): string {
112
+ return (
113
+ dir.rawName || `${dir.name}.${Object.keys(dir.modifiers || {}).join('.')}`
114
+ )
109
115
  }
110
116
 
111
- function callHook (dir, hook, vnode, oldVnode, isDestroy) {
117
+ function callHook(dir, hook, vnode, oldVnode, isDestroy?: any) {
112
118
  const fn = dir.def && dir.def[hook]
113
119
  if (fn) {
114
120
  try {
115
121
  fn(vnode.elm, dir, vnode, oldVnode, isDestroy)
116
- } catch (e) {
122
+ } catch (e: any) {
117
123
  handleError(e, vnode.context, `directive ${dir.name} ${hook} hook`)
118
124
  }
119
125
  }
@@ -0,0 +1,4 @@
1
+ import directives from './directives'
2
+ import ref from './template-ref'
3
+
4
+ export default [ref, directives]
@@ -0,0 +1,96 @@
1
+ import {
2
+ remove,
3
+ isDef,
4
+ hasOwn,
5
+ isArray,
6
+ isFunction,
7
+ invokeWithErrorHandling,
8
+ warn
9
+ } from 'core/util'
10
+ import type { VNodeWithData } from 'types/vnode'
11
+ import { Component } from 'types/component'
12
+ import { isRef } from 'v3'
13
+
14
+ export default {
15
+ create(_: any, vnode: VNodeWithData) {
16
+ registerRef(vnode)
17
+ },
18
+ update(oldVnode: VNodeWithData, vnode: VNodeWithData) {
19
+ if (oldVnode.data.ref !== vnode.data.ref) {
20
+ registerRef(oldVnode, true)
21
+ registerRef(vnode)
22
+ }
23
+ },
24
+ destroy(vnode: VNodeWithData) {
25
+ registerRef(vnode, true)
26
+ }
27
+ }
28
+
29
+ export function registerRef(vnode: VNodeWithData, isRemoval?: boolean) {
30
+ const ref = vnode.data.ref
31
+ if (!isDef(ref)) return
32
+
33
+ const vm = vnode.context
34
+ const refValue = vnode.componentInstance || vnode.elm
35
+ const value = isRemoval ? null : refValue
36
+
37
+ if (isFunction(ref)) {
38
+ invokeWithErrorHandling(ref, vm, [value], vm, `template ref function`)
39
+ return
40
+ }
41
+
42
+ const setupRefKey = vnode.data.ref_key
43
+ const isFor = vnode.data.refInFor
44
+ const _isString = typeof ref === 'string' || typeof ref === 'number'
45
+ const _isRef = isRef(ref)
46
+ const refs = vm.$refs
47
+
48
+ if (_isString || _isRef) {
49
+ if (isFor) {
50
+ const existing = _isString ? refs[ref] : ref.value
51
+ if (isRemoval) {
52
+ isArray(existing) && remove(existing, refValue)
53
+ } else {
54
+ if (!isArray(existing)) {
55
+ if (_isString) {
56
+ refs[ref] = [refValue]
57
+ setSetupRef(vm, ref, refs[ref])
58
+ } else {
59
+ ref.value = [refValue]
60
+ if (setupRefKey) refs[setupRefKey] = ref.value as any
61
+ }
62
+ } else if (!existing.includes(refValue)) {
63
+ existing.push(refValue)
64
+ }
65
+ }
66
+ } else if (_isString) {
67
+ if (isRemoval && refs[ref] !== refValue) {
68
+ return
69
+ }
70
+ refs[ref] = value
71
+ setSetupRef(vm, ref, value)
72
+ } else if (_isRef) {
73
+ if (isRemoval && ref.value !== refValue) {
74
+ return
75
+ }
76
+ ref.value = value
77
+ if (setupRefKey) refs[setupRefKey] = value
78
+ } else if (__DEV__) {
79
+ warn(`Invalid template ref type: ${typeof ref}`)
80
+ }
81
+ }
82
+ }
83
+
84
+ function setSetupRef(
85
+ { _setupState }: Component,
86
+ key: string | number,
87
+ val: any
88
+ ) {
89
+ if (_setupState && hasOwn(_setupState, key as string)) {
90
+ if (isRef(_setupState[key])) {
91
+ _setupState[key].value = val
92
+ } else {
93
+ _setupState[key] = val
94
+ }
95
+ }
96
+ }