|
|
@@ -1,148 +0,0 @@
|
|
|
-/* @flow */
|
|
|
-
|
|
|
-import { isPrimitive, warn } from '../util/index'
|
|
|
-import VNode from './vnode'
|
|
|
-
|
|
|
-export function normalizeChildren (
|
|
|
- children: any,
|
|
|
- ns: string | void,
|
|
|
- nestedIndex: number | void
|
|
|
-): Array<VNode> | void {
|
|
|
- if (isPrimitive(children)) {
|
|
|
- return [createTextVNode(children)]
|
|
|
- }
|
|
|
- if (Array.isArray(children)) {
|
|
|
- const res = []
|
|
|
- for (let i = 0, l = children.length; i < l; i++) {
|
|
|
- const c = children[i]
|
|
|
- const last = res[res.length - 1]
|
|
|
- // nested
|
|
|
- if (Array.isArray(c)) {
|
|
|
- res.push.apply(res, normalizeChildren(c, ns, i))
|
|
|
- } else if (isPrimitive(c)) {
|
|
|
- if (last && last.text) {
|
|
|
- last.text += String(c)
|
|
|
- } else if (c !== '') {
|
|
|
- // convert primitive to vnode
|
|
|
- res.push(createTextVNode(c))
|
|
|
- }
|
|
|
- } else if (c instanceof VNode) {
|
|
|
- if (c.text && last && last.text) {
|
|
|
- last.text += c.text
|
|
|
- } else {
|
|
|
- // inherit parent namespace
|
|
|
- if (ns) {
|
|
|
- applyNS(c, ns)
|
|
|
- }
|
|
|
- // default key for nested array children (likely generated by v-for)
|
|
|
- if (c.tag && c.key == null && nestedIndex != null) {
|
|
|
- c.key = `__vlist_${nestedIndex}_${i}__`
|
|
|
- }
|
|
|
- res.push(c)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return res
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function createTextVNode (val) {
|
|
|
- return new VNode(undefined, undefined, undefined, String(val))
|
|
|
-}
|
|
|
-
|
|
|
-function applyNS (vnode, ns) {
|
|
|
- if (vnode.tag && !vnode.ns) {
|
|
|
- vnode.ns = ns
|
|
|
- if (vnode.children) {
|
|
|
- for (let i = 0, l = vnode.children.length; i < l; i++) {
|
|
|
- applyNS(vnode.children[i], ns)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-export function getFirstComponentChild (children: ?Array<any>) {
|
|
|
- return children && children.filter(c => c && c.componentOptions)[0]
|
|
|
-}
|
|
|
-
|
|
|
-export function mergeVNodeHook (def: Object, hookKey: string, hook: Function, key: string) {
|
|
|
- key = key + hookKey
|
|
|
- const injectedHash = def.__injected || (def.__injected = {})
|
|
|
- if (!injectedHash[key]) {
|
|
|
- injectedHash[key] = true
|
|
|
- const oldHook = def[hookKey]
|
|
|
- if (oldHook) {
|
|
|
- def[hookKey] = function () {
|
|
|
- oldHook.apply(this, arguments)
|
|
|
- hook.apply(this, arguments)
|
|
|
- }
|
|
|
- } else {
|
|
|
- def[hookKey] = hook
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-export function updateListeners (
|
|
|
- on: Object,
|
|
|
- oldOn: Object,
|
|
|
- add: Function,
|
|
|
- remove: Function,
|
|
|
- vm: Component
|
|
|
-) {
|
|
|
- let name, cur, old, fn, event, capture
|
|
|
- for (name in on) {
|
|
|
- cur = on[name]
|
|
|
- old = oldOn[name]
|
|
|
- if (!cur) {
|
|
|
- process.env.NODE_ENV !== 'production' && warn(
|
|
|
- `Invalid handler for event "${name}": got ` + String(cur),
|
|
|
- vm
|
|
|
- )
|
|
|
- } else if (!old) {
|
|
|
- capture = name.charAt(0) === '!'
|
|
|
- event = capture ? name.slice(1) : name
|
|
|
- if (Array.isArray(cur)) {
|
|
|
- add(event, (cur.invoker = arrInvoker(cur)), capture)
|
|
|
- } else {
|
|
|
- if (!cur.invoker) {
|
|
|
- fn = cur
|
|
|
- cur = on[name] = {}
|
|
|
- cur.fn = fn
|
|
|
- cur.invoker = fnInvoker(cur)
|
|
|
- }
|
|
|
- add(event, cur.invoker, capture)
|
|
|
- }
|
|
|
- } else if (cur !== old) {
|
|
|
- if (Array.isArray(old)) {
|
|
|
- old.length = cur.length
|
|
|
- for (let i = 0; i < old.length; i++) old[i] = cur[i]
|
|
|
- on[name] = old
|
|
|
- } else {
|
|
|
- old.fn = cur
|
|
|
- on[name] = old
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- for (name in oldOn) {
|
|
|
- if (!on[name]) {
|
|
|
- event = name.charAt(0) === '!' ? name.slice(1) : name
|
|
|
- remove(event, oldOn[name].invoker)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function arrInvoker (arr: Array<Function>): Function {
|
|
|
- return function (ev) {
|
|
|
- const single = arguments.length === 1
|
|
|
- for (let i = 0; i < arr.length; i++) {
|
|
|
- single ? arr[i](ev) : arr[i].apply(null, arguments)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function fnInvoker (o: { fn: Function }): Function {
|
|
|
- return function (ev) {
|
|
|
- const single = arguments.length === 1
|
|
|
- single ? o.fn(ev) : o.fn.apply(null, arguments)
|
|
|
- }
|
|
|
-}
|