text: /* @flow */
  
  import { extend, isObject } from 'shared/util'
  
  function updateClass(oldVnode: VNodeWithData, vnode: VNodeWithData) {
      const el = vnode.elm
      const ctx = vnode.context
  
      const data: VNodeData = vnode.data
      const oldData: VNodeData = oldVnode.data
      if (!data.staticClass &&
          !data.class &&
          (!oldData || (!oldData.staticClass && !oldData.class))
      ) {
          return
      }
  
      const oldClassList = makeClassList(oldData)
      const classList = makeClassList(data)
  
      if (typeof el.setClassList === 'function') {
          el.setClassList(classList)
      } else {
          const style = getStyle(oldClassList, classList, ctx)
          if (typeof el.setStyles === 'function') {
              el.setStyles(style)
          } else {
              for (const key in style) {
                  el.setStyle(key, style[key])
              }
          }
      }
  }
  
  function makeClassList(data: VNodeData): Array<string> {
      const classList = []
      // unlike web, weex vnode staticClass is an Array
      const staticClass: any = data.staticClass
      const dataClass = data.class
      if (staticClass) {
          classList.push.apply(classList, staticClass)
      }
      if (Array.isArray(dataClass)) {
          classList.push.apply(classList, dataClass)
      } else if (isObject(dataClass)) {
          classList.push.apply(classList, Object.keys(dataClass).filter(className => dataClass[className]))
      } else if (typeof dataClass === 'string') {
          classList.push.apply(classList, dataClass.trim().split(/\s+/))
      }
      return classList
  }
  
  function getStyle(oldClassList: Array<string>, classList: Array<string>, ctx: Component): Object {
      // style is a weex-only injected object
      // compiled from <style> tags in weex files
      const stylesheet: any = ctx.$options.style || {}
      const result = {}
      classList.forEach(name => {
          const style = stylesheet[name]
          extend(result, style)
      })
      oldClassList.forEach(name => {
          const style = stylesheet[name]
          for (const key in style) {
              if (!result.hasOwnProperty(key)) {
                  result[key] = ''
              }
          }
      })
      return result
  }
  
  export default {
      create: updateClass,
      update: updateClass
  }
  